From 65bf9ee1bc995629b71b70436188f6113b1e74a1 Mon Sep 17 00:00:00 2001 From: Ashitaka Date: Thu, 26 Mar 2026 12:53:55 -0300 Subject: [PATCH 1/8] feat: merge with dev --- .../scripts/libraries/UpgradeUtils.sol | 22 +++--- .../scripts/upgrade/GenerateNUTBundle.s.sol | 30 -------- .../snapshots/abi/L2ContractsManager.json | 30 -------- .../snapshots/semver-lock.json | 4 +- .../upgrades/current-upgrade-bundle.json | 25 +------ .../src/L2/L2ContractsManager.sol | 23 +----- .../src/libraries/L2ContractsManagerTypes.sol | 3 - .../src/libraries/Predeploys.sol | 18 ++--- .../test/L2/L2ContractsManager.t.sol | 72 +------------------ .../test/L2/fork/L2ForkUpgrade.t.sol | 3 - 10 files changed, 28 insertions(+), 202 deletions(-) diff --git a/packages/contracts-bedrock/scripts/libraries/UpgradeUtils.sol b/packages/contracts-bedrock/scripts/libraries/UpgradeUtils.sol index 3d0ab7af130..e03d1b1195b 100644 --- a/packages/contracts-bedrock/scripts/libraries/UpgradeUtils.sol +++ b/packages/contracts-bedrock/scripts/libraries/UpgradeUtils.sol @@ -25,11 +25,10 @@ library UpgradeUtils { /// Includes: /// - 1 StorageSetter /// - 16 base predeploys - /// - 7 INTEROP predeploys + /// - 4 INTEROP predeploys /// - 2 CGT predeploys (NativeAssetLiquidity, LiquidityController) /// - 2 CGT variants (L1BlockCGT, L2ToL1MessagePasserCGT) - /// Total: 29 implementations - uint256 internal constant IMPLEMENTATION_COUNT = 29; + uint256 internal constant IMPLEMENTATION_COUNT = 26; /// @notice Gas limits for different types of upgrade transactions. /// @param l2cmDeployment Gas for deploying L2ContractsManager @@ -49,13 +48,13 @@ library UpgradeUtils { /// @notice Returns the total number of transactions for the current upgrade. /// @dev Total count: - /// - 29 implementation deployments + /// - IMPLEMENTATION_COUNT implementation deployments /// - [KARST] 2 ConditionalDeployer (deployment + upgrade) /// - [KARST] 1 ProxyAdmin upgrade /// - 1 L2CM deployment /// - 1 Upgrade Predeploys call function getTransactionCount() internal pure returns (uint256 txnCount_) { - if (IMPLEMENTATION_COUNT != 29) { + if (IMPLEMENTATION_COUNT != 26) { revert( "UpgradeUtils: implementation count changed, ensure that the txnCount_ calculation is still correct." ); @@ -123,16 +122,13 @@ library UpgradeUtils { implementations_[18] = "CrossL2Inbox"; implementations_[19] = "L2ToL2CrossDomainMessenger"; implementations_[20] = "SuperchainETHBridge"; - implementations_[21] = "OptimismSuperchainERC20Factory"; - implementations_[22] = "OptimismSuperchainERC20Beacon"; - implementations_[23] = "SuperchainTokenBridge"; - implementations_[24] = "ETHLiquidity"; + implementations_[21] = "ETHLiquidity"; // CGT predeploys - implementations_[25] = "L1BlockCGT"; - implementations_[26] = "L2ToL1MessagePasserCGT"; - implementations_[27] = "LiquidityController"; - implementations_[28] = "NativeAssetLiquidity"; + implementations_[22] = "L1BlockCGT"; + implementations_[23] = "L2ToL1MessagePasserCGT"; + implementations_[24] = "LiquidityController"; + implementations_[25] = "NativeAssetLiquidity"; } /// @notice Uses vm.computeCreate2Address to compute the CREATE2 address for given initcode and salt. diff --git a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol index 8c338126af9..45ec54d4464 100644 --- a/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol +++ b/packages/contracts-bedrock/scripts/upgrade/GenerateNUTBundle.s.sol @@ -339,9 +339,6 @@ contract GenerateNUTBundle is Script { l2ToL2CrossDomainMessengerImpl: implementationConfigs["L2ToL2CrossDomainMessenger"].implementation, superchainETHBridgeImpl: implementationConfigs["SuperchainETHBridge"].implementation, ethLiquidityImpl: implementationConfigs["ETHLiquidity"].implementation, - optimismSuperchainERC20FactoryImpl: implementationConfigs["OptimismSuperchainERC20Factory"].implementation, - optimismSuperchainERC20BeaconImpl: implementationConfigs["OptimismSuperchainERC20Beacon"].implementation, - superchainTokenBridgeImpl: implementationConfigs["SuperchainTokenBridge"].implementation, nativeAssetLiquidityImpl: implementationConfigs["NativeAssetLiquidity"].implementation, liquidityControllerImpl: implementationConfigs["LiquidityController"].implementation, feeSplitterImpl: implementationConfigs["FeeSplitter"].implementation, @@ -538,33 +535,6 @@ contract GenerateNUTBundle is Script { deploymentGasLimit: 400_000, implementation: UpgradeUtils.computeCreate2Address(DeployUtils.getCode("ETHLiquidity.sol:ETHLiquidity"), SALT) }); - // Gas profiling: 814,361 gas used → 1,221,541 recommended → 1.3M with safety margin - implementationConfigs["OptimismSuperchainERC20Factory"] = ImplementationConfig({ - name: "OptimismSuperchainERC20Factory", - artifactPath: "OptimismSuperchainERC20Factory.sol:OptimismSuperchainERC20Factory", - deploymentGasLimit: 1_300_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("OptimismSuperchainERC20Factory.sol:OptimismSuperchainERC20Factory"), SALT - ) - }); - // Gas profiling: 103,008 gas used → 154,512 recommended → 200K with safety margin - implementationConfigs["OptimismSuperchainERC20Beacon"] = ImplementationConfig({ - name: "OptimismSuperchainERC20Beacon", - artifactPath: "OptimismSuperchainERC20Beacon.sol:OptimismSuperchainERC20Beacon", - deploymentGasLimit: 200_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("OptimismSuperchainERC20Beacon.sol:OptimismSuperchainERC20Beacon"), SALT - ) - }); - // Gas profiling: 474,836 gas used → 712,254 recommended → 750K with safety margin - implementationConfigs["SuperchainTokenBridge"] = ImplementationConfig({ - name: "SuperchainTokenBridge", - artifactPath: "SuperchainTokenBridge.sol:SuperchainTokenBridge", - deploymentGasLimit: 750_000, - implementation: UpgradeUtils.computeCreate2Address( - DeployUtils.getCode("SuperchainTokenBridge.sol:SuperchainTokenBridge"), SALT - ) - }); // Gas profiling: 215,592 gas used → 323,388 recommended → 400K with safety margin implementationConfigs["NativeAssetLiquidity"] = ImplementationConfig({ name: "NativeAssetLiquidity", diff --git a/packages/contracts-bedrock/snapshots/abi/L2ContractsManager.json b/packages/contracts-bedrock/snapshots/abi/L2ContractsManager.json index f4cb84543b7..dba3b149b5e 100644 --- a/packages/contracts-bedrock/snapshots/abi/L2ContractsManager.json +++ b/packages/contracts-bedrock/snapshots/abi/L2ContractsManager.json @@ -113,21 +113,6 @@ "name": "ethLiquidityImpl", "type": "address" }, - { - "internalType": "address", - "name": "optimismSuperchainERC20FactoryImpl", - "type": "address" - }, - { - "internalType": "address", - "name": "optimismSuperchainERC20BeaconImpl", - "type": "address" - }, - { - "internalType": "address", - "name": "superchainTokenBridgeImpl", - "type": "address" - }, { "internalType": "address", "name": "nativeAssetLiquidityImpl", @@ -278,21 +263,6 @@ "name": "ethLiquidityImpl", "type": "address" }, - { - "internalType": "address", - "name": "optimismSuperchainERC20FactoryImpl", - "type": "address" - }, - { - "internalType": "address", - "name": "optimismSuperchainERC20BeaconImpl", - "type": "address" - }, - { - "internalType": "address", - "name": "superchainTokenBridgeImpl", - "type": "address" - }, { "internalType": "address", "name": "nativeAssetLiquidityImpl", diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index 7cf9c105e79..493236439b1 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -96,8 +96,8 @@ "sourceCodeHash": "0x7e438cbbe9a8248887b8c21f68c811f90a5cae4902cbbf7b0a1f6cd644dc42d9" }, "src/L2/L2ContractsManager.sol:L2ContractsManager": { - "initCodeHash": "0x220182391d6b9ef7472d39e5c4a84e54b71f9c1e5c8bec983c80283ce3dc60ca", - "sourceCodeHash": "0x3e0f42cc0fa7c27b5a10c300aae21db2a89c5b7a777b2746d25c95994d91945b" + "initCodeHash": "0x8f233d06237288e3495c2bf8192f0dccc82964cc3e48b551b6889fc1d10af236", + "sourceCodeHash": "0x4f4aa1bd1e4199eb72c4f4c92274091bd91f9535c120fccf35ee76b73e437ebf" }, "src/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger": { "initCodeHash": "0x76784e1bc7abe615094033f3eb16d3a6bd5caf28c2717377a3dd25e6825228f3", diff --git a/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json b/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json index 7ce269acdeb..6d7d1fc036f 100644 --- a/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json +++ b/packages/contracts-bedrock/snapshots/upgrades/current-upgrade-bundle.json @@ -164,27 +164,6 @@ "intent": "Deploy SuperchainETHBridge Implementation", "to": "0x420000000000000000000000000000000000002C" }, - { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000eab6080604052348015600e575f80fd5b50610e8f8061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c8063316b37391461004357806354fd4d50146100a2578063ef26a315146100eb575b5f80fd5b610078610051366004610681565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100de6040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161009991906106e6565b6100786100f93660046107cc565b5f80858585856040516024016101129493929190610853565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff6d2ee860000000000000000000000000000000000000000000000000000000017905290519192505f919061019c90820161064c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526101f3907342000000000000000000000000000000000000279085906020016108a8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261022f92916020016108f5565b60405160208183030381529060405290505f878787876040516020016102589493929190610853565b60405160208183030381529060405280519060200120905061027b81835f610310565b73ffffffffffffffffffffffffffffffffffffffff8181165f818152602081815260409182902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948e1694851790559051338152939750919290917fc4dc49b8346732c19a032264daf2bebf08be752a393ea2a8519cd1953ef4d932910160405180910390a3505050949350505050565b5f806040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090505f858251602084015ff5905073ffffffffffffffffffffffffffffffffffffffff81166103d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4445504c4f594d454e545f4641494c454400000000000000000000000000000060448201526064015b60405180910390fd5b6103e1866104e0565b92505f8173ffffffffffffffffffffffffffffffffffffffff16858760405161040a9190610909565b5f6040518083038185875af1925050503d805f8114610444576040519150601f19603f3d011682016040523d82523d5f602084013e610449565b606091505b50509050808015610470575073ffffffffffffffffffffffffffffffffffffffff84163b15155b6104d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f494e495449414c495a4154494f4e5f4641494c4544000000000000000000000060448201526064016103cf565b5050509392505050565b604080518082018252601081527f67363d3d37363d34f03d5260086018f30000000000000000000000000000000060209182015290517fff00000000000000000000000000000000000000000000000000000000000000918101919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166021820152603581018290527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f60558201525f9081906105bb906075015b6040516020818303038152906040528051906020012090565b6040517fd69400000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660228201527f01000000000000000000000000000000000000000000000000000000000000006036820152909150610645906037016105a2565b9392505050565b61056e8061091583390190565b803573ffffffffffffffffffffffffffffffffffffffff8116811461067c575f80fd5b919050565b5f60208284031215610691575f80fd5b61064582610659565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610645602083018461069a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610734575f80fd5b813567ffffffffffffffff8082111561074f5761074f6106f8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610795576107956106f8565b816040528381528660208588010111156107ad575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f80608085870312156107df575f80fd5b6107e885610659565b9350602085013567ffffffffffffffff80821115610804575f80fd5b61081088838901610725565b94506040870135915080821115610825575f80fd5b5061083287828801610725565b925050606085013560ff81168114610848575f80fd5b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201525f610881608083018661069a565b8281036040840152610893818661069a565b91505060ff8316606083015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f6108d6604083018461069a565b949350505050565b5f81518060208401855e5f93019283525090919050565b5f6108d661090383866108de565b846108de565b5f61064582846108de56fe60a060405260405161056e38038061056e83398101604081905261002291610354565b61002c828261003e565b506001600160a01b031660805261043f565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e49190610410565b82610209565b505050565b6100f761027c565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d29190610410565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f80846001600160a01b0316846040516102259190610429565b5f60405180830381855af49150503d805f811461025d576040519150601f19603f3d011682016040523d82523d5f602084013e610262565b606091505b50909250905061027385838361029d565b95945050505050565b341561029b5760405163b398979f60e01b815260040160405180910390fd5b565b6060826102b2576102ad826102fc565b6102f5565b81511580156102c957506001600160a01b0384163b155b156102f257604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b50805b9392505050565b80511561030c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461033b575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610365575f80fd5b61036e83610325565b60208401519092506001600160401b038082111561038a575f80fd5b818501915085601f83011261039d575f80fd5b8151818111156103af576103af610340565b604051601f8201601f19908116603f011681019083821181831017156103d7576103d7610340565b816040528281528860208487010111156103ef575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f60208284031215610420575f80fd5b6102f582610325565b5f82518060208501845e5f920191825250919050565b6080516101186104565f395f602301526101185ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056fea164736f6c6343000819000aa164736f6c6343000819000a000000000000000000000000000000000000000000", - "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 1300000, - "intent": "Deploy OptimismSuperchainERC20Factory Implementation", - "to": "0x420000000000000000000000000000000000002C" - }, - { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca40000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000014f608060405234801561001057600080fd5b5061012f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806354fd4d501461003b5780635c60da1b1461008d575b600080fd5b6100776040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161008491906100af565b60405180910390f35b60405173b9415c6ca93bdc545d4c5177512fcc22efa38f288152602001610084565b600060208083528351808285015260005b818110156100dc578581018301518582016040015282016100c0565b818111156100ee576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a0000000000000000000000000000000000", - "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 200000, - "intent": "Deploy OptimismSuperchainERC20Beacon Implementation", - "to": "0x420000000000000000000000000000000000002C" - }, - { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008496080604052348015600e575f80fd5b5061082d8061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c806354fd4d50146100435780637cfd6dbc14610095578063c1a433d8146100aa575b5f80fd5b61007f6040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161008c91906106b3565b60405180910390f35b6100a86100a33660046106f0565b6100cb565b005b6100bd6100b836600461073e565b610300565b60405190815260200161008c565b3373420000000000000000000000000000000000002314610118576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073420000000000000000000000000000000000002373ffffffffffffffffffffffffffffffffffffffff16637936cbee6040518163ffffffff1660e01b81526004016040805180830381865afa158015610176573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019a9190610781565b909250905073ffffffffffffffffffffffffffffffffffffffff821630146101ee576040517fbc22e2aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f18bf507700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528716906318bf5077906044015f604051808303815f87803b15801561025b575f80fd5b505af115801561026d573d5f803e3d5ffd5b505050508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f434965d7426acf45a548f00783c067e9ad789c8c66444f0a5ad8941d5005be9386856040516102f0929190918252602082015260400190565b60405180910390a4505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff841661034e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f3333199400000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8616906301ffc9a790602401602060405180830381865afa1580156103d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103fa91906107ad565b610430576040517f0ed63dae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f2b8c49e30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff861690632b8c49e3906044015f604051808303815f87803b15801561049b575f80fd5b505af11580156104ad573d5f803e3d5ffd5b50506040805173ffffffffffffffffffffffffffffffffffffffff89811660248301523360448301528816606482015260848082018890528251808303909101815260a490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7cfd6dbc0000000000000000000000000000000000000000000000000000000017905290517f7056f41f0000000000000000000000000000000000000000000000000000000081529092507342000000000000000000000000000000000000239150637056f41f90610595908690309086906004016107cc565b6020604051808303815f875af11580156105b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d59190610809565b91508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f0247bfe63a1aaa59e073e20b172889babfda8d3273b5798e0e9ac4388e6dd11c8787604051610656929190918252602082015260400190565b60405180910390a450949350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6106c56020830184610667565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146106ed575f80fd5b50565b5f805f8060808587031215610703575f80fd5b843561070e816106cc565b9350602085013561071e816106cc565b9250604085013561072e816106cc565b9396929550929360600135925050565b5f805f8060808587031215610751575f80fd5b843561075c816106cc565b9350602085013561076c816106cc565b93969395505050506040820135916060013590565b5f8060408385031215610792575f80fd5b825161079d816106cc565b6020939093015192949293505050565b5f602082840312156107bd575f80fd5b815180151581146106c5575f80fd5b83815273ffffffffffffffffffffffffffffffffffffffff83166020820152606060408201525f6108006060830184610667565b95945050505050565b5f60208284031215610819575f80fd5b505191905056fea164736f6c6343000819000a0000000000000000000000000000000000000000000000", - "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", - "gasLimit": 750000, - "intent": "Deploy SuperchainTokenBridge Implementation", - "to": "0x420000000000000000000000000000000000002C" - }, { "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003b3608060405234801561001057600080fd5b50610393806100206000396000f3fe60806040526004361061003f5760003560e01c806344df8e701461004457806354fd4d501461004e578063a0712d68146100ad578063b60d4288146100cd575b600080fd5b61004c6100d5565b005b34801561005a57600080fd5b506100976040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100a491906102a1565b60405180910390f35b3480156100b957600080fd5b5061004c6100c8366004610314565b61015a565b61004c610229565b3373420000000000000000000000000000000000002414610122576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f875e07afd7ce17c6531b1a6b7b34829dcd8b7e6639448afbd6a8e29fa1422b82906020015b60405180910390a2565b33734200000000000000000000000000000000000024146101a7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80336040516101b590610295565b73ffffffffffffffffffffffffffffffffffffffff90911681526020016040518091039082f09050801580156101ef573d6000803e3d6000fd5b505060405181815233907f85719716ac5bd2744ae7ed3d16702129383049b97123b506320e7a5826ebbbba9060200160405180910390a250565b34600003610263576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907fbb9e497a5b82d1a37f9496dd70c6efb97ba0d98c66c3422d05010105d063359890602001610150565b60598061032e83390190565b600060208083528351808285015260005b818110156102ce578581018301518582016040015282016102b2565b818111156102e0576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561032657600080fd5b503591905056fe608060405260405160593803806059833981016040819052601e91602a565b806001600160a01b0316ff5b600060208284031215603b57600080fd5b81516001600160a01b0381168114605157600080fd5b939250505056fea164736f6c634300080f000a00000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", @@ -228,14 +207,14 @@ "to": "0x4200000000000000000000000000000000000018" }, { - "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003e826104606040523480156200001257600080fd5b5060405162003ac238038062003ac28339810160408190526200003591620001f7565b30608090815281516001600160a01b0390811660a09081526020840151821660e09081526040850151831660c0908152606086015184166101009081529486015184166101209081529286015184166101409081529086015184166101609081529186015184166101809081529486015184166101a09081529286015184166101c09081529086015184166101e09081529186015184166102009081529486015184166102209081529286015184166102409081529086015184166102609081529186015184166102809081529486015184166102a09081529286015184166102c09081529086015184166102e09081529186015184166103009081529486015184166103209081529286015184166103409081529086015184166103609081529186015184166103809081529486015184166103a09081529286015184166103c05285015183166103e05284015182166104005291830151811661042052910151166104405262000466565b6040516103c081016001600160401b0381118282101715620001d457634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620001f257600080fd5b919050565b60006103c082840312156200020b57600080fd5b62000215620001a2565b6200022083620001da565b81526200023060208401620001da565b60208201526200024360408401620001da565b60408201526200025660608401620001da565b60608201526200026960808401620001da565b60808201526200027c60a08401620001da565b60a08201526200028f60c08401620001da565b60c0820152620002a260e08401620001da565b60e0820152610100620002b7818501620001da565b90820152610120620002cb848201620001da565b90820152610140620002df848201620001da565b90820152610160620002f3848201620001da565b9082015261018062000307848201620001da565b908201526101a06200031b848201620001da565b908201526101c06200032f848201620001da565b908201526101e062000343848201620001da565b9082015261020062000357848201620001da565b908201526102206200036b848201620001da565b908201526102406200037f848201620001da565b9082015261026062000393848201620001da565b90820152610280620003a7848201620001da565b908201526102a0620003bb848201620001da565b908201526102c0620003cf848201620001da565b908201526102e0620003e3848201620001da565b90820152610300620003f7848201620001da565b908201526103206200040b848201620001da565b908201526103406200041f848201620001da565b9082015261036062000433848201620001da565b9082015261038062000447848201620001da565b908201526103a06200045b848201620001da565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516104005161042051610440516133e3620006df60003960008181610553015261181001526000818161052a0152611a8201526000818161050101526113b90152600081816104d8015261126b0152600081816104af015261135201526000818161048601526119c801526000818161045d015261198a015260008181610434015261194c01526000818161040b015261190e0152600081816103e201526118d00152600081816103b9015261189201526000818161039001526118540152600081816103670152611a4401526000818161033e0152611a06015260008181610315015261164f0152600081816102ec01526115cf0152600081816102c3015261155001526000818161029a01526117d2015260008181610271015261116b015260008181610248015261179401526000818161021f015261176e0152600081816101f601526117260152600081816101ce01526117000152600081816101a6015261104701526000818161017e01526110d3015260008181610156015261143301526000818161012e0152610f4101526000818160df0152610e3b01526000818161010701526116b801526000818160ba01528181610e5d01528181610f6301528181611069015281816110f50152818161118d0152818161128d015281816113db0152818161145501528181611572015281816115f10152611671015260006105a601526133e36000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063615f64fe14610098578063d55ec69714610585575b600080fd5b6100826040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f9190612dfc565b60405180910390f35b604080516103c08101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f0000000000000000000000000000000000000000000000000000000000000000811660e08301527f000000000000000000000000000000000000000000000000000000000000000081166101008301527f000000000000000000000000000000000000000000000000000000000000000081166101208301527f000000000000000000000000000000000000000000000000000000000000000081166101408301527f000000000000000000000000000000000000000000000000000000000000000081166101608301527f000000000000000000000000000000000000000000000000000000000000000081166101808301527f000000000000000000000000000000000000000000000000000000000000000081166101a08301527f000000000000000000000000000000000000000000000000000000000000000081166101c08301527f000000000000000000000000000000000000000000000000000000000000000081166101e08301527f000000000000000000000000000000000000000000000000000000000000000081166102008301527f000000000000000000000000000000000000000000000000000000000000000081166102208301527f000000000000000000000000000000000000000000000000000000000000000081166102408301527f000000000000000000000000000000000000000000000000000000000000000081166102608301527f000000000000000000000000000000000000000000000000000000000000000081166102808301527f000000000000000000000000000000000000000000000000000000000000000081166102a08301527f000000000000000000000000000000000000000000000000000000000000000081166102c08301527f000000000000000000000000000000000000000000000000000000000000000081166102e08301527f000000000000000000000000000000000000000000000000000000000000000081166103008301527f000000000000000000000000000000000000000000000000000000000000000081166103208301527f000000000000000000000000000000000000000000000000000000000000000081166103408301527f000000000000000000000000000000000000000000000000000000000000000081166103608301527f000000000000000000000000000000000000000000000000000000000000000081166103808301527f0000000000000000000000000000000000000000000000000000000000000000166103a0820152905161008f9190612e0f565b61058d61058f565b005b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036105fe576040517fada337cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610608610616565b905061061381610ded565b50565b61061e612c4d565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190613084565b15156101608201526040805160208082018084527f9fce812c00000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000000791639fce812c9160248086019291908187030181865afa15801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073f91906130c8565b73ffffffffffffffffffffffffffffffffffffffff16905281526040805160208082018084527f7f46ddb200000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000001091637f46ddb29160248086019291908187030181865afa1580156107cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ef91906130c8565b73ffffffffffffffffffffffffffffffffffffffff168152508160200181905250604051806020016040528073420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089e91906130c8565b73ffffffffffffffffffffffffffffffffffffffff168152508160400181905250604051806020016040528073420000000000000000000000000000000000001273ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094d91906130c8565b73ffffffffffffffffffffffffffffffffffffffff1690526060820152604080518082018083527fee9a31a2000000000000000000000000000000000000000000000000000000009052905181907342000000000000000000000000000000000000179063ee9a31a2906044808501916020918187030181865afa1580156109d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fd91906130c8565b73ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000001773ffffffffffffffffffffffffffffffffffffffff16637d1d0c5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9b91906130e5565b90526080820152610abf734200000000000000000000000000000000000011611aaa565b60a0820152610ae1734200000000000000000000000000000000000019611aaa565b60c0820152610b0373420000000000000000000000000000000000001a611aaa565b60e0820152610b2573420000000000000000000000000000000000001b611aaa565b61010082015261016081015115610d1557600073420000000000000000000000000000000000002a905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc991906130c8565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c2f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610c7591908101906131bf565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cc5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d0b91908101906131bf565b9052610120830152505b600073420000000000000000000000000000000000002b73ffffffffffffffffffffffffffffffffffffffff1663d61a398b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610db0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610dad918101906130c8565b60015b610dbc57506000610dbf565b90505b604080516020810190915273ffffffffffffffffffffffffffffffffffffffff909116815261014082015290565b6000610df96001611c8b565b82515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152909150610eff90734200000000000000000000000000000000000007907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260006014611dee565b60208201515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261100590734200000000000000000000000000000000000010907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052600080611dee565b60408083015151905173ffffffffffffffffffffffffffffffffffffffff909116602482015261109190734200000000000000000000000000000000000014907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401610f87565b60608201515160405173ffffffffffffffffffffffffffffffffffffffff909116602482015261111d90734200000000000000000000000000000000000012907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401610f87565b6080820151805160209091015160405173ffffffffffffffffffffffffffffffffffffffff9092166024830152604482015261122f90734200000000000000000000000000000000000017907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd6dc6870000000000000000000000000000000000000000000000000000000017905260016000611dee565b81610160015115611376576101208201518051602082015160409283015192516113389373420000000000000000000000000000000000002a937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000936112ba9390602401613210565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9065714700000000000000000000000000000000000000000000000000000000179052600080611dee565b6113767342000000000000000000000000000000000000297f0000000000000000000000000000000000000000000000000000000000000000612448565b6101408201515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526114039073420000000000000000000000000000000000002b907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401610f87565b60a082015180516020820151604092830151925161152093734200000000000000000000000000000000000011937f0000000000000000000000000000000000000000000000000000000000000000937f000000000000000000000000000000000000000000000000000000000000000093611482939060240161328a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb49dc741000000000000000000000000000000000000000000000000000000001790527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006000611dee565b60c082015180516020820151604092830151925161159f93734200000000000000000000000000000000000019937f0000000000000000000000000000000000000000000000000000000000000000937f000000000000000000000000000000000000000000000000000000000000000093611482939060240161328a565b60e082015180516020820151604092830151925161161e9373420000000000000000000000000000000000001a937f0000000000000000000000000000000000000000000000000000000000000000937f000000000000000000000000000000000000000000000000000000000000000093611482939060240161328a565b61010082015180516020820151604092830151925161169e9373420000000000000000000000000000000000001b937f0000000000000000000000000000000000000000000000000000000000000000937f000000000000000000000000000000000000000000000000000000000000000093611482939060240161328a565b6116dc73420000000000000000000000000000000000000f7f0000000000000000000000000000000000000000000000000000000000000000612448565b61174a734200000000000000000000000000000000000015836101600151611724577f0000000000000000000000000000000000000000000000000000000000000000612448565b7f0000000000000000000000000000000000000000000000000000000000000000612448565b6117b8734200000000000000000000000000000000000016836101600151611792577f0000000000000000000000000000000000000000000000000000000000000000612448565b7f0000000000000000000000000000000000000000000000000000000000000000612448565b6117f67342000000000000000000000000000000000000187f0000000000000000000000000000000000000000000000000000000000000000612448565b61183473420000000000000000000000000000000000002d7f0000000000000000000000000000000000000000000000000000000000000000612448565b80156119ec576118787342000000000000000000000000000000000000227f0000000000000000000000000000000000000000000000000000000000000000612448565b6118b67342000000000000000000000000000000000000237f0000000000000000000000000000000000000000000000000000000000000000612448565b6118f47342000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000000000612448565b6119327342000000000000000000000000000000000000257f0000000000000000000000000000000000000000000000000000000000000000612448565b6119707342000000000000000000000000000000000000267f0000000000000000000000000000000000000000000000000000000000000000612448565b6119ae7342000000000000000000000000000000000000277f0000000000000000000000000000000000000000000000000000000000000000612448565b6119ec7342000000000000000000000000000000000000287f0000000000000000000000000000000000000000000000000000000000000000612448565b611a2a7342000000000000000000000000000000000000207f0000000000000000000000000000000000000000000000000000000000000000612448565b611a687342000000000000000000000000000000000000217f0000000000000000000000000000000000000000000000000000000000000000612448565b611aa673420000000000000000000000000000000000002c7f0000000000000000000000000000000000000000000000000000000000000000612448565b5050565b611acb60408051606081018252600080825260208201819052909182015290565b60008273ffffffffffffffffffffffffffffffffffffffff1663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b52575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611b4f918101906132f3565b60015b611b5e57506000611b61565b90505b600083905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be091906130c8565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6a91906130e5565b8152602001836001811115611c8157611c8161325b565b9052949350505050565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000002d600482015260009081907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3091906130c8565b90508073ffffffffffffffffffffffffffffffffffffffff163b600003611d5a5750600092915050565b6040517f78ecabce0000000000000000000000000000000000000000000000000000000081526004810184905273420000000000000000000000000000000000002d906378ecabce90602401602060405180830381865afa158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de79190613084565b9392505050565b611df7866126d5565b15612440576040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea191906130c8565b905073ffffffffffffffffffffffffffffffffffffffff81163b15801590611fee5750611fee8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015611f12573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f5891908101906131bf565b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611fe991908101906131bf565b61271e565b15612042576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024015b60405180910390fd5b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152881690633659cfe690602401600060405180830381600087803b1580156120ab57600080fd5b505af11580156120bf573d6000803e3d6000fd5b50506040517fa6ed563e000000000000000000000000000000000000000000000000000000008152600481018690526000925073ffffffffffffffffffffffffffffffffffffffff8a16915063a6ed563e90602401602060405180830381865afa158015612131573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215591906130e5565b9050600061216760ff85166008613314565b6040517f4e91db080000000000000000000000000000000000000000000000000000000081526004810187905260ff90911b198381166024830152915073ffffffffffffffffffffffffffffffffffffffff8a1690634e91db0890604401600060405180830381600087803b1580156121df57600080fd5b505af11580156121f3573d6000803e3d6000fd5b50506040517fa6ed563e0000000000000000000000000000000000000000000000000000000081527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006004820181905292506000915073ffffffffffffffffffffffffffffffffffffffff8c169063a6ed563e90602401602060405180830381865afa158015612287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ab91906130e5565b90508060ff604082901c16156122ed576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4e91db08000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082811660248301529073ffffffffffffffffffffffffffffffffffffffff8e1690634e91db0890604401600060405180830381600087803b15801561237f57600080fd5b505af1158015612393573d6000803e3d6000fd5b505050508c73ffffffffffffffffffffffffffffffffffffffff16634f1ef2868d8c6040518363ffffffff1660e01b81526004016123d2929190613378565b6000604051808303816000875af11580156123f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261243791908101906131bf565b50505050505050505b505050505050565b612451826126d5565b612459575050565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa1580156124da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fe91906130c8565b905073ffffffffffffffffffffffffffffffffffffffff81163b1580159061260057506126008373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561256f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526125b591908101906131bf565b8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015611fa3573d6000803e3d6000fd5b1561264f576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401612039565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401600060405180830381600087803b1580156126b857600080fd5b505af11580156126cc573d6000803e3d6000fd5b50505050505050565b60007208400000000000000000000000000000000000600b83901c721fffffffffffffffffffffffffffffffffffff16148015612718575061271682612744565b155b92915050565b600061272a83836127ac565b158015611de7575061273c83836127fc565b159392505050565b600073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000421480612718575073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000061492915050565b6000806127b884612871565b905060006127c584612871565b805183519192501480156127e0575080602001518260200151145b80156127f3575080604001518260400151145b95945050505050565b60008061280884612871565b9050600061281584612871565b80518351919250118061283b57508051825114801561283b575080602001518260200151105b806127f3575080518251148015612859575080602001518260200151145b80156127f35750604090810151910151109392505050565b61289560405180606001604052806000815260200160008152602001600081525090565b60006128d6836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250612a3d565b9050600381511015612914576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061296f8260028151811061292c5761292c6133a7565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250612a3d565b905060006129cc82600081518110612989576129896133a7565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250612a3d565b905060405180606001604052806129fc856000815181106129ef576129ef6133a7565b6020026020010151612ae8565b8152602001612a17856001815181106129ef576129ef6133a7565b8152602001612a32836000815181106129ef576129ef6133a7565b905295945050505050565b60606000612a4b8484612b60565b9050601f1960208201600183510160051b81018651838201526001845101845260005b825160608452818114612ab35760405182820380825286601f8201165b8b850181015183820152870180612a8b5750600082820160200152603f018616810160405284525b875160209490940193019050818310612a6e57505050508091508251612ae157602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a028281019650600983118188108317171586029550505050828110612b1057505080612b5a5763101827966000526004601cfd5b50919050565b606082518251818111612c45576020850194506020840193506020604051019250846001828488010301600060208410612b9957508286205b601f841660200360031b87515b8951818118831c612bfb578315612bd95783878c2014612bd95760018b019a50848b10612bd35750612c0a565b50612ba6565b858b038952998601996020909801978615612bfb57848b10612bd35750612c0a565b5060018a019950838a10612ba6575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08189030160051c8152602090970190525050505b505092915050565b604080516101a08101825260006101808201818152825282516020808201855282825280840191909152835180820185528281528385015283518082018552828152606084015283518085019094528184528301529060808201908152602001612cce60408051606081018252600080825260208201819052909182015290565b8152602001612cf460408051606081018252600080825260208201819052909182015290565b8152602001612d1a60408051606081018252600080825260208201819052909182015290565b8152602001612d4060408051606081018252600080825260208201819052909182015290565b81526040805160608082018352600082526020828101829052928201529101908152604080516020818101909252600081529101908152600060209091015290565b60005b83811015612d9d578181015183820152602001612d85565b83811115612dac576000848401525b50505050565b60008151808452612dca816020860160208601612d82565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611de76020830184612db2565b815173ffffffffffffffffffffffffffffffffffffffff1681526103c081016020830151612e55602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151612e7d604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506060830151612ea5606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080830151612ecd608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a0830151612ef560a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c0830151612f1d60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e0830151612f4560e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e08085015182169084015261030080850151821690840152610320808501518216908401526103408085015182169084015261036080850151821690840152610380808501518216908401526103a0808501519182168185015290612c45565b60006020828403121561309657600080fd5b81518015158114611de757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461061357600080fd5b6000602082840312156130da57600080fd5b8151611de7816130a6565b6000602082840312156130f757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115613148576131486130fe565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561318e5761318e6130fe565b816040528093508581528686860111156131a757600080fd5b6131b5866020830187612d82565b5050509392505050565b6000602082840312156131d157600080fd5b815167ffffffffffffffff8111156131e857600080fd5b8201601f810184136131f957600080fd5b6132088482516020840161312d565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061323f6060830185612db2565b82810360408401526132518185612db2565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff841681526020810183905260608101600283106132e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b60006020828403121561330557600080fd5b815160028110611de757600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613373577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006132086040830184612db2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a0000000000000000000000002a5a3eabb9fd571a3af0299eebdf8eaafe29a914000000000000000000000000250af3f400cf8aac8d410c90f1ba3968dd87df96000000000000000000000000547d0fba434877d7237d511cf87fabe2ee26b152000000000000000000000000ac8538a2e6a1f5dfbb1c4b8bd97cefb2997824a8000000000000000000000000b178cdaa8336f25624a63c049edb5af7ca36c2da000000000000000000000000c053fc0155bf8bda5b568af53276e538f0ea4d58000000000000000000000000716ead0cf3e7ff86a02d4f8cb41a6d14922fa833000000000000000000000000f57b0b99a3d5c28515477c51e9e1d17492835ac8000000000000000000000000dde1b9d8022e9e9c81e82a63cee81384acc820aa00000000000000000000000027e51b2254433a3284d9ba73ea551c397db2a124000000000000000000000000a0f4ffff79a0a3e039fcbef738751efba8e84f96000000000000000000000000f43862b9d814bb4504158ceccb0b74b31265e4ee000000000000000000000000db7bae515c7d179ccacd3b4e0a1937eb84b69910000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000eddf416c7159387cc6df3015700f79cfb891137300000000000000000000000070de55bc0bfbc52c5d0cca1da5816c2428886a34000000000000000000000000bec660b456b84a081e90af29be43385bda5bf7b600000000000000000000000093a8a7a9c98cb998d88dba3373a6c7f8ee2e8a4600000000000000000000000037dc2fe754052a9fac35f17282599fafbeb9f423000000000000000000000000784f1fae11f1c3a9c413423fe1b370a3636b8d560000000000000000000000002f76618143d9d2731c56778192d3893864b423d700000000000000000000000033b5beb844f8a500b3d3a88d1562af8669b88cad0000000000000000000000004c45f68f1f8c84cd6c8d8b9cdea4d6e485ac1d28000000000000000000000000e15df75abe345199eb6ddcb65b77e2e160ca9827000000000000000000000000dda87ef358082ab3f4ba8982290c671efdc4d1590000000000000000000000008256398a687e740006098445b05d5ca46b7be21e0000000000000000000000008684ccc5bf484ec242dbc7119004a83533934a79000000000000000000000000906835344844979ffd3a752eaa23728d513db00b000000000000000000000000e35b194efc4907f383b7e3b87f4c2c339ce239f6000000000000000000000000000000000000000000000000000000000000", + "data": "0xcdcb760a9b217f1b15f9c04316d04d42f550c340c5b2ee8e5ae05cab4f8cd9cb21970ca400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003c316104006040523480156200001257600080fd5b50604051620038d1380380620038d18339810160408190526200003591620001d4565b30608090815281516001600160a01b0390811660a09081526020840151821660e09081526040850151831660c0908152606086015184166101009081529486015184166101209081529286015184166101409081529086015184166101609081529186015184166101809081529486015184166101a09081529286015184166101c09081529086015184166101e09081529186015184166102009081529486015184166102209081529286015184166102409081529086015184166102609081529186015184166102809081529486015184166102a09081529286015184166102c09081529086015184166102e090815291860151841661030090815294860151841661032090815292860151841661034090815290860151841661036052908501518316610380529284015182166103a05283015181166103c052910151166103e05262000407565b60405161036081016001600160401b0381118282101715620001b157634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620001cf57600080fd5b919050565b60006103608284031215620001e857600080fd5b620001f26200017f565b620001fd83620001b7565b81526200020d60208401620001b7565b60208201526200022060408401620001b7565b60408201526200023360608401620001b7565b60608201526200024660808401620001b7565b60808201526200025960a08401620001b7565b60a08201526200026c60c08401620001b7565b60c08201526200027f60e08401620001b7565b60e082015261010062000294818501620001b7565b90820152610120620002a8848201620001b7565b90820152610140620002bc848201620001b7565b90820152610160620002d0848201620001b7565b90820152610180620002e4848201620001b7565b908201526101a0620002f8848201620001b7565b908201526101c06200030c848201620001b7565b908201526101e062000320848201620001b7565b9082015261020062000334848201620001b7565b9082015261022062000348848201620001b7565b908201526102406200035c848201620001b7565b9082015261026062000370848201620001b7565b9082015261028062000384848201620001b7565b908201526102a062000398848201620001b7565b908201526102c0620003ac848201620001b7565b908201526102e0620003c0848201620001b7565b90820152610300620003d4848201620001b7565b90820152610320620003e8848201620001b7565b90820152610340620003fc848201620001b7565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516132876200064a600039600081816104d801526117950152600081816104af015261194d015260008181610486015261133e01526000818161045d01526111f001526000818161043401526112d701526000818161040b01526118930152600081816103e201526118550152600081816103b9015261181701526000818161039001526117d9015260008181610367015261190f01526000818161033e01526118d101526000818161031501526115d40152600081816102ec01526115540152600081816102c301526114d501526000818161029a015261175701526000818161027101526110f0015260008181610248015261171901526000818161021f01526116f30152600081816101f601526116ab0152600081816101ce01526116850152600081816101a60152610fcc01526000818161017e015261105801526000818161015601526113b801526000818161012e0152610ec601526000818160df0152610dc0015260008181610107015261163d01526000818160ba01528181610de201528181610ee801528181610fee0152818161107a015281816111120152818161121201528181611360015281816113da015281816114f70152818161157601526115f60152600061052b01526132876000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d5014610046578063615f64fe14610098578063d55ec6971461050a575b600080fd5b6100826040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161008f9190612cc7565b60405180910390f35b604080516103608101825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f0000000000000000000000000000000000000000000000000000000000000000811660e08301527f000000000000000000000000000000000000000000000000000000000000000081166101008301527f000000000000000000000000000000000000000000000000000000000000000081166101208301527f000000000000000000000000000000000000000000000000000000000000000081166101408301527f000000000000000000000000000000000000000000000000000000000000000081166101608301527f000000000000000000000000000000000000000000000000000000000000000081166101808301527f000000000000000000000000000000000000000000000000000000000000000081166101a08301527f000000000000000000000000000000000000000000000000000000000000000081166101c08301527f000000000000000000000000000000000000000000000000000000000000000081166101e08301527f000000000000000000000000000000000000000000000000000000000000000081166102008301527f000000000000000000000000000000000000000000000000000000000000000081166102208301527f000000000000000000000000000000000000000000000000000000000000000081166102408301527f000000000000000000000000000000000000000000000000000000000000000081166102608301527f000000000000000000000000000000000000000000000000000000000000000081166102808301527f000000000000000000000000000000000000000000000000000000000000000081166102a08301527f000000000000000000000000000000000000000000000000000000000000000081166102c08301527f000000000000000000000000000000000000000000000000000000000000000081166102e08301527f000000000000000000000000000000000000000000000000000000000000000081166103008301527f000000000000000000000000000000000000000000000000000000000000000081166103208301527f000000000000000000000000000000000000000000000000000000000000000016610340820152905161008f9190612cda565b610512610514565b005b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610583576040517fada337cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061058d61059b565b905061059881610d72565b50565b6105a3612b18565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663213268496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106269190612f28565b15156101608201526040805160208082018084527f9fce812c00000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000000791639fce812c9160248086019291908187030181865afa1580156106a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c49190612f6c565b73ffffffffffffffffffffffffffffffffffffffff16905281526040805160208082018084527f7f46ddb200000000000000000000000000000000000000000000000000000000905291519091829173420000000000000000000000000000000000001091637f46ddb29160248086019291908187030181865afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107749190612f6c565b73ffffffffffffffffffffffffffffffffffffffff168152508160200181905250604051806020016040528073420000000000000000000000000000000000001473ffffffffffffffffffffffffffffffffffffffff16637f46ddb26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108239190612f6c565b73ffffffffffffffffffffffffffffffffffffffff168152508160400181905250604051806020016040528073420000000000000000000000000000000000001273ffffffffffffffffffffffffffffffffffffffff1663ee9a31a26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d29190612f6c565b73ffffffffffffffffffffffffffffffffffffffff1690526060820152604080518082018083527fee9a31a2000000000000000000000000000000000000000000000000000000009052905181907342000000000000000000000000000000000000179063ee9a31a2906044808501916020918187030181865afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109829190612f6c565b73ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000001773ffffffffffffffffffffffffffffffffffffffff16637d1d0c5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a209190612f89565b90526080820152610a44734200000000000000000000000000000000000011611975565b60a0820152610a66734200000000000000000000000000000000000019611975565b60c0820152610a8873420000000000000000000000000000000000001a611975565b60e0820152610aaa73420000000000000000000000000000000000001b611975565b61010082015261016081015115610c9a57600073420000000000000000000000000000000000002a905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4e9190612f6c565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d84447156040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610bfa9190810190613063565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663550fcdc96040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c4a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610c909190810190613063565b9052610120830152505b600073420000000000000000000000000000000000002b73ffffffffffffffffffffffffffffffffffffffff1663d61a398b6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d35575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610d3291810190612f6c565b60015b610d4157506000610d44565b90505b604080516020810190915273ffffffffffffffffffffffffffffffffffffffff909116815261014082015290565b6000610d7e6001611b56565b82515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152909150610e8490734200000000000000000000000000000000000007907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de80000000000000000000000000000000000000000000000000000000017905260006014611cb9565b60208201515160405173ffffffffffffffffffffffffffffffffffffffff9091166024820152610f8a90734200000000000000000000000000000000000010907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906044015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052600080611cb9565b60408083015151905173ffffffffffffffffffffffffffffffffffffffff909116602482015261101690734200000000000000000000000000000000000014907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401610f0c565b60608201515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526110a290734200000000000000000000000000000000000012907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401610f0c565b6080820151805160209091015160405173ffffffffffffffffffffffffffffffffffffffff909216602483015260448201526111b490734200000000000000000000000000000000000017907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcd6dc6870000000000000000000000000000000000000000000000000000000017905260016000611cb9565b816101600151156112fb576101208201518051602082015160409283015192516112bd9373420000000000000000000000000000000000002a937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361123f93906024016130b4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f9065714700000000000000000000000000000000000000000000000000000000179052600080611cb9565b6112fb7342000000000000000000000000000000000000297f0000000000000000000000000000000000000000000000000000000000000000612313565b6101408201515160405173ffffffffffffffffffffffffffffffffffffffff90911660248201526113889073420000000000000000000000000000000000002b907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090604401610f0c565b60a08201518051602082015160409283015192516114a593734200000000000000000000000000000000000011937f0000000000000000000000000000000000000000000000000000000000000000937f000000000000000000000000000000000000000000000000000000000000000093611407939060240161312e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb49dc741000000000000000000000000000000000000000000000000000000001790527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006000611cb9565b60c082015180516020820151604092830151925161152493734200000000000000000000000000000000000019937f0000000000000000000000000000000000000000000000000000000000000000937f000000000000000000000000000000000000000000000000000000000000000093611407939060240161312e565b60e08201518051602082015160409283015192516115a39373420000000000000000000000000000000000001a937f0000000000000000000000000000000000000000000000000000000000000000937f000000000000000000000000000000000000000000000000000000000000000093611407939060240161312e565b6101008201518051602082015160409283015192516116239373420000000000000000000000000000000000001b937f0000000000000000000000000000000000000000000000000000000000000000937f000000000000000000000000000000000000000000000000000000000000000093611407939060240161312e565b61166173420000000000000000000000000000000000000f7f0000000000000000000000000000000000000000000000000000000000000000612313565b6116cf7342000000000000000000000000000000000000158361016001516116a9577f0000000000000000000000000000000000000000000000000000000000000000612313565b7f0000000000000000000000000000000000000000000000000000000000000000612313565b61173d734200000000000000000000000000000000000016836101600151611717577f0000000000000000000000000000000000000000000000000000000000000000612313565b7f0000000000000000000000000000000000000000000000000000000000000000612313565b61177b7342000000000000000000000000000000000000187f0000000000000000000000000000000000000000000000000000000000000000612313565b6117b973420000000000000000000000000000000000002d7f0000000000000000000000000000000000000000000000000000000000000000612313565b80156118b7576117fd7342000000000000000000000000000000000000227f0000000000000000000000000000000000000000000000000000000000000000612313565b61183b7342000000000000000000000000000000000000237f0000000000000000000000000000000000000000000000000000000000000000612313565b6118797342000000000000000000000000000000000000247f0000000000000000000000000000000000000000000000000000000000000000612313565b6118b77342000000000000000000000000000000000000257f0000000000000000000000000000000000000000000000000000000000000000612313565b6118f57342000000000000000000000000000000000000207f0000000000000000000000000000000000000000000000000000000000000000612313565b6119337342000000000000000000000000000000000000217f0000000000000000000000000000000000000000000000000000000000000000612313565b61197173420000000000000000000000000000000000002c7f0000000000000000000000000000000000000000000000000000000000000000612313565b5050565b61199660408051606081018252600080825260208201819052909182015290565b60008273ffffffffffffffffffffffffffffffffffffffff1663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611a1d575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611a1a91810190613197565b60015b611a2957506000611a2c565b90505b600083905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aab9190612f6c565b73ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b359190612f89565b8152602001836001811115611b4c57611b4c6130ff565b9052949350505050565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000002d600482015260009081907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb9190612f6c565b90508073ffffffffffffffffffffffffffffffffffffffff163b600003611c255750600092915050565b6040517f78ecabce0000000000000000000000000000000000000000000000000000000081526004810184905273420000000000000000000000000000000000002d906378ecabce90602401602060405180830381865afa158015611c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb29190612f28565b9392505050565b611cc2866125a0565b1561230b576040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa158015611d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6c9190612f6c565b905073ffffffffffffffffffffffffffffffffffffffff81163b15801590611eb95750611eb98773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015611ddd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611e239190810190613063565b8773ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015611e6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611eb49190810190613063565b6125e9565b15611f0d576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024015b60405180910390fd5b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152881690633659cfe690602401600060405180830381600087803b158015611f7657600080fd5b505af1158015611f8a573d6000803e3d6000fd5b50506040517fa6ed563e000000000000000000000000000000000000000000000000000000008152600481018690526000925073ffffffffffffffffffffffffffffffffffffffff8a16915063a6ed563e90602401602060405180830381865afa158015611ffc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120209190612f89565b9050600061203260ff851660086131b8565b6040517f4e91db080000000000000000000000000000000000000000000000000000000081526004810187905260ff90911b198381166024830152915073ffffffffffffffffffffffffffffffffffffffff8a1690634e91db0890604401600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50506040517fa6ed563e0000000000000000000000000000000000000000000000000000000081527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006004820181905292506000915073ffffffffffffffffffffffffffffffffffffffff8c169063a6ed563e90602401602060405180830381865afa158015612152573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121769190612f89565b90508060ff604082901c16156121b8576040517fc996d78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4e91db08000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082811660248301529073ffffffffffffffffffffffffffffffffffffffff8e1690634e91db0890604401600060405180830381600087803b15801561224a57600080fd5b505af115801561225e573d6000803e3d6000fd5b505050508c73ffffffffffffffffffffffffffffffffffffffff16634f1ef2868d8c6040518363ffffffff1660e01b815260040161229d92919061321c565b6000604051808303816000875af11580156122bc573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526123029190810190613063565b50505050505050505b505050505050565b61231c826125a0565b612324575050565b6040517f204e1c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526000907342000000000000000000000000000000000000189063204e1c7a90602401602060405180830381865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f6c565b905073ffffffffffffffffffffffffffffffffffffffff81163b158015906124cb57506124cb8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa15801561243a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526124809190810190613063565b8373ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b8152600401600060405180830381865afa158015611e6e573d6000803e3d6000fd5b1561251a576040517ff8ce5d1600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401611f04565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401600060405180830381600087803b15801561258357600080fd5b505af1158015612597573d6000803e3d6000fd5b50505050505050565b60007208400000000000000000000000000000000000600b83901c721fffffffffffffffffffffffffffffffffffff161480156125e357506125e18261260f565b155b92915050565b60006125f58383612677565b158015611cb2575061260783836126c7565b159392505050565b600073ffffffffffffffffffffffffffffffffffffffff821673420000000000000000000000000000000000004214806125e3575073ffffffffffffffffffffffffffffffffffffffff82167342000000000000000000000000000000000000061492915050565b6000806126838461273c565b905060006126908461273c565b805183519192501480156126ab575080602001518260200151145b80156126be575080604001518260400151145b95945050505050565b6000806126d38461273c565b905060006126e08461273c565b805183519192501180612706575080518251148015612706575080602001518260200151105b806126be575080518251148015612724575080602001518260200151145b80156126be5750604090810151910151109392505050565b61276060405180606001604052806000815260200160008152602001600081525090565b60006127a1836040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250612908565b90506003815110156127df576040517f9eda858c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061283a826002815181106127f7576127f761324b565b60200260200101516040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250612908565b90506000612897826000815181106128545761285461324b565b60200260200101516040518060400160405280600181526020017f2b00000000000000000000000000000000000000000000000000000000000000815250612908565b905060405180606001604052806128c7856000815181106128ba576128ba61324b565b60200260200101516129b3565b81526020016128e2856001815181106128ba576128ba61324b565b81526020016128fd836000815181106128ba576128ba61324b565b905295945050505050565b606060006129168484612a2b565b9050601f1960208201600183510160051b81018651838201526001845101845260005b82516060845281811461297e5760405182820380825286601f8201165b8b8501810151838201528701806129565750600082820160200152603f018616810160405284525b875160209490940193019050818310612939575050505080915082516129ac57602081019150600281510382525b5092915050565b80516000907f1999999999999999999999999999999999999999999999999999999999999999825b600181019050603060ff82870151160382851185600a0282810196506009831181881083171715860295505050508281106129db57505080612a255763101827966000526004601cfd5b50919050565b606082518251818111612b10576020850194506020840193506020604051019250846001828488010301600060208410612a6457508286205b601f841660200360031b87515b8951818118831c612ac6578315612aa45783878c2014612aa45760018b019a50848b10612a9e5750612ad5565b50612a71565b858b038952998601996020909801978615612ac657848b10612a9e5750612ad5565b5060018a019950838a10612a71575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08189030160051c8152602090970190525050505b505092915050565b604080516101a08101825260006101808201818152825282516020808201855282825280840191909152835180820185528281528385015283518082018552828152606084015283518085019094528184528301529060808201908152602001612b9960408051606081018252600080825260208201819052909182015290565b8152602001612bbf60408051606081018252600080825260208201819052909182015290565b8152602001612be560408051606081018252600080825260208201819052909182015290565b8152602001612c0b60408051606081018252600080825260208201819052909182015290565b81526040805160608082018352600082526020828101829052928201529101908152604080516020818101909252600081529101908152600060209091015290565b60005b83811015612c68578181015183820152602001612c50565b83811115612c77576000848401525b50505050565b60008151808452612c95816020860160208601612c4d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cb26020830184612c7d565b815173ffffffffffffffffffffffffffffffffffffffff16815261036081016020830151612d20602084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151612d48604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506060830151612d70606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080830151612d98608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a0830151612dc060a084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c0830151612de860c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e0830151612e1060e084018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015173ffffffffffffffffffffffffffffffffffffffff90811691840191909152610120808501518216908401526101408085015182169084015261016080850151821690840152610180808501518216908401526101a0808501518216908401526101c0808501518216908401526101e08085015182169084015261020080850151821690840152610220808501518216908401526102408085015182169084015261026080850151821690840152610280808501518216908401526102a0808501518216908401526102c0808501518216908401526102e0808501518216908401526103008085015182169084015261032080850151821690840152610340808501519182168185015290612b10565b600060208284031215612f3a57600080fd5b81518015158114611cb257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461059857600080fd5b600060208284031215612f7e57600080fd5b8151611cb281612f4a565b600060208284031215612f9b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115612fec57612fec612fa2565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561303257613032612fa2565b8160405280935085815286868601111561304b57600080fd5b613059866020830187612c4d565b5050509392505050565b60006020828403121561307557600080fd5b815167ffffffffffffffff81111561308c57600080fd5b8201601f8101841361309d57600080fd5b6130ac84825160208401612fd1565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006130e36060830185612c7d565b82810360408401526130f58185612c7d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff84168152602081018390526060810160028310613189577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b826040830152949350505050565b6000602082840312156131a957600080fd5b815160028110611cb257600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613217577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006130ac6040830184612c7d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a0000000000000000000000002a5a3eabb9fd571a3af0299eebdf8eaafe29a914000000000000000000000000250af3f400cf8aac8d410c90f1ba3968dd87df96000000000000000000000000547d0fba434877d7237d511cf87fabe2ee26b152000000000000000000000000ac8538a2e6a1f5dfbb1c4b8bd97cefb2997824a8000000000000000000000000b178cdaa8336f25624a63c049edb5af7ca36c2da000000000000000000000000c053fc0155bf8bda5b568af53276e538f0ea4d58000000000000000000000000716ead0cf3e7ff86a02d4f8cb41a6d14922fa833000000000000000000000000f57b0b99a3d5c28515477c51e9e1d17492835ac8000000000000000000000000dde1b9d8022e9e9c81e82a63cee81384acc820aa00000000000000000000000027e51b2254433a3284d9ba73ea551c397db2a124000000000000000000000000a0f4ffff79a0a3e039fcbef738751efba8e84f96000000000000000000000000f43862b9d814bb4504158ceccb0b74b31265e4ee000000000000000000000000db7bae515c7d179ccacd3b4e0a1937eb84b69910000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000f7bed7215eef1003fac426682cf2edeb958569f7000000000000000000000000eddf416c7159387cc6df3015700f79cfb891137300000000000000000000000070de55bc0bfbc52c5d0cca1da5816c2428886a34000000000000000000000000bec660b456b84a081e90af29be43385bda5bf7b600000000000000000000000093a8a7a9c98cb998d88dba3373a6c7f8ee2e8a4600000000000000000000000037dc2fe754052a9fac35f17282599fafbeb9f423000000000000000000000000784f1fae11f1c3a9c413423fe1b370a3636b8d560000000000000000000000002f76618143d9d2731c56778192d3893864b423d7000000000000000000000000dda87ef358082ab3f4ba8982290c671efdc4d1590000000000000000000000008256398a687e740006098445b05d5ca46b7be21e0000000000000000000000008684ccc5bf484ec242dbc7119004a83533934a79000000000000000000000000906835344844979ffd3a752eaa23728d513db00b000000000000000000000000e35b194efc4907f383b7e3b87f4c2c339ce239f6000000000000000000000000000000", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", "gasLimit": 4500000, "intent": "Deploy L2ContractsManager Implementation", "to": "0x420000000000000000000000000000000000002C" }, { - "data": "0x7c36f37e0000000000000000000000008ddfd80ecfafc1fb8318b427efbf648d5b1efcc4", + "data": "0x7c36f37e00000000000000000000000041208fc3c21fe1a010b55d9450cbc9296aa16602", "from": "0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001", "gasLimit": 3000000, "intent": "L2ProxyAdmin Upgrade Predeploys", diff --git a/packages/contracts-bedrock/src/L2/L2ContractsManager.sol b/packages/contracts-bedrock/src/L2/L2ContractsManager.sol index 40ac201f2c8..9eb5c5fbbef 100644 --- a/packages/contracts-bedrock/src/L2/L2ContractsManager.sol +++ b/packages/contracts-bedrock/src/L2/L2ContractsManager.sol @@ -32,8 +32,8 @@ contract L2ContractsManager is ISemver { error L2ContractsManager_OnlyDelegatecall(); /// @notice The semantic version of the L2ContractsManager contract. - /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + /// @custom:semver 1.2.0 + string public constant version = "1.2.0"; /// @notice The address of this contract. Used to enforce that the upgrade function is only /// called via DELEGATECALL. @@ -94,12 +94,6 @@ contract L2ContractsManager is ISemver { address internal immutable SUPERCHAIN_ETH_BRIDGE_IMPL; /// @notice ETHLiquidity implementation. address internal immutable ETH_LIQUIDITY_IMPL; - /// @notice OptimismSuperchainERC20Factory implementation. - address internal immutable OPTIMISM_SUPERCHAIN_ERC20_FACTORY_IMPL; - /// @notice OptimismSuperchainERC20Beacon implementation. - address internal immutable OPTIMISM_SUPERCHAIN_ERC20_BEACON_IMPL; - /// @notice SuperchainTokenBridge implementation. - address internal immutable SUPERCHAIN_TOKEN_BRIDGE_IMPL; /// @notice NativeAssetLiquidity implementation. address internal immutable NATIVE_ASSET_LIQUIDITY_IMPL; /// @notice LiquidityController implementation. @@ -143,9 +137,6 @@ contract L2ContractsManager is ISemver { L2_TO_L2_CROSS_DOMAIN_MESSENGER_IMPL = _implementations.l2ToL2CrossDomainMessengerImpl; SUPERCHAIN_ETH_BRIDGE_IMPL = _implementations.superchainETHBridgeImpl; ETH_LIQUIDITY_IMPL = _implementations.ethLiquidityImpl; - OPTIMISM_SUPERCHAIN_ERC20_FACTORY_IMPL = _implementations.optimismSuperchainERC20FactoryImpl; - OPTIMISM_SUPERCHAIN_ERC20_BEACON_IMPL = _implementations.optimismSuperchainERC20BeaconImpl; - SUPERCHAIN_TOKEN_BRIDGE_IMPL = _implementations.superchainTokenBridgeImpl; NATIVE_ASSET_LIQUIDITY_IMPL = _implementations.nativeAssetLiquidityImpl; LIQUIDITY_CONTROLLER_IMPL = _implementations.liquidityControllerImpl; // TODO(#19600): Remove FEE_SPLITTER_IMPL as part of revenue sharing deprecation. @@ -431,13 +422,6 @@ contract L2ContractsManager is ISemver { ); L2ContractsManagerUtils.upgradeTo(Predeploys.SUPERCHAIN_ETH_BRIDGE, SUPERCHAIN_ETH_BRIDGE_IMPL); L2ContractsManagerUtils.upgradeTo(Predeploys.ETH_LIQUIDITY, ETH_LIQUIDITY_IMPL); - L2ContractsManagerUtils.upgradeTo( - Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY, OPTIMISM_SUPERCHAIN_ERC20_FACTORY_IMPL - ); - L2ContractsManagerUtils.upgradeTo( - Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON, OPTIMISM_SUPERCHAIN_ERC20_BEACON_IMPL - ); - L2ContractsManagerUtils.upgradeTo(Predeploys.SUPERCHAIN_TOKEN_BRIDGE, SUPERCHAIN_TOKEN_BRIDGE_IMPL); } L2ContractsManagerUtils.upgradeTo(Predeploys.SCHEMA_REGISTRY, SCHEMA_REGISTRY_IMPL); L2ContractsManagerUtils.upgradeTo(Predeploys.EAS, EAS_IMPL); @@ -485,9 +469,6 @@ contract L2ContractsManager is ISemver { implementations_.l2ToL2CrossDomainMessengerImpl = L2_TO_L2_CROSS_DOMAIN_MESSENGER_IMPL; implementations_.superchainETHBridgeImpl = SUPERCHAIN_ETH_BRIDGE_IMPL; implementations_.ethLiquidityImpl = ETH_LIQUIDITY_IMPL; - implementations_.optimismSuperchainERC20FactoryImpl = OPTIMISM_SUPERCHAIN_ERC20_FACTORY_IMPL; - implementations_.optimismSuperchainERC20BeaconImpl = OPTIMISM_SUPERCHAIN_ERC20_BEACON_IMPL; - implementations_.superchainTokenBridgeImpl = SUPERCHAIN_TOKEN_BRIDGE_IMPL; implementations_.nativeAssetLiquidityImpl = NATIVE_ASSET_LIQUIDITY_IMPL; implementations_.liquidityControllerImpl = LIQUIDITY_CONTROLLER_IMPL; implementations_.feeSplitterImpl = FEE_SPLITTER_IMPL; diff --git a/packages/contracts-bedrock/src/libraries/L2ContractsManagerTypes.sol b/packages/contracts-bedrock/src/libraries/L2ContractsManagerTypes.sol index e1d0bc98756..e64d32a399d 100644 --- a/packages/contracts-bedrock/src/libraries/L2ContractsManagerTypes.sol +++ b/packages/contracts-bedrock/src/libraries/L2ContractsManagerTypes.sol @@ -96,9 +96,6 @@ library L2ContractsManagerTypes { address l2ToL2CrossDomainMessengerImpl; address superchainETHBridgeImpl; address ethLiquidityImpl; - address optimismSuperchainERC20FactoryImpl; - address optimismSuperchainERC20BeaconImpl; - address superchainTokenBridgeImpl; address nativeAssetLiquidityImpl; address liquidityControllerImpl; address feeSplitterImpl; diff --git a/packages/contracts-bedrock/src/libraries/Predeploys.sol b/packages/contracts-bedrock/src/libraries/Predeploys.sol index 011131b21dc..ce4a47086b3 100644 --- a/packages/contracts-bedrock/src/libraries/Predeploys.sol +++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol @@ -210,7 +210,12 @@ library Predeploys { || ( _fork >= uint256(Fork.INTEROP) && _isInteropDevFeatureEnabled && _useInterop && _addr == L2_TO_L2_CROSS_DOMAIN_MESSENGER - ) || (_isCustomGasToken && _addr == LIQUIDITY_CONTROLLER) + ) + || ( + _fork >= uint256(Fork.INTEROP) && _isInteropDevFeatureEnabled && _useInterop + && _addr == SUPERCHAIN_ETH_BRIDGE + ) || (_fork >= uint256(Fork.INTEROP) && _isInteropDevFeatureEnabled && _useInterop && _addr == ETH_LIQUIDITY) + || (_isCustomGasToken && _addr == LIQUIDITY_CONTROLLER) || (_isCustomGasToken && _addr == NATIVE_ASSET_LIQUIDITY) || (_useL2CM && _addr == CONDITIONAL_DEPLOYER) || (_useL2CM && _addr == L2_DEV_FEATURE_FLAGS); } @@ -248,7 +253,7 @@ library Predeploys { /// Predeploys library should be listed here. /// Excludes: WETH, GOVERNANCE_TOKEN (not proxied), legacy predeploys (not upgraded). function getUpgradeablePredeploys() internal pure returns (address[] memory predeploys_) { - predeploys_ = new address[](27); + predeploys_ = new address[](24); // Core predeploys predeploys_[0] = Predeploys.L2_CROSS_DOMAIN_MESSENGER; predeploys_[1] = Predeploys.GAS_PRICE_ORACLE; @@ -272,13 +277,10 @@ library Predeploys { predeploys_[18] = Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER; predeploys_[19] = Predeploys.SUPERCHAIN_ETH_BRIDGE; predeploys_[20] = Predeploys.ETH_LIQUIDITY; - predeploys_[21] = Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY; - predeploys_[22] = Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON; - predeploys_[23] = Predeploys.SUPERCHAIN_TOKEN_BRIDGE; // CGT predeploys (conditionally deployed, but still must be included in the list) - predeploys_[24] = Predeploys.NATIVE_ASSET_LIQUIDITY; - predeploys_[25] = Predeploys.LIQUIDITY_CONTROLLER; + predeploys_[21] = Predeploys.NATIVE_ASSET_LIQUIDITY; + predeploys_[22] = Predeploys.LIQUIDITY_CONTROLLER; // Dev feature flags bitmap - predeploys_[26] = Predeploys.L2_DEV_FEATURE_FLAGS; + predeploys_[23] = Predeploys.L2_DEV_FEATURE_FLAGS; } } diff --git a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol index 4bcc03d0c10..5529e6baa54 100644 --- a/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ContractsManager.t.sol @@ -41,7 +41,6 @@ import { OptimismMintableERC721Factory } from "src/L2/OptimismMintableERC721Fact import { L2ProxyAdmin } from "src/L2/L2ProxyAdmin.sol"; import { SuperchainETHBridge } from "src/L2/SuperchainETHBridge.sol"; import { ETHLiquidity } from "src/L2/ETHLiquidity.sol"; -import { OptimismSuperchainERC20Beacon } from "src/L2/OptimismSuperchainERC20Beacon.sol"; import { NativeAssetLiquidity } from "src/L2/NativeAssetLiquidity.sol"; import { LiquidityController } from "src/L2/LiquidityController.sol"; @@ -91,9 +90,6 @@ contract L2ContractsManager_Upgrade_Test is CommonTest { address l2ToL2CrossDomainMessengerImpl; address superchainETHBridgeImpl; address ethLiquidityImpl; - address optimismSuperchainERC20FactoryImpl; - address optimismSuperchainERC20BeaconImpl; - address superchainTokenBridgeImpl; address nativeAssetLiquidityImpl; address liquidityControllerImpl; address feeSplitterImpl; @@ -128,7 +124,6 @@ contract L2ContractsManager_Upgrade_Test is CommonTest { implementations.proxyAdminImpl = address(new L2ProxyAdmin()); implementations.superchainETHBridgeImpl = address(new SuperchainETHBridge()); implementations.ethLiquidityImpl = address(new ETHLiquidity()); - implementations.optimismSuperchainERC20BeaconImpl = address(new OptimismSuperchainERC20Beacon()); implementations.nativeAssetLiquidityImpl = address(new NativeAssetLiquidity()); implementations.liquidityControllerImpl = address(new LiquidityController()); @@ -144,9 +139,6 @@ contract L2ContractsManager_Upgrade_Test is CommonTest { implementations.crossL2InboxImpl = deployCode("src/L2/CrossL2Inbox.sol:CrossL2Inbox"); implementations.l2ToL2CrossDomainMessengerImpl = deployCode("src/L2/L2ToL2CrossDomainMessenger.sol:L2ToL2CrossDomainMessenger"); - implementations.optimismSuperchainERC20FactoryImpl = - deployCode("src/L2/OptimismSuperchainERC20Factory.sol:OptimismSuperchainERC20Factory"); - implementations.superchainTokenBridgeImpl = deployCode("src/L2/SuperchainTokenBridge.sol:SuperchainTokenBridge"); implementations.feeSplitterImpl = deployCode("src/L2/FeeSplitter.sol:FeeSplitter"); implementations.conditionalDeployerImpl = deployCode("src/L2/ConditionalDeployer.sol:ConditionalDeployer"); implementations.l2DevFeatureFlagsImpl = deployCode("src/L2/L2DevFeatureFlags.sol:L2DevFeatureFlags"); @@ -196,11 +188,6 @@ contract L2ContractsManager_Upgrade_Test is CommonTest { EIP1967Helper.getImplementation(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); state_.superchainETHBridgeImpl = EIP1967Helper.getImplementation(Predeploys.SUPERCHAIN_ETH_BRIDGE); state_.ethLiquidityImpl = EIP1967Helper.getImplementation(Predeploys.ETH_LIQUIDITY); - state_.optimismSuperchainERC20FactoryImpl = - EIP1967Helper.getImplementation(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY); - state_.optimismSuperchainERC20BeaconImpl = - EIP1967Helper.getImplementation(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON); - state_.superchainTokenBridgeImpl = EIP1967Helper.getImplementation(Predeploys.SUPERCHAIN_TOKEN_BRIDGE); state_.nativeAssetLiquidityImpl = EIP1967Helper.getImplementation(Predeploys.NATIVE_ASSET_LIQUIDITY); state_.liquidityControllerImpl = EIP1967Helper.getImplementation(Predeploys.LIQUIDITY_CONTROLLER); state_.feeSplitterImpl = EIP1967Helper.getImplementation(Predeploys.FEE_SPLITTER); @@ -252,19 +239,6 @@ contract L2ContractsManager_Upgrade_Test is CommonTest { ); assertEq(_state1.superchainETHBridgeImpl, _state2.superchainETHBridgeImpl, "SuperchainETHBridge impl mismatch"); assertEq(_state1.ethLiquidityImpl, _state2.ethLiquidityImpl, "ETHLiquidity impl mismatch"); - assertEq( - _state1.optimismSuperchainERC20FactoryImpl, - _state2.optimismSuperchainERC20FactoryImpl, - "OptimismSuperchainERC20Factory impl mismatch" - ); - assertEq( - _state1.optimismSuperchainERC20BeaconImpl, - _state2.optimismSuperchainERC20BeaconImpl, - "OptimismSuperchainERC20Beacon impl mismatch" - ); - assertEq( - _state1.superchainTokenBridgeImpl, _state2.superchainTokenBridgeImpl, "SuperchainTokenBridge impl mismatch" - ); assertEq( _state1.nativeAssetLiquidityImpl, _state2.nativeAssetLiquidityImpl, "NativeAssetLiquidity impl mismatch" ); @@ -775,21 +749,6 @@ contract L2ContractsManager_GetImplementations_Test is L2ContractsManager_Upgrad result.superchainETHBridgeImpl, implementations.superchainETHBridgeImpl, "superchainETHBridgeImpl mismatch" ); assertEq(result.ethLiquidityImpl, implementations.ethLiquidityImpl, "ethLiquidityImpl mismatch"); - assertEq( - result.optimismSuperchainERC20FactoryImpl, - implementations.optimismSuperchainERC20FactoryImpl, - "optimismSuperchainERC20FactoryImpl mismatch" - ); - assertEq( - result.optimismSuperchainERC20BeaconImpl, - implementations.optimismSuperchainERC20BeaconImpl, - "optimismSuperchainERC20BeaconImpl mismatch" - ); - assertEq( - result.superchainTokenBridgeImpl, - implementations.superchainTokenBridgeImpl, - "superchainTokenBridgeImpl mismatch" - ); assertEq( result.nativeAssetLiquidityImpl, implementations.nativeAssetLiquidityImpl, @@ -832,11 +791,6 @@ contract L2ContractsManager_GetImplementations_Test is L2ContractsManager_Upgrad assertTrue(result.l2ToL2CrossDomainMessengerImpl != address(0), "l2ToL2CrossDomainMessengerImpl is zero"); assertTrue(result.superchainETHBridgeImpl != address(0), "superchainETHBridgeImpl is zero"); assertTrue(result.ethLiquidityImpl != address(0), "ethLiquidityImpl is zero"); - assertTrue( - result.optimismSuperchainERC20FactoryImpl != address(0), "optimismSuperchainERC20FactoryImpl is zero" - ); - assertTrue(result.optimismSuperchainERC20BeaconImpl != address(0), "optimismSuperchainERC20BeaconImpl is zero"); - assertTrue(result.superchainTokenBridgeImpl != address(0), "superchainTokenBridgeImpl is zero"); assertTrue(result.nativeAssetLiquidityImpl != address(0), "nativeAssetLiquidityImpl is zero"); assertTrue(result.liquidityControllerImpl != address(0), "liquidityControllerImpl is zero"); assertTrue(result.feeSplitterImpl != address(0), "feeSplitterImpl is zero"); @@ -858,12 +812,9 @@ contract L2ContractsManager_Upgrade_InteropFlag_Test is L2ContractsManager_Upgra interopPredeploys.push(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); interopPredeploys.push(Predeploys.SUPERCHAIN_ETH_BRIDGE); interopPredeploys.push(Predeploys.ETH_LIQUIDITY); - interopPredeploys.push(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY); - interopPredeploys.push(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON); - interopPredeploys.push(Predeploys.SUPERCHAIN_TOKEN_BRIDGE); } - /// @notice Tests that all 7 interop predeploys are upgraded when OPTIMISM_PORTAL_INTEROP flag is enabled. + /// @notice Tests that all 4 interop predeploys are upgraded when OPTIMISM_PORTAL_INTEROP flag is enabled. function test_upgradeUpgradesInteropPredeploys_whenInteropFlagEnabled_succeeds() public { skipIfDevFeatureDisabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); @@ -896,24 +847,9 @@ contract L2ContractsManager_Upgrade_InteropFlag_Test is L2ContractsManager_Upgra implementations.ethLiquidityImpl, "ETHLiquidity should be upgraded" ); - assertEq( - EIP1967Helper.getImplementation(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY), - implementations.optimismSuperchainERC20FactoryImpl, - "OptimismSuperchainERC20Factory should be upgraded" - ); - assertEq( - EIP1967Helper.getImplementation(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON), - implementations.optimismSuperchainERC20BeaconImpl, - "OptimismSuperchainERC20Beacon should be upgraded" - ); - assertEq( - EIP1967Helper.getImplementation(Predeploys.SUPERCHAIN_TOKEN_BRIDGE), - implementations.superchainTokenBridgeImpl, - "SuperchainTokenBridge should be upgraded" - ); } - /// @notice Tests that all 7 interop predeploys retain pre-upgrade implementations when OPTIMISM_PORTAL_INTEROP flag + /// @notice Tests that all 4 interop predeploys retain pre-upgrade implementations when OPTIMISM_PORTAL_INTEROP flag /// is disabled. function test_upgradeSkipsInteropPredeploys_whenInteropFlagDisabled_succeeds() public { skipIfDevFeatureEnabled(DevFeatures.OPTIMISM_PORTAL_INTEROP); @@ -944,9 +880,7 @@ contract L2ContractsManager_Upgrade_Coverage_Test is L2ContractsManager_Upgrade_ /// @notice Checks if a predeploy is an interop predeploy gated behind the OPTIMISM_PORTAL_INTEROP dev feature flag. function _isInteropPredeploy(address _predeploy) internal pure returns (bool) { return _predeploy == Predeploys.CROSS_L2_INBOX || _predeploy == Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER - || _predeploy == Predeploys.SUPERCHAIN_ETH_BRIDGE || _predeploy == Predeploys.ETH_LIQUIDITY - || _predeploy == Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY - || _predeploy == Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON || _predeploy == Predeploys.SUPERCHAIN_TOKEN_BRIDGE; + || _predeploy == Predeploys.SUPERCHAIN_ETH_BRIDGE || _predeploy == Predeploys.ETH_LIQUIDITY; } /// @notice Returns CGT-only predeploys that require initialization. diff --git a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol index 996e4d889a5..85812e2c76e 100644 --- a/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol +++ b/packages/contracts-bedrock/test/L2/fork/L2ForkUpgrade.t.sol @@ -85,9 +85,6 @@ contract L2ForkUpgrade_TestInit is CommonTest { if ( _predeploy == Predeploys.CROSS_L2_INBOX || _predeploy == Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER || _predeploy == Predeploys.SUPERCHAIN_ETH_BRIDGE || _predeploy == Predeploys.ETH_LIQUIDITY - || _predeploy == Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY - || _predeploy == Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON - || _predeploy == Predeploys.SUPERCHAIN_TOKEN_BRIDGE ) { return true; } From c92df45310966326d88b2a7eb2f082fc850795d0 Mon Sep 17 00:00:00 2001 From: Ashitaka Date: Thu, 26 Mar 2026 12:54:42 -0300 Subject: [PATCH 2/8] feat: merge with dev --- .circleci/config.yml | 4 - .circleci/continue/main.yml | 50 +- .circleci/continue/rust-ci.yml | 3 - .circleci/continue/rust-e2e.yml | 3 - mise.toml | 2 - .../scripts/metrics-collect-authorship.sh | 15 - .../interop/loadtest/invalid_msg_test.go | 4 +- .../interop/message/interop_happy_tx_test.go | 10 +- .../tests/interop/message/interop_mon_test.go | 2 +- .../serial/interop_fault_proofs_test.go | 7 +- .../interop/reorgs/init_exec_msg_test.go | 4 +- .../interop/reorgs/invalid_exec_msgs_test.go | 58 +- .../sync/simple_interop/interop_sync_test.go | 10 +- .../reorg/invalid_message_reorg_test.go | 4 +- .../same_timestamp_test.go | 8 +- op-devstack/README.md | 2 +- op-devstack/dsl/l2_el.go | 2 +- op-devstack/sysgo/mixed_runtime.go | 20 +- .../sysgo/multichain_supernode_runtime.go | 10 +- op-devstack/sysgo/singlechain_build.go | 60 +- op-devstack/sysgo/singlechain_runtime.go | 7 +- op-devstack/sysgo/singlechain_variants.go | 13 +- op-node/rollup/driver/sync_deriver.go | 2 - op-node/rollup/engine/engine_controller.go | 68 +- .../rollup/engine/engine_controller_test.go | 110 ++- op-up/main.go | 213 ++++- op-up/smoke.go | 732 ++++++++++++++++++ rust/kona/tests/justfile | 8 +- 28 files changed, 1161 insertions(+), 270 deletions(-) delete mode 100755 op-acceptance-tests/scripts/metrics-collect-authorship.sh create mode 100644 op-up/smoke.go diff --git a/.circleci/config.yml b/.circleci/config.yml index e20020c1e52..ed2d5d8a04a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -71,9 +71,6 @@ parameters: github-event-base64: type: string default: "__not_set__" - devnet-metrics-collect: - type: boolean - default: false # go-cache-version can be used as a cache buster when making breaking changes to caching strategy go-cache-version: type: string @@ -108,7 +105,6 @@ workflows: .* c-github-event-type << pipeline.parameters.github-event-type >> .circleci/continue/main.yml .* c-github-event-action << pipeline.parameters.github-event-action >> .circleci/continue/main.yml .* c-github-event-base64 << pipeline.parameters.github-event-base64 >> .circleci/continue/main.yml - .* c-devnet-metrics-collect << pipeline.parameters.devnet-metrics-collect >> .circleci/continue/main.yml .* c-go-cache-version << pipeline.parameters.go-cache-version >> .circleci/continue/main.yml rust/.* c-rust_files_changed true .circleci/continue/main.yml ^(?!docs/public-docs/).+ c-non_docs_changes true .circleci/continue/main.yml diff --git a/.circleci/continue/main.yml b/.circleci/continue/main.yml index 3c688f5e366..127aa729c37 100644 --- a/.circleci/continue/main.yml +++ b/.circleci/continue/main.yml @@ -59,9 +59,6 @@ parameters: c-github-event-base64: type: string default: "__not_set__" - c-devnet-metrics-collect: - type: boolean - default: false # Set to true by path-filtering when files under rust/ change. # When false on feature branches, kona-build-release skips cargo build and # reuses cached binaries — saving ~9 minutes on PRs that don't touch Rust. @@ -141,9 +138,6 @@ parameters: github-event-base64: type: string default: "__not_set__" - devnet-metrics-collect: - type: boolean - default: false go-cache-version: type: string default: "v0.0" @@ -1803,7 +1797,7 @@ jobs: type: string default: "" l2_cl_kind: - description: "L2 consensus layer client (op-node or kona)" + description: "L2 consensus layer client (op-node or kona-node)" type: string default: "op-node" l2_el_kind: @@ -2349,31 +2343,6 @@ jobs: MESSAGE: << parameters.message >> LABEL_NAME: << parameters.label_name >> - devnet-metrics-collect-authorship: - docker: - - image: <> - steps: - - utils/checkout-with-mise: - checkout-method: blobless - enable-mise-cache: true - - run: - name: Collect devnet metrics for op-acceptance-tests - command: | - ./op-acceptance-tests/scripts/metrics-collect-authorship.sh op-acceptance-tests/tests > .metrics--authorship--op-acceptance-tests - echo "Wrote file .metrics--authorship--op-acceptance-tests" - - gcp-cli/install - - gcp-oidc-authenticate: - gcp_cred_config_file_path: /tmp/gcp_cred_config.json - oidc_token_file_path: /tmp/oidc_token.json - - run: - name: Store artifact in Bucket - command: | - CURRENT_DATE=$(date '+%Y-%m-%d') - FOLDER_NAME="dt=$CURRENT_DATE" - - # Upload to the date-partitioned folder structure - gsutil cp .metrics--authorship--op-acceptance-tests gs://oplabs-tools-data-public-metrics/metrics-authorship/$FOLDER_NAME/metrics-$CIRCLE_SHA1.csv - generate-flaky-report: machine: true resource_class: medium @@ -2792,7 +2761,7 @@ workflows: - op-acceptance-tests: name: memory-all-kona-op-reth gate: "base" - l2_cl_kind: kona + l2_cl_kind: kona-node l2_el_kind: op-reth no_output_timeout: 120m context: @@ -3075,21 +3044,6 @@ workflows: context: - circleci-repo-optimism - devnet-metrics-collect: - when: - or: - - and: - - equal: [<< pipeline.trigger_source >>, "webhook"] - - << pipeline.parameters.c-non_docs_changes >> - - and: - - equal: [true, << pipeline.parameters.c-devnet-metrics-collect >>] - - equal: [<< pipeline.trigger_source >>, "api"] - jobs: - - devnet-metrics-collect-authorship: - context: - - circleci-repo-readonly-authenticated-github-token - - oplabs-tools-data-public-metrics-bucket - ai-contracts-test-workflow: when: or: diff --git a/.circleci/continue/rust-ci.yml b/.circleci/continue/rust-ci.yml index 72f28da077c..6039d367a8c 100644 --- a/.circleci/continue/rust-ci.yml +++ b/.circleci/continue/rust-ci.yml @@ -88,9 +88,6 @@ parameters: github-event-base64: type: string default: "__not_set__" - devnet-metrics-collect: - type: boolean - default: false go-cache-version: type: string default: "v0.0" diff --git a/.circleci/continue/rust-e2e.yml b/.circleci/continue/rust-e2e.yml index b94cfc484f6..4b37e26e00d 100644 --- a/.circleci/continue/rust-e2e.yml +++ b/.circleci/continue/rust-e2e.yml @@ -83,9 +83,6 @@ parameters: github-event-base64: type: string default: "__not_set__" - devnet-metrics-collect: - type: boolean - default: false go-cache-version: type: string default: "v0.0" diff --git a/mise.toml b/mise.toml index 539747035af..6899e37b15d 100644 --- a/mise.toml +++ b/mise.toml @@ -41,7 +41,6 @@ anvil = "1.2.3" codecov-uploader = "0.8.0" goreleaser-pro = "2.11.2" kurtosis = "1.8.1" -op-acceptor = "op-acceptor/v3.10.2" git-cliff = "2.12.0" # Fake dependencies @@ -61,7 +60,6 @@ goreleaser-pro = "ubi:goreleaser/goreleaser-pro[exe=goreleaser]" gotestsum = "ubi:gotestyourself/gotestsum" kurtosis = "ubi:kurtosis-tech/kurtosis-cli-release-artifacts[exe=kurtosis]" mockery = "ubi:vektra/mockery" -op-acceptor = "ubi:ethereum-optimism/infra[exe=op-acceptor,tag_prefix=op-acceptor/]" svm-rs = "ubi:alloy-rs/svm-rs[exe=svm]" # These are disabled, but latest mise versions error if they don't have a known diff --git a/op-acceptance-tests/scripts/metrics-collect-authorship.sh b/op-acceptance-tests/scripts/metrics-collect-authorship.sh deleted file mode 100755 index cff633c087e..00000000000 --- a/op-acceptance-tests/scripts/metrics-collect-authorship.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -set -eo pipefail - -DIRECTORY=$1 -if [ -z "$DIRECTORY" ]; then - echo "Usage: $0 " - exit 1 -fi - -echo -n "dt,author,commit" -cd "$DIRECTORY" -git ls-files | while read -r file; do - git --no-pager log --pretty=format:"%ad,%ae,%H%n" --date=format:"%Y-%m-%d %H:%M:%S" -- "$file" 2> /dev/null -done | sort | uniq diff --git a/op-acceptance-tests/tests/interop/loadtest/invalid_msg_test.go b/op-acceptance-tests/tests/interop/loadtest/invalid_msg_test.go index ce017f34443..21d47cb3029 100644 --- a/op-acceptance-tests/tests/interop/loadtest/invalid_msg_test.go +++ b/op-acceptance-tests/tests/interop/loadtest/invalid_msg_test.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/dsl" + "github.com/ethereum-optimism/optimism/op-devstack/sysgo" "github.com/ethereum-optimism/optimism/op-service/bigs" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/txinclude" @@ -83,8 +84,9 @@ func (ie *InvalidExecMsgSpammer) Spam(t devtest.T) error { // executing messages are also spammed. The number of invalid messages spammed per slot is // configurable via NAT_INVALID_MPS (default: 1_000). func TestRelayWithInvalidMessagesSteady(gt *testing.T) { - gt.Skip("Skipping Interop Acceptance Test") t, l2A, l2B := setupLoadTest(gt) + // TODO(#19411): remove skip once op-reth safe head mismatch is fixed + sysgo.SkipUnlessOpGeth(t, "panics due to safe head mismatch in EngineController") // Emit a valid initiating message. initTx, err := l2A.Include(t, planCall(t, &txintent.InitTrigger{ diff --git a/op-acceptance-tests/tests/interop/message/interop_happy_tx_test.go b/op-acceptance-tests/tests/interop/message/interop_happy_tx_test.go index 9162ce4330c..f3e361f6996 100644 --- a/op-acceptance-tests/tests/interop/message/interop_happy_tx_test.go +++ b/op-acceptance-tests/tests/interop/message/interop_happy_tx_test.go @@ -19,7 +19,7 @@ import ( func TestInteropHappyTx(gt *testing.T) { gt.Skip("Skipping Interop Acceptance Test") t := devtest.ParallelT(gt) - sys := presets.NewSimpleInterop(t) + sys := presets.NewTwoL2SupernodeInterop(t, 0) // two EOAs for triggering the init and exec interop txs alice := sys.FunderA.NewFundedEOA(eth.OneHundredthEther) @@ -28,24 +28,24 @@ func TestInteropHappyTx(gt *testing.T) { eventLoggerAddress := alice.DeployEventLogger() // wait for chain B to catch up to chain A if necessary - sys.L2ChainB.CatchUpTo(sys.L2ChainA) + sys.L2B.CatchUpTo(sys.L2A) // send initiating message on chain A rng := rand.New(rand.NewSource(time.Now().UnixNano())) initMsg := alice.SendInitMessage(interop.RandomInitTrigger(rng, eventLoggerAddress, rng.Intn(3), rng.Intn(10))) // at least one block between the init tx on chain A and the exec tx on chain B - sys.L2ChainB.WaitForBlock() + sys.L2B.WaitForBlock() // send executing message on chain B execMsg := bob.SendExecMessage(initMsg) // confirm that the cross-safe safety passed init and exec receipts and that blocks were not reorged dsl.CheckAll(t, - sys.L2CLA.ReachedRefFn(stypes.CrossSafe, initMsg.BlockID(), + sys.L2ACL.ReachedRefFn(stypes.CrossSafe, initMsg.BlockID(), // TODO(#16598): Make this relative to the block time 500), - sys.L2CLB.ReachedRefFn(stypes.CrossSafe, execMsg.BlockID(), + sys.L2BCL.ReachedRefFn(stypes.CrossSafe, execMsg.BlockID(), // TODO(#16598): Make this relative to the block time 500), ) diff --git a/op-acceptance-tests/tests/interop/message/interop_mon_test.go b/op-acceptance-tests/tests/interop/message/interop_mon_test.go index 05d08607567..76a2197ef08 100644 --- a/op-acceptance-tests/tests/interop/message/interop_mon_test.go +++ b/op-acceptance-tests/tests/interop/message/interop_mon_test.go @@ -19,7 +19,7 @@ import ( func TestInteropMon(gt *testing.T) { gt.Skip("Skipping Interop Acceptance Test") t := devtest.ParallelT(gt) - sys := presets.NewSimpleInterop(t) + sys := presets.NewTwoL2SupernodeInterop(t, 0) clients := map[eth.ChainID]*sources.EthClient{ sys.L2ELA.Escape().ChainID(): sys.L2ELA.Escape().EthClient().(*sources.EthClient), diff --git a/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go b/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go index 7d9cdf66019..f8c4884a2d9 100644 --- a/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go +++ b/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go @@ -56,8 +56,9 @@ func TestInteropFaultProofs_VariedBlockTimes_FasterChainB(gt *testing.T) { func TestInteropFaultProofs_InvalidBlock(gt *testing.T) { t := devtest.SerialT(gt) - // TODO(#19411): Unskip once supernode removes invalid transactions - t.Skip("Supernode does not yet remove invalid transactions from blocks") - sys := presets.NewSimpleInteropSupernodeProofs(t) + // TODO(#19411): Re-enable once the invalid-block supernode proof expectations match the + // native Kona FPP and challenger provider behavior again. + t.Skip("Temporarily skipped while investigating invalid-block supernode proof mismatches") + sys := presets.NewSimpleInteropSupernodeProofs(t, presets.WithChallengerCannonKonaEnabled()) sfp.RunInvalidBlockTest(t, sys) } diff --git a/op-acceptance-tests/tests/interop/reorgs/init_exec_msg_test.go b/op-acceptance-tests/tests/interop/reorgs/init_exec_msg_test.go index 1fc1d5c18d7..f932e647023 100644 --- a/op-acceptance-tests/tests/interop/reorgs/init_exec_msg_test.go +++ b/op-acceptance-tests/tests/interop/reorgs/init_exec_msg_test.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/dsl" "github.com/ethereum-optimism/optimism/op-devstack/presets" + "github.com/ethereum-optimism/optimism/op-devstack/sysgo" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-service/bigs" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -23,8 +24,9 @@ import ( ) func TestReorgInitExecMsg(gt *testing.T) { - gt.Skip("Skipping Interop Acceptance Test") t := devtest.ParallelT(gt) + // TODO(#19411): remove skip once op-reth safe head mismatch is fixed + sysgo.SkipUnlessOpGeth(t, "panics due to safe head mismatch in EngineController") ctx := t.Ctx() sys := presets.NewSimpleInterop(t) diff --git a/op-acceptance-tests/tests/interop/reorgs/invalid_exec_msgs_test.go b/op-acceptance-tests/tests/interop/reorgs/invalid_exec_msgs_test.go index 29c90035441..59842869a62 100644 --- a/op-acceptance-tests/tests/interop/reorgs/invalid_exec_msgs_test.go +++ b/op-acceptance-tests/tests/interop/reorgs/invalid_exec_msgs_test.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum-optimism/optimism/op-core/predeploys" "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/presets" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-devstack/sysgo" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/txintent" "github.com/ethereum-optimism/optimism/op-service/txintent/bindings" @@ -23,10 +23,12 @@ import ( "github.com/stretchr/testify/require" ) -// TestReorgInvalidExecMsgs tests that the supervisor reorgs the chain when an invalid exec msg is included +// TestReorgInvalidExecMsgs tests that the supernode reorgs the chain when an invalid exec msg is included // Each subtest runs a test with a different invalid message, by modifying the message in the txModifierFn func TestReorgInvalidExecMsgs(gt *testing.T) { - gt.Skip("Skipping Interop Acceptance Test") + t := devtest.ParallelT(gt) + // TODO(#19411): remove skip once op-reth safe head mismatch is fixed + sysgo.SkipUnlessOpGeth(t, "panics due to safe head mismatch in EngineController") gt.Run("invalid log index", func(gt *testing.T) { testReorgInvalidExecMsg(gt, func(msg *suptypes.Message) { msg.Identifier.LogIndex = 1024 @@ -50,10 +52,10 @@ func testReorgInvalidExecMsg(gt *testing.T, txModifierFn func(msg *suptypes.Mess t := devtest.ParallelT(gt) ctx := t.Ctx() - sys := presets.NewSimpleInterop(t) + sys := presets.NewTwoL2SupernodeInterop(t, 0) l := sys.Log - ia := sys.TestSequencer.Escape().ControlAPI(sys.L2ChainA.ChainID()) + ia := sys.TestSequencer.Escape().ControlAPI(sys.L2A.ChainID()) // three EOAs for triggering the init and exec interop txs, as well as a simple transfer tx alice := sys.FunderA.NewFundedEOA(eth.OneHundredthEther) @@ -61,7 +63,7 @@ func testReorgInvalidExecMsg(gt *testing.T, txModifierFn func(msg *suptypes.Mess cathrine := sys.FunderA.NewFundedEOA(eth.OneHundredthEther) sys.L1Network.WaitForBlock() - sys.L2ChainA.WaitForBlock() + sys.L2A.WaitForBlock() // stop batcher on chain A sys.L2BatcherA.Stop() @@ -94,7 +96,7 @@ func testReorgInvalidExecMsg(gt *testing.T, txModifierFn func(msg *suptypes.Mess } // wait for chain B to catch up to chain A if necessary - sys.L2ChainB.CatchUpTo(sys.L2ChainA) + sys.L2B.CatchUpTo(sys.L2A) var initTx *txintent.IntentTx[*txintent.InitTrigger, *txintent.InteropOutput] var initReceipt *types.Receipt @@ -106,14 +108,14 @@ func testReorgInvalidExecMsg(gt *testing.T, txModifierFn func(msg *suptypes.Mess initReceipt, err = initTx.PlannedTx.Included.Eval(ctx) require.NoError(t, err) - l.Info("initiating message included in chain B", "chain", sys.L2ChainB.ChainID(), "block_number", initReceipt.BlockNumber, "block_hash", initReceipt.BlockHash, "now", time.Now().Unix()) + l.Info("initiating message included in chain B", "chain", sys.L2B.ChainID(), "block_number", initReceipt.BlockNumber, "block_hash", initReceipt.BlockHash, "now", time.Now().Unix()) } // at least one block between the init tx on chain B and the exec tx on chain A - sys.L2ChainA.WaitForBlock() + sys.L2A.WaitForBlock() // stop sequencer on chain A so that we later force include an invalid exec msg - latestUnsafe_A := sys.L2CLA.StopSequencer() + latestUnsafe_A := sys.L2ACL.StopSequencer() var execTx *txintent.IntentTx[*txintent.ExecTrigger, *txintent.InteropOutput] var execSignedTx *types.Transaction @@ -151,7 +153,7 @@ func testReorgInvalidExecMsg(gt *testing.T, txModifierFn func(msg *suptypes.Mess // sequence a new block with an invalid executing msg on chain A { - l.Info("Building chain A with op-test-sequencer, and include invalid exec msg", "chain", sys.L2ChainA.ChainID(), "unsafeHead", latestUnsafe_A) + l.Info("Building chain A with op-test-sequencer, and include invalid exec msg", "chain", sys.L2A.ChainID(), "unsafeHead", latestUnsafe_A) err := ia.New(ctx, seqtypes.BuildOpts{ Parent: latestUnsafe_A, @@ -175,12 +177,12 @@ func testReorgInvalidExecMsg(gt *testing.T, txModifierFn func(msg *suptypes.Mess { currentUnsafeRef := sys.L2ELA.BlockRefByLabel(eth.Unsafe) - l.Info("Unsafe head after invalid exec msg has been included in chain A", "chain", sys.L2ChainA.ChainID(), "unsafeHead", currentUnsafeRef, "parent", currentUnsafeRef.ParentID()) + l.Info("Unsafe head after invalid exec msg has been included in chain A", "chain", sys.L2A.ChainID(), "unsafeHead", currentUnsafeRef, "parent", currentUnsafeRef.ParentID()) divergenceBlockNumber_A = currentUnsafeRef.Number originalHash_A = currentUnsafeRef.Hash originalParentHash_A = currentUnsafeRef.ParentHash - l.Info("Continue building chain A with another block with op-test-sequencer", "chain", sys.L2ChainA.ChainID(), "unsafeHead", currentUnsafeRef, "parent", currentUnsafeRef.ParentID()) + l.Info("Continue building chain A with another block with op-test-sequencer", "chain", sys.L2A.ChainID(), "unsafeHead", currentUnsafeRef, "parent", currentUnsafeRef.ParentID()) err := ia.New(ctx, seqtypes.BuildOpts{ Parent: currentUnsafeRef.Hash, L1Origin: nil, @@ -207,8 +209,8 @@ func testReorgInvalidExecMsg(gt *testing.T, txModifierFn func(msg *suptypes.Mess time.Sleep(2 * time.Second) } - // continue sequencing with op-node - sys.L2CLA.StartSequencer() + // continue sequencing with the supernode + sys.L2ACL.StartSequencer() // start batcher on chain A sys.L2BatcherA.Start() @@ -220,25 +222,11 @@ func testReorgInvalidExecMsg(gt *testing.T, txModifierFn func(msg *suptypes.Mess ParentHash: originalParentHash_A, }, 30) - err := wait.For(ctx, 5*time.Second, func() (bool, error) { - safeL2Head_supervisor_A := sys.Supervisor.SafeBlockID(sys.L2ChainA.ChainID()).Hash - safeL2Head_sequencer_A := sys.L2CLA.SafeL2BlockRef() - - if safeL2Head_sequencer_A.Number < divergenceBlockNumber_A { - l.Info("Safe ref number is still behind divergence block A number", "divergence", divergenceBlockNumber_A, "safe", safeL2Head_sequencer_A.Number) - return false, nil - } + // Wait for the supernode to validate the replacement block's timestamp. + divergenceTimestamp_A := sys.L2A.TimestampForBlockNum(divergenceBlockNumber_A) + sys.Supernode.AwaitValidatedTimestamp(divergenceTimestamp_A) - if safeL2Head_sequencer_A.Hash.Cmp(safeL2Head_supervisor_A) != 0 { - l.Info("Safe ref still not the same on supervisor and sequencer A", "supervisor", safeL2Head_supervisor_A, "sequencer", safeL2Head_sequencer_A.Hash) - return false, nil - } - - l.Info("Safe ref the same across supervisor and sequencers", - "supervisor_A", safeL2Head_supervisor_A, - "sequencer_A", safeL2Head_sequencer_A.Hash) - - return true, nil - }) - require.NoError(t, err, "Expected to get same safe ref on both supervisor and sequencer eventually") + l.Info("supernode validated replacement block", + "divergence", divergenceBlockNumber_A, + "timestamp", divergenceTimestamp_A) } diff --git a/op-acceptance-tests/tests/interop/sync/simple_interop/interop_sync_test.go b/op-acceptance-tests/tests/interop/sync/simple_interop/interop_sync_test.go index 8c5ddd0321b..88e64bd325f 100644 --- a/op-acceptance-tests/tests/interop/sync/simple_interop/interop_sync_test.go +++ b/op-acceptance-tests/tests/interop/sync/simple_interop/interop_sync_test.go @@ -16,7 +16,7 @@ import ( func TestL2CLResync(gt *testing.T) { gt.Skip("Skipping Interop Acceptance Test") t := devtest.ParallelT(gt) - sys := presets.NewSimpleInterop(t) + sys := presets.NewTwoL2SupernodeInterop(t, 0) logger := sys.Log.With("Test", "TestL2CLResync") logger.Info("Check unsafe chains are advancing") @@ -26,8 +26,8 @@ func TestL2CLResync(gt *testing.T) { ) logger.Info("Stop L2CL nodes") - sys.L2CLA.Stop() - sys.L2CLB.Stop() + sys.L2ACL.Stop() + sys.L2BCL.Stop() logger.Info("Make sure L2ELs does not advance") dsl.CheckAll(t, @@ -36,8 +36,8 @@ func TestL2CLResync(gt *testing.T) { ) logger.Info("Restart L2CL nodes") - sys.L2CLA.Start() - sys.L2CLB.Start() + sys.L2ACL.Start() + sys.L2BCL.Start() // L2CL may advance a few blocks without supervisor connection, but eventually it will stop without the connection // we must check that unsafe head is advancing due to reconnection diff --git a/op-acceptance-tests/tests/supernode/interop/reorg/invalid_message_reorg_test.go b/op-acceptance-tests/tests/supernode/interop/reorg/invalid_message_reorg_test.go index f5322fa3c0d..9528a739407 100644 --- a/op-acceptance-tests/tests/supernode/interop/reorg/invalid_message_reorg_test.go +++ b/op-acceptance-tests/tests/supernode/interop/reorg/invalid_message_reorg_test.go @@ -26,8 +26,8 @@ import ( // - The replacement block's timestamp eventually becomes verified func TestSupernodeInteropInvalidMessageReplacement(gt *testing.T) { t := devtest.SerialT(gt) - // TODO(ethereum-optimism/optimism#19411): remove skip once op-reth safe head mismatch is fixed - sysgo.SkipOnOpReth(t, "panics due to safe head mismatch in EngineController") + // TODO(#19411): remove skip once op-reth safe head mismatch is fixed + sysgo.SkipUnlessOpGeth(t, "panics due to safe head mismatch in EngineController") sys := presets.NewTwoL2SupernodeInterop(t, 0) ctx := t.Ctx() diff --git a/op-acceptance-tests/tests/supernode/interop/same_timestamp_invalid/same_timestamp_test.go b/op-acceptance-tests/tests/supernode/interop/same_timestamp_invalid/same_timestamp_test.go index f198e9c0c38..96a28258c5d 100644 --- a/op-acceptance-tests/tests/supernode/interop/same_timestamp_invalid/same_timestamp_test.go +++ b/op-acceptance-tests/tests/supernode/interop/same_timestamp_invalid/same_timestamp_test.go @@ -28,8 +28,8 @@ func TestSupernodeSameTimestampExecMessage(gt *testing.T) { // TestSupernodeSameTimestampInvalidTransitive: Bad log index causes transitive invalidation func TestSupernodeSameTimestampInvalidTransitive(gt *testing.T) { t := devtest.SerialT(gt) - // TODO(ethereum-optimism/optimism#19411): remove skip once op-reth safe head mismatch is fixed - sysgo.SkipOnOpReth(t, "panics due to safe head mismatch in EngineController") + // TODO(#19411): remove skip once op-reth safe head mismatch is fixed + sysgo.SkipUnlessOpGeth(t, "panics due to safe head mismatch in EngineController") sys := presets.NewTwoL2SupernodeInterop(t, 0).ForSameTimestampTesting(t) rng := rand.New(rand.NewSource(77777)) @@ -46,8 +46,8 @@ func TestSupernodeSameTimestampInvalidTransitive(gt *testing.T) { // TestSupernodeSameTimestampCycle: Mutual exec messages create cycle - both replaced func TestSupernodeSameTimestampCycle(gt *testing.T) { t := devtest.SerialT(gt) - // TODO(ethereum-optimism/optimism#19411): remove skip once op-reth safe head mismatch is fixed - sysgo.SkipOnOpReth(t, "panics due to safe head mismatch in EngineController") + // TODO(#19411): remove skip once op-reth safe head mismatch is fixed + sysgo.SkipUnlessOpGeth(t, "panics due to safe head mismatch in EngineController") sys := presets.NewTwoL2SupernodeInterop(t, 0).ForSameTimestampTesting(t) rng := rand.New(rand.NewSource(55555)) diff --git a/op-devstack/README.md b/op-devstack/README.md index 665f5fdddf1..235102894af 100644 --- a/op-devstack/README.md +++ b/op-devstack/README.md @@ -104,7 +104,7 @@ and returns a typed output that the test then may use. - `DEVNET_EXPECT_PRECONDITIONS_MET`: This can be set of force test failures when their pre-conditions are not met, which would otherwise result in them being skipped. This is helpful in particular for runs that do intend to run specific tests (as opposed to whatever is available). `op-acceptor` does set that variable, for example. ### Rust stack env vars: -- `DEVSTACK_L2CL_KIND=kona` to select kona as default L2 CL node +- `DEVSTACK_L2CL_KIND=kona-node` to select kona-node as default L2 CL node - `DEVSTACK_L2EL_KIND=op-reth` to select op-reth as default L2 EL node - `KONA_NODE_EXEC_PATH=/home/USERHERE/projects/kona/target/debug/kona-node` to select the kona-node executable to run - `OP_RETH_EXEC_PATH=/home/USERHERE/projects/reth/target/release/op-reth` to select the op-reth executable to run diff --git a/op-devstack/dsl/l2_el.go b/op-devstack/dsl/l2_el.go index 41452a72ce7..a5e11b570d9 100644 --- a/op-devstack/dsl/l2_el.go +++ b/op-devstack/dsl/l2_el.go @@ -464,7 +464,7 @@ func (el *L2ELNode) AssertTxNotInBlock(blockNumber uint64, txHash common.Hash) { el.log.Info("confirmed transaction not in block", "blockNumber", blockNumber, "txHash", txHash) } -// AssertTxNotInBlock asserts that a transaction with the given hash does not exist in the block at the given number. +// AssertTxInBlock asserts that a transaction with the given hash does not exist in the block at the given number. func (el *L2ELNode) AssertTxInBlock(blockNumber uint64, txHash common.Hash) { ctx, cancel := context.WithTimeout(el.ctx, DefaultTimeout) defer cancel() diff --git a/op-devstack/sysgo/mixed_runtime.go b/op-devstack/sysgo/mixed_runtime.go index 3e096dab764..d3de1b786fb 100644 --- a/op-devstack/sysgo/mixed_runtime.go +++ b/op-devstack/sysgo/mixed_runtime.go @@ -49,10 +49,10 @@ const ( MixedL2ELOpReth MixedL2ELKind = "op-reth" ) -// SkipOnOpReth skips the test when the L2 execution layer is op-reth +// SkipUnlessOpGeth skips the test when the L2 execution layer is op-reth // (i.e. DEVSTACK_L2EL_KIND is not "op-geth"). -func SkipOnOpReth(t devtest.T, reason string) { - if MixedL2ELKind(os.Getenv(DevstackL2ELKindEnvVar)) == MixedL2ELOpReth { +func SkipUnlessOpGeth(t devtest.T, reason string) { + if MixedL2ELKind(os.Getenv(DevstackL2ELKindEnvVar)) != MixedL2ELOpGeth { t.Skipf("skipping on op-reth: %s", reason) } } @@ -64,6 +64,20 @@ const ( MixedL2CLKona MixedL2CLKind = "kona-node" ) +// devstackL2ELKind returns the L2 EL kind requested via the DEVSTACK_L2EL_KIND +// environment variable. Returns the empty string when the variable is unset, +// meaning "use the runtime's default". +func devstackL2ELKind() MixedL2ELKind { + return MixedL2ELKind(os.Getenv(DevstackL2ELKindEnvVar)) +} + +// devstackL2CLKind returns the L2 CL kind requested via the DEVSTACK_L2CL_KIND +// environment variable. Returns the empty string when the variable is unset, +// meaning "use the runtime's default". +func devstackL2CLKind() MixedL2CLKind { + return MixedL2CLKind(os.Getenv("DEVSTACK_L2CL_KIND")) +} + type MixedSingleChainNodeSpec struct { ELKey string CLKey string diff --git a/op-devstack/sysgo/multichain_supernode_runtime.go b/op-devstack/sysgo/multichain_supernode_runtime.go index 797fe7beba6..8079a2553bf 100644 --- a/op-devstack/sysgo/multichain_supernode_runtime.go +++ b/op-devstack/sysgo/multichain_supernode_runtime.go @@ -4,7 +4,6 @@ import ( "context" "encoding/hex" "fmt" - "os" "sort" "strconv" "time" @@ -98,13 +97,10 @@ func NewTwoL2SupernodeRuntimeWithConfig(t devtest.T, cfg PresetConfig) *MultiCha return runtime } -// startSupernodeEL starts an L2 EL node for the supernode runtime. -// It respects the DEVSTACK_L2EL_KIND env var: "op-geth" uses op-geth, otherwise op-reth is used. +// startSupernodeEL starts an L2 EL node for the supernode runtime, +// respecting DEVSTACK_L2EL_KIND (defaults to op-geth when unset). func startSupernodeEL(t devtest.T, l2Net *L2Network, jwtPath string, jwtSecret [32]byte) L2ELNode { - if MixedL2ELKind(os.Getenv(DevstackL2ELKindEnvVar)) == MixedL2ELOpGeth { - return startL2ELNode(t, l2Net, jwtPath, jwtSecret, "sequencer", NewELNodeIdentity(0)) - } - return startMixedOpRethNode(t, l2Net, "sequencer", jwtPath, jwtSecret, nil) + return startL2ELForKey(t, l2Net, jwtPath, jwtSecret, "sequencer", NewELNodeIdentity(0)) } func newSingleChainSupernodeRuntimeWithConfig(t devtest.T, interopAtGenesis bool, cfg PresetConfig) *MultiChainRuntime { diff --git a/op-devstack/sysgo/singlechain_build.go b/op-devstack/sysgo/singlechain_build.go index e7a8e19a531..23c03735a4e 100644 --- a/op-devstack/sysgo/singlechain_build.go +++ b/op-devstack/sysgo/singlechain_build.go @@ -150,8 +150,51 @@ func applyConfigPrefundedL2(t devtest.T, keys devkeys.Keys, l1ChainID, l2ChainID l1Config.WithPrefundedAccount(addrFor(devkeys.SystemConfigOwner), *millionEth) } -func startSequencerEL(t devtest.T, l2Net *L2Network, jwtPath string, jwtSecret [32]byte, identity *ELNodeIdentity) *OpGeth { - return startL2ELNode(t, l2Net, jwtPath, jwtSecret, "sequencer", identity) +// startL2ELForKey starts an L2 EL node for the given key, respecting DEVSTACK_L2EL_KIND. +// This is the single env-aware dispatch point for L2 EL selection. +func startL2ELForKey(t devtest.T, l2Net *L2Network, jwtPath string, jwtSecret [32]byte, key string, identity *ELNodeIdentity) L2ELNode { + switch devstackL2ELKind() { + case MixedL2ELOpGeth: + return startL2ELNode(t, l2Net, jwtPath, jwtSecret, key, identity) + default: // op-reth + return startMixedOpRethNode(t, l2Net, key, jwtPath, jwtSecret, nil) + } +} + +// startL2CLForKey starts an L2 CL node for the given key, respecting DEVSTACK_L2CL_KIND. +// This is the single env-aware dispatch point for L2 CL selection. +func startL2CLForKey( + t devtest.T, + keys devkeys.Keys, + l1Net *L1Network, + l2Net *L2Network, + l1EL L1ELNode, + l1CL *L1CLNode, + l2EL L2ELNode, + jwtSecret [32]byte, + clKey, elKey string, + isSequencer bool, + followSource string, + l2CLOpts []L2CLOption, +) L2CLNode { + switch devstackL2CLKind() { + case MixedL2CLKona: + return startMixedKonaNode(t, keys, l1Net, l2Net, l1EL, l1CL, l2EL, clKey, elKey, isSequencer, nil) + default: // op-node + return startL2CLNode(t, keys, l1Net, l2Net, l1EL, l1CL, l2EL, jwtSecret, l2CLNodeStartConfig{ + Key: clKey, + IsSequencer: isSequencer, + NoDiscovery: true, + EnableReqResp: true, + UseReqResp: true, + L2FollowSource: followSource, + L2CLOptions: l2CLOpts, + }) + } +} + +func startSequencerEL(t devtest.T, l2Net *L2Network, jwtPath string, jwtSecret [32]byte, identity *ELNodeIdentity) L2ELNode { + return startL2ELForKey(t, l2Net, jwtPath, jwtSecret, "sequencer", identity) } func startL2ELNode( @@ -229,17 +272,8 @@ func startSequencerCL( l2EL L2ELNode, jwtSecret [32]byte, l2CLOpts []L2CLOption, -) *OpNode { - return startL2CLNode(t, keys, l1Net, l2Net, l1EL, l1CL, l2EL, jwtSecret, l2CLNodeStartConfig{ - Key: "sequencer", - IsSequencer: true, - NoDiscovery: true, - EnableReqResp: true, - UseReqResp: true, - IndexingMode: false, - L2FollowSource: "", - L2CLOptions: l2CLOpts, - }) +) L2CLNode { + return startL2CLForKey(t, keys, l1Net, l2Net, l1EL, l1CL, l2EL, jwtSecret, "sequencer", "sequencer", true, "", l2CLOpts) } type l2CLNodeStartConfig struct { diff --git a/op-devstack/sysgo/singlechain_runtime.go b/op-devstack/sysgo/singlechain_runtime.go index aa7ed075f96..4ef8007b042 100644 --- a/op-devstack/sysgo/singlechain_runtime.go +++ b/op-devstack/sysgo/singlechain_runtime.go @@ -77,8 +77,7 @@ func startDefaultSingleChainPrimary( jwtSecret [32]byte, cfg PresetConfig, ) singleChainPrimaryRuntime { - sequencerIdentity := NewELNodeIdentity(0) - l2EL := startSequencerEL(t, world.L2Network, jwtPath, jwtSecret, sequencerIdentity) + l2EL := startSequencerEL(t, world.L2Network, jwtPath, jwtSecret, NewELNodeIdentity(0)) l2CL := startSequencerCL(t, keys, world.L1Network, world.L2Network, l1EL, l1CL, l2EL, jwtSecret, cfg.GlobalL2CLOptions) return singleChainPrimaryRuntime{ EL: l2EL, @@ -123,9 +122,7 @@ func newSingleChainRuntimeWithConfig(t devtest.T, cfg PresetConfig, spec singleC applyMinimalGameTypeOptions(t, keys, world.L1Network, world.L2Network, l1EL, cfg.AddedGameTypes, cfg.RespectedGameTypes) - sequencerCL, ok := primary.CL.(*OpNode) - require.True(ok, "single-chain runtime primary CL must be op-node for test sequencer") - testSequencer := startTestSequencer(t, keys, jwtPath, jwtSecret, world.L1Network, l1EL, l1CL, primary.EL, world.L2Network, sequencerCL) + testSequencer := startTestSequencerForRPCs(t, keys, "test-sequencer", jwtPath, jwtSecret, world.L1Network, l1EL, l1CL, world.L2Network.ChainID(), primary.EL.UserRPC(), primary.CL.UserRPC()) testSequencerRuntime := newTestSequencerRuntime(testSequencer, spec.TestSequencer) faucetService := startFaucets(t, keys, world.L1Network.ChainID(), world.L2Network.ChainID(), l1EL.UserRPC(), primary.EL.UserRPC()) diff --git a/op-devstack/sysgo/singlechain_variants.go b/op-devstack/sysgo/singlechain_variants.go index 3945ad15b75..53b8050a227 100644 --- a/op-devstack/sysgo/singlechain_variants.go +++ b/op-devstack/sysgo/singlechain_variants.go @@ -166,17 +166,8 @@ func addSingleChainOpNode( ) *SingleChainNodeRuntime { jwtPath := runtime.L2EL.JWTPath() jwtSecret := readJWTSecretFromPath(t, jwtPath) - identity := NewELNodeIdentity(0) - l2EL := startL2ELNode(t, runtime.L2Network, jwtPath, jwtSecret, name, identity) - l2CL := startL2CLNode(t, runtime.Keys, runtime.L1Network, runtime.L2Network, runtime.L1EL, runtime.L1CL, l2EL, jwtSecret, l2CLNodeStartConfig{ - Key: name, - IsSequencer: isSequencer, - NoDiscovery: true, - EnableReqResp: true, - UseReqResp: true, - L2FollowSource: followSource, - L2CLOptions: l2Opts, - }) + l2EL := startL2ELForKey(t, runtime.L2Network, jwtPath, jwtSecret, name, NewELNodeIdentity(0)) + l2CL := startL2CLForKey(t, runtime.Keys, runtime.L1Network, runtime.L2Network, runtime.L1EL, runtime.L1CL, l2EL, jwtSecret, name, name, isSequencer, followSource, l2Opts) node := newSingleChainNodeRuntime(name, isSequencer, l2EL, l2CL) runtime.Nodes[name] = node return node diff --git a/op-node/rollup/driver/sync_deriver.go b/op-node/rollup/driver/sync_deriver.go index 264e4f14250..752a70595be 100644 --- a/op-node/rollup/driver/sync_deriver.go +++ b/op-node/rollup/driver/sync_deriver.go @@ -227,8 +227,6 @@ func (s *SyncDeriver) SyncStep() { s.tryBackupUnsafeReorg() - s.Engine.TryUpdateEngine(s.Ctx) - if s.Engine.IsEngineInitialELSyncing() { // The pipeline cannot move forwards if doing initial EL sync. s.Log.Debug("Rollup driver is backing off because execution engine is performing initial EL sync.", diff --git a/op-node/rollup/engine/engine_controller.go b/op-node/rollup/engine/engine_controller.go index bf3a8656de3..fcc73b8dd93 100644 --- a/op-node/rollup/engine/engine_controller.go +++ b/op-node/rollup/engine/engine_controller.go @@ -36,8 +36,6 @@ const ( syncStatusFinishedEL // EL sync is done & we should be performing consolidation ) -var ErrNoFCUNeeded = errors.New("no FCU call was needed") - // Max memory used for buffering unsafe payloads const maxUnsafePayloadsMemory = 500 * 1024 * 1024 @@ -141,9 +139,9 @@ type EngineController struct { // Only to be used when there is no superAuthority deprecatedFinalizedHead eth.L2BlockRef - needFCUCall bool - // Safe head debouncing: buffer safe head updates until other updates occur - needSafeHeadUpdate bool + // lastForkchoice is the forkchoice state last communicated to the engine + // via tryUpdateEngineInternal. Used to avoid sending duplicate FCU calls. + lastForkchoice eth.ForkchoiceState // Track when the rollup node changes the forkchoice to restore previous // known unsafe chain. e.g. Unsafe Reorg caused by Invalid span batch. // This update does not retry except engine returns non-input error @@ -317,8 +315,6 @@ func (e *EngineController) SetFinalizedHead(r eth.L2BlockRef) { e.metrics.RecordL2Ref("l2_finalized", r) e.localFinalizedHead = r e.deprecatedFinalizedHead = r - e.needFCUCall = true - e.needSafeHeadUpdate = false } // SetPendingSafeL2Head implements LocalEngineControl. @@ -337,17 +333,12 @@ func (e *EngineController) SetLocalSafeHead(r eth.L2BlockRef) { func (e *EngineController) SetSafeHead(r eth.L2BlockRef) { e.metrics.RecordL2Ref("l2_safe", r) e.deprecatedSafeHead = r // TODO Supervisor-only code path - e.needFCUCall = true - // Instead of immediately calling FCU, buffer this update - e.needSafeHeadUpdate = true } // SetUnsafeHead sets the local-unsafe head. func (e *EngineController) SetUnsafeHead(r eth.L2BlockRef) { e.metrics.RecordL2Ref("l2_unsafe", r) e.unsafeHead = r - e.needFCUCall = true - e.needSafeHeadUpdate = false e.chainSpec.CheckForkActivation(e.log, r) } @@ -361,7 +352,6 @@ func (e *EngineController) SetCrossUnsafeHead(r eth.L2BlockRef) { func (e *EngineController) SetBackupUnsafeL2Head(r eth.L2BlockRef, triggerReorg bool) { e.metrics.RecordL2Ref("l2_backup_unsafe", r) e.backupUnsafeHead = r - e.flushPendingSafeHead() e.needFCUCallForBackupUnsafeReorg = triggerReorg } @@ -392,9 +382,10 @@ func (e *EngineController) logSyncProgressMaybe() func() { prevPendingSafe := e.pendingSafeHead prevUnsafe := e.unsafeHead prevBackupUnsafe := e.backupUnsafeHead + prevLastFC := e.lastForkchoice return func() { - // if forkchoice still needs to be updated, then the last change was unsuccessful, thus no progress to log. - if e.needFCUCall || e.needFCUCallForBackupUnsafeReorg { + // if forkchoice was not updated (lastForkchoice unchanged), no progress to log. + if e.lastForkchoice == prevLastFC || e.needFCUCallForBackupUnsafeReorg { return } var reason string @@ -511,12 +502,6 @@ func (e *EngineController) initializeUnknowns(ctx context.Context) error { } func (e *EngineController) tryUpdateEngineInternal(ctx context.Context) error { - if !e.needFCUCall { - return ErrNoFCUNeeded - } - if e.isEngineInitialELSyncing() { - e.log.Warn("Attempting to update forkchoice state while EL syncing") - } if err := e.initializeUnknowns(ctx); err != nil { return derive.NewTemporaryError(fmt.Errorf("cannot update engine until engine forkchoice is initialized: %w", err)) } @@ -530,6 +515,12 @@ func (e *EngineController) tryUpdateEngineInternal(ctx context.Context) error { SafeBlockHash: e.SafeL2Head().Hash, FinalizedBlockHash: e.FinalizedHead().Hash, } + if fc == e.lastForkchoice { + return nil + } + if e.isEngineInitialELSyncing() { + e.log.Warn("Attempting to update forkchoice state while EL syncing") + } logFn := e.logSyncProgressMaybe() defer logFn() fcRes, err := e.engine.ForkchoiceUpdate(ctx, &fc, nil) @@ -546,6 +537,7 @@ func (e *EngineController) tryUpdateEngineInternal(ctx context.Context) error { return derive.NewTemporaryError(fmt.Errorf("failed to sync forkchoice with engine: %w", err)) } } + e.lastForkchoice = fc if fcRes.PayloadStatus.Status == eth.ExecutionValid { e.requestForkchoiceUpdate(ctx) } @@ -553,8 +545,6 @@ func (e *EngineController) tryUpdateEngineInternal(ctx context.Context) error { // Remove backupUnsafeHead because this backup will be never used after consolidation. e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) } - e.needFCUCall = false - e.needSafeHeadUpdate = false return nil } @@ -563,7 +553,7 @@ func (e *EngineController) tryUpdateEngineInternal(ctx context.Context) error { func (e *EngineController) tryUpdateEngine(ctx context.Context) { // If we don't need to call FCU, keep going b/c this was a no-op. If we needed to // perform a network call, then we should yield even if we did not encounter an error. - if err := e.tryUpdateEngineInternal(e.ctx); err != nil && !errors.Is(err, ErrNoFCUNeeded) { + if err := e.tryUpdateEngineInternal(e.ctx); err != nil { if errors.Is(err, derive.ErrReset) { e.emitter.Emit(ctx, rollup.ResetEvent{Err: err}) } else if errors.Is(err, derive.ErrTemporary) { @@ -661,8 +651,7 @@ func (e *EngineController) insertUnsafePayload(ctx context.Context, envelope *et } fcu2Finish := time.Now() e.SetUnsafeHead(ref) - e.needFCUCall = false - e.needSafeHeadUpdate = false + e.lastForkchoice = fc e.emitter.Emit(ctx, UnsafeUpdateEvent{Ref: ref}) if e.syncStatus == syncStatusFinishedELButNotFinalized { @@ -687,15 +676,6 @@ func (e *EngineController) insertUnsafePayload(ctx context.Context, envelope *et return nil } -// flushPendingSafeHead applies any pending safe head update to the current forkchoice state. -// This should be called before any FCU call to ensure the latest safe head is included. -func (e *EngineController) flushPendingSafeHead() { - if e.needSafeHeadUpdate { - e.needFCUCall = true - e.needSafeHeadUpdate = false - } -} - // shouldTryBackupUnsafeReorg checks reorging(restoring) unsafe head to backupUnsafeHead is needed. // Returns boolean which decides to trigger FCU. func (e *EngineController) shouldTryBackupUnsafeReorg() bool { @@ -728,8 +708,6 @@ func (e *EngineController) tryBackupUnsafeReorg(ctx context.Context) (bool, erro // Do not need to perform FCU. return false, nil } - // Flush pending safe head updates since backup unsafe reorgs are complex - e.flushPendingSafeHead() // Only try FCU once because execution engine may forgot backupUnsafeHead // or backupUnsafeHead is not part of the chain. // Exception: Retry when forkChoiceUpdate returns non-input error. @@ -769,6 +747,7 @@ func (e *EngineController) tryBackupUnsafeReorg(ctx context.Context) (bool, erro e.log.Info("successfully reorged unsafe head using backupUnsafe", "unsafe", e.backupUnsafeHead.ID()) e.SetUnsafeHead(e.backupUnsafeHead) e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) + e.lastForkchoice = fc e.requestForkchoiceUpdate(ctx) return true, nil @@ -810,6 +789,13 @@ func (e *EngineController) OnEvent(ctx context.Context, ev event.Event) bool { if e.localSafeIsFullySafe(x.Ref.Time) { e.PromoteSafe(ctx, x.Ref, x.Source) } + case derive.DeriverL1StatusEvent, derive.DeriverIdleEvent: + // At L1 origin transitions (or when derivation catches up to the L1 head), + // flush pending forkchoice state to the engine via FCU. + // PromoteSafe updates the forkchoice state per-block but does not send FCU, + // so this is where the batched FCU is sent — one per L1 block instead of per L2 block. + // tryUpdateEngine compares against lastForkchoice and is a no-op if unchanged. + e.tryUpdateEngine(ctx) case InteropInvalidateBlockEvent: e.emitter.Emit(ctx, BuildStartEvent{Attributes: x.Attributes}) case BuildStartEvent: @@ -897,6 +883,12 @@ func (e *EngineController) tryUpdateUnsafe(ctx context.Context, ref eth.L2BlockR e.emitter.Emit(ctx, UnsafeUpdateEvent{Ref: ref}) } +// PromoteSafe promotes the given ref to cross-safe head and emits SafeDerivedEvent. +// It updates the forkchoice state but does NOT send FCU to the engine. +// The FCU is deferred to L1 origin boundaries on the consolidation path. +// Callers that need immediate FCU (e.g. FollowSource, supervisor) will +// have it sent by a subsequent tryUpdateEngine call (e.g. from promoteFinalized +// or the next SyncStep). func (e *EngineController) PromoteSafe(ctx context.Context, ref eth.L2BlockRef, source eth.L1BlockRef) { e.log.Debug("Updating safe", "safe", ref, "unsafe", e.unsafeHead) e.SetSafeHead(ref) @@ -908,8 +900,6 @@ func (e *EngineController) PromoteSafe(ctx context.Context, ref eth.L2BlockRef, e.SetCrossUnsafeHead(ref) e.onUnsafeUpdate(ctx, ref, e.unsafeHead) } - // Try to apply the forkchoice changes - e.tryUpdateEngine(ctx) } func (e *EngineController) PromoteFinalized(ctx context.Context, ref eth.L2BlockRef) { diff --git a/op-node/rollup/engine/engine_controller_test.go b/op-node/rollup/engine/engine_controller_test.go index fd5cb525619..0690a812eaa 100644 --- a/op-node/rollup/engine/engine_controller_test.go +++ b/op-node/rollup/engine/engine_controller_test.go @@ -390,12 +390,99 @@ func TestEngineController_ForkchoiceUpdateUsesSuperAuthority(t *testing.T) { PayloadStatus: eth.PayloadStatusV1{Status: eth.ExecutionValid}, }, nil) - // Trigger forkchoice update - ec.needFCUCall = true + // Trigger forkchoice update (fires because lastForkchoice differs from current state) err := ec.tryUpdateEngineInternal(context.Background()) require.NoError(t, err) } +// TestConsolidation_BatchesFCUPerL1Block verifies that on the consolidation path, +// PromoteSafe does NOT trigger an FCU per L2 block. Instead, a single FCU is sent +// when DeriverL1StatusEvent fires (at L1 origin transitions). +func TestConsolidation_BatchesFCUPerL1Block(t *testing.T) { + rng := mrand.New(mrand.NewSource(4321)) + l1A := testutils.RandomBlockRef(rng) + l1B := testutils.RandomBlockRef(rng) + l1B.Number = l1A.Number + 1 + l1B.ParentHash = l1A.Hash + + genesis := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), Number: 0, + ParentHash: common.Hash{}, Time: l1A.Time, + L1Origin: l1A.ID(), SequenceNumber: 0, + } + block1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), Number: 1, + ParentHash: genesis.Hash, Time: l1A.Time + 2, + L1Origin: l1A.ID(), SequenceNumber: 1, + } + block2 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), Number: 2, + ParentHash: block1.Hash, Time: l1A.Time + 4, + L1Origin: l1A.ID(), SequenceNumber: 2, + } + block3 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), Number: 3, + ParentHash: block2.Hash, Time: l1A.Time + 6, + L1Origin: l1A.ID(), SequenceNumber: 3, + } + + cfg := &rollup.Config{} + mockEngine := &testutils.MockEngine{} + emitter := &testutils.MockEmitter{} + + ec := NewEngineController(context.Background(), mockEngine, testlog.Logger(t, 0), + metrics.NoopMetrics, cfg, &sync.Config{}, false, &testutils.MockL1Source{}, emitter, nil) + + // Initial state: unsafe chain is ahead, safe at genesis. + // Set all heads directly to avoid initializeUnknowns engine calls. + ec.unsafeHead = block3 + ec.localSafeHead = genesis + ec.deprecatedSafeHead = genesis + ec.pendingSafeHead = genesis + ec.localFinalizedHead = genesis + ec.deprecatedFinalizedHead = genesis + + // Allow any emitted events + emitter.Mock.On("Emit", mock.Anything).Maybe() + + // Simulate consolidation path: local-safe and cross-safe advance per-block + // (as TryUpdateLocalSafe + LocalSafeUpdateEvent → PromoteSafe does). + // PromoteSafe no longer calls tryUpdateEngine. tryUpdateEngine compares + // against lastForkchoice — no FCU per block because only SafeBlockHash changes. + for _, blk := range []eth.L2BlockRef{block1, block2, block3} { + ec.SetLocalSafeHead(blk) + ec.SetPendingSafeL2Head(blk) + ec.PromoteSafe(context.Background(), blk, l1A) + } + + // Verify: no ForkchoiceUpdate was called on the mock engine. + // If FCU had been called, mockEngine would panic on an unexpected call. + mockEngine.AssertExpectations(t) + + // Verify cross-safe advanced correctly despite no FCU + require.Equal(t, block3.Hash, ec.deprecatedSafeHead.Hash, "cross-safe should advance per-block") + require.Equal(t, block3.Hash, ec.localSafeHead.Hash, "local-safe should advance per-block") + + // Now simulate DeriverL1StatusEvent (L1 origin transition). + // This should trigger exactly one FCU with the latest safe head. + // In non-interop mode, SafeL2Head() returns localSafeHead. + mockEngine.ExpectForkchoiceUpdate( + ð.ForkchoiceState{ + HeadBlockHash: block3.Hash, + SafeBlockHash: block3.Hash, // localSafeHead = block3 + FinalizedBlockHash: genesis.Hash, + }, nil, + ð.ForkchoiceUpdatedResult{PayloadStatus: eth.PayloadStatusV1{Status: eth.ExecutionValid}}, nil, + ) + + ec.OnEvent(context.Background(), derive.DeriverL1StatusEvent{ + Origin: l1B, + }) + + // Verify exactly one FCU was sent + mockEngine.AssertExpectations(t) +} + // SuperAuthority tests are in super_authority_deny_test.go // TestFollowSource_DivergentLocalSafeAndCrossSafe verifies that FollowSource correctly handles @@ -452,7 +539,12 @@ func TestFollowSource_DivergentLocalSafeAndCrossSafe(t *testing.T) { ec.SetLocalSafeHead(block2) ec.SetSafeHead(block2) // deprecatedSafeHead = block2 ec.SetFinalizedHead(block1) // deprecatedFinalizedHead = block1 - ec.needFCUCall = false // reset after setup + // Set lastForkchoice to match initial state so setup doesn't trigger FCU + ec.lastForkchoice = eth.ForkchoiceState{ + HeadBlockHash: block5.Hash, + SafeBlockHash: block2.Hash, + FinalizedBlockHash: block1.Hash, + } // Mock expectations: // Allow any events from the emitter (LocalSafeUpdateEvent, SafeDerivedEvent, etc.) @@ -461,16 +553,8 @@ func TestFollowSource_DivergentLocalSafeAndCrossSafe(t *testing.T) { // Consolidation lookup: after fix, uses eLocalSafeRef.Number (5) mockEngine.ExpectL2BlockRefByNumber(5, block5, nil) - // FCU from PromoteSafe's tryUpdateEngine: safe=block4, finalized still block1 - mockEngine.ExpectForkchoiceUpdate( - ð.ForkchoiceState{ - HeadBlockHash: block5.Hash, - SafeBlockHash: block4.Hash, - FinalizedBlockHash: block1.Hash, - }, nil, - ð.ForkchoiceUpdatedResult{PayloadStatus: eth.PayloadStatusV1{Status: eth.ExecutionValid}}, nil, - ) - // FCU from promoteFinalized's tryUpdateEngine: finalized now block3 + // Single FCU from promoteFinalized's tryUpdateEngine — PromoteSafe no longer + // calls tryUpdateEngine, so the safe and finalized updates are batched together. mockEngine.ExpectForkchoiceUpdate( ð.ForkchoiceState{ HeadBlockHash: block5.Hash, diff --git a/op-up/main.go b/op-up/main.go index 4dc406f66dd..de3870656c2 100644 --- a/op-up/main.go +++ b/op-up/main.go @@ -19,6 +19,7 @@ import ( "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" "github.com/ethereum-optimism/optimism/op-devstack/devtest" + "github.com/ethereum-optimism/optimism/op-devstack/dsl" "github.com/ethereum-optimism/optimism/op-devstack/presets" opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/cliapp" @@ -63,6 +64,11 @@ var ( return filepath.Join(parentDir, ".op-up") }(), } + interopFlag = &cli.BoolFlag{ + Name: "interop", + Usage: "start a 2-chain interop devnet backed by op-supernode.", + EnvVars: opservice.PrefixEnvVar(envPrefix, "INTEROP"), + } ) func main() { @@ -81,7 +87,7 @@ func run(ctx context.Context, args []string, stdout, stderr io.Writer) error { app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, VersionMeta) app.Name = "op-up" app.Usage = "deploys an in-memory OP Stack devnet." - app.Flags = cliapp.ProtectFlags([]cli.Flag{dirFlag}) + app.Flags = cliapp.ProtectFlags([]cli.Flag{dirFlag, interopFlag}) // The default OnUsageError behavior will print the error twice: once in the cli package and // once in our main function. // The function below prints help and returns the error for further handling/error messages. @@ -92,12 +98,15 @@ func run(ctx context.Context, args []string, stdout, stderr io.Writer) error { return err } app.Action = func(cliCtx *cli.Context) error { - return runOpUp(cliCtx.Context, cliCtx.App.ErrWriter, cliCtx.String(dirFlag.Name)) + return runOpUp(cliCtx.Context, cliCtx.App.ErrWriter, cliCtx.String(dirFlag.Name), cliCtx.Bool(interopFlag.Name)) + } + app.Commands = []*cli.Command{ + smokeCommand(), } return app.RunContext(ctx, args) } -func runOpUp(ctx context.Context, stderr io.Writer, opUpDir string) error { +func runOpUp(ctx context.Context, stderr io.Writer, opUpDir string, interop bool) error { fmt.Fprintf(stderr, "%s\n", asciiArt) if err := os.MkdirAll(opUpDir, 0o755); err != nil { @@ -112,12 +121,22 @@ func runOpUp(ctx context.Context, stderr io.Writer, opUpDir string) error { t := newTestingT(ctx, stderr, tempRoot) defer t.doCleanup() - sys, err := newMinimalSystem(t) - if err != nil { - return err - } - if err := runSystem(ctx, stderr, sys); err != nil { - return err + if interop { + sys, err := newSupernodeInteropSystem(t) + if err != nil { + return err + } + if err := runSupernodeSystem(ctx, stderr, sys); err != nil { + return err + } + } else { + sys, err := newMinimalSystem(t) + if err != nil { + return err + } + if err := runSystem(ctx, stderr, sys); err != nil { + return err + } } fmt.Fprintf(stderr, "\nPlease consider filling out this survey to influence future development: https://www.surveymonkey.com/r/JTGHFK3\n") return nil @@ -148,8 +167,76 @@ func newMinimalSystem(t *testingT) (sys *presets.Minimal, err error) { return presets.NewMinimal(t), nil } +func newSupernodeInteropSystem(t *testingT) (sys *presets.TwoL2SupernodeInterop, err error) { + defer func() { + if recovered := recover(); recovered != nil { + var failure testingFailure + if errors.As(asError(recovered), &failure) { + err = failure.err + return + } + panic(recovered) + } + }() + // Use a small activation delay so that interop bridge contracts + // (SuperchainETHBridge, ETHLiquidity) get properly initialized. + const interopDelay = uint64(2) + return presets.NewTwoL2SupernodeInterop(t, interopDelay, + presets.WithSuggestedInteropActivationOffset(interopDelay), + ), nil +} + func runSystem(ctx context.Context, stderr io.Writer, sys *presets.Minimal) error { - // Print available account. + if err := printAccountInfo(stderr); err != nil { + return err + } + fmt.Fprintf(stderr, "EL Node URL: %s\n", "http://localhost:8545") + + elNode := sys.L2EL + go logBlocks(ctx, stderr, "L2", elNode) + + // Proxy L2 EL requests. + go func() { + if err := proxyEL(ctx, stderr, "localhost:8545", elNode.Escape().L2EthClient().RPC()); err != nil && !errors.Is(err, http.ErrServerClosed) { + fmt.Fprintf(stderr, "error: %v", err) + } + }() + + <-ctx.Done() + + return nil +} + +func runSupernodeSystem(ctx context.Context, stderr io.Writer, sys *presets.TwoL2SupernodeInterop) error { + if err := printAccountInfo(stderr); err != nil { + return err + } + fmt.Fprintf(stderr, "L2A Chain ID: %s\n", sys.L2A.ChainID()) + fmt.Fprintf(stderr, "L2A EL Node URL: %s\n", "http://localhost:8545") + fmt.Fprintf(stderr, "L2B Chain ID: %s\n", sys.L2B.ChainID()) + fmt.Fprintf(stderr, "L2B EL Node URL: %s\n", "http://localhost:8546") + + go logBlocks(ctx, stderr, "L2A", sys.L2ELA) + go logBlocks(ctx, stderr, "L2B", sys.L2ELB) + go logInterop(ctx, stderr, sys) + + go func() { + if err := proxyEL(ctx, stderr, "localhost:8545", sys.L2ELA.Escape().L2EthClient().RPC()); err != nil && !errors.Is(err, http.ErrServerClosed) { + fmt.Fprintf(stderr, "error: %v", err) + } + }() + go func() { + if err := proxyEL(ctx, stderr, "localhost:8546", sys.L2ELB.Escape().L2EthClient().RPC()); err != nil && !errors.Is(err, http.ErrServerClosed) { + fmt.Fprintf(stderr, "error: %v", err) + } + }() + + <-ctx.Done() + + return nil +} + +func printAccountInfo(stderr io.Writer) error { hd, err := devkeys.NewMnemonicDevKeys(devkeys.TestMnemonic) if err != nil { return fmt.Errorf("new mnemonic dev keys: %w", err) @@ -167,46 +254,94 @@ func runSystem(ctx context.Context, stderr io.Writer, sys *presets.Minimal) erro fmt.Fprintf(stderr, "Test Account Address: %s\n", funderAddress) fmt.Fprintf(stderr, "Test Account Private Key: %s\n", "0x"+common.Bytes2Hex(crypto.FromECDSA(funderPrivKey))) - fmt.Fprintf(stderr, "EL Node URL: %s\n", "http://localhost:8545") + return nil +} - elNode := sys.L2EL +func logInterop(ctx context.Context, stderr io.Writer, sys *presets.TwoL2SupernodeInterop) { + const pollInterval = 2 * time.Second + queryAPI := sys.Supernode.QueryAPI() - // Log on new blocks. - go func() { - const blockPollInterval = 500 * time.Millisecond - var lastBlock uint64 - for { - select { - case <-ctx.Done(): - return - case <-time.After(blockPollInterval): - unsafe, err := elNode.EthClient().BlockRefByLabel(ctx, eth.Unsafe) - if err != nil { - continue + var lastSafeTS, lastLocalSafeTS uint64 + lastSafe := make(map[string]uint64) + lastLocalSafe := make(map[string]uint64) + lastCrossUnsafe := make(map[string]uint64) + + for { + select { + case <-ctx.Done(): + return + case <-time.After(pollInterval): + status, err := queryAPI.SyncStatus(ctx) + if err != nil { + continue + } + + // Global safe timestamp + if status.SafeTimestamp != lastSafeTS && status.SafeTimestamp > 0 { + fmt.Fprintf(stderr, "[interop] Cross-safe timestamp: %d\n", status.SafeTimestamp) + lastSafeTS = status.SafeTimestamp + } + + // Global local-safe timestamp + if status.LocalSafeTimestamp != lastLocalSafeTS && status.LocalSafeTimestamp > 0 { + fmt.Fprintf(stderr, "[interop] Local-safe timestamp: %d\n", status.LocalSafeTimestamp) + lastLocalSafeTS = status.LocalSafeTimestamp + } + + // Per-chain details + for chainID, cs := range status.Chains { + id := chainID.String() + + // Cross-unsafe progression + if cs.CrossUnsafeL2.Number != lastCrossUnsafe[id] && cs.CrossUnsafeL2.Number > 0 { + fmt.Fprintf(stderr, "[interop] Chain %s cross-unsafe: #%d\n", id, cs.CrossUnsafeL2.Number) + lastCrossUnsafe[id] = cs.CrossUnsafeL2.Number + } + + // Local-safe progression + if cs.LocalSafeL2.Number != lastLocalSafe[id] { + fmt.Fprintf(stderr, "[interop] Chain %s local-safe: #%d\n", id, cs.LocalSafeL2.Number) + lastLocalSafe[id] = cs.LocalSafeL2.Number } - if unsafe.Number != lastBlock { - fmt.Fprintf(stderr, "New L2 block: number %d, hash %s\n", unsafe.Number, unsafe.Hash) - lastBlock = unsafe.Number + + // Cross-safe (safe head) — reorg shows as decrease + if cs.SafeL2.Number != lastSafe[id] { + if cs.SafeL2.Number < lastSafe[id] { + fmt.Fprintf(stderr, "[interop] Chain %s REORG: safe #%d -> #%d\n", + id, lastSafe[id], cs.SafeL2.Number) + } else { + fmt.Fprintf(stderr, "[interop] Chain %s cross-safe: #%d\n", id, cs.SafeL2.Number) + } + lastSafe[id] = cs.SafeL2.Number } } } - }() + } +} - // Proxy L2 EL requests. - go func() { - if err := proxyEL(ctx, stderr, elNode.Escape().L2EthClient().RPC()); err != nil && !errors.Is(err, http.ErrServerClosed) { - fmt.Fprintf(stderr, "error: %v", err) +func logBlocks(ctx context.Context, stderr io.Writer, name string, elNode *dsl.L2ELNode) { + const blockPollInterval = 500 * time.Millisecond + var lastBlock uint64 + for { + select { + case <-ctx.Done(): + return + case <-time.After(blockPollInterval): + unsafe, err := elNode.EthClient().BlockRefByLabel(ctx, eth.Unsafe) + if err != nil { + continue + } + if unsafe.Number != lastBlock { + fmt.Fprintf(stderr, "New %s block: number %d, hash %s\n", name, unsafe.Number, unsafe.Hash) + lastBlock = unsafe.Number + } } - }() - - <-ctx.Done() - - return nil + } } // proxyEL is a hacky way to intercept EL json rpc requests for logging to get around log filtering // bugs. -func proxyEL(ctx context.Context, stderr io.Writer, client client.RPC) error { +func proxyEL(ctx context.Context, stderr io.Writer, addr string, client client.RPC) error { mux := http.NewServeMux() // Set up the HTTP handler for all incoming requests. mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { @@ -316,7 +451,7 @@ func proxyEL(ctx context.Context, stderr io.Writer, client client.RPC) error { } }) - server := &http.Server{Addr: "localhost:8545", Handler: mux} + server := &http.Server{Addr: addr, Handler: mux} errCh := make(chan error, 1) go func() { errCh <- server.ListenAndServe() diff --git a/op-up/smoke.go b/op-up/smoke.go new file mode 100644 index 00000000000..7e82e8ba4b2 --- /dev/null +++ b/op-up/smoke.go @@ -0,0 +1,732 @@ +package main + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + "io" + "math/rand" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/urfave/cli/v2" + + "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" + "github.com/ethereum-optimism/optimism/op-core/predeploys" + opservice "github.com/ethereum-optimism/optimism/op-service" + "github.com/ethereum-optimism/optimism/op-service/apis" + "github.com/ethereum-optimism/optimism/op-service/bigs" + "github.com/ethereum-optimism/optimism/op-service/cliapp" + opclient "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/retry" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/testutils" + "github.com/ethereum-optimism/optimism/op-service/txintent" + txIntentBindings "github.com/ethereum-optimism/optimism/op-service/txintent/bindings" + "github.com/ethereum-optimism/optimism/op-service/txplan" + "github.com/lmittmann/w3" +) + +const smokeWaitTimeout = 60 * time.Second + +var ( + sendETHFn = w3.MustNewFunc("sendETH(address,uint256)", "bytes32") + + smokeL2AURLFlag = &cli.StringFlag{ + Name: "l2a-rpc", + Usage: "RPC URL for chain A.", + EnvVars: opservice.PrefixEnvVar(envPrefix, "SMOKE_L2A_RPC"), + Value: "http://localhost:8545", + } + smokeL2BURLFlag = &cli.StringFlag{ + Name: "l2b-rpc", + Usage: "RPC URL for chain B.", + EnvVars: opservice.PrefixEnvVar(envPrefix, "SMOKE_L2B_RPC"), + Value: "http://localhost:8546", + } +) + +type sendETHTrigger struct { + Recipient common.Address + Destination eth.ChainID +} + +func (t *sendETHTrigger) To() (*common.Address, error) { + addr := predeploys.SuperchainETHBridgeAddr + return &addr, nil +} + +func (t *sendETHTrigger) EncodeInput() ([]byte, error) { + return sendETHFn.EncodeArgs(t.Recipient, t.Destination.ToBig()) +} + +func (t *sendETHTrigger) AccessList() (types.AccessList, error) { + return nil, nil +} + +type remoteChain struct { + name string + url string + rpc opclient.RPC + ethClient apis.EthClient + chainID eth.ChainID +} + +type remoteUser struct { + chain *remoteChain + privKey *ecdsa.PrivateKey + address common.Address +} + +type initMessage struct { + Tx *txintent.IntentTx[*txintent.InitTrigger, *txintent.InteropOutput] + Receipt *types.Receipt +} + +type execMessage struct { + Init *initMessage + Tx *txintent.IntentTx[*txintent.ExecTrigger, *txintent.InteropOutput] + Receipt *types.Receipt +} + +type smokeEnv struct { + ctx context.Context + stderr io.Writer + chainA *remoteChain + chainB *remoteChain + userA *remoteUser + userB *remoteUser +} + +func (m *initMessage) BlockNumber() uint64 { + return bigs.Uint64Strict(m.Receipt.BlockNumber) +} + +func (m *initMessage) BlockHash() common.Hash { + return m.Receipt.BlockHash +} + +func (m *execMessage) BlockNumber() uint64 { + return bigs.Uint64Strict(m.Receipt.BlockNumber) +} + +func (m *execMessage) BlockHash() common.Hash { + return m.Receipt.BlockHash +} + +func (u *remoteUser) plan() txplan.Option { + return txplan.Combine( + txplan.WithChainID(u.chain.ethClient), + txplan.WithPrivateKey(u.privKey), + txplan.WithPendingNonce(u.chain.ethClient), + txplan.WithAgainstLatestBlock(u.chain.ethClient), + txplan.WithEstimator(u.chain.ethClient, true), + txplan.WithRetrySubmission(u.chain.ethClient, 5, retry.Exponential()), + txplan.WithRetryInclusion(u.chain.ethClient, 5, retry.Exponential()), + txplan.WithBlockInclusionInfo(u.chain.ethClient), + ) +} + +func (u *remoteUser) transfer(ctx context.Context, to common.Address, amount eth.ETH) (*txplan.PlannedTx, error) { + tx := txplan.NewPlannedTx( + u.plan(), + txplan.WithTo(&to), + txplan.WithValue(amount), + ) + _, err := tx.Success.Eval(ctx) + if err != nil { + return nil, err + } + return tx, nil +} + +func (u *remoteUser) deployEventLogger(ctx context.Context) (common.Address, error) { + tx := txplan.NewPlannedTx(u.plan(), txplan.WithData(common.FromHex(txIntentBindings.EventloggerBin))) + receipt, err := tx.Included.Eval(ctx) + if err != nil { + return common.Address{}, err + } + return receipt.ContractAddress, nil +} + +func (u *remoteUser) sendRandomInitMessage(ctx context.Context, rng *rand.Rand, eventLogger common.Address, topicCount, dataLen int) (*initMessage, error) { + if topicCount > 4 { + topicCount = 4 + } + if topicCount < 1 { + topicCount = 1 + } + if dataLen < 1 { + dataLen = 1 + } + + topics := make([][32]byte, topicCount) + for i := range topics { + copy(topics[i][:], testutils.RandomData(rng, 32)) + } + + trigger := &txintent.InitTrigger{ + Emitter: eventLogger, + Topics: topics, + OpaqueData: testutils.RandomData(rng, dataLen), + } + tx := txintent.NewIntent[*txintent.InitTrigger, *txintent.InteropOutput](u.plan()) + tx.Content.Set(trigger) + receipt, err := tx.PlannedTx.Included.Eval(ctx) + if err != nil { + return nil, err + } + return &initMessage{Tx: tx, Receipt: receipt}, nil +} + +func (u *remoteUser) sendExecMessage(ctx context.Context, initMsg *initMessage) (*execMessage, error) { + tx := txintent.NewIntent[*txintent.ExecTrigger, *txintent.InteropOutput](u.plan()) + tx.Content.DependOn(&initMsg.Tx.Result) + tx.Content.Fn(txintent.ExecuteIndexed(predeploys.CrossL2InboxAddr, &initMsg.Tx.Result, 0)) + receipt, err := tx.PlannedTx.Included.Eval(ctx) + if err != nil { + return nil, err + } + return &execMessage{ + Init: initMsg, + Tx: tx, + Receipt: receipt, + }, nil +} + +func (u *remoteUser) sendInvalidExecMessage(ctx context.Context, initMsg *initMessage) (*execMessage, error) { + result, err := initMsg.Tx.Result.Eval(ctx) + if err != nil { + return nil, err + } + if len(result.Entries) == 0 { + return nil, fmt.Errorf("init tx produced no interop entries") + } + + msg := result.Entries[0] + msg.Identifier.LogIndex++ + + tx := txintent.NewIntent[*txintent.ExecTrigger, *txintent.InteropOutput](u.plan()) + tx.Content.DependOn(&initMsg.Tx.Result) + tx.Content.Fn(func(context.Context) (*txintent.ExecTrigger, error) { + return &txintent.ExecTrigger{ + Executor: predeploys.CrossL2InboxAddr, + Msg: msg, + }, nil + }) + + receipt, err := tx.PlannedTx.Included.Eval(ctx) + if err != nil { + return nil, err + } + return &execMessage{ + Init: initMsg, + Tx: tx, + Receipt: receipt, + }, nil +} + +func newSmokeEnv(ctx context.Context, stderr io.Writer, l2AURL, l2BURL string) (*smokeEnv, func(), error) { + logger := newLogger(ctx, stderr) + + chainA, err := connectRemoteChain(ctx, logger, "L2A", l2AURL) + if err != nil { + return nil, nil, err + } + chainB, err := connectRemoteChain(ctx, logger, "L2B", l2BURL) + if err != nil { + chainA.ethClient.Close() + return nil, nil, err + } + + privKey, address, err := defaultSmokeKey() + if err != nil { + chainA.ethClient.Close() + chainB.ethClient.Close() + return nil, nil, err + } + + env := &smokeEnv{ + ctx: ctx, + stderr: stderr, + chainA: chainA, + chainB: chainB, + userA: &remoteUser{chain: chainA, privKey: privKey, address: address}, + userB: &remoteUser{chain: chainB, privKey: privKey, address: address}, + } + cleanup := func() { + chainA.ethClient.Close() + chainB.ethClient.Close() + } + return env, cleanup, nil +} + +func connectRemoteChain(ctx context.Context, logger log.Logger, name, url string) (*remoteChain, error) { + chainLogger := logger.New("chain", name, "rpc", url) + rpcCl, err := opclient.NewRPC( + ctx, + chainLogger, + url, + opclient.WithFixedDialBackoff(time.Second), + opclient.WithDialAttempts(5), + ) + if err != nil { + return nil, fmt.Errorf("dial %s RPC %s: %w", name, url, err) + } + ethCl, err := sources.NewEthClient(rpcCl, chainLogger, nil, sources.DefaultEthClientConfig(10)) + if err != nil { + rpcCl.Close() + return nil, fmt.Errorf("create %s eth client: %w", name, err) + } + chainIDBig, err := ethCl.ChainID(ctx) + if err != nil { + ethCl.Close() + return nil, fmt.Errorf("fetch %s chain ID: %w", name, err) + } + return &remoteChain{ + name: name, + url: url, + rpc: rpcCl, + ethClient: ethCl, + chainID: eth.ChainIDFromBig(chainIDBig), + }, nil +} + +func defaultSmokeKey() (*ecdsa.PrivateKey, common.Address, error) { + hd, err := devkeys.NewMnemonicDevKeys(devkeys.TestMnemonic) + if err != nil { + return nil, common.Address{}, fmt.Errorf("new mnemonic dev keys: %w", err) + } + const funderIndex = 10_000 + key := devkeys.UserKey(funderIndex) + privKey, err := hd.Secret(key) + if err != nil { + return nil, common.Address{}, fmt.Errorf("secret: %w", err) + } + address := crypto.PubkeyToAddress(privKey.PublicKey) + return privKey, address, nil +} + +func withSmokeEnv(cliCtx *cli.Context, name string, fn func(env *smokeEnv) error) error { + ctx := cliCtx.Context + stderr := cliCtx.App.ErrWriter + l2AURL := cliCtx.String(smokeL2AURLFlag.Name) + l2BURL := cliCtx.String(smokeL2BURLFlag.Name) + + fmt.Fprintf(stderr, "%s\n", asciiArt) + fmt.Fprintf(stderr, "\nSmoke: %s\n\n", name) + + env, cleanup, err := newSmokeEnv(ctx, stderr, l2AURL, l2BURL) + if err != nil { + return err + } + defer cleanup() + + fmt.Fprintf(stderr, "Chain A RPC: %s (chain ID %s)\n", env.chainA.url, env.chainA.chainID) + fmt.Fprintf(stderr, "Chain B RPC: %s (chain ID %s)\n", env.chainB.url, env.chainB.chainID) + fmt.Fprintf(stderr, "Smoke Sender Address: %s\n\n", env.userA.address) + + if err := fn(env); err != nil { + fmt.Fprintf(stderr, "\nFAIL: %s (%v)\n", name, err) + return err + } + fmt.Fprintf(stderr, "\nPASS: %s\n", name) + return nil +} + +func smokeCommand() *cli.Command { + smokeFlags := cliapp.ProtectFlags([]cli.Flag{smokeL2AURLFlag, smokeL2BURLFlag}) + + return &cli.Command{ + Name: "smoke-interop", + Usage: "run interop smoke tests against remote chain RPCs", + Subcommands: []*cli.Command{ + { + Name: "all", + Usage: "run all smoke tests sequentially", + Flags: smokeFlags, + Action: func(cliCtx *cli.Context) error { + return withSmokeEnv(cliCtx, "All Tests", smokeAll) + }, + }, + { + Name: "identity", + Usage: "verify both chains have different chain IDs", + Flags: smokeFlags, + Action: func(cliCtx *cli.Context) error { + return withSmokeEnv(cliCtx, "Chain Identity", smokeIdentity) + }, + }, + { + Name: "transfer", + Usage: "send ETH transfers on both chains", + Flags: smokeFlags, + Action: func(cliCtx *cli.Context) error { + return withSmokeEnv(cliCtx, "ETH Transfers", smokeTransfer) + }, + }, + { + Name: "bridge", + Usage: "bridge ETH from chain A to chain B via SuperchainETHBridge", + Flags: smokeFlags, + Action: func(cliCtx *cli.Context) error { + return withSmokeEnv(cliCtx, "Cross-Chain ETH Bridge", smokeBridge) + }, + }, + { + Name: "valid-message", + Usage: "send a valid executing message and verify it stays in-chain", + Flags: smokeFlags, + Action: func(cliCtx *cli.Context) error { + return withSmokeEnv(cliCtx, "Valid Exec Message", smokeValidMessage) + }, + }, + { + Name: "invalid-message", + Usage: "send an invalid executing message and verify it is reorged out", + Flags: smokeFlags, + Action: func(cliCtx *cli.Context) error { + return withSmokeEnv(cliCtx, "Invalid Exec Message (reorg)", smokeInvalidMessage) + }, + }, + }, + } +} + +func smokeAll(env *smokeEnv) error { + tests := []struct { + name string + fn func(env *smokeEnv) error + }{ + {"Chain Identity", smokeIdentity}, + {"ETH Transfers", smokeTransfer}, + {"Cross-Chain ETH Bridge", smokeBridge}, + {"Valid Exec Message", smokeValidMessage}, + {"Invalid Exec Message (reorg)", smokeInvalidMessage}, + } + + var failed []string + for _, test := range tests { + fmt.Fprintf(env.stderr, "--- %s\n", test.name) + if err := test.fn(env); err != nil { + fmt.Fprintf(env.stderr, " FAIL: %v\n", err) + failed = append(failed, test.name) + } else { + fmt.Fprintf(env.stderr, " PASS\n") + } + } + + if len(failed) > 0 { + return fmt.Errorf("failed tests: %v", failed) + } + return nil +} + +func smokeIdentity(env *smokeEnv) error { + if env.chainA.chainID == env.chainB.chainID { + return fmt.Errorf("chains have the same ID: %s", env.chainA.chainID) + } + fmt.Fprintf(env.stderr, " Chain A: %s, Chain B: %s\n", env.chainA.chainID, env.chainB.chainID) + return nil +} + +func smokeTransfer(env *smokeEnv) error { + recipientA := randomAddress() + if _, err := env.userA.transfer(env.ctx, recipientA, eth.OneHundredthEther); err != nil { + return fmt.Errorf("chain A transfer failed: %w", err) + } + if err := waitForBalance(env.ctx, env.chainA, recipientA, eth.OneHundredthEther); err != nil { + return err + } + fmt.Fprintf(env.stderr, " Chain A transfer: OK\n") + + recipientB := randomAddress() + if _, err := env.userB.transfer(env.ctx, recipientB, eth.OneHundredthEther); err != nil { + return fmt.Errorf("chain B transfer failed: %w", err) + } + if err := waitForBalance(env.ctx, env.chainB, recipientB, eth.OneHundredthEther); err != nil { + return err + } + fmt.Fprintf(env.stderr, " Chain B transfer: OK\n") + return nil +} + +func smokeBridge(env *smokeEnv) error { + recipient := randomAddress() + amount := eth.OneHundredthEther + + sendTx := txintent.NewIntent[*sendETHTrigger, *txintent.InteropOutput]( + env.userA.plan(), + txplan.WithValue(amount), + ) + sendTx.Content.Set(&sendETHTrigger{ + Recipient: recipient, + Destination: env.chainB.chainID, + }) + + sendReceipt, err := sendTx.PlannedTx.Included.Eval(env.ctx) + if err != nil { + return fmt.Errorf("sendETH failed: %w", err) + } + if sendReceipt.Status != types.ReceiptStatusSuccessful { + return fmt.Errorf("sendETH tx reverted") + } + fmt.Fprintf(env.stderr, " sendETH tx included: %s\n", sendReceipt.TxHash) + + relayReceipt, err := waitForRelaySuccess(env, sendTx) + if err != nil { + return err + } + fmt.Fprintf(env.stderr, " relayETH tx included: %s\n", relayReceipt.TxHash) + + if err := waitForBalance(env.ctx, env.chainB, recipient, amount); err != nil { + return err + } + fmt.Fprintf(env.stderr, " Recipient received %s ETH on Chain B\n", amount) + return nil +} + +func smokeValidMessage(env *smokeEnv) error { + rng := rand.New(rand.NewSource(42)) + + eventLogger, err := env.userA.deployEventLogger(env.ctx) + if err != nil { + return fmt.Errorf("deploy EventLogger: %w", err) + } + + initMsg, err := env.userA.sendRandomInitMessage(env.ctx, rng, eventLogger, 2, 10) + if err != nil { + return fmt.Errorf("send init message: %w", err) + } + fmt.Fprintf(env.stderr, " Init message sent on Chain A (block %d)\n", initMsg.BlockNumber()) + + if _, err := waitForNextBlock(env.ctx, env.chainB); err != nil { + return err + } + execMsg, err := env.userB.sendExecMessage(env.ctx, initMsg) + if err != nil { + return fmt.Errorf("send exec message: %w", err) + } + if execMsg.Receipt.Status != types.ReceiptStatusSuccessful { + return fmt.Errorf("exec tx reverted") + } + + execBlockNum := execMsg.BlockNumber() + execBlockHash := execMsg.BlockHash() + fmt.Fprintf(env.stderr, " Exec message sent on Chain B (block %d)\n", execBlockNum) + + if err := waitForHeadAtLeast(env.ctx, env.chainB, execBlockNum+2); err != nil { + return err + } + + currentBlock, err := env.chainB.ethClient.BlockRefByNumber(env.ctx, execBlockNum) + if err != nil { + return fmt.Errorf("fetch block %d: %w", execBlockNum, err) + } + if currentBlock.Hash != execBlockHash { + return fmt.Errorf("block was replaced: expected %s, got %s", execBlockHash, currentBlock.Hash) + } + if err := assertTxInBlock(env.ctx, env.chainB, execBlockNum, execMsg.Receipt.TxHash); err != nil { + return err + } + fmt.Fprintf(env.stderr, " Block remained canonical after head advanced past it\n") + return nil +} + +func smokeInvalidMessage(env *smokeEnv) error { + rng := rand.New(rand.NewSource(99)) + + eventLogger, err := env.userA.deployEventLogger(env.ctx) + if err != nil { + return fmt.Errorf("deploy EventLogger: %w", err) + } + + initMsg, err := env.userA.sendRandomInitMessage(env.ctx, rng, eventLogger, 2, 10) + if err != nil { + return fmt.Errorf("send init message: %w", err) + } + if _, err := waitForNextBlock(env.ctx, env.chainB); err != nil { + return err + } + + invalidExec, err := env.userB.sendInvalidExecMessage(env.ctx, initMsg) + if err != nil { + return fmt.Errorf("send invalid exec message: %w", err) + } + if invalidExec.Receipt.Status != types.ReceiptStatusSuccessful { + return fmt.Errorf("invalid exec tx reverted before inclusion") + } + + invalidBlockNum := invalidExec.BlockNumber() + invalidBlockHash := invalidExec.BlockHash() + fmt.Fprintf(env.stderr, " Invalid exec tx included: %s\n", invalidExec.Receipt.TxHash) + fmt.Fprintf(env.stderr, " Invalid exec message landed in block %d (%s)\n", invalidBlockNum, invalidBlockHash) + + if err := waitForReorgedOut(env.ctx, env.stderr, env.chainB, invalidBlockNum, invalidBlockHash, invalidExec.Receipt.TxHash); err != nil { + return err + } + fmt.Fprintf(env.stderr, " Invalid tx was reorged out after block %d was replaced\n", invalidBlockNum) + return nil +} + +func waitForRelaySuccess(env *smokeEnv, sendTx *txintent.IntentTx[*sendETHTrigger, *txintent.InteropOutput]) (*types.Receipt, error) { + deadline := time.Now().Add(smokeWaitTimeout) + for attempt := 0; ; attempt++ { + relayTx := txintent.NewIntent[*txintent.RelayTrigger, *txintent.InteropOutput](env.userB.plan()) + relayTx.Content.DependOn(&sendTx.Result) + relayTx.Content.Fn(txintent.RelayIndexed( + predeploys.L2toL2CrossDomainMessengerAddr, + &sendTx.Result, + &sendTx.PlannedTx.Included, + 1, + )) + + relayReceipt, err := relayTx.PlannedTx.Included.Eval(env.ctx) + if err == nil && relayReceipt.Status == types.ReceiptStatusSuccessful { + return relayReceipt, nil + } + if time.Now().After(deadline) { + if err != nil { + return nil, fmt.Errorf("relayETH failed before timeout: %w", err) + } + return nil, fmt.Errorf("relayETH tx kept reverting until timeout") + } + if err != nil { + fmt.Fprintf(env.stderr, " Waiting for relayability: attempt %d failed: %v\n", attempt+1, err) + } else { + fmt.Fprintf(env.stderr, " Waiting for relayability: attempt %d reverted in tx %s\n", attempt+1, relayReceipt.TxHash) + } + time.Sleep(time.Second) + } +} + +func waitForBalance(ctx context.Context, chain *remoteChain, addr common.Address, want eth.ETH) error { + deadline := time.Now().Add(smokeWaitTimeout) + for { + balance, err := chain.ethClient.BalanceAt(ctx, addr, nil) + if err == nil && balance.Cmp(want.ToBig()) == 0 { + return nil + } + if err := ctx.Err(); err != nil { + return err + } + if time.Now().After(deadline) { + if err != nil { + return fmt.Errorf("timed out waiting for balance on %s: %w", chain.name, err) + } + return fmt.Errorf("timed out waiting for %s balance on %s; got %s", addr, chain.name, eth.WeiBig(balance)) + } + time.Sleep(time.Second) + } +} + +func waitForNextBlock(ctx context.Context, chain *remoteChain) (eth.BlockRef, error) { + head, err := chain.ethClient.BlockRefByLabel(ctx, eth.Unsafe) + if err != nil { + return eth.BlockRef{}, fmt.Errorf("fetch latest block on %s: %w", chain.name, err) + } + if err := waitForHeadAtLeast(ctx, chain, head.Number+1); err != nil { + return eth.BlockRef{}, err + } + return chain.ethClient.BlockRefByLabel(ctx, eth.Unsafe) +} + +func waitForHeadAtLeast(ctx context.Context, chain *remoteChain, target uint64) error { + deadline := time.Now().Add(smokeWaitTimeout) + for { + head, err := chain.ethClient.BlockRefByLabel(ctx, eth.Unsafe) + if err == nil && head.Number >= target { + return nil + } + if err := ctx.Err(); err != nil { + return err + } + if time.Now().After(deadline) { + if err != nil { + return fmt.Errorf("timed out waiting for %s head >= %d: %w", chain.name, target, err) + } + return fmt.Errorf("timed out waiting for %s head >= %d; current head is %d", chain.name, target, head.Number) + } + time.Sleep(time.Second) + } +} + +func waitForReorgedOut(ctx context.Context, stderr io.Writer, chain *remoteChain, blockNum uint64, oldHash, txHash common.Hash) error { + deadline := time.Now().Add(smokeWaitTimeout) + replaced := false + for attempt := 0; ; attempt++ { + currentBlock, err := chain.ethClient.BlockRefByNumber(ctx, blockNum) + if err == nil { + if currentBlock.Hash != oldHash { + fmt.Fprintf(stderr, " Reorg detected at block %d: %s -> %s\n", blockNum, oldHash, currentBlock.Hash) + replaced = true + break + } + if attempt == 0 || attempt%10 == 0 { + fmt.Fprintf(stderr, " Waiting for reorg at block %d: still %s\n", blockNum, currentBlock.Hash) + } + } else if errors.Is(eth.MaybeAsNotFoundErr(err), ethereum.NotFound) { + if attempt == 0 || attempt%10 == 0 { + fmt.Fprintf(stderr, " Waiting for reorg at block %d: block temporarily missing\n", blockNum) + } + } else if attempt == 0 || attempt%10 == 0 { + fmt.Fprintf(stderr, " Waiting for reorg at block %d: lookup error: %v\n", blockNum, err) + } + + if err := ctx.Err(); err != nil { + return err + } + if time.Now().After(deadline) { + return fmt.Errorf("timed out waiting for block %d (%s) to be reorged out", blockNum, oldHash) + } + time.Sleep(time.Second) + } + + if !replaced { + return fmt.Errorf("invalid reorg state") + } + if err := waitForHeadAtLeast(ctx, chain, blockNum+1); err != nil { + return err + } + return assertTxNotInBlock(ctx, chain, blockNum, txHash) +} + +func assertTxInBlock(ctx context.Context, chain *remoteChain, blockNum uint64, txHash common.Hash) error { + _, txs, err := chain.ethClient.InfoAndTxsByNumber(ctx, blockNum) + if err != nil { + return fmt.Errorf("fetch block %d txs on %s: %w", blockNum, chain.name, err) + } + for _, tx := range txs { + if tx.Hash() == txHash { + return nil + } + } + return fmt.Errorf("tx %s not found in block %d on %s", txHash, blockNum, chain.name) +} + +func assertTxNotInBlock(ctx context.Context, chain *remoteChain, blockNum uint64, txHash common.Hash) error { + _, txs, err := chain.ethClient.InfoAndTxsByNumber(ctx, blockNum) + if err != nil { + return fmt.Errorf("fetch block %d txs on %s: %w", blockNum, chain.name, err) + } + for _, tx := range txs { + if tx.Hash() == txHash { + return fmt.Errorf("tx %s still present in block %d on %s", txHash, blockNum, chain.name) + } + } + return nil +} + +func randomAddress() common.Address { + privKey, err := crypto.GenerateKey() + if err != nil { + panic(err) + } + return crypto.PubkeyToAddress(privKey.PublicKey) +} diff --git a/rust/kona/tests/justfile b/rust/kona/tests/justfile index 5afa5579ed8..e684d0f6f79 100644 --- a/rust/kona/tests/justfile +++ b/rust/kona/tests/justfile @@ -21,9 +21,9 @@ build-kona PROFILE="release": #!/bin/bash cd {{SOURCE}}/.. && cargo build --bin kona-node --profile {{PROFILE}} -acceptance-tests CL_TYPE="kona" EL_TYPE="op-reth" GATE="jovian": +acceptance-tests CL_TYPE="kona-node" EL_TYPE="op-reth" GATE="jovian": #!/bin/bash - if [ "{{CL_TYPE}}" = "kona" ] ; then + if [ "{{CL_TYPE}}" = "kona-node" ] ; then echo "Building kona-node..." just build-kona fi @@ -37,9 +37,9 @@ acceptance-tests CL_TYPE="kona" EL_TYPE="op-reth" GATE="jovian": # Run acceptance tests for the rust stack. By default runs the acceptance tests for kona-node with op-reth. # Uses the jovian gate by default. -acceptance-tests-run CL_TYPE="kona" EL_TYPE="op-reth" GATE="jovian": +acceptance-tests-run CL_TYPE="kona-node" EL_TYPE="op-reth" GATE="jovian": #!/bin/bash - if [ "{{CL_TYPE}}" = "kona" ] ; then + if [ "{{CL_TYPE}}" = "kona-node" ] ; then echo "Running acceptance tests for kona-node" export KONA_NODE_EXEC_PATH="{{SOURCE}}/../target/debug/kona-node" fi From b72f9a0abb4e3aeaf998f4d16ebb96f9691c9c14 Mon Sep 17 00:00:00 2001 From: Ashitaka Date: Tue, 31 Mar 2026 23:35:23 -0300 Subject: [PATCH 3/8] fix: merge with dev --- .circleci/continue/docs-ci.yml | 124 ++ .circleci/l2-rpcs.json | 13 + .circleci/scripts/check-l2-chains-sync.sh | 38 + .../op-deployer-upgrade-deprecation.mdx | 33 + docs/public-docs/public/rust/banner.png | Bin 0 -> 207466 bytes docs/public-docs/public/rust/favicon.ico | Bin 0 -> 4286 bytes docs/public-docs/public/rust/logo.png | Bin 0 -> 221318 bytes .../public/rust/op-program-fpp.svg | 4 + docs/public-docs/rust/index.mdx | 64 + docs/public-docs/rust/kona/glossary.mdx | 43 + .../rust/kona/intro/contributing.mdx | 65 + docs/public-docs/rust/kona/intro/lore.mdx | 48 + docs/public-docs/rust/kona/intro/overview.mdx | 94 ++ docs/public-docs/rust/kona/intro/why.mdx | 45 + .../rust/kona/node/configuration.mdx | 187 +++ .../rust/kona/node/design/derivation.mdx | 236 +++ .../rust/kona/node/design/engine.mdx | 302 ++++ .../rust/kona/node/design/intro.mdx | 78 + .../public-docs/rust/kona/node/design/p2p.mdx | 174 +++ .../rust/kona/node/design/sequencer.mdx | 196 +++ .../rust/kona/node/faq/overview.mdx | 8 + docs/public-docs/rust/kona/node/faq/ports.mdx | 12 + .../rust/kona/node/faq/profiling.mdx | 5 + .../rust/kona/node/install/binaries.mdx | 5 + .../rust/kona/node/install/docker.mdx | 64 + .../rust/kona/node/install/overview.mdx | 59 + .../rust/kona/node/install/source.mdx | 84 ++ .../public-docs/rust/kona/node/monitoring.mdx | 41 + .../rust/kona/node/requirements.mdx | 20 + docs/public-docs/rust/kona/node/rpc/admin.mdx | 130 ++ .../rust/kona/node/rpc/overview.mdx | 27 + docs/public-docs/rust/kona/node/rpc/p2p.mdx | 331 +++++ .../public-docs/rust/kona/node/rpc/rollup.mdx | 356 +++++ .../public-docs/rust/kona/node/run/binary.mdx | 232 +++ .../public-docs/rust/kona/node/run/docker.mdx | 179 +++ .../rust/kona/node/run/mechanics.mdx | 227 +++ .../rust/kona/node/run/overview.mdx | 40 + .../rust/kona/node/subcommands.mdx | 17 + .../rust/kona/rfc/active/intro.mdx | 11 + .../rust/kona/rfc/archived/monorepo.mdx | 153 ++ .../rust/kona/rfc/archived/umbrellas.mdx | 124 ++ docs/public-docs/rust/kona/run.mdx | 56 + .../examples/custom-derivation-pipeline.mdx | 199 +++ .../sdk/examples/executor-test-fixtures.mdx | 23 + .../kona/sdk/examples/frames-to-batch.mdx | 164 +++ .../rust/kona/sdk/examples/intro.mdx | 12 + .../sdk/examples/load-a-rollup-config.mdx | 36 + .../new-l1-block-info-tx-hardfork.mdx | 115 ++ .../kona/sdk/examples/p2p-peer-scoring.mdx | 352 +++++ .../public-docs/rust/kona/sdk/fpp-dev/env.mdx | 84 ++ .../rust/kona/sdk/fpp-dev/epilogue.mdx | 19 + .../rust/kona/sdk/fpp-dev/execution.mdx | 23 + .../rust/kona/sdk/fpp-dev/intro.mdx | 23 + docs/public-docs/rust/kona/sdk/fpp-dev/io.mdx | 4 + .../rust/kona/sdk/fpp-dev/prologue.mdx | 44 + .../rust/kona/sdk/fpp-dev/targets.mdx | 69 + docs/public-docs/rust/kona/sdk/overview.mdx | 36 + .../rust/kona/sdk/proof/custom-backend.mdx | 141 ++ .../rust/kona/sdk/proof/exec-ext.mdx | 213 +++ .../rust/kona/sdk/proof/fpvm-backend.mdx | 161 +++ .../public-docs/rust/kona/sdk/proof/intro.mdx | 63 + .../rust/kona/sdk/protocol/derive/intro.mdx | 312 ++++ .../kona/sdk/protocol/derive/providers.mdx | 102 ++ .../kona/sdk/protocol/derive/signaling.mdx | 156 ++ .../rust/kona/sdk/protocol/derive/stages.mdx | 113 ++ .../rust/kona/sdk/protocol/genesis/intro.mdx | 32 + .../sdk/protocol/genesis/rollup-config.mdx | 24 + .../sdk/protocol/genesis/system-config.mdx | 36 + .../rust/kona/sdk/protocol/hardforks.mdx | 43 + .../rust/kona/sdk/protocol/interop.mdx | 5 + .../rust/kona/sdk/protocol/intro.mdx | 30 + .../kona/sdk/protocol/protocol/batches.mdx | 110 ++ .../kona/sdk/protocol/protocol/block-info.mdx | 12 + .../kona/sdk/protocol/protocol/channels.mdx | 109 ++ .../kona/sdk/protocol/protocol/frames.mdx | 85 ++ .../rust/kona/sdk/protocol/protocol/intro.mdx | 64 + .../sdk/protocol/protocol/l2-block-info.mdx | 18 + .../rust/kona/sdk/protocol/registry.mdx | 69 + .../rust/op-alloy/building/consensus.mdx | 68 + .../rust/op-alloy/building/engine.mdx | 15 + .../rust/op-alloy/building/index.mdx | 12 + docs/public-docs/rust/op-alloy/glossary.mdx | 5 + docs/public-docs/rust/op-alloy/intro.mdx | 38 + docs/public-docs/rust/op-alloy/starting.mdx | 82 ++ docs/public-docs/rust/op-reth/cli/cli.mdx | 7 + docs/public-docs/rust/op-reth/cli/op-reth.mdx | 176 +++ .../rust/op-reth/cli/op-reth/config.mdx | 164 +++ .../rust/op-reth/cli/op-reth/db.mdx | 343 +++++ .../cli/op-reth/db/account-storage.mdx | 172 +++ .../rust/op-reth/cli/op-reth/db/checksum.mdx | 173 +++ .../op-reth/cli/op-reth/db/checksum/mdbx.mdx | 181 +++ .../cli/op-reth/db/checksum/static-file.mdx | 189 +++ .../rust/op-reth/cli/op-reth/db/clear.mdx | 173 +++ .../op-reth/cli/op-reth/db/clear/mdbx.mdx | 172 +++ .../cli/op-reth/db/clear/static-file.mdx | 178 +++ .../rust/op-reth/cli/op-reth/db/diff.mdx | 224 +++ .../rust/op-reth/cli/op-reth/db/drop.mdx | 171 +++ .../rust/op-reth/cli/op-reth/db/get.mdx | 173 +++ .../rust/op-reth/cli/op-reth/db/get/mdbx.mdx | 187 +++ .../cli/op-reth/db/get/static-file.mdx | 187 +++ .../rust/op-reth/cli/op-reth/db/list.mdx | 214 +++ .../rust/op-reth/cli/op-reth/db/path.mdx | 168 +++ .../op-reth/cli/op-reth/db/repair-trie.mdx | 176 +++ .../rust/op-reth/cli/op-reth/db/settings.mdx | 173 +++ .../op-reth/cli/op-reth/db/settings/get.mdx | 168 +++ .../op-reth/cli/op-reth/db/settings/set.mdx | 178 +++ .../db/settings/set/account_changesets.mdx | 172 +++ .../db/settings/set/account_history.mdx | 172 +++ .../cli/op-reth/db/settings/set/receipts.mdx | 172 +++ .../settings/set/receipts_in_static_files.mdx | 154 ++ .../db/settings/set/storage_changesets.mdx | 172 +++ .../db/settings/set/storages_history.mdx | 172 +++ .../settings/set/transaction_hash_numbers.mdx | 172 +++ .../db/settings/set/transaction_senders.mdx | 172 +++ .../transaction_senders_in_static_files.mdx | 154 ++ .../cli/op-reth/db/static-file-header.mdx | 173 +++ .../op-reth/db/static-file-header/block.mdx | 183 +++ .../op-reth/db/static-file-header/path.mdx | 172 +++ .../rust/op-reth/cli/op-reth/db/stats.mdx | 184 +++ .../rust/op-reth/cli/op-reth/db/version.mdx | 168 +++ .../rust/op-reth/cli/op-reth/dump-genesis.mdx | 167 +++ .../rust/op-reth/cli/op-reth/import-op.mdx | 336 +++++ .../cli/op-reth/import-receipts-op.mdx | 336 +++++ .../rust/op-reth/cli/op-reth/init-state.mdx | 366 +++++ .../rust/op-reth/cli/op-reth/init.mdx | 327 +++++ .../rust/op-reth/cli/op-reth/node.mdx | 1276 +++++++++++++++++ .../rust/op-reth/cli/op-reth/p2p.mdx | 165 +++ .../rust/op-reth/cli/op-reth/p2p/body.mdx | 415 ++++++ .../rust/op-reth/cli/op-reth/p2p/bootnode.mdx | 176 +++ .../rust/op-reth/cli/op-reth/p2p/header.mdx | 415 ++++++ .../rust/op-reth/cli/op-reth/p2p/rlpx.mdx | 162 +++ .../op-reth/cli/op-reth/p2p/rlpx/ping.mdx | 162 +++ .../rust/op-reth/cli/op-reth/prune.mdx | 327 +++++ .../rust/op-reth/cli/op-reth/re-execute.mdx | 341 +++++ .../rust/op-reth/cli/op-reth/stage.mdx | 165 +++ .../rust/op-reth/cli/op-reth/stage/drop.mdx | 341 +++++ .../rust/op-reth/cli/op-reth/stage/dump.mdx | 334 +++++ .../op-reth/stage/dump/account-hashing.mdx | 180 +++ .../cli/op-reth/stage/dump/execution.mdx | 180 +++ .../op-reth/cli/op-reth/stage/dump/merkle.mdx | 180 +++ .../op-reth/stage/dump/storage-hashing.mdx | 180 +++ .../rust/op-reth/cli/op-reth/stage/run.mdx | 588 ++++++++ .../rust/op-reth/cli/op-reth/stage/unwind.mdx | 335 +++++ .../cli/op-reth/stage/unwind/num-blocks.mdx | 172 +++ .../cli/op-reth/stage/unwind/to-block.mdx | 172 +++ docs/public-docs/rust/op-reth/index.mdx | 22 + .../rust/op-reth/run/faq/sync-op-mainnet.mdx | 110 ++ docs/public-docs/rust/op-reth/run/opstack.mdx | 119 ++ .../2026_03-Kona-Spearbit.pdf | Bin 0 -> 741446 bytes .../2026_03-PolicyEngineStaking-Cantina.pdf | Bin 0 -> 494477 bytes op-e2e/actions/proofs/end_of_source_test.go | 82 ++ rust/kona/bin/client/tests/trace_extension.rs | 150 ++ rust/kona/bin/host/src/kv/directory.rs | 142 ++ rust/op-reth/crates/txpool/src/pool.rs | 626 ++++++++ 154 files changed, 22634 insertions(+) create mode 100644 .circleci/continue/docs-ci.yml create mode 100644 .circleci/l2-rpcs.json create mode 100755 .circleci/scripts/check-l2-chains-sync.sh create mode 100644 docs/public-docs/notices/op-deployer-upgrade-deprecation.mdx create mode 100644 docs/public-docs/public/rust/banner.png create mode 100644 docs/public-docs/public/rust/favicon.ico create mode 100644 docs/public-docs/public/rust/logo.png create mode 100644 docs/public-docs/public/rust/op-program-fpp.svg create mode 100644 docs/public-docs/rust/index.mdx create mode 100644 docs/public-docs/rust/kona/glossary.mdx create mode 100644 docs/public-docs/rust/kona/intro/contributing.mdx create mode 100644 docs/public-docs/rust/kona/intro/lore.mdx create mode 100644 docs/public-docs/rust/kona/intro/overview.mdx create mode 100644 docs/public-docs/rust/kona/intro/why.mdx create mode 100644 docs/public-docs/rust/kona/node/configuration.mdx create mode 100644 docs/public-docs/rust/kona/node/design/derivation.mdx create mode 100644 docs/public-docs/rust/kona/node/design/engine.mdx create mode 100644 docs/public-docs/rust/kona/node/design/intro.mdx create mode 100644 docs/public-docs/rust/kona/node/design/p2p.mdx create mode 100644 docs/public-docs/rust/kona/node/design/sequencer.mdx create mode 100644 docs/public-docs/rust/kona/node/faq/overview.mdx create mode 100644 docs/public-docs/rust/kona/node/faq/ports.mdx create mode 100644 docs/public-docs/rust/kona/node/faq/profiling.mdx create mode 100644 docs/public-docs/rust/kona/node/install/binaries.mdx create mode 100644 docs/public-docs/rust/kona/node/install/docker.mdx create mode 100644 docs/public-docs/rust/kona/node/install/overview.mdx create mode 100644 docs/public-docs/rust/kona/node/install/source.mdx create mode 100644 docs/public-docs/rust/kona/node/monitoring.mdx create mode 100644 docs/public-docs/rust/kona/node/requirements.mdx create mode 100644 docs/public-docs/rust/kona/node/rpc/admin.mdx create mode 100644 docs/public-docs/rust/kona/node/rpc/overview.mdx create mode 100644 docs/public-docs/rust/kona/node/rpc/p2p.mdx create mode 100644 docs/public-docs/rust/kona/node/rpc/rollup.mdx create mode 100644 docs/public-docs/rust/kona/node/run/binary.mdx create mode 100644 docs/public-docs/rust/kona/node/run/docker.mdx create mode 100644 docs/public-docs/rust/kona/node/run/mechanics.mdx create mode 100644 docs/public-docs/rust/kona/node/run/overview.mdx create mode 100644 docs/public-docs/rust/kona/node/subcommands.mdx create mode 100644 docs/public-docs/rust/kona/rfc/active/intro.mdx create mode 100644 docs/public-docs/rust/kona/rfc/archived/monorepo.mdx create mode 100644 docs/public-docs/rust/kona/rfc/archived/umbrellas.mdx create mode 100644 docs/public-docs/rust/kona/run.mdx create mode 100644 docs/public-docs/rust/kona/sdk/examples/custom-derivation-pipeline.mdx create mode 100644 docs/public-docs/rust/kona/sdk/examples/executor-test-fixtures.mdx create mode 100644 docs/public-docs/rust/kona/sdk/examples/frames-to-batch.mdx create mode 100644 docs/public-docs/rust/kona/sdk/examples/intro.mdx create mode 100644 docs/public-docs/rust/kona/sdk/examples/load-a-rollup-config.mdx create mode 100644 docs/public-docs/rust/kona/sdk/examples/new-l1-block-info-tx-hardfork.mdx create mode 100644 docs/public-docs/rust/kona/sdk/examples/p2p-peer-scoring.mdx create mode 100644 docs/public-docs/rust/kona/sdk/fpp-dev/env.mdx create mode 100644 docs/public-docs/rust/kona/sdk/fpp-dev/epilogue.mdx create mode 100644 docs/public-docs/rust/kona/sdk/fpp-dev/execution.mdx create mode 100644 docs/public-docs/rust/kona/sdk/fpp-dev/intro.mdx create mode 100644 docs/public-docs/rust/kona/sdk/fpp-dev/io.mdx create mode 100644 docs/public-docs/rust/kona/sdk/fpp-dev/prologue.mdx create mode 100644 docs/public-docs/rust/kona/sdk/fpp-dev/targets.mdx create mode 100644 docs/public-docs/rust/kona/sdk/overview.mdx create mode 100644 docs/public-docs/rust/kona/sdk/proof/custom-backend.mdx create mode 100644 docs/public-docs/rust/kona/sdk/proof/exec-ext.mdx create mode 100644 docs/public-docs/rust/kona/sdk/proof/fpvm-backend.mdx create mode 100644 docs/public-docs/rust/kona/sdk/proof/intro.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/derive/intro.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/derive/providers.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/derive/signaling.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/derive/stages.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/genesis/intro.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/genesis/rollup-config.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/genesis/system-config.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/hardforks.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/interop.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/intro.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/protocol/batches.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/protocol/block-info.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/protocol/channels.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/protocol/frames.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/protocol/intro.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/protocol/l2-block-info.mdx create mode 100644 docs/public-docs/rust/kona/sdk/protocol/registry.mdx create mode 100644 docs/public-docs/rust/op-alloy/building/consensus.mdx create mode 100644 docs/public-docs/rust/op-alloy/building/engine.mdx create mode 100644 docs/public-docs/rust/op-alloy/building/index.mdx create mode 100644 docs/public-docs/rust/op-alloy/glossary.mdx create mode 100644 docs/public-docs/rust/op-alloy/intro.mdx create mode 100644 docs/public-docs/rust/op-alloy/starting.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/cli.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/config.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/account-storage.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/checksum.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/checksum/mdbx.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/checksum/static-file.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/clear.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/clear/mdbx.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/clear/static-file.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/diff.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/drop.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/get.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/get/mdbx.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/get/static-file.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/list.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/path.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/repair-trie.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/get.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/account_changesets.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/account_history.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/receipts.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/receipts_in_static_files.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/storage_changesets.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/storages_history.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_hash_numbers.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_senders.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_senders_in_static_files.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header/block.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header/path.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/stats.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/db/version.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/dump-genesis.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/import-op.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/import-receipts-op.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/init-state.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/init.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/node.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/p2p.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/p2p/body.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/p2p/bootnode.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/p2p/header.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/p2p/rlpx.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/p2p/rlpx/ping.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/prune.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/re-execute.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/drop.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/dump.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/account-hashing.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/execution.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/merkle.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/storage-hashing.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/run.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind/num-blocks.mdx create mode 100644 docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind/to-block.mdx create mode 100644 docs/public-docs/rust/op-reth/index.mdx create mode 100644 docs/public-docs/rust/op-reth/run/faq/sync-op-mainnet.mdx create mode 100644 docs/public-docs/rust/op-reth/run/opstack.mdx create mode 100644 docs/security-reviews/2026_03-Kona-Spearbit.pdf create mode 100644 docs/security-reviews/2026_03-PolicyEngineStaking-Cantina.pdf create mode 100644 op-e2e/actions/proofs/end_of_source_test.go create mode 100644 rust/kona/bin/client/tests/trace_extension.rs create mode 100644 rust/kona/bin/host/src/kv/directory.rs create mode 100644 rust/op-reth/crates/txpool/src/pool.rs diff --git a/.circleci/continue/docs-ci.yml b/.circleci/continue/docs-ci.yml new file mode 100644 index 00000000000..d31d8d80709 --- /dev/null +++ b/.circleci/continue/docs-ci.yml @@ -0,0 +1,124 @@ +version: 2.1 + +# Docs CI Continuation Configuration +# This file validates the Mintlify documentation build when docs/public-docs/ changes. + +parameters: + c-default_docker_image: + type: string + default: cimg/base:2026.03 + c-docs_changes_detected: + type: boolean + default: false + # Passthrough declarations for setup config parameters. + # CircleCI forwards all explicitly-passed pipeline parameters to continuation configs. + # Without these declarations, manually triggered pipelines fail with "Unexpected argument(s)". + # These are not referenced by any job — the c- prefixed versions above are used instead. + default_docker_image: + type: string + default: cimg/base:2026.03 + base_image: + type: string + default: default + main_dispatch: + type: boolean + default: true + fault_proofs_dispatch: + type: boolean + default: false + reproducibility_dispatch: + type: boolean + default: false + kontrol_dispatch: + type: boolean + default: false + cannon_full_test_dispatch: + type: boolean + default: false + sdk_dispatch: + type: boolean + default: false + docker_publish_dispatch: + type: boolean + default: false + publish_contract_artifacts_dispatch: + type: boolean + default: false + stale_check_dispatch: + type: boolean + default: false + contracts_coverage_dispatch: + type: boolean + default: false + heavy_fuzz_dispatch: + type: boolean + default: false + sync_test_op_node_dispatch: + type: boolean + default: false + ai_contracts_test_dispatch: + type: boolean + default: false + rust_ci_dispatch: + type: boolean + default: false + rust_e2e_dispatch: + type: boolean + default: false + l2_fork_test_dispatch: + type: boolean + default: false + github-event-type: + type: string + default: "__not_set__" + github-event-action: + type: string + default: "__not_set__" + github-event-base64: + type: string + default: "__not_set__" + go-cache-version: + type: string + default: "v0.0" + +# ============================================================================ +# JOBS +# ============================================================================ +jobs: + mintlify-docs-build: + docker: + - image: <> + resource_class: xlarge + steps: + - checkout + - run: + name: Install Node.js and pnpm + command: | + curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - + sudo apt-get install -y nodejs + sudo npm install -g pnpm + - run: + name: Install dependencies + working_directory: docs/public-docs + command: | + pnpm install + - run: + name: Validate Mintlify documentation + working_directory: docs/public-docs + no_output_timeout: 30m + command: | + npx mintlify validate + echo "Mintlify Validation Complete" + +# ============================================================================ +# WORKFLOWS +# ============================================================================ +workflows: + docs-ci: + when: + and: + - equal: ["", << pipeline.git.tag >>] + - equal: ["webhook", << pipeline.trigger_source >>] + - << pipeline.parameters.c-docs_changes_detected >> + jobs: + - mintlify-docs-build diff --git a/.circleci/l2-rpcs.json b/.circleci/l2-rpcs.json new file mode 100644 index 00000000000..03a826816ad --- /dev/null +++ b/.circleci/l2-rpcs.json @@ -0,0 +1,13 @@ +{ + "op-mainnet": "https://mainnet.optimism.io", + "zora": "https://rpc.zora.energy", + "ink": "https://rpc-gel.inkonchain.com", + "mode": "https://mainnet.mode.network", + "metal": "https://rpc.metall2.com", + "arena-z": "https://rpc.arena-z.gg", + "swell": "https://swell-mainnet.alt.technology", + "unichain": "https://mainnet.unichain.org", + "soneium": "https://rpc.soneium.org", + "world-chain": "https://worldchain-mainnet.g.alchemy.com/public", + "base": "https://mainnet.base.org" +} diff --git a/.circleci/scripts/check-l2-chains-sync.sh b/.circleci/scripts/check-l2-chains-sync.sh new file mode 100755 index 00000000000..7a4b2f7bfd4 --- /dev/null +++ b/.circleci/scripts/check-l2-chains-sync.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# Checks that the chain names in the scheduled-weekly-tests matrix in +# .circleci/continue/main.yml match the keys in ./circleci/l2-rpcs.json. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +L2_RPCS_FILE=".circleci/l2-rpcs.json" +MAIN_YML_FILE=".circleci/continue/main.yml" +L2_RPCS_PATH="$REPO_ROOT/$L2_RPCS_FILE" +MAIN_YML_PATH="$REPO_ROOT/$MAIN_YML_FILE" + +json_chains=$(jq -r 'keys | sort | .[]' "$L2_RPCS_PATH") + +# Extract the fork_op_chain list from the scheduled-weekly-tests matrix block. +# Relies on the block structure: the list appears after `fork_op_chain:` and +# ends at the next non-list line (e.g. `test_profile:`). +yaml_chains=$(awk ' + /scheduled-weekly-tests/ { in_workflow=1 } + in_workflow && /fork_op_chain:/ { in_list=1; next } + in_workflow && in_list && /^[[:space:]]*- / { + sub(/^[[:space:]]*- /, ""); print; next + } + in_workflow && in_list { exit } +' "$MAIN_YML_PATH" | sort) + +if [ "$json_chains" = "$yaml_chains" ]; then + echo "OK: $L2_RPCS_FILE and scheduled-weekly-tests matrix are in sync." +else + echo "ERROR: $L2_RPCS_FILE and the scheduled-weekly-tests matrix are out of sync." + echo "" + echo " In l2-rpcs.json only:" + comm -23 <(echo "$json_chains") <(echo "$yaml_chains") | sed 's/^/ /' + echo " In matrix only:" + comm -13 <(echo "$json_chains") <(echo "$yaml_chains") | sed 's/^/ /' + echo "" + echo "Update $L2_RPCS_FILE or the matrix in $MAIN_YML_FILE to match." + exit 1 +fi diff --git a/docs/public-docs/notices/op-deployer-upgrade-deprecation.mdx b/docs/public-docs/notices/op-deployer-upgrade-deprecation.mdx new file mode 100644 index 00000000000..e39440052d8 --- /dev/null +++ b/docs/public-docs/notices/op-deployer-upgrade-deprecation.mdx @@ -0,0 +1,33 @@ +--- +title: Deprecation of op-deployer upgrade and manage commands +description: The op-deployer upgrade and manage commands are deprecated. Use superchain-ops or the OPCM directly for L1 contract upgrades. +lang: en-US +content_type: notice +topic: op-deployer-upgrade-deprecation +personas: + - chain-operator +categories: + - infrastructure +is_imported_content: 'false' +--- + +The `upgrade` and `manage` commands in `op-deployer` are deprecated and no longer maintained. OP Labs uses the OP Contracts Manager (OPCM) for upgrade and chain management operations, and will focus `op-deployer` on initial chain deployments only. + +## What this means + +* The `op-deployer upgrade` and `op-deployer manage` subcommands are no longer supported and will not receive updates. +* `op-deployer` itself is **not** deprecated. It remains the recommended tool for initial chain deployments via the `bootstrap`, `init`, `apply`, and `inspect` commands. +* For L1 contract upgrades, use [superchain-ops](/chain-operators/tutorials/l1-contract-upgrades/superchain-ops-guide) or interact with the OPCM directly. + +## Action required + +If you are currently using `op-deployer upgrade` or `op-deployer manage` for L1 contract upgrades, migrate to one of the following approaches: + +1. **[superchain-ops](/chain-operators/tutorials/l1-contract-upgrades/superchain-ops-guide)** — recommended for OP Stack chains managed by the Security Council, chains with the Foundation or Security Council as signers, and chains requiring a highly secure upgrade process. +2. **OPCM directly** — for non-Optimism governed chains, you can interact with the OP Contracts Manager directly using your own tooling. + +## Resources + +* [superchain-ops upgrade guide](/chain-operators/tutorials/l1-contract-upgrades/superchain-ops-guide) +* [OP Contracts Manager reference](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L1/OPContractsManager.sol) +* [OPCM design documentation](https://github.com/ethereum-optimism/design-docs/blob/main/protocol/op-contracts-manager-arch.md) diff --git a/docs/public-docs/public/rust/banner.png b/docs/public-docs/public/rust/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..af7316880ff0c297225e53f0515f4082497af93f GIT binary patch literal 207466 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

lGPEk1a+2&S$#;MB|aM>NP{E5 zvkKd2>^8i}{Rqu6Vh`~uyvJU!-;402SB=^!P+Q7eOLQC^F481Cu_3}P9Fja^Qk}X3 z1ojK7NyrE*{Uf*8Bs7M2el5qZpcTL0^|z)|uf&M3wTe_I1BjLpSOTdkW%PrFqxel8 zAGT@2F|{EaTvU{_70HK^ak3tb{G4 zBl)qttQE`|8lS5R^T3Z&3oay2-&ZmhpfWX_Vl19QkWI&d6Z;18i1#hIY0B?=dc~_nQW|Kjb$pn8DQ6WUl&e;y#b2_XMe$WBWK$QL{lqNJENG zeK>0fD;Gk~g8Eo$o`1hi>({T7uAh&Xh*ER;YWrgXhk+Y1qYkf9 z{&w?`|BeFj?c^SN3WrZMz&!=~?nR`P8(0!-KYZKpuI|2fetmdwAiuYCuZ&~Bq3mQ2 zD`I&lwH0)FIKK!eAcI4L1Bdnki8KMMo5L3~n0)EyUTL@QowCF6OjNHM9+@d^ZG`6A zVZ=xEc>(42pgUo9S!QSpazKJby4AZMjWat7{nm=@3349_h8e3VYb+{nZ``k7T_nXL zb*vZd=;wDk!|8o*j%fY(jn{maGkyLu(-FUSbio(-eWaZK)*}8NGPLK1%O5YQD7Wj;eQkkSqAc830Vc5 z{6%tx^Q5aDh3B_v&uIE%W(b{Qr7ntC^V<4M4+Q88pEg@xU2HrVwY)T`p#v51l_z7H zK0lOT_RdMf6H9@F+)<#qs*IU}stieUb84Pf-r2R(#P992RnxRu?ZJdIHqMJ%)XHXseq`J}|6LOp&`2IEO@4o84acXqr z_gTaI;@WgdMAoGzumcNZ7~56a?q-y4*YMtM^BB{t8;la=C@?n=%4!?!l3dSpg^~EC zP^{I{7iYNX`QmSIF28a>sTo$xL))$ig|>C%%VF-Kc!C(CPmZVam)eUeo)q)5v`7X&^sBADonoF-=-jrF&@hPlbx^~FGfk_-@znTm3v<}~PnQR7RW z*PEFRVO9;pahgN-WFw3?2$i!&)H(!OILm#FmPjY;JMRMN;b1fVGffQtOPKVm{XSV& z!1eDuxWatmZ#*FsHBRLOY5g|YE#mA6B>EgznOj?eyI!jq?73zz7~xo*v4O%R3_eow zG{|)ly(nK)8rRnF?uQ2PI6?i&^@Kc7skiAvao+bg(Uv0@${$QEi6ypqkBYA7GQIG$ zB7ThhPLkiiRPRQbmg9i|AAQ{Wlm+X48Dz+5h>9G>M6FoyAsi%hlAvPOO`&=xH)e;h z|NN&aw z%ncMoqvg+og4jM}SCoV*Wu&Yoi-9Zd(ff^+jDtKP?^Su5IzvMOWlUUqUV`>pE~?A$ zNv46W1c(|D5an2y6i;k0M}pccvKAY^3(96adcu zkqO8n?6nIiUn3ol1uP&Ey9$(=Zb*ctYwo!&h04$$2QNxX6%iunX2_=bhk*s2NG2a2g40AY zEKd2VbdY!J1k_fZfoOB64y_nw(GIc|M%p2qGP)H147nF@h3o7zvJF+8i5_+e>7cjN zhGKT$>xgU7qD3(8lBMX)J$~Q$x6$D+vCVb~nZ@3TfHq5_T%4Dw;2`KU8~D@|g!1ab;hQ6AVt0uCESRNtz~X zFmKU8W1ua3eI`ILsVrh9Q)b_Hg$d}wL8p2wEqt^ZM8qm+HwX_SO_cz_D^jqG{LJw# z!YN?`2Pci11<)a|r&WTTD@qUlJaD2Qr^;HwnbsOB{1+5-=QnXJs!V0&;~Uck?Z$%SM4`u~rQ7#d@>6rlG%${f`}*aX8bKeruU zMnb&2=K{l{8IPff88&_2J^cE+Sy$MRmVxe1I}svpobBaY2eD@Zq68T@i`6>-9n#Q#glzMR*hNqkh~vnR-2rFZSpLG#1*SBNDsdlX zo_nNjfIv^LyElG!A(@07-%RBY=bkOOY|27t-x0*|OEG{117a4tfLQR9Q#3|Ct-;s? zZw9C^aD4s5cs3jrtZum05MJAS4u#TFBx^YL4b=c|w6SORRjCGOTbDQ6awla1oC9|tBZt5n17}wOB{7Kv zmsG+)c3(=Vn`#A)23aZk~d)2*1+{HJyJOJ!)2?%w1?x};M~rZ5EIp)V^i9879a%lmr;OZsHut>j(tI? zZtO8)(ol*`GLg#rSO+Eu7gyQF6iTN#em_OQ7m>Q>9NeRn=%2?pc|m+r+ogbd(}MU9 zJ8l+Z-{vtjD2T;Y<}PRI+K&|lW*yG~5^=&C!99DXpM!2gg zRz5ThSS*IVO#3%p9f!G%gfZ+Cxz`u1;l+Q>d7FWsT$eVTkSbhlQVD3i#0V76)Wj*x z03q@7)B;rEj0(R|5)v>}CBNbi0|_K>!^+>91{NNE7#3uNS$0bdo#-Op=~3K4!qe@U>BYZ!sxXCTRLUT9`KG>M%GNYY>7$n@bieoOI61@5mUL}2@+8Oue3 zv0@$Aw(~b8L~DTIHawag`$qSQAnIDt8hC#+I;bhpXHpmOS(jY;VjbyQ>*ABeFxN08 zQJ+7FdrO;Sp!wZf77JmWz-@(=_0ovFG7$ZszeAU zOlj4_Tb6V*W-O?PDJXEZBWNDB%N-7STSAm*CR<0b>HI!|D_9FzgWX%pV*}7`V0h~y zcUWy-89$j&t>}uphpHbdc1E{7v34d z3#rO1AVQ|ZS6LRAY2k?B`B$@Uj*a}gY1N5|X7DDy^W{g|jXLS+I`{F_@|hBR`&o4} zGUHEhG9zsmIOvp7&|j-zU-f1K*;0Wm(uuGJ_+!@TIM_Up2DpU_JSM zJXJ){)2Kr&IipDb8RD1bI(IwyskVx8)7f|J;xqHyuR3y1fuO?V1~oBbYDM%@DT+;Y z?;1BO$SpR7rMa+sGL{zCXED8zh)J|m14X~+`IliKNYr;^ukUv0eeB>|Yg@)==!#V? zaXi^-mQl60usU8U-HCkBfJW&lT-%T`DnZmE?|RpAK}cvwZrxPaFQJQEj`&`=KCu04#dB~ zcP96Xz*cvR?^B|stAR4bfo0U$2D(tyK7R@`S}mcZM)T9H>NjCy;I%MAlMu*htqphk zU3L8ErUKS5isP?(yCw5d!_W86#53H_BwPp^2&e>epRfvXXAL(9hNM0fv)rjUwkkWTo+60wo; zvWL0L1en|BVxXxT5wl645S*wPMT8DglR&`BR;1Rs+JO_lv?BD zgNo_&p2R-bhO7`?d_qejp%7jZFQ<(R?1-asEf2jwCi5wE2>6Rgd+FA&IV{!fQ~q~u z+#EpafIWm{IObAlAI8umYy)rBUgDRP|26{2&SRH7MY29A<~*{U^?PX>Z6O2RSH{XJ zdA-{E-wiD%4LQ8PUHRAp^%dRtjh;8moJ3{^3Fc7Gey|n$(Jq<*{?dnOaKSszY%7ZJ z4qJ$oP^#}9E8aKDvVtVKWt2NHiniZ_R{11w5;mXXkb^(ov~pIgNiTWPF3~}(Wao+r z_cpcGynt0NrBNSxN(BadkNu2=n>70mUMC2CW{89kR@tPW4Z(CK)Cgw|nRvqPG-aP1 z4z_n5B? zBtEv`HMl?WM#aFVl1y;}@0D=BLe+myyFwi#^dgJ=4h$6G5fV1Ke(MUTAPDt|v(fkG z7DjACk|%XOc~v-UPkDhl!Y1n`knMwh6s0sq5=n(o-9CFhVKs~LPlMejlk;4G_0a7H zN(I#8#w785?4mqU&){!JZpQ0AhpGEq7uj!Je6C6V4}f7yQ2-47TLfeLw|cj;Q`$l7 zZ#GsV`0u4Gf3^LZ{T!LQ+G9akrhp${$^r6+g*W)i~eeTAt{RUDoR_`x(*n2_` z7Y72~H=gBOKepwbH_A7Ybs?q}mQ3{rHKrGjg3ZV9{KJ- zEb_$8YPG#ND>*U!O0s=;2NqY`aB`^$jhSW&6~!(WAUwR9qN6cB)eE8cB4*v8tK4Ld zjC4Ug$HeIyh|fE)YMuvJ(54I1qz}<_w=b-OWMU$p9@y58Qt*ac5E&+2%W>92s0|WF%hLlrFB;h=vQRQF4#;6WkaoH z)F)pffNkD=A;tTF|8oo;+CA3LqdHDvA^7j=*D6Vt$0l(~V^UvVhku_oDd}j)2@m0^ zL95rK3sbeSha4ZoMh9Evnj!LwPBC2QPa2}FOhGUFk;xf41ZLXs0>{wxqx!8}X@sc$ ztxV4Qqr1WM`qJpJ(+vnAkaUa916M|k;Z?MP=!^!rm`=OC8aTH?BE-cPr|bSn)YEmW zW%IewJFhnY=Fjes&$=R(Z|wt1obDx?TVFAAa! zP)A3F?Pc)w)0o$?%SAK!Fg%Um$=(Bp)(pA(`IJ`iqd7r%n{J-y_(Xy9t5HV8^T0bx z1kbZR_!m8t1d^VWxce32{nt-qdH+p%ypx{G_v`MbL;tr){ZfS-}8_3-1Q^WEHHY|W7THBJViGM#`wAeXz%=Qzq?WyGHpQsGKr(J5R6HTnwD9pNb> z{A2n|kv|nMBnR(-vwu~?IWU%b2~4|h1|!Sz!KQ>sp2WIM*8c`188>#l*yf1q^G&vZ zPv7oF0%>$%$i@j0I4{!&&F(^p4iu&#vTzZ|y!2(Q)D^BcCUFq;C^SMedpY@)iE%ds^7;pVs>>E|^`YnD zT9Sw*H{%5*Tm#vo9B6+3V6^cINwyu~p7{|Ihb%`Gs@~9I0DKMRkBHnX)57Y(&)W`5 zn5RZIwH#0A>9()yFFp^#7@fG*EsJEXZzRe_^zHGiv>EOBWbuUrUZsa|cYV+8xxK9J zA9zpOZ@w2hZ#c_kIt02D8e-X_&@I!HWnk3YC0^oCQ3XM4uKA4wN;3t9duNu!qLTR`3i`f;JRM#rO@XOJrUJw}O(Qq2 z6Fs3@`foIPD+;re&d0b~z#5HG_;hRIVFBz{WYmDMlkn1pDd_`kJ5GkqN1ke)JrAbj zVSxG9N&U|n%qH7*a(`JEOP3bs|M z1N*(_%gM>nKJ}eysljg3b#By*|=>H7J8j}hTF zPNO2}F)>rYS^boVx2XOtjey8XJK~0K%#qOFnZqEu^ZB~{vfrSU4qm&bR}`n&W(_q* zZ{O*ikiI9eb!>19c;hwmvO0Hc`z>tm&7Bb6{*NMMDE2>!)NN6$LXNZ3HTuR^;h_NA zZDHy}I(_?%E%ris_u~?UIrLY>5_+G#A6(3ZFcTNJawSQs?0~E}vvRFb2aJmy44_G2JcetsZyUU{QQkUG`rYfORkL&$6zn`wCO1Ij}>rlzHoK!u20>xe(H9a8FPXO=3pml!eV&e)T6bUNWZK zeOm?{CzGbLlDRT>tPnoJAq!PI@7-yR%Ak-vk?wu_?A!|2#BNPvwgEeSMot>{vfRq@ zFkF$nNZ6_DqY|VNoVprZS_r%WrC~HTrBfbzKgP!??(>{#z`Ahw?qq8Z1f%zswZS28 z9}pst8G$bdbtbDin1#<>kw42ySUDCwN;0gqqQRV)=-(RS&H1$-{?J$#S6lRcLP|8l zjuJp6r;K_0eRLN50tuK%Jk2S`1~p5Fw~CEovp3*!-4yv|$k_K<_XhrNr6wxyE^Tb+ zKD$Z)8-+_78o!2~yoBk+W8RF=|M`#Y@4bcm;VduQx~rCYs&d+dI0B9Ifs>2C-oX_- zOC6`nDXxEq$-R>;cMn7;=U>KYzwix456bOrdn357dY#OwxaZs7gVkFn#-HLVu=9BA z^#ig8JK2O>pJ(R{$06vw^G!pKKh$TQeL|WE6-hj=GL;k=M3)g7-qWA<$D?;5lY^vl z)`gWQ*vITjs-f;Aka{kG@=?p6ifxp4(}1+y32sE!sGx|MNE}F@`4)@TWjsI!FTVM0 zt>xrLC_Di85LF7wam9`b@Hf>FDa>e*nI>$&&@Qj&)I095nFyhgb9pZA6V!6UsSMm_ ze#C$CGbkM>WQxCD$)3_(^t~RAJ+J#5=kKwfxKH>W+OG5eaK)wJHSOCeXKlOT<$%J~ zo7C3NI{zhWy=T^#WZ%~rarD0f>MjhNPW)o734|Nx#UvFNz2bNw`Rn+I zB=Y)pI`Cagz?-gaXTIJqu6Y!5g@Q&^una@PNo_~qD z(X91c(Y(|qp*9483OEsR>4wraL9OZV2`0b$&xuGEPYiyl_+wrlyq28m}A+uw7pRWok4ZBQ9ETEb}27+VZ+UJWK9wB0M{5rj0C^A3db74FcWk^o7k@mI% zmTm!TVEPUrmE*omQ4Y>VZu+7bQzU{^oDxllMW^PYb;2-T6XVHti299 zPpttT58xvJ%c=)~Y7h(o*8AIPi=EU~e#7-`W{Pt!YsL?H;{PM+9N04fwq+gLHYb{i zZDV3gY}>YNO>Eod7u)z^+cxezXPXvoYt>LmAPYc z5(^=@4|UtK$^C#(8VU?-BO}SBwqMy~i=H8H!1uwy&YFj zA1{T(1C?+XBW4wK>gbp0@J3G#T`ig@#t$$q-At_ILhKq#v?Ph<#>{x+%9x1Nr{FA_X7{Up7}QlIm$M9qu8pUWC8CDH z{JwY9@#9&hEuyB>N=i`D6zg(z&XcoYxb66jSe(TG!6mRE1*I+`ier9c12mUJJPM+J`stQ)exTHjW8D1#6%C~fNhd!^-;ViLAw@lXDQ;FeHZl>S$MGJzJ(;|AWT5{;_c63+FJL8Y1+G^eFDt_IPi z6!+`H&J)#IeRE!Qo>Fc+#nc+baK!v8B2o_u9S>pW$v@N!J~yR@jVrnNy%JD+S+Udf z><8xed>hw4hG$97HcFWKrj53bdzgUbWBcUgDH9ISDXboY=j%4`Y=4iLx?gvOK~IZS z!~_#gZqWf(S%e0_R66C!#;`rp4t~~gBUH8KMS%Ka$`dFy&dRgcK`;H- zBf=~N&8FG>OK0IlM2Ad+ohk^jMLyeYxw1(;!~gF zZ{E|>U4qftsmU-oi-0bo|7D5a?o+&@yQl&cS%hiDsv2(F^*Jj-k88gJ7ic4Af{^^r z`GCZS1^NFAR7(E0JK0~Yye*GYh*aL^Z-uex?;TNFzvFoCjZOcSM%=%5?reSisk>ZH zz=A#(#~my+H&$994mE!|WHeiVdYC*9n5znM-}A4^Hm7jRqi7mbfd0J=Ug=qOoiV&c z^_<7P1Tt01cwA?4!skMMXN3)@U4?Or1JJ4n@i8pJvCvf)T~aB(GC2Cr9@*ep8d@Jy z4~JRd&~xlYcpHCat9yU!s(bhEQcs?X&Za>T5`p0%Db>{CgedCvg!^ETqjm(kULakX zk|^Sve`qJV3i~9dm?(|mCB6^-Q^kixB_KN;LhnnQ=jqGMfi%q4&Cvo%%al%vVaJ}{Vj{`GvM0T z*L=A%M;z(C7I7bWrx&S+0-B|nC%kI5gK0UTwH(#N_+m=SlBcLZU=RU{Es^PLFn3Uh z53$I5{Q-vhVZiPp{7SA5`D zJ1NtIiWo|O!VLIw6MzEjE=w@aHa8g}jInh5<TZLi_kXqx=$5zDP*2w=Fi1=m{hv!`pO z%&T6T&p-w-nS?|Lj>vAGvzN-+jfUuV@v2eI=egJfcGqpmNNco!-^l-182|Y+zFq&T zlSRG&>cevCJ%F>RW$FAcUGUq&Gd{=b=FeF~5L(0`pF#Mj{2wTzC;UZ9xUkNzQy}Dw z_0<}EUF0c7OVV+{sGh$$GDvF3as3!Izh&TP!{DS)1TaEf(Vx^YjWQ+buFHimJXxq~ zG{e8(bwfXxpo3&pcC38~($YjVnYEJPZO-$?G5#jtKS3gmh{>{#3H?dzM1I&6~8N!|`{ikNW_+`33QD91X-0itB<1jUE7t ze=9DPV9|*$t@YHM;CZ~U{;V#B+7-j#&`BREWN7{1o&N05g7+QrRdY6^6!BRKn`Y#(|fLQK3M3=YtzQhk(vre2g!nTZTE&7hY z_;iG^)eF(2+A&%^0igHO{mWEqPe@WUNbUJ_L7YmlP?Y|lm}0~H%UV&~QF`rwfc8D1 z0)Hx~-o8>|1;uHy-uH`5>z)L5FZ%UPl$%cMwdDNKG9h@~+Z#9tAl-f#@7YbyrD#jb203BQ{B-nDwYv zJDy<)#n2l!+X8cHQQJPG%yxMA(6wYJ>utSc=;lO2Tk|rG6Y~*1J=b?ur`~h+^@pF( z(EnO9_P(G0`wgnQO^WMXaCbbf2_o{k7?Y;_HGR&}{ZQ;Q?K6Qt_O>5qtlBNK;pG=L zjBF=bXH@EJPIm+D*L|cPN&MvMLHg0YsqQlm_3uj{Sh3shtgSHhfqpzNJ3HN3z-;KR z%-gmvi(t1J^vNS}Sl--bN{ZF><&L52_@m#Fa5u%wzup36CX|N17Wtt*SS1uh>cwE8 z_=fVV3`yR|ew|wUC;iV4ZkFtRz#ZsARZg7PNL5(6{H@gl$%09db{xkLH1AMk{$=~U zx^az=CW$@-$h7Ifpj>ynA0k9(ehkTjQy=o4%`G#Hd$z|v2S4co3vs?Zt*`4Z#vXa@ zwY3m}6QRn0FEN-uSpBDXN(FXHXk9*DJE`NNr7}3>7&0&Vf4r?<2o%sr5Wv1zAWiRs zyoYvmtN}Hh=E=X(s-URhTa88rnurU|AeB^Qn4uaV!JYo;2!toX&slPl8tlkiQGJF) zAC`!H#*mMnCUu_Ry5xdm@<#H2<1FO$*jd5!R+mRuD#NK=e22;U%vmP4nq=6C*JVm_ z1N?Ove_W_*D~0mi3i;1p;&vTKsZ%qCnB~HUlnV`m>epj?yGZV}#0d9oj)TJuQCmUC zK6^>}-uw~2r#a!4m6J5&jy9 zF#n(e(Aq~#UC6tG@!$o^^#F zu{ng<>^^-RzD(BoMrg~o5&+c;7yxAaG{rXZ`}lTkFbtcwtkV}v2?4*fBv{cE#{9I} z?+s&Ytt$%j(0wSea{irhQ-#40;AVJGEFU)%NV;nqCMEMzjnK#bso6e`AKE6=(4P>Z zthWfiK?Cfpk&&sue=LY-y9~IW?-j+m>cvS(5I+A?t^3W|_1+ZZ4$efFn6|Dsi4zeR z-HihN2R}3$iy>@lBXVJfR!xtie3SG-v9kJDrpanP*ewQp8yzII;uCo^jV<-xSbz;u zzc+O7q?jNkx|Xl}!1uApp$&pdj(mLr-&e+Qrgw|C?={TpyObuaqeEo3S%eoe3&kkT znI}sI*)PDijNq$wrgd`dKEAeqcRzA(yW?2Dysz8D(fmD<>;D?5K8XMODTBoAeOoL( z_4+=}HzM{tT8(3}%yC@iI^J=y^MTLqbVgm-VJY$$xxDf969~-iG~w@+si(dlymS*r zxJ5TJ7=W|pe1-8y!v0AGaNU8gnYj2Zg6$LXRy9NDT2Ls$CFrQNtzgXEm;fwaC;{ zn#^}wC7|W?Bs?N;gQ<#!^a2tYvwYNP?U~6X_|c<4+X+BDn0|IB z__0_CDzH!IMnYW38hX_l%aoq{J{|J#r$SEf*oY=bZvKpbz-q9XtARXF@z?6gbw}Eh zcXTI`xOQkFF<|fUz!9s1yHUNVi1-uUa~7B+q!&s&{f7o3Cc_vOD#<1IFEeju{#6u# zFO>KT@&*vO~6BwWGE-m2Kj#KK9 z(f0!%^3DQw4=C{kxSZTy15do2m`zhQPBJFSEhwcyYzZ3~f*#o1w`sPMTpqPpra7f? zYO))vVGK!vn4y>I(QI>fP&@K#bxH~#RlYLlZyUJlUM!es0A8P;)O`aL(R%c`z$cB& z_e||=N&xM$0yIs+x&ziiECC2yGjsȽw^K_opKO7-s+>D!bUA2fqC1qI5v2Dy37 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�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

7m&+P{inN3Qemds8ojW6T?_Aj*vvQ-?7T`99png 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 literal 0 HcmV?d00001 diff --git a/docs/public-docs/public/rust/favicon.ico b/docs/public-docs/public/rust/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6f6a6fcc06188f295380a7217a34d875eac9b906 GIT binary patch literal 4286 zcmeH~dr(tX9>-4zHxOc81QN*OCILeL7c+p`L7M6m&Ql3YCGfwJ zKz#LWVxDawNpUt;)AS_9>D!IV{jb>%GZv7r04v9&&u9LiTh0m8W-~#4x!hoF=CnXI zLt`>7^@|R(q-7t?9j z8t*8C9ap`4_LoWx2jxEU4&o)N;(1God92GZ!U_5L^BNynLY{~#_K66t{1?mL3N^2V z?z;^d*Ii(lcDimmbhNMMwb6a=goe`sma~nv&(pSn>eo){>$w&1<5EA=ugbmQj$GQ_ z>#697Re3zSS;cEQrsOpj`?}TXeVL|va!E<3Bu_1@FeI8=Mx=@}5P1Is0xyd60)&!2 zh=gxqhTq>%wdyDq$8;ehZa-p!yYR4aA7*LxLd)xdpL-|u)&bUqdUJ8!uWIVQ8Y++a zQ8mAkX4*jawDT)9Z^r@+(|M1+E})qN&Zrgo8cv-RXs? z{do2CyEw3`7l%4tN4fPF8q1Dj$=wK79-8zNIej+*gq`qrZ=s&*q2X0f z%E0orpJ(~IyjcFd&xJA6PG-c9kuY;_20OR^mVE9FXy=W>f5901lP2I}zJV?Tuzi(f`|;!D_=cN}%ae?`&Lhha_aM%l6#5G36Tm5U83 zCKYOrisxk0FMCL&M;UL)bHvlL^`{)ta`uy)ym}@!{hhV5(;O3#%f^skpTHC46Ns>k zp}6ityl~<=_H@6G`AbLe;)!8Y)b-=^s~=*C?=4qUo6jMhEZkX5USq3<*9mkDQoHxvw?qc^On>RrDoSX`p!<}>UD%LAeq+F{wW1lo?TEh z+;6ttxEqx-hUokW#H_l7(Cpg?Tyh%$3&$akxrxxlpCBr81fj`;n6>aDL@aV3=E-5W z2abYo{20@8|At6;vRNiu&q(CEf2R3M1?$QdV$WaWl3nte;c45YqD6&+ugov_WF$8C z#y1aHMqx_-90AE+K$|!Y-^XskJN72Ls26F(7{s$i?}|c(z7`p-La6Se@6uWDC8uiK z#SS8pru>rJuhvdhhLDha5L?MU{>sw78!c=8xj19Z^~zLR|DP7D8af@fV(2aN^1%yn zIRob&&ibHdcJk%U;Fxn({hZz`vHr@48-0)6WPNa#^&S-~N*STN;a9cpX8?JGlosZY z=E6wMTKiUa>*|A|!gWW)C1u^B&9&RydJcziGK=<+b*)FZhNw#gGULTVV%_;p5&L?9 zSlP;ml{@c8=7Hx_9Z4rmJt>^+XCC2@_`?Kv;3cOPm`Y$Of&a4v@LR{%z&O!PGC;%_ pARG$mI!ix0euVb96wWwpza>O`m(UB&(#hYtih;XTzqPz`>^l~_@6-SQ literal 0 HcmV?d00001 diff --git a/docs/public-docs/public/rust/logo.png b/docs/public-docs/public/rust/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..31d76367e4476dbc0415dfc1cbbd10286439fc61 GIT binary patch literal 221318 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 z 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

I<`{q=S&k!6rI=Tq7HY|7N+ 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

iCHsY$r&458FsP(1Z-T}{ycgSHtc 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 + + +
L2 Oracle
L2 Oracle
L2 Engine API
L2 Engine API
L2 OracleEngine
L2 OracleEngine
OracleBackedL2Chain
OracleBackedL2Chain
L2 pre-image
fetcher
L2 pre-image...
Main configuration: chain and rollup configs
Main configuration:...
Preimage KV Store
Preimage KV Store
L1 OracleEthClient
L1 OracleEthClient
prologue:
dispute and
L1 lookup
prologue:...
Pre-image Oracle
Client
Pre-image Oracle...
L1 Oracle
L1 Oracle
epilogue:
output root construction
& claim check
epilogue:...
Program Client:
- stateless
- no temp errors
- no environment access
- onchain
Program Client:...
Program Host / VM:
- stateful
- pre-image store on disk
- offchain
Program Host / VM:...
execution trace
execution trace
Pre-image Hint
Writer
Pre-image Hint...
derivation loop
derivation loop
Pre-image Hint
Reader
Pre-image Hint...
Pre-image Oracle
Server
Pre-image Oracle...
Program tools:
- pre-image fetching
- retry on fetch errors
Program tools:...
L1 pre-image
fetcher
L1 pre-image...
Pre-image hint router
Pre-image hint router
No-op when onchain / readonly
No-op when onchain / readon...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/public-docs/rust/index.mdx b/docs/public-docs/rust/index.mdx new file mode 100644 index 00000000000..fd510d8d158 --- /dev/null +++ b/docs/public-docs/rust/index.mdx @@ -0,0 +1,64 @@ +--- +title: "OP Stack Rust" +description: "Documentation for Rust implementations of the OP Stack: Kona, op-reth, and op-alloy" +--- + +# OP Stack Rust + +Rust implementations for the OP Stack, built by [OP Labs](https://www.oplabs.co/). + +A unified documentation site for OP Stack Rust components: **Kona** (rollup node & fault proofs), +**op-reth** (execution client), and **op-alloy** (types & providers). + +## Quick Start + + +```bash Run a Kona Node +# Install the kona-node +cargo install kona-node + +# Start the node +kona-node --chain base --port 8545 +``` + +```bash Run op-reth +# Install op-reth +cargo install op-reth + +# Start the execution client +op-reth node --chain base +``` + + +## Components + + + + Modular rollup node and fault proof system. Spec-compliant, performant, and extensible with `no_std` support. + + + High-performance OP Stack execution client built on reth. Full superchain registry support. + + + OP Stack types and providers for the Alloy ecosystem. Consensus, RPC, and network crates. + + + +## Built with Kona SDK + +Production implementations using Kona's modular architecture: + + + + Fault proof program for rollup state transitions (~3K LoC) + + + Modular OP Stack rollup node implementation (~8K LoC) + + + zkVM-based proof system using Kona (~2K LoC) + + + zkVM-based proof system using Kona (~5K LoC) + + diff --git a/docs/public-docs/rust/kona/glossary.mdx b/docs/public-docs/rust/kona/glossary.mdx new file mode 100644 index 00000000000..ff0d44862ae --- /dev/null +++ b/docs/public-docs/rust/kona/glossary.mdx @@ -0,0 +1,43 @@ +--- +title: "Glossary" +--- + +*This document contains definitions for terms used throughout the Kona book.* + +#### Fault Proof VM +A `Fault Proof VM` is a virtual machine, commonly supporting a subset of the Linux kernel's syscalls and a modified subset of an existing reduced instruction set architecture, +that is designed to execute verifiable programs. + +Full specification for the `cannon` & `cannon-rs` FPVMs, as an example, is available in the [Optimism Monorepo][cannon-specs]. + +#### Fault Proof Program +A `Fault Proof Program` is a program, commonly written in a general-purpose language such as Golang, C, or Rust, that may be compiled down +to a compatible `Fault Proof VM` target and provably executed on that target VM. + +Examples of `Fault Proof Programs` include the [OP Program][op-program], which runs on top of [`cannon`][cannon], [`cannon-rs`][cannon-rs], and +[`asterisc`][asterisc] to verify a claim about the state of an [OP Stack][op-stack] layer two. + +#### Preimage ABI +The `Preimage ABI` is a specification for a synchronous communication protocol between a `client` and a `host` that is used to request and read data from the `host`'s +datastore. Full specifications for the `Preimage ABI` are available in the [Optimism Monorepo][preimage-specs]. + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/intro/contributing.mdx b/docs/public-docs/rust/kona/intro/contributing.mdx new file mode 100644 index 00000000000..24bfee2f8cd --- /dev/null +++ b/docs/public-docs/rust/kona/intro/contributing.mdx @@ -0,0 +1,65 @@ +--- +title: "Contributing" +--- + +Thank you for looking into contributing! + +Before making contributions to Kona, please read through this +guide and discuss the change you wish to make via issue. + +## Dependencies + +Before working with this repository locally, you'll need to install several dependencies: + +- [Docker](https://www.docker.com/) for cross-compilation. +- [just](https://github.com/casey/just) for our command-runner scripts. +- The [Rust toolchain](https://rustup.rs/) +- The [Golang toolchain](https://go.dev/dl/) + + +## Pull Request Process + +1. Before anything, [create an issue](https://github.com/ethereum-optimism/optimism/issues/new) to discuss the change you're + wanting to make, if it is significant or changes functionality. Feel free to skip this step for trivial changes. +1. Once your change is implemented, ensure that all checks are passing before creating a PR. The full CI pipeline can + be run locally via the `justfile`s in the repository. +1. Make sure to update any documentation that has gone stale as a result of the change, in the `README` files, the [book][book], + and in rustdoc comments. +1. Once you have sign-off from a maintainer, you may merge your pull request yourself if you have permissions to do so. + If not, the maintainer who approves your pull request will add it to the merge queue. + + +## Getting Help + +Need support or have questions? Open a github issue: + +- **GitHub Issues**: [Open an issue](https://github.com/ethereum-optimism/optimism/issues/new) for bugs or feature requests + + +### Crates + +The repository is organized into focused crates under `/crates/`: + +``` +crates/ +├── node/ # Consensus Node +├── proof/ # Fault Proof Program +├── protocol/ # Protocol Libraries +├── providers/ # Provider Trait Implementations +├── supervisor/ # OP Stack Supervisor +├── utilities/ # Common Utility Crates +└── ... +``` + + +### Binaries + +Executables are located in the `/bin/` directory. + +``` +bin/ +├── node/ # Consensus Node +├── client/ # Fault Proof Client +├── host/ # Fault Proof Host +└── supervisor/ # OP Stack Supervisor +``` diff --git a/docs/public-docs/rust/kona/intro/lore.mdx b/docs/public-docs/rust/kona/intro/lore.mdx new file mode 100644 index 00000000000..97ec89b0acb --- /dev/null +++ b/docs/public-docs/rust/kona/intro/lore.mdx @@ -0,0 +1,48 @@ +--- +title: "Lore" +--- + +A long time ago, during ETH Denver 2023 in February, [@clabby][clabby] +and [@refcell][refcell] embarked on a journey to apply the minimal diff +from `op-geth` to reth, creating the first Rust execution client +implementation for the OP Stack. This kicked off a series of development +to bring the OP Stack into a multi-client future. + +At the same time, Optimism was undergoing its biggest upgrade yet - Bedrock. +This upgrade completely redefined Optimism. By sunsetting the OVM, Bedrock +laid the foundation for the OP Stack, bringing Optimism out of the dark ages. +The key architectural change was the concept of "minimal diff" which effectively +applies a minimal set of changes to the Ethereum execution layer (`op-geth`), +rather than a new virtual machine (the OVM). + +Fast forward around 6 months, and `op-reth` was presented at Frontiers 2023. +It took a lot of debugging the night before to get it to work, but it was +syncing just in time. This piece of history was [recorded by the wonderful +folks at Paradigm][recording]. + +For the next year, a small 6 person team at OP Labs including [@clabby][clabby] and +[@refcell][refcell] went heads-down to build Fault Proofs for the OP Stack. `op-reth` +was left in the good hands of the Reth contributors and the community, +eventually being adopted by folks at Base in production. + +Once Fault Proofs were released with guardrails in the spring of 2024, +[@clabby] and [@refcell] returned to the world of Rust to kick off a new fault +proof implementation, this time in Rust. Using our learnings from [op-program], we +built the kona-proof, and [released it at Frontiers 2024][proofs]. + +After a few hardforks and side quests into interop, [@refcell][refcell] kicked +off the `kona-node` project to build an OP Stack rollup node in Rust, built off +the abstractions we built in Kona. It became clear that Kona is more than just +one OP Stack component, but a monorepo for the entire OP Stack in Rust. + +Now, in 2025, [@clabby][clabby], [@theochap][theo], and [@refcell][refcell] are +cooking on Kona, iteratively building out the OP Stack in Rust. Come join us! + + +[proofs]: https://www.youtube.com/watch?v=mkygYH-07Hw&pp=ygUVZnJvbnRpZXJzIDIwMjQgY2xhYmJ5 +[recording]: https://www.youtube.com/watch?v=AVYggka6_2Y&pp=ygUWZnJvbnRpZXJzIDIwMjMgb3AtcmV0aA%3D%3D +[refcell]: https://github.com/refcell +[clabby]: https://github.com/clabby +[theo]: https://github.com/theochap +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[optimism]: https://github.com/ethereum-optimism/optimism diff --git a/docs/public-docs/rust/kona/intro/overview.mdx b/docs/public-docs/rust/kona/intro/overview.mdx new file mode 100644 index 00000000000..1c283856897 --- /dev/null +++ b/docs/public-docs/rust/kona/intro/overview.mdx @@ -0,0 +1,94 @@ +--- +title: "Kona" +description: "Documentation for Kona users and developers" +--- + +Kona is an implementation of the [OP Stack][op-stack] written in Rust, +designed to be modular and extensible. `no_std` support is prioritized +to provide the building blocks for fault proofs. + + +Kona is in active development and should be considered experimental. + + + +These docs may contain inaccuracies as it evolves. + +Please [open an issue][new-issue] if you find any errors or have any suggestions +for improvements, and also feel free to [contribute][contributing] to the project! + + + +## Introduction + +Originally a suite of portable implementations of the OP Stack rollup state transition, +Kona has been extended to be _the monorepo_ for
OP Stack +types, components, and services built in Rust. Kona provides an ecosystem of extensible, low-level +crates that compose into components and services required for the OP Stack. + +Protocol crates are `no_std` compatible for use within the Fault Proof. Types defined in these +libraries are shared by other components of the OP Stack including the rollup node. + +Proof crates are available for developing verifiable Rust programs targeting +[Fault Proof VMs](/rust/kona/glossary#fault-proof-vm). +These libraries provide tooling and abstractions around low-level syscalls, memory management, +and other common structures that authors of verifiable programs will need to interact with. +It also provides build pipelines for compiling `no_std` Rust programs to a format that can be +executed by supported Fault Proof VM targets. + +Kona is built and maintained by open source contributors and is licensed under the MIT License. + +## Goals of Kona + +**1. Composability** + +Kona provides a common set of tools and abstractions for developing verifiable Rust programs +on top of several supported Fault Proof VM targets. This is done to ensure that programs +written for one supported FPVM can be easily ported to another supported FPVM, and that the +ecosystem of programs built on top of these targets can be easily shared and reused. + +**2. Safety** + +Through standardization of these low-level system interfaces and build pipelines, Kona seeks +to increase coverage over the low-level operations that are required to build on top of a FPVM. + +**3. Developer Experience** + +Building on top of custom Rust targets can be difficult, especially when the target is +nascent and tooling is not yet mature. Kona seeks to improve this experience by standardizing +and streamlining the process of developing and compiling verifiable Rust programs, targeted +at supported FPVMs. + +**4. Performance** + +Kona is opinionated in that it favors `no_std` Rust programs for embedded FPVM development, +for both performance and portability. In contrast with alternative approaches, such as the +[`op-program`][op-program] using the Golang `MIPS64` target, `no_std` Rust programs produce +much smaller binaries, resulting in fewer instructions that need to be executed on the FPVM. +In addition, this offers developers more low-level control over interactions with the FPVM +kernel, which can be useful for optimizing performance-critical code. + +## Contributing + +Contributors are welcome! Please see the [contributing guide][contributing] for more information. + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/intro/why.mdx b/docs/public-docs/rust/kona/intro/why.mdx new file mode 100644 index 00000000000..ee0163eb7ce --- /dev/null +++ b/docs/public-docs/rust/kona/intro/why.mdx @@ -0,0 +1,45 @@ +--- +title: "Why Kona?" +--- + +Kona leverages the abstractions of the Rust Ethereum ecosystem +providing a modular, extensible implementation of the OP Stack. +By re-implementing the OP Stack in Rust, Kona brings the +superchain into a robust, multi-client future. + +## Abstractions + +Building off learnings from the [optimism monorepo][optimism], Kona +is trait abstracted and customizable. Entire components can be swapped +out, and new behavior easily injected. + +- **Components**: Kona is built and grouped into modular components + that can be used independently or together. This allows developers to + pick and choose the parts they need for their specific use case. +- **Trait Abstractions**: Kona uses trait abstractions between and inside + components to allow for easy customization and extension. +- **Public Crates**: Using Rust's crate system, Kona benefits from upstream + improvements through crate re-use. It also means, custom components for + Kona can be easily shared and reused across the ecosystem. + + +## Adoption + +Kona is being adopted and customized through its [abstractions](#abstractions) +across the OP Stack ecosystem. Further, Kona's OP Stack components are +continuously being tested against the reference implementations in the +[Optimism Monorepo][optimism] to ensure compatibility and correctness +(in both implementations). Continuous testing happens across different +repository CI sets as well as long-lived testnets and periphery nodes. + + +## Community + +Contributions are highly praised and appreciated. It's extremely difficult +to build a thriving contributor community. Kona isn't where we'd like to be +just yet, but we aspire to be like Reth. + +That said, come join us and leave a lasting impact on the OP Stack! + + +[optimism]: https://github.com/ethereum-optimism/optimism diff --git a/docs/public-docs/rust/kona/node/configuration.mdx b/docs/public-docs/rust/kona/node/configuration.mdx new file mode 100644 index 00000000000..5c52cda5cca --- /dev/null +++ b/docs/public-docs/rust/kona/node/configuration.mdx @@ -0,0 +1,187 @@ +--- +title: "Kona Node CLI Reference" +--- + +This document lists all CLI flags for the `kona-node node` subcommand, grouped by category. All flags can be provided as command-line arguments or via environment variables. + +:::note +For more details on each flag, see the inline help (`kona-node node --help`) or the source code. +::: + +## Default Ports + +| Service | Default Port | Flag/Env | +|-----------------|--------------|------------------------------------------| +| RPC HTTP | 9545 | `--port` / `KONA_NODE_RPC_PORT` | +| RPC WebSocket | 9545 | (same as HTTP, enabled with `--rpc.ws-enabled`) | +| P2P TCP | 9222 | `--p2p.listen.tcp` / `KONA_NODE_P2P_LISTEN_TCP_PORT` | +| P2P UDP | 9223 | `--p2p.listen.udp` / `KONA_NODE_P2P_LISTEN_UDP_PORT` | +| Supervisor RPC | 9333 | `--supervisor.port` / `KONA_NODE_SEQUENCER_PORT` | +| Conductor RPC | 8547 | `--conductor.rpc` / `KONA_NODE_CONDUCTOR_RPC` | + +## Core Node Arguments + +| Flag | Env | Description | Required | Default | +|------|-----|-------------|----------|---------| +| `--mode ` | `KONA_NODE_MODE` | Mode of operation for the node | Yes | `verifier` | +| `--l1-eth-rpc ` | `KONA_NODE_L1_ETH_RPC` | URL of the L1 execution client RPC API | Yes | - | +| `--l1-trust-rpc ` | `KONA_NODE_L1_TRUST_RPC` | Whether to trust the L1 RPC without verification | No | `true` | +| `--l1-beacon ` | `KONA_NODE_L1_BEACON` | URL of the L1 beacon API | Yes | - | +| `--l2-engine-rpc ` | `KONA_NODE_L2_ENGINE_RPC` | URL of the engine API endpoint of an L2 execution client | Yes | - | +| `--l2-trust-rpc ` | `KONA_NODE_L2_TRUST_RPC` | Whether to trust the L2 RPC without verification | No | `true` | +| `--l2-engine-jwt-secret ` | `KONA_NODE_L2_ENGINE_AUTH` | Path to file containing the hex-encoded JWT secret for the execution client | No | - | +| `--l2-config-file ` | `KONA_NODE_ROLLUP_CONFIG` | Path to a custom L2 rollup configuration file | No | - | +| `--l1-runtime-config-reload-interval ` | `KONA_NODE_L1_RUNTIME_CONFIG_RELOAD_INTERVAL` | Poll interval for reloading runtime config | No | `600` | + +## Global Arguments + +| Flag | Env | Description | Required | Default | +|------|-----|-------------|----------|---------| +| `--l2-chain-id ` or `-c ` | `KONA_NODE_L2_CHAIN_ID` | L2 chain ID (numeric) or chain name (string) | No | `10` (Optimism) | + +### Chain ID Support + +The `--l2-chain-id` flag supports flexible chain identification using the `alloy_chains` crate: + +**Numeric Chain IDs:** +```bash +kona-node --l2-chain-id 10 node [args...] # Optimism mainnet +kona-node --l2-chain-id 8453 node [args...] # Base mainnet +kona-node --l2-chain-id 1 node [args...] # Ethereum mainnet +``` + +**String Chain Names:** +```bash +kona-node --l2-chain-id optimism node [args...] +kona-node --l2-chain-id base node [args...] +kona-node --l2-chain-id mainnet node [args...] +``` + +**Short Flag and Environment Variable:** +```bash +kona-node -c optimism node [args...] +export KONA_NODE_L2_CHAIN_ID=optimism && kona-node node [args...] +``` + +Supported chain names include all those recognized by `alloy_chains` (e.g., `optimism`, `base`, `mainnet`). Unknown numeric chain IDs are accepted for custom networks. + +## P2P Arguments + +| Flag | Env | Description | Default | +|------|-----|-------------|---------| +| `--p2p.no-discovery` | `KONA_NODE_P2P_NO_DISCOVERY` | Disable Discv5 (node discovery) | `false` | +| `--p2p.priv.path ` | `KONA_NODE_P2P_PRIV_PATH` | Path to hex-encoded 32-byte private key for peer ID | - | +| `--p2p.priv.raw ` | `KONA_NODE_P2P_PRIV_RAW` | Hex-encoded 32-byte private key for peer ID | - | +| `--p2p.advertise.ip ` | `KONA_NODE_P2P_ADVERTISE_IP` | IP to advertise to external peers | - | +| `--p2p.advertise.tcp ` | `KONA_NODE_P2P_ADVERTISE_TCP_PORT` | TCP port to advertise | `0` | +| `--p2p.advertise.udp ` | `KONA_NODE_P2P_ADVERTISE_UDP_PORT` | UDP port to advertise | `0` | +| `--p2p.listen.ip ` | `KONA_NODE_P2P_LISTEN_IP` | IP to bind LibP2P/Discv5 to | `0.0.0.0` | +| `--p2p.listen.tcp ` | `KONA_NODE_P2P_LISTEN_TCP_PORT` | TCP port to bind LibP2P to | `9222` | +| `--p2p.listen.udp ` | `KONA_NODE_P2P_LISTEN_UDP_PORT` | UDP port to bind Discv5 to | `9223` | +| `--p2p.peers.lo ` | `KONA_NODE_P2P_PEERS_LO` | Low-tide peer count | `20` | +| `--p2p.peers.hi ` | `KONA_NODE_P2P_PEERS_HI` | High-tide peer count | `30` | +| `--p2p.peers.grace ` | `KONA_NODE_P2P_PEERS_GRACE` | Grace period for new peers | `30` | +| `--p2p.gossip.mesh.d ` | `KONA_NODE_P2P_GOSSIP_MESH_D` | GossipSub mesh target count | `8` | +| `--p2p.gossip.mesh.lo ` | `KONA_NODE_P2P_GOSSIP_MESH_DLO` | GossipSub mesh low watermark | `6` | +| `--p2p.gossip.mesh.dhi ` | `KONA_NODE_P2P_GOSSIP_MESH_DHI` | GossipSub mesh high watermark | `12` | +| `--p2p.gossip.mesh.dlazy ` | `KONA_NODE_P2P_GOSSIP_MESH_DLAZY` | GossipSub gossip target | `6` | +| `--p2p.gossip.mesh.floodpublish` | `KONA_NODE_P2P_GOSSIP_FLOOD_PUBLISH` | Publish to all known peers | `false` | +| `--p2p.scoring ` | `KONA_NODE_P2P_SCORING` | Peer scoring strategy | `light` | +| `--p2p.ban.peers` | `KONA_NODE_P2P_BAN_PEERS` | Enable peer banning | `false` | +| `--p2p.ban.threshold ` | `KONA_NODE_P2P_BAN_THRESHOLD` | Ban threshold | `-100` | +| `--p2p.ban.duration ` | `KONA_NODE_P2P_BAN_DURATION` | Ban duration | `60` | +| `--p2p.discovery.interval ` | `KONA_NODE_P2P_DISCOVERY_INTERVAL` | Peer discovery interval | `5` | +| `--p2p.bootstore ` | `KONA_NODE_P2P_BOOTSTORE` | Directory to store the bootstore | - | +| `--p2p.redial ` | `KONA_NODE_P2P_REDIAL` | Peer redialing threshold | `500` | +| `--p2p.redial.period ` | `KONA_NODE_P2P_REDIAL_PERIOD` | Peer dial period | `60` | +| `--p2p.bootnodes ` | `KONA_NODE_P2P_BOOTNODES` | List of bootnode ENRs | - | +| `--p2p.topic-scoring` | `KONA_NODE_P2P_TOPIC_SCORING` | Enable topic scoring | `false` | +| `--p2p.discovery.randomize ` | `KONA_NODE_P2P_DISCOVERY_RANDOMIZE` | Remove random peers from discovery | - | + +## RPC Arguments + +| Flag | Env | Description | Default | +|------|-----|-------------|---------| +| `--rpc.disabled` | `KONA_NODE_RPC_DISABLED` | Disable the RPC server | `false` | +| `--rpc.no-restart` | `KONA_NODE_RPC_NO_RESTART` | Prevent RPC server from restarting | `false` | +| `--rpc.addr ` | `KONA_NODE_RPC_ADDR` | RPC listening address | `0.0.0.0` | +| `--port ` | `KONA_NODE_RPC_PORT` | RPC listening port | `9545` | +| `--rpc.enable-admin` | `KONA_NODE_RPC_ENABLE_ADMIN` | Enable the admin API | `false` | +| `--rpc.admin-state ` | `KONA_NODE_RPC_ADMIN_STATE` | File path for admin state persistence | - | +| `--rpc.ws-enabled` | `KONA_NODE_RPC_WS_ENABLED` | Enable websocket RPC server | `false` | + +## Sequencer Arguments + +| Flag | Env | Description | Default | +|------|-----|-------------|---------| +| `--sequencer.stopped` | `KONA_NODE_SEQUENCER_STOPPED` | Start sequencer in stopped state | `false` | +| `--sequencer.max-safe-lag ` | `KONA_NODE_SEQUENCER_MAX_SAFE_LAG` | Max L2 safe/unsafe lag | `0` | +| `--sequencer.l1-confs ` | `KONA_NODE_SEQUENCER_L1_CONFS` | L1 block confirmations for sequencer | `4` | +| `--sequencer.recover` | `KONA_NODE_SEQUENCER_RECOVER` | Strictly prepare next L1 origin and create empty L2 blocks | `false` | +| `--conductor.enabled` | `KONA_NODE_CONDUCTOR_ENABLED` | Enable the conductor service | `false` | +| `--conductor.rpc ` | `KONA_NODE_CONDUCTOR_RPC` | Conductor service RPC endpoint | `127.0.0.1:8547` | +| `--conductor.rpc.timeout ` | `KONA_NODE_CONDUCTOR_RPC_TIMEOUT` | Conductor service RPC timeout | `1` | + +## Supervisor Arguments + +| Flag | Env | Description | Default | +|------|-----|-------------|---------| +| `--supervisor.rpc-enabled` | `KONA_NODE_SUPERVISOR_RPC_ENABLED` | Enable Supervisor Websocket | `false` | +| `--supervisor.ip.address ` | `KONA_NODE_SUPERVISOR_IP` | IP to bind Supervisor Websocket RPC server | `0.0.0.0` | +| `--supervisor.port ` | `KONA_NODE_SUPERVISOR_PORT` | TCP port for supervisor RPC | `9333` | +| `--supervisor.jwt.secret ` | `KONA_NODE_SUPERVISOR_JWT_SECRET` | JWT secret for supervisor websocket authentication | - | +| `--supervisor.jwt.secret.file ` | `KONA_NODE_SUPERVISOR_JWT_SECRET_FILE` | Path to file containing JWT secret | - | + +## RPC Trust Configuration + +The `--l1-trust-rpc` and `--l2-trust-rpc` flags control whether Kona performs additional verification on RPC responses to protect against malicious or faulty RPC providers. + +### Trust Modes + +**Default Behavior (trust enabled, `true`):** +- No additional block hash verification is performed +- Optimized for performance +- Suitable for local nodes and trusted infrastructure +- Assumes the RPC provider is reliable and honest + +**Verification Mode (trust disabled, `false`):** +- All fetched blocks have their hashes verified against the requested hashes +- Protects against malicious RPC providers returning incorrect blocks +- Recommended for public or third-party RPC endpoints +- Small performance overhead due to hash verification + +### Examples + +**Using trusted local RPCs (default):** +```bash +kona-node node \ + --l1-eth-rpc http://localhost:8545 \ + --l2-engine-rpc http://localhost:8551 \ + # trust-rpc defaults to true, no need to specify +``` + +**Using untrusted public RPCs:** +```bash +kona-node node \ + --l1-eth-rpc https://public-eth-rpc.com \ + --l1-trust-rpc false \ + --l2-engine-rpc https://public-l2-rpc.com \ + --l2-trust-rpc false +``` + +**Mixed trust configuration:** +```bash +kona-node node \ + --l1-eth-rpc https://public-eth-rpc.com \ + --l1-trust-rpc false \ + --l2-engine-rpc http://localhost:8551 \ + # L2 trust-rpc defaults to true for local engine +``` + +### Security Recommendations + +1. **Local Infrastructure**: Keep the default `true` setting for RPCs you control +2. **Public RPCs**: Always set `--trust-rpc false` when using third-party endpoints +3. **Shared Infrastructure**: Consider setting `--trust-rpc false` as a precaution +4. **Performance Testing**: The verification overhead is minimal but can be measured in high-throughput scenarios + diff --git a/docs/public-docs/rust/kona/node/design/derivation.mdx b/docs/public-docs/rust/kona/node/design/derivation.mdx new file mode 100644 index 00000000000..1becde67586 --- /dev/null +++ b/docs/public-docs/rust/kona/node/design/derivation.mdx @@ -0,0 +1,236 @@ +--- +title: "Derivation in Kona Node" +--- + +The derivation system in kona-node is responsible for transforming L1 data into L2 payload attributes that can be executed to produce the canonical L2 blocks. This document covers how the [`kona-derive`][kd] crate is integrated and used within the kona-node architecture. + +## Overview + +The derivation subsystem in kona-node is built around the **DerivationActor**, which manages the derivation pipeline lifecycle and coordinates with other node components. The actor uses the trait-abstracted [`kona-derive`][kd] pipeline to continuously process L1 data and produce L2 payload attributes. + +### Key Components + +- **DerivationActor**: The main actor responsible for running the derivation pipeline +- **OnlinePipeline**: A concrete implementation of the derivation pipeline using online providers +- **PipelineBuilder**: Trait for constructing derivation pipelines with different configurations +- **DerivationState**: Manages pipeline state and stepping logic +- **Signal System**: Handles pipeline resets, hardfork activations, and error conditions + +## Architecture + +### DerivationActor + +The `DerivationActor` is a [`NodeActor`][na] that runs as part of the node service. It receives messages from other actors and steps the derivation pipeline forward to produce new payload attributes. + +```rust +pub struct DerivationActor +where + B: PipelineBuilder, +{ + /// The state for the derivation actor. + state: B, + /// Receiver for L1 head update notifications. + l1_head_updates: watch::Receiver>, + /// Receiver for L2 safe head update notifications. + engine_l2_safe_head: watch::Receiver, + /// Receiver for engine sync completion signal. + el_sync_complete_rx: oneshot::Receiver<()>, + /// Receiver for pipeline signals. + derivation_signal_rx: mpsc::Receiver, +} +``` + +The actor coordinates with several other node components: +- **Engine Actor**: Receives payload attributes for execution and sends safe head updates +- **P2P Actors**: Receives L1 head updates from the network +- **RPC Actors**: May trigger pipeline resets or provide status information + +### Pipeline Construction + +The derivation pipeline is constructed using the `DerivationBuilder` which implements the `PipelineBuilder` trait: + +```rust +#[derive(Debug)] +pub struct DerivationBuilder { + /// The L1 provider. + pub l1_provider: RootProvider, + /// The L1 beacon client. + pub l1_beacon: OnlineBeaconClient, + /// The L2 provider. + pub l2_provider: RootProvider, + /// The rollup config. + pub rollup_config: Arc, + /// The interop mode. + pub interop_mode: InteropMode, +} +``` + +The builder creates an `OnlinePipeline` which can operate in two modes: + +1. **Polled Mode**: Uses `PollingTraversal` for L1 block traversal +2. **Indexed Mode**: Uses `IndexedTraversal` for more efficient L1 block handling + +```rust +let pipeline = match self.interop_mode { + InteropMode::Polled => OnlinePipeline::new_polled( + self.rollup_config.clone(), + OnlineBlobProvider::init(self.l1_beacon.clone()).await, + l1_derivation_provider, + l2_derivation_provider, + ), + InteropMode::Indexed => OnlinePipeline::new_indexed( + self.rollup_config.clone(), + OnlineBlobProvider::init(self.l1_beacon.clone()).await, + l1_derivation_provider, + l2_derivation_provider, + ), +}; +``` + +### Provider Configuration + +The node uses caching providers to optimize performance: + +- **AlloyChainProvider**: Provides L1 blockchain data with configurable cache size +- **AlloyL2ChainProvider**: Provides L2 blockchain data and system configuration +- **OnlineBlobProvider**: Retrieves blob data from the beacon chain for post-4844 transactions + +The cache size is set to 1024 entries by default: + +```rust +const DERIVATION_PROVIDER_CACHE_SIZE: usize = 1024; +``` + +## Pipeline Operation + +### Main Processing Loop + +The derivation actor runs a continuous loop that handles various events: + +1. **Shutdown signals**: Graceful shutdown when cancellation token is triggered +2. **L1 head updates**: Triggers derivation when new L1 blocks are available +3. **Safe head updates**: Triggers derivation when the L2 safe head advances +4. **Pipeline signals**: Handles resets, hardfork activations, and channel flushes + +### Stepping Logic + +The core derivation logic is implemented in `produce_next_attributes()`: + +```rust +async fn produce_next_attributes( + &mut self, + engine_l2_safe_head: &watch::Receiver, + reset_request_tx: &mpsc::Sender<()>, +) -> Result +``` + +This method continuously steps the pipeline until payload attributes are produced: + +1. **Step the pipeline** with the current L2 safe head +2. **Handle step results**: + - `PreparedAttributes`: Attributes are ready to be consumed + - `AdvancedOrigin`: Pipeline advanced to next L1 block + - `OriginAdvanceErr`/`StepFailed`: Handle various error conditions +3. **Return attributes** when available + +### Error Handling + +The derivation actor handles three categories of pipeline errors: + +#### Temporary Errors +- `PipelineError::NotEnoughData`: Continue stepping, more data may become available +- `PipelineError::Eof`: Yield and wait for more L1 data + +#### Reset Errors +- `ResetError::HoloceneActivation`: Send `ActivationSignal` to handle hardfork +- `ResetError::ReorgDetected`: Send reset request to engine (if not in interop mode) +- Other reset errors: Wait for external signal before continuing + +#### Critical Errors +- Unrecoverable errors that terminate the derivation process +- Increment metrics counter and propagate error up + +### Signal Handling + +The pipeline supports several signal types for coordination: + +- **ResetSignal**: Resets pipeline state with new L1 origin and system config +- **ActivationSignal**: Handles hardfork activations (e.g., Holocene) +- **FlushChannel**: Invalidates current channel data for deposit-only blocks + +Signals are sent from the engine actor when specific conditions are detected during payload execution. + +## Configuration + +### Rollup Configuration + +The derivation pipeline requires a [`RollupConfig`][rc] that defines: +- Chain parameters (chain ID, block time, etc.) +- Hardfork activation heights +- System configuration addresses +- Batch and channel parameters + +### Runtime Configuration + +Runtime configuration includes: +- Provider cache sizes +- Polling intervals for L1 data +- Interop mode selection +- Metrics collection settings + +## Integration Patterns + +### With Engine Actor + +The derivation actor produces `OpAttributesWithParent` that are sent to the engine actor for execution: + +```rust +// Send payload attributes for execution +derived_attributes_tx + .send(payload_attrs) + .await + .map_err(|e| DerivationError::Sender(Box::new(e)))?; +``` + +The engine actor executes these attributes and updates the L2 safe head, which triggers the next derivation cycle. + +### With P2P Layer + +The derivation actor receives L1 head updates from the P2P layer, which indicate when new L1 data is available for processing: + +```rust +Some(msg) = self.l1_head_updates.changed() => { + if let Err(e) = state.process( + InboundDerivationMessage::L1HeadUpdated, + // ... other parameters + ).await { + // Handle derivation error + } +} +``` + +### With RPC Layer + +The RPC layer can query derivation status and potentially trigger pipeline operations through the standard node RPC interface. + +## Metrics and Observability + +The derivation actor exposes several metrics for monitoring: + +- `DERIVATION_L1_ORIGIN`: Current L1 origin block number +- `DERIVATION_CRITICAL_ERROR`: Count of critical derivation errors +- `L1_REORG_COUNT`: Count of detected L1 reorganizations + +These metrics help operators monitor the health and progress of the derivation process. + +## Related Documentation + +For more details on the underlying derivation pipeline implementation, see: +- [Derivation Pipeline Introduction](/rust/kona/sdk/protocol/derive/intro) +- [Custom Providers](/rust/kona/sdk/protocol/derive/providers) +- [Stage Swapping](/rust/kona/sdk/protocol/derive/stages) +- [Pipeline Signaling](/rust/kona/sdk/protocol/derive/signaling) + +[kd]: https://crates.io/crates/kona-derive +[na]: /kona/node/design/intro#node-actors +[rc]: /kona/sdk/protocol/genesis/rollup-config diff --git a/docs/public-docs/rust/kona/node/design/engine.mdx b/docs/public-docs/rust/kona/node/design/engine.mdx new file mode 100644 index 00000000000..2ecffbcae52 --- /dev/null +++ b/docs/public-docs/rust/kona/node/design/engine.mdx @@ -0,0 +1,302 @@ +--- +title: "Execution Engine" +--- + +The `kona-engine` crate provides a modular execution engine implementation for the OP Stack rollup node. It serves as the bridge between the rollup protocol and the execution layer (EL), managing Engine API interactions through a sophisticated task queue system. + +## Architecture Overview + +The execution engine is built around several key components: + +- **Engine Task Queue**: A priority-ordered queue that manages Engine API operations +- **Trait Abstractions**: Extensible interfaces for tasks, errors, and state management +- **Engine Client**: HTTP client for communicating with the execution layer +- **Actor Integration**: Service layer integration through the `EngineActor` + +## Core Trait Abstractions + +### EngineTaskExt + +The `EngineTaskExt` trait defines the interface for all engine tasks: + +```rust +#[async_trait] +pub trait EngineTaskExt { + type Output; + type Error: EngineTaskError; + + async fn execute(&self, state: &mut EngineState) -> Result; +} +``` + +This trait enables: +- **Atomic operations** over the `EngineState` +- **Extensible task implementation** for custom operations +- **Async execution** with proper error handling + +### EngineTaskError + +The `EngineTaskError` trait provides sophisticated error handling with severity levels: + +```rust +pub trait EngineTaskError { + fn severity(&self) -> EngineTaskErrorSeverity; +} + +pub enum EngineTaskErrorSeverity { + Temporary, // Retry the task + Critical, // Propagate to engine actor + Reset, // Request derivation reset + Flush, // Request derivation flush +} +``` + +This allows tasks to signal different recovery strategies based on the error type. + +## Task Queue System + +The engine uses a priority-based task queue where tasks are ordered according to OP Stack synchronization requirements: + +### Task Priority (Highest to Lowest) + +1. **ForkchoiceUpdate** - Synchronizes forkchoice state +2. **Build** - Builds new blocks (sequencer mode) +3. **Insert** - Inserts unsafe blocks from gossip +4. **Consolidate** - Advances safe chain via derivation +5. **Finalize** - Finalizes L2 blocks + +### Task Types + +#### SynchronizeTask + +Updates the execution layer's forkchoice state: + +```rust +pub struct SynchronizeTask { + pub client: Arc, + pub rollup: Arc, + pub envelope: Option, + pub state_update: EngineSyncStateUpdate, +} +``` + +Handles: +- Forkchoice synchronization without payload attributes +- Payload building initiation with attributes +- EL sync status management + +#### BuildTask + +Builds new blocks in sequencer mode: + +```rust +pub struct BuildTask { + pub engine: Arc, + pub cfg: Arc, + pub attributes: OpAttributesWithParent, + pub is_attributes_derived: bool, + pub payload_tx: Option>, +} +``` + +Handles: +- Payload building with `engine_forkchoiceUpdated` +- Payload retrieval with version-specific `engine_getPayload` calls +- Payload insertion and canonicalization + +#### InsertTask + +Inserts unsafe blocks received from gossip: + +```rust +pub struct InsertTask { + pub client: Arc, + pub rollup: Arc, + pub envelope: OpExecutionPayloadEnvelope, +} +``` + +#### ConsolidateTask + +Advances the safe chain through derivation: + +```rust +pub struct ConsolidateTask { + pub client: Arc, + pub rollup: Arc, + pub attributes: OpAttributesWithParent, +} +``` + +#### FinalizeTask + +Finalizes L2 blocks: + +```rust +pub struct FinalizeTask { + pub client: Arc, + pub rollup: Arc, + pub l2_block: L2BlockInfo, +} +``` + +## Engine State Management + +The `EngineState` tracks the current state of the execution engine: + +```rust +pub struct EngineState { + pub current: L2BlockInfo, + pub finalized: L2BlockInfo, + pub safe: L2BlockInfo, + pub sync_state: EngineSyncState, + pub el_sync_finished: bool, + // ... additional fields +} +``` + +State updates are communicated through watch channels, enabling reactive programming patterns across the system. + +## Integration with kona-node + +The `kona-node` service layer integrates the engine through the `EngineActor`: + +### Actor Pattern + +The `EngineActor` implements the `NodeActor` trait: + +```rust +#[async_trait] +pub trait NodeActor: Send + 'static { + type Error: std::fmt::Debug; + type OutboundData: CancellableContext; + type InboundData: Sized; + type Builder; + + fn build(builder: Self::Builder) -> (Self::InboundData, Self); + async fn start(self, inbound_context: Self::OutboundData) -> Result<(), Self::Error>; +} +``` + +### Communication Channels + +The `EngineActor` receives input through multiple channels: + +- **attributes_rx**: Payload attributes from derivation +- **unsafe_block_rx**: Unsafe blocks from gossip +- **reset_request_rx**: Reset requests +- **inbound_queries**: Engine state queries +- **runtime_config_rx**: Runtime configuration updates +- **build_request_rx**: Block building requests (sequencer mode only) + +### Engine Queries + +The engine supports queries for: + +```rust +pub enum EngineQueries { + Config(Sender), + State(Sender), + OutputAtBlock { block: BlockNumberOrTag, sender: Sender<(L2BlockInfo, OutputRoot, EngineState)> }, + StateReceiver(Sender>), +} +``` + +## Usage Patterns + +### Basic Engine Setup + +```rust +// Create engine client +let client = EngineClient::new_http( + engine_url, + l2_rpc_url, + l1_rpc_url, + rollup_config, + jwt_secret, +); + +// Initialize engine state +let state = EngineState::default(); +let (state_sender, state_receiver) = watch::channel(state); + +// Create engine with task queue +let engine = Engine::new(state, state_sender); +``` + +### Adding Tasks + +```rust +// Add a forkchoice update task +let task = EngineTask::ForkchoiceUpdate(SynchronizeTask::new( + client.clone(), + rollup_config.clone(), + state_update, + None, // No payload attributes +)); + +engine.add_task(task); +``` + +### Draining the Queue + +```rust +// Process all pending tasks +match engine.drain().await { + Ok(()) => info!("Tasks completed successfully"), + Err(e) => match e.severity() { + EngineTaskErrorSeverity::Reset => { + // Request derivation reset + }, + EngineTaskErrorSeverity::Critical => { + // Handle critical error + }, + _ => { + // Handle other error types + } + } +} +``` + +## Error Handling and Recovery + +The engine provides robust error handling through: + +### Severity-Based Recovery + +- **Temporary errors**: Automatically retried +- **Critical errors**: Propagated to the actor +- **Reset errors**: Trigger derivation pipeline reset +- **Flush errors**: Trigger derivation pipeline flush + +### State Consistency + +Tasks operate atomically on the `EngineState`, ensuring consistency even during error conditions. + +## Version Support + +The engine automatically selects appropriate Engine API versions based on hardfork activation: + +- **Pre-Ecotone**: Uses `engine_newPayloadV2` and `engine_getPayloadV2` +- **Post-Ecotone**: Uses `engine_newPayloadV3` and `engine_getPayloadV3` +- **Post-Isthmus**: Uses `engine_newPayloadV4` and `engine_getPayloadV4` + +## Metrics and Observability + +When the `metrics` feature is enabled, the engine provides comprehensive metrics for: + +- Task execution times +- Error rates by task type +- Engine state transitions +- API call latencies + +## Extensibility + +The trait-based architecture allows for: + +- **Custom task implementations** via `EngineTaskExt` +- **Custom error handling** via `EngineTaskError` +- **Custom state management** extensions +- **Testing and mocking** support + +This modular design ensures the engine can adapt to future OP Stack protocol changes while maintaining backward compatibility. diff --git a/docs/public-docs/rust/kona/node/design/intro.mdx b/docs/public-docs/rust/kona/node/design/intro.mdx new file mode 100644 index 00000000000..f37edf6d943 --- /dev/null +++ b/docs/public-docs/rust/kona/node/design/intro.mdx @@ -0,0 +1,78 @@ +--- +title: "Node Design Overview" +--- + +The entry-point for the `kona-node` is the [`RollupNodeService`][trait] +trait which encapsulates the core wiring for the node. The default +implementation of the trait [`start` method][start] handles connecting +all the different components of the node, running each in a spawned +thread. As such, each node component is considered an actor. + +The [`RollupNodeService`][trait] abstracts individual actors through +the [`NodeActor` trait][actor]. With the `NodeActor` trait, the +`RollupNodeService` builds the actor and then starts it. + +Kona provides implementations for all `NodeActor`s required +to run a `RollupNodeService`. Actors are defined in the +[actors][actors] module of the `kona-node-service` crate. + +The `kona-node` is an implementation of the `RollupNodeService` +that lives in the [standard][standard] module. + + +### Actors + +The architecture of `kona-node` is a web of actors that share +state through message passing, using channels, rather than using +shared memory. + +The [`RollupNodeService`][trait] defines the set of required +actors using associated types. These are subject to change, +but are currently defined as follows. + +- **Derivation Actor**: Orchestrates the derivation pipeline, + deriving L2 payload attributes from l1 blocks. Payload + attributes prepared this way are forwarded to the Engine + Actor to be executed. The [derivation][derivation] docs + dive deeper into how the derivation actor works. +- **Engine Actor**: Brokers the connection to the execution + layer client (or "execution engine"). The engine actor + turns messages from other actors into engine "tasks" + that are executed in a round-robin against the EL client. + The [engine][engine] docs expand on this. +- **Network Actor**: Manages the P2P Network for the rollup + node. The P2P stack consists of `discv5` peer discovery + and block gossip through libp2p. Visit the [network][p2p] + docs for more detail. +- **Supervisor Actor (beta)**: The supervisor actor is an + interop feature that allows the `kona-node` to be + "managed" (or "indexed") by the supervisor - a new + component in the OP Stack. A detailed overview of + interop and the supervisor's role is provided in the + [supervisor][supervisor] docs. +- **Runtime Actor**: Loads runtime values from the contracts + on the L1 chain for the OP Stack. This is a very + light-weight actor described in [runtime][runtime] docs. +- **Sequencer Actor**: The sequencer actor extends the + `kona-node` to be run as a sequencer. Sequencing is + periphery to the basic rollup node operation. See + the [sequencer][sequencer]. +- **RPC Actor**: The RPC actor spins up and serves an + RPC server that exposes the rpc methods required by + the [OP Stack Specs][specs]. + + +[p2p]: ./p2p +[engine]: ./engine +[derivation]: ./derivation +[supervisor]: #TODO +[runtime]: #TODO +[sequencer]: ./sequencer + +[specs]: https://specs.optimism.io/protocol/rollup-node.html + +[standard]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/crates/node/service/src/service/standard/node.rs +[actors]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/crates/node/service/src/actors +[actor]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/crates/node/service/src/actors/traits.rs#L19 +[start]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/crates/node/service/src/service/core.rs#L161-L162 +[trait]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/crates/node/service/src/service/core.rs#L56 diff --git a/docs/public-docs/rust/kona/node/design/p2p.mdx b/docs/public-docs/rust/kona/node/design/p2p.mdx new file mode 100644 index 00000000000..2339d23cd62 --- /dev/null +++ b/docs/public-docs/rust/kona/node/design/p2p.mdx @@ -0,0 +1,174 @@ +--- +title: "P2P Networking" +--- + + + +Partly adapted from the [OP Stack P2P Specs][p2p-specs]. +Please reference the specs for up-to-date OP Stack requirements. + + + +The OP Stack uses P2P networking on the consensus layer to share +the sequencer's view of the L2 chain with other nodes on the +network. L2 blocks shared via P2P are considered "unsafe", and +will be reorganized to match the canonical chain, prioritizing L1. + +This means that behavior on the P2P layer does not affect the +rollup security. As such, rules around banning and scoring peers +based on their P2P gossip is policy - it is up to the user to +ultimately choose a configuration best for them. + +To understand how the P2P is hooked up to the `kona-node`, jump +to the [P2P Actor](#-p2p-actor) section below. Otherwise, read +on to learn more about the details of the P2P stack. + + +### Topography + +The P2P stack topography consists of the following. + +- Discovery of peers via [discv5][discv5]. +- Gossip and peer connection management through [libp2p][libp2p]. +- Publishing and validation of gossip by the node. + +In the `kona-node`, these layers are split up into modular +components either as modules or distinct crates. + + +#### Discovery + +Kona's discovery layer is encapsulated in a "driver" called +the [`Discv5Driver`][driver]. When started, the driver spawns a +new thread to handle [`discv5::Discv5`][discv5-service] events +from its event stream as well as metrics requests from the +`kona-node`. A "handler" is returned by the consumed +[`Discv5Driver`][driver] which allows other components of +the `kona-node` to communicate through channels to the +spawned [`discv5::Discv5`][discv5-service] service. + +When peers are discovered by kona's discovery service, their +"ENR"s need to be validated to ensure those peers are +participating in the right network gossip. Ethereum Node +Records (ENRs) and how they are validated is discussed in a +[later section](#-node-identification). After their ENRs are +validated, they are forwarded to the consumer (in kona's case +libp2p) which establishes and manages the connection to the +node. + +There are also a few more notable functions of Kona's discovery +driver. + +- Every X seconds it attempts to discover random ENRs. This is + configurable using `Discv5Builder::with_interval` +- Every Y seconds it evicts a random ENR from the discovery + table to keep peer discovery fresh. This is configurable + using `Discv5Builder::with_discovery_randomize`. +- Every Z seconds it stores its ENR table at a configurable + location so if the service is restarted, it doesn't need to + rediscover peers, it can just use the stored peers. The + interval is configurable using + `Discv5Builder::with_store_interval`. + + +#### Gossip + +L2 blocks on the OP Stack not otherwise derived from L1 are +shared over TCP in the P2P network of nodes. Unsafe L2 blocks +shared this way originate from the sequencer. + +In the `kona-node`, L2 block gossip is handled through the +[libp2p Swarm][swarm]. The `GossipDriver` is the component +in the `kona-node` that manages the libp2p swarm, including +any interfacing with the swarm like dialing peers, publishing +payloads (L2 blocks), handling events from the swarm, and more. + + + +The libp2p swarm must be polled via Swarm as Stream +in order to make progress. +Through kona's `GossipDriver`, this can be done by looping +over and consuming events from `GossipDriver::next`. + + + +The `GossipDriver` provides the methods to handle events +from the [libp2p Swarm][swarm]. Events should be consumed +this way in order to use the connection gater as well as peer +store and fields on the `GossipDriver`. + +The [libp2p Swarm][swarm] listens on a specified +[`Multiaddr`][multiaddr]. + + +#### L2 Block Publishing + +As mentioned in [the previous section](#-gossip), L2 blocks +are published as payloads through the [libp2p Swarm][swarm], +which is done using the `GossipDriver`. The actual payload +type that is published is an [`OpNetworkPayloadEnvelope`][env], +which is well documented in the [OP Stack P2P Specs][p2p-specs]. + +L2 blocks published through the `GossipDriver` are published on +a "topic". The topic is used by the gossipsub protocol to publish +the message on that given topic, allowing peers to choose which +topics they wish to subscribe to. + + +#### L2 Block Validation + +L2 blocks are validated in kona through a trait-abstracted +"block handler". Since messages in the libp2p mesh network are +snappy compressed, they need to be decompressed and then decoded +for the correct [block topic][block-topic] those messages are +published on. + +Only once the [`OpNetworkPayloadEnvelope`][env] is successfully +decoded for the corresponding block topic, is the block validated. + + + +Block validity in kona follows the [OP Stack block validation specs][validation]. + + + +As of writing these docs, block validation follows a few rules. + +- The timestamp is between 60 seconds in the past and at most 5 seconds in the future. +- The block hash is valid. This is checked by transforming the payload into a block + and then hashing the block header to produce the payload hash. +- The contents of the payload envelope are correct for its version. Since different + versions introduce new contents to the payload from hardforks, the + forwards-compatible payload envelope cannot have fields with content that don't exist + for previous versions. +- The block signature is valid. + + +### Node Identification + +TODO + + +### P2P Actor + +TODO + + +[validation]: https://specs.optimism.io/protocol/rollup-node-p2p.html#block-validation + +[block-topic]: https://specs.optimism.io/protocol/rollup-node-p2p.html#gossip-topics + +[multiaddr]: https://docs.rs/libp2p/0.56.0/libp2p/struct.Multiaddr.html + +[env]: https://docs.rs/op-alloy-rpc-types-engine/latest/op_alloy_rpc_types_engine/struct.OpNetworkPayloadEnvelope.html + +[swarm]: https://docs.rs/libp2p/latest/libp2p/struct.Swarm.html + +[discv5-service]: https://docs.rs/discv5/latest/discv5/struct.Discv5.html + +[driver]: https://docs.rs/kona-p2p/latest/kona_p2p/struct.Discv5Driver.html + +[discv5]: https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md +[libp2p]: https://libp2p.io/ + +[p2p-specs]: https://specs.optimism.io/protocol/rollup-node-p2p.html diff --git a/docs/public-docs/rust/kona/node/design/sequencer.mdx b/docs/public-docs/rust/kona/node/design/sequencer.mdx new file mode 100644 index 00000000000..c8281e01efb --- /dev/null +++ b/docs/public-docs/rust/kona/node/design/sequencer.mdx @@ -0,0 +1,196 @@ +--- +title: "Sequencer Mode" +--- + +The Kona node can operate in **sequencer mode** to build and produce new L2 blocks. In this mode, the node acts as the sequencer for an OP Stack rollup, building L2 blocks on top of the current unsafe head and extending the L2 chain. + +:::info +Sequencer mode is an advanced configuration primarily used by rollup operators. Most users will run nodes in the default validator mode. +::: + +## Overview + +When running in sequencer mode, the Kona node: + +- **Builds L2 blocks** by collecting transactions from the mempool and constructing new blocks +- **Selects L1 origins** for new L2 blocks based on finalized L1 data +- **Manages block production timing** and ensures proper sequencing constraints +- **Integrates with conductor services** for leader election in multi-sequencer setups +- **Handles recovery scenarios** when the sequencer needs to catch up with L1 + +The sequencer uses the same core derivation pipeline as validator nodes but operates in reverse - instead of deriving L2 blocks from L1 data, it produces L2 blocks that will later be derivable from L1. + +## Trait Abstractions + +### Core Interfaces + +The sequencer functionality is built around several key trait abstractions: + +#### `RollupNodeService` +The main service trait that defines the node's operational mode and actor types: + +```rust +pub trait RollupNodeService { + type SequencerActor: NodeActor< + Error: Display, + OutboundData = SequencerContext, + Builder: AttributesBuilderConfig, + InboundData = SequencerInboundData, + >; + + fn mode(&self) -> NodeMode; + // ... other methods +} +``` + +#### `AttributesBuilderConfig` +Configures how L2 block attributes are constructed: + +```rust +pub trait AttributesBuilderConfig { + type AB: AttributesBuilder; + fn build(self) -> Self::AB; +} +``` + +#### `SequencerActor` +The core actor responsible for block production: + +- Builds L2 blocks using the `AttributesBuilder` +- Manages timing and L1 origin selection +- Handles admin RPC commands for sequencer control +- Coordinates with conductor services for leader election + +## Programmatic Configuration + +### Using the RollupNodeBuilder + +To configure a Kona node programmatically for sequencer mode: + +```rust +use kona_node_service::{NodeMode, RollupNode, SequencerConfig}; +use url::Url; + +// Configure sequencer settings +let sequencer_config = SequencerConfig { + sequencer_stopped: false, // Start sequencer immediately + sequencer_recovery_mode: false, // Normal operation mode + conductor_rpc_url: Some( // Optional conductor integration + Url::parse("http://conductor:8080").unwrap() + ), +}; + +// Build and start the sequencer node +let node = RollupNode::builder(rollup_config) + .with_mode(NodeMode::Sequencer) // Enable sequencer mode + .with_sequencer_config(sequencer_config) // Apply sequencer settings + .with_l1_provider_rpc_url(l1_rpc_url) // L1 data source + .with_l2_engine_rpc_url(l2_engine_url) // L2 execution engine + .with_jwt_secret(jwt_secret) // Engine API authentication + // ... other configuration + .build() + .start() + .await?; +``` + +### Configuration Options + +| Field | Description | Default | +|-------|-------------|---------| +| `sequencer_stopped` | Start sequencer in stopped state | `false` | +| `sequencer_recovery_mode` | Enable recovery mode for catch-up | `false` | +| `conductor_rpc_url` | Conductor service endpoint for leader election | `None` | + +## CLI Usage + +### Basic Sequencer Setup + +To run a Kona node in sequencer mode: + +```bash +kona-node node \ + --mode=Sequencer \ + --l1-eth-rpc=http://l1-node:8545 \ + --l1-beacon=http://l1-beacon:5052 \ + --l2-engine-rpc=http://l2-execution:8551 \ + --l2.jwt-secret=./jwt.hex \ + --chain=123456 +``` + +### Required Arguments + +:::warning +Required Configuration + +Sequencer mode requires all standard node arguments plus the `--mode=Sequencer` flag. Missing any required argument will prevent the node from starting. +::: + +| Argument | Flag | Environment Variable | Description | +|----------|------|---------------------|-------------| +| **Mode** | `--mode` | `KONA_NODE_MODE` | Must be set to `Sequencer` | +| **L1 RPC** | `--l1-eth-rpc` | `KONA_NODE_L1_ETH_RPC` | L1 execution client RPC URL | +| **L1 Beacon** | `--l1-beacon` | `KONA_NODE_L1_BEACON` | L1 beacon API URL | +| **L2 Engine** | `--l2-engine-rpc` | `KONA_NODE_L2_ENGINE_RPC` | L2 engine API endpoint | +| **JWT Secret** | `--l2.jwt-secret` | `KONA_NODE_L2_ENGINE_AUTH` | Path to JWT secret file | +| **Chain ID** | `--chain` | `KONA_NODE_L2_CHAIN_ID` | L2 chain identifier | + +### Sequencer-Specific Flags + +| Flag | Environment Variable | Default | Description | +|------|---------------------|---------|-------------| +| `--sequencer.stopped` | `KONA_NODE_SEQUENCER_STOPPED` | `false` | Start sequencer in stopped state | +| `--sequencer.max-safe-lag` | `KONA_NODE_SEQUENCER_MAX_SAFE_LAG` | `0` | Max L2 blocks between safe and unsafe heads | +| `--sequencer.l1-confs` | `KONA_NODE_SEQUENCER_L1_CONFS` | `4` | L1 confirmations for origin selection | +| `--sequencer.recover` | `KONA_NODE_SEQUENCER_RECOVER` | `false` | Force recovery mode operation | +| `--conductor.rpc` | `KONA_NODE_CONDUCTOR_RPC` | - | Conductor service RPC endpoint | +| `--conductor.rpc.timeout` | `KONA_NODE_CONDUCTOR_RPC_TIMEOUT` | `1` | Conductor RPC timeout (seconds) | + +### Example Configurations + +#### Basic Sequencer +```bash +kona-node node \ + --mode=Sequencer \ + --l1-eth-rpc=http://localhost:8545 \ + --l1-beacon=http://localhost:5052 \ + --l2-engine-rpc=http://localhost:8551 \ + --chain=42161 +``` + +#### Sequencer with Conductor +```bash +kona-node node \ + --mode=Sequencer \ + --conductor.rpc=http://conductor:8080 \ + --conductor.rpc.timeout=5 \ + --sequencer.l1-confs=6 \ + --l1-eth-rpc=http://l1-node:8545 \ + --l1-beacon=http://l1-beacon:5052 \ + --l2-engine-rpc=http://l2-execution:8551 \ + --chain=123456 +``` + +#### Recovery Mode Sequencer +```bash +kona-node node \ + --mode=Sequencer \ + --sequencer.recover=true \ + --sequencer.max-safe-lag=100 \ + --l1-eth-rpc=http://localhost:8545 \ + --l1-beacon=http://localhost:5052 \ + --l2-engine-rpc=http://localhost:8551 \ + --chain=42161 +``` + +## Key Considerations + +:::tip +Sequencer Operation + +- **L1 Confirmations**: The `--sequencer.l1-confs` setting determines how many L1 blocks the sequencer waits before using an L1 block as an origin. Higher values provide more safety but increase latency. +- **Recovery Mode**: Use `--sequencer.recover=true` when the sequencer needs to catch up after being offline. +- **Conductor Integration**: For multi-sequencer deployments, configure the conductor service for proper leader election. +::: + + +Running a sequencer in production requires careful consideration of infrastructure, monitoring, and failover procedures. Ensure proper JWT secret management and secure network configuration. diff --git a/docs/public-docs/rust/kona/node/faq/overview.mdx b/docs/public-docs/rust/kona/node/faq/overview.mdx new file mode 100644 index 00000000000..40ea9b1358a --- /dev/null +++ b/docs/public-docs/rust/kona/node/faq/overview.mdx @@ -0,0 +1,8 @@ +--- +title: "FAQ" +--- + +1. [Ports](/rust/kona/node/faq/ports) - Detailed account of ports used by the `kona-node` for P2P communication, JSON-RPC APIs, and the Engine API for execution layer communication. + +2. [Profiling](/rust/kona/node/faq/profiling) - Profile performance of the Kona node including CPU profiling and memory analysis. + diff --git a/docs/public-docs/rust/kona/node/faq/ports.mdx b/docs/public-docs/rust/kona/node/faq/ports.mdx new file mode 100644 index 00000000000..970409777e5 --- /dev/null +++ b/docs/public-docs/rust/kona/node/faq/ports.mdx @@ -0,0 +1,12 @@ +--- +title: "Node Ports" +--- + +| Service | Default Port | Flag/Env | +|-----------------|--------------|------------------------------------------| +| RPC HTTP | 9545 | `--port` / `KONA_NODE_RPC_PORT` | +| RPC WebSocket | 9545 | (same as HTTP, enabled with `--rpc.ws-enabled`) | +| P2P TCP | 9222 | `--p2p.listen.tcp` / `KONA_NODE_P2P_LISTEN_TCP_PORT` | +| P2P UDP | 9223 | `--p2p.listen.udp` / `KONA_NODE_P2P_LISTEN_UDP_PORT` | +| Supervisor RPC | 9333 | `--supervisor.port` / `KONA_NODE_SEQUENCER_PORT` | +| Conductor RPC | 8547 | `--conductor.rpc` / `KONA_NODE_CONDUCTOR_RPC` | diff --git a/docs/public-docs/rust/kona/node/faq/profiling.mdx b/docs/public-docs/rust/kona/node/faq/profiling.mdx new file mode 100644 index 00000000000..de6401c9c28 --- /dev/null +++ b/docs/public-docs/rust/kona/node/faq/profiling.mdx @@ -0,0 +1,5 @@ +--- +title: "Profiling the Node" +--- + +Coming soon... diff --git a/docs/public-docs/rust/kona/node/install/binaries.mdx b/docs/public-docs/rust/kona/node/install/binaries.mdx new file mode 100644 index 00000000000..5fb59360f8e --- /dev/null +++ b/docs/public-docs/rust/kona/node/install/binaries.mdx @@ -0,0 +1,5 @@ +--- +title: "Kona Binaries" +--- + +Download the latest pre-built binaries from the [GitHub releases page](https://github.com/ethereum-optimism/optimism/releases). diff --git a/docs/public-docs/rust/kona/node/install/docker.mdx b/docs/public-docs/rust/kona/node/install/docker.mdx new file mode 100644 index 00000000000..076734dc663 --- /dev/null +++ b/docs/public-docs/rust/kona/node/install/docker.mdx @@ -0,0 +1,64 @@ +--- +title: "Docker" +--- + +There are two ways to obtain a Kona Docker image: + +1. [GitHub](#github) +2. [Building it from source](#building-the-docker-image) + +Once you have obtained the Docker image, you can run the node. + +Jump ahead to [Run a Node using Docker page](/rust/kona/node/run/docker). + + +## GitHub + +Kona docker images are published with every release on GitHub Container Registry. + +You can obtain the latest `kona-node` image with: + +```bash +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node +``` + + +Specify a specific version (e.g. v0.1.0) like so. + +```bash +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node:v0.1.0 +``` + + +You can test the image with: + +```bash +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node --version +``` + +If you can see the [latest release](https://github.com/ethereum-optimism/optimism/releases) version, +then you've successfully installed Kona via Docker. + + +## Building the Docker image + +To build the image from source, navigate to the root of the repository and run: + +```bash +just build-local kona-node +``` + + +This will create an image with the tag `kona:local`. To specify a custom +tag, just pass it in after `kona-node` in the command above, like so: + +```bash +just build-local kona-node my-custom-tag +``` + + +The build will likely take several minutes. Once it's built, test it with: + +```bash +docker run kona:local --version +``` diff --git a/docs/public-docs/rust/kona/node/install/overview.mdx b/docs/public-docs/rust/kona/node/install/overview.mdx new file mode 100644 index 00000000000..957ba340122 --- /dev/null +++ b/docs/public-docs/rust/kona/node/install/overview.mdx @@ -0,0 +1,59 @@ +--- +--- + +--- +description: Installation instructions for Kona. +--- + +## Prerequisites + +Before installing Kona, ensure you have the following prerequisites: + +- **Rust toolchain** (MSRV: 1.82) +- **`just`** command runner +- **Docker** (optional, for containerized builds) + +### Installing Rust + +If you don't have Rust installed, you can install it using [rustup](https://rustup.rs/): + +```bash +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +Rustup is an easy way to update the Rust compiler, and works on all platforms. + +:::tip + +- During installation, when prompted, enter `1` for the default installation. +- After Rust installation completes, try running `cargo version` . If it cannot + be found, run `source $HOME/.cargo/env`. After that, running `cargo version` should return the version, for example `cargo 1.68.2`. +- It's generally advisable to append `source $HOME/.cargo/env` to `~/.bashrc`. + +::: + +The Minimum Supported Rust Version (MSRV) of this project is 1.82.0. If you +already have a version of Rust installed, you can check your version by running +`rustc --version`. To update your version of Rust, run rustup update. + + +### Installing Just + +`just` is a command runner that Kona uses for build tasks. Install it with: + +```bash +cargo install just +``` + +## Installation Methods + +There are three ways to obtain Kona: + +- [Docker images](/rust/kona/node/install/docker) +- [Pre-built binaries](/rust/kona/node/install/binaries) +- [Building from source](/rust/kona/node/install/source) + +:::note +If you have Docker installed, we recommend using the [Docker recipe](/rust/kona/node/run/docker) configuration +that will have kona-node, op-reth, Prometheus and Grafana running and syncing with just one command. +::: diff --git a/docs/public-docs/rust/kona/node/install/source.mdx b/docs/public-docs/rust/kona/node/install/source.mdx new file mode 100644 index 00000000000..e8a4bb7d8f6 --- /dev/null +++ b/docs/public-docs/rust/kona/node/install/source.mdx @@ -0,0 +1,84 @@ +--- +title: "Building from Source" +--- + +:::note + +Building from source requires that the Rust toolchain is installed, as well as the `just` command runner. + +Visit the [Prerequisites](/rust/kona/node/install/overview) for details on installing Rust and `just`. + +::: + +First clone the repository: + +```bash +git clone https://github.com/ethereum-optimism/optimism.git +cd rust/kona +``` + +Then, install the `kona-node` binary into your PATH directly via: + +```bash +cargo install --locked --path bin/node --bin kona-node +``` + +The binary will now be accessible as `kona-node` via the command line, +and exist under your default .cargo/bin folder. + +Alternatively, you can build yourself with: + +```bash +cargo build --release --bin kona-node +``` + +This will place the reth binary under `./target/release/kona-node`, and +you can copy it to your directory of preference after that. + +## Update Kona + +You can update the `kona-node` to a specific version by running the +commands below. + +`${VERSION}` is the version you wish to build in the format `vX.X.X`. + +```bash +git fetch +git checkout ${VERSION} +cargo build --release --bin kona-node +``` + +## Troubleshooting + +### Command is not found + +Reth will be installed to `CARGO_HOME` or `$HOME/.cargo`. +This directory needs to be on your `PATH` before you can run the +`kona-node` binary. + +See ["Configuring the PATH environment variable"][path] for more information. + +[path]: https://www.rust-lang.org/tools/install + +### Compilation error + +Make sure you are running the latest version of Rust. +If you have installed Rust using rustup, simply run `rustup update`. + +If you can't install the latest version of Rust you can instead compile +using the Minimum Supported Rust Version (MSRV) which is listed under +the `rust-version` key in kona's [Cargo.toml](https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/Cargo.toml). + +If compilation fails with `(signal: 9, SIGKILL: kill)`, this could mean +your machine ran out of memory during compilation. If you are on Docker, +consider increasing the memory of the container, or use a [pre-built +binary](/rust/kona/node/install/binaries). + +If compilation fails with `error: linking with cc failed: exit code: 1`, +try running `cargo clean`. + +## Next Steps + +- Read the [Overview](/rust/kona/intro/overview) to understand Kona's architecture +- Check out the [Binaries](/rust/kona/node/run/binary) documentation +- Explore the [Examples](/rust/kona/sdk/examples/intro) diff --git a/docs/public-docs/rust/kona/node/monitoring.mdx b/docs/public-docs/rust/kona/node/monitoring.mdx new file mode 100644 index 00000000000..ce2e44cdb4d --- /dev/null +++ b/docs/public-docs/rust/kona/node/monitoring.mdx @@ -0,0 +1,41 @@ +--- +title: "Monitoring" +--- + +The `kona-node` exposes metrics by default. Optionally, metrics +can be disabled with the `--metrics.disabled` cli flag. + +Unless otherwise specified, metrics are exposed on port `9090`. + +To grab a snapshot of the metrics, you can visit `0.0.0.0:9090` +or `curl` the url. + +``` +curl 0.0.0.0:9090 +``` + +The output should be raw text mapping metrics with their values. + +Remember, this is just a snapshot of the metrics at that point +in time. To record and visualize the metrics, we'll use +[Grafana and Prometheus](#-Grafana-and-Prometheus). + + +## Grafana and Prometheus + +Prometheus is a simple service that scrapes metrics at a predefined +interval. Grafana then uses Prometheus as a "Data Source" to +visualize the collected metrics. + +The Reth book provides a great overview to setting up [Prometheus +and Grafana][setup]. Visit the Reth docs to follow along. + +The `kona-node` comes shipped with a default Grafana dashboard +for the `kona-node`. To import the dashboard to grafana, click +the `+` icon > `Import Dashboard` > paste the contents of [kona's +dashboard][dashboard] in the textbox > `Load`. + + +[setup]: https://reth.rs/run/monitoring#prometheus--grafana + +[dashboard]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/docker/recipes/kona-node/grafana/dashboards/overview.json diff --git a/docs/public-docs/rust/kona/node/requirements.mdx b/docs/public-docs/rust/kona/node/requirements.mdx new file mode 100644 index 00000000000..58742f5e101 --- /dev/null +++ b/docs/public-docs/rust/kona/node/requirements.mdx @@ -0,0 +1,20 @@ +--- +title: "System Requirements" +--- + +`kona-node` is an L2 consensus client, so it stores almost nothing on disk! + + +Anything stored on disk is configurable, and can be disabled. + + +As a rollup node, it always sends L2 blocks over to the execution client +(`op-reth` or `op-geth`) for execution. That way, chain state is entirely +handled by the execution client. In this way, the `kona-node` is incredibly +lightweight and can be run on a wide range of hardware. + +That said, a stable and dependable internet connection is critical for the +peer-to-peer (P2P) part of the node. The `kona-node` relies on P2P communication +to sync the unsafe chain. If the connection is unstable, the node may +struggle to keep up, and could be banned by its peers for being too slow. + diff --git a/docs/public-docs/rust/kona/node/rpc/admin.mdx b/docs/public-docs/rust/kona/node/rpc/admin.mdx new file mode 100644 index 00000000000..81d4ecdc39b --- /dev/null +++ b/docs/public-docs/rust/kona/node/rpc/admin.mdx @@ -0,0 +1,130 @@ +--- +title: "Admin RPC Methods" +--- + +The `admin` api provides methods for controlling and monitoring Kona's consensus node operations. + +## `admin_postUnsafePayload` + +Posts an unsafe payload to the network. + +| Client | Method invocation | +| ------ | ----------------------------------------------------------- | +| RPC | `{"method": "admin_postUnsafePayload", "params": [payload]}` | + +### Parameters + +- `payload` (`OpExecutionPayloadEnvelope`): The execution payload envelope to post + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"admin_postUnsafePayload","params":[{...payload...}]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +## `admin_sequencerActive` + +Returns whether the sequencer is currently active. + +| Client | Method invocation | +| ------ | --------------------------------------------------- | +| RPC | `{"method": "admin_sequencerActive"}` | + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"admin_sequencerActive","params":[]} +{"jsonrpc":"2.0","id":1,"result":true} +``` + +**Note**: This method will return a "Method not found" error if the node is running in validator mode (sequencer not enabled). + +## `admin_startSequencer` + +Starts the sequencer. + +| Client | Method invocation | +| ------ | --------------------------------------------------- | +| RPC | `{"method": "admin_startSequencer"}` | + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"admin_startSequencer","params":[]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +**Note**: This method will return a "Method not found" error if the node is running in validator mode (sequencer not enabled). + +## `admin_stopSequencer` + +Stops the sequencer and returns the hash of the last processed block. + +| Client | Method invocation | +| ------ | --------------------------------------------------- | +| RPC | `{"method": "admin_stopSequencer"}` | + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"admin_stopSequencer","params":[]} +{"jsonrpc":"2.0","id":1,"result":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"} +``` + +**Note**: This method will return a "Method not found" error if the node is running in validator mode (sequencer not enabled). + +## `admin_conductorEnabled` + +Returns whether the conductor is enabled. + +| Client | Method invocation | +| ------ | --------------------------------------------------- | +| RPC | `{"method": "admin_conductorEnabled"}` | + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"admin_conductorEnabled","params":[]} +{"jsonrpc":"2.0","id":1,"result":false} +``` + +**Note**: This method will return a "Method not found" error if the node is running in validator mode (sequencer not enabled). + +## `admin_setRecoverMode` + +Sets the recovery mode for the sequencer. + +| Client | Method invocation | +| ------ | --------------------------------------------------------- | +| RPC | `{"method": "admin_setRecoverMode", "params": [mode]}` | + +### Parameters + +- `mode` (`bool`): Whether to enable recovery mode (true) or disable it (false) + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"admin_setRecoverMode","params":[true]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +**Note**: This method will return a "Method not found" error if the node is running in validator mode (sequencer not enabled). + +## `admin_overrideLeader` + +Overrides the leader in the conductor. + +| Client | Method invocation | +| ------ | --------------------------------------------------- | +| RPC | `{"method": "admin_overrideLeader"}` | + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"admin_overrideLeader","params":[]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +**Note**: This method will return a "Method not found" error if the node is running in validator mode (sequencer not enabled). diff --git a/docs/public-docs/rust/kona/node/rpc/overview.mdx b/docs/public-docs/rust/kona/node/rpc/overview.mdx new file mode 100644 index 00000000000..13735e28f9a --- /dev/null +++ b/docs/public-docs/rust/kona/node/rpc/overview.mdx @@ -0,0 +1,27 @@ +--- +title: "JSON-RPC" +--- + +The `kona-node` supports JSON-RPC for interacting with the node. + +By default, `kona-node` exposes an HTTP JSON-RPC server. A WebSocket JSON-RPC +endpoint is also available and can be enabled with the `--rpc.ws-enabled` flag +or the `KONA_NODE_RPC_WS_ENABLED` environment variable. IPC transport is not +supported. + +### Namespaces + +JSON-RPC methods are grouped into namespaces, which are listed below: + +| Namespace | Description | Sensitive | +| ---------------------------- | ------------------------------------------------------------------------------------------------------ | --------- | +| [`p2p`](/rust/kona/node/rpc/p2p) | The `p2p` API allows you to configure the p2p stack. | Maybe | +| [`rollup`](/rust/kona/node/rpc/rollup) | The `rollup` API provides OP Stack specific rpc methods. | No | +| [`admin`](/rust/kona/node/rpc/admin) | The `admin` API allows you to configure your node. | **Yes** | + + +### Interacting with the RPC + +Kona enables these RPC methods by default. + +You can interact with the RPC using any JSON-RPC client, such as `curl`, `httpie`, or a custom client in your preferred programming language. diff --git a/docs/public-docs/rust/kona/node/rpc/p2p.mdx b/docs/public-docs/rust/kona/node/rpc/p2p.mdx new file mode 100644 index 00000000000..52270b3672d --- /dev/null +++ b/docs/public-docs/rust/kona/node/rpc/p2p.mdx @@ -0,0 +1,331 @@ +--- +title: "P2P RPC Methods" +--- + +The `p2p` api provides methods for interacting with Kona's P2P stack. + +## Peer Information Methods + +### `opp2p_self` + +Returns information about the local node in the form of `PeerInfo`. + +| Client | Method invocation | +| ------ | -------------------------- | +| RPC | `{"method": "opp2p_self"}` | + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_self","params":[]} +{"jsonrpc":"2.0","id":1,"result":{"peerID":"16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x","nodeID":"0x311d8222ffc44e9c86f403d57f454bd823e7dc9d3c8e97171ddd862910352f31","userAgent":"kona","protocolVersion":"","ENR":"enr:-Jm4QBAdUpUqrpTj6yQor5mwif6RRmY11dlj-Um3TqKmJiYha4SUNqdJr2eM3pRsFVCwVikYcBk__5JVTwngUeimKxcCgmlkgnY0gmlwhC36_pOHb3BzdGFja4Xc76gFAIlzZWNwMjU2azGhA2WTa6OqvnWbRmoeuhRRu-BTPgP8y4_MY6snTsNW0gHBg3RjcIIj5oN1ZHCCn7U","addresses":["/ip4/127.0.0.1/tcp/9190/p2p/16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x","/ip4/172.18.0.9/tcp/9190/p2p/16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x"],"protocols":["/ipfs/id/push/1.0.0","/meshsub/1.1.0","/ipfs/ping/1.0.0","/meshsub/1.2.0","/ipfs/id/1.0.0","/opstack/req/payload_by_number/2151908/0/","/meshsub/1.0.0","/floodsub/1.0.0"],"connectedness":1,"direction":1,"protected":false,"chainID":11155420,"latency":0,"gossipBlocks":true,"scores":{"gossip":{"total":0.0,"blocks":{"timeInMesh":0.0,"firstMessageDeliveries":0.0,"meshMessageDeliveries":0.0,"invalidMessageDeliveries":0.0},"IPColocationFactor":0.0,"behavioralPenalty":0.0},"reqResp":{"validResponses":0.0,"errorResponses":0.0,"rejectedPayloads":0.0}}}} +``` + +### `opp2p_peerCount` + +Returns the count of connected peers for both discovery and gossip networks. + +| Client | Method invocation | +| ------ | ------------------------------- | +| RPC | `{"method": "opp2p_peerCount"}` | + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_peerCount","params":[]} +{"jsonrpc":"2.0","id":1,"result":{"connectedDiscovery":15,"connectedGossip":12}} +``` + +### `opp2p_peers` + +Returns information about peers. If `connected` parameter is true, only returns connected peers. + +| Client | Method invocation | +| ------ | ----------------------------------------------------- | +| RPC | `{"method": "opp2p_peers", "params": [connected]}` | + +#### Parameters + +- `connected` (boolean): If true, only returns connected peers + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_peers","params":[true]} +{"jsonrpc":"2.0","id":1,"result":{"totalConnected":2,"peers":{"16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x":{"peerID":"16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x","nodeID":"0x311d8222ffc44e9c86f403d57f454bd823e7dc9d3c8e97171ddd862910352f31","userAgent":"kona","protocolVersion":"","addresses":["/ip4/127.0.0.1/tcp/9190"],"protocols":["/ipfs/ping/1.0.0","/meshsub/1.1.0"],"connectedness":1,"direction":2,"protected":false,"chainID":11155420,"latency":50000000,"gossipBlocks":true,"scores":{"gossip":{"total":1.5,"blocks":{"timeInMesh":100.0,"firstMessageDeliveries":10.0,"meshMessageDeliveries":5.0,"invalidMessageDeliveries":0.0},"IPColocationFactor":0.0,"behavioralPenalty":0.0},"reqResp":{"validResponses":25.0,"errorResponses":1.0,"rejectedPayloads":0.0}}}},"bannedPeers":[],"bannedIPS":[],"bannedSubnets":[]}} +``` + +### `opp2p_peerStats` + +Returns statistical information about peers including connection counts and topic subscriptions. + +| Client | Method invocation | +| ------ | -------------------------------- | +| RPC | `{"method": "opp2p_peerStats"}` | + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_peerStats","params":[]} +{"jsonrpc":"2.0","id":1,"result":{"connected":12,"table":50,"blocksTopic":8,"blocksTopicV2":10,"blocksTopicV3":5,"blocksTopicV4":2,"banned":3,"known":75}} +``` + +### `opp2p_discoveryTable` + +Returns the discovery table entries as a list of ENR strings. + +| Client | Method invocation | +| ------ | ------------------------------------- | +| RPC | `{"method": "opp2p_discoveryTable"}` | + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_discoveryTable","params":[]} +{"jsonrpc":"2.0","id":1,"result":["enr:-Jm4QBAdUpUqrpTj6yQor5mwif6RRmY11dlj-Um3TqKmJiYha4SUNqdJr2eM3pRsFVCwVikYcBk__5JVTwngUeimKxcCgmlkgnY0gmlwhC36_pOHb3BzdGFja4Xc76gFAIlzZWNwMjU2azGhA2WTa6OqvnWbRmoeuhRRu-BTPgP8y4_MY6snTsNW0gHBg3RjcIIj5oN1ZHCCn7U","enr:-Km4QBqBrKNq7F5L1dSrWW8Y1k8k4V2L2nTsNtGuKPpPwp3L_rBVMaQCQpnc2sBB-c2yV_n4qgM2_2yfcNjVXr4OFgCgmlkgnY0gmlwhH8AAAGHb3BzdGFja4OFAoAE"]} +``` + +## Peer Blocking Methods + +### `opp2p_blockPeer` + +Blocks a specific peer by peer ID, preventing any connections to or from that peer. + +| Client | Method invocation | +| ------ | --------------------------------------------------- | +| RPC | `{"method": "opp2p_blockPeer", "params": [peerID]}` | + +#### Parameters + +- `peerID` (string): The peer ID to block + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_blockPeer","params":["16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +### `opp2p_unblockPeer` + +Unblocks a previously blocked peer by peer ID. + +| Client | Method invocation | +| ------ | ----------------------------------------------------- | +| RPC | `{"method": "opp2p_unblockPeer", "params": [peerID]}` | + +#### Parameters + +- `peerID` (string): The peer ID to unblock + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_unblockPeer","params":["16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +### `opp2p_listBlockedPeers` + +Returns a list of all blocked peer IDs. + +| Client | Method invocation | +| ------ | -------------------------------------- | +| RPC | `{"method": "opp2p_listBlockedPeers"}` | + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_listBlockedPeers","params":[]} +{"jsonrpc":"2.0","id":1,"result":["16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x","16Uiu2HAm7Th3s3C1VHmKrYzA9nPzV4b3vqL8z1x8WZzGk2t9DjRK"]} +``` + +## Address Blocking Methods + +### `opp2p_blockAddr` + +Blocks connections from a specific IP address. + +| Client | Method invocation | +| ------ | -------------------------------------------------- | +| RPC | `{"method": "opp2p_blockAddr", "params": [address]}` | + +#### Parameters + +- `address` (string): The IP address to block (IPv4 or IPv6) + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_blockAddr","params":["192.168.1.100"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +### `opp2p_unblockAddr` + +Unblocks a previously blocked IP address. + +| Client | Method invocation | +| ------ | ----------------------------------------------------- | +| RPC | `{"method": "opp2p_unblockAddr", "params": [address]}` | + +#### Parameters + +- `address` (string): The IP address to unblock (IPv4 or IPv6) + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_unblockAddr","params":["192.168.1.100"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +### `opp2p_listBlockedAddrs` + +Returns a list of all blocked IP addresses. + +| Client | Method invocation | +| ------ | -------------------------------------- | +| RPC | `{"method": "opp2p_listBlockedAddrs"}` | + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_listBlockedAddrs","params":[]} +{"jsonrpc":"2.0","id":1,"result":["192.168.1.100","10.0.0.50","2001:db8::1"]} +``` + +## Subnet Blocking Methods + +### `opp2p_blockSubnet` + +Blocks connections from an entire IP subnet using CIDR notation. + +| Client | Method invocation | +| ------ | -------------------------------------------------- | +| RPC | `{"method": "opp2p_blockSubnet", "params": [subnet]}` | + +#### Parameters + +- `subnet` (string): The subnet to block in CIDR notation (e.g., "192.168.1.0/24") + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_blockSubnet","params":["192.168.1.0/24"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +### `opp2p_unblockSubnet` + +Unblocks a previously blocked IP subnet. + +| Client | Method invocation | +| ------ | ---------------------------------------------------- | +| RPC | `{"method": "opp2p_unblockSubnet", "params": [subnet]}` | + +#### Parameters + +- `subnet` (string): The subnet to unblock in CIDR notation + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_unblockSubnet","params":["192.168.1.0/24"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +### `opp2p_listBlockedSubnets` + +Returns a list of all blocked IP subnets. + +| Client | Method invocation | +| ------ | ---------------------------------------- | +| RPC | `{"method": "opp2p_listBlockedSubnets"}` | + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_listBlockedSubnets","params":[]} +{"jsonrpc":"2.0","id":1,"result":["192.168.1.0/24","10.0.0.0/16","2001:db8::/32"]} +``` + +## Peer Protection Methods + +### `opp2p_protectPeer` + +Protects a peer from being disconnected due to connection limits or other automatic pruning mechanisms. + +| Client | Method invocation | +| ------ | ---------------------------------------------------- | +| RPC | `{"method": "opp2p_protectPeer", "params": [peerID]}` | + +#### Parameters + +- `peerID` (string): The peer ID to protect + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_protectPeer","params":["16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +### `opp2p_unprotectPeer` + +Removes protection from a peer, allowing it to be disconnected by automatic pruning mechanisms. + +| Client | Method invocation | +| ------ | ------------------------------------------------------ | +| RPC | `{"method": "opp2p_unprotectPeer", "params": [peerID]}` | + +#### Parameters + +- `peerID` (string): The peer ID to unprotect + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_unprotectPeer","params":["16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +## Connection Management Methods + +### `opp2p_connectPeer` + +Attempts to establish a connection to a specific peer using a multiaddress. + +| Client | Method invocation | +| ------ | ------------------------------------------------------ | +| RPC | `{"method": "opp2p_connectPeer", "params": [multiaddr]}` | + +#### Parameters + +- `multiaddr` (string): The multiaddress of the peer to connect to + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_connectPeer","params":["/ip4/127.0.0.1/tcp/9190/p2p/16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` + +### `opp2p_disconnectPeer` + +Disconnects from a specific peer by peer ID. + +| Client | Method invocation | +| ------ | ------------------------------------------------------- | +| RPC | `{"method": "opp2p_disconnectPeer", "params": [peerID]}` | + +#### Parameters + +- `peerID` (string): The peer ID to disconnect from + +#### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"opp2p_disconnectPeer","params":["16Uiu2HAmKVVub7edwZ3RKDnqMpZVsusYW9TKRgbwpH54nvDWLE4x"]} +{"jsonrpc":"2.0","id":1,"result":null} +``` diff --git a/docs/public-docs/rust/kona/node/rpc/rollup.mdx b/docs/public-docs/rust/kona/node/rpc/rollup.mdx new file mode 100644 index 00000000000..bb287a48fef --- /dev/null +++ b/docs/public-docs/rust/kona/node/rpc/rollup.mdx @@ -0,0 +1,356 @@ +--- +title: "Rollup RPC Methods" +--- + +The `optimism` API provides methods for interacting with Kona's rollup state and configuration. + +## `optimism_outputAtBlock` + +Returns the output root at a specific block number, including the L2 block reference, withdrawal storage root, state root, and sync status. + +| Client | Method invocation | +| ------ | -------------------------------------------------------------- | +| RPC | `{"method": "optimism_outputAtBlock", "params": [blockNumber]}` | + +### Parameters + +- `blockNumber` (`BlockNumberOrTag`): The block number to get the output for. Can be a number, "latest", "earliest", "pending", "safe", or "finalized". + +### Returns + +`OutputResponse` - An object containing: +- `version` (`string`): The output version hash +- `outputRoot` (`string`): The output root hash +- `blockRef` (`L2BlockInfo`): Reference to the L2 block +- `withdrawalStorageRoot` (`string`): The withdrawal storage root +- `stateRoot` (`string`): The state root +- `syncStatus` (`SyncStatus`): The current sync status of the node + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"optimism_outputAtBlock","params":["latest"]} +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "version": "0x0000000000000000000000000000000000000000000000000000000000000000", + "outputRoot": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + "blockRef": { + "hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "number": 12345, + "parentHash": "0x9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba", + "timestamp": 1699123456, + "l1Origin": { + "hash": "0xfedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321", + "number": 18123456 + }, + "sequenceNumber": 42 + }, + "withdrawalStorageRoot": "0x567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234", + "stateRoot": "0xcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab", + "syncStatus": { + "current_l1": { + "hash": "0x1111111111111111111111111111111111111111111111111111111111111111", + "number": 18123456 + }, + "current_l1_finalized": { + "hash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "number": 18123400 + }, + "head_l1": { + "hash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "number": 18123460 + }, + "safe_l1": { + "hash": "0x4444444444444444444444444444444444444444444444444444444444444444", + "number": 18123450 + }, + "finalized_l1": { + "hash": "0x5555555555555555555555555555555555555555555555555555555555555555", + "number": 18123400 + }, + "unsafe_l2": { + "hash": "0x6666666666666666666666666666666666666666666666666666666666666666", + "number": 12350, + "parentHash": "0x7777777777777777777777777777777777777777777777777777777777777777", + "timestamp": 1699123500, + "l1Origin": { + "hash": "0x8888888888888888888888888888888888888888888888888888888888888888", + "number": 18123460 + }, + "sequenceNumber": 47 + }, + "safe_l2": { + "hash": "0x9999999999999999999999999999999999999999999999999999999999999999", + "number": 12345, + "parentHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "timestamp": 1699123456, + "l1Origin": { + "hash": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "number": 18123456 + }, + "sequenceNumber": 42 + }, + "finalized_l2": { + "hash": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "number": 12340, + "parentHash": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "timestamp": 1699123400, + "l1Origin": { + "hash": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "number": 18123400 + }, + "sequenceNumber": 37 + }, + "cross_unsafe_l2": { + "hash": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "number": 12350, + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000001", + "timestamp": 1699123500, + "l1Origin": { + "hash": "0x0000000000000000000000000000000000000000000000000000000000000002", + "number": 18123460 + }, + "sequenceNumber": 47 + }, + "local_safe_l2": { + "hash": "0x0000000000000000000000000000000000000000000000000000000000000003", + "number": 12345, + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000004", + "timestamp": 1699123456, + "l1Origin": { + "hash": "0x0000000000000000000000000000000000000000000000000000000000000005", + "number": 18123456 + }, + "sequenceNumber": 42 + } + } + } +} +``` + +## `optimism_syncStatus` + +Returns the current synchronization status of the rollup node, including information about L1 and L2 block states. + +| Client | Method invocation | +| ------ | -------------------------------------------- | +| RPC | `{"method": "optimism_syncStatus", "params": []}` | + +### Returns + +`SyncStatus` - An object containing detailed sync information: +- `current_l1` (`BlockInfo`): The current L1 block that derivation is idled at +- `current_l1_finalized` (`BlockInfo`): The current L1 finalized block (legacy/deprecated) +- `head_l1` (`BlockInfo`): The L1 head block reference +- `safe_l1` (`BlockInfo`): The L1 safe head block reference +- `finalized_l1` (`BlockInfo`): The finalized L1 block reference +- `unsafe_l2` (`L2BlockInfo`): The unsafe L2 block reference (absolute tip) +- `safe_l2` (`L2BlockInfo`): The safe L2 block reference (derived from L1) +- `finalized_l2` (`L2BlockInfo`): The finalized L2 block reference +- `cross_unsafe_l2` (`L2BlockInfo`): Cross-unsafe L2 block with verified cross-L2 dependencies +- `local_safe_l2` (`L2BlockInfo`): Local safe L2 block derived from L1, not yet cross-verified + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"optimism_syncStatus","params":[]} +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "current_l1": { + "hash": "0x1111111111111111111111111111111111111111111111111111111111111111", + "number": 18123456 + }, + "current_l1_finalized": { + "hash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "number": 18123400 + }, + "head_l1": { + "hash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "number": 18123460 + }, + "safe_l1": { + "hash": "0x4444444444444444444444444444444444444444444444444444444444444444", + "number": 18123450 + }, + "finalized_l1": { + "hash": "0x5555555555555555555555555555555555555555555555555555555555555555", + "number": 18123400 + }, + "unsafe_l2": { + "hash": "0x6666666666666666666666666666666666666666666666666666666666666666", + "number": 12350, + "parentHash": "0x7777777777777777777777777777777777777777777777777777777777777777", + "timestamp": 1699123500, + "l1Origin": { + "hash": "0x8888888888888888888888888888888888888888888888888888888888888888", + "number": 18123460 + }, + "sequenceNumber": 47 + }, + "safe_l2": { + "hash": "0x9999999999999999999999999999999999999999999999999999999999999999", + "number": 12345, + "parentHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "timestamp": 1699123456, + "l1Origin": { + "hash": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "number": 18123456 + }, + "sequenceNumber": 42 + }, + "finalized_l2": { + "hash": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "number": 12340, + "parentHash": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "timestamp": 1699123400, + "l1Origin": { + "hash": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "number": 18123400 + }, + "sequenceNumber": 37 + }, + "cross_unsafe_l2": { + "hash": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "number": 12350, + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000001", + "timestamp": 1699123500, + "l1Origin": { + "hash": "0x0000000000000000000000000000000000000000000000000000000000000002", + "number": 18123460 + }, + "sequenceNumber": 47 + }, + "local_safe_l2": { + "hash": "0x0000000000000000000000000000000000000000000000000000000000000003", + "number": 12345, + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000004", + "timestamp": 1699123456, + "l1Origin": { + "hash": "0x0000000000000000000000000000000000000000000000000000000000000005", + "number": 18123456 + }, + "sequenceNumber": 42 + } + } +} +``` + +## `optimism_rollupConfig` + +Returns the rollup configuration parameters that define the rollup chain's behavior and properties. + +| Client | Method invocation | +| ------ | ---------------------------------------------- | +| RPC | `{"method": "optimism_rollupConfig", "params": []}` | + +### Returns + +`RollupConfig` - An object containing the complete rollup configuration: +- `genesis` (`ChainGenesis`): The genesis state of the rollup +- `blockTime` (`number`): The block time of the L2 in seconds +- `maxSequencerDrift` (`number`): Maximum sequencer drift in seconds +- `seqWindowSize` (`number`): The sequencer window size +- `channelTimeout` (`number`): Number of L1 blocks between channel open/close +- `graniteChannelTimeout` (`number`): Channel timeout after Granite hardfork +- `l1ChainId` (`number`): The L1 chain ID +- `l2ChainId` (`number`): The L2 chain ID +- `batchInboxAddress` (`string`): L1 address where batches are sent +- `depositContractAddress` (`string`): L1 address for deposits +- `l1SystemConfigAddress` (`string`): L1 address for system config +- `protocolVersionsAddress` (`string`): L1 address for protocol versions +- Additional configuration fields for hardforks, fees, and interoperability + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"optimism_rollupConfig","params":[]} +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "genesis": { + "l1": { + "hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + "number": 18000000 + }, + "l2": { + "hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "number": 0, + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1699000000, + "l1Origin": { + "hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + "number": 18000000 + }, + "sequenceNumber": 0 + }, + "l2Time": 1699000000, + "systemConfig": { + "batcherAddr": "0x1234567890123456789012345678901234567890", + "overhead": "0x00000000000000000000000000000000000000000000000000000000000000bc", + "scalar": "0x00000000000000000000000000000000000000000000000000000000000f4240", + "gasLimit": 30000000 + } + }, + "blockTime": 2, + "maxSequencerDrift": 600, + "seqWindowSize": 3600, + "channelTimeout": 300, + "graniteChannelTimeout": 50, + "l1ChainId": 1, + "l2ChainId": 10, + "batchInboxAddress": "0xff00000000000000000000000000000000000010", + "depositContractAddress": "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed", + "l1SystemConfigAddress": "0x229047fed2591dbec1eF1118d64F7aF3dB9EB290", + "protocolVersionsAddress": "0x8062AbC286f5e7D9428a0Ccb9AbD71e50d93b935", + "superchainConfigAddress": "0x95703e0982140D16f8ebA6d158FccEde42f04a4C", + "blobs_data": 1710374400, + "interopMessageExpiryWindow": 3600, + "chainOpConfig": { + "canyon_denominator": 250, + "canyon_elasticity": 6 + } + } +} +``` + +## `optimism_version` + +Returns the software version of the Kona rollup node. + +| Client | Method invocation | +| ------ | ---------------------------------------- | +| RPC | `{"method": "optimism_version", "params": []}` | + +### Returns + +`string` - The version string of the Kona software (e.g., "0.1.0") + +### Example + +```js +// > {"jsonrpc":"2.0","id":1,"method":"optimism_version","params":[]} +{ + "jsonrpc": "2.0", + "id": 1, + "result": "0.1.0" +} +``` + +## Deprecated Methods + +### `optimism_safeHeadAtL1Block` + +This RPC endpoint is **not supported** in Kona. It was used to track the safe head for every L1 block, but this is no longer necessary post-interop. Calling this method will return a "Method not found" error. + +| Client | Method invocation | +| ------ | ------------------------------------------------------------------- | +| RPC | `{"method": "optimism_safeHeadAtL1Block", "params": [blockNumber]}` | + +### Returns + +This method returns an error with code `-32601` (Method not found). diff --git a/docs/public-docs/rust/kona/node/run/binary.mdx b/docs/public-docs/rust/kona/node/run/binary.mdx new file mode 100644 index 00000000000..01166f36b30 --- /dev/null +++ b/docs/public-docs/rust/kona/node/run/binary.mdx @@ -0,0 +1,232 @@ +--- +title: "Run Kona Node as a Binary" +--- + +:::note + +If you haven't already built the `kona-node` binary, head over to the +[Installation](/rust/kona/node/install/overview) guide. + +::: + +`kona-node` is an L2 consensus client (also called a "rollup node"). +This means that the node is a _consensus_-layer client, which needs +a corresponding execution-layer client in order to sync and follow +the L2 chain. A number of L2 execution layer clients are available, +since the OP Stack uses a minimal diff approach to L1 execution +clients, including [`op-reth`][op-reth] and [`op-geth`][op-geth]. + +This section will illustrate running the `kona-node` with an instance +of [`op-reth`][op-reth]. + +Out of the box, the `kona-node` can be used for any `OP Stack` chain +that is part of the [`superchain-registry`][scr]. In order to use an +out-of-band `OP Stack` chain, for example a new devnet, you'll need +to specify the rollup config using the custom `--l2-config-file` +cli flag. More on that in the +[More Detailed Node Docs Section](#-More-Detailed-Node-Docs). + + +This tutorial walks through running the `kona-node` as +a binary. To use docker, head over to the +[Docker Guide](/rust/kona/node/run/docker) which uses a `docker-compose` +setup provided by `kona`. The `docker-compose` setup +automatically bootstraps the `kona-node` with `op-reth`, +provisioning grafana dashboards and a default Prometheus +configuration. It is encouraged to follow the +[Docker Guide](/rust/kona/node/run/docker) to avoid misconfigurations. + + +The `kona-node` requires a few CLI flags. + +- `--l1-eth-rpc ` + URL of the L1 execution client RPC API. +- `--l1-beacon ` + URL of the L1 beacon API. +- `--l2-engine-rpc ` + URL of the engine API endpoint of an L2 execution client. + +The L2 engine RPC points to the execution layer client's engine API, +[`op-reth`][op-reth]. + +An L1 beacon endpoint and rpc endpoint are also required to +fetch the L1 chain data that the L2 chain is derived from. + +First, start an instance of [`op-reth`][op-reth]. The +[`op-reth` docs][op-reth-docs] provide very detailed instructions +for running `op-reth` nodes for OP Stack chains (L2). For this +demo, we'll use `base`, but any other OP Stack chain will do. + +``` +op-reth node \ + --chain base \ + --rollup.sequencer-http https://mainnet-sequencer.base.org \ + --http \ + --ws \ + --authrpc.port 9551 \ + --authrpc.jwtsecret /path/to/jwt.hex +``` + +Kona has a `generate-jwt` justfile target that can be used to +create the `jwt.hex` file. Run `just generate-jwt`. + + + +The JWT token file path passed into `--authrpc.jwtsecret` +**MUST** be the same as the one passed into the `kona-node`. + +This JWT token is how the `op-reth` client authenticates +requests made by the `kona-node` to the engine rpc. + +By default, the `kona-node` will attempt to read a JWT token +from a `jwt.hex` file in the local directory. If it cannot +find one, it will create a JWT token in a new `jwt.hex` file. + +To specify the path to the file that contains the JWT token, +pass the file path into the `--l2.jwt-secret` CLI flag or +use the `KONA_NODE_L2_ENGINE_AUTH` environment variable. + + +Then, run the `kona-node` using Base's chain id - `8453`. + +``` +kona-node node \ + --chain 8453 \ + --l1-eth-rpc \ + --l1-beacon \ + --l2-engine-rpc http://127.0.0.1:9551 \ +``` + +That's it! Your node should connect to P2P and start syncing +quickly. + +#### RPC Trust Configuration + +By default, `kona-node` trusts RPC providers and doesn't perform additional verification. +This is suitable for local nodes but should be changed when using public RPC endpoints: + +``` +kona-node node \ + --chain 8453 \ + --l1-eth-rpc https://public-eth-rpc.com \ + --l1-trust-rpc false \ + --l1-beacon https://public-beacon-api.com \ + --l2-engine-rpc http://127.0.0.1:9551 \ + # L2 trust-rpc defaults to true for local engine +``` + +The `--l1-trust-rpc false` flag enables block hash verification for the L1 RPC, +protecting against malicious or faulty public RPC providers. + + +#### Debugging + +`kona-node` provides a `-v` (or `--v`) flag as a way to set +the "verbosity" level for logs. By default, the verbosity level +is set to `3`, which is the INFO level. The level ranges from `0` +being no logs to `5` which includes trace logs. Log levels are +listed below, with each level including the one below it. + +- `5`: `TRACE` - very verbose logs that provide a detailed trace +- `4`: `DEBUG` - logs meant to print debugging information +- `3`: `INFO` - informational logs +- `2`: `WARN` - includes warning and error logs +- `1`: `ERROR` - only error logs are shown +- `0`: No logs + +The default verbosity level is `-vvv` which is the `3` or `INFO` +level. To set the `kona-node` to print `DEBUG` logs or level `4`, +run the node like so: `kona-node node -vvvv`. + +By default, the `kona-node` initializes its tracing (logging) +using the default environment variable filter [provided by the +tracing_subscriber crate][tracing-env]. This uses the value in +the `RUST_LOG` environment variable to set the tracing level +for specific targets. Effectively, `RUST_LOG` allows you to +bypass the default log level for the whole node or specific +log targets. For example, by prepending `RUST_LOG=engine=debug` +to the `kona-node` command (or setting that as an environment +variable), only `INFO` logs will be displayed except for the +`engine` log target which will also print `DEBUG` logs. + +This comes in handy say for when we would like to debug Kona's +P2P stack, we could prepend `RUST_LOG=discv5=debug,libp2p=debug` +to view debug logs from only `discv5` and `libp2p` targets. + + +#### More Detailed Node Docs + +There are a number of important defaults. + +- The node will poll and update the runtime config every 10 minutes. + Configurable via the `--l1.runtime-config-reload-interval` flag. +- The P2P stack is spun up. The libp2p swarm listens on TCP `9222` + to receive block gossip. The `discv5` discovery service runs on + UDP port `9223`. Peer scoring is enabled. +- An RPC server is exposed at `0.0.0.0:9545`. Websocket connections + are disabled by default. +- Metrics are enabled, serving prometheus metrics on `0.0.0.0:9090`. + This can be configured using the `--metrics.enabled`, + `--metrics.port`, and `--metrics.addr` cli flags. + + +If a file path to a rollup config is _not_ specified via the +`--l2-config-file` cli flag, the Rollup Config will be loaded +via the [superchain registry][scr]. + +A custom rollup config can either be specified through the +`--l2-config-file` flag, or specific values may be overridden +using a set of override flags provided by the `kona-node`. + +Override flags (for example `--canyon-override`) can be viewed +in the help menu by running `kona-node node --help`. The only +overrides currently supported are hardfork timestamps in seconds. + + +A set of CLI flags relating to the sequencer and supervisor are +also available to the `kona-node` binary. + +Now, when the `kona-node` starts up, it should immediately spin up +the P2P stack. It will begin discovering valid peers on the network +with the same chain id (base - `8453`) and OP Stack enr key "opstack". +When valid peers are discovered, they are sent to the libp2p swarm +which attempts to connect to them and listen for block gossip. + +Depending on the chain, and the P2P network topology, it may take +longer for the `kona-node` to establish a strong set of peers and +begin receiving block gossip. For larger, more mature chains like +OP Mainnet and Base, peer discovery should happen quickly via the +chain's P2P bootnodes. + +Once the first unsafe L2 payload attributes (block) is received +from peers in the libp2p swarm, it is sent off to the `kona-node`'s +engine actor which will kick off execution layer sync on the +`op-reth` execution client. When this happens, the `op-reth` logs +will start to show that it is fetching past L2 blocks to sync the +chain to tip. + +Once EL sync is finished, `kona-node`'s derivation actor will +kick off the derivation pipeline and begin deriving the L2 chain. +All the while, the P2P stack is separately receiving unsafe L2 +blocks from the chain's sequencer, and sending them off to the +engine actor to insert into the chain. + + +### Configuring a Dockerfile + +To learn more about running a `kona-node` using docker, check +out the [docker guide](/rust/kona/node/run/docker). + + +[tracing-env]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#method.from_default_env + +[scr]: https://github.com/ethereum-optimism/superchain-registry/tree/main + +[op-reth-docs]: https://reth.rs/run/opstack + +[op-reth]: https://github.com/paradigmxyz/reth/blob/main/crates/optimism/bin/src/main.rs +[op-geth]: https://github.com/ethereum-optimism/op-geth + +[buildx]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/docker +[packages]: https://github.com/orgs/op-rs/packages?repo_name=kona +[pdocs]: https://github.com/ethereum-optimism/optimism/pkgs/container/kona%2Fkona-node/446969659?tag=latest diff --git a/docs/public-docs/rust/kona/node/run/docker.mdx b/docs/public-docs/rust/kona/node/run/docker.mdx new file mode 100644 index 00000000000..3556f3fc685 --- /dev/null +++ b/docs/public-docs/rust/kona/node/run/docker.mdx @@ -0,0 +1,179 @@ +--- +title: "Docker Guide" +--- + +:::info + +This guide uses Kona's pre-packaged docker config. + +For detailed usage of the `kona-node` binary, head +over to [the binary guide](/rust/kona/node/run/binary). + +::: + +Kona provides a [`kona-node` docker recipe][recipe] +with detailed instructions for running a complete node setup. + +## Quick Start + +The easiest way to run `kona-node` with Docker is using the provided recipe: + +1. **Navigate to the recipe directory:** + ```bash + cd docker/recipes/kona-node + ``` + +2. **Configure environment variables:** + Edit `cfg.env` to set your L1 RPC endpoints: + ```bash + L1_PROVIDER_RPC=https://your-l1-rpc-endpoint + L1_BEACON_API=https://your-l1-beacon-endpoint + ``` + +3. **Start the services:** + ```bash + just up + ``` + +This will start: +- `kona-node` - The OP Stack node implementation +- `op-reth` - Execution layer client +- `prometheus` - Metrics collection +- `grafana` - Monitoring dashboards (accessible at http://localhost:3000) + +## Docker Compose + +In the [provided docker compose][compose], there are a few services +aside from the `kona-node` and `op-reth`. These are `prometheus` +and `grafana` which automatically come provisioned with dashboards +for monitoring and insight into the `kona-node` and `op-reth` services. +For more detail into how Prometheus and Grafana work, head over to the +[Monitoring][monitoring] docs. + +The `docker-compose.yaml` uses published images from GitHub Container Registry: + +- **`op-reth`**: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth:develop +- **`kona-node`**: us-docker.pkg.dev/oplabs-tools-artifacts/images/kona-node:develop + +### Service Configuration + +#### kona-node Service + +The `kona-node` service is configured with the following key settings: + +- **Ports**: + - `5060` - RPC endpoint + - `9223` - P2P discovery (TCP/UDP) + - `9002` - Metrics +- **Environment**: L1 RPC and Beacon API endpoints are required +- **Volumes**: Persistent data storage and JWT token for engine API authentication + +#### op-reth Service + +The `op-reth` service provides the execution layer: + +- **Ports**: + - `8545` - HTTP RPC + - `8551` - Engine API (authenticated) + - `30303` - P2P discovery + - `9001` - Metrics +- **Configuration**: Pre-configured for OP Sepolia testnet + +## Configuration + +### Network Selection + +By default, the recipe is configured for **OP Sepolia**. To sync a different OP Stack chain: + +1. Set appropriate L1 endpoints for your target network in `cfg.env` +2. Modify the docker-compose.yaml: + - Update `op-reth --chain` parameter + - Update `op-reth --rollup.sequencer-http` endpoint + - Update `kona-node --chain` parameter + +### RPC Trust Configuration + +By default, `kona-node` trusts RPC providers (both L1 and L2). When using public or untrusted RPC endpoints, you should disable trust to enable block hash verification: + +```bash +# In cfg.env or as environment variables: +KONA_NODE_L1_TRUST_RPC=false +KONA_NODE_L2_TRUST_RPC=false +``` + +Or modify the docker-compose.yaml command: +```yaml +kona-node: + command: | + node + --chain op-sepolia + --l1-eth-rpc ${L1_PROVIDER_RPC} + --l1-beacon ${L1_BEACON_API} + --l1-trust-rpc false # Add this for untrusted L1 RPCs + --l2-engine-rpc ws://op-reth:8551 + --l2-trust-rpc false # Add this for untrusted L2 RPCs +``` + +See the [configuration guide](/rust/kona/node/configuration#rpc-trust-configuration) for more details on RPC trust settings. + +### Port Configuration + +All host ports can be customized via environment variables in `cfg.env`: + +```bash +# Kona Node ports +KONA_NODE_RPC_PORT=5060 +KONA_NODE_DISCOVERY_PORT=9223 +KONA_NODE_METRICS_PORT=9002 + +# OP Reth ports +OP_RETH_RPC_PORT=8545 +OP_RETH_ENGINE_PORT=8551 +OP_RETH_METRICS_PORT=9001 +OP_RETH_DISCOVERY_PORT=30303 + +# Monitoring +PROMETHEUS_PORT=9090 +``` + +### Logging + +Adjust log levels by setting the `RUST_LOG` environment variable: + +```bash +export RUST_LOG=engine_builder=trace,runtime=debug +``` + +## Management Commands + +The recipe includes convenient Just commands: + +```bash +# Start all services +just up + +# Stop all services +just down + +# Restart all services +just restart + +# Generate JWT token (if needed) +./generate-jwt.sh +``` + +## Using Local Images + +To use locally built images instead of published ones: + +1. **Build the kona-node image:** + ```bash + just build-local kona-node + ``` + +2. **Update docker-compose.yaml** to use `kona-node:local` instead of the published image. + +[monitoring]: ../monitoring.mdx + +[recipe]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/docker/recipes/kona-node/README.md +[compose]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/docker/recipes/kona-node/docker-compose.yaml diff --git a/docs/public-docs/rust/kona/node/run/mechanics.mdx b/docs/public-docs/rust/kona/node/run/mechanics.mdx new file mode 100644 index 00000000000..65a32749a14 --- /dev/null +++ b/docs/public-docs/rust/kona/node/run/mechanics.mdx @@ -0,0 +1,227 @@ +--- +title: "How it Works" +--- + +Kona brings together a powerful suite of `no-std` and `std` Rust components, +purpose-built for the OP Stack. At the heart of this ecosystem is the +`kona-node` — a modern, modular rollup node (L2 consensus node) that can +be used as a drop-in binary or as a foundation for custom services. + +The `kona-node` is a fully compliant implementation of the ["Rollup Node" +Specifications][rollup-node] and is released as a [binary][package] in +the [kona repository][kona]. Whether you're running a production network, +building new rollup features, or experimenting with the OP Stack, +`kona-node` is built to be both robust and extensible. + + +### Background + +A rollup node is responsible for deriving the canonical L2 chain from L1 +blocks and their receipts. It validates these blocks using the +[Engine API][engine-api], passing them to the execution layer for processing. + +Paired with an execution engine like op-reth or op-geth, `kona-node` tracks +the unsafe, safe, and finalized tips of the L2 OP Stack chain, ensuring the +node is always in sync with the latest state. + +:::note + +Rollup nodes hold minimal state. Unsafe and safe payloads alike are sent +away to the execution engine client which holds the chain's db. This way, +the rollup node holds a view of the tip of the chain - unsafe, safe, and +finalized block info. All data otherwise needed is held in memory. + +::: + +There are a few core architectural pieces of the `kona-node`. + +- **Derivation Pipeline:** Constructs L2 payload attributes from L1 blocks, + forming the backbone of rollup logic. +- **Execution Engine Integration:** Executes L2 payload attributes via the + [Engine API][engine-api], abstracting away different EL clients. +- **P2P Networking:** Enables block gossip and peer discovery. + +For an in-depth breakdown of these three pillars and a detailed design +of the `kona-node`, visit the [Node Design section](/rust/kona/node/design/intro). + +Additionally, an RPC server exposes essential methods, including the +[L2 Output RPC method][l2o-rpc]. + + +### Syncing + +The `kona-node` syncs the L2 chain in two main phases: + +1. **Execution Layer (EL) Sync:** + When starting, the node initially has an empty engine task queue. + Once an unsafe block is received from P2P gossip, an `InsertUnsafe` + task is executed. The `InsertUnsafe` task executes a forkchoice + update through the engine api. Since the engine state is lazily + initialized (the safe and finalized heads are zero), the forkchoice + update kicks off EL sync on the execution layer (EL) client (such + as op-reth or op-geth). EL sync instructs the execution client to + fetch and sync L2 blocks directly from peers. During this phase, + the `kona-node` effectively waits for the EL client to reach the + chain tip, when it returns that it is `synced`. No L2 blocks + are derived from L1 during this period. + +2. **Consensus Layer (CL) Sync:** + Once the EL client is fully synced to the tip, the node transitions + to consensus layer (CL) sync. In this phase, `kona-node` begins + deriving new L2 payload attributes from the L1 chain, following + the rollup derivation process. `OpPayloadAttributesWithParent` + derived this way are executed as an engine task which submits + the payloads to the execution engine for validation and execution. + +:::note + +- `kona-node` does **not** support historical CL sync or backfilling + L2 blocks from L1 for past chain history. It relies on the EL client + to perform the initial sync of the L2 chain. +- Only after the EL is fully synced does the node begin deriving and + following new L2 blocks from L1. + +::: + +### Extensibility + +The `kona-node` is designed as a modular, actor-based node SDK, +making it possible to extend or customize node behavior by adding +new actors or swapping out existing ones. This extensibility is +currently in **beta**, but the architecture is intentionally built +to support advanced use cases and custom integrations. + + +#### Actor Model + +At the core of `kona-node` is the concept of **actors**—independent, +async services that communicate via channels. Each actor implements +the `NodeActor` trait, which defines how the actor is built, started, +and how it communicates with other actors. + +Key built-in actors include: +- **EngineActor**: Manages the execution layer (EL) Engine API. +- **DerivationActor**: Runs the derivation pipeline to produce L2 payloads. +- **NetworkActor**: Handles P2P networking and block gossip. +- **RpcActor**: Runs the node's RPC server. +- **SupervisorActor**: Integrates with the supervisor RPC API. +- **L1WatcherActor**: Watches L1 for new blocks and events. + + +#### Extending with Custom Actors + +You can add your own actors to the node by implementing the `NodeActor` +trait. This allows you to introduce new background services, event +processors, or integrations with external systems. + +**Example: Defining a Custom Actor** + +```rust +use kona_node_service::NodeActor; +use async_trait::async_trait; +use tokio_util::sync::CancellationToken; + +struct MyCustomActor; + +#[async_trait] +impl NodeActor for MyCustomActor { + type Error = std::io::Error; + type InboundData = MyCustomContext; + type OutboundData = (); + type State = (); + + fn build(_state: Self::State) -> (Self::OutboundData, Self) { + ((), MyCustomActor) + } + + async fn start(self, ctx: Self::InboundData) -> Result<(), Self::Error> { + // Your actor logic here + Ok(()) + } +} + +struct MyCustomContext { + cancellation: CancellationToken, +} + +impl kona_node_service::CancellableContext for MyCustomContext { + fn cancelled(&self) -> tokio_util::sync::WaitForCancellationFuture<'_> { + self.cancellation.cancelled() + } +} +``` + +#### Integrating Custom Actors + +To integrate your custom actor, you can create your own implementation +of the `RollupNodeService` trait, which defines the set of actors and +pipelines used by the node. You can swap out any of the built-in actors +for your own, or add entirely new ones. + +**Example: Custom RollupNodeService** + +```rust +use kona_node_service::{RollupNodeService, NodeActor, ...}; + +struct MyNodeService; + +#[async_trait] +impl RollupNodeService for MyNodeService { + // Use built-in actors, or your own custom ones + type DataAvailabilityWatcher = MyCustomActor; + type DerivationPipeline = ...; + type DerivationActor = ...; + type EngineActor = ...; + type NetworkActor = ...; + type SupervisorExt = ...; + type SupervisorActor = ...; + type RpcActor = ...; + type Error = ...; + + // Implement required trait methods... +} +``` + +You can then instantiate and run your custom node service in your +own binary or integration test. + +#### Programmatic Node Construction + +The `RollupNodeBuilder` provides a convenient way to construct a +standard node, but for advanced use cases, you can build your own +node by composing actors and services directly, or by implementing +your own builder pattern. + +#### Current Limitations + +- The extensibility API is **beta** and may change. +- Most users will want to start by subclassing or wrapping the + standard `RollupNode` and only override specific actors or + pipelines as needed. +- Documentation and examples for advanced extensibility are still + evolving—contributions and feedback are welcome! + +#### Learn More + +- See the [`NodeActor` trait documentation][node-actor] for details + on implementing actors. +- Explore the [kona-node-service crate][service] for source code + and more examples. + + +[cli-docs]: ../configuration.mdx +[subcommands]: ../subcommands.mdx + +[service]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/crates/node/service +[node-actor]: https://docs.rs/kona-node-service/latest/kona_node_service/trait.NodeActor.html + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[packages]: https://github.com/orgs/op-rs/packages?repo_name=kona +[rollup-node]: https://specs.optimism.io/protocol/rollup-node.html +[package]: https://github.com/ethereum-optimism/optimism/pkgs/container/kona%2Fkona-node +[pdocs]: https://github.com/ethereum-optimism/optimism/pkgs/container/kona%2Fkona-node/446969659?tag=latest + +[buildx]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/docker + +[engine-api]: https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md +[l2o-rpc]: https://specs.optimism.io/protocol/rollup-node.html#l2-output-rpc-method diff --git a/docs/public-docs/rust/kona/node/run/overview.mdx b/docs/public-docs/rust/kona/node/run/overview.mdx new file mode 100644 index 00000000000..df1296b8578 --- /dev/null +++ b/docs/public-docs/rust/kona/node/run/overview.mdx @@ -0,0 +1,40 @@ +--- +title: "Run a Node" +--- + +Now that you have [installed the `kona-node`](/rust/kona/node/install/overview), +it's time to run it. + +In this section, we'll guide you through running the kona-node on +various networks and with different configurations. + + +## Supported Networks + +Kona uses the [superchain-registry][scr] to dynamically load +chain configurations for the specified network. As such, Kona +can only support networks that are defined this way. + +[scr]: https://github.com/ethereum-optimism/superchain-registry + +To view available networks, the `kona-node` binary provides +a `registry` subcommand that lists all available networks: + +```bash +kona-node registry +``` + +:::tip +Want to add support for a new network? +Feel free to [add a chain](https://github.com/ethereum-optimism/superchain-registry/blob/main/docs/ops.md#adding-a-chain) +to the superchain-registry! +::: + + +## Configuration & Monitoring + +Learn how to configure and monitor your node: + +- **[Configuration](/rust/kona/node/configuration)** - Configure your node +- **[Monitoring](/rust/kona/node/monitoring)** - Set up logs, metrics, and observability + diff --git a/docs/public-docs/rust/kona/node/subcommands.mdx b/docs/public-docs/rust/kona/node/subcommands.mdx new file mode 100644 index 00000000000..cfdc504fb5c --- /dev/null +++ b/docs/public-docs/rust/kona/node/subcommands.mdx @@ -0,0 +1,17 @@ +--- +title: "`kona-node` Subcommands" +--- + +Below are the available subcommands for `kona-node`: + +- **node**: Runs the main consensus node service. This is the primary subcommand for operating a rollup node. +- **info**: Displays information about the node, build, and environment. +- **bootstore**: Manages the P2P bootstore (used for peer discovery and persistence). +- **net**: Provides network-related utilities and diagnostics. +- **registry**: Interacts with the chain registry for configuration and metadata. + +For more details on each subcommand and their flags, run: + +``` +kona-node --help +``` \ No newline at end of file diff --git a/docs/public-docs/rust/kona/rfc/active/intro.mdx b/docs/public-docs/rust/kona/rfc/active/intro.mdx new file mode 100644 index 00000000000..62176e6e9ab --- /dev/null +++ b/docs/public-docs/rust/kona/rfc/active/intro.mdx @@ -0,0 +1,11 @@ +--- +title: "Request For Comment" +description: "RFC" +--- + +Documents in this section are in the request-for-comment stage. + +To comment on these documents, [open an issue in the kona repository](https://github.com/ethereum-optimism/optimism/issues/new) +and provide detail on the changes you're requesting. + +Once the document has been reviewed, they will be moved to the archives. diff --git a/docs/public-docs/rust/kona/rfc/archived/monorepo.mdx b/docs/public-docs/rust/kona/rfc/archived/monorepo.mdx new file mode 100644 index 00000000000..cce3dc96233 --- /dev/null +++ b/docs/public-docs/rust/kona/rfc/archived/monorepo.mdx @@ -0,0 +1,153 @@ +--- +title: "Monorepo Project" +--- + +| Document | Date | Decision | +| ----------- | ------------- | -------- | +| Monorepo | 02/19/2025 | Approved | + +This is a document outlining merging multiple external +repositories into `kona` to create a rust monorepo for Optimism. + +## Provenance + +Let's rewind the clock to when `kona` was just being started +in the spring of 2024. What little optimism rust types existed +were siloed in applications like `op-reth` and `revm`. Library +code that could have been re-used was unfortunately placed in +an `std` environment that `kona` cannot use because the kona +fault proof program is built for a minimal instruction set. + +Effectively, `kona` needed a bunch of Optimism-specific and +slightly-modified Ethereum types that were available in a +`no_std` environment. + +As development started, types were defined in `kona`. Mostly +jammed into the `kona-derive` crate for use in derivation, these +types were now being duplicated across a number of rust repos just +to support `no_std`. + +Enter `op-alloy`. The first effort to de-duplicate types between +`reth`, `revm`, and `kona` (as well as periphery applications like `magi`). +Rather than keeping types in `kona`, `op-alloy` was introduced as a shared +place for `no_std` compatible optimism rust types. This worked +well as a common place to contribute and decoupled the rapid +development in `kona` from the more stable definition of Optimism +rust types. + +Fast forward to 2025, [interop](https://specs.optimism.io/interop/overview.html) +started seriously picking up momentum as a critical project +in the Optimism Rust world. Interop introduces a whole host +of new Optimism-specific types that really should live in a +shared library. But `op-alloy` was already becoming quite large +beyond the minimal, de-duplicated set of types originally intended. + +This led to OP folks splitting out Optimism-specific types from +`op-alloy` into a new repo called `maili`. What was not foreseen +was the grievance with yet-another level in dependency chain for +Optimism rust projects. Now, downstream optimism rust projects +could have to import all of these crates just to construct an +OP Stack service: +- `op-alloy` +- `maili` +- `op-revm` +- `op-reth` +- `kona` + +And those are just the Optimism-specific crates, let alone +Ethereum crates like `alloy`. + + +## Why? + +The current dependency chain is ever growing. +A small change in `op-alloy` cascades into the following. + +- Release `op-alloy` crates +- Update `maili` with `op-alloy` version and changes. +- Release `maili` crates. +- Update `kona` to work with both `op-alloy` and `maili` crates. +- Release `kona`. +- If something breaks in `kona` or downstream consumers, repeat. + +To iterate faster without needing to manage releases or change +dependencies into git refs, this doc proposes a monorepo structure +that pulls `maili` into `kona`, while retaining `maili` crate +names **and** versioning. + +We propose gone are the days of releasing a single version for +all crates. With a larger, more extensive `kona` monorepo, crates +will need to manage their own semver. + +To re-iterate: the key takeaway here is current downstream consumers +of `maili` crates _will not have to change a thing_. Crates pulled +into `kona` will still be published under `maili-` prefixed crate +names. How this is managed while keeping the `kona-` prefix crate +naming consistent is discussed below. + + +## Proposed Repository Structure + +The new repository structure would look as follows. + +```ignore +crates/ + proof/ + mpt/ + executor/ + preimage/ + fpvm/ + fpvm-proc/ + proof + proof-interop/ + protocol/ + derive/ + driver/ + interop/ + genesis/ <-- Has Maili Shadow + registry/ <-- Has Maili Shadow + protocol/ <-- Has Maili Shadow + services/ + rpc/ <-- Has Maili Shadow + net/ + providers-alloy/ + providers-local/ + utilities/ + serde/ <-- Has Maili Shadow + cli/ + ... +``` + + +Crates denoted with `<-- Has Maili Shadow` are ported from `maili`, +but contain a nested crate with the `maili-` prefix instead of `kona-` +prefix. These crates re-export their `kona-` equivalent crates. This +allows downstream users to not need to change their dependencies to +keep using `maili-` crates! Eventually once the kona monorepo matures, +and downstream consumers use `kona-` crates instead of `maili-`, these +can be removed. + + +#### Maili Shadow Example + +Let's look at `crates/protocol/genesis`. + +This crate will have a `Cargo.toml` that defines itself as `kona-genesis`. + +The contents of the `crates/protocol/genesis` directory will be + +```ignore +../genesis/ + README.md + Cargo.toml <-- package.name = "kona-genesis" + src/ + .. <-- current contents of `maili-genesis`, ported + maili/ + Cargo.toml <-- package.name = "maili-genesis" + src/ + lib.rs <-- Re-exports `kona-genesis` +``` + +This structure allows us to seamlessly remain backwards compatible, +while being able to work in the new `kona-` crates without requiring +heavy lifting to support `maili-` crates. diff --git a/docs/public-docs/rust/kona/rfc/archived/umbrellas.mdx b/docs/public-docs/rust/kona/rfc/archived/umbrellas.mdx new file mode 100644 index 00000000000..da9cb6a56e3 --- /dev/null +++ b/docs/public-docs/rust/kona/rfc/archived/umbrellas.mdx @@ -0,0 +1,124 @@ +--- +title: "Umbrella Crates" +--- + + +TL;DR, this is a proposal to introduce tiny crates inside each +container directory (e.g. `crates/protocol/`) to re-export all +crates contained in that directory. + + +## Context + +#### Repository Structure + +Kona now has a [monorepo](/rust/kona/rfc/archived/monorepo) structure that merged +`maili` and `hilo` crates into `kona`. This introduces a number of higher-level +directories that hold a variety of crates themselves. As of the time at which +this document was written the `kona` repository loosely looks like the following. + +```ignore +bins/ + -> client/ + -> host/ +crates/ + -> protocol/ + -> genesis/ + -> protocol/ + -> derive/ + -> driver/ + -> interop/ + -> registry/ + -> proof/ + -> mpt/ + -> executor/ + -> proof/ + -> proof-interop/ + -> preimage/ + -> std-fpvm/ + -> std-fpvm-proc/ + -> node/ + -> net/ + -> rpc/ + -> engine/ + -> providers/ + -> providers-alloy/ + -> providers-local/ + -> utilities/ + -> serde/ +``` + +Within crates, the `protocol`, `proof`, `node`, `providers`, and `utilities` +directories all contain crates, and are not crates themselves - only directories. + +#### Publishing Crates + +When crates in `kona` are published, they are all published individually, with no +way to add all kona crates as a dependency. This makes discoverability difficult +without accurate and up-to-date documentation, adding overhead. + +## Problem + +As a monorepo, `kona` will likely have a growing number of crates that will make +it increasingly difficult to discover new `kona` crates and manage `kona` as a +dependency, for downstream consumers. + +Additionally, each crate has its own independent version, which makes it more nuanced +to manage `kona` dependencies and less clear which crate versions are compatible. + +## Considered Options + +### Single Umbrella Crate + +One option that would make `kona` crates the easiest to consume is to provide +a single umbrella crate that lives at the top-level (e.g. `crates/umbrella/Cargo.toml`). + +This crate could simply be called `kona` and re-export all crates in the `kona` +monorepo under various feature flags, with propagating `std` and `serde` feature +flags. + +#### Tradeoffs + +The benefit of this option is providing a single crate to consume all of `kona`, +with the downside of having to manage all the various feature flags and crate +re-exports in the single umbrella crate. + +### Grouped Umbrella Crates + +In each of the `crates/` sub-directories, provide an umbrella crate that exports +all crates within that subdirectory. + +For example, in the `crates/protocol/` subdirectory, an umbrella crate would +re-export all crates in `crates/protocol/`. It could be called +`kona-umbrella-protocol` or some other name to make it easily discoverable. + +#### Tradeoffs + +While this simplifies updates when adding or removing a re-export, it introduces +`n-1` additional crates as the single umbrella crate, where `n` is the number +of sub-directories in `crates/`. These many umbrella crates also make `kona` less +easily consumed by downstream users of `kona` as opposed to the singular umbrella +crate. + +### Top-level Umbrella with Subdirectory Umbrellas (Combined) + +Effectively, this option is to combined the previous two options into one. + +In this configuration, the top-level umbrella crate could just re-export +each of the umbrella crates in the sub-directory. + +#### Tradeoffs + +Unfortunately this option now introduces `n + 1` number of crates where `n` +is the number of subdirectories in `crates/`, but it still only requires +updates to the subdirectory umbrellas when a crate is added or removed. + +The benefit of this option is the top-level umbrella crate is very much +simplified, since it only needs to re-export the `n` umbrella crates and not +every crate in the workspace. It also provides the single consumable `kona` +crate for downstream users that greatly simplifies managing `kona` as a +dependency. + +## Proposed Solution + +This proposal has been iced. diff --git a/docs/public-docs/rust/kona/run.mdx b/docs/public-docs/rust/kona/run.mdx new file mode 100644 index 00000000000..10d19100f2e --- /dev/null +++ b/docs/public-docs/rust/kona/run.mdx @@ -0,0 +1,56 @@ +--- +title: "Run a Node" +--- + + +This tutorial walks through running the `kona-node` as +a binary. To use docker, head over to the +[Docker Guide](/rust/kona/node/install/docker) which uses a `docker-compose` +setup provided by `kona`. The `docker-compose` setup +automatically bootstraps the `kona-node` with `op-reth`, +provisioning grafana dashboards and a default Prometheus +data source. + + +## Prerequisites + +In order to follow this tutorial, you'll need: + +1. An L1 Archive node (e.g., `op-geth`) with enough history for the rollup network you want to run. +2. A `kona-node` binary. See [installation](/rust/kona/node/install/binaries) for instructions. +3. A rollup configuration file. See [rollup configuration](/rust/kona/sdk/protocol/genesis/rollup-config) for more information. + +## Quick Start + +The fastest way to get started is to use one of the pre-built configurations: + +```bash +# Download a rollup configuration +curl -o rollup.json https://raw.githubusercontent.com/ethereum-optimism/optimism/develop/rust/kona/configs/base-mainnet.json + +# Run the node +kona-node --rollup-config rollup.json --l1-rpc-url http://localhost:8545 +``` + +## Configuration + +The `kona-node` can be configured using command-line flags or environment variables. For a complete list of options, run: + +```bash +kona-node --help +``` + +### Key Configuration Options + +- `--rollup-config`: Path to the rollup configuration file +- `--l1-rpc-url`: L1 RPC endpoint URL +- `--l2-rpc-url`: L2 RPC endpoint URL (optional) +- `--data-dir`: Directory for storing node data +- `--log-level`: Logging level (debug, info, warn, error) + +## Next Steps + +- [Docker Support](/rust/kona/node/run/docker) - Run with Docker +- [Monitoring](/rust/kona/node/monitoring) - Set up monitoring and metrics +- [CLI Reference](/rust/kona/node/configuration) - Complete CLI documentation +- [Subcommands](/rust/kona/node/subcommands) - Available subcommands diff --git a/docs/public-docs/rust/kona/sdk/examples/custom-derivation-pipeline.mdx b/docs/public-docs/rust/kona/sdk/examples/custom-derivation-pipeline.mdx new file mode 100644 index 00000000000..c4e4414f7a1 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/examples/custom-derivation-pipeline.mdx @@ -0,0 +1,199 @@ +--- +title: "Custom Derivation Pipeline Stage" +--- + +Extend Kona's derivation pipeline by wrapping the top-level `AttributesQueue` stage with custom logic for monitoring, validation, or transformation. + +## Core Concepts + +The derivation pipeline uses a stage-based architecture where each stage wraps the previous one: + +``` +L1Traversal → L1Retrieval → FrameQueue → ChannelProvider → +ChannelReader → BatchStream → BatchProvider → AttributesQueue +``` + +### Key Traits + +Custom stages that wrap the `AttributesQueue` must implement: +- `NextAttributes` - Provides payload attributes for block building +- `OriginProvider` - Provides current L1 origin +- `SignalReceiver` - Handles pipeline resets +- `OriginAdvancer` - Advances L1 origin + +## Example: Monitoring Stage + +Wrap the `AttributesQueue` to add metrics tracking: + +```rust +use kona_derive::{ + NextAttributes, OriginProvider, SignalReceiver, OriginAdvancer, + PipelineResult, Signal, OpAttributesWithParent +}; +use kona_protocol::{BlockInfo, L2BlockInfo}; +use async_trait::async_trait; +use std::time::Instant; + +#[derive(Debug)] +pub struct LoggingStage { + inner: S, + attributes_count: u64, + last_origin: Option, +} + +impl LoggingStage { + pub fn new(inner: S) -> Self { + Self { + inner, + attributes_count: 0, + last_origin: None, + } + } +} + +#[async_trait] +impl NextAttributes for LoggingStage +where + S: NextAttributes + Send + Sync, +{ + async fn next_attributes( + &mut self, + parent: L2BlockInfo + ) -> PipelineResult { + let start = Instant::now(); + + // Delegate to inner stage + let attributes = self.inner.next_attributes(parent).await?; + + // Track metrics + self.attributes_count += 1; + let duration = start.elapsed(); + + info!( + target: "pipeline::logging", + count = self.attributes_count, + duration_ms = duration.as_millis(), + parent_hash = ?parent.block_info.hash, + "Generated attributes" + ); + + Ok(attributes) + } +} + +impl OriginProvider for LoggingStage +where + S: OriginProvider, +{ + fn origin(&self) -> Option { + self.inner.origin() + } +} + +#[async_trait] +impl SignalReceiver for LoggingStage +where + S: SignalReceiver + Send + Sync, +{ + async fn signal(&mut self, signal: Signal) -> PipelineResult<()> { + info!(target: "pipeline::logging", ?signal, "Received signal"); + + // Track origin changes on reset + if let Signal::Reset(reset) = &signal { + self.last_origin = Some(reset.l1_origin); + self.attributes_count = 0; // Reset counter + } + + self.inner.signal(signal).await + } +} + +#[async_trait] +impl OriginAdvancer for LoggingStage +where + S: OriginAdvancer + Send + Sync, +{ + async fn advance_origin(&mut self) -> PipelineResult<()> { + let prev_origin = self.inner.origin(); + self.inner.advance_origin().await?; + let new_origin = self.inner.origin(); + + if prev_origin != new_origin { + info!( + target: "pipeline::logging", + prev = ?prev_origin, + new = ?new_origin, + "Advanced origin" + ); + } + + Ok(()) + } +} +``` + + + Custom stages wrap the `AttributesQueue` (top-level stage). For deeper pipeline modifications, you'd need to rebuild the entire pipeline. + + +## Integration + +```rust +use kona_derive::{PipelineBuilder, DerivationPipeline}; +use kona_node::{StatefulAttributesBuilder}; +use alloc::sync::Arc; + +// Build standard pipeline +let pipeline = PipelineBuilder::new() + .rollup_config(rollup_config.clone()) + .origin(origin) + .chain_provider(chain_provider) + .l2_chain_provider(l2_chain_provider.clone()) + .dap_source(dap_source) + .builder(attributes_builder) + .build_polled(); + +// Wrap with monitoring +let monitoring_stage = LoggingStage::new(pipeline.attributes); + +// Create new pipeline +let custom_pipeline = DerivationPipeline::new( + monitoring_stage, + rollup_config, + l2_chain_provider, +); +``` + +## Testing + +```rust +#[cfg(test)] +mod tests { + use super::*; + use kona_derive::test_utils::TestNextAttributes; + + #[tokio::test] + async fn test_logging_stage() { + let mock_inner = TestNextAttributes::new(); + let mut stage = LoggingStage::new(mock_inner); + + // Test attributes generation + let parent = L2BlockInfo::default(); + let result = stage.next_attributes(parent).await; + assert!(result.is_ok()); + assert_eq!(stage.attributes_count, 1); + + // Test signal handling + let signal = Signal::Reset(Default::default()); + stage.signal(signal).await.unwrap(); + assert_eq!(stage.attributes_count, 0); + } +} +``` + +## Related Resources + +- [kona-derive](https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/crates/protocol/derive) - Core derivation pipeline +- [Pipeline Traits](https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/crates/protocol/derive/src/traits) - Trait definitions +- [Stage Examples](https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/crates/protocol/derive/src/stages) - Built-in stages +- [OP Stack Derivation Spec](https://specs.optimism.io/protocol/derivation.html) - Protocol specification \ No newline at end of file diff --git a/docs/public-docs/rust/kona/sdk/examples/executor-test-fixtures.mdx b/docs/public-docs/rust/kona/sdk/examples/executor-test-fixtures.mdx new file mode 100644 index 00000000000..b9eb4b3a07f --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/examples/executor-test-fixtures.mdx @@ -0,0 +1,23 @@ +--- +title: "`kona-executor` test fixtures" +--- + +The `StatelessL2Builder` type uses static test data fixtures to run stateless execution of certain blocks offline. The +test data fixtures include: +* The `RollupConfig` of the chain that the block belongs to. +* The parent block header, which we apply state on top of. +* The payload attributes for building the new block. +* A `rocksdb` database containing the witness data for stateless execution of the block building job. + +Sometimes, updates in the block building code can add new state accesses, requiring these fixtures to be re-generated. + +To generate a new fixture and add it to the test suite, run: + +```sh +cargo r -p execution-fixture \ + --l2-rpc \ + --block-number +``` + +this command will add a new compressed test fixture for the given L2 block into `kona-executor`'s `testdata` directory. +The test suite will automatically pick this new test fixture up, and no further action is needed to register it. diff --git a/docs/public-docs/rust/kona/sdk/examples/frames-to-batch.mdx b/docs/public-docs/rust/kona/sdk/examples/frames-to-batch.mdx new file mode 100644 index 00000000000..ca36edf6689 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/examples/frames-to-batch.mdx @@ -0,0 +1,164 @@ +--- +title: "Transform Frames into a Batch" +--- + +This example walks through transforming [`Frame`][frame]s into the [`Batch`][batch] types. + +:::danger +Steps and handling of types with respect to chain tip, ordering of frames, re-orgs, and +more are not covered by this example. This example solely demonstrates the most trivial +way to transform individual [`Frame`][frame]s into a [`Batch`][batch] type. +::: + +## Walkthrough + +The high level transformation is the following. + +```ignore +raw bytes[] -> frames[] -> channel -> decompressed channel data -> Batch +``` + +Given the raw, batch-submitted frame data as bytes (read in with the [`hex!` macro][hex]), +the first step is to decode the frame data into [`Frame`][frame]s using +[`Frame::decode`][decode-frame]. Once all the [`Frame`][frame]s are decoded, +the [`Channel`][channel] can be constructed using the [`ChannelId`][channel-id] +of the first frame. + +:::info +[`Frame`][frame]s may also be added to a [`Channel`][channel] +once decoded with the [`Channel::add_frame`][add-frame] method. +::: + +When the [`Channel`][channel] is [`Channel::is_ready()`][is-ready], +the frame data can taken from the [`Channel`][channel] using +[`Channel::frame_data()`][frame-data]. This data is represented as [`Bytes`][bytes] +and needs to be decompressed using the respective compression algorithm depending on +which hardforks are activated (using the `RollupConfig`). For the sake of this example, +`brotli` is used (which was activated in the [Fjord hardfork][fjord]). Decompressed +brotli bytes can then be passed right into [`Batch::decode`][decode-batch] +to wind up with the example's desired [`Batch`][batch]. + +## Running this example + +- Clone the examples repository: `git clone git@github.com:ethereum-optimism/optimism.git` +- Run: `cargo run --example frames_to_batch` + +```rust +//! This example decodes raw [Frame]s and reads them into a [Channel] and into a [SingleBatch]. + +use alloy_consensus::{SignableTransaction, TxEip1559, TxEnvelope}; +use alloy_eips::eip2718::{Decodable2718, Encodable2718}; +use alloy_primitives::{Address, BlockHash, Bytes, Signature, U256, hex}; +use kona_genesis::RollupConfig; +use kona_protocol::{Batch, BlockInfo, Channel, Frame, SingleBatch, decompress_brotli}; + +fn main() { + // Raw frame data taken from the `encode_channel` example. + let first_frame = hex!( + "60d54f49b71978b1b09288af847b11d200000000004d1b1301f82f0f6c3734f4821cd090ef3979d71a98e7e483b1dccdd525024c0ef16f425c7b4976a7acc0c94a0514b72c096d4dcc52f0b22dae193c70c86d0790a304a08152c8250031d091063ea000" + ); + let second_frame = hex!( + "60d54f49b71978b1b09288af847b11d2000100000046b00d00005082edde7ccf05bded2004462b5e80e1c42cd08e307f5baac723b22864cc6cd01ddde84efc7c018d7ada56c2fa8e3c5bedd494c3a7a884439d5771afcecaf196cb3801" + ); + + // Decode the raw frames. + let decoded_first = Frame::decode(&first_frame).expect("decodes frame").1; + let decoded_second = Frame::decode(&second_frame).expect("decodes frame").1; + + // Create a channel. + let id = decoded_first.id; + let open_block = BlockInfo::default(); + let mut channel = Channel::new(id, open_block); + + // Add the frames to the channel. + let l1_inclusion_block = BlockInfo::default(); + channel.add_frame(decoded_first, l1_inclusion_block).expect("adds frame"); + channel.add_frame(decoded_second, l1_inclusion_block).expect("adds frame"); + + // Get the frame data from the channel. + let frame_data = channel.frame_data().expect("some frame data"); + println!("Frame data: {}", hex::encode(&frame_data)); + + // Decompress the frame data with brotli. + let config = RollupConfig::default(); + let max = config.max_rlp_bytes_per_channel(open_block.timestamp) as usize; + let decompressed = decompress_brotli(&frame_data, max).expect("decompresses brotli"); + println!("Decompressed frame data: {}", hex::encode(&decompressed)); + + // Decode the single batch from the decompressed data. + let batch = Batch::decode(&mut decompressed.as_slice(), &config).expect("batch decodes"); + assert_eq!( + batch, + Batch::Single(SingleBatch { + parent_hash: BlockHash::ZERO, + epoch_num: 1, + epoch_hash: BlockHash::ZERO, + timestamp: 1, + transactions: example_transactions(), + }) + ); + + println!("Successfully decoded frames into a Batch"); +} + +fn example_transactions() -> Vec { + let mut transactions = Vec::new(); + + // First Transaction in the batch. + let tx = TxEip1559 { + chain_id: 10u64, + nonce: 2, + max_fee_per_gas: 3, + max_priority_fee_per_gas: 4, + gas_limit: 5, + to: Address::left_padding_from(&[6]).into(), + value: U256::from(7_u64), + input: vec![8].into(), + access_list: Default::default(), + }; + let sig = Signature::test_signature(); + let tx_signed = tx.into_signed(sig); + let envelope: TxEnvelope = tx_signed.into(); + let encoded = envelope.encoded_2718(); + transactions.push(encoded.clone().into()); + let mut slice = encoded.as_slice(); + let decoded = TxEnvelope::decode_2718(&mut slice).unwrap(); + assert!(matches!(decoded, TxEnvelope::Eip1559(_))); + + // Second transaction in the batch. + let tx = TxEip1559 { + chain_id: 10u64, + nonce: 2, + max_fee_per_gas: 3, + max_priority_fee_per_gas: 4, + gas_limit: 5, + to: Address::left_padding_from(&[7]).into(), + value: U256::from(7_u64), + input: vec![8].into(), + access_list: Default::default(), + }; + let sig = Signature::test_signature(); + let tx_signed = tx.into_signed(sig); + let envelope: TxEnvelope = tx_signed.into(); + let encoded = envelope.encoded_2718(); + transactions.push(encoded.clone().into()); + let mut slice = encoded.as_slice(); + let decoded = TxEnvelope::decode_2718(&mut slice).unwrap(); + assert!(matches!(decoded, TxEnvelope::Eip1559(_))); + + transactions +} +``` + +[frame]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html +[batch]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.Batch.html +[channel]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html +[add-frame]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html#method.add_frame +[decode-frame]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#method.decode +[hex]: https://docs.rs/alloy_primitives/latest/alloy_primitives/macro.hex.html +[is-ready]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html#method.is_ready +[frame-data]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html#method.frame_data +[bytes]: https://docs.rs/alloy_primitives/latest/alloy_primitives/struct.Bytes.html +[decode-batch]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.Batch.html#method.decode +[fjord]: https://specs.optimism.io/protocol/fjord/overview.html +[channel-id]: https://docs.rs/kona-protocol/latest/kona_protocol/type.ChannelId.html diff --git a/docs/public-docs/rust/kona/sdk/examples/intro.mdx b/docs/public-docs/rust/kona/sdk/examples/intro.mdx new file mode 100644 index 00000000000..3fa4f2fb110 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/examples/intro.mdx @@ -0,0 +1,12 @@ +--- +title: "Examples" +--- + +Examples for working with `kona` crates. + +- [Load a Rollup Config for a Chain ID](/rust/kona/sdk/examples/load-a-rollup-config) +- [Transform Frames to a Batch](/rust/kona/sdk/examples/frames-to-batch) +- [Create a new L1BlockInfoTx Hardfork Variant](/rust/kona/sdk/examples/new-l1-block-info-tx-hardfork) +- [Create a new `kona-executor` test fixture](/rust/kona/sdk/examples/executor-test-fixtures) +- [Configuring P2P Network Peer Scoring](/rust/kona/sdk/examples/p2p-peer-scoring) +- [Custom Derivation Pipeline with New Stage](/rust/kona/sdk/examples/custom-derivation-pipeline) diff --git a/docs/public-docs/rust/kona/sdk/examples/load-a-rollup-config.mdx b/docs/public-docs/rust/kona/sdk/examples/load-a-rollup-config.mdx new file mode 100644 index 00000000000..a666daf73c2 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/examples/load-a-rollup-config.mdx @@ -0,0 +1,36 @@ +--- +title: "Loading a Rollup Config from a Chain ID" +--- + +In this section, the code examples demonstrate loading the +rollup config for the given L2 Chain ID. + +Let's load the Rollup Config for OP Mainnet which hash chain id 10. + +```rust +extern crate kona_genesis; +extern crate kona_protocol; + +use kona_registry::ROLLUP_CONFIGS; +use kona_genesis::OP_MAINNET_CHAIN_ID; + +// Load a rollup config from the chain id. +let op_mainnet_config = ROLLUP_CONFIGS.get(&OP_MAINNET_CHAIN_ID).expect("infallible"); + +// The chain id should match the hardcoded chain id. +assert_eq!(op_mainnet_config.chain_id, OP_MAINNET_CHAIN_ID); +``` + + + +Available Configs + +[kona-registry][kona-registry] dynamically provides all rollup configs +from the [superchain-registry][registry] for their respective chain ids. +Note though, that this requires `serde` since it deserializes the rollup +configs dynamically from json files. + + + +[kona-registry]: https://crates.io/crates/kona-registry +[registry]: https://github.com/ethereum-optimism/superchain-registry diff --git a/docs/public-docs/rust/kona/sdk/examples/new-l1-block-info-tx-hardfork.mdx b/docs/public-docs/rust/kona/sdk/examples/new-l1-block-info-tx-hardfork.mdx new file mode 100644 index 00000000000..e61cf129acc --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/examples/new-l1-block-info-tx-hardfork.mdx @@ -0,0 +1,115 @@ +--- +title: "Create a `L1BlockInfoTx` Variant for a new `Hardfork`" +--- + +This example walks through creating a variant of the [`L1BlockInfoTx`][info-tx] +for a new Hardfork. + + + +This example is very verbose. +To grok required changes, view [this PR diff][pr-diff] +which introduces Isthmus hardfork changes to the `L1BlockInfoTx` with a new variant. + + + + +## Required Genesis Updates + +The first updates that need to be made are to [`kona-genesis`][genesis] +types, namely the [`RollupConfig`][rc] and [`HardForkConfig`][hfc]. + +First, add a timestamp field to the [`RollupConfig`][rc]. Let's use the +hardfork name "Glacier" as an example. + +```rust +pub struct RollupConfig { + ... + /// `glacier_time` sets the activation time for the Glacier network upgrade. + /// Active if `glacier_time` != None && L2 block timestamp >= Some(glacier_time), inactive + /// otherwise. + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub glacier_time: Option, + ... +} +``` + +Add an accessor on the [`RollupConfig`][rc] to provide a way of checking whether the +"Glacier" hardfork is active for a given timestamp. Also update the prior hardfork +accessor to call this method (let's use "Isthmus" as the prior hardfork). + +```rust + /// Returns true if Isthmus is active at the given timestamp. + pub fn is_isthmus_active(&self, timestamp: u64) -> bool { + self.isthmus_time.map_or(false, |t| timestamp >= t) || self.is_glacier_active(timestamp) + } + + /// Returns true if Glacier is active at the given timestamp. + pub fn is_glacier_active(&self, timestamp: u64) -> bool { + self.glacier_time.map_or(false, |t| timestamp >= t) + } +``` + +Lastly, add the "Glacier" timestamp to the [`HardForkConfig`][hfc]. + +```rust +pub struct HardForkConfig { + ... + /// Glacier hardfork activation time + pub glacier_time: Option, +} +``` + + +## Protocol Changes + +Introduce a new `glacier.rs` module containing a `L1BlockInfoGlacier` type +in [`kona_genesis::info` module][info-mod]. + +This should include a few methods used in the `L1BlockInfoTx` later. + +```rust + pub fn encode_calldata(&self) -> Bytes { ... } + + pub fn decode_calldata(r: &[u8]) -> Result { ... } +``` + +Use other hardfork variants like the [`L1BlockInfoEcotone`][ecotone] +for reference. + +Next, add the new "Glacier" variant to the [`L1BlockInfoTx`][info-tx]. + +```rust +pub enum L1BlockInfoTx { + ... + Glacier(L1BlockInfoGlacier) +} +``` + +Update [`L1BlockInfoTx::try_new`][try-new] to construct the `L1BlockInfoGlacier` +if the hardfork is active using the `RollupConfig::is_glacier_active`. + +Also, be sure to update [`L1BlockInfoTx::decode_calldata`][decode-calldata] +with the new variant decoding, as well as other [`L1BlockInfoTx`][info-tx] +methods. + +Once some tests are added surrounding the decoding and encoding of the new +`L1BlockInfoGlacier` variant, all required changes are complete! + +Now, [this example PR diff][pr-diff] introducing the Isthmus changes should +make sense, since it effectively implements the above changes for the Isthmus +hardfork (replacing "Glacier" with "Isthmus"). Notice, Isthmus introduces +some new "operator fee" fields as part of it's `L1BlockInfoIsthmus` type. +Some new error variants to the [`BlockInfoError`][bie] are needed as well. + + +[bie]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.BlockInfoError.html +[pr-diff]: https://github.com/alloy-rs/op-alloy/pull/130/files +[decode-calldata]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.L1BlockInfoTx.html#method.decode_calldata +[try-new]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.L1BlockInfoTx.html#method.try_new +[ecotone]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/crates/protocol/hardforks/src/ecotone.rs +[info-mod]: https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/crates/protocol/protocol/src/info/mod.rs +[genesis]: https://docs.rs/kona-genesis/latest/kona_genesis/index.html +[rc]: https://docs.rs/kona-genesis/latest/kona_genesis/struct.RollupConfig.html +[hfc]: https://docs.rs/kona-genesis/latest/kona_genesis/struct.HardForkConfig.html +[info-tx]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.L1BlockInfoTx.html diff --git a/docs/public-docs/rust/kona/sdk/examples/p2p-peer-scoring.mdx b/docs/public-docs/rust/kona/sdk/examples/p2p-peer-scoring.mdx new file mode 100644 index 00000000000..0d474e5ce73 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/examples/p2p-peer-scoring.mdx @@ -0,0 +1,352 @@ +--- +title: "Configuring P2P Network Peer Scoring" +--- + +Peer scoring is a critical mechanism in Kona's P2P network that evaluates the behavior and +reliability of peers. By assigning scores to peers based on their performance, the network +can prioritize connections with well-behaved peers and disconnect from malicious or poorly +performing ones, ensuring overall network health and resilience. + +This guide demonstrates how to configure peer scoring in Kona's P2P stack, including basic +setup, advanced configurations, and monitoring strategies. + +## Understanding Peer Scoring + +Peer scoring in Kona evaluates peers based on multiple factors: +- **Message Delivery**: How reliably peers deliver messages +- **Mesh Participation**: Active participation in gossipsub mesh +- **Invalid Messages**: Penalties for invalid or malformed messages +- **IP Colocation**: Penalties for multiple peers from the same IP +- **Behavior Patterns**: General peer behavior and responsiveness + + + Peer scoring helps maintain network quality by identifying and removing peers that: + - Fail to deliver messages reliably + - Send invalid or spam messages + - Exhibit malicious behavior patterns + - Have poor network connectivity + + +## Peer Score Levels + +Kona supports two peer scoring levels: + +```rust +use kona_peers::PeerScoreLevel; + +// Disable peer scoring entirely +let no_scoring = PeerScoreLevel::Off; + +// Enable light peer scoring with default parameters +let light_scoring = PeerScoreLevel::Light; +``` + +### Score Calculation Parameters + +The scoring system uses several key parameters: + +```rust +use kona_peers::PeerScoreLevel; +use std::time::Duration; + +// Key scoring constants +const DECAY_TO_ZERO: f64 = 0.01; // Decay factor for scores +const MESH_WEIGHT: f64 = -0.7; // Weight for mesh delivery +const MAX_IN_MESH_SCORE: f64 = 10.0; // Maximum score for mesh participation + +// Calculate decay factor for a given duration +let block_time = Duration::from_secs(2); // OP Stack default +let epoch = block_time * 6; +let decay = PeerScoreLevel::score_decay(epoch * 10, block_time); +``` + +## Basic Configuration + +### Using CLI Flags + +Configure peer scoring via command-line flags: + +```bash +# Enable light peer scoring (default) +kona node --p2p.scoring light + +# Disable peer scoring +kona node --p2p.scoring off + +# Configure with peer banning +kona node \ + --p2p.scoring light \ + --p2p.ban.peers \ + --p2p.ban.threshold -100 \ + --p2p.ban.duration 60 +``` + +### Programmatic Configuration + +Configure peer scoring in code: + +```rust +use kona_node_service::NetworkConfig; +use kona_peers::{PeerScoreLevel, PeerMonitoring}; +use kona_genesis::RollupConfig; +use libp2p::Multiaddr; +use alloy_primitives::Address; +use std::time::Duration; + +// Create network configuration with peer scoring +let mut config = NetworkConfig::new( + rollup_config, + discovery_listen, + gossip_address, + unsafe_block_signer, +); + +// Set peer scoring level +config.scoring = PeerScoreLevel::Light; + +// Configure peer monitoring and banning +config.monitor_peers = Some(PeerMonitoring { + ban_threshold: -100.0, // Ban peers with score below -100 + ban_duration: Duration::from_secs(3600), // Ban for 1 hour +}); +``` + +## Advanced Configuration + +### Topic Scoring Parameters + +Configure topic-specific scoring based on block time: + +```rust +use kona_peers::PeerScoreLevel; +use libp2p::gossipsub::{TopicHash, TopicScoreParams}; +use std::collections::HashMap; + +// Get topic score parameters for OP Stack (2 second blocks) +let block_time = 2; // seconds +let topic_params = PeerScoreLevel::topic_score_params(block_time); + +// Create topic scores for specific topics +let topics = vec![ + TopicHash::from_raw("/optimism/10/0/blocks"), + TopicHash::from_raw("/optimism/10/1/blocks"), +]; +let topic_scores = PeerScoreLevel::topic_scores(topics, block_time); +``` + + + Topic scoring is being phased out in the OP Stack. It's disabled by default + and should only be enabled for backwards compatibility or debugging purposes. + + Use the `--p2p.topic-scoring` flag to enable if needed. + + +### Gossipsub Mesh Parameters + +Fine-tune gossipsub mesh parameters for optimal performance: + +```rust +use kona_gossip::default_config_builder; + +// Create custom gossipsub configuration +let gossip_config = default_config_builder() + .mesh_n(8) // Target mesh degree (D) + .mesh_n_low(6) // Lower bound (Dlo) + .mesh_n_high(12) // Upper bound (Dhi) + .gossip_lazy(6) // Gossip degree (Dlazy) + .flood_publish(false) // Don't flood publish + .build() + .expect("valid config"); + +// Apply to network configuration +config.gossip_config = gossip_config; +``` + +### Peer Score Thresholds + +Configure thresholds that determine peer treatment: + +```rust +use libp2p::gossipsub::PeerScoreThresholds; + +// Default thresholds used by Kona +const DEFAULT_THRESHOLDS: PeerScoreThresholds = PeerScoreThresholds { + gossip_threshold: -10.0, // Below this: no gossip propagation + publish_threshold: -40.0, // Below this: ignore published messages + graylist_threshold: -40.0, // Below this: remove from mesh + accept_px_threshold: 20.0, // Above this: accept peer exchange + opportunistic_graft_threshold: 0.05, // Threshold for opportunistic grafting +}; +``` + +## Complete Example + +Here's a comprehensive example configuring P2P with peer scoring: + +```rust +use kona_node_service::NetworkConfig; +use kona_peers::{PeerScoreLevel, PeerMonitoring}; +use kona_genesis::RollupConfig; +use kona_gossip::{GaterConfig, default_config_builder}; +use kona_disc::LocalNode; +use libp2p::{Multiaddr, identity::Keypair}; +use alloy_primitives::Address; +use std::time::Duration; +use std::net::IpAddr; + +async fn setup_p2p_with_scoring() -> NetworkConfig { + // Load rollup configuration + let rollup_config = RollupConfig { + l2_chain_id: 10.into(), // OP Mainnet + block_time: 2, + // ... other config + }; + + // Generate or load keypair + let keypair = Keypair::generate_secp256k1(); + + // Configure discovery + let discovery_address = LocalNode::new( + keypair.clone().try_into_secp256k1().unwrap().secret(), + "0.0.0.0".parse::().unwrap(), + 9222, // TCP port + 9223, // UDP port + ); + + // Configure gossip listening address + let mut gossip_address = Multiaddr::from("0.0.0.0".parse::().unwrap()); + gossip_address.push(libp2p::multiaddr::Protocol::Tcp(9222)); + + // Set unsafe block signer + let unsafe_block_signer = Address::from([0u8; 20]); + + // Create base configuration + let mut config = NetworkConfig::new( + rollup_config.clone(), + discovery_address, + gossip_address, + unsafe_block_signer, + ); + + // Configure peer scoring + config.scoring = PeerScoreLevel::Light; + + // Enable peer monitoring with banning + config.monitor_peers = Some(PeerMonitoring { + ban_threshold: -100.0, + ban_duration: Duration::from_secs(3600), + }); + + // Configure gossipsub parameters + config.gossip_config = default_config_builder() + .mesh_n(8) + .mesh_n_low(6) + .mesh_n_high(12) + .gossip_lazy(6) + .flood_publish(false) + .heartbeat_interval(Duration::from_millis(500)) + .build() + .expect("valid gossipsub config"); + + // Configure connection gater for peer redialing + config.gater_config = GaterConfig { + peer_redialing: Some(500), // Max redial attempts + dial_period: Duration::from_secs(3600), // Reset period + }; + + // Set the keypair + config.keypair = keypair; + + // Optionally disable topic scoring (recommended) + config.topic_scoring = false; + + config +} +``` + +## CLI Configuration Examples + +### Development Setup + +Minimal scoring for local development: + +```bash +kona node \ + --p2p.scoring off \ + --p2p.listen.ip 127.0.0.1 \ + --p2p.listen.tcp 9222 +``` + +### Production Setup + +Full peer scoring with monitoring: + +```bash +kona node \ + --p2p.scoring light \ + --p2p.ban.peers \ + --p2p.ban.threshold -100 \ + --p2p.ban.duration 60 \ + --p2p.gossip.mesh.d 8 \ + --p2p.gossip.mesh.lo 6 \ + --p2p.gossip.mesh.dhi 12 \ + --p2p.redial 500 \ + --p2p.redial.period 60 +``` + +### High-Security Setup + +Strict scoring with aggressive banning: + +```bash +kona node \ + --p2p.scoring light \ + --p2p.ban.peers \ + --p2p.ban.threshold -50 \ + --p2p.ban.duration 120 \ + --p2p.redial 100 \ + --p2p.discovery.interval 3 +``` + +## Monitoring Peer Scores + +Kona inspects peer scores every 15 seconds and can automatically ban poorly performing peers: + +```rust +use kona_gossip::PEER_SCORE_INSPECT_FREQUENCY; + +// Inspection happens every 15 seconds +assert_eq!(*PEER_SCORE_INSPECT_FREQUENCY, Duration::from_secs(15)); + +// The network handler automatically: +// 1. Checks all connected peer scores +// 2. Identifies peers below ban threshold +// 3. Disconnects and bans problematic peers +// 4. Updates metrics for monitoring +``` + + + Peer scores and banning events are recorded in metrics. Monitor these metrics + to understand your node's peer health: + - `kona_gossip_peer_scores`: Histogram of peer scores + - `kona_gossip_banned_peers`: Counter of banned peers + - `kona_gossip_peer_connection_duration_seconds`: Connection durations + + +## Best Practices + +1. **Start with Light Scoring**: Use `PeerScoreLevel::Light` for most deployments +2. **Monitor Before Banning**: Run without banning initially to understand score distributions +3. **Adjust Thresholds Gradually**: Start with default -100 threshold and adjust based on observations +4. **Consider Network Conditions**: Increase ban duration in hostile environments +5. **Balance Security and Connectivity**: Overly aggressive scoring can isolate your node +6. **Disable Topic Scoring**: Unless specifically needed for compatibility +7. **Use Metrics**: Monitor peer scores and ban events to tune configuration + +## Related Resources + +- [kona-peers](https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/crates/node/peers) - Peer management and scoring +- [kona-gossip](https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/crates/node/gossip) - Gossipsub implementation +- [kona-node-service](https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/crates/node/service) - Network service implementation +- [libp2p gossipsub](https://docs.rs/libp2p-gossipsub) - Underlying gossipsub protocol +- [OP Stack P2P Spec](https://specs.optimism.io/protocol/rollup-node-p2p.html) - Protocol specification \ No newline at end of file diff --git a/docs/public-docs/rust/kona/sdk/fpp-dev/env.mdx b/docs/public-docs/rust/kona/sdk/fpp-dev/env.mdx new file mode 100644 index 00000000000..ba283dba901 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/fpp-dev/env.mdx @@ -0,0 +1,84 @@ +--- +title: "Environment" +--- + +Before kicking off the development of your own [Fault Proof Program](/rust/kona/glossary#fault-proof-program), +it's important to understand the environment that your program will be running in. + +The FPP runs on top of a custom FPVM target, which is typically a VM with a modified subset of an existing reduced instruction set architecture and a subset of Linux syscalls. The FPVM is designed to +execute verifiable programs, and commonly modifies the instruction set it is derived from as well as the internal representation of memory to support verifiable memory access, `client` (program) +communication with the `host` (the FPVM), and other implementation-specific features. + +## Host and Client Communication + +While the program is running on top of the FPVM, it is considered to be in the `client` role, while the VM is in the `host` role. The only way for the `client` and `host` +to communicate with one another is synchronously through the [Preimage ABI](/rust/kona/glossary#preimage-abi) ([specification][preimage-specs]). + +In order for the `client` to read from the `host`, the `read` and `write` syscalls are modified within the FPVM to allow the `client` to request preparation of and read foreign data. + +### Reading + +When the `client` wants to read data from the `host`, it must first send a "hint" to the `host` through the hint file descriptor, which signals a request for the `host` to prepare the data for reading. The `host` will then +prepare the data, and send a hint acknowledgement back to the `client`. The `client` can then read the data from the host through the designated file descriptor. + +The preparation step ("hinting") is an optimization that allows the `host` to know ahead of time the intents of the `client` and the data it requires for execution. This can allow +for lazy loading of data, and also prevent the need for unnecessary allocations within the `host`'s memory. This step is a no-op on-chain, and is only ran locally +when the `host` is the native implementation of the FPVM. + +

+ +```mermaid +sequenceDiagram + Client->>+Host: Hint preimage (no-op on-chain / read-only mode) + Host-->>-Client: Hint acknowledgement + Client-->>+Host: Preimage Request + Host-->>Host: Prepare Preimage + Host-->>-Client: Preimage Data +``` + +
+ +## Full Example + +Below, we have a full architecture diagram of the [`op-program`][op-program] (source: [fault proof specs][fp-specs]), the reference implementation for the OP Stack's Fault Proof Program, +which has the objective of verifying claims about the state of an [OP Stack][op-stack] layer two. + +![op-program-architecture](/rust/op-program-fpp.svg) + +In this program, execution and derivation of the L2 chain is performed within it, and ultimately the claimed state of the L2 chain is verified in the [prologue](/rust/kona/sdk/fpp-dev/prologue) stage. + +It communicates with the `host` for two reasons: + +1. To request preparation of L1 and L2 state data preimages. +1. To read the L1 and L2 state data preimages that were prepared after the above requests. + +The `host` is responsible for: + +1. Preparing and maintaining a store of the L1 and L2 state data preimages, as well as localized bootstrap k/v pairs. +1. Providing the L1 and L2 state data preimages to the `client` for reading. + +Other programs (`clients`) may have different requirements for communication with the `host`, but the above is a common pattern for programs built on top of a FPVMs. In general: + +1. The `client` program is a state machine that is responsible for bootstrapping itself from the inputs, executing the program logic, and verifying the outcome. +1. The `host` is responsible for providing the `client` with data it wasn't bootstrapped with, and for executing the program itself. + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/sdk/fpp-dev/epilogue.mdx b/docs/public-docs/rust/kona/sdk/fpp-dev/epilogue.mdx new file mode 100644 index 00000000000..8bd053da8a7 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/fpp-dev/epilogue.mdx @@ -0,0 +1,19 @@ +--- +title: "Epilogue" +--- + +The epilogue stage of the program is intended to perform the final validation on the outputs from the +[execution phase](/rust/kona/sdk/fpp-dev/execution). In most programs, this entails comparing the outputs of the execution phase +to portions of the bootstrap data made available during the [prologue phase](/rust/kona/sdk/fpp-dev/prologue). + +Generally, this phase should consist almost entirely of validation steps. + +## Example + +In the `kona-client` program, the prologue phase only contains two directives: + +1. Validate that the L2 safe chain could be produced at the claimed L2 block height. +1. The constructed output root is equivalent to the claimed [L2 output root][l2-output-root]. + + +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction diff --git a/docs/public-docs/rust/kona/sdk/fpp-dev/execution.mdx b/docs/public-docs/rust/kona/sdk/fpp-dev/execution.mdx new file mode 100644 index 00000000000..93b27c4a86c --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/fpp-dev/execution.mdx @@ -0,0 +1,23 @@ +--- +title: "Execution" +--- + +The execution phase of the program is commonly the heaviest portion of the fault proof program, where the computation +that is being verified is performed. + +This phase consumes the outputs of the [prologue phase](/rust/kona/sdk/fpp-dev/prologue), and performs the bulk of the verifiable +computation. After execution has concluded, the outputs are passed along to the [epilogue phase](/rust/kona/sdk/fpp-dev/epilogue) for +final verification. + +## Example + +At a high-level, in the `kona-client` program, the execution phase: + +1. Derives the inputs to the L2 derivation pipeline by unrolling the L1 head hash fetched in the epilogue. +1. Passes the inputs to the L2 derivation pipeline, producing the L2 execution payloads required to reproduce + the L2 safe chain at the claimed height. +1. Executes the payloads produced by the L2 derivation pipeline, producing the [L2 output root][l2-output-root] at the + L2 claim height. + + +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction diff --git a/docs/public-docs/rust/kona/sdk/fpp-dev/intro.mdx b/docs/public-docs/rust/kona/sdk/fpp-dev/intro.mdx new file mode 100644 index 00000000000..fe36d06df2e --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/fpp-dev/intro.mdx @@ -0,0 +1,23 @@ +--- +title: "Fault Proof Program Development" +--- + +This chapter provides an overview of [Fault Proof Program](/rust/kona/glossary#fault-proof-program) development +on top of the custom FPVM targets supported by [Kona][kona]. + +At a high level, a Fault Proof Program is not much different from a regular `no_std` Rust program. A custom entrypoint is provided, and the program +is compiled down to a custom target, which is then executed on the FPVM. + +Fault Proof Programs are structured with 3 stages: +1. **Prologue**: The bootstrapping stage, where the program is loaded into memory and the initial state is set up. During this phase, the program's initial + state is written to the FPVM's memory, and the program's entrypoint is set. +1. **Execution**: The main execution stage, where the program is executed on the FPVM. During this phase, the program's entrypoint is called, and the + program is executed until it exits. +1. **Epilogue**: The finalization stage, where the program's final state is read from the FPVM's memory. During this phase, the program's final state is + inspected and properties of the state transition are verified. + +The following sections will provide a more in-depth overview of each of these stages, as well as the tools and abstractions provided by Kona for +developing your own Fault Proof Programs. + + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona diff --git a/docs/public-docs/rust/kona/sdk/fpp-dev/io.mdx b/docs/public-docs/rust/kona/sdk/fpp-dev/io.mdx new file mode 100644 index 00000000000..93d91cbc76e --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/fpp-dev/io.mdx @@ -0,0 +1,4 @@ +--- +title: "IO" +--- + diff --git a/docs/public-docs/rust/kona/sdk/fpp-dev/prologue.mdx b/docs/public-docs/rust/kona/sdk/fpp-dev/prologue.mdx new file mode 100644 index 00000000000..77edbb09c0f --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/fpp-dev/prologue.mdx @@ -0,0 +1,44 @@ +--- +title: "Prologue" +--- + +The prologue stage of the program is commonly responsible for bootstrapping the program with inputs from an external +source, pulled in through the [Host-Client communication](/rust/kona/sdk/fpp-dev/env#host---client-communication) implementation. + +As a rule of thumb, the prologue implementation should be kept minimal, and should not do much more than establish +the inputs for the [execution phase](/rust/kona/sdk/fpp-dev/execution). + +## Example + +As an example, the prologue stage of the `kona-client` program runs through several steps: + +1. Pull in the boot information over the [Preimage Oracle ABI][preimage-specs], containing: + - The L1 head hash containing all data required to reproduce the L2 safe chain at the claimed block height. + - The latest finalized [L2 output root][l2-output-root]. + - The [L2 output root][l2-output-root] claim. + - The block number of the [L2 output root][l2-output-root] claim. + - The L2 chain ID. +1. Pull in the `RollupConfig` and `L2ChainConfig` corresponding to the passed L2 chain ID. +1. Validate these values. +1. Pass the boot information to the execution phase. + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/sdk/fpp-dev/targets.mdx b/docs/public-docs/rust/kona/sdk/fpp-dev/targets.mdx new file mode 100644 index 00000000000..f01a4135ab2 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/fpp-dev/targets.mdx @@ -0,0 +1,69 @@ +--- +title: "Supported Targets" +--- + +Kona seeks to support all FPVM targets that LLVM and `rustc` can offer introductory support for. Below is a matrix of features that Kona offers +for each FPVM target: + +| Target | Build Pipeline | IO | malloc | +| ---------------------- | -------------- | --- | ------ | +| `cannon` & `cannon-rs` | ✅ | ✅ | ✅ | +| `asterisc` | ✅ | ✅ | ✅ | + +If there is a feature that you would like to see supported, please [open an issue][new-issue] or [consider contributing][contributing]! + +## Asterisc (RISC-V) + +Asterisc is based off of the `rv64gc` target architecture, which defines the following extensions: + +- `RV32I` support - 32 bit base instruction set + - `FENCE`, `ECALL`, `EBREAK` are hardwired to implement a minimal subset of systemcalls of the linux kernel + - Work in progress. All syscalls used by the Golang `risc64` runtime. +- `RV64I` support +- `RV32M`+`RV64M`: Multiplication support +- `RV32A`+`RV64A`: Atomics support +- `RV{32,64}{D,F,Q}`: no-op: No floating points support (since no IEEE754 determinism with rounding modes etc., nor worth the complexity) +- `Zifencei`: `FENCE.I` no-op: No need for `FENCE.I` +- `Zicsr`: no-op: some support for Control-and-status registers may come later though. +- `Ztso`: no-op: no need for Total Store Ordering +- other: revert with error code on unrecognized instructions + +`asterisc` supports a plethora of syscalls, documented [in the repository][asterisc-syscalls]. `kona` offers an interface for +programs to directly invoke a select few syscalls: + +1. `EXIT` - Terminate the process with the provided exit code. +1. `WRITE` - Write the passed buffer to the passed file descriptor. +1. `READ` - Read the specified number of bytes from the passed file descriptor. + +[asterisc-syscalls]: https://github.com/ethereum-optimism/asterisc/blob/master/docs/golang.md#linux-syscalls-used-by-go + +## Cannon (MIPS64r2) + +Cannon is based off of the `mips64r2` target architecture, specified in [MIPS® Architecture For Programmers Volume II-A: The MIPS64® Instruction Set Reference Manual](https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MIPS_Architecture_MIPS64_InstructionSet_%20AFP_P_MD00087_06.05.pdf) + +### Syscalls + +Syscalls supported by `cannon` can be found within the `cannon` specification [here][cannon-syscalls]. + +[cannon-syscalls]: https://specs.optimism.io/fault-proof/cannon-fault-proof-vm.html#syscalls + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/sdk/overview.mdx b/docs/public-docs/rust/kona/sdk/overview.mdx new file mode 100644 index 00000000000..458c9e0ac8a --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/overview.mdx @@ -0,0 +1,36 @@ +--- +title: "Kona as a Library" +--- + +Kona is designed as a modular, library-first OP Stack implementation in Rust. This design philosophy allows developers to integrate Kona components into their applications and build custom solutions on top of the OP Stack. + +## Library Structure + +Kona is organized as a collection of focused crates that can be used independently or together: + +- **Protocol Libraries**: Core protocol logic and data structures +- **Node Components**: Modular node architecture for building custom rollup nodes +- **Proof System**: Fault proof generation and verification +- **Utilities**: Common utilities and helper functions + +## Key Benefits + +- **Modularity**: Use only the components you need +- **Performance**: Rust's zero-cost abstractions and memory safety +- **Extensibility**: Easy to extend and customize for specific use cases +- **Reliability**: Strong typing and comprehensive testing + +## Getting Started + +To use Kona as a library, add the relevant crates to your `Cargo.toml`: + +```toml +[dependencies] +kona-derive = "0.1" +kona-protocol = "0.1" +kona-node = "0.1" +``` + +## Examples + +See the [Examples](/rust/kona/sdk/examples/intro) section for practical usage examples and integration patterns. diff --git a/docs/public-docs/rust/kona/sdk/proof/custom-backend.mdx b/docs/public-docs/rust/kona/sdk/proof/custom-backend.mdx new file mode 100644 index 00000000000..8dfb0366a13 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/proof/custom-backend.mdx @@ -0,0 +1,141 @@ +--- +title: "Custom Backends" +--- + +## Understanding the OP Stack STF + +The OP Stack state transition is comprised of two primary components: + +- **The [derivation pipeline](https://specs.optimism.io/protocol/derivation.html)** (`kona-derive`) + - Responsible for deriving L2 chain state from the DA layer. +- **The [execution engine](https://specs.optimism.io/protocol/exec-engine.html#l2-execution-engine)** (`kona-executor`) + - Responsible for the execution of transactions and state commitments. + - Ensures correct application of derived L2 state. + +To prove the correctness of the state transition, Kona composes these two components: + +- It combines the derivation of the L2 chain with its execution in the same process. +- It pulls in necessary data from sources to complete the STF, verifiably unrolling the input commitments along the way. + +`kona-client` serves as an implementation of this process, capable of deriving and executing a single L2 block in a +verifiable manner. + +> 📖 Why just a single block by default? +> +> On the OP Stack, we employ an interactive bisection game that narrows in on the disagreed upon block -> block state +> transition before requiring a fault proof to be ran. Because of this, the default implementation only serves +> to derive and execute the single block that the participants of the bisection game landed on. + +## Backend Traits + +Covered in the [FPVM Backend](/rust/kona/sdk/proof/fpvm-backend) section of the book, `kona-client` ships with an implementation of +`kona-derive` and `kona-executor`'s data source traits which pull in data over the [PreimageOracle ABI][preimage-specs]. + +However, running `kona-client` on top of a different verifiable environment, i.e. a zkVM or TEE, is also possible +through custom implementations of these data source traits. + +[`op-succinct`](https://github.com/succinctlabs/op-succinct) is an excellent example of both a custom backend and a custom +program, implementing both `kona-derive` and `kona-executor`'s data source traits backed by [sp1_lib::io](https://docs.rs/sp1-lib/latest/sp1_lib/io/index.html) +in order to: + +1. Execute `kona-client` verbatim, proving a single block's derivation and execution on SP-1. +1. Derive and execute an entire [Span Batch](https://specs.optimism.io/protocol/delta/span-batches.html#span-batches) + worth of L2 blocks, using `kona-derive` and `kona-executor`. + +This section of the book outlines how you can do the same for a different platform. + +### Custom `kona-derive` sources + +Before getting started, we need to create custom implementations of the following traits: + +| Trait | Description | +| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| [`ChainProvider`](https://docs.rs/kona-derive/latest/kona_derive/trait.ChainProvider.html) | The `ChainProvider` trait describes the minimal interface for fetching data from L1 during L2 chain derivation. | +| [`L2ChainProvider`](https://docs.rs/kona-derive/latest/kona_derive/trait.L2ChainProvider.html) | The `ChainProvider` trait describes the minimal interface for fetching data from the safe L2 chain during L2 chain derivation. | +| [`BlobProvider`](https://docs.rs/kona-derive/latest/kona_derive/trait.BlobProvider.html) | The `BlobProvider` trait describes an interface for fetching EIP-4844 blobs from the L1 consensus layer during L2 chain derivation. | + +Once these are implemented, constructing the pipeline is as simple as passing in the data sources to the `PipelineBuilder`. Keep in mind the requirements for validation of incoming data, depending on your platform. For example, programs +targeting zkVMs must constrain that the incoming data is indeed valid, whereas fault proof programs can offload this validation to the on-chain implementation of the host. + +```rust +let chain_provider = ...; +let l2_chain_provider = ...; +let blob_provider = ...; +let l1_origin = ...; + +let cfg = Arc::new(RollupConfig::default()); +let attributes = StatefulAttributesBuilder::new( + cfg.clone(), + l2_chain_provider.clone(), + chain_provider.clone(), +); +let dap = EthereumDataSource::new( + chain_provider.clone(), + blob_provider, + cfg.as_ref() +); + +// Construct a new derivation pipeline. +let pipeline = PipelineBuilder::new() + .rollup_config(cfg) + .dap_source(dap) + .l2_chain_provider(l2_chain_provider) + .chain_provider(chain_provider) + .builder(attributes) + .origin(l1_origin) + .build(); +``` + +From here, a custom derivation driver is needed to produce the desired execution payload(s). An example of this for +`kona-client` can be found in the [single proof implementation](https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/bin/client/src/single.rs#L98). + +### `kona-mpt` / `kona-executor` sources + +Before getting started, we need to create custom implementations of the following traits: + +| Trait | Description | +| ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [`TrieProvider`](https://docs.rs/kona-mpt/latest/kona_mpt/trait.TrieProvider.html) | The `TrieProvider` trait describes the interface for fetching trie node preimages and chain information while executing a payload on the L2 chain. | +| [`TrieDBHinter`](https://docs.rs/kona-mpt/latest/kona_mpt/trait.TrieHinter.html) | The `TrieDBHinter` trait describes the interface for requesting the host program to prepare trie proof preimages for the client's consumption. For targets with upfront witness generation, i.e. zkVMs, a no-op hinter is exported as [`NoopTrieHinter`](https://docs.rs/kona-mpt/latest/kona_mpt/struct.NoopTrieHinter.html). | + +Once we have those, the `StatelessL2BlockExecutor` can be constructed like so: + +```rust +let cfg = RollupConfig::default(); +let provider = ...; +let hinter = ...; + +let executor = StatelessL2BlockExecutor::builder(&cfg, provider, hinter) + .with_parent_header(...) + .build(); + +let header = executor.execute_payload(...).expect("Failed execution"); +``` + +### Bringing it Together + +Once your custom backend traits for both `kona-derive` and `kona-executor` have been implemented, +your final binary may look something like [that of `kona-client`'s](https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/bin/client/src/kona.rs). +Alternatively, if you're looking to prove a wider range of blocks, [`op-succinct`'s `range` program](https://github.com/succinctlabs/op-succinct/tree/main/programs/range) +offers a good example of running the pipeline and executor across a string of contiguous blocks. + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/sdk/proof/exec-ext.mdx b/docs/public-docs/rust/kona/sdk/proof/exec-ext.mdx new file mode 100644 index 00000000000..4e7732e2fba --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/proof/exec-ext.mdx @@ -0,0 +1,213 @@ +--- +title: "`kona-executor` Extensions" +--- + +The `kona-executor` crate offers a to-spec, stateless implementation of the OP Stack STF. However, due to the +power of [`alloy-evm`][alloy-evm]'s factory abstractions, the logic of the STF can be easily customized. + +To customize the EVM behavior, for example to add a custom precompile, modify the behavior of an EVM opcode, +or change the fee handling, you can implement a custom [`EvmFactory`][evm-factory]. The factory is responsible +for creating EVM instances with your desired customizations. + +## Example - Custom Precompile + +```rust +use alloy_evm::{Database, EvmEnv, EvmFactory}; +use alloy_op_evm::OpEvm; +use alloy_primitives::{Address, Bytes, u64_to_address}; +use kona_executor::StatelessL2Builder; +use kona_genesis::RollupConfig; +use op_revm::{ + DefaultOp, OpContext, OpEvm as RevmOpEvm, OpHaltReason, OpSpecId, OpTransaction, + OpTransactionError, +}; +use revm::{ + Context, Inspector, + context::{Evm as RevmEvm, FrameStack, TxEnv, result::EVMError}, + handler::instructions::EthInstructions, + inspector::NoOpInspector, + precompile::{PrecompileResult, PrecompileOutput, Precompiles}, +}; + +const MY_PRECOMPILE_ADDRESS: Address = u64_to_address(0xFF); + +fn my_precompile(input: &Bytes, gas_limit: u64) -> PrecompileResult { + Ok(PrecompileOutput::new(50, "hello, world!".as_bytes().into())) +} + +#[derive(Debug, Clone)] +pub struct CustomEvmFactory; + +impl EvmFactory for CustomEvmFactory { + type Evm>> = OpEvm; + type Context = OpContext; + type Tx = OpTransaction; + type Error = + EVMError; + type HaltReason = OpHaltReason; + type Spec = OpSpecId; + type Precompiles = CustomPrecompiles; + + fn create_evm( + &self, + db: DB, + input: EvmEnv, + ) -> Self::Evm { + let spec_id = *input.spec_id(); + let ctx = Context::op().with_db(db).with_block(input.block_env).with_cfg(input.cfg_env); + + // Create custom precompiles with our added precompile + let mut precompiles = op_revm::precompiles::granite(); + precompiles.insert(MY_PRECOMPILE_ADDRESS, my_precompile); + let custom_precompiles = CustomPrecompiles { precompiles }; + + let revm_evm = RevmOpEvm(RevmEvm { + ctx, + inspector: NoOpInspector {}, + instruction: EthInstructions::new_mainnet(), + precompiles: custom_precompiles, + frame_stack: FrameStack::new(), + }); + + OpEvm::new(revm_evm, false) + } + + fn create_evm_with_inspector>>( + &self, + db: DB, + input: EvmEnv, + inspector: I, + ) -> Self::Evm { + let spec_id = *input.spec_id(); + let ctx = Context::op().with_db(db).with_block(input.block_env).with_cfg(input.cfg_env); + + // Create custom precompiles with our added precompile + let mut precompiles = op_revm::precompiles::granite(); + precompiles.insert(MY_PRECOMPILE_ADDRESS, my_precompile); + let custom_precompiles = CustomPrecompiles { precompiles }; + + let revm_evm = RevmOpEvm(RevmEvm { + ctx, + inspector, + instruction: EthInstructions::new_mainnet(), + precompiles: custom_precompiles, + frame_stack: FrameStack::new(), + }); + + OpEvm::new(revm_evm, true) + } +} + +// Custom precompiles wrapper +#[derive(Debug)] +pub struct CustomPrecompiles { + precompiles: Precompiles, +} + +impl revm::handler::PrecompileProvider for CustomPrecompiles +where + CTX: revm::context::ContextTr>, +{ + type Output = revm::interpreter::InterpreterResult; + + fn set_spec(&mut self, spec: OpSpecId) -> bool { + // Update precompiles based on spec if needed + false + } + + fn run( + &mut self, + _context: &mut CTX, + address: &Address, + inputs: &revm::interpreter::InputsImpl, + _is_static: bool, + gas_limit: u64, + ) -> Result, String> { + use revm::interpreter::{Gas, InstructionResult, InterpreterResult}; + + let input = match &inputs.input { + revm::interpreter::CallInput::Bytes(bytes) => bytes.clone(), + revm::interpreter::CallInput::SharedBuffer(range) => { + // Handle shared buffer case - simplified for example + Bytes::new() + } + }; + + if let Some(precompile) = self.precompiles.get(address) { + let result = (*precompile)(&input, gas_limit); + match result { + Ok(output) => Ok(Some(InterpreterResult { + result: InstructionResult::Return, + gas: Gas::new(gas_limit - output.gas_used), + output: output.bytes, + })), + Err(_) => Ok(Some(InterpreterResult { + result: InstructionResult::PrecompileError, + gas: Gas::new(0), + output: Bytes::new(), + })), + } + } else { + Ok(None) + } + } +} + +// - snip - + +let cfg = RollupConfig::default(); +let provider = ...; +let hinter = ...; +let parent_header = ...; + +let executor = StatelessL2Builder::new( + &cfg, + CustomEvmFactory, + provider, + hinter, + parent_header, +); +``` + +## Migration from the old API + +Prior to the integration of `alloy-evm`, `kona-executor` used a builder pattern with `StatelessL2BlockExecutorBuilder::with_handle_register` for EVM customization. The new approach using `EvmFactory` provides better composability and aligns with the broader Alloy ecosystem. + +### Key Changes: + +1. **Direct construction**: Use `StatelessL2Builder::new()` instead of a builder pattern +2. **Factory-based customization**: Implement `EvmFactory` instead of registering handlers +3. **Type safety**: The factory approach provides better compile-time guarantees +4. **Ecosystem alignment**: Leverages the standard `alloy-evm` interfaces + +### Benefits: + +- **Composability**: Custom EVM factories can be easily shared and reused +- **Flexibility**: Full control over EVM creation and configuration +- **Performance**: Reduced indirection compared to the handler approach +- **Maintainability**: Cleaner separation of concerns between execution and customization + +For more complex customizations involving multiple precompiles, custom opcodes, or specialized execution logic, refer to the [`FpvmOpEvmFactory`](https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/bin/client/src/fpvm_evm/factory.rs) implementation in the `kona-client` for a comprehensive example. + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm +[alloy-evm]: https://github.com/alloy-rs/evm +[evm-factory]: https://docs.rs/alloy-evm/latest/alloy_evm/eth/struct.EthEvmFactory.html + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/sdk/proof/fpvm-backend.mdx b/docs/public-docs/rust/kona/sdk/proof/fpvm-backend.mdx new file mode 100644 index 00000000000..26c204ffa52 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/proof/fpvm-backend.mdx @@ -0,0 +1,161 @@ +--- +title: "FPVM Backend" +--- + +> 📖 Before reading this section of the book, it is advised to read the [Fault Proof Program Environment](/rust/kona/sdk/fpp-dev/env) +> section to familiarize yourself with the PreimageOracle IO pattern. + +Kona is effectively split into three parts: + +- OP Stack state transition logic (`kona-derive`, `kona-executor`, `kona-mpt`) +- OP Stack state transition proof SDK (`kona-preimage`, `kona-proof`) +- [Fault Proof VM](/rust/kona/glossary#fault-proof-vm) IO and utilities + (`kona-std-fpvm`, `kona-std-fpvm-proc`) + +This section of the book focuses on the usage of `kona-std-fpvm` and `kona-preimage` to facilitate communication between host and client +for programs running on top of the [FPVM targets](/rust/kona/sdk/fpp-dev/env). + +## Host and Client Communication API + +The FPVM system API is built on several layers. In this document, we'll cover these layers, from lowest-level to +highest-level API. + +### `kona-std-fpvm` + +`kona-std-fpvm` implements raw syscall dispatch, a default global memory allocator, and a blocking async runtime. +`kona-std-fpvm` relies on a minimal linux backend to function, supporting only the syscalls required to implement the +[PreimageOracle ABI][preimage-specs] (`read`, `write`, `exit_group`). + +These syscalls are exposed to the user through the `io` module directly, with each supported platform implementing the +[`BasicKernelInterface`](https://docs.rs/kona-std-fpvm/latest/kona_std_fpvm/trait.BasicKernelInterface.html) trait. + +To directly dispatch these syscalls, the [`io`](https://docs.rs/kona-std-fpvm/latest/kona_std_fpvm/io/index.html) module +exposes a safe API: + +```rust +use kona_std_fpvm::{io, FileDescriptor}; + +// Print to `stdout`. Infallible, will panic if dispatch fails. +io::print("Hello, world!"); + +// Print to `stderr`. Infallible, will panic if dispatch fails. +io::print_err("Goodbye, world!"); + +// Read from or write to a specified file descriptor. Returns a result with the +// return value or syscall errno. +let _ = io::write(FileDescriptor::StdOut, "Hello, world!".as_bytes()); +let mut buf = Vec::with_capacity(8); +let _ = io::read(FileDescriptor::StdIn, buf.as_mut_slice()); + +// Exit the program with a specified exit code. +io::exit(0); +``` + +With this library, you can implement a custom communication protocol between the host and client, or extend the existing +[PreimageOracle ABI][preimage-specs]. However, for most developers, we recommend sticking with `kona-preimage` +when developing programs that target the [FPVMs](/rust/kona/sdk/fpp-dev/env), barring needs like printing directly to +`stdout`. + +### `kona-preimage` + +`kona-preimage` is an implementation of the [PreimageOracle ABI][preimage-specs]. This crate enables synchronous +communication between the host and client program, described in +[Host - Client Communication](/rust/kona/sdk/fpp-dev/env#host---client-communication) in the FPP Dev environment section of the +book. + +The crate is built around the [`Channel`](https://docs.rs/kona-preimage/latest/kona_preimage/trait.Channel.html) trait, +which serves as a single end of a bidirectional pipe (see: [`pipe` manpage](https://man7.org/linux/man-pages/man2/pipe.2.html)). + +Through this handle, the higher-level constructs can read and write data to the counterparty holding on to the other end +of the channel, following the protocol below: + +
+ +```mermaid +sequenceDiagram + Client->>+Host: Hint preimage (no-op on-chain / read-only mode) + Host-->>-Client: Hint acknowledgement + Client-->>+Host: Preimage Request + Host-->>Host: Prepare Preimage + Host-->>-Client: Preimage Data +``` + +
+ +The interfaces of each part of the above protocol are described by the following traits: + +- [`PreimageOracleClient`](https://docs.rs/kona-preimage/latest/kona_preimage/trait.PreimageOracleClient.html) + - To-spec implementation: [`OracleReader`](https://docs.rs/kona-preimage/latest/kona_preimage/struct.OracleReader.html) +- [`HintWriterClient`](https://docs.rs/kona-preimage/latest/kona_preimage/trait.HintWriterClient.html) + - To-spec implementation: [`HintWriter`](https://docs.rs/kona-preimage/latest/kona_preimage/struct.HintWriter.html) +- [`PreimageOracleServer`](https://docs.rs/kona-preimage/latest/kona_preimage/trait.PreimageOracleServer.html) + - To-spec implementation: [`OracleServer`](https://docs.rs/kona-preimage/latest/kona_preimage/struct.OracleServer.html) +- [`HintReaderServer`](https://docs.rs/kona-preimage/latest/kona_preimage/trait.HintReaderServer.html) + - To-spec implementation: [`HintReader`](https://docs.rs/kona-preimage/latest/kona_preimage/struct.HintReader.html) + +Each of these traits, however, can be re-implemented to redefine the communication protocol between the host and client if the needs +of the consumer are not covered by the to-[spec][preimage-specs] implementations. + +### `kona-proof` - Oracle-backed sources (example) + +Finally, in `kona-proof`, implementations of data source traits from `kona-derive` and `kona-executor` are provided +to pull in untyped data from the host by `PreimageKey`. These data source traits are covered in more detail within +the [Custom Backend](/rust/kona/sdk/proof/custom-backend) section, but we'll quickly gloss over them here to build intuition. + +Let's take, for example, [`OracleL1ChainProvider`](https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/bin/client/src/l1/chain_provider.rs#L16-L23). +The [`ChainProvider`](https://docs.rs/kona-derive/latest/kona_derive/trait.ChainProvider.html) trait in `kona-derive` +defines a simple interface for fetching information about the L1 chain. In the `OracleL1ChainProvider`, this information +is pulled in over the [PreimageOracle ABI][preimage-specs]. There are many other examples of these data source traits, +namely the `L2ChainProvider`, `BlobProvider`, `TrieProvider`, and `TrieHinter`, which enable the creation of different +data-source backends. + +As an example, let's look at `OracleL1ChainProvider::header_by_hash`, built on top of the `CommsClient` trait, which +is a composition trait of the `PreimageOracleClient + HintReaderServer` traits outlined above. + +```rust +#[async_trait] +impl ChainProvider for OracleL1ChainProvider { + type Error = anyhow::Error; + + async fn header_by_hash(&mut self, hash: B256) -> Result
{ + // Send a hint for the block header. + self.oracle.write(&HintType::L1BlockHeader.encode_with(&[hash.as_ref()])).await?; + + // Fetch the header RLP from the oracle. + let header_rlp = + self.oracle.get(PreimageKey::new(*hash, PreimageKeyType::Keccak256)).await?; + + // Decode the header RLP into a Header. + Header::decode(&mut header_rlp.as_slice()) + .map_err(|e| anyhow!("Failed to decode header RLP: {e}")) + } + + // - snip - +} +``` + +In `header_by_hash`, we use the inner `HintWriter` to send a hint to the host to prepare the block hash preimage. +Then, once we've received an acknowledgement from the host that the preimage has been prepared, we reach out for +the RLP (which is the preimage of the hash). After the RLP is received, we decode the `Header` type, and return +it to the user. + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/sdk/proof/intro.mdx b/docs/public-docs/rust/kona/sdk/proof/intro.mdx new file mode 100644 index 00000000000..9a0592c4107 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/proof/intro.mdx @@ -0,0 +1,63 @@ +--- +title: "Kona Proof SDK" +--- + +Welcome to the Kona Proof SDK, a powerful set of libraries designed +from first principles to build proofs with the OP Stack STF on top +of the OP Stack's FPVMs and other verifiable backends like [SP-1][sp-1], +[Risc0][rzero], [Intel TDX][tdx], and [AMD SEV-SNP][sev-snp]. At its +core, Kona is built on the principles of modularity, extensibility, +and developer empowerment. + +## A Foundation of Flexibility + +The kona repository is more than a fault proof program for the OP Stack +— it's an ecosystem of interoperable components, each crafted with +reusability and extensibility as primary goals. While we provide +[Fault Proof VM](/rust/kona/glossary#fault-proof-vm) and "online" backends +for key components like `kona-derive` and `kona-executor`, the true +power of `kona` lies in its adaptability. + +## Extend Without Forking + +One of Kona's standout features is its ability to support custom +features and data sources without requiring you to fork the entire +project. Through careful use of Rust's powerful trait system and +abstract interfaces, we've created a framework that allows you to +plug in your own features and ideas seamlessly. + +## What You'll Learn + +In this section of the developer book, we'll dive deep into the Kona SDK, covering: +* **Building on the FPVM Backend**: Learn how to leverage the Fault Proof VM tooling to create your own fault proof programs. +* **Creating Custom Backends**: Discover the process of designing and implementing your own backend to run `kona-client` or a variation of it on different targets. +* **Extending Core Components**: Explore techniques for creating new constructs that integrate smoothly with crates like `kona-derive` and `kona-executor`. + +Whether you're looking to use Kona as-is, extend its functionality, or create entirely new programs based on its libraries, +this guide is intended to provide you with the knowledge and tools you need to succeed. + +[sp-1]: https://github.com/succinctlabs/sp1 +[rzero]: https://github.com/risc0/risc0 +[tdx]: https://www.intel.com/content/www/us/en/developer/tools/trust-domain-extensions/documentation.html +[sev-snp]: https://www.amd.com/en/developer/sev.html + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/sdk/protocol/derive/intro.mdx b/docs/public-docs/rust/kona/sdk/protocol/derive/intro.mdx new file mode 100644 index 00000000000..e587a813c0c --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/derive/intro.mdx @@ -0,0 +1,312 @@ +--- +title: "The `kona-derive` Derivation Pipeline" +--- + +[`kona-derive`][kd] defines an entirely trait-abstracted, `no_std` derivation +pipeline for the OP Stack. It can be used through the [`Pipeline`][p] trait, +which is implemented for the concrete [`DerivationPipeline`][dp] object. + +This document dives into the inner workings of the derivation pipeline, its +stages, and how to build and interface with Kona's pipeline. Other documents +in this section will provide a comprehensive overview of Derivation Pipeline +extensibility including trait-abstracted providers, custom stages, signaling, +and hardfork activation including multiplexed stages. + +- [Swapping out a stage](/rust/kona/sdk/protocol/derive/stages) +- [Defining a custom Provider](/rust/kona/sdk/protocol/derive/providers) +- [Extending Pipeline Signals](/rust/kona/sdk/protocol/derive/signaling) +- [Implementing Hardfork Activations](/rust/kona/sdk/protocol/hardforks) + + +## What is a Derivation Pipeline? + +Simply put, an OP Stack Derivation Pipeline transforms data on L1 into L2 +payload attributes that can be executed to produce the canonical L2 block. + +Within a pipeline, there are a set of stages that break up this transformation +further. When composed, these stages operate over the input data, sequentially +producing payload attributes. + +In [`kona-derive`][kd], stages are architected using composition - each sequential +stage owns the previous one, forming a stack. For example, let's define stage A +as the first stage, accepting raw L1 input data, and stage C produces the pipeline +output - payload attributes. Stage B "owns" stage A, and stage C then owns stage B. +Using this example, the [`DerivationPipeline`][dp] type in [`kona-derive`][kd] only +holds stage C, since ownership of the other stages is nested within stage C. + + +In a future architecture of the derivation pipeline, stages could be made +standalone such that communication between stages happens through channels. +In a multi-threaded, non-fault-proof environment, these stages can then +run in parallel since stage ownership is decoupled. + + + +## Kona's Derivation Pipeline + +The top-level stage in [`kona-derive`][kd] that produces +[`OpAttributesWithParent`][attributes] is the [`AttributesQueue`][attributes-queue]. + +Post-Holocene (the Holocene hardfork), the following stages are composed by +the [`DerivationPipeline`][dp]. +- [`AttributesQueue`][attributes-queue] + - [`BatchProvider`][batch-provider] + - [`BatchStream`][batch-stream] + - [`ChannelReader`][channel-reader] + - [`ChannelProvider`][channel-provider] + - [`FrameQueue`][frame-queue] + - [`L1Retrieval`][retrieval] + - [`IndexedTraversal` or `PollingTraversal`][traversal] + +Notice, from top to bottom, each stage owns the stage nested below it. +Where the [`IndexedTraversal` or `PollingTraversal`][traversal] stage iterates over L1 data, the +[`AttributesQueue`][attributes-queue] stage produces +[`OpAttributesWithParent`][attributes], creating a function that transforms +L1 data into payload attributes. + + +## The [`Pipeline`][p] interface + +Now that we've broken down the stages inside the [`DerivationPipeline`][dp] +type, let's move up another level to break down how the [`DerivationPipeline`][dp] +type functions itself. At the highest level, [`kona-derive`][kd] defines the +interface for working with the pipeline through the [`Pipeline`][p] trait. + +[`Pipeline`][p] provides two core methods. +- `peek() -> Option<&OpAttributesWithParent>` +- `async step() -> StepResult` + +Functionally, a pipeline can be "stepped" on, which attempts to derive +payload attributes from input data. Steps do not guarantee that payload attributes +are produced, they only attempt to advance the stages within the pipeline. + +The `peek()` method provides a way to check if attributes are prepared. +Beyond `peek()` returning `Option::Some(&OpAttributesWithParent)`, the [`Pipeline`][p] +extends the [Iterator][iterator] trait, providing a way to consume the generated payload +attributes. + + +## Constructing a Derivation Pipeline + +[`kona-derive`][kd] provides a [`PipelineBuilder`][builder] to abstract the complexity +of generics away from the downstream consumers. Below we provide an example for using +the [`PipelineBuilder`][builder] to instantiate a [`DerivationPipeline`][dp]. + +```rust,ignore +// Imports +use std::sync::Arc; +use kona_protocol::BlockInfo; +use kona_genesis::RollupConfig; +use kona_providers_alloy::*; + +// Use a default rollup config. +let rollup_config = Arc::new(RollupConfig::default()); + +// Providers are instantiated to with localhost urls (`127.0.0.1`) +let chain_provider = + AlloyChainProvider::new_http("http://127.0.0.1:8545".try_into().unwrap()); +let l2_chain_provider = AlloyL2ChainProvider::new_http( + "http://127.0.0.1:9545".try_into().unwrap(), + rollup_config.clone(), +); +let beacon_client = OnlineBeaconClient::new_http("http://127.0.0.1:5555".into()); +let blob_provider = OnlineBlobProvider::new(beacon_client, None, None); +let blob_provider = OnlineBlobProviderWithFallback::new(blob_provider, None); +let dap_source = + EthereumDataSource::new(chain_provider.clone(), blob_provider, &rollup_config); +let builder = StatefulAttributesBuilder::new( + rollup_config.clone(), + l2_chain_provider.clone(), + chain_provider.clone(), +); + +// This is the starting L1 block for the pipeline. +// +// To get the starting L1 block for a given L2 block, +// use the `AlloyL2ChainProvider::l2_block_info_by_number` +// method to get the `L2BlockInfo.l1_origin`. This l1_origin +// is the origin that can be passed here. +let origin = BlockInfo::default(); + +// Build the pipeline using the `PipelineBuilder`. +// Alternatively, use the `new_online_pipeline` helper +// method provided by the `kona-derive-alloy` crate. +let pipeline = PipelineBuilder::new() + .rollup_config(rollup_config.clone()) + .dap_source(dap_source) + .l2_chain_provider(l2_chain_provider) + .chain_provider(chain_provider) + .builder(builder) + .origin(origin) + .build(); + +assert_eq!(pipeline.rollup_config, rollup_config); +assert_eq!(pipeline.origin(), Some(origin)); +``` + + +## Producing Payload Attributes + +Since the [`Pipeline`][p] trait extends the [`Iterator`][iterator] trait, +producing [`OpAttributesWithParent`][attributes] is as simple as calling +[`Iterator::next()`][next] method on the [`DerivationPipeline`][dp]. + +Extending the example from above, producing the attributes is shown below. + +```rust +// Import the iterator trait to show where `.next` is sourced. +use core::iter::Iterator; + +// ... +// example from above constructing the pipeline +// ... + +let attributes = pipeline.next(); + +// Since we haven't stepped on the pipeline, +// there shouldn't be any payload attributes prepared. +assert!(attributes.is_none()); +``` + +As demonstrated, the pipeline won't have any payload attributes +without having been "stepped" on. Naively, we can continuously +step on the pipeline until attributes are ready, and then consume them. + +```rust +// Import the iterator trait to show where `.next` is sourced. +use core::iter::Iterator; + +// ... +// example from constructing the pipeline +// ... + +// Continuously step on the pipeline until attributes are prepared. +let l2_safe_head = L2BlockInfo::default(); +loop { + if matches!(pipeline.step(l2_safe_head).await, StepResult::PreparedAttributes) { + // The pipeline has successfully prepared payload attributes, break the loop. + break; + } +} + +// Since the loop is only broken once attributes are prepared, +// this must be `Option::Some`. +let attributes = pipeline.next().expect("Must contain payload attributes"); + +// The parent of the prepared payload attributes should be +// the l2 safe head that we "stepped on". +assert_eq!(attributes.parent, l2_safe_head); +``` + +Importantly, the above is not sufficient logic to produce payload attributes and drive +the derivation pipeline. There are multiple different `StepResult`s to handle when +stepping on the pipeline, including advancing the origin, re-orgs, and pipeline resets. +In the next section, pipeline resets are outlined. + +For an up-to-date driver that runs the derivation pipeline as part of the fault proof +program, reference kona's [client driver][driver]. + + +## Resets + +When stepping on the [`DerivationPipeline`][dp] produces a reset error, the driver +of the pipeline must perform a reset on the pipeline. This is done by sending a "signal" +through the [`DerivationPipeline`][dp]. Below demonstrates this. + +```rust +// Import the iterator trait to show where `.next` is sourced. +use core::iter::Iterator; + +// ... +// example from constructing the pipeline +// ... + +// Continuously step on the pipeline until attributes are prepared. +let l2_safe_head = L2BlockInfo::default(); +loop { + match pipeline.step(l2_safe_head).await { + StepResult::StepFailed(e) | StepResult::OriginAdvanceErr(e) => { + match e { + PipelineErrorKind::Reset(e) => { + // Get the system config from the provider. + let system_config = l2_chain_provider + .system_config_by_number( + l2_safe_head.block_info.number, + rollup_config.clone(), + ) + .await?; + // Reset the pipeline to the initial L2 safe head and L1 origin. + self.pipeline + .signal( + ResetSignal { + l2_safe_head: l2_safe_head, + l1_origin: pipeline + .origin() + .ok_or_else(|| anyhow!("Missing L1 origin"))?, + system_config: Some(system_config), + } + .signal(), + ) + .await?; + // ... + } + _ => { /* Handling left to the driver */ } + } + } + _ => { /* Handling left to the driver */ } + } +} +``` + + +## Learn More + +[`kona-derive`][kd] is one implementation of the OP Stack derivation pipeline. + +To learn more, it is highly encouraged to read the ["first" derivation pipeline][op-dp] +written in [golang][go]. It is often colloquially referred to as the "reference" +implementation and provides the basis for how much of Kona's derivation pipeline +was built. + + +## Provenance + +> The lore do be bountiful. +> +> - Bard XVIII of the Logic Gates + +The kona project spawned out of the need to build a secondary fault proof for the OP Stack. +Initially, we sought to re-use [magi][magi]'s derivation pipeline, but the ethereum-rust +ecosystem moves quickly and [magi][magi] was behind by a generation of types - using +[ethers-rs] instead of new [alloy][alloy] types. Additionally, [magi][magi]'s derivation +pipeline was not `no_std` compatible - a hard requirement for running a rust fault proof +program on top of the RISCV or MIPS ISAs. + +So, [@clabby][clabby] and [@refcell][refcell] stood up [kona][kona] in a few months. + + +[driver]: https://docs.rs/kona-driver/latest/kona_driver/struct.Driver.html +[next]: https://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html#tymethod.next +[builder]: https://docs.rs/kona-derive/latest/kona_derive/struct.PipelineBuilder.html +[alloy]: https://github.com/alloy-rs/alloy +[ethers-rs]: https://github.com/gakonst/ethers-rs +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[clabby]: https://github.com/clabby +[refcell]: https://github.com/refcell +[go]: https://go.dev/ +[magi]: https://github.com/a16z/magi +[kd]: https://crates.io/crates/kona-derive +[iterator]: https://doc.rust-lang.org/nightly/core/iter/trait.Iterator.html +[p]: https://docs.rs/kona-derive/latest/kona_derive/trait.Pipeline.html +[op-dp]: https://github.com/ethereum-optimism/optimism/tree/develop/op-node/rollup/derive +[dp]: https://docs.rs/kona-derive/latest/kona_derive/struct.DerivationPipeline.html +[attributes]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.OpAttributesWithParent.html + +[attributes-queue]: https://docs.rs/kona-derive/latest/kona_derive/struct.AttributesQueue.html +[batch-provider]: https://docs.rs/kona-derive/latest/kona_derive/struct.BatchProvider.html +[batch-stream]: https://docs.rs/kona-derive/latest/kona_derive/struct.BatchStream.html +[channel-reader]: https://docs.rs/kona-derive/latest/kona_derive/struct.ChannelReader.html +[channel-provider]: https://docs.rs/kona-derive/latest/kona_derive/struct.ChannelProvider.html +[frame-queue]: https://docs.rs/kona-derive/latest/kona_derive/struct.FrameQueue.html +[retrieval]: https://docs.rs/kona-derive/latest/kona_derive/struct.L1Retrieval.html +[traversal]: https://docs.rs/kona-derive/latest/kona_derive/struct.IndexedTraversal.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/derive/providers.mdx b/docs/public-docs/rust/kona/sdk/protocol/derive/providers.mdx new file mode 100644 index 00000000000..cd74a9c6d45 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/derive/providers.mdx @@ -0,0 +1,102 @@ +--- +title: "Trait-abstracted Providers" +--- + +Kona's derivation pipeline pulls in data from sources that are trait +abstracted so the pipeline can be generic over various data sources. +Note, "data sources" is used interchangeably with "trait-abstracted +providers" for the purpose of this document. + +The key traits required for the pipeline are the following. + +- [`ChainProvider`][chain-provider] +- [`L2ChainProvider`][l2-chain-provider] +- [`DataAvailabilityProvider`][dap] + +The [`kona-derive-alloy`][kda] crate provides `std` implementations +of these traits using [Alloy][alloy]'s `reqwest`-backed providers. + +## Provider Usage + +Although trait-abstracted Providers are used throughout the pipeline and +its stages, the [`PipelineBuilder`][builder] makes constructing the pipeline +generic over the providers. An example is shown below, where the three +required trait implementations are the providers stubbed with `todo!()`. + +```rust +use std::sync::Arc; +use kona_genesis::RollupConfig; +use kona_derive::PipelineBuilder; +use kona_derive::StatefulAttributesBuilder; + +// The rollup config for your chain. +let cfg = Arc::new(RollupConfig::default()); + +// Must implement the `ChainProvider` trait. +let chain_provider = todo!("your chain provider"); + +// Must implement the `L2ChainProvider` trait. +let l2_chain_provider = todo!("your l2 chain provider"); + +// Must implement the `DataAvailabilityProvider` trait. +let dap = todo!("your data availability provider"); + +// Generic over the providers. +let attributes = StatefulAttributesBuilder::new( + cfg.clone(), + l2_chain_provider.clone(), + chain_provider.clone(), +); + +// Construct a new derivation pipeline. +let pipeline = PipelineBuilder::new() + .rollup_config(cfg) + .dap_source(dap) + .l2_chain_provider(l2_chain_provider) + .chain_provider(chain_provider) + .builder(attributes) + .origin(BlockInfo::default()) + .build(); +``` + +## Implementing a Custom Data Availability Provider + +> Notice +> +> The only required method for the [`DataAvailabilityProvider`][dap] +> trait is the [`next`][next] method. + +```rust +use async_trait::async_trait; +use alloy_primitives::Bytes; +use kona_protocol::BlockInfo; +use kona_derive::DataAvailabilityProvider; +use kona_derive::PipelineResult; + +/// ExampleAvail +/// +/// An example implementation of the `DataAvailabilityProvider` trait. +#[derive(Debug)] +pub struct ExampleAvail { + // Place your data in here +} + +#[async_trait] +impl DataAvailabilityProvider for ExampleAvail { + type Item = Bytes; + + async fn next(&self, block_ref: &BlockInfo) -> PipelineResult { + todo!("return an AsyncIterator implementation here") + } +} +``` + + +[dap]: https://docs.rs/kona-derive/latest/kona_derive/trait.DataAvailabilityProvider.html +[next]: https://docs.rs/kona-derive/latest/kona_derive/trait.DataAvailabilityProvider.html#tymethod.next +[builder]: https://docs.rs/kona-derive/latest/kona_derive/struct.PipelineBuilder.html +[alloy]: https://github.com/alloy-rs/alloy +[kda]: https://crates.io/crates/kona-derive-alloy +[chain-provider]: https://docs.rs/kona-derive/latest/kona_derive/trait.ChainProvider.html +[l2-chain-provider]: https://docs.rs/kona-derive/latest/kona_derive/trait.L2ChainProvider.html +[dap]: https://docs.rs/kona-derive/latest/kona_derive/trait.DataAvailabilityProvider.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/derive/signaling.mdx b/docs/public-docs/rust/kona/sdk/protocol/derive/signaling.mdx new file mode 100644 index 00000000000..94c4b463748 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/derive/signaling.mdx @@ -0,0 +1,156 @@ +--- +title: "Signals" +--- + +Understanding signals first require a more in-depth review of the result +returned by stepping on the derivation pipeline. + + +## The [`StepResult`][step-result] + +As briefly outlined in the [intro](./intro.mdx), stepping on the derivation +pipeline returns a [`StepResult`][step-result]. Step results provide a +an extensible way for pipeline stages to signal different results to the +pipeline driver. The variants of [`StepResult`][step-result] and what they +signal include the following. + +- `StepResult::PreparedAttributes` - signals that payload attributes are + ready to be consumed by the pipeline driver. +- `StepResult::AdvancedOrigin` - signals that the pipeline has derived all + payload attributes for the given L1 block, and the origin of the pipeline + was advanced to the next canonical L1 block. +- `StepResult::OriginAdvanceErr(_)` - The driver failed to advance the + origin of pipeline. +- `StepResult::StepFailed(_)` - The step failed. + +No action is needed when the prepared attributes step result is received. +The pipeline driver may chose to consume the payload attributes how it +wishes. Likewise, `StepResult::AdvancedOrigin` simply notifies the driver +that the pipeline advanced its origin - the driver may continue stepping +on the pipeline. Now, it becomes more involved with the remaining two +variants of [`StepResult`][step-result]. + +When either `StepResult::OriginAdvanceErr(_)` or `StepResult::StepFailed(_)` +are received, the pipeline driver needs to introspect the error within these +variants. Depending on the [`PipelineErrorKind`][error-kind], the driver may +need to send a "signal" down through the pipeline. + +The next section goes over pipeline signals by looking at the variants of +the [`PipelineErrorKind`][error-kind] and the driver's response. + + +## [`PipelineErrorKind`][error-kind] + +There are three variants of the [`PipelineErrorKind`][error-kind], each +groups the inner error based on severity (or how they should be handled). + +- `PipelineErrorKind::Temporary` - This is an error that's expected, and + is temporary. For example, not all channel data has been posted to L1 + so the pipeline doesn't have enough data yet to continue deriving + payload attributes. +- `PipelineErrorKind::Critical` - This is an unexpected error that breaks + the derivation pipeline. It should cause the driver to error since this + is behavior that is breaking the derivation of payload attributes. +- `PipelineErrorKind::Reset` - When this is received, it effectively + requests that the driver perform some action on the pipeline. Kona + uses message passing so the driver can send a [`Signal`][signal] down + the pipeline with whatever action that needs to be performed. By + allowing both the driver and individual pipeline stages to define their + own behaviour around signals, they become very extensible. More on this + in [a later section](#extending-the-signal-type). + + +## The [`Signal`][signal] Type + +Continuing from the [`PipelineErrorKind`][error-kind], when the driver +receives a `PipelineErrorKind::Reset`, it needs to send a signal down +through the pipeline. + +Prior to the Holocene hardfork, the pipeline only needed to be reset +when the reset pipeline error was received. Holocene activation rules +changed this to require Holocene-specific activation logic internal to +the pipeline stages. The way kona's driver handles this activation is +by sending a new `ActivationSignal` if the `PipelineErrorKind::Reset` +type is a `ResetError::HoloceneActivation`. Otherwise, it will send the +`ResetSignal`. + +The last of the three [`Signal`][signal] variants is the `FlushChannel` +signal. Similar to `ActivationSignal`, the flush channel signal is logic +introduced post-Holocene. When the driver fails to execute payload +attributes and Holocene is active, a `FlushChannel` signal needs to +forwards invalidate the associated batch and channel, and the block +is replaced with a deposit-only block. + + +## Extending the Signal Type + +To extend the [`Signal`][signal] type, all that is needed is to introduce +a new variant to the [`Signal`][signal] enum. + +Once the variant is added, the segments where signals are handled need to +be updated. Anywhere the [`SignalReceiver`][receiver] trait is +implemented, handling needs to be updated for the new signal variant. Most +notably, this is on the top-level [`DerivationPipeline`][dp] type, as well +as all [the pipeline stages][stages]. + +#### An Example + +Let's create a new [`Signal`][signal] variant that updates the `RollupConfig` +in the [`IndexedTraversal` or `PollingTraversal`][traversal] stage. Let's call it `SetConfig`. +The [`signal`][signal] type would look like the following with this new +variant. + +```rust +/// A signal to send to the pipeline. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[allow(clippy::large_enum_variant)] +pub enum Signal { + /// Reset the pipeline. + Reset(ResetSignal), + /// Hardfork Activation. + Activation(ActivationSignal), + /// Flush the currently active channel. + FlushChannel, + /// Updates the rollup config in the IndexedTraversal or PollingTraversal stage. + UpdateConfig(ConfigUpdateSignal), +} + +/// A signal that updates the `RollupConfig`. +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] +pub struct ConfigUpdateSignal(Arc); +``` + +Next, all handling of the [`Signal`][signal] type needs to be updated for +the new `UpdateConfig` variant. For the sake of this example, we'll just +focus on updating the [`IndexedTraversal` or `PollingTraversal`][traversal] stage. + +```rust +#[async_trait] +impl SignalReceiver for IndexedTraversal { + async fn signal(&mut self, signal: Signal) -> PipelineResult<()> { + match signal { + Signal::Reset(ResetSignal { l1_origin, system_config, .. }) | + Signal::Activation(ActivationSignal { l1_origin, system_config, .. }) => { + self.block = Some(l1_origin); + self.done = false; + self.system_config = system_config.expect("System config must be provided."); + } + Signal::UpdateConfig(inner) => { + self.rollup_config = Arc::clone(&inner.0); + } + _ => {} + } + + Ok(()) + } +} +``` + + +[traversal]: https://docs.rs/kona-derive/latest/kona_derive/struct.IndexedTraversal.html +[dp]: https://docs.rs/kona-derive/latest/kona_derive/struct.DerivationPipeline.html +[stages]: https://docs.rs/kona-derive/latest/kona_derive/index.html +[receiver]: https://docs.rs/kona-derive/latest/kona_derive/trait.SignalReceiver.html +[signal]: https://docs.rs/kona-derive/latest/kona_derive/enum.Signal.html +[error-kind]: https://docs.rs/kona-derive/latest/kona_derive/enum.PipelineErrorKind.html +[step-result]: https://docs.rs/kona-derive/latest/kona_derive/enum.StepResult.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/derive/stages.mdx b/docs/public-docs/rust/kona/sdk/protocol/derive/stages.mdx new file mode 100644 index 00000000000..74f46ad96a8 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/derive/stages.mdx @@ -0,0 +1,113 @@ +--- +title: "Swapping out a Stage" +--- + +In the [introduction to the derivation pipeline][intro], the derivation pipeline +is broken down to demonstrate the composition of stages, forming the transformation +function from L1 data into L2 payload attributes. + +What makes kona's derivation pipeline extensible is that stages are composed using +trait-abstraction. That is, each successive stage composes the previous stage as +a generic. As such as long as a stage satisfies two rules, it can be swapped into +the pipeline seamlessly. +1. The stage implements the trait required by the next stage. +2. The stage uses the same trait for the previous stage as the + current stage to be swapped out. + +Below provides a concrete example, swapping out the `L1Retrieval` stage. + +## Example + +In the current, post-Holocene hardfork [`DerivationPipeline`][dp], the bottom three +stages of the pipeline are as follows (from top down). + +- [`FrameQueue`][frame-queue] +- [`L1Retrieval`][retrieval] +- [`IndexedTraversal` or `PollingTraversal`][traversal] + +In this set of stages, the [`IndexedTraversal` or `PollingTraversal`][traversal] stage sits at the bottom. +It implements the [`L1Retrieval`][retrieval] trait called the +[`L1RetrievalProvider`][retrieval-provider]. This provides generic methods that +allow the [`L1Retrieval`][retrieval] stage to call those methods on the generic +previous stage that implements this provider trait. + +As we go up a level, the same trait abstraction occurs. The [`L1Retrieval`][retrieval] +stage implements the provider trait that the [`FrameQueue`][frame-queue] stage requires. +This trait is the [`FrameQueueProvider`][frame-queue-provider]. + +Now that we understand the trait abstractions, let's swap out the +[`L1Retrieval`][retrieval] stage for a custom `DapRetrieval` stage. + +```rust +// ... +// imports +// ... + +// We use the same "L1RetrievalProvider" trait here +// in order to seamlessly use the `IndexedTraversal` or `PollingTraversal` + +/// DapRetrieval stage +#[derive(Debug)] +pub struct DapRetrieval

+where + P: L1RetrievalProvider + OriginAdvancer + OriginProvider + SignalReceiver, +{ + /// The previous stage in the pipeline. + pub prev: P, + provider: YourDataAvailabilityProvider, + data: Option, +} + +#[async_trait] +impl

FrameQueueProvider for DapRetrieval

+where + P: L1RetrievalProvider + OriginAdvancer + OriginProvider + SignalReceiver + Send, +{ + type Item = Bytes; + + async fn next_data(&mut self) -> PipelineResult { + if self.data.is_none() { + let next = self + .prev + .next_l1_block() + .await? // SAFETY: This question mark bubbles up the Eof error. + .ok_or(PipelineError::MissingL1Data.temp())?; + self.data = Some(self.provider.get_data(&next).await?); + } + + match self.data.as_mut().expect("Cannot be None").next().await { + Ok(data) => Ok(data), + Err(e) => { + if let PipelineErrorKind::Temporary(PipelineError::Eof) = e { + self.data = None; + } + Err(e) + } + } + } +} + +// ... +// impl OriginAdvancer for DapRetrieval +// impl OriginProvider for DapRetrieval +// impl SignalReceiver for DapRetrieval +// .. +``` + +Notice, the `L1RetrievalProvider` is used as a trait bound so the +[`IndexedTraversal` or `PollingTraversal`][traversal] stage can be used seamlessly as the "prev" stage in the pipeline. +Concretely, an instantiation of the `DapRetrieval` stage could be the following. + +``` +DapRetrieval> +``` + + +[intro]: ./intro.mdx +[dp]: https://docs.rs/kona-derive/latest/kona_derive/struct.DerivationPipeline.html +[retrieval-provider]: https://docs.rs/kona-derive/latest/kona_derive/trait.L1RetrievalProvider.html +[frame-queue-provider]: https://docs.rs/kona-derive/latest/kona_derive/trait.FrameQueueProvider.html + +[frame-queue]: https://docs.rs/kona-derive/latest/kona_derive/struct.FrameQueue.html +[retrieval]: https://docs.rs/kona-derive/latest/kona_derive/struct.L1Retrieval.html +[traversal]: https://docs.rs/kona-derive/latest/kona_derive/struct.IndexedTraversal.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/genesis/intro.mdx b/docs/public-docs/rust/kona/sdk/protocol/genesis/intro.mdx new file mode 100644 index 00000000000..dc978928ee4 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/genesis/intro.mdx @@ -0,0 +1,32 @@ +--- +title: "Genesis" +--- + +The genesis crate contains types related to chain genesis. + +This section contains in-depth sections on building with [`kona-genesis`][genesis] crate types. + +- [The Rollup Config](./rollup-config.mdx) +- [The System Config](./system-config.mdx) + + +[op-stack]: https://github.com/ethereum-optimism/optimism +[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program +[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon +[cannon-rs]: https://github.com/op-rs/cannon-rs +[asterisc]: https://github.com/ethereum-optimism/asterisc +[fp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html +[fpp-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#fault-proof-program +[preimage-specs]: https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle +[cannon-specs]: https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html#cannon-fault-proof-virtual-machine +[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction +[op-succinct]: https://github.com/succinctlabs/op-succinct +[revm]: https://github.com/bluealloy/revm + +[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona +[issues]: https://github.com/ethereum-optimism/optimism/issues +[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new +[contributing]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md + +[op-labs]: https://github.com/ethereum-optimism +[bad-boi-labs]: https://github.com/BadBoiLabs diff --git a/docs/public-docs/rust/kona/sdk/protocol/genesis/rollup-config.mdx b/docs/public-docs/rust/kona/sdk/protocol/genesis/rollup-config.mdx new file mode 100644 index 00000000000..620a2f836cc --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/genesis/rollup-config.mdx @@ -0,0 +1,24 @@ +--- +title: "Rollup Configs" +--- + +Rollup configurations are a consensus construct used to configure an Optimism Consensus client. +When an OP Stack chain is deployed into production or consensus nodes are configured to sync the chain, +certain consensus parameters can be configured. These parameters are defined in the +[OP Stack specs][specs]. + +Consensus parameters are consumed by OP Stack software through the `RollupConfig` type defined in the +[`kona-genesis`][genesis] crate. + +## `RollupConfig` Type + +The [`RollupConfig`][rc] type is defined in [`kona-genesis`][genesis]. + +Rollup configs can be loaded for a given chain id using [`kona-registry`][registry]. +The `ROLLUP_CONFIG` mapping in the `kona-registry` provides a mapping from chain ids +to rollup config. + +[specs]: https://specs.optimism.io/ +[genesis]: https://docs.rs/kona-genesis/latest/kona_genesis/index.html +[rc]: https://docs.rs/kona-genesis/latest/kona_genesis/struct.RollupConfig.html +[registry]: https://docs.rs/kona-registry/latest/kona_registry/index.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/genesis/system-config.mdx b/docs/public-docs/rust/kona/sdk/protocol/genesis/system-config.mdx new file mode 100644 index 00000000000..00cfa17799c --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/genesis/system-config.mdx @@ -0,0 +1,36 @@ +--- +title: "System Config" +--- + +The system configuration is a set of configurable chain parameters +defined in a contract on L1. These parameters can be changed through +the system config contract, emitting events that are picked up by +the [rollup node derivation process][derivation]. To dive deeper +into the System Config, visit the +[OP Stack Specifications][specs]. + +## `SystemConfig` Type + +The [`SystemConfig`][system-config] type is defined in +[`kona-genesis`][genesis]. + +Parameters defined in the [`SystemConfig`][system-config] are expected to be +updated through L1 receipts, using the [`update_with_receipts`][update] method. + +## Holocene Updates + +The [Holocene Hardfork][holocene] introduced an update to the +[`SystemConfig`][system-config] type, adding EIP-1559 parameters to the config. + +The [`SystemConfig`][system-config] type in [`kona-genesis`][genesis] provides +a method called [`eip_1559_params`][eip] that returns the EIP-1559 parameters +encoded as a [`B64`][b64]. + + +[specs]: https://specs.optimism.io/ +[genesis]: https://docs.rs/kona-genesis/latest/kona_genesis/index.html +[system-config]: https://docs.rs/kona-genesis/latest/kona_genesis/struct.SystemConfig.html +[update]: https://docs.rs/kona-genesis/latest/kona_genesis/struct.SystemConfig.html#method.update_with_receipts +[holocene]: https://specs.optimism.io/protocol/holocene/overview.html +[eip]: https://docs.rs/kona-genesis/latest/kona_genesis/struct.SystemConfig.html#method.eip_1559_params +[b64]: https://docs.rs/kona-registry/latest/kona_registry/index.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/hardforks.mdx b/docs/public-docs/rust/kona/sdk/protocol/hardforks.mdx new file mode 100644 index 00000000000..d3e35dd87c9 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/hardforks.mdx @@ -0,0 +1,43 @@ +--- +title: "Hardforks" +--- + +Hardforks are consensus layer types of the OP Stack. + +`kona-hardforks` most directly exports the [`Hardforks`][hardforks] type that provides +the network upgrade transactions for OP Stack hardforks including the following. +- [Ecotone][ecotone] +- [Fjord][fjord] +- [Isthmus][isthmus] + +Each hardfork has its own type in `kona-hardforks` that exposes the network +upgrade transactions for that hardfork. + +For example, the [`Ecotone`][ecotone-ty] type can be used to retrieve the Ecotone +network upgrade transactions through its [`txs() -> impl Iterator`][txs] method. + +```rust +// Notice, the `Hardfork` trait must be imported in order to +// provide the `txs()` method implemented for the hardfork type. +use kona_hardforks::{Hardfork, Ecotone}; +let ecotone_upgrade_txs = Ecotone.txs(); +assert_eq!(ecotone_upgrade_txs.collect::>().len(), 6); +``` + +Conveniently, the [`Hardforks`][hardforks] type exposes each hardfork type as a field +that can be directly referenced without needing to import all the different hardforks. + +```rust +use kona_hardforks::{Hardfork, Hardforks}; +let ecotone_upgrade_txs = Hardforks::ECOTONE.txs(); +assert_eq!(ecotone_upgrade_txs.collect::>().len(), 6); +``` + +[fjord]: https://specs.optimism.io/protocol/fjord/overview.html +[ecotone]: https://specs.optimism.io/protocol/ecotone/overview.html +[isthmus]: https://specs.optimism.io/protocol/isthmus/overview.html + +[ecotone-ty]: https://docs.rs/kona-hardforks/latest/kona_hardforks/struct.Ecotone.html +[hardforks]: https://docs.rs/kona-hardforks/latest/kona_hardforks/struct.Hardforks.html + +[txs]: https://docs.rs/kona-hardforks/latest/kona_hardforks/struct.Ecotone.html#method.txs diff --git a/docs/public-docs/rust/kona/sdk/protocol/interop.mdx b/docs/public-docs/rust/kona/sdk/protocol/interop.mdx new file mode 100644 index 00000000000..a798e4cde83 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/interop.mdx @@ -0,0 +1,5 @@ +--- +title: "Interop" +--- + +`kona-interop` provides core types for the interop protocol. diff --git a/docs/public-docs/rust/kona/sdk/protocol/intro.mdx b/docs/public-docs/rust/kona/sdk/protocol/intro.mdx new file mode 100644 index 00000000000..5e1c35a8a75 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/intro.mdx @@ -0,0 +1,30 @@ +--- +title: "Kona Protocol Libraries" +--- + +The Kona monorepo contains a set of protocol crates that are designed +to be `no_std` compatible for Kona's fault proof sdk. Protocol crates +are built on [alloy][alloy] and [op-alloy][op-alloy] types. + +The following protocol crates are published to [crates.io][crates]. + +At the lowest level, `kona-genesis` and `kona-hardforks` expose +core genesis and hardfork types. + +`kona-protocol` sits just above `kona-genesis`, composing genesis types +into other core protocol types, as well as many independent protocol types. + +More recently, the `kona-interop` crate was introduced that contains types +specific to [Interop][interop]. + +`kona-registry` contains bindings to the [superchain-registry][scr]. +The registry is available in a `no_std` environment +but requires `serde` to read serialized configs at compile time. `kona-registry` uses +types defined in `kona-genesis` to deserialize the superchain registry configs at compile time. + + +[crates]: https://crates.io +[alloy]: https://github.com/alloy-rs/alloy +[op-alloy]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/op-alloy +[interop]: https://specs.optimism.io/interop/overview.html +[scr]: https://github.com/ethereum-optimism/superchain-registry diff --git a/docs/public-docs/rust/kona/sdk/protocol/protocol/batches.mdx b/docs/public-docs/rust/kona/sdk/protocol/protocol/batches.mdx new file mode 100644 index 00000000000..bc2e02e7cd4 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/protocol/batches.mdx @@ -0,0 +1,110 @@ +--- +title: "Batches" +--- + +A [Batch][batch] contains a list of transactions to be included in a specific +L2 block. Since the [Delta hardfork][delta], there are two Batch types or +variants: [`SingleBatch`][single-batch] and [`SpanBatch`][span-batch]. + +## Where Batches fit in the OP Stack + +The [Batch][batch] is the highest-level data type in the OP Stack +derivation process that comes prior to building payload attributes. +A [Batch][batch] is constructed by taking the raw data from a +[Channel][channel], decompressing it, and decoding the [Batch][batch] +from this decompressed data. + +Alternatively, when looking at the [Batch][batch] type from a batching +perspective, and not from the derivation perspective, the [Batch][batch] +type contains a list of L2 transactions and is compressed into the +[`Channel`][channel] type. In turn, the [`Channel`][channel] is split +into frames which are posted to the data availability layer through batcher +transactions. + +## Contents of a `Batch` + +A [`Batch`][batch] is either a [`SingleBatch`][single-batch] or a +[`SpanBatch`][span-batch], each with their own contents. Below, +these types are broken down in their respective sections. + +### `SingleBatch` Type + +The [`SingleBatch`][single-batch] type contains the following. + +- A [`BlockHash`][block-hash] parent hash that represents the parent L2 block. +- A `u64` epoch number that identifies the [epoch][epoch] for this batch. +- A [`BlockHash`][block-hash] epoch hash. +- The timestamp for the batch as a `u64`. +- A list of EIP-2718 encoded transactions (represented as [`Bytes`][bytes]). + +In order to validate the [`SingleBatch`][single-batch] once decoded, +the [`SingleBatch::check_batch`][check-batch-single] method should be used, +providing the rollup config, l1 blocks, l2 safe head, and inclusion block. + +### `SpanBatch` Type + +The [`SpanBatch`][span-batch] type (available since the [Delta hardfork][delta]) +comprises the data needed to build a "span" of multiple L2 blocks. It contains +the following data. + +- The parent check (the first 20 bytes of the block's parent hash). +- The l1 origin check (the first 20 bytes of the last block's l1 origin hash). +- The genesis timestamp. +- The chain id. +- A list of [`SpanBatchElement`][span-batch-element]s. These are similar to + the [`SingleBatch`][single-batch] type but don't contain the parent hash + and epoch hash for this L2 block. +- Origin bits. +- Block transaction counts. +- Span batch transactions which contain information for transactions in a span batch. + +Similar to the `SingleBatch` type discussed above, the [`SpanBatch`][span-batch] type +must be validated once decoded. For this, the [`SpanBatch::check_batch`][check-batch-span] +method is available. + +After the [Holocene hardfork][holocene] was introduced, span batch validation is greatly +simplified to be forwards-invalidating instead of backwards-invalidating, so a new +[`SpanBatch::check_batch_prefix`][check-batch-prefix] method provides a way to validate +each batch as it is loaded, in an iterative fashion. + +## Batch Encoding + +The first byte of the decompressed channel data is the +[`BatchType`][batch-type], which identifies whether the batch is a +[`SingleBatch`][single-batch] or a [`SpanBatch`][span-batch]. +From there, the respective type is decoded, and [derived][derived] +in the case of the [`SpanBatch`][span-batch]. + +The `Batch` encoding format for the [`SingleBatch`][single-batch] is +broken down [in the specs][specs]. + +## The `Batch` Type + +The [`Batch`][batch] type itself only provides two useful methods. + +- [`timestamp`][timestamp] returns the timestamp of the [`Batch`][batch] +- [`decode`][decode], constructs a new [`Batch`][batch] from the provided + raw, decompressed batch data and rollup config. + +Within each [`Batch`][batch] variant, the individual types contain +more functionality. + + +[holocene]: https://specs.optimism.io/protocol/holocene/overview.html +[check-batch-prefix]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.SpanBatch.html#method.check_batch_prefix +[check-batch-span]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.SpanBatch.html#method.check_batch +[span-batch-element]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.SpanBatchElement.html +[check-batch-single]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.SingleBatch.html#method.check_batch +[bytes]: https://docs.rs/alloy-primitives/latest/alloy_primitives/struct.Bytes.html +[block-hash]: https://docs.rs/alloy-primitives/latest/alloy_primitives/aliases/type.BlockHash.html +[epoch]: https://specs.optimism.io/glossary.html?highlight=Epoch#sequencing-epoch +[decode]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.Batch.html#method.decode +[timestamp]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.Batch.html#method.timestamp +[specs]: https://specs.optimism.io/protocol/derivation.html#batch-format +[derived]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.RawSpanBatch.html#method.derive +[batch-type]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.BatchType.html +[channel]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html +[batch]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.Batch.html +[span-batch]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.SpanBatch.html +[single-batch]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.SingleBatch.html +[delta]: https://specs.optimism.io/protocol/delta/overview.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/protocol/block-info.mdx b/docs/public-docs/rust/kona/sdk/protocol/protocol/block-info.mdx new file mode 100644 index 00000000000..3463babe7d4 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/protocol/block-info.mdx @@ -0,0 +1,12 @@ +--- +title: "BlockInfo" +--- + +The [`BlockInfo`][bi] type is straightforward, containing the block hash, +number, parent hash, and timestamp. + +The `BlockInfo` is a subset of information provided by the block header, +used for protocol operations. + + +[bi]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.BlockInfo.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/protocol/channels.mdx b/docs/public-docs/rust/kona/sdk/protocol/protocol/channels.mdx new file mode 100644 index 00000000000..79bbed9cded --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/protocol/channels.mdx @@ -0,0 +1,109 @@ +--- +title: "Channels" +--- + +Taken from the [OP Stack specs][specs], [`Channel`][channel]s are a set of +sequencer batches (for any L2 blocks) compressed together. + + +## Where Channels fit in the OP Stack + +L2 transactions are grouped into what are called [sequencer batches][seq-batch]. +In order to obtain a better compression ratio when posting these L2 transactions +to the data availability layer, [sequencer batches][seq-batch] are compressed +together into what is called a [Channel][channel]. This ultimately reduces +data availability costs. As previously noted in the [Frame][frame-docs] section, +[Channel][channel]s may not "fit" in a single batcher transaction, posting the +data to the data availability layer. In order to accommodate large +[Channel][channel]s, a tertiary [Frame][frame] data type breaks the +[Channel][channel] up into multiple [Frame][frame]s where a batcher transaction +then consists of one or multiple [Frame][frame]s. + + +## Contents of a Channel + +A [Channel][channel] is comprised of the following items. +- A [`ChannelId`][cid] which is a 16 byte long identifier for the channel. + Notice, [Frame][frame]s also contain a [`ChannelId`][cid], which is the + identical to this identifier, since frames "belong" to a given channel. +- A [`BlockInfo`][block-info] that marks the L1 block at which the channel + is "opened" at. +- The estimated size of the channel (as a `usize`) used to drop the channel + if there is a data overflow. +- A `boolean` if the channel is "closed". This indicates if the last frame + has been buffered, and added to the channel. +- A `u16` indicating the highest frame number within the channel. +- The frame number of the last frame (where `is_last` set to `true`). +- A mapping from Frame number to the [`Frame`][frame] itself. +- A [`BlockInfo`][block-info] for highest L1 inclusion block that a frame + was included in. + + +## Channel Encoding + +[`Channel`][channel] encoding is even more straightforward than that of a +[`Frame`][frame]. Simply, a [`Channel`][channel] is the concatenated list +of encoded [`Frame`][frame]s. + +Since each [`Frame`][frame] contains the [`ChannelId`][cid] that corresponds +to the given [`Channel`][channel], constructing a [`Channel`][channel] is as +simple as calling the [`Channel::add_frame`][add-frame] method for each of +its [`Frame`][frame]s. + +Once the [`Channel`][channel] has ingested all of it's [`Frame`][frame]s, +it will be marked as "ready", with the [`Channel::is_ready`][is-ready] +method returning `true`. + + +## The `Channel` Type + +As discussed [above](#-channel-encoding), the [`Channel`][channel] type is +expected to be populated with [`Frame`][frame]s using its +[`Channel::add_frame`][add-frame] method. Below we demonstrate constructing +a minimal [`Channel`][channel] using a few frames. + +```rust +use kona_protocol::{Channel, Frame}; + +// Construct a channel at the given L1 block. +let id = [0xee; 16]; +let block = BlockInfo::default(); +let mut channel = Channel::new(id, block); + +// The channel will consist of 3 frames. +let frame_0 = Frame { id: [0xee; 16], number: 0, ..Default::default() }; +let frame_1 = Frame { id: [0xee; 16], number: 1, ..Default::default() }; +let frame_2 = Frame { id: [0xee; 16], number: 2, is_last: true, ..Default::default() }; + +// Add the frames to the channel. +channel.add_frame(frame_0); +channel.add_frame(frame_1); +channel.add_frame(frame_2); + +// Since the last frame was ingested, +// the channel should be ready. +assert!(channel.is_ready()); +``` + +There are a few rules when adding a [`Frame`][frame] to a [`Channel`][channel]. +- The [`Frame`][frame]'s id must be the same [`ChannelId`][cid] as the [`Channel`][channel]s. +- [`Frame`][frame]s cannot be added once a [`Channel`][channel] is closed. +- [`Frame`][frame]s within a [`Channel`][channel] must have distinct numbers. + +Notice, [`Frame`][frame]s can be added out-of-order so long as the [`Channel`][channel] is +still open, and the frame hasn't already been added. + + +[is-ready]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html#method.is_ready +[add-frame]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html#method.add_frame + +[block-info]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.BlockInfo.html + +[frame-docs]: ./frames.mdx +[specs]: https://specs.optimism.io/protocol/derivation.html#batch-submission-wire-format +[seq-batch]: https://specs.optimism.io/glossary.html#sequencer-batch + + +[channel]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html +[cid]: https://docs.rs/kona-protocol/latest/kona_protocol/type.ChannelId.html +[frame]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/protocol/frames.mdx b/docs/public-docs/rust/kona/sdk/protocol/protocol/frames.mdx new file mode 100644 index 00000000000..7f1d22e1a2b --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/protocol/frames.mdx @@ -0,0 +1,85 @@ +--- +title: "Frames" +--- + +[`Frame`][frame]s are the lowest level data format in the OP Stack protocol. + + +## Where Frames fit in the OP Stack + +Transactions posted to the data availability layer of the rollup +contain one or multiple [Frame][frame]s. Frames are chunks of raw data that +belong to a given [Channel][channel], the next, higher up data format in the +OP Stack protocol. Importantly, a given transaction can contain +a variety of frames from _different_ channels, allowing maximum flexibility +when breaking up channels into batcher transactions. + + +## Contents of a Frame + +A [Frame][frame] is comprised of the following items. +- A [`ChannelId`][cid] which is a 16 byte long identifier for the channel that + the given frame belongs to. +- A `number` that identifies the index of the frame within the channel. Frames + are 0-indexed and are bound to `u16` size limit. +- `data` contains the raw data within the frame. +- `is_last` marks if the frame is the last within the channel. + + +## Frame Encoding + +When frames are posted through a batcher transaction, they are encoded as a +contiguous list with a single byte prefix denoting the derivation version. +The encoding can be represented as the following concatenated bytes. + +``` +encoded = DERIVATION_VERSION_0 ++ encoded_frame_0 ++ encoded_frame_1 ++ .. +``` + +Where `DERIVATION_VERSION_0` is a single byte (`0x00`) indicating the derivation +version including how the frames are encoded. Currently, the only supported +derivation version is `0`. + + +`encoded_frame_0`, `encoded_frame_1`, and so on, are all [`Frame`][frame]s encoded +as raw bytes. A single encoded [`Frame`][frame] can be represented by the following +concatenation of it's fields. + +``` +encoded_frame = channel_id ++ frame_number ++ frame_data_length ++ frame_data ++ is_last +``` + +Where `++` represents concatenation. The frame's fields map to it's encoding. +- `channel_id` is the 16 byte long [`Frame::id`][id]. +- `frame_number` is the 2 byte long (or `u16`) [`Frame::number`][number]. +- `frame_data_length` and `frame_data` provide the necessary details to decode + the [`Frame::data`][data], where `frame_data_length` is 4 bytes long (or `u32`). +- `is_last` is a single byte [`Frame::is_last`][is_last]. + + +## kona's `Frame` Type + +[`kona-protocol`][protocol] provides the [`Frame`][frame] type with a few useful +methods. [`Frame`][frame]s can be encoded and decoded using the [`Frame::encode`][encode] +and [`Frame::decode`][decode] methods. Given the raw batcher transaction data or blob data +containing the concatenated derivation version and contiguous list of encoded frames, +the [`Frame::parse_frame`][parse_frame] and [`Frame::parse_frames`][parse_frames] methods +provide ways to decode single and multiple frames, respectively. + + +[encode]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#method.encode +[decode]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#method.decode + +[parse_frame]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#method.parse_frame +[parse_frames]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#method.parse_frames + +[protocol]: https://crates.io/crates/kona-protocol + +[id]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#structfield.id +[number]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#structfield.number +[data]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#structfield.data +[is_last]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#structfield.is_last + +[cid]: https://docs.rs/kona-protocol/latest/kona_protocol/type.ChannelId.html +[channel]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html +[frame]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html diff --git a/docs/public-docs/rust/kona/sdk/protocol/protocol/intro.mdx b/docs/public-docs/rust/kona/sdk/protocol/protocol/intro.mdx new file mode 100644 index 00000000000..2ed48fd0df4 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/protocol/intro.mdx @@ -0,0 +1,64 @@ +--- +title: "Protocol" +--- + +The [`kona-protocol`][protocol] crate contains types, constants, and methods +specific to Optimism derivation and batch-submission. + +[`kona-protocol`][protocol] supports `no_std`. + +## Background + +Protocol types are primarily used for L2 chain derivation. This section will +break down L2 chain derivation as it relates to types defined in +`kona-protocol` - that is, from the raw L2 chain data posted to L1, to the +[`Batch`][batch] type. And since the [`Batch`][batch] type naively breaks up +into the payload attributes, once executed, it becomes the canonical L2 block! +Note though, this provides an incredibly simplified introduction. It is advised +to reference [the specs][s] for the most up-to-date information regarding +derivation. + +The L2 chain is derived from data posted to the L1 chain - either as calldata +or blob data. Data is iteratively pulled from each L1 block and translated +into the first type defined by `kona-protocol`: the [`Frame`][frame] type. + +[`Frame`][frame]s are [parsed][parsed] from the raw data. Each [`Frame`][frame] +is a part of a [`Channel`][channel], the next type one level up in deriving +L2 blocks. [`Channel`][channel]s have IDs that frames reference. [`Frame`][frame]s +are [added][added] iteratively to the [`Channel`][channel]. Once a +[`Channel`][channel] [is ready][ready], it can be used to read a [`Batch`][batch]. + +Since a [`Channel`][channel] stitches together frames, it contains the raw frame +data. In order to turn this [`Channel`][channel] data into a [`Batch`][batch], +it needs to be decompressed using the respective (de)compression algorithm +(see [the channel specs][channel-specs] for more detail on this). Once +decompressed, the raw data can be [decoded][decoded] into the [`Batch`][batch] +type. + + +## Sections + +#### Core Derivation Types (discussed above) + +- [Frames](./frames.mdx) +- [Channels](./channels.mdx) +- [Batches](./batches.mdx) + +#### Other Critical Protocol Types + +- [BlockInfo](./block-info.mdx) +- [L2BlockInfo](./l2-block-info.mdx) + + +[decoded]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.Batch.html#method.decode +[batch]: https://docs.rs/kona-protocol/latest/kona_protocol/enum.Batch.html +[ready]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html#method.is_ready +[added]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html#method.add_frame +[channel]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Channel.html +[frame]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html +[parsed]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.Frame.html#method.parse_frames + +[protocol]: https://crates.io/crates/kona-protocol +[s]: https://specs.optimism.io/protocol/derivation.html#overview +[lcd]: https://specs.optimism.io/protocol/derivation.html#overview +[channel-specs]: https://specs.optimism.io/protocol/derivation.html#channel-format diff --git a/docs/public-docs/rust/kona/sdk/protocol/protocol/l2-block-info.mdx b/docs/public-docs/rust/kona/sdk/protocol/protocol/l2-block-info.mdx new file mode 100644 index 00000000000..427b9d47a09 --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/protocol/l2-block-info.mdx @@ -0,0 +1,18 @@ +--- +title: "L2BlockInfo" +--- + +The [`L2BlockInfo`][lbi] extends the [`BlockInfo`][bi] type for the canonical +L2 chain. It contains the "L1 origin" which is a set of block info for the L1 +block that this L2 block "originated". + +Similarly to the [`BlockInfo`][bi] type, `L2BlockInfo` is a subset of information +provided by a block header, used for protocol operations. + +[`L2BlockInfo`][lbi] provides a [`from_block_and_genesis`][fbg] method to +construct the [`L2BlockInfo`][lbi] from a block and `ChainGenesis`. + + +[bi]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.BlockInfo.html +[lbi]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.L2BlockInfo.html +[fbg]: https://docs.rs/kona-protocol/latest/kona_protocol/struct.L2BlockInfo.html#method.from_block_and_genesis diff --git a/docs/public-docs/rust/kona/sdk/protocol/registry.mdx b/docs/public-docs/rust/kona/sdk/protocol/registry.mdx new file mode 100644 index 00000000000..e54c17f2feb --- /dev/null +++ b/docs/public-docs/rust/kona/sdk/protocol/registry.mdx @@ -0,0 +1,69 @@ +--- +title: "Registry" +--- + +[`kona-registry`][sc] is a `no_std` crate that exports rust type definitions for chains +in the [`superchain-registry`][osr]. These are lazily evaluated statics that provide +`ChainConfig`s, `RollupConfig`s, and `Chain` objects for all chains with static definitions +in the [`superchain-registry`][osr]. + +Since it reads static files to read configurations for various chains into instantiated +objects, the [`kona-registry`][sc] crate requires [`serde`][serde] as a dependency. + +There are three core statics exposed by the [`kona-registry`][sc]. +- `CHAINS`: A list of chain objects containing the superchain metadata for this chain. +- `OPCHAINS`: A map from chain id to `ChainConfig`. +- `ROLLUP_CONFIGS`: A map from chain id to `RollupConfig`. + +[`kona-registry`][sc] exports the _complete_ list of chains within the superchain, as well as each +chain's `RollupConfig`s and `ChainConfig`s. + +### Usage + +Add the following to your `Cargo.toml`. + +```toml +[dependencies] +kona-registry = "0.1.0" +``` + +To make `kona-registry` `no_std`, toggle `default-features` off like so. + +```toml +[dependencies] +kona-registry = { version = "0.1.0", default-features = false } +``` + +Below demonstrates getting the `RollupConfig` for OP Mainnet (Chain ID `10`). + +```rust +use kona_registry::ROLLUP_CONFIGS; + +let op_chain_id = 10; +let op_rollup_config = ROLLUP_CONFIGS.get(&op_chain_id); +println!("OP Mainnet Rollup Config: {:?}", op_rollup_config); +``` + +A mapping from chain id to `ChainConfig` is also available. + +```rust +use kona_registry::OPCHAINS; + +let op_chain_id = 10; +let op_chain_config = OPCHAINS.get(&op_chain_id); +println!("OP Mainnet Chain Config: {:?}", op_chain_config); +``` + +[serde]: https://crates.io/crates/serde +[alloy]: https://github.com/alloy-rs/alloy +[op-alloy]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/op-alloy +[op-superchain]: https://docs.optimism.io/stack/explainer +[osr]: https://github.com/ethereum-optimism/superchain-registry + +[s]: #TODO +[sc]: https://crates.io/crates/kona-registry +[g]: https://crates.io/crates/kona-genesis + +[chains]: https://docs.rs/kona-registry/latest/kona_registry/struct.CHAINS.html +[opchains]: https://docs.rs/kona-registry/latest/kona_registry/struct.OPCHAINS.html +[rollups]: https://docs.rs/kona-registry/latest/kona_registry/struct.ROLLUP_CONFIGS.html diff --git a/docs/public-docs/rust/op-alloy/building/consensus.mdx b/docs/public-docs/rust/op-alloy/building/consensus.mdx new file mode 100644 index 00000000000..7580d4f03a8 --- /dev/null +++ b/docs/public-docs/rust/op-alloy/building/consensus.mdx @@ -0,0 +1,68 @@ +--- +title: "Consensus" +--- + +The `op-alloy-consensus` crate provides an Optimism consensus interface. +It contains constants, types, and functions for implementing Optimism EL +consensus and communication. This includes an extended `OpTxEnvelope` type +with [deposit transactions](https://specs.optimism.io/protocol/deposits.html), and receipts containing OP Stack +specific fields (`deposit_nonce` + `deposit_receipt_version`). + +In general a type belongs in this crate if it exists in the +`alloy-consensus` crate, but was modified from the base Ethereum protocol +in the OP Stack. For consensus types that are not modified by the OP Stack, +the `alloy-consensus` types should be used instead. + + +## Block + +[`op-alloy-consensus`](https://crates.io/crates/op-alloy-consensus) exports an Optimism block type, [`OpBlock`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/type.OpBlock.html). + +This type simply re-uses the `alloy-consensus` block type, with `OpTxEnvelope` +as the type of transactions in the block. + + +## Transactions + +Optimism extends the Ethereum [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) transaction envelope to include a +deposit variant. + +### [`OpTxEnvelope`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/transaction/enum.OpTxEnvelope.html) + +The [`OpTxEnvelope`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/transaction/enum.OpTxEnvelope.html) type is based on [Alloy](https://github.com/alloy-rs/alloy)'s +[`TxEnvelope`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/transaction/enum.OpTxType.html) type. + +Optimism modifies the `TxEnvelope` to the following. +- Legacy +- EIP-2930 +- EIP-1559 +- EIP-7702 +- Deposit + +Deposit is a custom transaction type that is either an L1 attributes +deposit transaction or a user-submitted deposit transaction. Read more +about deposit transactions in [the specs](https://specs.optimism.io). + +### Transaction Types ([`OpTxType`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/transaction/enum.OpTxType.html)) + +The [`OpTxType`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/transaction/enum.OpTxType.html) enumerates the transaction types using their byte identifier, +represents as a `u8` in rust. + + +## Receipt Types + +Just like [`op-alloy-consensus`](https://crates.io/crates/op-alloy-consensus) defines transaction types, +it also defines associated receipt types. + +[`OpReceiptEnvelope`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/enum.OpReceiptEnvelope.html) defines an [Eip-2718](https://eips.ethereum.org/EIPS/eip-2718) receipt envelope type +modified for the OP Stack. It contains the following variants - mapping +directly to the `OpTxEnvelope` variants defined above. + +- Legacy +- EIP-2930 +- EIP-1559 +- EIP-7702 +- Deposit + +There is also an [`OpDepositReceipt`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/struct.OpDepositReceipt.html) type, extending the alloy receipt +type with a deposit nonce and deposit receipt version. diff --git a/docs/public-docs/rust/op-alloy/building/engine.mdx b/docs/public-docs/rust/op-alloy/building/engine.mdx new file mode 100644 index 00000000000..a2cb44778ff --- /dev/null +++ b/docs/public-docs/rust/op-alloy/building/engine.mdx @@ -0,0 +1,15 @@ +--- +title: "RPC Engine Types" +--- + +The [`op-alloy-rpc-types-engine`](https://docs.rs/op-alloy-rpc-types-engine/latest/op_alloy_rpc_types_engine/) crate provides Optimism types for interfacing +with the Engine API in the OP Stack. + +Optimism defines a custom payload attributes type called [`OpPayloadAttributes`](https://docs.rs/op-alloy-rpc-types-engine/latest/op_alloy_rpc_types_engine/struct.OpPayloadAttributes.html). +`OpPayloadAttributes` extends alloy's [`PayloadAttributes`](https://docs.rs/alloy-rpc-types-engine/latest/alloy_rpc_types_engine/payload/struct.PayloadAttributes.html) with a few fields: transactions, +a flag for enabling the tx pool, the gas limit, and EIP 1559 parameters. + +Optimism also returns a custom type for the `engine_getPayload` request for both V3 and +V4 payload envelopes. These are the [`OpExecutionPayloadEnvelopeV3`](https://docs.rs/op-alloy-rpc-types-engine/latest/op_alloy_rpc_types_engine/payload/v3/struct.OpExecutionPayloadEnvelopeV3.html) and +[`OpExecutionPayloadEnvelopeV4`](https://docs.rs/op-alloy-rpc-types-engine/latest/op_alloy_rpc_types_engine/payload/v4/struct.OpExecutionPayloadEnvelopeV4.html) types, which both wrap payload envelope types +from [`alloy-rpc-types-engine`](https://crates.io/crates/alloy-rpc-types-engine). diff --git a/docs/public-docs/rust/op-alloy/building/index.mdx b/docs/public-docs/rust/op-alloy/building/index.mdx new file mode 100644 index 00000000000..8aafd36234b --- /dev/null +++ b/docs/public-docs/rust/op-alloy/building/index.mdx @@ -0,0 +1,12 @@ +--- +title: "Building" +--- + +This section offers in-depth documentation into the various `op-alloy` crates. +Some of the primary crates and their types are listed below. + +- [`op-alloy-consensus`](https://crates.io/crates/op-alloy-consensus) provides [`OpBlock`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/type.OpBlock.html), + [`OpTxEnvelope`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/transaction/enum.OpTxEnvelope.html), [`OpReceiptEnvelope`](https://docs.rs/op-alloy-consensus/latest/op_alloy_consensus/enum.OpReceiptEnvelope.html), + and more. +- [`op-alloy-rpc-types-engine`](https://crates.io/crates/op-alloy-rpc-types-engine) provides the + [`OpPayloadAttributes`](https://docs.rs/op-alloy-rpc-types-engine/latest/op_alloy_rpc_types_engine/struct.OpPayloadAttributes.html). diff --git a/docs/public-docs/rust/op-alloy/glossary.mdx b/docs/public-docs/rust/op-alloy/glossary.mdx new file mode 100644 index 00000000000..bf2e8cc479e --- /dev/null +++ b/docs/public-docs/rust/op-alloy/glossary.mdx @@ -0,0 +1,5 @@ +--- +title: "Glossary" +--- + +*This document contains definitions for terms used throughout the op-alloy book.* diff --git a/docs/public-docs/rust/op-alloy/intro.mdx b/docs/public-docs/rust/op-alloy/intro.mdx new file mode 100644 index 00000000000..fdbd850796a --- /dev/null +++ b/docs/public-docs/rust/op-alloy/intro.mdx @@ -0,0 +1,38 @@ +--- +title: "op-alloy" +--- + +Welcome to the hands-on guide for getting started with `op-alloy`! + +`op-alloy` connects applications to the OP Stack, leveraging high +performance types, traits, and middleware from [Alloy](https://github.com/alloy-rs/alloy). + +> Development Status +> +> `op-alloy` is in active development, and is not yet ready for use in production. +> During development, this book will evolve quickly and may contain inaccuracies. +> +> Please [open an issue](https://github.com/ethereum-optimism/optimism/issues/new) if you find any errors or have any suggestions for +> improvements, and also feel free to [contribute](https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona/CONTRIBUTING.md) to the project! + +## Sections + +### [Getting Started](/rust/op-alloy/starting) + +To get started with op-alloy, add its crates as a dependency and take your first steps. + +### [Building with op-alloy](/rust/op-alloy/building) + +Walk through types and functionality available in different `op-alloy` crates. + +### [Contributing](https://github.com/ethereum-optimism/optimism/tree/develop/rust/op-alloy/CONTRIBUTING.md) + +Contributors are welcome! It is built and maintained by Alloy contributors, +members of [OP Labs](https://github.com/ethereum-optimism), and the broader open source community. + +`op-alloy` follows and expands the OP Stack standards set in the [specs](https://specs.optimism.io). + +### Licensing + +`op-alloy` is licensed under the combined Apache 2.0 and MIT License, along +with a SNAPPY license for snappy encoding use. diff --git a/docs/public-docs/rust/op-alloy/starting.mdx b/docs/public-docs/rust/op-alloy/starting.mdx new file mode 100644 index 00000000000..c3ace0f3040 --- /dev/null +++ b/docs/public-docs/rust/op-alloy/starting.mdx @@ -0,0 +1,82 @@ +--- +title: "Installation" +--- + +[op-alloy](https://github.com/ethereum-optimism/optimism/tree/develop/rust/op-alloy) consists of a number of crates that provide a range of functionality +essential for interfacing with any OP Stack chain. + +The most succinct way to work with `op-alloy` is to add the [`op-alloy`](https://crates.io/crates/op-alloy) crate +with the `full` feature flag from the command-line using Cargo. + +```txt +cargo add op-alloy --features full +``` + +Alternatively, you can add the following to your `Cargo.toml` file. + +```txt +op-alloy = { version = "0.5", features = ["full"] } +``` + +For more fine-grained control over the features you wish to include, you can add the individual +crates to your `Cargo.toml` file, or use the `op-alloy` crate with the features you need. + +After `op-alloy` is added as a dependency, crates re-exported by `op-alloy` are now available. + +```rust +use op_alloy::{ + genesis::{RollupConfig, SystemConfig}, + consensus::OpBlock, + protocol::BlockInfo, + network::Optimism, + provider::ext::engine::OpEngineApi, + rpc_types::OpTransactionReceipt, + rpc_jsonrpsee::traits::RollupNode, + rpc_types_engine::OpAttributesWithParent, +}; +``` + +## Features + +The [`op-alloy`](https://crates.io/crates/op-alloy) defines many [feature flags](https://docs.rs/crate/op-alloy/latest/features) including the following. + +Default +- `std` +- `k256` +- `serde` + +Full enables the most commonly used crates. +- `full` + +The `k256` feature flag enables the `k256` feature on the `op-alloy-consensus` crate. +- `k256` + +Arbitrary enables arbitrary features on crates, deriving the `Arbitrary` trait on types. +- `arbitrary` + +Serde derives serde's Serialize and Deserialize traits on types. +- `serde` + +Additionally, individual crates can be enabled using their shorthand names. +For example, the `consensus` feature flag provides the `op-alloy-consensus` re-export +so `op-alloy-consensus` types can be used from `op-alloy` through `op_alloy::consensus::InsertTypeHere`. + +## Crates + +- [`op-alloy-network`](https://crates.io/crates/op-alloy-network) +- [`op-alloy-provider`](https://crates.io/crates/op-alloy-provider) +- [`op-alloy-consensus`](https://crates.io/crates/op-alloy-consensus) (supports `no_std`) +- [`op-alloy-rpc-jsonrpsee`](https://crates.io/crates/op-alloy-rpc-jsonrpsee) +- [`op-alloy-rpc-types`](https://crates.io/crates/op-alloy-rpc-types) (supports `no_std`) +- [`op-alloy-rpc-types-engine`](https://crates.io/crates/op-alloy-rpc-types-engine) (supports `no_std`) + +## `no_std` + +As noted above, the following crates are `no_std` compatible. + +- [`op-alloy-consensus`](https://crates.io/crates/op-alloy-consensus) +- [`op-alloy-rpc-types-engine`](https://crates.io/crates/op-alloy-rpc-types-engine) +- [`op-alloy-rpc-types`](https://crates.io/crates/op-alloy-rpc-types) + +To add `no_std` support to a crate, ensure the [check_no_std](https://github.com/ethereum-optimism/optimism/blob/develop/rust/op-alloy/scripts/check_no_std.sh) +script is updated to include this crate once `no_std` compatible. diff --git a/docs/public-docs/rust/op-reth/cli/cli.mdx b/docs/public-docs/rust/op-reth/cli/cli.mdx new file mode 100644 index 00000000000..fff5ee453a4 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/cli.mdx @@ -0,0 +1,7 @@ +--- +title: "CLI Reference" +--- + +The op-reth node is operated via the CLI by running the `op-reth node` command. To stop it, press `ctrl-c`. You may need to wait a bit as op-reth tears down existing p2p connections or performs other cleanup tasks. + +However, op-reth has more commands — see the [op-reth CLI reference](/rust/op-reth/cli/op-reth). diff --git a/docs/public-docs/rust/op-reth/cli/op-reth.mdx b/docs/public-docs/rust/op-reth/cli/op-reth.mdx new file mode 100644 index 00000000000..a6210440688 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth.mdx @@ -0,0 +1,176 @@ +--- +title: "op-reth" +--- + +Reth + +```bash +$ op-reth --help +``` +```txt +Usage: op-reth [OPTIONS] + +Commands: + node Start the node + init Initialize the database from a genesis file + init-state Initialize the database from a state dump file + import-op This syncs RLP encoded OP blocks below Bedrock from a file, without executing + import-receipts-op This imports RLP encoded receipts from a file + dump-genesis Dumps genesis block JSON configuration to stdout + db Database debugging utilities + stage Manipulate individual stages + p2p P2P Debugging utilities + config Write config to stdout + prune Prune according to the configuration without any limits + re-execute Re-execute blocks in parallel to verify historical sync correctness + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + + -V, --version + Print version + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/config.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/config.mdx new file mode 100644 index 00000000000..1b9eefb3247 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/config.mdx @@ -0,0 +1,164 @@ +--- +title: "op-reth config" +--- + +Write config to stdout + +```bash +$ op-reth config --help +``` +```txt +Usage: op-reth config [OPTIONS] + +Options: + --config + The path to the configuration file to use. + + --default + Show the default config + + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db.mdx new file mode 100644 index 00000000000..d0da9a914c6 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db.mdx @@ -0,0 +1,343 @@ +--- +title: "op-reth db" +--- + +Database debugging utilities + +```bash +$ op-reth db --help +``` +```txt +Usage: op-reth db [OPTIONS] + +Commands: + stats Lists all the tables, their entry count and their size + list Lists the contents of a table + checksum Calculates the content checksum of a table or static file segment + diff Create a diff between two database tables or two entire databases + get Gets the content of a table for the given key + drop Deletes all database entries + clear Deletes all table entries + repair-trie Verifies trie consistency and outputs any inconsistencies + static-file-header Reads and displays the static file segment header + version Lists current and local database versions + path Returns the full database path + settings Manage storage settings + account-storage Gets storage size information for an account + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/account-storage.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/account-storage.mdx new file mode 100644 index 00000000000..85f635d9434 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/account-storage.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db account-storage" +--- + +Gets storage size information for an account + +```bash +$ op-reth db account-storage --help +``` +```txt +Usage: op-reth db account-storage [OPTIONS]

+ +Arguments: +
+ The account address to check storage for + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum.mdx new file mode 100644 index 00000000000..ad825b1b0d8 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum.mdx @@ -0,0 +1,173 @@ +--- +title: "op-reth db checksum" +--- + +Calculates the content checksum of a table or static file segment + +```bash +$ op-reth db checksum --help +``` +```txt +Usage: op-reth db checksum [OPTIONS] + +Commands: + mdbx Calculates the checksum of a database table + static-file Calculates the checksum of a static file segment + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum/mdbx.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum/mdbx.mdx new file mode 100644 index 00000000000..306a3380b15 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum/mdbx.mdx @@ -0,0 +1,181 @@ +--- +title: "op-reth db checksum mdbx" +--- + +Calculates the checksum of a database table + +```bash +$ op-reth db checksum mdbx --help +``` +```txt +Usage: op-reth db checksum mdbx [OPTIONS] + +Arguments: +
+ The table name + +Options: + --start-key + The start of the range to checksum + + --end-key + The end of the range to checksum + + --limit + The maximum number of records that are queried and used to compute the checksum + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum/static-file.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum/static-file.mdx new file mode 100644 index 00000000000..da5300ae635 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/checksum/static-file.mdx @@ -0,0 +1,189 @@ +--- +title: "op-reth db checksum static-file" +--- + +Calculates the checksum of a static file segment + +```bash +$ op-reth db checksum static-file --help +``` +```txt +Usage: op-reth db checksum static-file [OPTIONS] + +Arguments: + + The static file segment + + Possible values: + - headers: Static File segment responsible for the `CanonicalHeaders`, `Headers`, `HeaderTerminalDifficulties` tables + - transactions: Static File segment responsible for the `Transactions` table + - receipts: Static File segment responsible for the `Receipts` table + - transaction-senders: Static File segment responsible for the `TransactionSenders` table + - account-change-sets: Static File segment responsible for the `AccountChangeSets` table + - storage-change-sets: Static File segment responsible for the `StorageChangeSets` table + +Options: + --start-block + The block number to start from (inclusive) + + --end-block + The block number to end at (inclusive) + + --limit + The maximum number of rows to checksum + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/clear.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/clear.mdx new file mode 100644 index 00000000000..fa381339e58 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/clear.mdx @@ -0,0 +1,173 @@ +--- +title: "op-reth db clear" +--- + +Deletes all table entries + +```bash +$ op-reth db clear --help +``` +```txt +Usage: op-reth db clear [OPTIONS] + +Commands: + mdbx Deletes all database table entries + static-file Deletes all static file segment entries + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/clear/mdbx.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/clear/mdbx.mdx new file mode 100644 index 00000000000..19e06bdc1f5 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/clear/mdbx.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db clear mdbx" +--- + +Deletes all database table entries + +```bash +$ op-reth db clear mdbx --help +``` +```txt +Usage: op-reth db clear mdbx [OPTIONS]
+ +Arguments: +
+ + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/clear/static-file.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/clear/static-file.mdx new file mode 100644 index 00000000000..94144302137 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/clear/static-file.mdx @@ -0,0 +1,178 @@ +--- +title: "op-reth db clear static-file" +--- + +Deletes all static file segment entries + +```bash +$ op-reth db clear static-file --help +``` +```txt +Usage: op-reth db clear static-file [OPTIONS] + +Arguments: + + Possible values: + - headers: Static File segment responsible for the `CanonicalHeaders`, `Headers`, `HeaderTerminalDifficulties` tables + - transactions: Static File segment responsible for the `Transactions` table + - receipts: Static File segment responsible for the `Receipts` table + - transaction-senders: Static File segment responsible for the `TransactionSenders` table + - account-change-sets: Static File segment responsible for the `AccountChangeSets` table + - storage-change-sets: Static File segment responsible for the `StorageChangeSets` table + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/diff.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/diff.mdx new file mode 100644 index 00000000000..b668b80e7ff --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/diff.mdx @@ -0,0 +1,224 @@ +--- +title: "op-reth db diff" +--- + +Create a diff between two database tables or two entire databases + +```bash +$ op-reth db diff --help +``` +```txt +Usage: op-reth db diff [OPTIONS] --secondary-datadir --output + +Options: + --secondary-datadir + The path to the data dir for all reth files and subdirectories. + + -h, --help + Print help (see a summary with '-h') + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + + --table
+ The table name to diff. If not specified, all tables are diffed. + + --output + The output directory for the diff report. + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/drop.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/drop.mdx new file mode 100644 index 00000000000..fd16a462786 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/drop.mdx @@ -0,0 +1,171 @@ +--- +title: "op-reth db drop" +--- + +Deletes all database entries + +```bash +$ op-reth db drop --help +``` +```txt +Usage: op-reth db drop [OPTIONS] + +Options: + -f, --force + Bypasses the interactive confirmation and drops the database directly + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/get.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/get.mdx new file mode 100644 index 00000000000..88230e6ee6b --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/get.mdx @@ -0,0 +1,173 @@ +--- +title: "op-reth db get" +--- + +Gets the content of a table for the given key + +```bash +$ op-reth db get --help +``` +```txt +Usage: op-reth db get [OPTIONS] + +Commands: + mdbx Gets the content of a database table for the given key + static-file Gets the content of a static file segment for the given key + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/get/mdbx.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/get/mdbx.mdx new file mode 100644 index 00000000000..e11a39f90ef --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/get/mdbx.mdx @@ -0,0 +1,187 @@ +--- +title: "op-reth db get mdbx" +--- + +Gets the content of a database table for the given key + +```bash +$ op-reth db get mdbx --help +``` +```txt +Usage: op-reth db get mdbx [OPTIONS]
[SUBKEY] [END_KEY] [END_SUBKEY] + +Arguments: +
+ + + + The key to get content for + + [SUBKEY] + The subkey to get content for + + [END_KEY] + Optional end key for range query (exclusive upper bound) + + [END_SUBKEY] + Optional end subkey for range query (exclusive upper bound) + +Options: + --raw + Output bytes instead of human-readable decoded value + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/get/static-file.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/get/static-file.mdx new file mode 100644 index 00000000000..e0dcbc6decd --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/get/static-file.mdx @@ -0,0 +1,187 @@ +--- +title: "op-reth db get static-file" +--- + +Gets the content of a static file segment for the given key + +```bash +$ op-reth db get static-file --help +``` +```txt +Usage: op-reth db get static-file [OPTIONS] [SUBKEY] + +Arguments: + + Possible values: + - headers: Static File segment responsible for the `CanonicalHeaders`, `Headers`, `HeaderTerminalDifficulties` tables + - transactions: Static File segment responsible for the `Transactions` table + - receipts: Static File segment responsible for the `Receipts` table + - transaction-senders: Static File segment responsible for the `TransactionSenders` table + - account-change-sets: Static File segment responsible for the `AccountChangeSets` table + - storage-change-sets: Static File segment responsible for the `StorageChangeSets` table + + + The key to get content for + + [SUBKEY] + The subkey to get content for, for example address in changeset + +Options: + --raw + Output bytes instead of human-readable decoded value + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/list.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/list.mdx new file mode 100644 index 00000000000..6dbdfaa5725 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/list.mdx @@ -0,0 +1,214 @@ +--- +title: "op-reth db list" +--- + +Lists the contents of a table + +```bash +$ op-reth db list --help +``` +```txt +Usage: op-reth db list [OPTIONS]
+ +Arguments: +
+ The table name + +Options: + -s, --skip + Skip first N entries + + [default: 0] + + -r, --reverse + Reverse the order of the entries. If enabled last table entries are read + + -l, --len + How many items to take from the walker + + [default: 5] + + --search + Search parameter for both keys and values. Prefix it with `0x` to search for binary data, and text otherwise. + + ATTENTION! For compressed tables (`Transactions` and `Receipts`), there might be missing results since the search uses the raw uncompressed value from the database. + + --min-row-size + Minimum size of row in bytes + + [default: 0] + + --min-key-size + Minimum size of key in bytes + + [default: 0] + + --min-value-size + Minimum size of value in bytes + + [default: 0] + + -c, --count + Returns the number of rows found + + -j, --json + Dump as JSON instead of using TUI + + --raw + Output bytes instead of human-readable decoded value + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/path.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/path.mdx new file mode 100644 index 00000000000..e302316b0a9 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/path.mdx @@ -0,0 +1,168 @@ +--- +title: "op-reth db path" +--- + +Returns the full database path + +```bash +$ op-reth db path --help +``` +```txt +Usage: op-reth db path [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/repair-trie.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/repair-trie.mdx new file mode 100644 index 00000000000..d445bd841ab --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/repair-trie.mdx @@ -0,0 +1,176 @@ +--- +title: "op-reth db repair-trie" +--- + +Verifies trie consistency and outputs any inconsistencies + +```bash +$ op-reth db repair-trie --help +``` +```txt +Usage: op-reth db repair-trie [OPTIONS] + +Options: + --dry-run + Only show inconsistencies without making any repairs + + --metrics + Enable Prometheus metrics. + + The metrics will be served at the given interface and port. + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings.mdx new file mode 100644 index 00000000000..41e2ecdf658 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings.mdx @@ -0,0 +1,173 @@ +--- +title: "op-reth db settings" +--- + +Manage storage settings + +```bash +$ op-reth db settings --help +``` +```txt +Usage: op-reth db settings [OPTIONS] + +Commands: + get Get current storage settings from database + set Set storage settings in database + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/get.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/get.mdx new file mode 100644 index 00000000000..b31190186b7 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/get.mdx @@ -0,0 +1,168 @@ +--- +title: "op-reth db settings get" +--- + +Get current storage settings from database + +```bash +$ op-reth db settings get --help +``` +```txt +Usage: op-reth db settings get [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set.mdx new file mode 100644 index 00000000000..0627c1f5960 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set.mdx @@ -0,0 +1,178 @@ +--- +title: "op-reth db settings set" +--- + +Set storage settings in database + +```bash +$ op-reth db settings set --help +``` +```txt +Usage: op-reth db settings set [OPTIONS] + +Commands: + receipts Store receipts in static files instead of the database + transaction_senders Store transaction senders in static files instead of the database + account_changesets Store account changesets in static files instead of the database + storages_history Store storage history in rocksdb instead of MDBX + transaction_hash_numbers Store transaction hash to number mapping in rocksdb instead of MDBX + account_history Store account history in rocksdb instead of MDBX + storage_changesets Store storage changesets in static files instead of the database + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/account_changesets.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/account_changesets.mdx new file mode 100644 index 00000000000..3d082c8d650 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/account_changesets.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db settings set account_changesets" +--- + +Store account changesets in static files instead of the database + +```bash +$ op-reth db settings set account_changesets --help +``` +```txt +Usage: op-reth db settings set account_changesets [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/account_history.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/account_history.mdx new file mode 100644 index 00000000000..428c1b63768 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/account_history.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db settings set account_history" +--- + +Store account history in rocksdb instead of MDBX + +```bash +$ op-reth db settings set account_history --help +``` +```txt +Usage: op-reth db settings set account_history [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/receipts.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/receipts.mdx new file mode 100644 index 00000000000..b09adc4c1f7 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/receipts.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db settings set receipts" +--- + +Store receipts in static files instead of the database + +```bash +$ op-reth db settings set receipts --help +``` +```txt +Usage: op-reth db settings set receipts [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/receipts_in_static_files.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/receipts_in_static_files.mdx new file mode 100644 index 00000000000..6da32bd615f --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/receipts_in_static_files.mdx @@ -0,0 +1,154 @@ +--- +title: "op-reth db settings set receipts_in_static_files" +--- + +Store receipts in static files instead of the database + +```bash +$ op-reth db settings set receipts_in_static_files --help +``` +```txt +Usage: op-reth db settings set receipts_in_static_files [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces. + + - `http`: expects endpoint path to end with `/v1/traces` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/storage_changesets.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/storage_changesets.mdx new file mode 100644 index 00000000000..fc6aa09f918 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/storage_changesets.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db settings set storage_changesets" +--- + +Store storage changesets in static files instead of the database + +```bash +$ op-reth db settings set storage_changesets --help +``` +```txt +Usage: op-reth db settings set storage_changesets [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/storages_history.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/storages_history.mdx new file mode 100644 index 00000000000..5ae28e3bbcf --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/storages_history.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db settings set storages_history" +--- + +Store storage history in rocksdb instead of MDBX + +```bash +$ op-reth db settings set storages_history --help +``` +```txt +Usage: op-reth db settings set storages_history [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_hash_numbers.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_hash_numbers.mdx new file mode 100644 index 00000000000..9ba939c89dd --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_hash_numbers.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db settings set transaction_hash_numbers" +--- + +Store transaction hash to number mapping in rocksdb instead of MDBX + +```bash +$ op-reth db settings set transaction_hash_numbers --help +``` +```txt +Usage: op-reth db settings set transaction_hash_numbers [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_senders.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_senders.mdx new file mode 100644 index 00000000000..f99e4675bbd --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_senders.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db settings set transaction_senders" +--- + +Store transaction senders in static files instead of the database + +```bash +$ op-reth db settings set transaction_senders --help +``` +```txt +Usage: op-reth db settings set transaction_senders [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_senders_in_static_files.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_senders_in_static_files.mdx new file mode 100644 index 00000000000..8570cb8def9 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/settings/set/transaction_senders_in_static_files.mdx @@ -0,0 +1,154 @@ +--- +title: "op-reth db settings set transaction_senders_in_static_files" +--- + +Store transaction senders in static files instead of the database + +```bash +$ op-reth db settings set transaction_senders_in_static_files --help +``` +```txt +Usage: op-reth db settings set transaction_senders_in_static_files [OPTIONS] + +Arguments: + + [possible values: true, false] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces. + + - `http`: expects endpoint path to end with `/v1/traces` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header.mdx new file mode 100644 index 00000000000..c454aa007f2 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header.mdx @@ -0,0 +1,173 @@ +--- +title: "op-reth db static-file-header" +--- + +Reads and displays the static file segment header + +```bash +$ op-reth db static-file-header --help +``` +```txt +Usage: op-reth db static-file-header [OPTIONS] + +Commands: + block Query by segment and block number + path Query by path to static file + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header/block.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header/block.mdx new file mode 100644 index 00000000000..0ad2a58216d --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header/block.mdx @@ -0,0 +1,183 @@ +--- +title: "op-reth db static-file-header block" +--- + +Query by segment and block number + +```bash +$ op-reth db static-file-header block --help +``` +```txt +Usage: op-reth db static-file-header block [OPTIONS] + +Arguments: + + Static file segment + + Possible values: + - headers: Static File segment responsible for the `CanonicalHeaders`, `Headers`, `HeaderTerminalDifficulties` tables + - transactions: Static File segment responsible for the `Transactions` table + - receipts: Static File segment responsible for the `Receipts` table + - transaction-senders: Static File segment responsible for the `TransactionSenders` table + - account-change-sets: Static File segment responsible for the `AccountChangeSets` table + - storage-change-sets: Static File segment responsible for the `StorageChangeSets` table + + + Block number to query + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header/path.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header/path.mdx new file mode 100644 index 00000000000..6fa62ea4244 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/static-file-header/path.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth db static-file-header path" +--- + +Query by path to static file + +```bash +$ op-reth db static-file-header path --help +``` +```txt +Usage: op-reth db static-file-header path [OPTIONS] + +Arguments: + + Path to the static file + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/stats.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/stats.mdx new file mode 100644 index 00000000000..8a40bf9b67a --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/stats.mdx @@ -0,0 +1,184 @@ +--- +title: "op-reth db stats" +--- + +Lists all the tables, their entry count and their size + +```bash +$ op-reth db stats --help +``` +```txt +Usage: op-reth db stats [OPTIONS] + +Options: + --skip-consistency-checks + Skip consistency checks for static files + + --detailed-sizes + Show only the total size for static files + + --detailed-segments + Show detailed information per static file segment + + --checksum + Show a checksum of each table in the database. + + WARNING: this option will take a long time to run, as it needs to traverse and hash the entire database. + + For individual table checksums, use the `reth db checksum` command. + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/db/version.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/db/version.mdx new file mode 100644 index 00000000000..32b4d619bcf --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/db/version.mdx @@ -0,0 +1,168 @@ +--- +title: "op-reth db version" +--- + +Lists current and local database versions + +```bash +$ op-reth db version --help +``` +```txt +Usage: op-reth db version [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/dump-genesis.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/dump-genesis.mdx new file mode 100644 index 00000000000..8289728ccf8 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/dump-genesis.mdx @@ -0,0 +1,167 @@ +--- +title: "op-reth dump-genesis" +--- + +Dumps genesis block JSON configuration to stdout + +```bash +$ op-reth dump-genesis --help +``` +```txt +Usage: op-reth dump-genesis [OPTIONS] + +Options: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/import-op.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/import-op.mdx new file mode 100644 index 00000000000..8e8d7b18e06 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/import-op.mdx @@ -0,0 +1,336 @@ +--- +title: "op-reth import-op" +--- + +This syncs RLP encoded OP blocks below Bedrock from a file, without executing + +```bash +$ op-reth import-op --help +``` +```txt +Usage: op-reth import-op [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --chunk-len + Chunk byte length to read from file. + + + The path to a block file for import. + + The online stages (headers and bodies) are replaced by a file import, after which the + remaining stages are executed. + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/import-receipts-op.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/import-receipts-op.mdx new file mode 100644 index 00000000000..d82c6dfa2db --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/import-receipts-op.mdx @@ -0,0 +1,336 @@ +--- +title: "op-reth import-receipts-op" +--- + +This imports RLP encoded receipts from a file + +```bash +$ op-reth import-receipts-op --help +``` +```txt +Usage: op-reth import-receipts-op [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --chunk-len + Chunk byte length to read from file. + + + The path to a receipts file for import. File must use `OpGethReceiptFileCodec` (used for + exporting OP chain segment below Bedrock block via testinprod/op-geth). + + + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/init-state.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/init-state.mdx new file mode 100644 index 00000000000..6ce0a00b584 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/init-state.mdx @@ -0,0 +1,366 @@ +--- +title: "op-reth init-state" +--- + +Initialize the database from a state dump file + +```bash +$ op-reth init-state --help +``` +```txt +Usage: op-reth init-state [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --without-evm + Specifies whether to initialize the state without relying on EVM historical data. + + When enabled, and before inserting the state, it creates a dummy chain up to the last EVM block specified. It then, appends the first block provided block. + + - **Note**: **Do not** import receipts and blocks beforehand, or this will fail or be ignored. + + --header + Header file containing the header in an RLP encoded format. + + --header-hash + Hash of the header. + + --without-ovm + Specifies whether to initialize the state without relying on OVM or EVM historical data. + + When enabled, and before inserting the state, it creates a dummy chain up to the last OVM block (#105235062) (14GB / 90 seconds). It then, appends the Bedrock block. This is hardcoded for OP mainnet, for other OP chains you will need to pass in a header. + + - **Note**: **Do not** import receipts and blocks beforehand, or this will fail or be ignored. + + + JSONL file with state dump. + + Must contain accounts in following format, additional account fields are ignored. Must + also contain { "root": \ } as first line. + { + "balance": "\", + "nonce": \, + "code": "\", + "storage": { + "\": "\", + .. + }, + "address": "\", + } + + Allows init at a non-genesis block. Caution! Blocks must be manually imported up until + and including the non-genesis block to init chain at. See 'import' command. + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/init.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/init.mdx new file mode 100644 index 00000000000..e145b1fac9a --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/init.mdx @@ -0,0 +1,327 @@ +--- +title: "op-reth init" +--- + +Initialize the database from a genesis file + +```bash +$ op-reth init --help +``` +```txt +Usage: op-reth init [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/node.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/node.mdx new file mode 100644 index 00000000000..9ec142316fa --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/node.mdx @@ -0,0 +1,1276 @@ +--- +title: "op-reth node" +--- + +Start the node + +```bash +$ op-reth node --help +``` +```txt +Usage: op-reth node [OPTIONS] + +Options: + --config + The path to the configuration file to use. + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + + --instance + Add a new instance of a node. + + Configures the ports of the node to avoid conflicts with the defaults. This is useful for running multiple nodes on the same machine. + + Max number of instances is 200. It is chosen in a way so that it's not possible to have port numbers that conflict with each other. + + Changes to the following port numbers: - `DISCOVERY_PORT`: default + `instance` - 1 - `AUTH_PORT`: default + `instance` * 100 - 100 - `HTTP_RPC_PORT`: default - `instance` + 1 - `WS_RPC_PORT`: default + `instance` * 2 - 2 - `IPC_PATH`: default + `-instance` + + --with-unused-ports + Sets all ports to unused, allowing the OS to choose random unused ports when sockets are bound. + + Mutually exclusive with `--instance`. + + -h, --help + Print help (see a summary with '-h') + +Metrics: + --metrics + Enable Prometheus metrics. + + The metrics will be served at the given interface and port. + + --metrics.prometheus.push.url + URL for pushing Prometheus metrics to a push gateway. + + If set, the node will periodically push metrics to the specified push gateway URL. + + --metrics.prometheus.push.interval + Interval in seconds for pushing metrics to push gateway. + + Default: 5 seconds + + [default: 5] + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + +Networking: + -d, --disable-discovery + Disable the discovery service + + --disable-dns-discovery + Disable the DNS discovery + + --disable-discv4-discovery + Disable Discv4 discovery + + --enable-discv5-discovery + Enable Discv5 discovery + + --disable-nat + Disable Nat discovery + + --discovery.addr + The UDP address to use for devp2p peer discovery version 4 + + [default: 0.0.0.0] + + --discovery.port + The UDP port to use for devp2p peer discovery version 4 + + [default: 30303] + + --discovery.v5.addr + The UDP IPv4 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv4 + + --discovery.v5.addr.ipv6 + The UDP IPv6 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv6 + + --discovery.v5.port + The UDP IPv4 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv4, or `--discovery.v5.addr` is set + + [default: 9200] + + --discovery.v5.port.ipv6 + The UDP IPv6 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv6, or `--discovery.addr.ipv6` is set + + [default: 9200] + + --discovery.v5.lookup-interval + The interval in seconds at which to carry out periodic lookup queries, for the whole run of the program + + [default: 20] + + --discovery.v5.bootstrap.lookup-interval + The interval in seconds at which to carry out boost lookup queries, for a fixed number of times, at bootstrap + + [default: 5] + + --discovery.v5.bootstrap.lookup-countdown + The number of times to carry out boost lookup queries at bootstrap + + [default: 200] + + --trusted-peers + Comma separated enode URLs of trusted peers for P2P connections. + + --trusted-peers enode://abcd@192.168.0.1:30303 + + --trusted-only + Connect to or accept from trusted peers only + + --bootnodes + Comma separated enode URLs for P2P discovery bootstrap. + + Will fall back to a network-specific default if not specified. + + --dns-retries + Amount of DNS resolution requests retries to perform when peering + + [default: 0] + + --peers-file + The path to the known peers file. Connected peers are dumped to this file on nodes + shutdown, and read on startup. Cannot be used with `--no-persist-peers`. + + --identity + Custom node identity + + [default: reth/-/] + + --p2p-secret-key + Secret key to use for this node. + + This will also deterministically set the peer ID. If not specified, it will be set in the data dir for the chain being used. + + --p2p-secret-key-hex + Hex encoded secret key to use for this node. + + This will also deterministically set the peer ID. Cannot be used together with `--p2p-secret-key`. + + --no-persist-peers + Do not persist peers. + + --nat + NAT resolution method (any|none|upnp|publicip|extip:\) + + [default: any] + + --addr + Network listening address + + [default: 0.0.0.0] + + --port + Network listening port + + [default: 30303] + + --max-outbound-peers + Maximum number of outbound peers. default: 100 + + --max-inbound-peers + Maximum number of inbound peers. default: 30 + + --max-peers + Maximum number of total peers (inbound + outbound). + + Splits peers using approximately 2:1 inbound:outbound ratio. Cannot be used together with `--max-outbound-peers` or `--max-inbound-peers`. + + --max-tx-reqs + Max concurrent `GetPooledTransactions` requests. + + [default: 130] + + --max-tx-reqs-peer + Max concurrent `GetPooledTransactions` requests per peer. + + [default: 1] + + --max-seen-tx-history + Max number of seen transactions to remember per peer. + + Default is 320 transaction hashes. + + [default: 320] + + --max-pending-imports + Max number of transactions to import concurrently. + + [default: 4096] + + --pooled-tx-response-soft-limit + Experimental, for usage in research. Sets the max accumulated byte size of transactions + to pack in one response. + Spec'd at 2MiB. + + [default: 2097152] + + --pooled-tx-pack-soft-limit + Experimental, for usage in research. Sets the max accumulated byte size of transactions to + request in one request. + + Since `RLPx` protocol version 68, the byte size of a transaction is shared as metadata in a + transaction announcement (see `RLPx` specs). This allows a node to request a specific size + response. + + By default, nodes request only 128 KiB worth of transactions, but should a peer request + more, up to 2 MiB, a node will answer with more than 128 KiB. + + Default is 128 KiB. + + [default: 131072] + + --max-tx-pending-fetch + Max capacity of cache of hashes for transactions pending fetch. + + [default: 25600] + + --net-if.experimental + Name of network interface used to communicate with peers. + + If flag is set, but no value is passed, the default interface for docker `eth0` is tried. + + --tx-propagation-policy + Transaction Propagation Policy + + The policy determines which peers transactions are gossiped to. + + [default: All] + + --tx-ingress-policy + Transaction ingress policy + + Determines which peers' transactions are accepted over P2P. + + [default: All] + + --disable-tx-gossip + Disable transaction pool gossip + + Disables gossiping of transactions in the mempool to peers. This can be omitted for personal nodes, though providers should always opt to enable this flag. + + --tx-propagation-mode + Sets the transaction propagation mode by determining how new pending transactions are propagated to other peers in full. + + Examples: sqrt, all, max:10 + + [default: sqrt] + + --required-block-hashes + Comma separated list of required block hashes or block number=hash pairs. Peers that don't have these blocks will be filtered out. Format: hash or `block_number=hash` (e.g., 23115201=0x1234...) + + --network-id + Optional network ID to override the chain specification's network ID for P2P connections + + --netrestrict + Restrict network communication to the given IP networks (CIDR masks). + + Comma separated list of CIDR network specifications. Only peers with IP addresses within these ranges will be allowed to connect. + + Example: --netrestrict "192.168.0.0/16,10.0.0.0/8" + +RPC: + --http + Enable the HTTP-RPC server + + --http.addr + Http server address to listen on + + [default: 127.0.0.1] + + --http.port + Http server port to listen on + + [default: 8545] + + --http.disable-compression + Disable compression for HTTP responses + + --http.api + Rpc Modules to be configured for the HTTP server + + [possible values: admin, debug, eth, net, trace, txpool, web3, rpc, reth, ots, flashbots, miner, mev, testing] + + --http.corsdomain + Http Corsdomain to allow request from + + --ws + Enable the WS-RPC server + + --ws.addr + Ws server address to listen on + + [default: 127.0.0.1] + + --ws.port + Ws server port to listen on + + [default: 8546] + + --ws.origins + Origins from which to accept `WebSocket` requests + + --ws.api + Rpc Modules to be configured for the WS server + + [possible values: admin, debug, eth, net, trace, txpool, web3, rpc, reth, ots, flashbots, miner, mev, testing] + + --ipcdisable + Disable the IPC-RPC server + + --ipcpath + Filename for IPC socket/pipe within the datadir + + [default: .ipc] + + --ipc.permissions + Set the permissions for the IPC socket file, in octal format. + + If not specified, the permissions will be set by the system's umask. + + --authrpc.addr + Auth server address to listen on + + [default: 127.0.0.1] + + --authrpc.port + Auth server port to listen on + + [default: 8551] + + --authrpc.jwtsecret + Path to a JWT secret to use for the authenticated engine-API RPC server. + + This will enforce JWT authentication for all requests coming from the consensus layer. + + If no path is provided, a secret will be generated and stored in the datadir under `//jwt.hex`. For mainnet this would be `~/.reth/mainnet/jwt.hex` by default. + + --auth-ipc + Enable auth engine API over IPC + + --auth-ipc.path + Filename for auth IPC socket/pipe within the datadir + + [default: _engine_api.ipc] + + --disable-auth-server + Disable the auth/engine API server. + + This will prevent the authenticated engine-API server from starting. Use this if you're running a node that doesn't need to serve engine API requests. + + --rpc.jwtsecret + Hex encoded JWT secret to authenticate the regular RPC server(s), see `--http.api` and `--ws.api`. + + This is __not__ used for the authenticated engine-API RPC server, see `--authrpc.jwtsecret`. + + --rpc.max-request-size + Set the maximum RPC request payload size for both HTTP and WS in megabytes + + [default: 15] + + --rpc.max-response-size + Set the maximum RPC response payload size for both HTTP and WS in megabytes + + [default: 160] + [aliases: --rpc.returndata.limit] + + --rpc.max-subscriptions-per-connection + Set the maximum concurrent subscriptions per connection + + [default: 1024] + + --rpc.max-connections + Maximum number of RPC server connections + + [default: 500] + + --rpc.max-tracing-requests + Maximum number of concurrent tracing requests. + + By default this chooses a sensible value based on the number of available cores. Tracing requests are generally CPU bound. Choosing a value that is higher than the available CPU cores can have a negative impact on the performance of the node and affect the node's ability to maintain sync. + + [default: ] + + --rpc.max-blocking-io-requests + Maximum number of concurrent blocking IO requests. + + Blocking IO requests include `eth_call`, `eth_estimateGas`, and similar methods that require EVM execution. These are spawned as blocking tasks to avoid blocking the async runtime. + + [default: 256] + + --rpc.max-trace-filter-blocks + Maximum number of blocks for `trace_filter` requests + + [default: 100] + + --rpc.max-blocks-per-filter + Maximum number of blocks that could be scanned per filter request. (0 = entire chain) + + [default: 100000] + + --rpc.max-logs-per-response + Maximum number of logs that can be returned in a single response. (0 = no limit) + + [default: 20000] + + --rpc.gascap + Maximum gas limit for `eth_call` and call tracing RPC methods + + [default: 50000000] + + --rpc.evm-memory-limit + Maximum memory the EVM can allocate per RPC request + + [default: 4294967295] + + --rpc.txfeecap + Maximum eth transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap) + + [default: 1.0] + + --rpc.max-simulate-blocks + Maximum number of blocks for `eth_simulateV1` call + + [default: 256] + + --rpc.eth-proof-window + The maximum proof window for historical proof generation. This value allows for generating historical proofs up to configured number of blocks from current tip (up to `tip - window`) + + [default: 0] + + --rpc.proof-permits + Maximum number of concurrent getproof requests + + [default: 25] + + --rpc.pending-block + Configures the pending block behavior for RPC responses. + + Options: full (include all transactions), empty (header only), none (disable pending blocks). + + [default: full] + + --rpc.forwarder + Endpoint to forward transactions to + + --builder.disallow + Path to file containing disallowed addresses, json-encoded list of strings. Block validation API will reject blocks containing transactions from these addresses + +RPC State Cache: + --rpc-cache.max-blocks + Max number of blocks in cache + + [default: 5000] + + --rpc-cache.max-receipts + Max number receipts in cache + + [default: 2000] + + --rpc-cache.max-headers + Max number of headers in cache + + [default: 1000] + + --rpc-cache.max-concurrent-db-requests + Max number of concurrent database requests + + [default: 512] + +Gas Price Oracle: + --gpo.blocks + Number of recent blocks to check for gas price + + [default: 20] + + --gpo.ignoreprice + Gas Price below which gpo will ignore transactions + + [default: 2] + + --gpo.maxprice + Maximum transaction priority fee(or gasprice before London Fork) to be recommended by gpo + + [default: 500000000000] + + --gpo.percentile + The percentile of gas prices to use for the estimate + + [default: 60] + + --gpo.default-suggested-fee + The default gas price to use if there are no blocks to use + + --rpc.send-raw-transaction-sync-timeout + Timeout for `send_raw_transaction_sync` RPC method + + [default: 30s] + + --testing.skip-invalid-transactions + Skip invalid transactions in `testing_buildBlockV1` instead of failing. + + When enabled, transactions that fail execution will be skipped, and all subsequent transactions from the same sender will also be skipped. + +TxPool: + --txpool.pending-max-count + Max number of transaction in the pending sub-pool + + [default: 10000] + + --txpool.pending-max-size + Max size of the pending sub-pool in megabytes + + [default: 20] + + --txpool.basefee-max-count + Max number of transaction in the basefee sub-pool + + [default: 10000] + + --txpool.basefee-max-size + Max size of the basefee sub-pool in megabytes + + [default: 20] + + --txpool.queued-max-count + Max number of transaction in the queued sub-pool + + [default: 10000] + + --txpool.queued-max-size + Max size of the queued sub-pool in megabytes + + [default: 20] + + --txpool.blobpool-max-count + Max number of transaction in the blobpool + + [default: 10000] + + --txpool.blobpool-max-size + Max size of the blobpool in megabytes + + [default: 20] + + --txpool.blob-cache-size + Max number of entries for the in memory cache of the blob store + + --txpool.disable-blobs-support + Disable EIP-4844 blob transaction support + + --txpool.max-account-slots + Max number of executable transaction slots guaranteed per account + + [default: 16] + + --txpool.pricebump + Price bump (in %) for the transaction pool underpriced check + + [default: 10] + + --txpool.minimal-protocol-fee + Minimum base fee required by the protocol + + [default: 7] + + --txpool.minimum-priority-fee + Minimum priority fee required for transaction acceptance into the pool. Transactions with priority fee below this value will be rejected + + --txpool.gas-limit + The default enforced gas limit for transactions entering the pool + + [default: 30000000] + + --txpool.max-tx-gas + Maximum gas limit for individual transactions. Transactions exceeding this limit will be rejected by the transaction pool + + --blobpool.pricebump + Price bump percentage to replace an already existing blob transaction + + [default: 100] + + --txpool.max-tx-input-bytes + Max size in bytes of a single transaction allowed to enter the pool + + [default: 131072] + + --txpool.max-cached-entries + The maximum number of blobs to keep in the in memory blob cache + + [default: 100] + + --txpool.nolocals + Flag to disable local transaction exemptions + + --txpool.locals + Flag to allow certain addresses as local + + --txpool.no-local-transactions-propagation + Flag to toggle local transaction propagation + + --txpool.additional-validation-tasks + Number of additional transaction validation tasks to spawn + + [default: 1] + + --txpool.max-pending-txns + Maximum number of pending transactions from the network to buffer + + [default: 2048] + + --txpool.max-new-txns + Maximum number of new transactions to buffer + + [default: 1024] + + --txpool.max-new-pending-txs-notifications + How many new pending transactions to buffer and send to in progress pending transaction iterators + + [default: 200] + + --txpool.lifetime + Maximum amount of time non-executable transaction are queued + + [default: 10800] + + --txpool.transactions-backup + Path to store the local transaction backup at, to survive node restarts + + --txpool.disable-transactions-backup + Disables transaction backup to disk on node shutdown + + --txpool.max-batch-size + Max batch size for transaction pool insertions + + [default: 1] + +Builder: + --builder.extradata + Block extra data set by the payload builder + + [default: reth//] + + --builder.gaslimit + Target gas limit for built blocks + + --builder.interval + The interval at which the job should build a new payload after the last. + + Interval is specified in seconds or in milliseconds if the value ends with `ms`: * `50ms` -> 50 milliseconds * `1` -> 1 second + + [default: 1] + + --builder.deadline + The deadline for when the payload builder job should resolve + + [default: 12] + + --builder.max-tasks + Maximum number of tasks to spawn for building a payload + + [default: 3] + + --builder.max-blobs + Maximum number of blobs to include per block + +Debug: + --debug.terminate + Flag indicating whether the node should be terminated after the pipeline sync + + --debug.tip + Set the chain tip manually for testing purposes. + + NOTE: This is a temporary flag + + --debug.max-block + Runs the sync only up to the specified block + + --debug.etherscan [] + Runs a fake consensus client that advances the chain using recent block hashes on Etherscan. If specified, requires an `ETHERSCAN_API_KEY` environment variable + + --debug.rpc-consensus-url + Runs a fake consensus client using blocks fetched from an RPC endpoint. Supports both HTTP and `WebSocket` endpoints - `WebSocket` endpoints will use subscriptions, while HTTP endpoints will poll for new blocks + + --debug.skip-fcu + If provided, the engine will skip `n` consecutive FCUs + + --debug.skip-new-payload + If provided, the engine will skip `n` consecutive new payloads + + --debug.reorg-frequency + If provided, the chain will be reorged at specified frequency + + --debug.reorg-depth + The reorg depth for chain reorgs + + --debug.engine-api-store + The path to store engine API messages at. If specified, all of the intercepted engine API messages will be written to specified location + + --debug.invalid-block-hook + Determines which type of invalid block hook to install + + Example: `witness,prestate` + + [default: witness] + [possible values: witness, pre-state, opcode] + + --debug.healthy-node-rpc-url + The RPC URL of a healthy node to use for comparing invalid block hook results against. + + Debug setting that enables execution witness comparison for troubleshooting bad blocks. + When enabled, the node will collect execution witnesses from the specified source and + compare them against local execution when a bad block is encountered, helping identify + discrepancies in state execution. + + --ethstats + The URL of the ethstats server to connect to. Example: `nodename:secret@host:port` + + --debug.startup-sync-state-idle + Set the node to idle state when the backfill is not running. + + This makes the `eth_syncing` RPC return "Idle" when the node has just started or finished the backfill, but did not yet receive any new blocks. + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Dev testnet: + --dev + Start the node in dev mode + + This mode uses a local proof-of-authority consensus engine with either fixed block times + or automatically mined blocks. + Disables network discovery and enables local http server. + Prefunds 20 accounts derived by mnemonic "test test test test test test test test test test + test junk" with 10 000 ETH each. + + --dev.block-max-transactions + How many transactions to mine per block + + --dev.block-time + Interval between blocks. + + Parses strings using [`humantime::parse_duration`] + --dev.block-time 12s + + --dev.mnemonic + Derive dev accounts from a fixed mnemonic instead of random ones. + + [default: "test test test test test test test test test test test junk"] + +Pruning: + --full + Run full node. Only the most recent [`MINIMUM_PRUNING_DISTANCE`] block states are stored + + --minimal + Run minimal storage mode with maximum pruning and smaller static files. + + This mode configures the node to use minimal disk space by: - Fully pruning sender recovery, transaction lookup, receipts - Leaving 10,064 blocks for account, storage history and block bodies - Using 10,000 blocks per static file segment + + --prune.block-interval + Minimum pruning interval measured in blocks + + --prune.sender-recovery.full + Prunes all sender recovery data + + --prune.sender-recovery.distance + Prune sender recovery data before the `head-N` block number. In other words, keep last N + 1 blocks + + --prune.sender-recovery.before + Prune sender recovery data before the specified block number. The specified block number is not pruned + + --prune.transaction-lookup.full + Prunes all transaction lookup data + + --prune.transaction-lookup.distance + Prune transaction lookup data before the `head-N` block number. In other words, keep last N + 1 blocks + + --prune.transaction-lookup.before + Prune transaction lookup data before the specified block number. The specified block number is not pruned + + --prune.receipts.full + Prunes all receipt data + + --prune.receipts.pre-merge + Prune receipts before the merge block + + --prune.receipts.distance + Prune receipts before the `head-N` block number. In other words, keep last N + 1 blocks + + --prune.receipts.before + Prune receipts before the specified block number. The specified block number is not pruned + + --prune.receiptslogfilter + Configure receipts log filter. Format: <`address`>:<`prune_mode`>... where <`prune_mode`> can be 'full', 'distance:<`blocks`>', or 'before:<`block_number`>' + + --prune.account-history.full + Prunes all account history + + --prune.account-history.distance + Prune account before the `head-N` block number. In other words, keep last N + 1 blocks + + --prune.account-history.before + Prune account history before the specified block number. The specified block number is not pruned + + --prune.storage-history.full + Prunes all storage history data + + --prune.storage-history.distance + Prune storage history before the `head-N` block number. In other words, keep last N + 1 blocks + + --prune.storage-history.before + Prune storage history before the specified block number. The specified block number is not pruned + + --prune.bodies.pre-merge + Prune bodies before the merge block + + --prune.bodies.distance + Prune bodies before the `head-N` block number. In other words, keep last N + 1 blocks + + --prune.bodies.before + Prune storage history before the specified block number. The specified block number is not pruned + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + +Engine: + --engine.persistence-threshold + Configure persistence threshold for the engine. This determines how many canonical blocks must be in-memory, ahead of the last persisted block, before flushing canonical blocks to disk again. + + To persist blocks as fast as the node receives them, set this value to zero. This will cause more frequent DB writes. + + [default: 2] + + --engine.memory-block-buffer-target + Configure the target number of blocks to keep in memory + + [default: 0] + + --engine.legacy-state-root + Enable legacy state root + + --engine.disable-state-cache + Disable state cache + + --engine.disable-prewarming + Disable parallel prewarming + + --engine.disable-parallel-sparse-trie + Disable the parallel sparse trie in the engine + + --engine.state-provider-metrics + Enable state provider latency metrics. This allows the engine to collect and report stats about how long state provider calls took during execution, but this does introduce slight overhead to state provider calls + + --engine.cross-block-cache-size + Configure the size of cross-block cache in megabytes + + [default: 4096] + + --engine.state-root-task-compare-updates + Enable comparing trie updates from the state root task to the trie updates from the regular state root calculation + + --engine.accept-execution-requests-hash + Enables accepting requests hash instead of an array of requests in `engine_newPayloadV4` + + --engine.multiproof-chunking + Whether multiproof task should chunk proof targets + + --engine.multiproof-chunk-size + Multiproof task chunk size for proof targets + + [default: 60] + + --engine.reserved-cpu-cores + Configure the number of reserved CPU cores for non-reth processes + + [default: 1] + + --engine.disable-precompile-cache + Disable precompile cache + + --engine.state-root-fallback + Enable state root fallback, useful for testing + + --engine.always-process-payload-attributes-on-canonical-head + Always process payload attributes and begin a payload build process even if `forkchoiceState.headBlockHash` is already the canonical head or an ancestor. See `TreeConfig::always_process_payload_attributes_on_canonical_head` for more details. + + Note: This is a no-op on OP Stack. + + --engine.allow-unwind-canonical-header + Allow unwinding canonical header to ancestor during forkchoice updates. See `TreeConfig::unwind_canonical_header` for more details + + --engine.storage-worker-count + Configure the number of storage proof workers in the Tokio blocking pool. If not specified, defaults to 2x available parallelism, clamped between 2 and 64 + + --engine.account-worker-count + Configure the number of account proof workers in the Tokio blocking pool. If not specified, defaults to the same count as storage workers + + --engine.enable-proof-v2 + Enable V2 storage proofs for state root calculations + + --engine.disable-cache-metrics + Disable cache metrics recording, which can take up to 50ms with large cached state + +ERA: + --era.enable + Enable import from ERA1 files + + --era.path + The path to a directory for import. + + The ERA1 files are read from the local directory parsing headers and bodies. + + --era.url + The URL to a remote host where the ERA1 files are hosted. + + The ERA1 files are read from the remote host using HTTP GET requests parsing headers + and bodies. + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +Rollup: + --rollup.sequencer + Endpoint for the sequencer mempool (can be both HTTP and WS) + + [aliases: --rollup.sequencer-http, --rollup.sequencer-ws] + + --rollup.disable-tx-pool-gossip + Disable transaction pool gossip + + --rollup.compute-pending-block + By default the pending block equals the latest block to save resources and not leak txs from the tx-pool, this flag enables computing of the pending block from the tx-pool instead. + + If `compute_pending_block` is not enabled, the payload builder will use the payload attributes from the latest block. Note that this flag is not yet functional. + + --rollup.discovery.v4 + enables discovery v4 if provided + + --rollup.enable-tx-conditional + Enable transaction conditional support on sequencer + + --rollup.supervisor-http + HTTP endpoint for the supervisor + + [default: http://localhost:1337/] + + --rollup.supervisor-safety-level + Safety level for the supervisor + + [default: CrossUnsafe] + + --rollup.sequencer-headers + Optional headers to use when connecting to the sequencer + + --rollup.historicalrpc + RPC endpoint for historical data + + --min-suggested-priority-fee + Minimum suggested priority fee (tip) in wei, default `1_000_000` + + [default: 1000000] + + --flashblocks-url + A URL pointing to a secure websocket subscription that streams out flashblocks. + + If given, the flashblocks are received to build pending block. All request with "pending" block tag will use the pending state based on flashblocks. + + --flashblock-consensus + Enable flashblock consensus client to drive the chain forward + + When enabled, the flashblock consensus client will process flashblock sequences and submit them to the engine API to advance the chain. Requires `flashblocks_url` to be set. + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/p2p.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/p2p.mdx new file mode 100644 index 00000000000..e98ea26a841 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/p2p.mdx @@ -0,0 +1,165 @@ +--- +title: "op-reth p2p" +--- + +P2P Debugging utilities + +```bash +$ op-reth p2p --help +``` +```txt +Usage: op-reth p2p [OPTIONS] + +Commands: + header Download block header + body Download block body + rlpx RLPx commands + bootnode Bootnode command + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/p2p/body.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/body.mdx new file mode 100644 index 00000000000..c8ca7a76f67 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/body.mdx @@ -0,0 +1,415 @@ +--- +title: "op-reth p2p body" +--- + +Download block body + +```bash +$ op-reth p2p body --help +``` +```txt +Usage: op-reth p2p body [OPTIONS] + +Options: + --retries + The number of retries per request + + [default: 5] + + -h, --help + Print help (see a summary with '-h') + +Networking: + -d, --disable-discovery + Disable the discovery service + + --disable-dns-discovery + Disable the DNS discovery + + --disable-discv4-discovery + Disable Discv4 discovery + + --enable-discv5-discovery + Enable Discv5 discovery + + --disable-nat + Disable Nat discovery + + --discovery.addr + The UDP address to use for devp2p peer discovery version 4 + + [default: 0.0.0.0] + + --discovery.port + The UDP port to use for devp2p peer discovery version 4 + + [default: 30303] + + --discovery.v5.addr + The UDP IPv4 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv4 + + --discovery.v5.addr.ipv6 + The UDP IPv6 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv6 + + --discovery.v5.port + The UDP IPv4 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv4, or `--discovery.v5.addr` is set + + [default: 9200] + + --discovery.v5.port.ipv6 + The UDP IPv6 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv6, or `--discovery.addr.ipv6` is set + + [default: 9200] + + --discovery.v5.lookup-interval + The interval in seconds at which to carry out periodic lookup queries, for the whole run of the program + + [default: 20] + + --discovery.v5.bootstrap.lookup-interval + The interval in seconds at which to carry out boost lookup queries, for a fixed number of times, at bootstrap + + [default: 5] + + --discovery.v5.bootstrap.lookup-countdown + The number of times to carry out boost lookup queries at bootstrap + + [default: 200] + + --trusted-peers + Comma separated enode URLs of trusted peers for P2P connections. + + --trusted-peers enode://abcd@192.168.0.1:30303 + + --trusted-only + Connect to or accept from trusted peers only + + --bootnodes + Comma separated enode URLs for P2P discovery bootstrap. + + Will fall back to a network-specific default if not specified. + + --dns-retries + Amount of DNS resolution requests retries to perform when peering + + [default: 0] + + --peers-file + The path to the known peers file. Connected peers are dumped to this file on nodes + shutdown, and read on startup. Cannot be used with `--no-persist-peers`. + + --identity + Custom node identity + + [default: reth/-/] + + --p2p-secret-key + Secret key to use for this node. + + This will also deterministically set the peer ID. If not specified, it will be set in the data dir for the chain being used. + + --p2p-secret-key-hex + Hex encoded secret key to use for this node. + + This will also deterministically set the peer ID. Cannot be used together with `--p2p-secret-key`. + + --no-persist-peers + Do not persist peers. + + --nat + NAT resolution method (any|none|upnp|publicip|extip:\) + + [default: any] + + --addr + Network listening address + + [default: 0.0.0.0] + + --port + Network listening port + + [default: 30303] + + --max-outbound-peers + Maximum number of outbound peers. default: 100 + + --max-inbound-peers + Maximum number of inbound peers. default: 30 + + --max-peers + Maximum number of total peers (inbound + outbound). + + Splits peers using approximately 2:1 inbound:outbound ratio. Cannot be used together with `--max-outbound-peers` or `--max-inbound-peers`. + + --max-tx-reqs + Max concurrent `GetPooledTransactions` requests. + + [default: 130] + + --max-tx-reqs-peer + Max concurrent `GetPooledTransactions` requests per peer. + + [default: 1] + + --max-seen-tx-history + Max number of seen transactions to remember per peer. + + Default is 320 transaction hashes. + + [default: 320] + + --max-pending-imports + Max number of transactions to import concurrently. + + [default: 4096] + + --pooled-tx-response-soft-limit + Experimental, for usage in research. Sets the max accumulated byte size of transactions + to pack in one response. + Spec'd at 2MiB. + + [default: 2097152] + + --pooled-tx-pack-soft-limit + Experimental, for usage in research. Sets the max accumulated byte size of transactions to + request in one request. + + Since `RLPx` protocol version 68, the byte size of a transaction is shared as metadata in a + transaction announcement (see `RLPx` specs). This allows a node to request a specific size + response. + + By default, nodes request only 128 KiB worth of transactions, but should a peer request + more, up to 2 MiB, a node will answer with more than 128 KiB. + + Default is 128 KiB. + + [default: 131072] + + --max-tx-pending-fetch + Max capacity of cache of hashes for transactions pending fetch. + + [default: 25600] + + --net-if.experimental + Name of network interface used to communicate with peers. + + If flag is set, but no value is passed, the default interface for docker `eth0` is tried. + + --tx-propagation-policy + Transaction Propagation Policy + + The policy determines which peers transactions are gossiped to. + + [default: All] + + --tx-ingress-policy + Transaction ingress policy + + Determines which peers' transactions are accepted over P2P. + + [default: All] + + --disable-tx-gossip + Disable transaction pool gossip + + Disables gossiping of transactions in the mempool to peers. This can be omitted for personal nodes, though providers should always opt to enable this flag. + + --tx-propagation-mode + Sets the transaction propagation mode by determining how new pending transactions are propagated to other peers in full. + + Examples: sqrt, all, max:10 + + [default: sqrt] + + --required-block-hashes + Comma separated list of required block hashes or block number=hash pairs. Peers that don't have these blocks will be filtered out. Format: hash or `block_number=hash` (e.g., 23115201=0x1234...) + + --network-id + Optional network ID to override the chain specification's network ID for P2P connections + + --netrestrict + Restrict network communication to the given IP networks (CIDR masks). + + Comma separated list of CIDR network specifications. Only peers with IP addresses within these ranges will be allowed to connect. + + Example: --netrestrict "192.168.0.0/16,10.0.0.0/8" + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use. + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + + + The block number or hash + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/p2p/bootnode.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/bootnode.mdx new file mode 100644 index 00000000000..8378eaa1332 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/bootnode.mdx @@ -0,0 +1,176 @@ +--- +title: "op-reth p2p bootnode" +--- + +Bootnode command + +```bash +$ op-reth p2p bootnode --help +``` +```txt +Usage: op-reth p2p bootnode [OPTIONS] + +Options: + --addr + Listen address for the bootnode (default: "0.0.0.0:30301") + + [default: 0.0.0.0:30301] + + --p2p-secret-key + Secret key to use for the bootnode. + + This will also deterministically set the peer ID. If a path is provided but no key exists at that path, a new random secret will be generated and stored there. If no path is specified, a new ephemeral random secret will be used. + + --nat + NAT resolution method (any|none|upnp|publicip|extip:\) + + [default: any] + + --v5 + Run a v5 topic discovery bootnode + + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/p2p/header.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/header.mdx new file mode 100644 index 00000000000..a58d0b29b78 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/header.mdx @@ -0,0 +1,415 @@ +--- +title: "op-reth p2p header" +--- + +Download block header + +```bash +$ op-reth p2p header --help +``` +```txt +Usage: op-reth p2p header [OPTIONS] + +Options: + --retries + The number of retries per request + + [default: 5] + + -h, --help + Print help (see a summary with '-h') + +Networking: + -d, --disable-discovery + Disable the discovery service + + --disable-dns-discovery + Disable the DNS discovery + + --disable-discv4-discovery + Disable Discv4 discovery + + --enable-discv5-discovery + Enable Discv5 discovery + + --disable-nat + Disable Nat discovery + + --discovery.addr + The UDP address to use for devp2p peer discovery version 4 + + [default: 0.0.0.0] + + --discovery.port + The UDP port to use for devp2p peer discovery version 4 + + [default: 30303] + + --discovery.v5.addr + The UDP IPv4 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv4 + + --discovery.v5.addr.ipv6 + The UDP IPv6 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv6 + + --discovery.v5.port + The UDP IPv4 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv4, or `--discovery.v5.addr` is set + + [default: 9200] + + --discovery.v5.port.ipv6 + The UDP IPv6 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv6, or `--discovery.addr.ipv6` is set + + [default: 9200] + + --discovery.v5.lookup-interval + The interval in seconds at which to carry out periodic lookup queries, for the whole run of the program + + [default: 20] + + --discovery.v5.bootstrap.lookup-interval + The interval in seconds at which to carry out boost lookup queries, for a fixed number of times, at bootstrap + + [default: 5] + + --discovery.v5.bootstrap.lookup-countdown + The number of times to carry out boost lookup queries at bootstrap + + [default: 200] + + --trusted-peers + Comma separated enode URLs of trusted peers for P2P connections. + + --trusted-peers enode://abcd@192.168.0.1:30303 + + --trusted-only + Connect to or accept from trusted peers only + + --bootnodes + Comma separated enode URLs for P2P discovery bootstrap. + + Will fall back to a network-specific default if not specified. + + --dns-retries + Amount of DNS resolution requests retries to perform when peering + + [default: 0] + + --peers-file + The path to the known peers file. Connected peers are dumped to this file on nodes + shutdown, and read on startup. Cannot be used with `--no-persist-peers`. + + --identity + Custom node identity + + [default: reth/-/] + + --p2p-secret-key + Secret key to use for this node. + + This will also deterministically set the peer ID. If not specified, it will be set in the data dir for the chain being used. + + --p2p-secret-key-hex + Hex encoded secret key to use for this node. + + This will also deterministically set the peer ID. Cannot be used together with `--p2p-secret-key`. + + --no-persist-peers + Do not persist peers. + + --nat + NAT resolution method (any|none|upnp|publicip|extip:\) + + [default: any] + + --addr + Network listening address + + [default: 0.0.0.0] + + --port + Network listening port + + [default: 30303] + + --max-outbound-peers + Maximum number of outbound peers. default: 100 + + --max-inbound-peers + Maximum number of inbound peers. default: 30 + + --max-peers + Maximum number of total peers (inbound + outbound). + + Splits peers using approximately 2:1 inbound:outbound ratio. Cannot be used together with `--max-outbound-peers` or `--max-inbound-peers`. + + --max-tx-reqs + Max concurrent `GetPooledTransactions` requests. + + [default: 130] + + --max-tx-reqs-peer + Max concurrent `GetPooledTransactions` requests per peer. + + [default: 1] + + --max-seen-tx-history + Max number of seen transactions to remember per peer. + + Default is 320 transaction hashes. + + [default: 320] + + --max-pending-imports + Max number of transactions to import concurrently. + + [default: 4096] + + --pooled-tx-response-soft-limit + Experimental, for usage in research. Sets the max accumulated byte size of transactions + to pack in one response. + Spec'd at 2MiB. + + [default: 2097152] + + --pooled-tx-pack-soft-limit + Experimental, for usage in research. Sets the max accumulated byte size of transactions to + request in one request. + + Since `RLPx` protocol version 68, the byte size of a transaction is shared as metadata in a + transaction announcement (see `RLPx` specs). This allows a node to request a specific size + response. + + By default, nodes request only 128 KiB worth of transactions, but should a peer request + more, up to 2 MiB, a node will answer with more than 128 KiB. + + Default is 128 KiB. + + [default: 131072] + + --max-tx-pending-fetch + Max capacity of cache of hashes for transactions pending fetch. + + [default: 25600] + + --net-if.experimental + Name of network interface used to communicate with peers. + + If flag is set, but no value is passed, the default interface for docker `eth0` is tried. + + --tx-propagation-policy + Transaction Propagation Policy + + The policy determines which peers transactions are gossiped to. + + [default: All] + + --tx-ingress-policy + Transaction ingress policy + + Determines which peers' transactions are accepted over P2P. + + [default: All] + + --disable-tx-gossip + Disable transaction pool gossip + + Disables gossiping of transactions in the mempool to peers. This can be omitted for personal nodes, though providers should always opt to enable this flag. + + --tx-propagation-mode + Sets the transaction propagation mode by determining how new pending transactions are propagated to other peers in full. + + Examples: sqrt, all, max:10 + + [default: sqrt] + + --required-block-hashes + Comma separated list of required block hashes or block number=hash pairs. Peers that don't have these blocks will be filtered out. Format: hash or `block_number=hash` (e.g., 23115201=0x1234...) + + --network-id + Optional network ID to override the chain specification's network ID for P2P connections + + --netrestrict + Restrict network communication to the given IP networks (CIDR masks). + + Comma separated list of CIDR network specifications. Only peers with IP addresses within these ranges will be allowed to connect. + + Example: --netrestrict "192.168.0.0/16,10.0.0.0/8" + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use. + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + + + The header number or hash + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/p2p/rlpx.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/rlpx.mdx new file mode 100644 index 00000000000..3cd932f3a96 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/rlpx.mdx @@ -0,0 +1,162 @@ +--- +title: "op-reth p2p rlpx" +--- + +RLPx commands + +```bash +$ op-reth p2p rlpx --help +``` +```txt +Usage: op-reth p2p rlpx [OPTIONS] + +Commands: + ping ping node + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/p2p/rlpx/ping.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/rlpx/ping.mdx new file mode 100644 index 00000000000..d749938421c --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/p2p/rlpx/ping.mdx @@ -0,0 +1,162 @@ +--- +title: "op-reth p2p rlpx ping" +--- + +ping node + +```bash +$ op-reth p2p rlpx ping --help +``` +```txt +Usage: op-reth p2p rlpx ping [OPTIONS] + +Arguments: + + The node to ping + +Options: + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/prune.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/prune.mdx new file mode 100644 index 00000000000..65665345dbd --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/prune.mdx @@ -0,0 +1,327 @@ +--- +title: "op-reth prune" +--- + +Prune according to the configuration without any limits + +```bash +$ op-reth prune --help +``` +```txt +Usage: op-reth prune [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/re-execute.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/re-execute.mdx new file mode 100644 index 00000000000..9432f2b7ee9 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/re-execute.mdx @@ -0,0 +1,341 @@ +--- +title: "op-reth re-execute" +--- + +Re-execute blocks in parallel to verify historical sync correctness + +```bash +$ op-reth re-execute --help +``` +```txt +Usage: op-reth re-execute [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --from + The height to start at + + [default: 1] + + --to + The height to end at. Defaults to the latest block + + --num-tasks + Number of tasks to run in parallel. Defaults to the number of available CPUs + + --skip-invalid-blocks + Continues with execution when an invalid block is encountered and collects these blocks + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage.mdx new file mode 100644 index 00000000000..f5dc1a8ef18 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage.mdx @@ -0,0 +1,165 @@ +--- +title: "op-reth stage" +--- + +Manipulate individual stages + +```bash +$ op-reth stage --help +``` +```txt +Usage: op-reth stage [OPTIONS] + +Commands: + run Run a single stage + drop Drop a stage's tables from the database + dump Dumps a stage from a range into a new database + unwind Unwinds a certain block range, deleting it from the database + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/drop.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/drop.mdx new file mode 100644 index 00000000000..8c0d998957c --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/drop.mdx @@ -0,0 +1,341 @@ +--- +title: "op-reth stage drop" +--- + +Drop a stage's tables from the database + +```bash +$ op-reth stage drop --help +``` +```txt +Usage: op-reth stage drop [OPTIONS] + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + + Possible values: + - headers: The headers stage within the pipeline + - bodies: The bodies stage within the pipeline + - senders: The senders stage within the pipeline + - execution: The execution stage within the pipeline + - account-hashing: The account hashing stage within the pipeline + - storage-hashing: The storage hashing stage within the pipeline + - hashing: The account and storage hashing stages within the pipeline + - merkle: The merkle stage within the pipeline + - tx-lookup: The transaction lookup stage within the pipeline + - account-history: The account history stage within the pipeline + - storage-history: The storage history stage within the pipeline + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump.mdx new file mode 100644 index 00000000000..79f6ed94026 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump.mdx @@ -0,0 +1,334 @@ +--- +title: "op-reth stage dump" +--- + +Dumps a stage from a range into a new database + +```bash +$ op-reth stage dump --help +``` +```txt +Usage: op-reth stage dump [OPTIONS] + +Commands: + execution Execution stage + storage-hashing `StorageHashing` stage + account-hashing `AccountHashing` stage + merkle Merkle stage + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/account-hashing.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/account-hashing.mdx new file mode 100644 index 00000000000..cf3ef597ee4 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/account-hashing.mdx @@ -0,0 +1,180 @@ +--- +title: "op-reth stage dump account-hashing" +--- + +`AccountHashing` stage + +```bash +$ op-reth stage dump account-hashing --help +``` +```txt +Usage: op-reth stage dump account-hashing [OPTIONS] --output-datadir --from --to + +Options: + --output-datadir + The path to the new datadir folder. + + -f, --from + From which block + + -t, --to + To which block + + -d, --dry-run + If passed, it will dry-run a stage execution from the newly created database right after dumping + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/execution.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/execution.mdx new file mode 100644 index 00000000000..71580395b7e --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/execution.mdx @@ -0,0 +1,180 @@ +--- +title: "op-reth stage dump execution" +--- + +Execution stage + +```bash +$ op-reth stage dump execution --help +``` +```txt +Usage: op-reth stage dump execution [OPTIONS] --output-datadir --from --to + +Options: + --output-datadir + The path to the new datadir folder. + + -f, --from + From which block + + -t, --to + To which block + + -d, --dry-run + If passed, it will dry-run a stage execution from the newly created database right after dumping + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/merkle.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/merkle.mdx new file mode 100644 index 00000000000..d6c425376de --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/merkle.mdx @@ -0,0 +1,180 @@ +--- +title: "op-reth stage dump merkle" +--- + +Merkle stage + +```bash +$ op-reth stage dump merkle --help +``` +```txt +Usage: op-reth stage dump merkle [OPTIONS] --output-datadir --from --to + +Options: + --output-datadir + The path to the new datadir folder. + + -f, --from + From which block + + -t, --to + To which block + + -d, --dry-run + If passed, it will dry-run a stage execution from the newly created database right after dumping + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/storage-hashing.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/storage-hashing.mdx new file mode 100644 index 00000000000..35feae2f2fc --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/dump/storage-hashing.mdx @@ -0,0 +1,180 @@ +--- +title: "op-reth stage dump storage-hashing" +--- + +`StorageHashing` stage + +```bash +$ op-reth stage dump storage-hashing --help +``` +```txt +Usage: op-reth stage dump storage-hashing [OPTIONS] --output-datadir --from --to + +Options: + --output-datadir + The path to the new datadir folder. + + -f, --from + From which block + + -t, --to + To which block + + -d, --dry-run + If passed, it will dry-run a stage execution from the newly created database right after dumping + + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/run.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/run.mdx new file mode 100644 index 00000000000..9f5134f0039 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/run.mdx @@ -0,0 +1,588 @@ +--- +title: "op-reth stage run" +--- + +Run a single stage. + +```bash +$ op-reth stage run --help +``` +```txt +Usage: op-reth stage run [OPTIONS] --from --to + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --metrics + Enable Prometheus metrics. + + The metrics will be served at the given interface and port. + + --from + The height to start at + + -t, --to + The end of the stage + + --batch-size + Batch size for stage execution and unwind + + -s, --skip-unwind + Normally, running the stage requires unwinding for stages that already have been run, in order to not rewrite to the same database slots. + + You can optionally skip the unwinding phase if you're syncing a block range that has not been synced before. + + -c, --commit + Commits the changes in the database. WARNING: potentially destructive. + + Useful when you want to run diagnostics on the database. + + NOTE: This flag is currently required for the headers, bodies, and execution stages because they use static files and must commit to properly unwind and run. + + --checkpoints + Save stage checkpoints + + + The name of the stage to run + + Possible values: + - headers: The headers stage within the pipeline + - bodies: The bodies stage within the pipeline + - senders: The senders stage within the pipeline + - execution: The execution stage within the pipeline + - account-hashing: The account hashing stage within the pipeline + - storage-hashing: The storage hashing stage within the pipeline + - hashing: The account and storage hashing stages within the pipeline + - merkle: The merkle stage within the pipeline + - tx-lookup: The transaction lookup stage within the pipeline + - account-history: The account history stage within the pipeline + - storage-history: The storage history stage within the pipeline + +Networking: + -d, --disable-discovery + Disable the discovery service + + --disable-dns-discovery + Disable the DNS discovery + + --disable-discv4-discovery + Disable Discv4 discovery + + --enable-discv5-discovery + Enable Discv5 discovery + + --disable-nat + Disable Nat discovery + + --discovery.addr + The UDP address to use for devp2p peer discovery version 4 + + [default: 0.0.0.0] + + --discovery.port + The UDP port to use for devp2p peer discovery version 4 + + [default: 30303] + + --discovery.v5.addr + The UDP IPv4 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv4 + + --discovery.v5.addr.ipv6 + The UDP IPv6 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv6 + + --discovery.v5.port + The UDP IPv4 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv4, or `--discovery.v5.addr` is set + + [default: 9200] + + --discovery.v5.port.ipv6 + The UDP IPv6 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv6, or `--discovery.addr.ipv6` is set + + [default: 9200] + + --discovery.v5.lookup-interval + The interval in seconds at which to carry out periodic lookup queries, for the whole run of the program + + [default: 20] + + --discovery.v5.bootstrap.lookup-interval + The interval in seconds at which to carry out boost lookup queries, for a fixed number of times, at bootstrap + + [default: 5] + + --discovery.v5.bootstrap.lookup-countdown + The number of times to carry out boost lookup queries at bootstrap + + [default: 200] + + --trusted-peers + Comma separated enode URLs of trusted peers for P2P connections. + + --trusted-peers enode://abcd@192.168.0.1:30303 + + --trusted-only + Connect to or accept from trusted peers only + + --bootnodes + Comma separated enode URLs for P2P discovery bootstrap. + + Will fall back to a network-specific default if not specified. + + --dns-retries + Amount of DNS resolution requests retries to perform when peering + + [default: 0] + + --peers-file + The path to the known peers file. Connected peers are dumped to this file on nodes + shutdown, and read on startup. Cannot be used with `--no-persist-peers`. + + --identity + Custom node identity + + [default: reth/-/] + + --p2p-secret-key + Secret key to use for this node. + + This will also deterministically set the peer ID. If not specified, it will be set in the data dir for the chain being used. + + --p2p-secret-key-hex + Hex encoded secret key to use for this node. + + This will also deterministically set the peer ID. Cannot be used together with `--p2p-secret-key`. + + --no-persist-peers + Do not persist peers. + + --nat + NAT resolution method (any|none|upnp|publicip|extip:\) + + [default: any] + + --addr + Network listening address + + [default: 0.0.0.0] + + --port + Network listening port + + [default: 30303] + + --max-outbound-peers + Maximum number of outbound peers. default: 100 + + --max-inbound-peers + Maximum number of inbound peers. default: 30 + + --max-peers + Maximum number of total peers (inbound + outbound). + + Splits peers using approximately 2:1 inbound:outbound ratio. Cannot be used together with `--max-outbound-peers` or `--max-inbound-peers`. + + --max-tx-reqs + Max concurrent `GetPooledTransactions` requests. + + [default: 130] + + --max-tx-reqs-peer + Max concurrent `GetPooledTransactions` requests per peer. + + [default: 1] + + --max-seen-tx-history + Max number of seen transactions to remember per peer. + + Default is 320 transaction hashes. + + [default: 320] + + --max-pending-imports + Max number of transactions to import concurrently. + + [default: 4096] + + --pooled-tx-response-soft-limit + Experimental, for usage in research. Sets the max accumulated byte size of transactions + to pack in one response. + Spec'd at 2MiB. + + [default: 2097152] + + --pooled-tx-pack-soft-limit + Experimental, for usage in research. Sets the max accumulated byte size of transactions to + request in one request. + + Since `RLPx` protocol version 68, the byte size of a transaction is shared as metadata in a + transaction announcement (see `RLPx` specs). This allows a node to request a specific size + response. + + By default, nodes request only 128 KiB worth of transactions, but should a peer request + more, up to 2 MiB, a node will answer with more than 128 KiB. + + Default is 128 KiB. + + [default: 131072] + + --max-tx-pending-fetch + Max capacity of cache of hashes for transactions pending fetch. + + [default: 25600] + + --net-if.experimental + Name of network interface used to communicate with peers. + + If flag is set, but no value is passed, the default interface for docker `eth0` is tried. + + --tx-propagation-policy + Transaction Propagation Policy + + The policy determines which peers transactions are gossiped to. + + [default: All] + + --tx-ingress-policy + Transaction ingress policy + + Determines which peers' transactions are accepted over P2P. + + [default: All] + + --disable-tx-gossip + Disable transaction pool gossip + + Disables gossiping of transactions in the mempool to peers. This can be omitted for personal nodes, though providers should always opt to enable this flag. + + --tx-propagation-mode + Sets the transaction propagation mode by determining how new pending transactions are propagated to other peers in full. + + Examples: sqrt, all, max:10 + + [default: sqrt] + + --required-block-hashes + Comma separated list of required block hashes or block number=hash pairs. Peers that don't have these blocks will be filtered out. Format: hash or `block_number=hash` (e.g., 23115201=0x1234...) + + --network-id + Optional network ID to override the chain specification's network ID for P2P connections + + --netrestrict + Restrict network communication to the given IP networks (CIDR masks). + + Comma separated list of CIDR network specifications. Only peers with IP addresses within these ranges will be allowed to connect. + + Example: --netrestrict "192.168.0.0/16,10.0.0.0/8" + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind.mdx new file mode 100644 index 00000000000..e32a508e7ba --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind.mdx @@ -0,0 +1,335 @@ +--- +title: "op-reth stage unwind" +--- + +Unwinds a certain block range, deleting it from the database + +```bash +$ op-reth stage unwind --help +``` +```txt +Usage: op-reth stage unwind [OPTIONS] + +Commands: + to-block Unwinds the database from the latest block, until the given block number or hash has been reached, that block is not included + num-blocks Unwinds the database from the latest block, until the given number of blocks have been reached + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --datadir + The path to the data dir for all reth files and subdirectories. + + Defaults to the OS-specific data directory: + + - Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/` + - Windows: `{FOLDERID_RoamingAppData}/reth/` + - macOS: `$HOME/Library/Application Support/reth/` + + [default: default] + + --datadir.static-files + The absolute path to store static files in. + + --datadir.rocksdb + The absolute path to store `RocksDB` database in. + + --datadir.pprof-dumps + The absolute path to store pprof dumps in. + + --config + The path to the configuration file to use + + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Database: + --db.log-level + Database logging level. Levels higher than "notice" require a debug build + + Possible values: + - fatal: Enables logging for critical conditions, i.e. assertion failures + - error: Enables logging for error conditions + - warn: Enables logging for warning conditions + - notice: Enables logging for normal but significant condition + - verbose: Enables logging for verbose informational + - debug: Enables logging for debug-level messages + - trace: Enables logging for trace debug-level messages + - extra: Enables logging for extra debug-level messages + + --db.exclusive + Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume + + [possible values: true, false] + + --db.max-size + Maximum database size (e.g., 4TB, 8TB). + + This sets the "map size" of the database. If the database grows beyond this limit, the node will stop with an "environment map size limit reached" error. + + The default value is 8TB. + + --db.page-size + Database page size (e.g., 4KB, 8KB, 16KB). + + Specifies the page size used by the MDBX database. + + The page size determines the maximum database size. MDBX supports up to 2^31 pages, so with the default 4KB page size, the maximum database size is 8TB. To allow larger databases, increase this value to 8KB or higher. + + WARNING: This setting is only configurable at database creation; changing it later requires re-syncing. + + --db.growth-step + Database growth step (e.g., 4GB, 4KB) + + --db.read-transaction-timeout + Read transaction timeout in seconds, 0 means no timeout + + --db.max-readers + Maximum number of readers allowed to access the database concurrently + + --db.sync-mode + Controls how aggressively the database synchronizes data to disk + +Static Files: + --static-files.blocks-per-file.headers + Number of blocks per file for the headers segment + + --static-files.blocks-per-file.transactions + Number of blocks per file for the transactions segment + + --static-files.blocks-per-file.receipts + Number of blocks per file for the receipts segment + + --static-files.blocks-per-file.transaction-senders + Number of blocks per file for the transaction senders segment + + --static-files.blocks-per-file.account-change-sets + Number of blocks per file for the account changesets segment + + --static-files.blocks-per-file.storage-change-sets + Number of blocks per file for the storage changesets segment + + --static-files.receipts + Store receipts in static files instead of the database. + + When enabled, receipts will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.transaction-senders + Store transaction senders in static files instead of the database. + + When enabled, transaction senders will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.account-change-sets + Store account changesets in static files. + + When enabled, account changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + + --static-files.storage-change-sets + Store storage changesets in static files. + + When enabled, storage changesets will be written to static files on disk instead of the database. + + Note: This setting can only be configured at genesis initialization. Once the node has been initialized, changing this flag requires re-syncing from scratch. + + [default: false] + [possible values: true, false] + +RocksDB: + --rocksdb.all + Route all supported tables to `RocksDB` instead of MDBX. + + This enables `RocksDB` for `tx-hash`, `storages-history`, and `account-history` tables. Cannot be combined with individual flags set to false. + + --rocksdb.tx-hash + Route tx hash -> number table to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.storages-history + Route storages history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --rocksdb.account-history + Route account history tables to `RocksDB` instead of MDBX. + + This is a genesis-initialization-only flag: changing it after genesis requires a re-sync. Defaults to `true` when the `edge` feature is enabled, `false` otherwise. + + [default: false] + [possible values: true, false] + + --offline + If this is enabled, then all stages except headers, bodies, and sender recovery will be unwound + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind/num-blocks.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind/num-blocks.mdx new file mode 100644 index 00000000000..3c3850e1da5 --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind/num-blocks.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth stage unwind num-blocks" +--- + +Unwinds the database from the latest block, until the given number of blocks have been reached + +```bash +$ op-reth stage unwind num-blocks --help +``` +```txt +Usage: op-reth stage unwind num-blocks [OPTIONS] + +Arguments: + + + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind/to-block.mdx b/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind/to-block.mdx new file mode 100644 index 00000000000..e4487448d9d --- /dev/null +++ b/docs/public-docs/rust/op-reth/cli/op-reth/stage/unwind/to-block.mdx @@ -0,0 +1,172 @@ +--- +title: "op-reth stage unwind to-block" +--- + +Unwinds the database from the latest block, until the given block number or hash has been reached, that block is not included + +```bash +$ op-reth stage unwind to-block --help +``` +```txt +Usage: op-reth stage unwind to-block [OPTIONS] + +Arguments: + + + +Options: + -h, --help + Print help (see a summary with '-h') + +Datadir: + --chain + The chain this node is running. + Possible values are either a built-in chain or the path to a chain specification file. + + Built-in chains: + optimism, optimism_sepolia, optimism-sepolia, base, base_sepolia, base-sepolia, arena-z, arena-z-sepolia, automata, base-devnet-0-sepolia-dev-0, bob, boba-sepolia, boba, camp-sepolia, celo, creator-chain-testnet-sepolia, cyber, cyber-sepolia, ethernity, ethernity-sepolia, fraxtal, funki, funki-sepolia, hashkeychain, ink, ink-sepolia, lisk, lisk-sepolia, lyra, metal, metal-sepolia, mint, mode, mode-sepolia, oplabs-devnet-0-sepolia-dev-0, orderly, ozean-sepolia, pivotal-sepolia, polynomial, race, race-sepolia, radius_testnet-sepolia, redstone, rehearsal-0-bn-0-rehearsal-0-bn, rehearsal-0-bn-1-rehearsal-0-bn, settlus-mainnet, settlus-sepolia-sepolia, shape, shape-sepolia, silent-data-mainnet, snax, soneium, soneium-minato-sepolia, sseed, swan, swell, tbn, tbn-sepolia, unichain, unichain-sepolia, worldchain, worldchain-sepolia, xterio-eth, zora, zora-sepolia, dev + + [default: optimism] + +Logging: + --log.stdout.format + The format to use for logs written to stdout + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.stdout.filter + The filter to use for logs written to stdout + + [default: ] + + --log.file.format + The format to use for logs written to the log file + + Possible values: + - json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging + - log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications + - terminal: Represents terminal-friendly formatting for logs + + [default: terminal] + + --log.file.filter + The filter to use for logs written to the log file + + [default: debug] + + --log.file.directory + The path to put log files in + + [default: /logs] + + --log.file.name + The prefix name of the log files + + [default: reth.log] + + --log.file.max-size + The maximum size (in MB) of one log file + + [default: 200] + + --log.file.max-files + The maximum amount of log files that will be stored. If set to 0, background file logging is disabled + + [default: 5] + + --log.journald + Write logs to journald + + --log.journald.filter + The filter to use for logs written to journald + + [default: error] + + --color + Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting + + Possible values: + - always: Colors on + - auto: Auto-detect + - never: Colors off + + [default: always] + + --logs-otlp[=] + Enable `Opentelemetry` logs export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/logs` - gRPC: `http://localhost:4317` + + Example: --logs-otlp=http://collector:4318/v1/logs + + [env: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=] + + --logs-otlp.filter + Set a filter directive for the OTLP logs exporter. This controls the verbosity of logs sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --logs-otlp.filter=info,reth=debug + + Defaults to INFO if not specified. + + [default: info] + +Display: + -v, --verbosity... + Set the minimum log level. + + -v Errors + -vv Warnings + -vvv Info + -vvvv Debug + -vvvvv Traces (warning: very verbose!) + + -q, --quiet + Silence all log output + +Tracing: + --tracing-otlp[=] + Enable `Opentelemetry` tracing export to an OTLP endpoint. + + If no value provided, defaults based on protocol: - HTTP: `http://localhost:4318/v1/traces` - gRPC: `http://localhost:4317` + + Example: --tracing-otlp=http://collector:4318/v1/traces + + [env: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=] + + --tracing-otlp-protocol + OTLP transport protocol to use for exporting traces and logs. + + - `http`: expects endpoint path to end with `/v1/traces` or `/v1/logs` - `grpc`: expects endpoint without a path + + Defaults to HTTP if not specified. + + Possible values: + - http: HTTP/Protobuf transport, port 4318, requires `/v1/traces` path + - grpc: gRPC transport, port 4317 + + [env: OTEL_EXPORTER_OTLP_PROTOCOL=] + [default: http] + + --tracing-otlp.filter + Set a filter directive for the OTLP tracer. This controls the verbosity of spans and events sent to the OTLP endpoint. It follows the same syntax as the `RUST_LOG` environment variable. + + Example: --tracing-otlp.filter=info,reth=debug,hyper_util=off + + Defaults to TRACE if not specified. + + [default: debug] + + --tracing-otlp.sample-ratio + Trace sampling ratio to control the percentage of traces to export. + + Valid range: 0.0 to 1.0 - 1.0, default: Sample all traces - 0.01: Sample 1% of traces - 0.0: Disable sampling + + Example: --tracing-otlp.sample-ratio=0.0. + + [env: OTEL_TRACES_SAMPLER_ARG=] +``` \ No newline at end of file diff --git a/docs/public-docs/rust/op-reth/index.mdx b/docs/public-docs/rust/op-reth/index.mdx new file mode 100644 index 00000000000..83e04718df9 --- /dev/null +++ b/docs/public-docs/rust/op-reth/index.mdx @@ -0,0 +1,22 @@ +--- +title: "op-reth" +--- + +--- +description: op-reth is the OP Stack execution client built on reth. +--- + + +`op-reth` is the [OP Stack](https://docs.optimism.io/) execution client built on [reth](https://github.com/paradigmxyz/reth). It provides a high-performance execution layer for Optimism and all OP Stack chains. + +## Features + +- **Full OP Stack support** — Deposit transactions, L2-specific fee handling, and all OP Stack protocol changes. +- **Superchain Registry** — Built-in support for all chains in the [superchain registry](https://github.com/ethereum-optimism/superchain-registry). Use `--chain unichain`, `--chain base`, etc. +- **High performance** — Built on reth's modular architecture with parallelized execution and efficient storage. + +## Getting started + +- [Running op-reth on OP Stack chains](/rust/op-reth/run/opstack) — Install and run op-reth with a rollup node. +- [Sync OP Mainnet](/rust/op-reth/run/faq/sync-op-mainnet) — Import Bedrock state and sync OP Mainnet from scratch. +- [CLI Reference](/rust/op-reth/cli/op-reth) — Full command-line reference for op-reth. diff --git a/docs/public-docs/rust/op-reth/run/faq/sync-op-mainnet.mdx b/docs/public-docs/rust/op-reth/run/faq/sync-op-mainnet.mdx new file mode 100644 index 00000000000..587c0f70db1 --- /dev/null +++ b/docs/public-docs/rust/op-reth/run/faq/sync-op-mainnet.mdx @@ -0,0 +1,110 @@ +--- +title: "Sync OP Mainnet" +--- + +--- +description: Syncing Reth with OP Mainnet and Bedrock state. +--- + + +To sync OP mainnet, Bedrock state needs to be imported as a starting point. There are currently two ways: + +- Minimal bootstrap **(recommended)**: only state snapshot at Bedrock block is imported without any OVM historical data. +- Full bootstrap **(not recommended)**: state, blocks and receipts are imported. + +## Minimal bootstrap (recommended) + +**The state snapshot at Bedrock block is required.** It can be exported from [op-geth](https://github.com/testinprod-io/op-erigon/blob/pcw109550/bedrock-db-migration/bedrock-migration.md#export-state) (**.jsonl**) or downloaded directly from [here](https://mega.nz/file/GdZ1xbAT#a9cBv3AqzsTGXYgX7nZc_3fl--tcBmOAIwIA5ND6kwc). + +### 1. Download and decompress + +After you downloaded the state file, ensure the state file is decompressed into **.jsonl** format: + +```sh +$ unzstd /path/to/world_trie_state.jsonl.zstd +``` + +### 2. Import the state + +Import the state snapshot: + +```sh +$ op-reth init-state --without-ovm --chain optimism --datadir op-mainnet world_trie_state.jsonl +``` + +### 3. Sync from Bedrock to tip + +Running the node with `--debug.tip ` syncs the node without help from CL until a fixed tip. The +block hash can be taken from the latest block on [https://optimistic.etherscan.io](https://optimistic.etherscan.io). + +Eg, sync the node to a recent finalized block (e.g. 125200000) to catch up close to the tip, before pairing with op-node. + +```sh +$ op-reth node --chain optimism --datadir op-mainnet --debug.tip 0x098f87b75c8b861c775984f9d5dbe7b70cbbbc30fc15adb03a5044de0144f2d0 # block #125200000 +``` + +## Full bootstrap (not recommended) + +**Not recommended for now**: [storage consistency issue](https://github.com/paradigmxyz/reth/pull/11099) tldr: sudden crash may break the node. + +### Import state + +To sync OP mainnet, the Bedrock datadir needs to be imported to use as starting point. +Blocks lower than the OP mainnet Bedrock fork, are built on the OVM and cannot be executed on the EVM. +For this reason, the chain segment from genesis until Bedrock, must be manually imported to circumvent +execution in reth's sync pipeline. + +Importing OP mainnet Bedrock datadir requires exported data: + +- Blocks [and receipts] below Bedrock +- State snapshot at first Bedrock block + +### Manual Export Steps + +The `op-geth` Bedrock datadir can be downloaded from [https://datadirs.optimism.io](https://datadirs.optimism.io). + +To export the OVM chain from `op-geth`, clone the `testinprod-io/op-geth` repo and checkout +[testinprod-io/op-geth#1](https://github.com/testinprod-io/op-geth/pull/1). Commands to export blocks, receipts and state dump can be +found in `op-geth/migrate.sh`. + +### Manual Import Steps + +#### 1. Import Blocks + +Imports a `.rlp` file of blocks. + +Import of >100 million OVM blocks, from genesis to Bedrock, completes in 45 minutes. + +```bash +$ op-reth import-op --chain optimism +``` + +#### 2. Import Receipts + +This step is optional. To run a full node, skip this step. If however receipts are to be imported, the +corresponding transactions must already be imported (see [step 1](#1-import-blocks)). + +Imports a `.rlp` file of receipts, that has been exported with command specified in +[testinprod-io/op-geth#1](https://github.com/testinprod-io/op-geth/pull/1) (command for exporting receipts uses custom RLP-encoding). + +Import of >100 million OVM receipts, from genesis to Bedrock, completes in 30 minutes. + +```bash +$ op-reth import-receipts-op --chain optimism +``` + +#### 3. Import State + +Imports a `.jsonl` state dump. The block at which the state dump is made, must be the latest block in +reth's database. This should be block 105 235 063, the first Bedrock block (see [step 1](#1-import-blocks)). + +Import of >4 million OP mainnet accounts at Bedrock, completes in 10 minutes. + +```bash +$ op-reth init-state --chain optimism +``` + +### Start with op-node + +Use `op-node` to track the tip. Start `op-node` with `--syncmode=execution-layer` and `--l2.enginekind=reth`. If `op-node`'s RPC +connection to L1 is over localhost, `--l1.trustrpc` can be set to improve performance. diff --git a/docs/public-docs/rust/op-reth/run/opstack.mdx b/docs/public-docs/rust/op-reth/run/opstack.mdx new file mode 100644 index 00000000000..46567cbb72d --- /dev/null +++ b/docs/public-docs/rust/op-reth/run/opstack.mdx @@ -0,0 +1,119 @@ +--- +title: "Running op-reth on OP Stack chains" +--- + +--- +description: Running op-reth on Optimism and OP Stack chains. +--- + + +`op-reth` is the OP Stack execution client built on [reth][reth]. It supports OP Stack chains out of the box. Optimism has a small diff from the [L1 EELS][l1-el-spec], +comprising of the following key changes: + +1. A new transaction type, [`0x7E (Deposit)`][deposit-spec], which is used to deposit funds from L1 to L2. +1. Modifications to the `PayloadAttributes` that allow the [sequencer][sequencer] to submit transactions to the EL through the Engine API. Payloads will be built with deposit transactions at the top of the block, + with the first deposit transaction always being the "L1 Info Transaction." +1. [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) denominator and elasticity parameters have been adjusted to account for the lower block time (2s) on L2. Otherwise, the 1559 formula remains the same. +1. Network fees are distributed to the various [fee vaults][l2-el-spec]. +1. ... and some other minor changes. + +For a more in-depth list of changes and their rationale, as well as specifics about the OP Stack specification such as transaction ordering and more, see the documented [`op-geth` diff][op-geth-forkdiff], +the [L2 EL specification][l2-el-spec], and the [OP Stack specification][op-stack-spec]. + +### Superchain Registry + +Since 1.4.0 op-reth has built in support for all chains in the [superchain registry][superchain-registry]. All superchains are supported by the `--chain` argument, e.g. `--chain unichain` or `--chain unichain-sepolia`. + +## Running on Optimism + +You will need three things to run `op-reth`: + +1. An archival L1 node, synced to the settlement layer of the OP Stack chain you want to sync (e.g. `reth`, `geth`, `besu`, `nethermind`, etc.) +1. A rollup node (e.g. `op-node`, `magi`, `hildr`, etc.) +1. An instance of `op-reth`. + +For this example, we'll start a `Base Mainnet` node. + +### Installing `op-reth` + +To install `op-reth` via the `Makefile` in the workspace root: + +```sh +git clone https://github.com/ethereum-optimism/optimism.git && \ + cd optimism/op-reth && \ + make install +``` + +This will install the `op-reth` binary to `~/.cargo/bin/op-reth`. + +### Installing a Rollup Node + +Next, you'll need to install a [Rollup Node][rollup-node-spec], which is the equivalent to the Consensus Client on the OP Stack. Available options include: + +1. [`op-node`][op-node] +1. [`magi`][magi] +1. [`hildr`][hildr] + +For the sake of this tutorial, we'll use the reference implementation of the Rollup Node maintained by OP Labs, the `op-node`. The `op-node` can be built from source, or pulled from a [Docker image available on Google Cloud][op-node-docker]. + +### Running `op-reth` + +op-reth supports additional OP Stack specific CLI arguments: + +1. `--rollup.sequencer ` - The sequencer endpoint to connect to. Transactions sent to the `op-reth` EL are also forwarded to this sequencer endpoint for inclusion, as the sequencer is the entity that builds blocks on OP Stack chains. Aliases: `--rollup.sequencer-http`, `--rollup.sequencer-ws`. +1. `--rollup.disable-tx-pool-gossip` - Disables gossiping of transactions in the mempool to peers. This can be omitted for personal nodes, though providers should always opt to enable this flag. +1. `--rollup.discovery.v4` - Enables the discovery v4 protocol for peer discovery. By default, op-reth, similar to op-geth, has discovery v5 enabled and discovery v4 disabled, whereas regular reth has discovery v4 enabled and discovery v5 disabled. +1. `--rollup.compute-pending-block` - Enables computing of the pending block from the tx-pool instead of using the latest block. By default the pending block equals the latest block to save resources and not leak txs from the tx-pool. +1. `--rollup.enable-tx-conditional` - Enable transaction conditional support on sequencer. +1. `--rollup.supervisor-http ` - HTTP endpoint for the interop supervisor. +1. `--rollup.supervisor-safety-level ` - Safety level for the supervisor (default: `CrossUnsafe`). +1. `--rollup.sequencer-headers ` - Optional headers to use when connecting to the sequencer. Requires `--rollup.sequencer`. +1. `--rollup.historicalrpc ` - RPC endpoint for historical data. Alias: `--rollup.historical-rpc`. +1. `--min-suggested-priority-fee ` - Minimum suggested priority fee (tip) in wei (default: `1000000`). +1. `--flashblocks-url ` - A URL pointing to a secure websocket subscription that streams out flashblocks. If given, the flashblocks are received to build pending block. +1. `--flashblock-consensus` - Enable flashblock consensus client to drive the chain forward. Requires `--flashblocks-url`. + +First, ensure that your L1 archival node is running and synced to tip. Also make sure that the beacon node / consensus layer client is running and has http APIs enabled. Then, start `op-reth` with the `--rollup.sequencer` flag set to the `Base Mainnet` sequencer endpoint: + +```sh +op-reth node \ + --chain base \ + --rollup.sequencer https://mainnet-sequencer.base.org \ + --http \ + --ws \ + --authrpc.port 9551 \ + --authrpc.jwtsecret /path/to/jwt.hex +``` + +Then, once `op-reth` has been started, start up the `op-node`: + +```sh +op-node \ + --network="base-mainnet" \ + --l1= \ + --l2=http://localhost:9551 \ + --l2.jwt-secret=/path/to/jwt.hex \ + --rpc.addr=0.0.0.0 \ + --rpc.port=7000 \ + --l1.beacon= \ + --syncmode=execution-layer \ + --l2.enginekind=reth +``` + +Consider adding the `--l1.trustrpc` flag to improve performance, if the connection to l1 is over localhost. + +[l1-el-spec]: https://github.com/ethereum/execution-specs +[rollup-node-spec]: https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/rollup-node.md +[op-geth-forkdiff]: https://op-geth.optimism.io +[sequencer]: https://github.com/ethereum-optimism/specs/blob/main/specs/background.md#sequencers +[op-stack-spec]: https://github.com/ethereum-optimism/specs/blob/main/specs +[l2-el-spec]: https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/exec-engine.md +[deposit-spec]: https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/deposits.md +[derivation-spec]: https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/derivation.md +[superchain-registry]: https://github.com/ethereum-optimism/superchain-registry +[op-node-docker]: https://console.cloud.google.com/artifacts/docker/us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node +[reth]: https://github.com/paradigmxyz/reth +[optimism]: https://github.com/ethereum-optimism/optimism +[op-node]: https://github.com/ethereum-optimism/optimism/tree/develop/op-node +[magi]: https://github.com/a16z/magi +[hildr]: https://github.com/optimism-java/hildr diff --git a/docs/security-reviews/2026_03-Kona-Spearbit.pdf b/docs/security-reviews/2026_03-Kona-Spearbit.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8e4e79033886c2100e181730b288e4a11f0749ba GIT binary patch literal 741446 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 |yZ2FIq_T_{n;)3n)wCk@H54mO2^X zZ#m}%?QgGR-pP#Nu%WI6ST?|#tJ=EXr1tA-D{8I?Tx^XkC#P;KJe|1HYiKBU>>F2V zk4R&iGFQe$c!1J{YY@+s+?r3cD+6ZlH)1o!ZvcST;09D|zP2y*37~v!*?m1k?9Ezb zCTb^W<>ZO-8J(dgdk$2z zOeZRfN7d}+fT`8I7WpRj|UBul02Rbq;6??@ZC24>tFo~|TI<+kP(H9}QFuTn)&Vi98D)ry$a9 zIXVm+^+gTa$@8^| zJNoo-v;&ZHe4-V^Jm3Y`MX(@t#*1k8I{FdYAw}%!2{uGP?qF;Sv+LAH{lCCNl6?xu zo-+^zbwpP< z!L1I=KZYq8@e>)=5R5E9tOX(-!=Q?@1c}v8D$arjxL}-5?f~>CO$sl8%zZU0Bo!VT8nwX~;a!u(xZ(Y^DB}BUTn6oM^1?G@hD4RwI|76Elg##NCJmQG=6M z0V0Bw%$;A~8%Cr&P{}|LPKo6XAeUYQk@y2qXr8)rx=w8+h_6;qI;q`(^bMHxBdz`! zC?F8c9rBASF^*US$(QLpYs!;^FyuO^1Z@&BT7(0i*;?OPSXb`nbo>oe9S&g(q%^f< zXvPmh0JMMvW2ufLaR8EUC~TfYn8mddh2Zo}UMd!09OSgc;)HlhA=Gt&wVyh)d4Meu zNwx6Wred$yS`S%BO_Z4WGjbfp1jKkRF}f{xh@3LbYxp`bSg;O9{0fqOLTl13g)=qr z_kkbY-as&Uf_VSCox;ripLWXsQMwW{1IK^0Lr%1$0VEButxsyx_-5g&@B|FAr<|^ZPp+5KCvajI9 zOr49ZNt>6%!Tn}yKLdI0UGl$0TII^BCw@+m32eh#tp^1Z_qnOha_KO)eQUgsJ+GTC z)v~JR1x?meQ@}3NetQCW1GD_nb#R+V@2!*M$1W7?IEiv9MM|k?brW~nnIbBRn*wXZ zYnm!C0xaY{YX3(7m*f>jhZSuV)-72+bQUj2-tvgkWDTWFty6&vb$YCLBfh~!&4rm}lecYvEFXhbl zS1?y`IHGcv!tivfUYj!GXQhI8iI0wycdBms1(g1l&lrKS)apGRVC0rELXmR6$|_kj zQCpmUS=yqHW!fS$%=MM~bL$%|{N`3+kStPfCSJGrr0s7mMz5%eittb(r<|oS9%1<# zD5vZ3YMQ0B_P#H41^m0U*xr?yOhQ(;`Z+Uc#?qs$b;)kp0}RI{T)bg|EQ8B=&uyP{LY*mP?4qbNxc9ewP8M(fH+0{kE?UTjy$ua5Wg+1=&d<>xL?e^S+q;OTIr7VY~Cl+S%sDqya`5^r( z|M9mE_p~!|Ju`BAMjR3z6=HH-6O}V2dW{pgdG_j0YPYp0-++G z;+Ub?60EVoy0^D`&tg{GYDfkKI&K1Bi3!k1sbRUb#c?MJFq$;2LoN|uk5+ktZUnBA zf_;@IfCn6hQSs$CX5$t@gxBAj<&>CWMe$>-XRtcG;Tf5`Bc-_PKd6&iG42PxFZiD>uX( z@sSK$DQ-{J(>tVU#Led2GfjEc$f(560dxNR%e%8XViUZQFCl zwr$(Cb;q`iJGO1xwmm!F#%}Cx>=R$Sf4ifryRr*;GEbgDQt?R3?Q~3F6)0K`nv65I zwls37ms=D#V{$R%PdlTUL+6aHGdeu%V%j>;Ix58F>24g_af#D|5J|4P4dwiYoLk|W zoUm&W4uyq4HBFXFX2LiK$o^@Iy<^9QUcxeoKMTW$i!RMj&wy>lYm^^{6&R_Z(z_S zNL^}Z5i#%ULzD#i!1 zA-O-OvHOz1o`Kq29gv5RVPXEXn;@LP*aUT{|D=i!oCw5$=&am)ks9)ccuG`Wh{m9D zJQZTq)-;%gadeSq-IyD7uR_iF6wh?)*qFdBM1CZ_=JcQC1eaPXOdG*x|JGJ?tRZuGsqKnz#h zjCOheV*AG1QUQY$A+dAC)7ccOJPgEG*r8oywjlz?CjGs~ZizIV5ff1H%NF{dM$ZJZ7-{ECj;zf1kj02SXMu2%KQM>IZ)Z%(c;+XYrkk zpg8dr;l=#f@}sR{kQ!!ABAoTIca4-97gS}Vl$*cEzEd9xO>D6oo!8o2cAe{?=~=$$ zaH*pw@2ewKsT&uMaN__ae~j&Y@8_YaKd9-fdgnPo^aW(NFrEefD968Q}*E;zy9D92eqPR+B8W(LXw*g$;Z?|bQ{;<^W7X4q-YG$jz2$BTm~Jn@7`^ogksbAX4M8#0hUj%#?%|ENjQ9n0#RQla0C#D+miC_ZEdKe>I2Pi-=Te# z-P8lKw#@0rT#XcQiEX`$8&g=hj-=*pIx1A!`#uu4xPk9}s5_2LqkFwJxbuu$P$gLo zm55QUPkyQ5@+;w#^^@4-&-UY{=Cl*%-&gHemW+u6CkKJmXWKwBHOia=q<^ytJut}q zAXt6^H9WjFJs?l(2aRaifT?-?fk?^5M9#SPfIx z7+6`1cPce2!c%lcX_G6*w2`%r$@=MuCZNd^v^VRn^2QR%?9U(<(0R85wHB3<>WvV_ z$O#-|!^ZD6n?b&&(HhkyZZ&yLn4DE{iXZ68+1(ma1pxU zn(?+FPIVRgiIKRYmP7=k?k-8fL5WlS5QaOugZ;P&en|*%zmM0A6o=L%2jZTu?>nht z(iQz^XW)8qKZjklJKf<4d=VpMiL`tS5jC?j@FT`iuk0A@jdAGlaTe7#`z*!K zIn?S2!eFb!e^YID0Cw8_RmoDtVYf|?;+Wu$4DC&o&H>TBSLt!B)whzNqt8SEs!?oPU9Yw3JuMylc# zL9D$eS@4AoQ!G%<(*&gO9;vK|If>ytl3g7_(O@tm&f78u_o9P+U^osrV?AVZR9q*^ z?5FJH;aX!mjxqD6%U-FEulh0W?(D3m)46|fuy$??U^Q?U@nH9G(QJOM~Fgy%;Cfo z?3+Y104E*ML)C&@uT4#5ACuUw=-U;V`htz7i1qXnPO^xntsYy0&zy9eFge%xO%{3m zC=@-S3u)XPt~91Q6tou(v7>#LKa2lNuu3vwVC@sc3%dz!synw3dJ~K`?wY8&Ft_eQ za1KP1o|m%$w*(0skiXLQU3K7viK1~V*Vn!dg8G|64E)xsfVvz7PmRA7p z*GHrDGR#_&3<}qs&E;RbO=IQUS*-00>I6Wgd)Ku>F;Ww+uzfu1!&%dopQYvq7n z6b6~V>c~%1LV0>;ul12KPT~pZi^v=&f+K3CUhS&CKV|=oKD}SFX?X`|ZZuoH9Iy)8 zR!BWPJ}x0G4QN?YFNj&vH##%Cr)Fo9-Q<33^Y&IAPv9?Ze6$GN6LxrO@Z+ZDw4SzRJkGK>>4x6 z^S2g|eeiW~#zVODD%6QCaiP$@-c8%<)H`)3r}yEK}K3hTAy-wP5E%vesA3Ke; zGUf!0Rj^jlAyv9=&Jd+DI=Zg>VG>|pO36$o7Kc!W6nKep zk0nP0`hPXhsCP1)J*JD|^{v&{-pVyJueDHebPXka`s%CvH(s=jWcJRP+YB4O;`eOL z(-?9VQ@Bx&dOs`7&8Amtv59G^M>Z=}F|O3|r%E&p$~E(0A3ATc5nd9j2m4>*Qu(!L zMMXUoX+_^qqxHVu4vt!O4pRMwa`n*aJsUsi<-Y38kyT9;C%RYIQx7!<#oMMf?;-*IS<(_YGPTw9iJ<{OD#RJ5)S) z8FZ*d3X+K#5|eM-4OHDVrqNGm8#P;(G(WU$T{fjxZ#h~tn=YBC`NdjkR|pm@FB4s0 z`fK~fr0EfL1Z)B^tLr#GB#>#e~0sX`RAnxVvyW;M1?h0p#n)nmR13y&L+3Q0P z{K)Ww@4#OLqWLFBKn@+?8Ezp)-2kxcxCw{^`fBQhq?P=Juv)8X zx|Axj*jztq07geE8!D9-tGAasrnV|2R>WDaqq1?&{XkT)^QMzFDoJIzFh*J(yq^B% z$KJ>W4d01YuTI}|THeGiJ|slJzVzmf2g`(2Sj9J=AZAh-H$73|;z+aT{aY>#q_dQ0 zpc1AVu-KhZqB3(qX}`H58JQC%#5N;tKG&==WSCf?@9r*{r5#N4&bb-2B2EtNrBbF< zW770iSq{F)9kb6|PDfwnH$dzjnEcoIAr2~au*q|gzRCz@Ksu-AMq7k47MbjcHMR)q z*WCNTzc}O2`5Ad}XQ6oJ8y{kQW6*|lR4*^>a53-NhYM5Nlzx>MpjZe`uBt*~<-RoE zm-M$>wMfj=HcE0if#yLW&UJnO1{t2*gUPo%$dIhH;!)-T{qcB-acQDHBmE^NELs)y zLNY57^zU=gn4*Sb3#p_5aTj<%K)$=cxhi5;LgSx;V?3;C%sKO^BJy!!q!^_*bgTSh z@!S>7Sj-Q~jdj>SGDrEDIar;$e)0=1w-aZK_dSyn32Pd?jvAvij{`SczrPduG*Pvq zQ`KeyjEoxpE^+}$C6f72z^%|_!}t=ZFJ2UcP$mVCe+u5cezIMv`yOjA*^=KI;7w^H zv&+zB<#1)LY~xi7dSUM*(I~wyvjjO~Eru8)vdn*E;qUFqb${GomXIq*k>RbRT*@uHhgjH=pdM z$%5#{_cI%uXK#elk)VASlU}?TSeA#?S{CK4Amuae_;|kC>XPc@c!o!iGfj0y4puv9 z3LpFflBC661T2f1@EjDE3u2&Ee9P>NElF=FgAaMT;iAD29MV%fVmJwyC{+DQDs30(;>QuWy2OH}+>x6==*XQGzl8r>(p`Guk< z0sq6TVa;r9-KZgxKdG)j_f!++z zXdJ#M6^Wm(wbNFZ>%*|LZ_zeHo@7z+73cE#enG?deZEM*`N258zMVbaJuY+v07lOa zSL_|+$_em~0)jR5gYj~h1w+}szVdxOi%9m?&JYwA#jQ(P@N}Kxp5Z3&^~`q^u3W5` zg%Ik79H?Ln>n)t1zb~b5DQa+bM`K>(-}m@^BKa^2BlJ;OJ$p0DQUndLhqMJAsyh(0 z8Ak~kjgxOWvfk7~z%&D37;p%1@FGfXKb$-Lu|c zRv62@)$2NCN|wHW$akIl7!!W9HbmFFCYj4eT|f!`!fE{m^_~Fhmz0Z2*2U+plMEs( zdD?f#r9XxuKApCI7}l5)$pIoP5f&>@yT+joDjt==7*){r1fq9*CyIpMz)tzyX_e$g+ z>=1+qBJXR(TfV{%y(qk1MWEF4oKH(ixpQGIY%d(^32Q%uyC^BTJ2hgQm2G0%d%4BAjP)Bm;1@t1R;66(yvAreA~O( z$@Trn_I(5I@+Dky$N5gB`{MI=6v7h8{bBvQI;*uwHm?kMF>OJj7UkQ{*h)uMS;Z#{XNK60n9JNdRtn5I5#?pfyY$$EC=B;pFMwc2nsPaG43F z=LQm&beCj>$|FU}X$iw9kdq^_jUyT(D6~zN#2J;86n#ZgE*rF(bu_slNaNtCZDeuA z81r>K0$2Kl#SOnoU*B)pGdMop%{TjF@xeXM%2J~6T<~41^7lzDJ5kj1&5D4blyZSq z>bp4FTW&0SuCL;`ILO1ixz<(mLFE!Yjo$EtMX#xw$*<_C@z_mSvT!}`wqWu1`C{1| zORV_^OI(})i*o>pX|9EpwWjy1V@}@c0zFU9w0+JiwWZq23*e>3b^3-MhmXojxs9C! z8j8PFZDk);$cb0fQS@KJykWY%L$rZ;&Ag62XIvNpF7h$&D zMd^~;anRFfNv-Pt^wknc$vCc3)7%GrBOp~jILYwp^bYo#zHli&ID}Qu5B4-kIq`4? zr_hhx?H%SpqC{9nu@R|i3nzSzPReh5o}AvbmU?d8wDY@g{{WQ2vjVB|;fMfKejx$I z8ORszHoX9XiEwIHBJH*}Yu@axwU7Ux z3}GVJLz8vUKIB|SZc8-ux8fgz+E-Hq=Jl1=Ov}}XP0@hOM|;?Xt6Rc|P4(td($_u{ zXaIes>Fx8(Dsii)f=v{Tki3)wX_?>wT&~wYPxvmO2d-n?|CPb6m58l!O@RWXYl9 z$>%lN8PJuLRuO4?yrOpRKYp`jF)5ioNX*2eiW0lE0fGB_M(My*vMzLVH$OsrbPIy8 zUz3j3>C7+nt(-C^HF>W_=vNFVtr!EzEEV%r3Bx(Vsx*`fdF6N6mKE+U1r9bt{t9;N zfgc;~2oB5@eJo3{2e1 zr@mm$dAvruylz*wydYr0>t80ex@MX*SuF z`qnEK9p}oU{z||tR4MDz7@QQ<_WBzA+UgGukG~C-Xe=Z%jQExGnWh&3*4$9s{9>v{25)y_k5KyBO2_(1nQosGdteQjD z^lLu}W}nMN>IrxHStI$2wd!yK7ihH^l*Mgtv{#k92%lVs3aGS(3*p<2GqT3NHnTIf zyA%h-vMfyly#s-zXPuV|nAEjOOk4AHji2x7@hvUs;7%7I_dZ;DM+Brx(QioRuT0o? zX>HHxfVOr7@V$4Rfk)ROyz+|q?ZT3oZtNWBZ{EIEtmv&*F$aJvgTfFM@U6oUdH5Tt z&W#6TE`!rBE?!C=dCM$%*TGHAl;F1ce1E$5{sD|IdZBRiTAQga57>LtuoU(R2NpyH z-3$aWQ7Ygy)GcT%J0VVrx3DLJTVjH6Y=B$JQ`%e$`}hS~mJ-7=4mo2dHnC@edP3a6 z^~&m$BvHmR3+UnhFwM24Ge>jQu&w-gN&kF$T2C%Qn-xp^lJ3b7t0XVTmg4or0mEE z?!xK8nlYToK?C#oIDnSFl^66K9GP>;?-!743{$?0=Gyur!oIqZIR)(H&6Yavqpv1N z!#;B(XA8f;$9#Ata~yzU{+E{fseP9s|C`dZ4PAdXUyw?uUMZE@MzRE!WiV`fkX+LO z!)`Ek=3g{CVR(!F$PY4Y1K(I=T&ydH`e``4@E{+r14AQtHlMVp_p~rjuCJo4H&EpL z7lb*uKj@G9PTuvxmuK?*mBgo4^;;8r5~$h5yi5bHy(<&xqHvbqCbZxFV+$@c8Wlna zq|dv-BW1d7-afLa9{PsgNjgZ9P5BYa@V%oaiki>m{tw`fxe3<)-@9b_|B$EucR@o& z_FomQ|Ikob%94rOU_%JK`9^&QHsBc8Lr0*gyD$YlTrBZ|c9fjcZVzh?`~Hd*ZR$GX z(u&GL>;xA~A@#fUDRScwR2dRYXL~yvnC>_?qD*uvMw4rJ=J*=&nz?y< zGjbMko#2iPO{VCA@VL3kxU-8##O6)??i24A@_Q*ZX@SlaZRqK6b!;WAvN@ zRjcF`(@A&rl#}{lf)7x8@cDi`F)%`BvdzzfN{)gqiJ>4CCVLOZus$o%hqw!o{S(hn zI9nSC2fF{W7X%vuLAMMDfr5?z4&mHtT)-6Ui|9-cd|2iW8!WFQdt?Yj51fCjRvvH* zO%k94Q~TF9z!`wBZLqWfl3?<3Kmu|W1{@utMBp8C4iM;6k^$-}e(is zDY`ItDELVq#a}NZt80J6@y5LC)JmgRVpE3qA^Cs=Nf&t=AkPX4HgC%46A+R>YO$LD zv~>i0H{ic#1cjG@GWfYB$TNPjm*7u%3{o{T zc5V;Oi?DMdde(P z>D~PLEXsx*Z@cv{aOpV5?9%!nv$>WDq0N^;oXLOZ=;Yzg@kD_0$E^|MGMKm71*)GiSqJpfQHUz~9Oy8lX z7J!*f^$BE$3a6?;0xB@hsVk)6NArV-?KSbNZIK}eCq`;InRp3)O?!xfYb{CwOvboH zT|NNIq9SIQ=7u$-L%_I9T{{3Po)-vU<-&&@#LbA28AxLF8`3oVQoB!lWxLk+&kS?665IAfz(_f!U#`(W9S75?>4E+e;!+u#ZCty zIo6}Qg+=RCLLk|~G=ro2aU_L~lyf;^7critz>DSuQ8_JM*b1NGJJoH$D-L3iLQM(+ zet)f8!cW-LD33g1r4F@^=ih{_>^32`>2)xYc|nxGs4>$+JfI&im!*18DRZUCXPfP6 z(okPaX9fcD8&Py9(YqaLe3?@<0dW75Mcim0E|B^?JRlpgFdoo49*Gl}iE3cQvb?gP zH%pXS-tZ0GvpQM736)^_vHS$cWU6P+kRa%<7*$WrTH->D9nP81_GZiM6vCzfWv0e3 zD%TdRlQG7uQf%IA%195_th2nY)rNdFBpDnqr0ItMS(`ygx)n%`p@SgRRwFXMte?T2 z+QAdf|JVh8H75UOsWV1)mj8~iWX;&(u)_@B_(pmJP!WkJAR&N+$8ZVA+MH{}D@7g8 zc!Z|W`{|0DSRtjuuQ4=dTxlPa z*NQ3fBc}TqojVZY^J#tmfI94Q2q0~|94tnGh#9~CXsMjhJM6`8@JV7XQceANT(rA5 zL!jEfU%B5{s(sn<^KpARX1h}qrUdc$B`<#uP=kQHUE(mzIlkDueX_9~y73FfZ2pjf zcy^{1bQZaIy&#KuV-uUK*&0o*{-pMBj-|MLI41hAH=wSa+wu$WPv3NJ`rs5iK5P+| zDGOIvgeJu(;sEPED?}<0^kNpPH(RZlmx_m~saj>F#AuTA5R>8mV+!6R8${afkgDK- zVu0%v^&bqNdWDGBq|lyGC0HVdD)LP)+A6Ng*!(h4!d1a6H7tZu)VKI8MbSqLIzCbH zpc;zAYhXOSW3XWW4$a7F;Hu-gaG0D7=NApc5HluL2qw6i7Ap`x@0yWx9!%0DqKyu- z3Cy;Fp7p+GVpn$ZiTo0W;y_WxUo ze63qaQ;9RA9_xU^=6Hxwgnd9PMt9zceI(v?kSa`}7WkUd?V6~M6A%Leaxun-B(J*Q zqZ&x;k={Xxd9oiNZzErdVdyeGL|I`5!m1Np z@%0h^tMg)%vtyJO!%gq!0zRER0VN_BJeypu7a!3|3<)g#eO-aC|R#$PMe~ z@F_6E5vvqH7lNgaFh#ZHVDVBOf7x?=M7DBS?H#O zzn)fRKN!E-i$je(n~rPrpa9-HM@k)h7s|7iH2oYP*og9$_76uJb*`S`fxs@yHT^~t z0V@qzci}eSL5o|*mGv)!`Q^DewlA`YWn={n`B;?kZ-!RAD1#ylXfET4SFa+Mo;*Ux z{j&^pZ%pU17@DfsJTk4d!L9US+&0-&buSi1`^bnJ2(^w3+<>)3bneT}pXd~!!$$uE zrxbyVTnu&OyBw4lo$Kz!povb-Qjr0yK}Ho}#9Wd53pGzH+&Ho~NJi1)s3y^t0jh zz=Ds zS}L*gt|iO?Ccf*~ns^N!Fk2zCYWW$idsH6Bb57RgQ;*-a^~2M z&zMRdkOxSINHm4dG1pY;;PnrR<~MHy4mGpjiq%$)zqZPT;XE$E)|ukvemhLDhwH66|E)t&-` z*NP~vUW9+H19v~ZPICJnuWqt)yJdXeTOVrPmB$Zt%7+RseX_py3s2&_zgs_?&|kZJ zp_GWe&9WTfY7BFHeb#;6#=(6Lu8?~GEz`dflycY4`jRn9`AhU%`SJOGe0#ipAXrdS znL}Bw{P=Zw{@8oZWhF-WFMM0PJ04gSZMfyT@28%=$ysk)ao^t!dr9Z?FyG+2dmYj~ z4EvFP`$0VL&0Vd0mFD;IU&#@HC?4q6J9l17ZR=!2*2nRW1xV5sDuj_z9#qPR#zNOcq(Sos@|Q z*%Sj7u8BXlhhB8i9!92#m4uTbH!kkgZ2li3GwhS1LS*D(AyF<7!;R2X7cS;EhnRay z9$Vb&t9j$(Ct)NlUEX>hKc)ecc79$eV0?IW@Ya)MylTbPFw^GRr^2Yyk8IXUivxSD z1$uVBN$MI0Z7N5Dz2hBm+A2XFHLaQ^oB?>(`RKwq1+ql%lo*z_NLp&C2frs;Z1pp9 zkyAys@oRAn938F7M4&e+tQh9sZi%EODv5^8=z}&B{(j3Sd5}t^pfz5XXWJ^F z%c4nV=|Lp0$?sBgVIQ{yTBwBsp+M){k89NX!1p-Yb+XIoV-Rqbh99c~?lVej;h;dqnpGpab`RW$>J1W!y;FCAJSR^atC2$_^ zH3N~Q(APC`Z$lwmAX4Av*@C4k`O4dpdM%6WcJm5_k43kzkCa9U@Y*HAf2zWHWIc0r z@@yzZIS_CK6&(n%X|VyI_ABj<=$=AqlM3`N*Mcq81!VdB~<(h(2 zBiQp^&nqB<8>!V``{KZBfcTcrc{E7X@rUHNUvDhJ8s%Qj=C=^C;kNp18ozFb#pLVZ2~<_0XQ@_(6o61HoeKS<&9jD%Xn7jo$V`Q3gJHp6w^PcW}L zJn8Bbui7fnt`9}VCQ_rb9kuSSgmEhbM0`UxD!ShO$KuWOKLt0;48OYi{}JN5!WpwY zYQ4LzmAAztFm=)c7!d!6+3L-j=k10)MsS|Z9&nBy!@2*Uq!UR%DSr9W*Ui*B_FR}o55|MthHi>IXRgT$=G>GPxw`rj*j>7oP9aSM3Zx>1s4baoQPRYKpuTKo~RugNNTm z)&mC**Q*LupPV~MQxZ~5>4#R0w^RV_XXXfI2eGUZt=DK9sq`r6Jt!g*5!|SW&^JWt zQ!pUldLyueB1~>DpSY@_DhZeFd6HJQ*z?|rc=}$(+dz{41ev6@?H!*%$&wQC#OfcRBJ}cLAfQ*&jeo7HCFFNop*pf_fYg zVrQX)__IbfidPfxM z>ZB7YI1+H$dE0Bf4~jSO`HeZ@uOtG0x@6>w$GGw|brRqu60LnJp!%}scR*!5&zX{t z%&>E?c0m@>OJ8HSe7K<`CJX-fR#Aur1Tl)0*+Y{wu#Gay5CF)lC;&BQ0rg@?!` z{JRrrCN2(!+fA7N?B@kgp4$`By*jk>UfDTPGJBD`FqL|CeBg!$w{I{&?j8sQyXlOV zfVOVMEX6>)`F1n2Q=!`u30Visxm8da*i9G&%n*ygV5&1zxY&7TwQZH}1One!_pco} z?^Qh>fwE_+$S-UD=O?4W)x4placWrGX$q3sARM)sG)2U0cMgpZa8Z9A>r%Hdix}os zWp043>m~&r8ZZ4g~5gdTFoWe!~0tyfKU(*uuOoDlaF<5mk>te8lb)CD9*^EA zm+1`gOfB`Z$nB`5p3cT+b+02ADVh8bT_#DiTD{-sWWQT;*yokpUQl^feuUj#y8!sS z6AlDMVw@u6_NXNFI0&9l(F7R|-$EY5WnZO)B;Zpid87tXn?6MG6=m-SSdJQ%WaajN z;svngXMZ6K^bLjxsnMqg%G|w)e{sb=F2kP6J0ao*g{;A|o8HP&ddJ5Biw|;Jsg;Ar z>^7$_>|>s1Ggqh_kB>R|U7RPZ0bOz@6Lo7I>-AxUYLJ$LA+#q7QQ}VU4oOs+PVh2 zOOa9hi}k3xQvy(8VVQRDMXHpQdjO=5I%E7wg^Eyq3ja<<-Z7J)tj$>R>n~|(M`>F_ zlpOWBqDAs9ow=%dcgMLDUL-4r-NzW%jrFL-#E=awm3hwvg0EU-bO0(38*lI?A+#}~J znJ*YZGWXzeG~r}jcXj@-zWEekUbrZC+8p{QUT8D|1V#D5J=bTzLy{;aNaqqVN_ZhQ z&>WU^bm}tbv96YyUY;o6o)kb7jp2k?|Ih(<$^6b5|Mp4NEn~N)TYNXE*Lg<^NVB6Y zCHHD@Dc;S9<~N>ToIDGtENIpS>MMH{mxp;Vgzh#7!~>E%F#+>@yO*m%n!H$puDRL)sHQu^Jq| zXey~!w*5-OCVD+w{M1t?CNVY^(rx8z?n@AQcpM{9I;9UWzgn$D_DD_5gKAfY zzjU@^%kGf5$_C*%U zEZ(W(&_`r&MpD{caO0&!xeFIKBVXR&YKOb5{bwa&LdcL--KRTfBzH41jd0J~rOZlo zTz=8bm&=;zy0y5weQXuynW&iQaksNUh-{X63{H|dDdZA0_DUU%@W~o-{fW8PkIUgV zM-JbngRQ<2M#K4fYYtKAbp(?zSjokLNW+F&ii!&jR#9atRZ1}si8C{yR*IlQ!hrjC zIg9}zOz6ORnrLBnMXCZ9x?Wb?$@U8g`~faR2;`uiAO#DP`1mdUn z&s9~}zp3wM6-;L|02-MF=OYW7+i1{;tB$IcR{6q#voxZoO9mJJQ0YjrEVj-`_0&ab zh{*n76u7s|v_ zt4_}0IMdo9`v$ z{@}AuwMs>ZQq;#l-f77&LxB%kxP7r0LF=pUxsYY%f?J8fb-#SQqkYdUBy^w{1`B1R zz2GY-K^zcZC_{^?lkDd!gZ$sh{NDU(MDvuA;#i$bq770m;vXl z@4wRA?S>ZBuDB7*g8ZJ6{Ca=%_nct`EK&JrBJf2Jv1yZ|zTvOGn#R`FCRiwWtg9Ss zaCEcYG~c|`G@6eKY>eO*tJ>RX3HRM0diSdnQSR}MDx>ECVPBxl*m_1&u-?Wvdq$gU zRx*n!>(-B=SiiI}XxhLFdFv|Dq%9lj(s!*_8@vH*XQ==U8Y%o*V~K>#RJMR`=xskK~Z;`D-m9)-BQWkT3S29v{fdD_^DDD1aG);y%CCL8=~9mcIBoTO<gKT0 zIjYh5#AlG&9{uC5S{v3m%q#+h$T+h+)VbP>0A!+Du+X$xl#bLWy~sZl9{hv?I$k1? zvl0_ixll$st7S8Gs!B&SRX!w<7Vc;b#(zOnSehnwn1m`D+fUEUFDj7}O5XRwH^(fQ z;esk!BTwfFwD0=|@QYj0^rA^TqUC6v32pMWk&rbUbIZ-bi=>VkasE&K5RgZ=og{O6 zngViRw0$W9rl+nCWUoVG;_ZAB=6ubiDIqq7=?z!;^6m`&{h)EpgL-&p2&Be(?!Ceu z{(b@Y9d`4pwl>7 zpO0j_Aj$(hb<5BwjobqU5}|7Y8fs$$>a<2IACoX6L#^RCC8tV7STiGuDZxg9uW%%e zktr({M30e0XBl+7PPJ68R_W4}Tx&adyr8miDm?W4HMx!Hnr3W`aLr`JawS(ZvIU5a zeJ%P)bJceR%;A31m(FN9c)+jtqyv0}|A91^|KDfA{qM*G%nZL7m;XW3dEWy* z5!xfg^Yi|?mSuqZ)%ut2FQ{$GswD5+JmBRBqJ@cfIy`LI20$dZ_nB5@Om za1dYW(P*GRMYC`VpKiXUZAl5umQI+ljq@O6sFxs82LJE$9?b9uG}F*ZyPFaP>|w=F zk{0{CD8mIlB>kB3AhS)}I4FHZOa$)j=}AFXr90}CO>z)RCWUUzaq{>@1lxC3?S3KL;gjVZd4l6a z69tmaLs!HO--Fk4NhxelZ3Rc!JJln0IjIW11aWuyfpq2kxJOAfX);^=L01D&Xx5>< z+4H+o|FpGR5JG$>te#o?)k#PA@3D6)?rHV+@5^BYN1dlD}n(X55q zNv9Ho7!TqR%YJrVXn70fDC2$KDS17~I#G~`NX|f{1DR<-0b&Y5XBM&(q_Ndpgs?=J z5vJ8*h8bcqRYF*JQ`3Qq=T%GI$}Op_2QW~_aEt(?&oW+Ewt#BzHjuD7HU@?eM}Y$ z7bY)ZibMf0gkCA6veqy|7u8Z=Q+c(3Sk&P*kC!^-AAhA{GtW-K$UAu0dhD@?FrjHB{l~K3B<(4WwV8A-onm#& zvu8u#G_~*!R<4GJ_%dMZPc9D7)Xm8A8#kM+0a2X*$Sx?9KV*1^BsEv|fa`-vbL>|{ zRsF(LfJbxkPug$+pF^Kgq}-aj{x`67Va=dcVR z(?Dq>oH*ab-05CMyQf7PQ;o|Kir@6e`l?|4+|9HO_*u3U3^0;(u9oSji%B5BC-z3Q zhRMu#13A3S5GAQJ)40EWu>?45-)rP@GlX{C)w)Op*#Q<{tan=+tz3Gx7jj8cI0Pmv#BB2>^kTC+NO1EyjdS3pj|8336ieR?WL zu4F}H1UqR_2B>wG;273^HsJ(kIQ!GHN@UPNmJ8ByF3h3I{Q=CW3sra}SV46l;{UeDCosq`XmE!B0fI{iFt|%_*Wj*q-gEA^ zzVF9bcilht&+XN-X1c4ode`on>Z)h&dN$@!338qW((LIHX^)C~Vg8I!e@RZGZ9#2@ z;Indq|2H>FvD_1%vLUl>+6pt!s{Q*WX7QIXQ)D;w-Jdsi2yrl{%||SLeW=_dKG4>? z766e`p;X$Ytw1!bU0@+qn(;GuD4E&aEs&IGWT&fFQgueopPbLojT`Z0=_m~)gCF>|7J;wd@)f(raQy;hBw4dKC_hH%>D2t*o_8L_aqO}BXu7qY zYMGclEWLw%{3dVyK#z3mg(t^NT5VYhGjV`Ty%)@9tu-*j^1ck(nh47b10 z$yga#pGzw7aDA{GPjCL>;+v9yTNdUXAkptz?z5f-q{I$BkY38>F$h|v)~cl#D@y%Q zRW7I5#D*j{+?-j^$O!D=Ty@_*k+@I@+oX8<28^1QCrhAE?Nzqq8y7+=XEfr9BPG%w zN`(TO;UA!N2GURmSJlH^PaT)A#&$9DAM|sMol?BF=B8q8a2cXu<0&WG7Y5oNXe<8) zt7@4~8rleIJB{#BCoSry^S4}v|2nZ2jAgE)`z7upp>?`I`o;ZyKUS=1O1h~YL0x>Sf8H>37D?S zu7p8@BN5In2R`4Qd~1RjPAe!?M#Uc@*`GeodTS_}DRuNzIVZUx+bYtWpER~WQ)L(n zgEtf-r20_flA$LG_!Dd621XM3CkOb-EREkNxaBj`jX2mB&7M|sT~9SyW6t?l1&rY_ z0#=py&9`nb+(#hvJu`kRlI}|%XMxR8qTMmHx=_AWG?daH&E5@z82W^61za~>FJ<4< zQA)13FLtj+xJrNYTkp)Uno)m53X-3wctMrAqG=m3ed~$c2z||(rscW=a~71+^m8)w zy~acRHcs+}GgE~4&2f^}>YCmlIM)diBhEpsB$rYT?{Qm2&^dS5CCp-E*Gp=^!@&9E z_e7Q2rKqBk9#M4F!nwKPMKk~9q*Z~W-P|k(M@hLs)HJxpMEh6Lqa^$3;&sqh!LZ}> zZtrMcC!d`~s_GoFzJO1QI)%&Z6Q4hp5GPb&($0?cpS}h&RxcCalKmxzZeY4{D3aQA z_HvqLwfz$MCd%k(sQdP&eApA;mp{%hAns(>ys)Kb*71gPaQyRrTG(6V%AUha)Q>Ua z`nKP=^L3(VGnv=vW_^?eaLA!prW-OdUWeB{b5=Te$4HvXH)W2tfl~cG zf0$$p=o{N?CRfGj_!aC(|EJg)H5+}7XerzQ?U1~>dTcGg0bK=s`7Ue2vw>!fBTvao^UUcM~pD?NVSd5>E6B$Ge_lsHimELsF=#O1Su9NwquCP(OQ0EhY z*Dy!fm+ejZpwmc(vqXTAF7az7GZ_Z zV_T|hyRM!iZP3dwdTP(`uG<;{TE9q;CQbe3wI`QQ4)Kev1~VYfaM3kiQ2<_y%uP}H*#t8$dEc{g+r0>=(> z7j(bEi@TMV|9`kv{hOWnzd{%PcbsUjBO)R+HM@?j1tMrM zKQ|XOyPT!1wT%ZgH)2Y`{=wG6UDeV}(%I3)*~!w$gIWL)McLWG*-gX6)Esfye@9bh z*HAKbx2OJx-{7BM$p1O?@c#}9iJ*i2&(@BmVb={IB2-m&>)X_7J0m4e;<^hrnnmWRZhHM@D#2X(%aP?2EhN_b_lOt$;1S#Vu*=} z1qS;1`S}F|Jf3d!4Gs=|Wv@04e9(R}YGBegVuRK~HP8So7YDP|_^hO0jnnsE4#8(@qcsx0%bM_E6dAXr>aVDq~Ls12owsX zh>O~k2N?+iUdw5}rBf<1LXx1?GaTx}QvgU%&v)0o{?~WNF6(JJawp{r_`$(JBGKK= z?fDKH2pb7dABqA|IYqRkhQ(*N&kR2`*sWK zuck3Yw4q?^D}-5+oC4%M1mqT{3(Z(c0H-cexDYdB0{t3@d(~EY@%Y4oRMHPx@KMuB{428Jx}&_*LJB3c)kZGx ztH`Nois2(qle7__CyGN3W4h47$48d*NM!O$d!_f`Yh+i9b$w~u`J&uOJ%6G+6C(9E zE|2sSxww-o9PK8x)MqE-6Tz#R#`e9|L4l`MCdRc%n-e6N(Oe8k7IKVhxuvHi-Z_F0 zd|W!WeqGjsAv_Y;%aP9SzjySCKh)V@)&dDweJB9i7LXdPS*~&(bN&D{a{~#6Gez!W z5YBS!D$lun`p(>F%jv|g&kO4ds7_`*#o9rBo8JBU44_ldUDaBW;yYf>HYq#t(+20q zdqw<>_W>ZdYo67zQio*#yAlWv7QHkwCv5Wl%7u}+Q#|8nPNX!iUncB#9-)QhHBf1NHS8A7mAhS}u60gIvf~gC_VRUompmq9S4tHi(*#iII zXE*2KBHkYh$elvIUT(87W+|ME0E=gfe_}|I)l`P#egNnmsM^zMvo!s>ajGo@@7Nss zw!%10|HG}{BIP|F{b`M>QFqa8g7Wdio0e_!^5Y-N)Y+HQ#TbX<5WUV&81Tc$G&P?1 zY4064mE4YIwjC+B%^Gt1f{pXzl5tY`G6+Y@*u=x^a64W+J~gt~Iqu6gJq~_O|1ppM1CEU*KY<)#9k_m9@HfR;@?uYkB;)E&feiI-ASoVl?)4+GM zKR(GU>*C3AZ*ysHe7aN>^mnhOHs#d;=>CR4MrufBKM9@af^3U+VyAyDyOe|vwDki4 zC;kdV#`;vZl%cYn0$61^I(OYEdOwnwf2jEkbBOb(N5G@GR zS9}zT=6o~ZJn3P-c&a)GN8Ead2R|kA&&rn?GJuaVDHBb>15BDaRo&U&-+!^(fCxbB zV7GCmtAt#W{K*_{b`R*pwgu|Sw~Yd47?6VR_u0*7>yn!h^*<;|bO`apno4D9zy(a% z7W^oqj~jB(#n!rj^_UO=M7ZN#DwOj7D|JFn`K--!#S_ZNglnSlh_67@fC8|!fZq&8 zPk!F0?J&incmqOy(aCHJtkBvfo&CvFQvl4vM_s?;J-C7~x}XGWO~~n%7ZfykEw5Sz zlX+$&tb{Pk!Vk>Bbc_wUl^>dJ(?}9xh5GW6Sgoo)I+DWr18BC_Ewfo%I+n02BR1 z6LNfGDhJF_+$ZXKmUuc@KtQHo+@iPZP0LQ0b;Eegw}X$RCY7F-ND`#5NyQxN!uV-> z9{}Ru`%Fqm&f(?d=N%wJ|)j&Xn1y2r;Afr6p`3c)b=Sdetu~ZDsPYfHazDhl`U@M{@yR?^?EOwXxUGbN9NhmoO#S+ zC)XQ>%!D}TrHq%*e!4RN%|>2+()iEJ*-lTo8s5kKZP2FY!yEAA*Bw|XqI4C`&T zrd>*;xmt(2;uiTkMfLWz(Nu6jBFx&>zL>FDmSqz2yX&|lz9-%myZO=|hEd=|f1t{& zsrDtBKtn&_@15hCw7~GcwMtic$(gUU=(k4uUs>K?vtP2gDk#PV+;i!gt2)Jo_E`m0=H z6d_+XZRwFF`YDsZSu&YH!EH7&7J1?YB=NVG^uHt=$PLMrqHi8V!;9OU95mnZL<~zn z66xHPdow^u7L7yh$WbzXUE!Oq)!%6Ng0rGk)!rsd&6^9g`QuC{Sxne851e0hJ;7@H zs=49ZFW{$a8!hz~kkC)wdQKnKyM-?)zUR`XZ~~mY5gleqa~zh z9IifRbq&gU6-`kmR2U>T(SLddmP&pdlM#MX?L)R1w1O6x<0v_rlZ6;|4a5vR_9 z>zW8)F0$ssj8&+R;ZW1El6G*c^tZ(T7nvm3}-LIFu zGraROMmsP+s2@MGX>z7;+wV#r&E=g;ja}7kLIyMx+1?eqD{y%5n}!Ol^orb7$`8Q2+_TlURoztrk8Z?vfNJY>a4e zbIBT>5Q|rHA9SJ+67OlI0P8*dA`l5SEQi3`OUqlnYtgA8+4h-%DmJYbfVl9O0>qqS zqQS^eBHuxkFXJe=Us5R|OfceZW+TY$UxkDcjYPAybhNiCM}*<)&^jnadm%2V45LN0c=dd6w*C$-}fT#a6G=4sXFJ zZv+`{)v+guajmbSyNdydQKEv$}GTNw2T*yUb56hZD14 z5d%0$EmD25ioy^XfCWBmQ$Kfon~3{P=4?JLJj@4Pdr37!<~i4IxJ|xqv~$%C>j^&x zSU@I-h8$3~9Z1}jcO3W{hOfBc5Hkom4T)`fr22|Scc4jWnai~#^UWev*@KRINsDGPn=$Xmzr@)6H7b{&p^-5|^QT&olrxCI`!MM1 zELvpt;bU1%;r*8rcFsK?XLxd{x=Yh40XCMR%5n2=cy-m-@7|gk`?@hp9;~K z1zbSBWYDNQIO^r`W7^+|AKFdMbz8a%vks|=MZP5g+)IrOkHk_BbHXGG9UDl>MVkJS1Y8Rs+MIwtsEL^y{M2(q7E>fk|EH^+ z(1|aGW72!W+MaA!n+IAp>@f)=b{J3h829#=YUCfc{7%sBM0Iweum5mD1kXZ3DLs(?1U&1-w0*^omGvCeGZ;GS+c^QB3;>$GCLTS^>h!yQx0{ zRKPTF*MrosB}dv3pp=k+&{~?D1g6gR*0ydYIVDMv62KrXc+b>oQS*jA44B$XI+Z*- zQ(qf^;5+074+UiJLQAaI6{&!WTdITi;Jitzytls#?GWu{;SOBed4{+q{&@-GjT#uT z2BdmU<%UbX)m+K9;+=hdy6!j?l1BtkfM+UlX+!Sj2@{5ffaaDAuEzA{J;$fJG$i^q zKS);Q9YCDk^>E;Pxwi6%_|xfE@#hDPe+09#f^@-KbEZk@eD8-8AzF-~DKvtY<}Pa0 zqg5G&d*$=V;X2KN1wQWw6`uR3f|B1>_23tyOMqZ7uvj^Lf8GWyJIjItA9s?!c1-S; z9dVP9{gsae(Lie3a)ln9C{BGn@1y~l6Gu{yLTVQ9A9=Hg05A(HQ0Xs;N)k?34!9R* z&cmC>ero41ZOONG%f6*p+1G9dW&Zdx<)<2T2dXF#VK%zH8h zsU9*jRF4#FZ3T(@(R$fA6YUlNxrtE*0(|1j6-veXdI)2(D~$Shqmu{`a7j|eYW?Ow zqkcbd*zA5Qr+hRHIXKAzLKq|H{u%oBBI$xcb}MJWAoMLDzM!df@cf0ujDrI(=|Z~0 zHF~NAF+|{o%k+ZyAYjzD3p&S`0G02FGhTEs3zpn}P#4*S{;3RB3rJCC{j)JvDN^S~ zg}!=iy&_jz$f8%OJ5sPD1bil<_;o}ouaK)@~?UCInEf{V=5G_kc{@mm!3^7y4@=g+Zv0UH?f3@Uw+p6ty^D z;GYs&Vzw_eQSiO@NYxQF^7byPf(WOM9Xip}8ymN-AWT}&c1e*D^D1` zL0eseD;Yiyi?#loaVKY`i&jJq);-(oUdll0 z*tUj<_$VGbW*c_sQMR_zhsbw0*I9afozhPozH5p9rtY0R6(GQc0buw_Up@qEc093H zCb8qbx2kA5ej%9yzFR~H&6UJ+jUUSOX!Tf{00z8P(9ZnhFKG(*<_0ebD0_};7tef2FvD0ttgytB(XS?Y$s&YieeH^o&Cga4pPk)x~fbqGyGE zVwEacLk_6P?=sUrV7+@X8LyBBPZu{MYIn;n7GKB`gcmiMBjJF3cy#(%5@PNi3 zicC5Ku@?Cwv)$t#o5$9St^oJJV=Kt${wL8(t8L^LE@e1LHdOozpSjOHwwf)fQ<`^w zs2GrloBf`0qm&2sZ(N``rwR& zz((0-2z{Tqekzdv-ETLCo*aA?^zsYnEceC+d{qFc$f36=(Ai$nYXDX?;RQS`I_%a# z3tcfKWb?-o5+Yc~L;#-;Tu~3I5HOsL;zh5dE5^;ckt z8cEWBJin3I@^e0)iv{?4@8M1&7W*eRu?PmYPM?3j=~#d+;x-0G&ktbTo75i2e(pZ-U5d zB3vV7iUIhJLPbS|=q~^bo&OXrLmo&||8yqf3j4hsE$1456siaKZk80#A3n8?KkDn7 z|AZ-Pt|Rry*HT|P$PE@&T15sLwEqUhJ*;^GyR+_6|Q%5bNi zheeO$uKbHH+i`k>=qgwNNq)nu-4NWBxnER%^g&ZjHtL zWmS1GGW;cg(s2W;R9f&z1|k6>kp2!hLC;`ii2{7Dcgox~a4WS0_=M>WNVYsLwOVN7 z07PhCI26d{iNx;A)-F?TYfw2~3IcRRQytbKp4;!Ju6VsM09R(0;ZtTcwW3ynH7@~2 z_P;;PilRbd>1&$PuWST!4N& zy~;g2C{5z5bQ94XpC>(IsI6^mY?xRQ`{`9t0lYRbuu9unTgj_$m-{R100Qa@AI;z! zT)z-#zZyGv-5uiGNm5W?dB7pOZr>2e}x z00S_x+OA=sQom^ncWahMya{SH*|NwYsOoJ;GOF+aK2qn+9Lff4&^oQaeP*QK7JV_j z?Jz9wUBqwMo7=5zIrovhnr)O9opgbhD+HJGTad~Bh%AVpzJw=g1J!Q>Y%IltfP} zC&gqNO>w}&=~@CxdPQkxnpO6XND0R?a*H#x&o>hcc|t&*=L&9#w&R{$E|xfovM9Dj z*ESQxQ*&l5@N)M&FiBu!^;<&YA_mgFNM3;UWsI%_uncNst|8Dp0~Xl%!t*w-5NfDY zY!d>B4$UI-d`&8%xtV%QxzD#Hm1T{j5AX?OfoU9nI`5Qy8P&KVpFwFzEH^dt-7yJ5sPfAyg;aWy3>J;I)d(}--p&*PQRLT9M+V^X8ZzP4={Su5l~$SN zzZFC_ALmiIARvyb;a4twl1mljUF)`h6M;#@%kR0lDarIZIxrsA_?57TukbqpwS*8@ z-k|QLR6_+j0(yzU{KxX6om@H!=4@F=9$HyoHC#l%eXiLW>hY-}HbG4bNQ*xQ_6i_$ z#gkKAk&9B^V$SW1!E*s}R3LJZ7nq{$!AO^8&{SQhgtxuHxG zL)5*+U|9!*baxaAu%Cxe<9 zaHcC@UYDv^D&vN=*e=Ak>%o>8HSdyU^n0z`xe&HIRI1HY*M01>qce1K zw6Lwb@0-;fPj}~|;!tm_hr1TRg`q_Ucy6i-r`We!<$kXY9LfN`lHa<%?&gz06O7*D zLB+hXPJu<2Fd&s_ot?%rdd6}#f+)87AR_s`?0M%ste_zA4E28Ft9V{okE-;rU6n*- z(|~pC2G0uqmR~+)Lwxo^Yl6-4+)D`YmnwdHoQxNf!&bhC25CWU`$>6SpvF94Z$ik* z0t7!v+EC@fz#V>oEkB>J2^P>CuSDg&?@Q60is_rD%UR>+haGWC$P?WmkX-$? zb~x(esUvyTPAKd6L1b6e?_C}CDz?S99V(JfQvq2!E#fB(+1)*u(K^$W%NJI|QR%ll z8#U7mcHi0gjq@WKazm%-0&;pA@4$DBQdN3}$3|bXW8o=P8Eo-g#ba+acnu{27(;gY zAVH4@#v`GMZm0oqD?OJGRO`=5Q)pKCF1&(MC}FO}O~+a**d~**WECZu=N$VxKAsyQ zYV(`Ji-lrp2+M?V{uY*iv1o*n-9U>I<=lfJK8?jm;poy%>uzX${Yrq6In;`iQ8&CM zqbr9{xx354)x@x4cJZuIal*s(m^10smzoyDI7!WK2&iM6zP*(V1MfpY!Ut!!+YXD) zmJoxn(hfUanK90lW?3H(klIFB&gQFXTRvLPEu*E~DXOqfG^fqgEl+wMJ5*8;19I86 zcohY!_E~J>fCPgZ`|l6m_M}NXJnz%SW;08k1U%9AzIJ><3|h!Y$Zkrg7BUqf!phKm z#n^%=>(Wx!ICm}q-kbgFR>f|aK=A?KFxq5m#ztF_d8Pg&*NE-$KB{QO7kZdQg@Uyy zUlljp16N|DY{Yq&p@B+7E%Y9TD6AqIjJorHb0zNo4l(N-o~hQ+P?-?FZoaCAVTq(A z_u3g`*y+Qk_w^ zgG%p{uhPK1>1W#*d~f@0C>;^=u9>_3MpbvFxEci7%jWXV5@OnY>+3G9aLlj{{@j}Zd%{=iZBQE%ydAskS)ppb$1<;-! zE6B}I?CAl2@M))6xUe)S%5mRp7BsP`t9Z-3Tt#wzCT!Cdbp^tGRgD-wk_8a0} z!#vsZFRN3)Zu6bn`Zi0s1onee?d29Dzae*5Rj}{#t!me4VANw9Wo*00?`S)-JPdX$ zo1>$^mGl>$Z_VjgLYvrBOaewS3bhXaV=AdpgmZV6D(T$w;wxPTOPjw+&U@#wu5$2T zVT6?ens`*1+Xsxjt}}lHYAwdp%;9qm>48ckg6B^Ah87SQgB?4}!bQsYM2S#;rm=@h zV3@X~CeN=!&%mx4t{JFcMpI}bA#L7b9eLZ>ccE(Ifh1o;$K8~k^t|Xd=~pdqnyV*J506N zZPsj$AMXCBC}s99WO#9;LUvbZ5H0%hVONa7zp>YIJF1yAsiIyCE1O^BCP_KZ)FsgK?fftd2zrYf-8jSiPk~BN$E#YK>vXqb${-|4>q-bj2?Zj6 zyZkD`!_#bUj`yZL16*Yk?UbU(b&l_rbH06bHCvSe4!*Yv-GL@sV8bsyB#w$;M1$iW zK~x!Q3;e?oqd@a|{ePs;`r?cVjnX}(Rb`X)`Eu>cVn_(3jDZP+cCDT*42Ai_XsWN% z8)GdmZ&t#Od+*}yCL`L0+|Q%ZgCNz}CG_6d4vXgz&Tf|7QRDm84cb;nFFJ`T#O|#O ztrh{DUJe$gKeTp%rf+k`V3(95gx|f3SW-Oa$j&u2Ry z&FN2xHNOG?_Vfe@P?}f)y~b=mA7Pyd$@B%7(88olemZ-~y1Q7D0n(DF*q{oV5si(F zXV(j7;LQZ$d|#;%B)|xPvV3&^QylRk(*P@!eJdy^fGLRSIrgPGU*zAd*ML>LTVS1R z&)0s28g&1cDgDfNnwgyc(YYtM_*R@XB_ZuUct8Ei5$V5Tvi!gFev)-F_5DBlJ8|&} z{P&UzYD{+zH%n7TOrJl0yFUL@t6$VX`%9}YwUGW}75~3HISPm#zv=i7PmPEBfB3BZ zpVqM;=rcM0TdDs;rxb(njE zUM$1ndgwygyId!Ob1~f(r$x8ITPtZ%hbriSj9l#5wGTH3_u=G`!aDw)J#MC+b0(U6oBG-=&c}6(efHX0>_(pFZ`13$GxW? zCL~T+pKNbI*9uUkN70w>-_H1~`gNWVKhXS}-k4&GN(};5g@nIsWUIwiiqZ}bXJ9G1)gd;_*%vB9V4eJ16Se!=69WS4 zY3q7X?)!G}?^Im^2lEu(Ddjgc*kzAzlt?Abs0lISqDpomHxon8e4TW2ck4(9Qs&u9 z57QrI-`1~d99tt;Oa&}YLf5vQgoGc!8=`383LE9#Wbg(2z-k(218x^Hao>%2Fjjph z2KMhizU|HZSjzrexMZ%T7=+rZAzqyNb1_(d^om~FvnAx6R-|w-U1oG`bS_lH7>!3C ziE4`t^{h0nTJdJH=FO9e)IoC9?oWqEi+-f7!it;IV)UHCDS_w&urH~5>KgM zNd|gNqu2FVWV4%Ye+SUo35js)2`UJ30k{O&$02@XU6d(!s0{EV*D<94rFzdg-T`77 z8*-hI9}-p2tJQ#*(K#udux}M36-{J&G@m-0Ckq2nkiR zzo_)rIVYY%iM6xGug~9a5xCfWusFO>D^y=JHw*|WLy<>157SQ6Yb-mVW|(Y}(}D1E zGZz|8{J=a>R4UKW)t^k2yTeQ`GI-@%?N;;7Cf$u~l~cW*WUHBBY7mv*-FTU_O<{{m zPN=hP_M}$Su)$tbANg?%Ltz8<`dc+KY~?v(spH=m^2uqd zW&?yG3)F#l!!xU}sP`96BHZy9g0QFT%Gd~RZU4s!Bg5I4lr%Wk;uqwaFdBRGu=w|f zPRO~U6jRCgD((0N<=>lWWTC1a*zsk=G{?PamT6L=h3nRsMJm;*IFR6_GLt5c4@zH@?zJXGT$lpN(HG&~y9_8ALvC4k#2cbM^pQiS-QX z$p#Bv#U+Tf9*KjLCt+m{; z9j}=ECe-u8fxj%dVw2P;h1^0-|h($^lU)PyWbFIDbqRJY$yGJM^XdQ7t>r3P5; z#TsQ%B_XQ>c-4LE#xJU*=IQ?3>cXG9*8d~8^kjn!m*uUR7xu`XwAH`A_11##Vwy4^ zdyzY&rwl_|Kp?*s*I73!iENh|{pNXTZsX81A&_E=nvt+oGHG@9!v5n3Awf2Ey2*sW zKy9L+FjC%X4d9E_AL-XVG=@n;=$3avu9z`lq2|i@sl3KqE~Ui%5b(VOZ4b!TH?d5m zgYjSz5d{JnbCIinxFKR6zbAsm`Tf=aSCPkA%*pe3PXTV|UcO7rD({0*^PlN+lvK|lb& zG%4Eswq+rX)04~UQ>_vV2ZTG!lnkX2-Ra0m{(K?ysY607awl0pRuZFla{o-|jPSaz z_CD8zZoA=EH;J*vwJ&Glq32nt){GwdHRu}M=#9d2Qm!jaw~y>2XBCiLw3%EmjvLQG zg?vr5nr&1HOW|7HiUxx0xfqEqI-<&gH>8KgTT*T}`)cc)`2qO}Xj%4A>e-2?uWdTD zxe-%3ph*3*awqaqUICLK~~fg%SN zgnv}z%M~hQildNf)lC-vy6140t={{ItE4&4>;07+1b$K6F-eY-^L%2M?_Ik&*xsWb zZ2^>jUjV*reB1MkR1mVZ*8A1Exe-;1AqU8_AF|`3Q4z$Sal*y)85Vb-_I~61; z7k>>n`hHs}Ylv0){8x=N|DG%)f$F01!X>a5!L`ypYPeS#M0pe_x)|_N%}q<*Ybr05 zWl>6F$M&1q!z&D{Fk%1ai$dT1NV%@|i3|EYO3{oB%?Tnd$!0#`CO>POFp?=MPc6&= zkXoEa%?qhtfhA+nb%LpT{sINh&z?4S^eJN6LKOK;8bzp;1&rwT7|9fxT|O86m?tfe zye&EX9{zfA8T%5%5{8D_RBuVKyu|A{iCW~aT;6X>WBVvdA>yf$IB^n_jp;tz!R)NQ z{o0 z#+o(xJk+`s%(7Av$n^WrC6~Akpj)21R2=^DeJAyv**!lk`uYa^PR{F%=gTu@eOZ=h z-=@zM3}0N4sv-&K_p>**a{Y~k=NGl_=N7enrvQzMJEq1`6>j-!1X(FSbIFV#!R8 zzW$jP+Dk0t3;gjnTVdx;bZw-)ieT+WM%#sk0OlWoubUFT!oK|7pnffb8>nx?q_oi} zSa=k-f`h$04pFsVg*!)Rvkw5TOWq@NRF<2G6)5}}p`-@@8~;pT%fFR0iW0s$eRJ+`m7Yd@nOyOn?puZw-8r+7Ipefp0=KeA-mK+O1tF zRyor{&v+7%D)0HF_n%MfB!@(r%KLScxjd-+_$2|ymc6B2mEgdVFpB2%0ZY_$PKu3@ zExoX3gAIk_cn?nV-e1TDK}>JU-=lI*S~`Mp<()qdta|CUUlfrz5s^A&b1eB>3)!l- z80-uUxRW(@yeZ+5%2i)ZJ9cM(A#t2mvET+j{BXuDhiUrK{`PO$Pst`{WpS2~Ymru8 z(bYK+q<*!RHClj@gz2=l&T7ya9uxPOC{-~!s62J*G32xIlJLgK>}wzKPo79G(}ScHJUkue)#w-}HB+-LY=g9Py`lxzBN)FaNNQ=b zIi`#xH^eHSQk*DCb_8QSD&(#2Ys;z|&@MWZC$(JDz-!H|WikKYxD{f+KZ&h`F;erd z8NY6PiO0e%m0e+2HLdsMnv% zyz@RLbYC#IiYk_lJ(P$!-$T*8%ETVp-qf8>!eS@?OuL8iZl*9i`e6U7ZcmF>X}B{l zK@cO~Wq>|?itaCsufLdzF}i*HHq>mrP4oMLH9l62w>1J{j6Cko?=64d)^2F?3yW_5 z-Rl>Y;HcsP3oA`fAuF}$p0VMJ9paw!Rc9}#siSAQJ^AXpNF-^W*9Iw15&Q}RP~m_w zvL}8Uf>2?+#8(>NB;3khoopjJPWs<1pBNh71#iBJGuCHLOS)??Ui;VH#U3ZKk!7ad zfu+pp>6~&I{fH_0?cMb|i!3p1dC{%XvyzdHv=GY2qd3ooy0eSGR@Xw}Un|0=Ha7WA z!leJ+|GWi5@cn^T`WHm(KL}d}vwWM^mza;XA$I zQOexoUQS+gvS9OWUiLS34iLlBCQ-P7+~m{BtZx_L+8|plWmu+0q&cZ-xnVTuT@#VX zb=L0`RSMy~t|Sie)XJYx9Cxt%Y)E=GN2%#l{^Q3FOAAbgueOvA^J%SQ6#UHbA+GJ( zAB-VxM(CyL*V-x2H%LOkIz%7pjHurI7Bg>9B`u02R@(5V;EwpnT=>1M63%DqhT?7B zaUq4Aw&tl7D$T?R=P#WfV1Qnzc8tL3mr7!k+4f9^>53%JB8;zBAx{1FBdkpL$HD42 zcT*OtUpmfN4&qdvU#v}FR{saMfcO8F_JWrSv9#?!(O!rS#seD@ub-mN9I<~gwNpvt z*DOs>BKy~FHerYnf0XkZW0^Vl_0%3}@shiL=#z!k%!LHouflAz)08eBS&NgFQSm3~ zzk!cCp^J~rNiD}zM&jcB*G|*QOo^Eqrq{PnG?b41tUrS6{#-4uGsk+5#DeA@FMx$- zCu%3IqhFcmZN{rdzhXZ95%o7(eX&wM*g>qLPZ3*_ll^>kJL*{vgv>6pv2L5xlzi1#uDjITZnO=5f%h)NLY1JvdjW06XAiZ&Z+rj`An53k6W2>|E zTIL%WL#*;kj}4MBn^j8w7eUixSp|kdVEVZ4VzG7mvvC|!D5enSNw>5y+m4x_#yHfv zRyEdFBELBD!^UN378h(;t3RKho~0?f2%%he1Lj;H90fyiKH#(|<>hTkzd!HwQu^;q0b1i2l>wapzSKRV$*ZZ^d;!s zG{(-4n3k3OS?V7=LPyCQAm+B1ZaowgmHgfN(H6AI@VL&C5)7*`ZN_|7vhA0dv2~8i zGZF{eQ6+Iiw{i93GJmGFNL==brpVKN>hJ^Zhtx z;VGhUb#s5N#^&BX36&{CFFMF1^P^p`7)Q#Iza>&ii$$C0HgTB+NsY~BeUoE9yy|3& zZ2HKCqPCh!xb8!&jhbs9_KF=6#lP+UUbnoGrcCJr=moKIT2;aKlch$}N~DwJ?nq#L zI;km9Ie^L1OtKP>3uwErS^1f0)Lo5?ZfQoQ#nyeNvSGRd@5wu2^VUEW3rh9i&t_x! zGH-0h?ft$ON9u=eiG6umCi@B4w$z-;_aVFmbMo~_sll(YXnxRsyJKeki;aVgB%AewoZ z=Afhf9t91FDr*Pjq(t?!(tp%y)E))zc0i zlxbwI8?xG=6k5%>Bx)Gkl5L$IA0ptTbV&yo!5qiw`76kmuf}dI%Y~uR=DoZ(I(qf?G(8Gu z=<6`xo0451F7~GmavBM>s;H>RA@yJ`W1_>4CS8&?*&)GEeOn_vzv-_^SaccHzH(bJ z#3=q;nmiGFNscmB!#C6!I`aOl3(C9s0?Y8KEp&-D99nO;-`zxwIDYhZW35Mb<5NG1 z3W;`6vp)VlTyEM(rcEKU`?S3rMYXY92>in_h$rngeQ4vYeO-K}sW93M|U!T6@qA+i8 z;{a@|G>K)cG!HD_j3WYoHKns@h7p`@a9QKo0m@CtOQ!sTq7{Z!JlEy9_$80*$Lz5# zv{5|-1Lp4r#=uOPKbuoGFm*0RexZIK(#z_W-gWH1B`DWNr_Zg-zLks~tTp>l;V)P; z_vVdr*+k;4j#MaUYxpli_^B216mLWm3Ky8JfRC#49R{obO}hZq3T_$zdBo;s;fN#} znMevyNlfw|;I|^4?eq!d_5x$+J+c|!$JXP0!))FRb7c)#EMZqvQ!TD~8&TqeQ?8Ug zTFdy#Xm_($jfAdYye?bIRdnjBk%X9N($6t(^Ea)SC=C+t$6}K`pcO$MDVuCeX(eTM zwtBy}_#ZEHvT36A%^K$bPE5%p06*>C1f<3OFUH;}O0%Hb5>4B-Z5x%gZGCCmwkxaB zwryA1wr$(!{JS6e^yoAC-sgCUy+>%xHQ}TWit8-b2S@Wk%^fQ1kO}}-sq<2mOqK60 z6%Hg3$0Ix73Y=YRQU{u8a-dz3%G+#JGEHW8ISvVy8XEq?X{f)P`Hk^nUV(n+_;Q@+ zFlLZP3eSorVvh=DgHV8O0r7w&hxJ@2JGnFJ{|H<$6LffJPD=S4n~a%O#zSQ!jC0Ix zzEVb{k(C)s=4iiVRVi%Fd`*Mb&^m1uApfF6p>9L_&l|2~+)B=r@lTvs^a$=)4xip> zki_4Pqg~VV<+lt3xvWXMlIK{dJDfi&L1c2wLY(T9zm?Ww$aZn_lJ+$5nq3geh!_d8 z551&s``%Z>rt%YsgwqAbkfqB~O*N#r7`MPR~&DCaAfwg6Cr3%A81i( z0jAVT@ATA>c^`l7hQCl{2V>O!W+Tt)_5Wq&{a4*X27N?KFwS~v&Y5ln!|VdDODF4u z9cgn%)E1;QU1g|7ousTa2#03I6iJ}mRf(H|jO~lJF0<|9vkDN_h~_7;+eQw_&(llZ zjC*t}tRPB|u?SR=Qz1T6R6}(w$^=Bg7_?+Eblapv@wmiCbOb+(MQB;(?T1&Dfqc8! z5u6o?hAugb@CJNPbjk5a=>JBFa62x-!qe_ILip86U2YI)wVvx$xwI1g3L{_#3KgJ; zev1edr+Q@@jP4m9J&P=NT{A%K_@r1bSy0tdt#)s?7brPq73Y7^g%fk$TApJXeV|_V zyJE@?cH>r!{gX+s?a>fhrv-3qu#Y)xc+K?A?FH_&5T0<(4vTj$V5;_noFb#lFoUA? ztqO>w<5T;aS3?zsFM~V(0HK(}Y00iY+wa#MbrnqJ`op|eJLv#_U9rOS0eVGKqceXW zIziYEn_6=;4NadSN;fSEA^jS;|dL6HE)l^l^EaG8j!-!Gf*n4Wh4|QKdZr zo#0e0pto@Ml2gYq8-)YqJg6UhZLEX5q2aQ3oNC9>Cv=~p_&0~b$aUU}1JD_ErzK`faG)W;AX6^2O>v9K>gkWMUzrF_vziY#O(B>=P<4P1#X4 zBux|U*h>n5v7Xs&(msZz)&6F>v8K5;hY)A`MZ0QOPy#}lJ7f){#tGQ(8BtSh1J`g^ zJZX=uKcWMg*%sD1Hz!DJYFJ=>_(EW{tv1(1*tVToR(HPa_jw+|$y0fe=DzB;GCyiX zEU-KD#goa!{vfh=yO+hxxXSS^RB(7;7(X;`Z1tEaEk#SDJqkexWu{aI{FZ*NtM zd|jAx=M_=py6h5F?}ls^%#_7gX95pJ_?R*euT(B0MYO`|tm$S8`Blu4S?^>^m!|{p33zWhf5SS16~hk^Zti z#FSj%FH6@hu>cA0DE>%w;NQeP?8T0Z-X7t*oTF?mQ`JdFvc*DOkji}8TuxZd#PdW! z{5iH3xT0W1ZiWtwDrI|_4aQwMO2DIDf`uiE$tICzuAyagY_Yu>pt56MF3U$t^C!wd zQwon6PGy1j&lLyxLEsRmCu3dF5lPTY)HCD6-e%V!-2j(MF)8mJ8m&iJ{i-rrz>V$)C2x`0 zxKUYwipHzvt5}RbYmq{(h)RtmN+aJz+;WmuX$itmats7UYm1h(A+s$LO%t-J3F<1d zV&2RizR@c!76)4=3uirU?IW~k7Na|@FWcRsn)V8Nt{i1pDcCD#-13MiMu51umi4KK zs%+rph}Ih(R>fZj&RMXl(PAbi%fDpB+?V}4ZR~oozlb&H%FU@%n5u8@_XVx)ZbDt? zk9QphwYDT$RmGuyGL z{p(snd}FswTsq`YxsU5*QPVJagfVU$`b@wfrRFb#AnBzaBWyiMCNXV<2%kKiaa*d( zevN#e)GBs#Q-iygRh2lv&|CeC@g8rgA`5x+q*~u)*XJlwOcv|7G0vcP{_J@f39e~{ zBbZET0Dy42?M5BttIaSitL9`Ke>#VIuWG78dp>l2{jZszIo2nGfoAk5(zTK&FXL?= zXTJ)>HLmP{Ljvsg29Jz*N`dy*ReF0zu^(i0S?w0PX+HWIrJ?DFqCAuHg+P5y!Bm;! z49hbAX%iq<;prhrM&^Z_>29h6^1gD@AeTf#P^iy>8maHhNe+VVpB@s(`J_0 z2Tk&6GAjy->OcQgS>UxmyWq6B_obd+xNqp7by~oMQXyNE#V&hlLc0~%7nnBr<5m_u zeYWf$CFskGfI^ii>?2H_ts(N7y*=3i>zH(nw;=$?+noFM$|k4VbL^y#i8L(seA*QA z#Rt8|aIvq!E8rUg`B?!;2>}xl85vNr)CX>N*Z-Lmhj zyDXPR?L;LVQ#dg7h-JyF zt%t&!BYwNmrapWb+<*Sh*-g_MaEp+ReZ4&(%Za-mKW@#TzS4cm+Z-ho^DO`TZ|O6u z^(uo^9z=j(DfQXyK%2fXYV`beivC>RYc6)qg%-bFGrODg{?fm?Q%+?&@*l3gd;hte zM^Ygh^qpuqw+Mgk=TG&W-@@8ezo|C)Lq1<_O@Xy#+(U>*_2&AMX{eiA#0pfIgqhSu zFSfftm(Id8yUVQfM?gORp*3Mtbz(mVHBoFc zdNoYzhdcI7dtyC(f>p$lNAg8wPR1O#ZokxP={j#7Nz$zjgpj2cqI9Ksip#3ImN;wr zlxJA5N}%VH_u17PqPLiPJv{x|#g$N&4fHO%X3qVx^4u!nJJm9PDWBea4hLE3g~FcW zo5U!T#O%3xL-)X>uCt$VB{kRj`daB3nnT#~C*HPX5E$MF_t_)q!@V>n5IqKbWA> z2RSX0N7tog0qyvvDF5QOWG%h5qiA`GXWhrv_WgmbKKVlH@ z)BemrzHpb!&LO;fXiwy^1cop~CuZeJPzvvYoXRVy)Yt<`@}8!y#r3Buz|Pqb|i(@zZ)waS<4 zPE~b9sGQC!OBAFPeS-{-bu9lk2qwq>?}!jirvJhs``?78K|LA!gI473cMTW2j$dK@ zdl@}_0h`U3D=I8$KOG6^`jiXeQDT3=!IYQZ3so4@)&T_TR%MdvzLl6V2g}#nUmz*l z-|wP~{|rtJk4u)X6$}JJS~ZQ)Rrc;aa}*LagSTg4b>Wa)XSGp=ZYu;C{(Xs-DZU^l zN_%|up|#SY2vU5K-+Ei_`Cggqu|IdjZu^GBcgnN5w9fMrWBXD0arps6dN&I;RW3>v z;#~%3cRd6}#xiS^vcINOjd8o(>6*Ct4dNF=u0Myjd6nAQ3Dlp3n6qD67ShBwVSjS7 z!M5n`mmZ7uXs6LOTY<9u-@jm`e|Pv}N{65=eby%GeFdW!eC(}HDfo@zg1~RA#l?FTm>j$r3 z`pXTS*BG53FI)bS#TG8IkN~q!P{QDiwxArsq4}5|C>yl@t#-Yg^TofP!X)b4`tccG zV&LEZV~dz$fY;(k@j1QyHY~OSU>Ug||Ht6({bnuKuNlThmJqaED8vXyS(5d4C(NPW zeMa(Qtv~V=sg-Chf_D;BIq}DWqE~q=`g^iPNADHG6WD)WxUlxfp*kg`R0YO{r!LLjKk5C?9Jpsr?51v4vk%faWJ^J|(fDo0S#c0m# zDh5{cQW{@p9sk4`$?T=MPt;u5rSNY1<;UcL{`^fn;M(xMGKoym9nnAwv~x>`{2)!* zma_`7n*-J*hZ~;JYTN=fqiv3p+o^-!?{2P^P=7%g%z^YcBUE}&bDaGNA?gW;5rNX? zk}bTa|ADdTnk{ugq80(GcdwpF_oWt{W2vbB=yPQAEDjyi@C^FPm9Xw_l4snuk(i&f zg=x|lF{>*DZkd6954q`&OR_gI${;F+o=1Y{z$Y4G?Wa-Y?%28>u1{CQ9G;k2n(D-P z{4#K!fElrx$+3>iZn+|e1(Hckixnr62sO>##0Ia&!Oc|4 z|J#+vyt5H-zPPnlX)FyN&@_X!wT4X|u69vZ0K{F?@4$mCU%IsDYd?M;aJrX%<8+aP z0woh;WXp)*M5{A|fYTNcR)Rn8Dr-PbN+kZ66xjQO@y3Ilk7{)bEgw^k`?0Ga7$@Z?TCiY(CcZ*u8qxOGhkNKY(pidBSW$(JM?mGp zbSy%5$flt7-ew2Gz71gz!{^w7_v6@iH8imA@RmwltyEpB&?GaBp*I#N4(>D`|8g5L z6a=K{Gm_D>2zVRMePNg;)>{sB^%l(gm)%C=ri z>k%5Bec!~zgQ-fwKsy7VI~_2NV3fKL3YwpVE>aaQTM(GGm_*Vw9YYaw>Xu2A?0jtT zM%Hw>*$>=gkZS@oC_(_xc-Iq>1H+fdQIplOCJb7W+X`6(gXAVv+?^!;4HMs@?~dN; z%wW2%FO6vHQYj?85aUd99jvrSx`lNMYtuFXz|ACsu>HT_hfYWC}A;5m2A)tz6%JWUeeA26_E>LIssS|794^NG#7a zJ|#&Tnaka8q7vr6o`|SjM1H4EetS*PKP229T|i1^)%n*y{Z}lJ@QHljl4!E7e)8M{ zBlXz>Y#bujFnnko(Fsx?6x_)UUQUwl?{w5aJ-uqr+BRuwoVOOLNNXs*`cZvNz-vT6 zISZ)bA(Zl_us*|+2b0WeNKidB4S~Kn^Nn>IoN9<%^~CVOhjqg8;-R#Oc8jild73UN z?|9paaUCy&HuVa2*854&B-F~-j&DwJ2ij1wkN?Cx-!^jT{d0J~MGv#&1KF88kU>m- zFVV2ty3qwyQ#@x(0jBH}4g#(86=lPC9^d}JP4jSdBf~MVM*&V|kVKRtkJsTY#n5mi z(5Z9k6#N>k;d<&+EX7>Zj{`Kf5Ku{Pzb+@(s9mtGx%je+m9Nw11x40l1)cME!!13Nl zkZ4#I3cauCUN(a^x6v)yQpY=<>v-?n>UhkdOO--taRzFyT7M+H3tV>*lOerMPO5{3 zwEKo*`bXO)F-EFLA>8AlElNyAs@@a#3tdqTIIcc#XKxPI^$D^Fz2k*TIF1iYj&g(< z02T^l49`o!661O$hbsoK*za5-W*szp?Q@t`<+3QSLrAm{R^!2U@TylhwGGsdVxq9@${b|y-^EfBtq>yF>W50QM~ z^AF7%Q>L|lgvqMvW3#u8WLSsycYR>c(}bu*s|% z^D%&KqlHMZU0$XcDH^ayZ*oV}NPQ1w10&lA%e`iMo~==YUECFDMnlj!i8#G1?#ilG zlrgR4T_;~gZe<~U;+xEJHAORg$h)$cAG(Fb*Za?Iza(igp@VUkH9exbw(?&dc8~}E z_l~thEtOh7o-`S|niWdtEe)JKkDHpK20zo=&Aj)w_fb&XM;Qr$e;me!8w;N{=#vhM z6a+axm~;uVbq8#i)6X}Lc%zb$@8EDDG3*`oy^UAA9cd$PdOMq3PB>2RqV77A-PT9` zjkfx#(RN$GAH8?Eu|{icbq+0X^*om4WAa>IZLVt0E$X{y3sAciPG6I!mJvbr zjFd+fm1T79^9u%VFHVn^n;ngMwv$|Jx}3!friSPy{j0L-jasZUi#14o$lI0_F($05 zoGPcY;V-13SiqtlZdZ~-3IujuuLTqYLY=}(>P$E~u~sPVkc*Tpap`}%_1K=3<2?1_4T5;){61<+xM~9c!B3}6F59ohfjrhgcBO7Ze@u+ zjc1;$B?W`)>)N*-g1O;|7XplUq&m2*S1o(o)O+p=%(duic%Pzq0IT z-D5FuuLv%)+#S4Q8a<%|~VgB2_t;2lOa3LXaj z!S*wIvp1dP%wQb_+u6Sg_=dSP;TunrT`^={AnfZRsRz+hYNX=^@s{iC} z!?}(+fQ89Ik;Y3}2h|;)NV?meNfrR9+vHb8Vhz z+tep*9M;-?V#1ZBFZTEl?I@3am<&@L6~LY+B}>xAI@4(o?6^(PUgR>1mzYw2-aT+0*kBs%3wIofRZ)au+&raRb)}}&T#iMA$C|`w&cIVcSOs1tRTrDJcjhZ zzB&(4E*vx|ORHSU&ei?6l{0im#`K>{vUhJ8Dc4!QSgXSM*2%C~vXu+7K)5Z4p!+@7 zU=cBPAmU7=y`%MltQN|Hwpt+B2ik%P{zk*ENDvds$CUE-{l{8p;+@3SNX-px=;^`D zcR!it{Awm?QlQwkLN=mpl!?M4-bhwS+^FBWGlR3sKIMpqcaV?5T-%93Ewp7V1ei>? z75^OvtwG0z6X8KQBDCefNOckrOhhGkSuhi|_(sOII|24!4}}l0QJ?Kime&;}LGg=% ztGg&vUV6U=svuwkjH+m$C0A9458ZM6W*=G*_Z5baOgApBcQ^8+&BXaY3$<~eXA`7q z@Ax%g1QQrT`|ptiaZ*51er=QzMJT9CK~rs^CM6-)3Ng45JCJs0&aNM-oz^6d!{8yU z`bw#08!AUH4F&lw6u)*+$WMo%{|kpdpLf?Vl{7lAgO5d0^NK}ifahuy`k0BT`^+cI zjM+P^=9m3|u69uR!K*r&K6Q6c8u?{B5UvVbRWcg_$hLG}gBP5rhlJ1I{x6eFk_nJca;UH_5i%)+eIPT1M_MQ) z`Ji|ZE!iHn7#Z2h>quX(5ovOuJ7hL0xpE^Dqus!OHr&RRLww|?paRuLnBIyL7!?8u zZ17)}sQ4XGm_V0@hcYU^_f|X6Tbm{;UZqTZH9Y}At;((Fy=6C6dk%YaW92M#e_DO? z>1|~J zTt7u`*+yOXxy1i-ri<@#tQt9yF=DS(&lP)-`Nt%7kj_0O*SO_M0cmpR(H*GDqs#Jq zK5SU0)6WsEfSs^ifd~S%n_-(h#(a^z!Y*3(+*{8+-PXIQEW>tc`*m(R<2C=I=@ZD; zMki&b9x1+-!0872eC=1{j`Ux`k@<#6*RpVz2M$b1f!)1@7Bh>>nfAO#5!^5i1lyX- zXyt8$Wl;Fb$4?>ulgFIPSzF5ZXTG}ts%S|8($Asm?f76B7Ldq!brcpu2q*|9 z6eTVo5?p|BK63s7e-A(+gNgv?w%LIE*Lc|;}l2LtPSfuP9n8Qz;T}jbG z1fWPslx073MMmK;tW66+5+2b(No7_EMQxUOsDaCqd?84xashGZy9qD`%AQ=+<~2>p z@Y0H2nJlTQq_uT8=Azl67z9O~E=aUmPRM6Bho8z&b-!!<5_wiJx_6>5SgG;uk0%wW zD%JNk$XruG<)5JqmOrcxtGCq$h=$}@0R1J)KQL@~(eThg4{}6$I+2|RhX@#OL@ELz z3v64`kfrwedEg{~l87ah-(lh!s8PHd%&j^bvxjLBYm%XfEgDy?=IvOQ2zoJIBzm$g z(G22mD8BC-0BX22JBnzw8h;lC9Nyqed9s6%(G}pE>j0$DHmzV9Fz?&&NaaKD7K~nxo3=$tu>!V=FcOp{BTcN_y zgU|&@%S5Lw4=l>dU-hW5_~gbacUOa4mbh$GD=VvY`cjBzFId)X;X@`-ytkwhwkO3X?JfM@s6?Qimq0&rN#)qB1JxO`hq7^-QsT2jP1vTd6O z-`&)<;#S^`8wI2Z`zd4Mel6EYZgLLgud~S^`;w?plGw_XmeZ^)ERYuu&3lrm@SdxR zjG?K70c;ciStP9>_UBIZ!brrKt{(!GSCU8YE5P}3N;F$sn~Vd{;?t`nq3?h%-Z_KG z!@oto!doOb)R&b>xdkeP|MoxWE8L!1JVd^Ppzo3`Ju<$TPuA%{FA8)ul{=OqylchZ zn5*hU%wC(u0oK1?iL3J5eS`OY65IOWlXjlf5li4!e|O&O@n=UYTKy5aAFl_ZFrvf= zEAFu1m|Q%p)N_v>A54}RbWo&UFHhz4XB&6hOo_9qqd7YS*{5&LXkTGazfO+bu*t~; zW9OARnjQ?=-ic+za4-6o{3S>W?*xv*uf7(vR5~nu^1+~fzImaKci*96TdnZodW@7g z{Nbh8an6fD>GvlGckR|Wi{h>Aw&g>2_|&i3Qv`9gAkzKiFO&3WMADPdXD18{EsS|5 zt!>drt8`kivJ|^>(0wK+hiEz_%?{SJ(UPrFe`QAfRdYjmnhDF+acU}K^La%zb=-J` z>2toIrg;=rU$y&3#L2BVCg&982;&blL?TFi%C)1XfRw%qI&1E@~A`DD~5!`Vf6kLuf$-x~>6&LO=tix50`lkZMR8}~yfOS>J! zITT@?&Mm@QVZ;mJGlT-gsY3`|DFcKaR5=D!Z%E{~9WkI9a)Qr!mS~eA_$o<9YBSwd zs%-7$Hd<|(gHBgoZyu=XdO9uR8K4N&ClVK%YaD!NEYN%zCig~Lu(*x%lxrgZa{Yqk?YXauXzvkFD z{%e59|5J?3%=X{2tMNzUHd-II4Dtvq(&Kr7`z2d035ZHoZf%*udwRLT9sg%|xu>p} zvT~Aie&tYZz$tZ#sK6h41IeWf#++}6{uV)klN;OIeg(utO`2G2D&{4{T|sKxuW0+@ zZJ)2x-Dk+2ZkGTd8lMq}szA-W@S1Hxzb|lu57h6kDEwCT{%@c8>uPS{M7I~)m-qe> zzONq=F(;!ge3%9OF9ZX>$sTm_1tJ?MEX@9t>;7qb>Z0pyewwixg8&1p&iBJ{14m?# z4kYSZ|HQCS4F!ie=yD}d&8?urKgvc_Nig3xDxEte2tE6J+c%KjGPMKSd zZZsUSVx_M?G%&n}y_*Gi3Zj^k@S5zM8+(1atbR@?AywFAV$kf0G`d;XLb6-{Y#_IA z7gu@UdssyBRXjHsq-gZ>i*AY9u=|SC-3$k+cxdw%zpyDqpY%=PaRk?&4=iRU-eCU^ zx#LW_ds9u?sp z3R-?E(P}6NNML7aOel$ilj^3^6)-COa#8nSi%>Rc!B}){6kuP;y)NLQTy4CaK3}gK zwX}5na7tyMllM}_;bZF-mkVnwXwEZMhr(VQSZgNz_UIr0igPxmC)>I2&%cn-m00)c zZ=FC%MTn+_;1*=VF{z+9$Ro5P#F?x=n6DF4^_?s0edWe7zZH$=))Xge!aeFqFpN_0 z;-Ljb+62a$lrhsWXUHZsIGsHpbML3MLY18)9`g#XKFKS`dMgDwKBYn6O1`YFu&UM9 zDC-dzKA{EZAla~7!GtC~$Zk6S9g5;94Qni{LsAM;U}_RGaSRL`2Y_2IK=9B&P_S<0 zbIcqbt=XlCD09J+cDpszN!WRxz|Vk@@haFe#i)w8Hz|qu#<}p#^_Piv_V$*&ImVE! zIP;5y0~5xzy>JeVQR@aH?lOkkb2PIHfWdOdVjt--{?^@@Beyz#fVA^li^Mvd&j>ESiPH`^jo}hzEKu&Nb6x!7=H4jSFpZC zUgbBlRG;y%^wo-FKkt}q1{Apj4mB(lO@zH+5DszL6@|Z`dl!}kv(e%z_nAvI2!GOJ zuTxIK|CV~VO($PNF+I40S(0*qRJ`Rp)>rH_by`yN3CFdavll;x6AsWGz{KhOk*Z3%-aY`trJABrQ zsohD-&sRV8w)1Dvj{L6KU=z3@+jwCVw0k_bkBSA7hIv3!n{r@!PPt5%b|NgwGJjo8 z@RzfqRlhpMvMs$%LLuQhMO~(mk!*|=HjgwB>u6Uf3x69OCb)YrMBJU1ELjEaowYc> za?6F_RaoGc(sDUVh^5@uRTwV@QJi-c!G^4)2pYwhQ^tn;RF>F*O2N8JpQfO2 z>Pg*yOdHw~H-bnR``t8Ih4sGVvSwM z>wJ+Xk9ZY;)S5Gd4>w}7=0WJZplDuMD9LOVMXtu{q@KySVDJ~GJj`H0t2<<|@p4k% zdt^Ph%K}P6!Gsaa7U2J7)l;o1P*9XjlS{sQ5l)@YpLo_oJr}m~L?@rH^ycYuln8Nw zl7y%%q2JG@qPfw5>9*5Y#oMsT!18R!N*alBd}!d9KH#*KHEC7Lz`svA{G71pqD;iQ z0^LY5G3HhY?gyeSDGcn zrR3Bs6B4ChVX_R3{B`Utl_KgEL;1QutpjN>Sg~)IPB2@(?u#mvY~idvF}Y}AbaCw7 zT^DK06xOz^@{cr8OV$W%cw0IdLyj8JRLk`QCGW{Xu$)K4pSSED83IIQ#21edWB)u1 zEP=$zP@f7BiWz?nRH~N4k|Gl>v~ z3ie|r>uB9^EBuHCjBR*Ew@qw})IwimOZpyS%$VWRgL3aimAltBjSaFdfHLT3wfMhphG4*3xp9nHf6qZIjoSuH`e?+2>WyLAW^%Fh-E) zo7|MaaFfHtY&$ifvFj+^4t#Hg2cEOs2>%M%W19ABQ=}a_zZ#nVpbw0$KQ$H4Fgc6D z-mz_yb7|Yb%?8Em$LWxq4`!E*D3GVR^IY1&h?vVjq%o!{_Jk#)4N3*Wd0y=5{`Ba$ z*$)2V8Bi&i-EPg2G^YHtCi)wkt8wygg4SjmTyC;6`Krq#6I)SB=K%-YC|Bq&~80p)-FJ>k*|Y?mm6G;Zy$Vo6s69 zA@J$Vs{b38!!PDaCtalOv%F>Ff>;N!8JReOH_$fU4SmfZJEfE%V?Si#V&8NLvxdahi`#nhSo*TI&U{z>lEtCgox(`9XxP@YvXkzOdPCX};g0gjK?c$8 zP+;aFa|-G$dLN00G6?N5rfrh-I+zQ?xbS{r-x4(fDqv@Tu#acQZmV6L$VK4WW&`Uw zF{8y@OT?zlA72keL%RI9#l?lxGf8bjJKZabJpz$?COCBj$!txd0`8t>vU-!hs!5k~k46b+>6vY>YuMBEEuA!>uF9Htx zj2EVdn_(y7pqhgmBK0g!29PWP1^xQ*7Nk2%tB=G-Yjj6EZXyqy>w3u+q^mFrEaex& zsOQg|cedns&Un@@a^;bPQuI1EFJRnRh@TmYT;U)(Pt#y+s%>S zw%_OYvOm#JPL+RaabPXP>W=qIc_dm4uk?G(lHPV)FVgNt?vFxP8X@LT|Fw5{7kGwn zG2iAf!@JbcFCcMRK`3`*x7;Hvo3L<}zwv=7_EG1RX_~6veST8K!2n6}?5w-}s_yUm zSqA2|ips@f&5vpK?(RH(#%A5BAzTg_gG8rx>}KO5GQMak@YTz8&31);eCD1GZTK+R z*9s@KTlC)+RW%)blY4co)(iM3s`w_A7NhB;M32g>_B&L6!h9Hw;=MYzv#s~*I=8XJ zXQa)~H3Ga4!R3%H*~9j1*r^Ydy83|M!!Zd8A|Kb=B8v=V;lsj$6V!{s1~7#kM(u-r zrBLRo2F}LEh$#OFpy6nyq$ejI z2adPo+aSwVB#rCB0o|!Lcd}PC$>7bxdRe8wGz?&~UGgE4Z@`SgHjubBw0`{UFEdT| z`*?b|Vm8>ZDR+xDsbtp^tLbxrrdGxqAIcgNd)F%9F!Bku2}fXdkRv)^yn?v2oB0ZX zkh5j7;MiciO8TUYal+$}MAupfCTQUxM4X_HB+8T>4h692zxx*2e;P z)WA?x73g}S3ciFMCAhHO!g$_3zg=eUJX^2?Qz84_^MHN78gAC&52u8+9Oeo(ENFdY zD#qK-aME+iG%&3m=l$G1#>Q|@kFV`?JY^p);})d}6qW#NkhJi?fP~>QYeTqqk#yn4 zcFevw8HesTWvv^2o~(pi8JA8#ESE#m=@$QV#gK|5Ws#qtXeS9 zMBefw@t0WY z6%Xsx4&m>DrQK5gNjfflrzrd>MrVnAlD@a#iua_FLcG5LjTs7?Egv}oNoIr7l z!z>SB^PkM1Tx@9jaGbY|SfptQuCNG4f7UNL%_|_7n*5p5WPH7hUBzQKX4r+V1+a11 zic>x%99Hg7t4{UC$heDBHy+NbO@s;!V$aUl15i_Ug7nDf=una;$uLab)wpRC$YP~s zZaR!QafiJ9%GqPWP>^UZjcwjxCib|_>C?&#(Iu*wOwjPD5~@g0z&#p1=2k*M9QAAi z2fanhgYMu39Wf;=$LV0yDTe;6M)Ok)H{L-FB7Egn;fs`db*-}S#cIfrVy56|VuP41 z$+CEj$_}-(ES;a)bZzmQ>c%AC7p!)sg5))dI%ivV0tL!(;MF^h6Vh5KdctAJnPga? zCsUb1kVA7G+2ve4o!aF%J@$O!@t*Asm-196Dj1(@PiOvtvM#P~@<37R-!H{Is!~;M z;8N>DZ%pS{9PPreB5f%qn4&|X-SGQ%;tae_oPYU-#I&78`fuXvrmU5uiQ zz_@f8lS4qi-b`O#Bb8?oqcA@*sglk%Nj1=PLi^%-FpjiStrK3DPo?&#sQamI@dPQF zcUxv2xje@d=w-wI4kE^D%K0p%VPFrRuI!WVmY3aDk;L9tt!Si60>`enq?_had>7F` zC6EZlFT-87-B3SNdmfe|szPFUnt`XpA*t9GN(%3$mZ+Ovecs&;L#kuQ(`y6ot`(c2 zwi`!fgf&{?)F1~+!-~%b8PWPyt)8u@U}Yuuwt#tDJ*U(&1-7#A-|F@w!v57!y?FNB zJS)Ag@)UCNrvzG3`1l;=bI%Quta5xygz8UGFd*|7}b2xfPBb#|P*!c6on zS32mp{x;ga{(4`p@qd3%5O+8rtftlDsvE-6><*ETE8H5PwUpD@uYEVXNi^oU{=eJCl)iqm6rezPmZUyV=F%EOBnw$7&{{cDK^rWwLGh>wsYd(R%p9WldL# z|3z+xph@u8si$rWDnQuJ!l=wiJoln#rb~r<1awR(DPX<36&m=NV%Qc2DVtlMpIQ?p z4hBf|0`gXC$ZuuJV2j)IxVP@cQSarvwMIw#_Z{Nm1c(R$tAqgE?e;gF+`pf*i}thD z7(&ILIFRTl8#KoA&H>F@9C>X2S6M{8B>fl|R1!C(h6@ipN2StSi81-gGjz^M&u}5x zLWEohM>@6|TL)|SPLo?zw22H3WfU>Z=U)N0qmgs-d3lj)`GO$|Pd}EyyI;+qt9lV^ zfJ;JK$-;eYRPLEy+a>>^Zk`me;l-17oZKs5cAk7WsyK6xl^6YFGp#1A>>Y~yqW-#7 zUGsvT8IjqGQ3%pDiXTBhRSdEAR8QIma@KZT5$===@j2yqy(-LNI(^Q1!lVk76K-yFYL(1fxIV9@idJ+9P$;(Nh}=5L5S@a0ch@r9NmA0`JXEM?*Jh2rO~ zLEV}XZS3DNDS5a1E4GH9$zLb|TGuzv1wS4{dTAUOM*0vc{zCtTMip6N;siyl9b6C& z%Y#R@%KhM>pxO87P7mkas5TkHn*^cf@3iz{Kt3TykdfwEdqprca}XxBO={r+A5T_N z{c9YfNu8#jk%TrdwJ#*}PL{$AoVM{tl zrLg^@IXIJ4Oun6jWyIUaa}pM$zR2SHkokhQ9ip1^w(1x8(7d?i|l+XpsKGom0Y!s02;6xnrV-=ScoOptFsb8 z%ug8>OH!U`vt~yQNi)ZiIakxBwm54M#x^rs4p~=5V09K`g=HDKXsdlHu=HRnM)LTT|X?BLkzc`7g2%2^E>`<1r0(Hj|azt7rO}eIz zN9xj*s%H3dHauZ8R{kOE0y!iuE}QV1k4ET?r*QsyX7-{!PM%4@)$2q0T=~yq>~A=) z!-biG{uo-FWET8<9v4N=9LmkI899-p$Sbs6mUZm}y1Yy-BHbci<8f-y?BdGohOY64Or>QZHq!=xl_pD58=zjR zp6jpK>RQ{=vC>&tVZj}QGW1{n$>V7b6?5$q1VMp#eD+2}AQ$lfEGxzscSnLB|ir zb_|Q2fy$!Z?NQ2TZLagLo!%7A=d<-mL;0R8UXEeKnO2LCRNvulB$B>C!+2Ilwv(kQ zIe#D__NJ$H6E&emCAb;ZATq7&bkc-PH10fka18rNQ~UM6<)XpwO{~{%fxAp&kL!jD z!S5i!4_HA#27$bmkJAo6EigNjlz1%x#&3_8nLZ{ib!9m;baSH+pBQ|h0OA0M7dNa( zgJ%ch)S%iC1Y*Wq34JZ@y_7lfFkLsO?>mo-4_UnImMix2 z<|#}DFbG=E<=wk>+uK0vL?8C4qeQd)Mf7z!Zo^c$CM+sJ>#Q{!2`ACHGlNuYi$92;VK4A?+8gy%KH3F@ zC$ZFx+@M3v}AliTtFoKq`yj{|AEwnzMR`nG}^@@uX^Keq!7ska5*Cp?D^-E+hs zT-`#Dh22)qlz80&L{oR=rIb#D+hP#&&}Jf}1uk@QFxv#dPe`0JxG1eR;uq^0sU>h| zdk3K3Xg)t|Iu$kkbtcITiV|RsNt50^bbqYp3t&?oym)8hmrDyPZKo1 zC8rF-Z+waf*7m(zyDzsg3n`GG;WwB`vJM`~Lz9|doLbSqDIGZ-eTl{}8FsMH5gb)64>0C=cr#ux4k-_j)UTsn8r{!`M zR5kEb6M7+v^3|*_8z{597Hw4wHIuPv`Ec9IO%y0!EQ4d)t)9Mh^+QH~Ds-ZfxaUQs zy7-E1y}LEJU9UN~|CM_jI5`m}!FZqDbug(0z;$#KSr%Dnb>tt8q*dh~mXZ-fCu{z* zvA(km68izXDo4cN^_P>P#x=2lW>VC^Vq3JX|5$k&{tw2!AxM;H+p=uiwr$(CZQHhO z+qPY|Y}>YVtMB_g?AH;0l9N1>JUcQo);bF}MD_t~Y8-$JtF$#M%>f`qu+~VcYZiK- zFV|h&;)N6-d2R9A!np7-?keE7A!*8$sT8#zr&d%*^%gbz`InD9u}p2W)+&>Wb*B?i ztWy0jC*BTiX~m`N>M<~*RQp7>b(f?#Q0zv7lL`V%%cP4{aPm2nf{0EO&qk_&l{Fzm zC#z1a3d}`SwG`3no#@=s5&*-p#(QNU$4N~`w8KF_I+UoKqgg+FG9ar{A`G)-2A`So zbjW~Y3tPdurbGdZ)WDr{&V86;+w0)NJY_4{sgWI1jY5&NP7%=KYJ_b!h7~!9fzNB& zcdgZ)E|b2Ck! zZQ=smB<5kqR_Zc8ZsEV%1}X}5yJt+>S0wCYE!+g1QuR(2J@(^UU+hGw2K;yY^jd_5 zM-~~ck+C6YJO0@0CNH8p-3=T&#(kH5&+1*cR;uIvto}1?!>}Eqrr8cxIca7dK zuIdab-n(G@*FJT-C{pNTOOISF)zoa8h}(m0ozq}R5OLtN*m6uMI%|Okr+1aFCxaHx(yg@-}||*4Va1Z1;;ei-d%0++g%hu`VR3qV73+ zy7S*SdyEUkIKtdz5N*ENORu{g5$^suC(x&$%xl+rbGDwfTG(I0Yt~Xh0=AX)tooMK z8cks_bAz{=4|wR43Xja6y!mp0^z`@@>j+<5%4l%`CfwEHC}8jb|1GcKZyp5aFVYCp z6pYcEVw?Y*j6;t;b4pk1L18}|Lx|^1&4y_IY!p{HyV<|ZSz#R<^{@Vuk4cbLDQ)`e zU6(vc4ai$YJt-rI05vQzR>vFFbt)v2@MkG!ivCuX2e|ib*LM)KNeIR#yBF{kVm}79 zKnUdp>||~bgemq>b2r%&>CGQQHd=7*!F>)phwtXBPZXFtzY+ z3jO!^T$5#G4DC4XQQV<7)X9l32h|!dVliabF!0FQmSywiUb$W&tlC}1+4AFN<|J2Z z09`N|aVt28K=-lRSYIL^i%++0afbh%*W+1JdPk!xj3Gy(9g6S8_f+i-v-ZV}!EQ_| zGGX8Mrx^dKK!(U#mrnfs>cT2GN4v?d?#&v+lTs*heHt(B_tU3sV;7g|3mPvujjvax z`U^B;`vts~z0eokMY@lh+2YiOw&8RSrIBBX#cg6NW)mdgWFC&)C$_N6yYu3uDU<#% zS=S@{Jnkbe8Dk%M0kB87s7#w{!L?d&Mrb4Cq7#F8koJ)tWG5rJd##}JLb8*{fNQ_c zOrkwr6J+>t8fJS)DmQPZl)v~R^{4>tF-hIS%Mts<1=^y^k1N0bSq(ijWvuXX`jgS* z4pF1gP@IYZ?JFi$O>l>BXlzR?*LBlhts{#UwCzi&9QIWnwMd(DmRr3(8a1=dpc@2L z_kN1m4JZ~9xZQynn61zvhm^N5HhT!^8uPCw>9CJqTCwmOC4r!Y3Wv@tw`Gh390D}& zG}9oBbp&jDBY;{Woj=8Pl{@kuC}Wuj-FQw2#v}(~xT76kl=(v(xJ1Lmattj5122j` z-TC*FKG3G6;yUE20s^>h_P=IbKOFaE%Q#N4{^|ELxk|EU)2 z;I0U=aUS18w^TUmdf?kX$#p4ubw#clD%bIjOU78pJgmZ&n$boS{6)a z>!un0a%?syw$@&l8Aw`Z`j;c7JpMrhES{GVv_0u!eLq>s#~0Do!(KkFFct{on-j+%+tgZl zMARyt7zN|`R{1CrIgkRHCt=o_#pmz&ZVY7W$xoWo7Hz5ABIUBo9{P=kDII`$q!kUg6{M4=91aLL5P71;I?j9z;A&{0;Xcj&OJd_KFtEfZSL38bl6`%zi10zO4u@;y}i?N!6 z#)Vb|FZ3q1s^uEcHFwew(?6Xk47jr8c%sqS9%NA8hzyz1{5-QSl9vu#r7qP zs1@)N8EsAF0HPFKjSY?lf{U{Gu?RW# z-lnRh85MveS{RnsoaHDj!+@|uz7{3J1A6QNBT{{7skcNeTH?rJF}(ILBjggvdGrvX=7(-lT2hq#fPIEXvZwLES8b2wef4QmW8=eo;aqQX#$;Vml8Ia_)3Ape%&Q94=Fg2XOftngXb zz=zPpiOWtK#^_Z94=vJdPnLd_P z4tMr(Ux-ND@BP%EyN<+?5!LakS2oNtwmGp9#j>O+bPLz5#))+~Z^2Gw8J$|&uBkAs z=qpIts0R<#0f)trw=HUJ5*OTK@Q_y!jjfGm_aHTcz>H~{$>3wJod6U~;?wD|jab)3 zFy?7qm_4A8DDtPT*36;p7oJOMDgUk!)niG?5#^Fn{To2QC}MKO>U@?1}?pt2nA6M+mYz@6`56RI0M{v@$lGSd_4JomkbpwDwWgrKmGhwvf}sz=4GQ6by{W z&KM7J$dm;;UJucVYay2}JY!<2oY<+8r5tLHSim!aF@t(I>HbRUan2=Wf8Izb!~pXX zjtOWzU@=tgmS3&+mO%k9FRag4jwA!oiYq5ic?kyt5mhHVw2QzO z4Uf#q%vhEB<`mjjqCiucfZ~2E&C2w;DSb7toF<+3W@a6^2y8Rb4x_?>X|3cs9)xY& z4%^<7f_5ZvJ8O^G&=S~b4u?+B2ty^^OkG};cfnW3nkZFqH*R8>g`9iTLf4}s+eVrP zaf8hcn9Dj}O7ZpS?}$PSP#u}|=9~A=Z5jtWO|hgK!)vGc+szybSO3cf2!iyI-_T|&rN!x!+0 zNq8Ix^>(hqzL(ievj)!>qPr#yVTNnjFkmL@wO!cj=f(Aq9BLD=BmP~8^QnleT)U6{ z?heDNug6(3w*&erC4L68dDqk%;>=ZfJG{H@F5w2O#v#*BvQ`#e4 zO>^7_?~P^()4KPI3wzB*)guIECksNd)9?EkDvh27**#lr*TwcF8P*2`U6R6U5pjpI zJ<47oBbfi=50EM9(;|@bA-CNDx7?^=R$y5tU8o4=Y3?8T-(w-vy&RZ} zlYE(Ov;>qSEioktD@?eu#W>>8S^of)9Q^3`a%IQslS&Rm&)$@K@xbUNMzcQc=bpB++%KkNy z${2vPfN?0-U^(2l!rFgO=_oXm#H`)e>40OMS4);(se;cR{p)2ohJ2qe>~Sfo#}2*P z1@mLSw@vHj7E@MVue?i%C<~RU*z7WAWx1Vb-AoutCF;!Q=}HN0%kU=nH2qm|FFYm0 zqbg;sSV<)V?MG7a&HJ3Cl7M!Cb5CR`C8LJhruWj4TsUKOb0IJ}%CP*Bb>J{jpl?pl zha)Y@JKi<%1Q8U>%trbyGtXsnwv9=34Oac4YjUocq~L|DXmll={nX?jBVt5sX8M#^ zS57Tw>cnII@Jo{)SMKnP%ktzodc;+lr00XCr(NJyXGx(oCi1U6x8@Rau|p2w1wqIa z9v#p*LOQT1BRx<2=q3aEq}O%DQQxJAZ6tic;-%WC_Sg4Bpn4WE5f@X|&bfy-U8y_Z zLo&s2KEWoyDE^6R0q&$5Y{=n<7op>~BGC-;pnmq<67H*h<5hRlY(?bF>aNL(codSf%d0>PUKWXC7@+~Eb(Do3br#)>#H_(CVTVmYF$=xg8(M1 z6hYOeE33o~ab{fL@Zbl*`AU+%MT#v(7gPX|1j%cy>DX1Apm>XCeyD!$-xoH^9B`Zs zRL;KehjHJ-KbM^wH*z?{ml(f(I2zrP^T3>ZXRcY>evzC}FLEc}fo3Pn7_=AO^B_bh z$JH^!L&s0qwqq_7kE=CL^lhlE?m3NqGH<81Ci4hP!&EcDo&VKs70T(X6m8Xgymj_` ze#bKtnok~nH?Tod2{OV1UdbfbA{6kPYFM>Y7rMcoKy~Vmqb+Tv!ERKNL;M(oszEr7FHxfk?mIUsWj5u2y~PwdiC9N^PRzsSQOLD zi+5&o7JgPS1H<4M%GQC;I{9?;l>76!)SWzPK@oa@)N^9I&clhx;n6;kmOm*!? zpiOM=_NoQ003i_tItI6`b;Bos*Vjf?V{j`=4Xk#smmfh?pN)+W#y(G&dFK`j+Za7& zb`CIWx1XI`r{b4h>PD@TD|qfzO)ntyeK`w2E>xQif_qWA^keHea#xwhjzzZb9sG1% zjqZ$dEd5XbFnEpHK4`zuJvG>`!!AWKRS)~eg5hJD~JSepoDBfqNQ%| z^_Esb|*)fp1yCM&$LEn zPTii4BEN0`0g*5}u&}gZD~4@4qgz_P5`8fbptacrd-Rqkny)n-LbO$F&s^bmUh_MH zV;) zzPwEG^`>!lCSR}N$zu`rSj2uqe_-}V2#wohzyDQ1+BIJENfrhD{sORV_MrV2_J#9* z%f2vkFmnD^$%gJ!9Bw<}&YXISJ6l4brVla(OcCZB#649~D{~J7%DU#i0zdlyTj1Ax zSDam24Z!5X>bx;ylvu;%8fEh4^Ly~KXYhG5$IbP_ws3K?vlQNarw=NVrZJk5!T0S2 z?hz=*ASs%1lDwM45U0*3%g?VcNm@FzFRn<1>1XlY!36oPd?dbqcYEgC13q;SKCaLA zeU63PJ0<`G*k~~gsVet=#GCv|808y98pRhfHbU*UJ2GZs!?8#oWsO z8~o|QzEkOo?3kp z6u*=^fR)CS0j(GXPz2g4syYa{k`_h7gI+S0TceVO_1Q}yy=k%`x3b;!6@;WD`i4qf z&UIV;m9n=~t8taTv{S#d(_K%@=|YmdFqCAn!%?;x8|Z@j>jJK5mcae{_d!|pDlb^5 ze1FN;$*|^XFq9exhL%RPw7+}{JNykU<`$BrizGV2C{0cSdf;>y^)f_n`^>H<`|$TS ztLiI>eh+;XhoKQ#Sx3<*t>8Qn6pgA#0w9zfn&@VMgD|paXwqaSi-9tAvdusNG;T<# z_8Ip^NV7$+))`T1em#K^16>KzO_YJuGc6lhshff#9W^X>Dv3z5Wr>OPCzN1hjj;y= zn?muM%Vr)2H&8bQ_TjZI8Flc-6Yg(hDoE3Q9er*i+U9ulcB^Vn1fQ=y#|vZ+0?-{& zbe#xO%B@hQ*paLfvK-;=$obU~uiMlD0jf6*P;VmF0wGS9!jM!^Gl`@VC*K3q@B(n= zMQW6>6?N1LN@OC01?2sf>_G5khCGS86wpD6AfC>vNI-BqXjDzEoHi<MhQ5w7!`(nS*?VHxk6*fLOe-Ay*4=5f}3~)?#i}kYy$_j>| zs|slOTNb1n#h!)EG4xbyat|f5a-0YENm9Q`sj`w_-S=sul7avm$^^ze<)bP)V2z~z zU&my9L_nVM(;1oQoO>N{jpTa{>z{R8t zpVicmI+8xK!P1y2GG1L0fWg(L=}Obsi%C!91)Hu>pr94yL!Ahm z^^RGE0SMgw33sDUuoqn?2ZZU*x7 zqlK7S-zLR3(l^#PKFB(UGpQLj#*E+bpq(BEflEe9u9Ol+;-3@D*9m(IgxZOxzRa|u zAmJ#xQJMapZ&c6+pZcF1Iu?x`Y7VXQHh-Eh8Oacyi|?B={re&Q`=_I0VJa~d_p5S9 zSX@&XIAH%SZ}lk#v|7aj*Gl1Uf1jZETnyj}mX-fv3EW z^13BtI*xDzz47(1YK9!RSqQLX9z-)Y&U(R=VJ;m?`&BJ|Cc;M#;(P1y3AU=FH+ywh zV1`YLT~!G*6k$CRTmx1_nYP7a>22~fA0&(40Zr5FKLzu)lTv$sPr5aPU9BCARCcD@ z_k7sNAjnJB4=RZRfF#?uaJB(d$ceOB_*Al&JYglo<3K|jdn3a#aAw7BpHX0E732Yj z`TML@B?UnQAxzF>v+aBX-HnB@W0kghKqLb4jDsYNkY`*{XwB3vX!TPa(`k#e%QhvS z)|z7R1Qa$-QiVE?2kFEvJ{)Ug?b)js#bg;X)xW`R$^knvfeZmkR6!~@Myg9&DZst- za^XkLiHcPRnRZ@AKkzXx=K?LkC}n%d)!lG=1}u%BNmHq^>E7{(tSQLmEgP-Nyj*+jN1Cvu=jY7^t+%P4&UEO+ zP(OaHnw-+F&RL(PHlBUz*)H!}ZE_AXn5{9DK?<>5SKe1MRRT&uq??Bzk<-$9qyU#6 ziurhA5^236nHDik0vL|8P2ore!=Pzys$=AUT|Yr5{#F7J^N`qf1lP2Y zJDjU6oXuN_7gr}4J}NW+x{t}ki?hWYf#M*K%62Qy%OA<9ZC0Y;u4!ji zNV7-3w=WaG0l<RD#17bBgjyXny#bYPpdX{;$bg{31eZ+Tgg zw&A-oWV&8xM1d~u@N#WbdM_as1=X@FrhIvY#4|D&ss+7_?R>3ky|oBQL8>j_v5b21 zoS-73ip$l3sEC=bcZ9YNFn8(PGJ)p(wcBAtuu=epGJIWk2 zIs!z?KbC`GhA@=JO72+0*$CaVyOp_p)N}WXS!?&z0?){82b9RM!{;uZ@$zB@o-@Cs z*4`D2;GBJCROxl*BLtrij8Zhiiy_Swu$)3{ZxSyWx7VO5y+_t+U?xAsI zBe7biPy9sGtj=o8nV(@ikIiovIM5?R-o||^8Y#@EolXX4nrh$IU6R@)kKU%FikXvl zec!{FSC85#vlCz>=CU6~v~rBSx(5IQcx_5;h%Q}Zmuvj*M2uQQkH8xJKDKPJ+r}`2 zwkm-VhKwI^Duq-giVDpIuXVdIo1mUM#rwx?P&LQ5)L-15{5oTpk&Q%n(gm0&+Kmj> zP|a?zxnq7yN@M+?0v6Q8eNAp@w-p=efySNMl!fgka}CjLlsB?>&@YG|eJ0d9fUTbcz@GGM+I6)kj*^MAVVGFL3^-4n;1cMuPE8Or83j=b-Js5hI z0T#j)NhmS=i%%Rd@2wYvQ99!@)F0oGSMI$a+>X~4p%e9o97-THm8jfd=Tm)kb#=^` zGwvG4820l4ZTmC^2JwH$CXt~9DNYU}>y?cRrZ!~|a=6YD*HE3wp+MUdMn<_P10#cx z1!){lz)Pma_a2aB7Ia~Iwc+*io)j~vfYmPH}D za62&@u(Pf;DS3E|{bGNV>T*)p_}R=bx0##fA7wl7uY@>jX8Y(VPK5V@XQ%0GTelbQ zkq%)A(l|%z1QWBAVL;37OXILOupyrjNhL8*Ml3k&uA3@&Os(-~!+Y z&LOt}gY(25FM2^9In`chgST0#yFQRcKSX6Op{>>oca5dEYeMc?@wZFq~`qf6D$@$_n{VDxs^PezCZLcII@Au0vA0p`UK4{x&KF*(rA|K7ac&-{BH0G!yz zj5Vx+4TM$S{>=$@C!N0xqh}s>V{w33%z`W=sNpgQLd3{F>ie#7d=F%W7yl?-sBX#m zeacNf5#h2wU_o9ZFq)DXhUs$ilh`3?$xg-X@V59Bgij_w&E2Yh%|H%f@((s5RbHJ- z4VfFwDZr*f;8bjC#zWNItmQhmt|jlUQ1$zkQIj2;pXgz)5fcBJ0Wps0Jdq<`@~3V8 z4lB*}hkjMVXPC~^lexshZ$68w{{?5E(k%Ob!80qv{}w#6vNHbHEa)3v*?&OJ?(K~_ zM;k4I_46+PR_ycBthIrBrraKyHw0P6gdx`-Gx(3MLa8DVN!61kUB9KLJn$nwI?W;# zB*{b+$)Ed|ss6~}`d^R3aDDji`;Uu{t0j1PEgT?dH7(!w&#B}9{C7c|7*n>2VCOJN z(0(88?-$^+MJGFwvriCz&~MiJg?rq|)-#>&kE6Z5zobAb&H|usGM5Yjpb%U_?~H=6 zyczQM-$?~l;Q8_|-3a*cQrZ@kWsC9R7;E9%rzu;#29`K`Ab@;hBovN4V?waVPOwK- zKaV${{!_IwAEOKUSR8GbvY6Skyz&h4n0gjgIp-8aCdAMtOFiZT4+Cc+;@M_(%gmTo zdDyOO&3bJf)K-*C`RW`P9YTZWFXLE5bSSe zi%cH)*P`p|NPG+zgd^;U0W62WnPbm>Gc0ylLU6d8ylyGKR@VxhEkVlVR$508f5+=x z!$J(zL=wU*PvH3f#Xf%lLcBj279En$s@$L6`-f}b_y-C)p27d@{f2h&f6vwTe_zf0 z5@NJ`i`PuT|3}ck*JA>WC@=fCkh~7 zMV7K$g4qMu6DHPhg6SRW&;axG9-DH&0d;%<>ooV^4U(`mDsB-iduaSU|37kutNZ7v zgNyQUm|Ldc9U4JMBj#z-hWmQi3>v0skaoY{5ACH(3XpkJ_;6w*w3gi0x`9BbT)1sE z9a8nX2?U5~p5Z9#fmTyQV^{!`;2tJ46OX8=wV}!%B-APldiGooh z6E23ikED*=P57QnZe8$JUFPyXSv1z`W^-{e2eMd(<<(bGLe;`0n(1_=k_9&RE81WYh9`Ot#^9AJVD!Du!HTA|7B7p7bBXC(XPL zY<2vIKiTR$v;8Oo0pIOdi|>u1I0$t|mm;AMd6y*;p(!Lj5r%|2F}MUL{-_Ntt58L+ zSE8a4Oeq@?HHwH|hptK;+)b`RN++pXS}L+k^yhFy+`4XlsUIaqwC0<_|GaM^qM9Z8 z?G4eCxlK(2i63qL<(jRR1(@W}zzuK?4-a`sXxPmU0d)cH4GIYU1{+1A$WCl%@EXru zC9UaONJUa3TO%%9BQc{!es{d35NG-4pn1W*c@T>{7+4w4|a4Rg0N&RjLEHx!-^%{TbXVZw$mm# z@7_2Q6vavGs^zmOFBlreUZACHQ=pP0=Zo-x-j1*1heJF$qWLf|>YC(94nO8;M$*KM z=_tgVd6WDk)VvSWVw@12V@y!Et!cGNfbC$fcnX}d43vOKN;)0{&6c9}4x^O3PtYr& z9#zx>8s(tS#fBWkNh;t$?a&DD6&uhHBjH;L1Fj?>|EPBR$(@*u@9crUMUpN65l*}~ z-?g7(-3}5yG$&vryJHQTl&KIOqGW!2Vg=?ZW4+THB6&1^R6Thl4?7pfBUTPu!+cgq zYjo@iDaRU8n#YGY1(=1y?quV|!a3-}=Z~OaQkzE~G-eb;;?uYU!efwwqRTtUN}qP0 zjTXyCD4v;bLl-O}jUXAsQcZh(P{0{l;^7;Q1_$emXP$h1hUS2fAxH@X(}ol>1%rYg z=@cg#GHied2l$WO$@u&(-eTJw*|t5Hc}3c#A!T4j4tO&K(lwve=p{BU6brJVrfW9q z9?MFkiw|Kq({MgvAHWSf$nXovWL!X`0zlYSNd)(GPeK>c))a*{k6i?@2aVr!8Qpr` z-nXT)x@SWrgd$pw>Zn{|7kIw&eqEi|l?{XSN8GqtSFk7h(&;7l=0#9dcMQAM{Z0<= zmUzu%ix1(LOXv*)#l&2K*}xu+NvaonRSG`WLtFy~4e}G!fy9m_kI2r$9+4G=JuEAV z>VUKo-Cn-HCir^e^*(d|lAhSLz^LDodF}L)e>EeiYCBxC^N+h`w$&4OMJsbOkzqEm z7p!Q0CEVu+`F1DU*M^UvXHWL2+fDAlg{-Res13-!cmx96vqTdsL!oVws&EQoi(#ig zb9vvz92gEiU<`IQ0RyxESIG;+oc4}1dJ){xe=WzyLq+tMKo%tQ;nmo|w zlt_=h1?wdqFcp*J#2_U%57CsL8m|GU&ro-j^2B0$8}beJ{EPf^x~@?vl+$wFNtB9>@SnWvfU-C z*v%yc53HU-c$`m(%?SpAaTWRj3+ys~drwCOFDY8Hc}aR_Da#Sxi87dCdS@PoLHu`T zxqm4!U$&(aN&lNzbwIROe%#(9WFCA&kgA&U;s@320W%_cV?;!>Mo1FA(5U(KGd#U@ z|J%lv?x30$;Nvj53GCG(o7x>lBqXt7D{8$;L*joXx5f*c8fZJw=@(KQR2vhRy7+H+ zn_R_+j>VO$($WcH*ws9O+t1qsc2rgf?5K*s4k22I?5>|+fByQ;?fx~fKlET%_O04M z?!}a>s&uEFF(2v)IHhf{us5^73yoiekAvIrCNmr|R<`@u=?n<9ghq`gH6RczED&U^ zw#doDW|0$x#VRK314v9s=ss0#kOs|BZqr}PMC$}o~Mu8 zxH)uFCA?2pD~>OLmankwI*;miEwq~F=!awQJ@;G&GZa9dipIu!ljSw(!caK=>bY5` zHpVjqqW-;gQ!y@iSb?GtJb4>|v1pkO$^cw)HU^Ust;J+uuQnS1NnZz4?zbOK`pg*S zcJKidj#0!BFR5p?tL^j>k5&E)r}-EP)3VCemGnhCfk!m&+n)rSrAy; zL%DWa;ro+OZtYyFlV$13ZLUPdQ2jEH^%~D#16d8i>m=}+;i3MV3#Q&5nvW@ATqlj4Biyu&nV>lnogfjT=(Of z!#rz(fGGR-ll}dG|KKTocw`~4aJ*`-APxW{Tq5fC@3S)WFu3RZtmychDn_KjFa*&U zGw_EV95At9eP-kXs?GAubLK6m0E_YOm`EJr2AEIwr>#_<4;}eXfjlQI%n8Z@{gm); zprxupdjycL7ec`gCPo9F(lY~xn3PybiX0MIn92|!JnCUZbWRO4_b>h@GNX# z@1V{y|LyCvg*lJ)161Cw*a~vRBv{srYOvU`{rTs_46{4r4H3DBG5qos53!mgWVJ!@ zeJMp7^di5rxrrgANfX*?58pad&V4mj6|H$-Kh5|R$mbC5EM$@V)oMz@iLe$38KB^+ zawQf+b?1wCgE5SjTWz+Zb?ET=@j_n*4QsN}UU)d`@tAq_qlWs8bdY;8$4O6&6_*-% zh%&|72oIV)7`$K``)!U~?fZ3x@$fYF!K14O3w$26D9Nka;PJ_!t_OrAn(ubfpFS_P%{e`&PyY z+&4y!2s73m;ael!jr$Cc`JdYCEs*;GEnfw-a#QNRu0=MRJzjn5b-zCw@0i`CjEg#V zXrZMz(X5zyJoH-I4Nt=k?wEa}yt7Y@~=BlhDoE5rOgr>GMSJ_Ao^ z?du0Vd#(xZ`rg;%|MErCCk6E19hMJUk>N(&`)YZIf1=ng)m|ob)_+YOc!B$-gExYn|abru#|TXV1YZflyKREdoC;MVy)=# zKv;U%+MabuI}8P(8xN=qRWzk651R0ZI(tp9&w=ihGs?eZ$tF%w0(rC9alXSJ-2`^U zbd?Fx6Bj#fP5iSl>j?yV02XDy;J66A-0%3k+x5%u-CPW;W@eZYF_tj9dmdlnerdh! z++yoq5Js|ilZbTBTDLMc+*SIukQNCmpQt1T1yPNq*!u$EvN zUHG10C3F3q$;3dK=8KVpHI%8c0mpKF&*sAx(^gDXl{xU+aSAWmtp~=tz;LH1zvK@ZJDHH60V!IJceCH z1m8kXi}|t6iO+qOy}?O8c|zX{DkR~#MI_FVEK9d?yD@&*x6#_kRL+ldov3i_Ghlt- zDn+57WW&G7`l^B}u#_q*tCl}WFpph zVsM6tmWF6WZOV}a6;vmtN0Mko zBB14i2b`L|f#ThqiVulNuQL^dv^C>K7?s#tlHROBwq)#n-_geT%Mtq)r7AXfdx+Ip zAI%@rC>*QPmX5D)(!r;CW(+2cK=Qcb!^O;YmuqKaKK~N5?nSSW$@tH%bBcAGIhS)} zqe|R{7f#h@ja?6H_KMx#ymjYx2JFEi+1jh?v2#sIqg~MiX_Xd^Z1MMNVxL#sQ%TeT zr_^|KM3O@;;?vVhT*|zOskTCLB|9)rcIxhQqXl$2j;;RRmhDs1 z5fefG0GkWE?=xd~y)))?>FRyPC8ZhD#@J1R*PPgD?SXD_X|&<2<}mY&-LV@(p3D9U zquB!Zv3z(k5rg%Q4cngB`LeFsZW50tnYvQXJP-kQ!t${&qCdrpyd4M7{tNXZo|Khek{kobDwQZMA5z#B4^T z{&5cdg87V@<-cBP&&QE*=7D!lz5W2a2NnpldNR8()dt)A5?Ug&sk6_r651h8vXI^h z-b*Kp?#~WL=$K)h3j<1&F5;o~%DuAVDKLJHg88cbNX{!bpAg!76@G4mz zAy?KGC^OvzkH6W6pAnTha*`QBA^!q+%zqy3vL1QUbg;?hz)U3vgYMlmosb3I8h(<7 z^?wSxpqEjF9M|-GJ|c5Fze`4IA4BG)eBiaro274+%ulvPdg~_T-IB?~=8$*xY^FSY*`u-- zEZ}LtY>LV_{OvAm1ksEQCuM1?j~sI@PyR@UT|+W0x!gW&BerSv%_q(OA~>YYXaFY* zlB($Ji_5=D&{lvLuCZ+DKu6wcdk#Wt(O((vl zefjruR`AidaBf>k0BiK-=WIA4QCF0i6BNrO8D^z$#h#7x@?h~L<^`cAgJX;{*oMl2 z2IM=Dm##lvgFLmdMe5=tEJp(|&rV8hpeHT%xH&xq!R>mUYCC2h19%9-3_fIZQ9_mLr8&d3udIjAn2 z1;yD|vlHFTSI3*2v=da0P-}n61{jv6TPw|o@Q>Hu)(XHw9{11 zO#>-;8s;q`4!m;<+q=F6h8@mlFq$&p8$p-Nz{!KvQasoU((A_`{)7PLzwo<^tp7`E z8Z#R!%YPL|>HM>%wIlZ3)n{xQ5lBD%0HBGf8P@{l6KS&#hYJLz2BVHV{HN!*_Wy{8`QKM!}-DGa<&i_4|%jf$?4v!D-_@JAcGRcJzuOxy}O1rO=?;HHK zZtvruyL;~zg@+pca-WCgQW!#t1RD;YZ|CQkdHWsQr!O2_CMx_ltuEimz2JQDU~M?w z{q7ZOPsFguQxq% zNY&E9#fve`3Wh&-w4q6Iq@(09g});7amy2Ku}JUqYjtpZm2Y(z+(ii=o4)SSa#b7F z*QNsh?B4Rt&HScU)cbW_FF6FJzMx0S%J7;{;~j`}q;xtOc?)RF>js6cMAr4fM(@7I z#Ze*q2kiu`@Vb%AfJUk^-Em(GFgN7!)ydqoFYm=yguGW_A_qfXI6&>eXu*=QhE(=N zR=L?3a=LV&{Xx|`nmci26g3v^CUg5;L@U8sy3PXC)8kV`*(^ z##3V1)H?lKsnPlS^reVo3h%okKd~^tjKq*ws566b2*r`d;Q;%tj=MxDt&HMiW^m}X zFea}>G$N%p8{2;V@1v?8Qr>;FynwdT5wicMmHu$gE`uAROn%NhLF(FMl26o7AenwH z=?n;1v8m?ROlDG}5Egs9yJgvNj)I@0>Dl#3nd**kwNWVXm)K-l);mVXQ<&O!rB~>+ z-&A<_-uUU&zxJq)vI)*pQ1-IF>Zfci4C>I;q(PbBGrKLHcY~^wPO8x(sW>Ob@!YR7 z+k1^NRTZijI5hE0Zqs9rEv48g2}Ph3x*^*}dBaPiLkzpnS2tNKPF;E)R+V39^abye zwGTm0Cig0HEYdAKQO?jg;>Bv5@w_EA4z|gNo13;bE=EnWf$>4G42nKC?|xHyBrcmX;th3Af8#io8glEG~1r@2=Ei=PdHcDXQ_j zdCh}ah?ny*TR2CnxM`rKQ|)>~S{x}+8TTNxbO!!=7tpDlylYhu)=?%ho}MuYMIuq@ zOQzT%P2xczQLk>Qr||xrC*BY!HPDw$r8oC6`I7o@fxfVU>imuW9Iib;<+$OAP#B z8?N9z*~QB3!qwg`TN8iScCT%&{4yzRP8ado*9Rv9L$lPoMgPClp&PVy~RmL$~_TI*ZT)iE*EW;=wg)3tgk z!|pJ*aX^b`Q5Z_T0D>!;**TkW#ReN#IK-Kp?QYT^b88wR9v{} z^yo4#_$|%Rw#AVZuAFo}byWP*WOBcNK3GkWJ!-C}k7O77G9vv*a?LBJV@{9?k_gwa zql;wXkMQC<(T>Xunka+zKqY7#T33{wtSXdD4;79kRVOJ|)STf9obOWqaGgH;wL z=e79;erBmKZ)+f-Bxv$X`qS`@refFch|8$Rx{r@-@?pp8BdP+A#2t=D^62g%aV(IO zx329&h3dGG;v)xSA`Iah>T0-s>z#Y!iE z9DNkQ(9gAqvD=^=DjzLAF{WoTb#KZ&#(eaDv1mw8A3cRMFyWvtmq<0 zjrz)w?)Eiy9VRp@0cC%!0q5CEn6QB?bbgiyB=4Gdrj(wMpqrKBwODaKU#ggwb=G_m zfEZ~Pmem6NFEi4hnM#l?sv60C<$bzb3bP>BGgQFtT~7Qff~o(SY*WZ^aSHDOMN@vT zppKV@3-o0yNKq2f2|EtIH`_@?8mP#)o|9~uYTuoV*DVhlf0-W#F}s-1)iYG+Myk7r z@z3LT2q!hbTaKu$0bL0=%NBzA5$p{BW`YL)^Qgc3xRMF9HH0S@R7M&lMXf+kzyW8rp@JDGFj?lF1{%JyKc<>V!F&Adk-Y0t0%{=ngc# ziS6>&i1H9iYM$L}ip!1D#w1$81T;HyEyC(9CwD3c{{}=92I5RYZ$gNVdoiDn(pxj}s|X7seWWp6&$a1-))>Yq3Z$=W85(}TRh=+aK4|>=N=jYG^Wwe@8Q>Dzsouo{_AGqW zyo_!mvI+sdrv6L=I_o0ABc@&+#Q1kEV20}?QpqVw!jE&=M0k{zfB0U3%32x3dP!^f#nhY&moj-qgWh%Y-Gr7hIY&0aDKNV}&fpe| z(;CG4wc#z=qMOyGKmPP)wCuLL4v_Ch+y)4s20OgDDXd@|8pa8vc?@`Re`$}hYD;+7 zbwj3FE!DSkIefnSEO*HCP)d7@pzuax7!ufphjGYt9)CmP20O8rujN)w#jpGDoWS~J zdUQB0!o6aX2N9GY*-B=mnv_gHx6?KZDwv|c2CQQTc%O-z0wft@=*M?}iO9mLy~b}uzPbs~ zNk9RB)!5;Wn6h&KQ_GUn8`fRS|y|>`MEDULLSmDH&c|~Vq zgQkJ4J!6jwM<^Hag^uy6PXprsZzUKjkA0QTIaP5JlppB@a67&v3u@od9%>&PFTng; zb)qUQa+*k^s1}wt`#JBSrgB($xPZVjkGEnG5wc%)!fBO>&s?({F`8`>sU=c=E-Gj; zSoQwTQZLktobU@~V>LiM(26eJsm?aOqD8&EI;iXwNZ&%M%<>cRkuCs;=mMR4hCu9OXat3aG&qb za+AgD+T1>l^a4?i9DJe{ALgldeF@phyz`#Zp-Cl!tb_G`tG=5W&%f>vBu_vYQH8 zv^=LqXB94H*(nPqNFC$pn49bw@vRK#<2K5k!jdG<5kh~Y7$RsHxJV-bSpQBFs|(f8 z3C=jyCQ$H>ym+C`dl;JfP|Q58hE`6WxRS3b`i0MUK=C=QO8{oT?lKbk)Yw&0Jw-sD ze7ki#ciB}2AdHu2zCxFaAP0k4FfLolSZn^y>7+(=&9rf~OR?oJ`0Yy-9=Jyjq8qK* zl2_*iO|pR>Nu<@^tUSgz*ig08uo~xXqv;LkJzZx11r}{ zPbZ#9@%)fQ38ID&?nZjNN>pcF59dytnQ5}Xp;$?)mPfi@w6>QDz=CEKWet~J+2E_l%T*~mj_N+29(*5_j^dEzsh~1&*QZ>m|r*C-wp9dy@SlZH$ z+kM1a^Qs@+a3s`v&=U9S6`P-743F_rdwF4O`7EG1v@VUW399_ut%)&wa4X`^r0HnW#YqC7B(MdF<6 zD>&Bi?iJ++^DXE@dr(xo+{f$Va+R0Y>-{5-Lbf| zFIaru`o}fUs0)ZX5#Q#d_ZQaK_pNr<_w!Wu7ghttd!WFfP&k4J4!A+t9* zS6uD5aGOkDO39h8;~B8)K5cC%BIeD zg996vGehrni&A0H@H&k)?a<)+nkD?BAFI%tuvt1I?IwJ##15Dn1rD)%uI5*8kjRHMJj6y5Y}IA{j}h@x zF1-uLD-sd5R~Y z1GDla)&jI9ulAS|%3a6RIA4(+@^x}G_)a#t8v2)idyoj+>ITA|(nqDXNUjjnGL9oUSCLWPnrvMxCWbgZ*-jVcEV!S<%>QGRTX! zj;w9)qV7zSj7%YmR8|vdzz|dtWO|OQl4Np=wU4BX$eZ`9ofF{Z@GTyjT(88Rug&m2 zG(uLuqn*;&#Eax2&I=cw6D&&n6qTExS1cqx6^dnT(DW-h?{NGu0iTTFR}z$HvA-o+ z*35Oo9i$3y=xHB54@F(gUK?}O5jqmA?5P6D8hKo#C65(Ia}FyyT&Ymr5YyI*T=@s` zsbH2lMm3a#PLvOCs(wyr*p#0KGQ@<$bl}hU!#y1cJQPk$wq~q}avTJD3D7(ULqmYn z{DBGZWWVF$Hlp{T#la$~$*SQqh~?Wcak+e%7Psn%#nVrUf>AC@Fhe~=ie<5txkYU# z@^V$yh)Ru1c?;kD%h3WYiuCS<;Ul&?>^n;#RKcWl-+O3!T3UH0Kp zf{s}%rUGavuuQdvS3trfN>BQIJ6sjTt|rNzrI=*12raUOClW&soR~6aXc#C!6m0I{ z_goj7el7=@au7xvVW@s+O)Z>6ld97t0x1=F}H-%|~cfui~@Lun^h$x#5SFGyvM&(vyJPg>aqZQu8yS+5kURbx%n;m2>LT< zF}B5vod>8CP__%;E5yt+w&Im+X8ao%fU)!p6)q|OoaLCmGWrp6q;T{e1TA>pm3XhE z%m+wj$+^x#wrI0+5^D+Wc0yc*s3t6)D?(})2m(n9%=!t4u};f8uk+uEDoR@VkwnPu z#}}{IVytzN*zXa~8R`WynUQbW2uVC3Xu@(FTUU!#C|t>TC;40Xy)$7X(RK?>M#~jV zEr9k^Hps3N<$%;G?M+W|n`Owgmvp!2Dt{ zCtL~a{8cvN5Ia#;!pjPpqTLDQj>jU+tb)y%ETj*!kpRnI;2ZUJMIYQm;}(CGkS$D~ zO(YFOFC`N?9m?w8h>Ak`$pMS>C+jq&Gftvh*nKQqUyP*-rEJsXYOSa8H2TZLWTvNW z%ht5UIViz_b9xzM!PXH{y08NaH)O<@Yf<)fN1u)K*)ZJB82AqVuF-#-oG;9nqls7O zy`ZW5X#JhDxm{D;kzp(%?S&2@R9x zuK@q_*(!u7xTw(t*%~#}RO3n%?j*q2rvJI^CvDxOyaE|Y6^Yf1bjH0K#>lzd=KD9dyCvgq@YuKfxF zwbTy((VJk?-=TTf!ljF#B@KsXeE9nHtJhqB!zD+Ec*Mee^@Dk#1WzF6M_V+kTTL3 z#mSO=5vAH=kEZE{LComNG)MKJl5vC|AbeK^kimIO4WJ;OAkz$(&p2tOvF{Xnd?bAo zsBN3gnU}AQObO=LA*zP*BJa(^ zTquJ_wbeGmC5Y*uoOW=v)>)yTU0exvaks*%#fNxjpH_loEOqsrW$EtOH9bK?>%+q-u;mJdcRqh_|}4;EnN;K&8W5r#wBM(zMJxt^eR9qYNekcg~-qgC;; zC&T^(t_BKLGX&Q2;ACUXOJ{xQ6~?^QDM?=yts-ElB@_-zT6_0tZi$k)Od+P4$R_p2 zByjvD`ch<{v}QGIK=U+6@NRgic+|`k~5K`!pk<@?{@vGkUL4i{$@i4nd0T8;-?YQ z2DErGBWYbS_hyuRH`ejT*Cngb-d%A!UQBS9)Sk;O>(Ob^eU#l+T%}b??bRB~iBHK< zGWH2*98X|wchr3YeqZ66p$=5h z151SZSq~}8{?KvduGkanSZP*%H7{GJ@l$`;zs+wEOoXV16j3vPL%v&8Ru?74h0xgh zu(ie=)xMPf=zMwBF>4vAY#uMKDVo7LH{xZ($x$0pXqj z4sC9a@s-3ZaW*gHnh7kGV0HFt8rq_DLy^R zD2<5@21qtvc?hb594&kVl;yS6o4Zlzoe{F&ctF3?UMXI-dOU(h5tjot*yB__24X~} z-J`3AklCn|IGYNO9Ys<=G2c2tm>RV&xO1@FJ2l5hWpcEhN&%5Qc)`Tv^fw`S{EmD+1 z_PJzf(j400_3Oidm}e~w>=RujK5EO@4bEP*Yh638oRN7#hS{n}2%_LU?zCY{?>Kqc zPrauF*vIcy0Y>ON9$nsiNDiH3G^?{R6IU45xCd(Wv%_>~Ep*0^@&yxlw?nO*Q16jQ z(}4{FmSw7`X&n@vqncN7{=PndnDCMM5ifli4p@i3rBaM!dcbGsXs z?&AeQ2Ym93R+l~sVP%NA^?KY&KDLxE#JOYGJFnR^UP5~LbLT53D03CKO^2Yv4wA=!Hz6DFya ztfJ8CTaBfs(LJ9;q|q_o3P_>1d%H@t`77xVpsdD8z#w)BUN3#SR`j^+U~)mdeB+IK zaNU^r*zeWLB>}fECQg1aZI??|m`B!+9Iv!on(fI>>#MKl+jvpr6~xvueJedn_3ZFf z(59=crmcxUyY^w&FNRxZh3yZxbKkLLh4hu&6i1>3IM6vl&uDfiEeNP{(_2!m?j%x; zqS&-5ag(E#YZ?lcrfN~7wf;$#EV*D75=IN1|D^W6UGZZ8AeYDa;_=O&z|yq=M45n? zl5c~d6d{?$;stekJ*LCQhG{|&ICgWAlhq)x_M-Sw0WbU`>MmG_njyj z(T&<3opx@FVm!~@2pEY66qjY;$=?XyIejnrewx|qvgZSPN;1-G} z5OqtkQ}-cmNSk;QKe|3}{Q~Vegyz{kiEku*q6s(Zq40IipnJVvKRp`e^(+$0`m;}* z<9y2If6A(*zC(-9Mmg3=yRz3=&UmZhd)_mt@#4A8O#`{CyW7I$cSVGDICN#O*69*= zewDw|I>=F;~Efw}SmcE4FszELBAMUh;3Z+>3x!k27el8)raev&V)$>etT9|t=P z_c&*>76-0)eig9r+KeOwfngHw-rqNGN?)_Epnti(6tgbh%z3`P-a|D`I|~~cr-=SU z|7{Pyec&x7D4miY#{BzLJy}Y6tVNFIi`35iQJxf;`w-}s>ziRX2wx0L_? zu8dmYHSzRB&Zs^4rCD(Ka1Nba>YOtcnqM}1P()Q@ZeMljF4F{(pE~1U7Si^z;XAX@ zIkLf8hiKGR^waFD&9^{S5;R=i@-<=T>b_aa=t4nvW5eWx$rDu@hi6}pN;U)B4$G66 zU2>Xf)OLkwUpnW4W#R#cV&YY$UjEg)loBJbsi0@9XVj3CAsC1%O(e&ev~_)LV_eJF zn60SQuOt(~Ey2aB64w06ayKTe+h>j zhVnYsN~X<<)&8i-v*RNybY;RwWx<)#KgfVZ06iSATuH@5CA!ylO2Qwh4FHCy z7AH_bQ!Cn&JN#dMlw~Vp&Gzz4PP=mAoiQo_S z!`;#gO12}h3E>s~p$~ukuU$g0>@XJL;4T#;R}@6-AIS-4a)m)CQu5bGk;&2**HSxJ zVHsaBM{bNewQS3<9oX9X;8ZeG>KIFcQtO?m%x8bBMkdvfZq{E$bsNcym5GIc!rr-a zagfedii8XcvCp*X@oSu`*l>e!6Pa|)BT;}t>z&JME%Xm3kv(OUHZ1Ooy(bk1`;4SI zak#~~RZ&R`^P^hGQMkh5m)L|YM`MT8hV$Uady-QLV=<3mN3;IMhS;^YL?9C!R9|m1 z3L%PyXg;<0642BlN1{-dRS#)L}PZG@N~n6+pUuuXl<1&tgDXv#XQf~Zx+4%cDZEI zaPMYg?LEGV@`@HF^=deL{+lRlN_iu8%u7fm`Di-osF3dIo%{n?@WM6JFX zLj~r6670uT?5O_NPNqNb=7scii$V@xpqP`|TVbEFX`P|2zds+7x;UpF zEbv(StzXN26*T)d2?1;l0XVnA?EE*NOP zA{h~10rJVV#CqNF2n%%yx{$C~3hJXO2Fv%hdVaIRwRcoJh`l4ePn@X1r9bVSZ^o~8 z=R6^*n1lLRegTx2B8)>3RAsq!8N&PN?=8K(UY9u=k~o$Lo!n4=xgs^J^x*8q6t?;g z7}4imN@sMJAhmz#l%B(xh+p+|JMYX@e?C`hC_@`MNe42Wdx+)YH5&J()-Ecp<$x8E zqI&?R>l!h!Lb99XLb90^&u22;)8QrtAUQ4fbzN2-qVoTmxTsKtdS~$A6|_IXSaj0^ zaezT}HhDMjOgRm#3}<-`Raq1iEo97L=PAuC#sx@Ad4^}0j=>Sdl&0{ zhhrm#qq7=VBR1Tp58;}GLfPzcIsCat;z%Sbn*f7uyhd*r-CZVnKwk6 z>MXCZ(r;IJ)|$5&KZ26}RVWlX@6l1p9RDgIgSIkDVZ>j;?z-Lk4(Z>_hTkC|BgtF* zB=Ec3i!Syw*9N}TS)at)R_cD}u5gBIE6vzObc3HxS50K?@8lcG(HrVWsj4#N57$Rd zQ1>O1egVZK)Ptri4;6K52D?2r1>xgR@)2iT#^Knz-E#r|mvZB%OwT|crzf>2DZaCu zm(twKEly{NViRV(9?koxXdLYXfh~y4eXF95R;xNo*W9@;utgm$%8o59`Xf?<|CC_{ zG`}^o&Xl6~cSVGp&(rz1ZguRLBp#6v=8zT(5VN97ytRpS%CQw4z+(VFP68pR%`Kyl zcY3{^YREz_e_L+QCS?Q3Iox@dV^c5|9}Bas62FJXD=1%p$Nm#^Hfv!{9Tr-6*Nrz8 z7>i+Pv^K|oUbv43;KR-GQt^%322EjrCr=|C;#I+)rYN9H2p=|aPJUTU6>23r4L|;d zJ6Y{DXM)$Cr)4ks>iD&uYg7zj%H28TmOBW!Ym*RWj|TOv>b4shmrpQ;!j*K4m|G%2 zdnzF|%ij@4Q@!Ts6ZO+boLdvUy`<&+S)Lz8xM=BZU8!4tP-9JkUtsE#Wa{C3_=zD<_W1qT zP%C2H&KQKbk!DrX#vh|>mpg^$%JB2uQM*lEI~OTj7=u3`keyZtL$J4|5#va2; zWS%FFFFz(zxW=BcL7qFA>!9DobVy7BYRyR4qZD*z{G)(_vv-?^;8lFmD?M|l8k;LT zWnu|6-(TD{Y>>Xts^We80};v!iKBkqha##y$$rlwB4UJ=y$f~t$<7yo65Xj&FjSU|D1M&;YA_1k=5N^|GzwxW!g8K!|?KVP06RXwty zeO`2kcb-J@-(H6pxl`&gN9%M#37RldJ@{T8NRWh{aW4q1)k#7J{|FeI;su5za8oB3>o)W`!Y4hSt33>5YXV>@rgY zBO;LkyCUC58ziA0a6*Q`=EDHr{0gH*QuyF?U) z1k~h!KTt~RJ8)$4k5P~W79*xb7UYQmvAW6NS?AmA)hv%`nsy+w00C?k*55W~HX|ylu))K)D}jd)B0(6S zV7?6LU!_PXx$OHvHm!*{sQ5*C!$n&O&d-KnRrf}gke2E`WfJr!6X7hJ?}JeG!I?d&fu*W|~WO_d?oO(8P$P@M*}|aD-|`3v8NcN@cJ4 z=UJ%DAv*F_nhu2tsbRg5sDmbe!21t>E$DxA<|<0(IkHo5rZ(Zs)*a ze4iS1XVM4n<_mppzU5;aUfa@%i)`|>2am>Ao+*SH8-?GNglDVWE$R(cquusZRMHpc{KzTc+u& zz1Or!&5Hl-!5H5vS zI^2tdXrwGcWEWuh~jg~IU_WFewAwk+%U%}L#sU3p03`!&^~#)*|LXO=nZjJ5Hk zOKVEJqayUj$riN{W9!oVvl^48<3l-iF*SPXDvv0$L-)8pAu+e&jqt2ItnyBg=Di!x z>*Q&flZ4)Aqf*bbB8zpzJZVVrQVi$^K`DBnrK&s^;^0aA(AmZ@64E>YbYoKyjc662 z6zWsesrAhV*EtZ<#YQMGSj{RM6@Il|!f$;jaR`fi{DL8SQ%Nhq2 zf-IJ6VE!S-5oK;lSuzAAB7wG_3 z?v4VzV1R}}QjSyp&WX`#&F5Gz%?>v>jDBy-R6qJ+Yj3X@_;n^Rc@uqrM#2VVWf^fg z-`z{8hA3MDiOLD#|e^h!5yGV8*@Q@ZIXibK?svaTr;9&WSqA~ax-Y{2wm?# z5pwZXyMy9KsEoWAoIV>GT6viNcvrFPY>jF*fbWe44?$Oee>b}U*+ihUyG5xvE6i(m zCi3x{(e4V;!3rRqg=Z&+H|9^cx~o23B)CBAafWq4L^_l;;|ODjp9nK+4;BB}&&<5N zU6rKmb=>_m_QOj!Tga&J644sSs{4wQUA7^$cc?MEA)KrUsaF9Y^qO4ONj`V!Atj4| zL%-=rvLA}5j2K~orukaJ1c&jx;dU(;*lnR3!B=pj5;Zi#A0&HuyOsUgB%GqE9qJdQ zF39JS-SDI5S=s>wwdLA~ubXfHS`b7SR@dUII5?V<>9Vk1)JyKZO%6Cn0#Mf0aN8P9({VLV%h zDcaR<)ETbr(R-H*^{ut-@;4=k*tex}1I75uoOUH;ihxeigib(-1UEop8jP7xw?y!2pICmatt<(u;A}{;k{yZ6bW}V6BclX4i&%J} z;50+5N!zeqSkv@nTIqG>F~M#-xc__~U&nN_;!XgTYLurPLg3)e?zQ3tfq~p8a&^QU zN%Z_>SczK!w4|0?WJ!nSZTAV>Jr&|T? zm-&xIM=?E?ZMpBGlDZV%`EL7>n$R}Qx^EKy7rIxRj(5uerKyz&+Zd>O#;y79n490- zvl=e5s)ZvoOY;QQ);M;p2za`CE-&149f&)!O;3U?N{HHO1C>c}RX1p>tdKPz7*p(} z$)h)FrIlOO$=iFana|C(k#(pOcfSkwDVOfU6KvMqKQ=mdm|%1l{CEJY@_4OqcgF{T zZ#?jmZ?(!Fr?rh3c7xKcZ{<{&u$ z6*gh^RZ0C?w~7sOH??Y(zKGnoBg?&?jyQkq?x3Ha41IhYJRS`6k7s2Q4r$YR+=_~K z|BXRRfQ(ykquYtx%mnC%BE|yI1cU+)-qUk)Vr7Py0dbhME}oCHp{&O|5#~6?e_oVF0x&szG34# zX+1hS*Xt)B4);|@BqzF+wP$`qwU>V1-F{IzaT60`WnxDUCJX-N<>8}D1YNH5$H7zG z9~7D1-&-W!Z=ZwG+#DSq-tW7Ly`yy2fwINZ-5fvrKW}lldquE}IyqI#Qes{o$4{s5 zS^v$wE9JBgQc^w ze6YwYcTiXmCheTxAIImmq*@EIrEN8&Gexc+Prjvce{=TQwmKAlzj@VOLw|q1TYcZ3 zckOxFsPid!A+w?#AD)Q6o21C|kIrk)OHH>VvpDIm=%ZeRfC5b(N&?*caD06ryUMsA(BNy6JY&Ueua*F4r ze%LOmcg2bRlqjpk8A%NGmAgTi2 z*nzGr#BZimebIg+8Ch}~uvjl71yx$$&hJj4`4w%XpZZyXa<587|0Re?{_>k;diB_v zGySi6Ff~W295}ODyIYoNw}L6YL&%9 z?vQwgTXm`v51%4S1;-h%+>~#d4;Io7LJg3K#u#>Pzk37;vEtlBG2@TR2PCJbCjisn z@}5p1z?X`%+FnFDUM?jHOq)Ify)*@|O?p2pn&ND+k-|VpLqu%JKzOC&ZG4dVTd%A1 zOXudO=99W}Dgqn{L4W$1^&r&jGUo}=ug07)p{l7dT^-(e%Y{TX%3?Q`mG-K#s`cy8 z{b~4dD$}->Cd7DOgpWVK5%LvxZ1WUQbZOFn^mYP;@XV#70+&(JVsHf$Wfk|*d!3ROMf0l920gJN7HjR)>2j4VlJXqp|Lz^~xoj*X~^94`Rx>6qG;U^jaHRH?8-Mz0%$*T67RKu69#{o%g>s zU%!D^zkiuoaH%e$1hLjKD__f;x8H6txh=j-SGZ-nJVAAmkEF~vGs$Peh*qCZ;qvTX zFpC+_8!*72@y<7%+iHjsL#D8iCT2a9F=lv;rBk;`YeCMLyLLI859h|}o~Oi>&Nj@e zAXtcNgTgOFw$xHbuEEYixlGjGsIw?d;vixF?R2bgP>j->mLu~-j2eZ{lyG1^Tfo#! zgnbQCcH~<6cA+G=dx+&I-y$ZjaLX{<%Hc0weB{x{vcY}w81-W+|CU5hNX!l(g;f`@ z5?ep%Gj2b#>>if?&uexU_7^+j1I^tlnEQbfi4Otavlrxt;&IHYP-#FyL$wZX4s0k4 zpffr-P+bn5o()nfFg0{!!xFQ8{Q9@n{ii|#YJTeLeC<}XOs0gnPYsHcaU-(bdTf@G zdO%x&A6jZet$`IIwyopNR_C9YWJR{h@bNVl-X zQnxX)@Bs-oSK9=uaE{T$T94|z#6w;f?ggtvR3;IikYao4wD3Uicu(9Yt*hDb0}*H< z+i%UN-ho(IG+8r;$c`hvvhX&NHPPp+YTL^sgcwwbrhZG5I zbo%rTs40GfduKV|@YNdCFoVdL0+WY6Ot;V=*2v$y;p@0b=7!qD2fKWmI9zAqh$fa2 zRAC(h(`2%UUQK!ANDp~rXe{|8j~XF)%#Tili(5|jSh-eLP}wS>629?NH7i1=1Pa$H zH$ORBa1FGJ7mGQf$Io_yw_}j}0M-F8Ou22SRZvd=ulR2b3Q00!3Vxn)0BIJYWFdcR ztTk;#48*o&3c-p~#HQK`*z)ae3&9y(fd$(>9nK@nG{jO7bCluswK2W~d1UiWDP!mb znx76Ibm@)xqp_oEN4azhn`kAPmCov|@){R&RQFvWzlf8Q2QT;J9*%QUnoAt6*=oCZ-%XhmM!Bl0HfLv)2)G5a0Fo338mJJpR zbxQPvN6+&;({{^5cazjH;@|19qxu5?rH; zR%E4;^WAR8S8sUu`s?6Uh`TcIKge3DAY~rlf9LH(@LE-Oj=(LyUt2wyJO!+k!K?{rI%hXl+$%>4L#wpN~ zq2dmi=}5gge3GH+(Wnv3yJ|BmhX1y?eN#B=K$+dmp(QKlDNmTO6yJt5F@3Nit$6N^ zZvuO+>>7hX*~lHZgDg)CVZG&6wo>KN4W7iRF;iihSaE7VzZ@S|O$1FXo<@|bGI&Ea z1tCm9&}$A9k05uD^Pw}R<5Y~i@z7WI-XR7=@=uTCw=Lbql)8>Cx}LjrNFF93rnRBi zDjdfs$J%i<19O+hDwjd&WS+NXj#w#z#k&ak#kZ%Z_Ii6TQ^sSU;(a?VU03lB7x!uQsNM|P zp|k#@y*DCLL%!fEm@PcLd;DUeA@Xj$*#wPgxt-eZ%>{KWT_PTilyp2Q9WmoSi<{#c zIs}!4HP*EKevIav0S~0r8qQ7z(Xho5wH#;HhG>8^@2vm_Nw!xW{6>wa zi$M#>G0NeH6-=x}-Rk3gq1K!~HcXLyW`eE{Mc;LR7?3t_>pnh5?c76Z2YP|O!BJ_% z0>!0TIFy}IuuoTh!8b^PtjX$16dNWfhTZ4dn+Eti<`Lx&%BZ!(nHg8F1Jlf&T8F%^ zJ1TkYbV@BYeFJ<3i#D$xfS*AeG+DzN)KwBCNkuTfJMm7o@hf#^T?;Uf9LgZYH_qG1 z&+y7e@Y7VAI_>HTrH%iZIru0Z0m2tf02cq93Z2}~HN?&Z$>5{AOa3W()_UU=!X^#_ z4Y8Fto*s@C>ko?CY?m#vVoQ)D@G>g9jA&rtCev}r5tM7eRNwG4M<|QDC{<9Ojej(3 z2^emS9XD-K{MJh8dlZ@cQi!xF@xRs?V}J4J!?>Z*gJ;~N;s{m zFB9AbGE0H%Sa?RVUVqsH!^wd^71*R+SzXlyy>w#Pxkx) z5G}-TnUu;OjtCD(Rz%I~&GyZqKLQEsYz8MQq>k5sG!6j?b(yl;d97|)< zz!Z`%mp%*ns$z;-{+AKR;?syt=DI%|fem#0#AoUx)k)+{wc-6TA=Bz7uA@@I!s(7{ z7=G>)kK1#$LDY&lCeeuK zn;c|x@x^dpt?H7Y&v@V>D8PKrBEIf6PekkM-vVSln^+gu3w`PqVLU!Y+R+IdzwEa}Ay7DkurBULw!G<1KquPuHp*)ZGpA-xB)y3?~zk#E%dq7q;ne zo2W%%{0xs&#(@w&~0bSo6V2>Pf3>LMxx|eC)D&uu*Lhtek?)1bE;M9(F zH*JO=hApy0*FUf@Nln8FbiCTt3(6F<b7dS&f#C&{G@m71#u8^W@?DFa z`@9Iy5)ApJSv6LG(|{F1DSv$tqi?Ak8?%)f&vn7s!l+*3h9Me)j9g$&E{u>uzkcsf z@4Sja;CDJlPkBsk-4+ISCzc5T(Gky9U7oKrUi_@#(d7Tx;!=zfQ*qm~?Q3HS*02?E z8=Yy)vqgh)gC51&KI*DFeJ`LV(WcB>DT}RCamhJpob*|mPG~r9eu~DgT`>*F7YAY{ z3jb}osj}_IhgruQV31cGTB4ddM9h&tAfn;V-xA=YoFRL$t1hYyg>wX8`Y!S(+ul*b zsKJs!tdq2e5`+%2D;Y(WyMc!d?A#?-HzQbVjLWPQC)&D&+FhP-CLr2kUS<1#?5T~~ zZaCMYKLyuk@B$`!4*m15-gaE+arHS?5lUl=NIYHQQKn}v^`Y;S8G!^HyR?jqHm()B zl$L2C*hjGw!4*tNGuSM^x6wwmj=u-$;oGLrruPw_wp^I8o1VI~`%tC-R-B)4e;2gz zE3LJxiz{cYIcwI2)8d+I7x~dNQR)?9z99Jrk-{c~pIa|kWw&F#1w>qnWh<{oZ7QZs z+-Uj*_S*_xPnX=SNaW1+v3Oq;g_a zqNu`bYl5R(dyNG!Lix)qi1)wJkU>!1+-TK#^$g}d)Hp2h{> zl;gl8$^16jwWo$7f7Fv&`0mk1yQK|W6l^E(mu8p-&>mFrQc~2jjR2E7JyYa3{o~<$ z2L=cXo;q<;rQaoJ!R~9O*Bq3P)I*&5<(Yis>vJITJWZkfSbbD;I2FV#e%0c;OYFKC zx(T7m{;2*nud#SEZVrd&iHYo*KDfNwtseMso1l-mvVqlj`9hx3)>1;s8qC+k9iVm~ zX8++98F)W+QG1+h1KFuWXMu~qpI9Wes$|6@mbf%A>6zLb?4*5m0iQbB3_7e5>DEaX zM-AEk-8iSxAKVcre+zt#a7DCifOrVEr=6{XFHr`8llwZz+s*^%$@-!80s1E5N;_Pv zd~oR^OV^kE`1w(J^80T^IL`mqA{++?<9{u};ZMfmwchvWGqn#3hMxR0--^4f;(+pt z#oC1;27=H)(u5z1`2B-I)k{4adv$QxiD3^`ZtuqrOYr>~rpD;?`x(?VyV$$Gd2a9bdUL)CfUrG}$W9Iw_G1o3227t1mX;Fw2Qhpj z2<(c0?q8h?!KYXzGMdAeeTa64{@cjUj%lu*pBZa1XR)>iKMjOTrjNmK~vF?sS z8PP)@dQhG8FQm~gm(f_{_vY^S_rhM=?NIxX6!UK^)^uF z6y}&E{&>*&4#+M&t_xk=+jesKf#Hm~Sl7D`O&9(&ss} zs7jj;;bFsRifBT9=IoTVVT#vIj3aU_t>HVn7SfwSDtQg$-Zli4gcW2nl*h|k zB=%R5C^B7?&PD>=7YBz*HhJ}pJ@sOBsd#RJuk3FTptKthHve>_RyX6zAM@=CDx%tBu-TsLA=V#kiyH$<(cZ#d3b)@N1RSwF;GQ=HTz8g-ZB{_Kq zj*s0yzZWD$L=dxim}^?l#PuO;>={ee>n@kgupRSrizc;qdR-R+OAE8*uT;B_xlY<_ zC#7?NE4ZgN;3DukrA@vG282N}`S5hoCCy%zO#YUvZO#?~!<}17>(zl5!LA6cb0s}X zQ#eO)yBFzJAiKY8X1(Z}Hb|`hk}{E4=|0MNg|;ncc6chGJI6{O*DuPZ2~SkiaK_@w zH+?JQ2EA!IawA~{x*|;lySbdS%b_dxd ziG?B>vUT~|JXiWwCF_q!t+Z-TjDb?dA35F;=W8wQ&sZYs$hL*m*xCq0o?5NlT->O# z*H$~P=gnW_+z`*7h`u{@0?!e1Dm$6fr24MdWb|ONyqiux{OI6xj;^ zdJpKk9`j&PQ|<@P1~~f~wgfR<2dy0;-+1`2Y`?wZRwEYap3T;Gv=J2AVDqnpR1t;e zBNfeKNztxXiE}}r2wcLbKpf!=%36dB_J)QYn_29htK<;3$}Dsq)!l4IOwOA2}&%@c|_{rTV#J`L;cG)ML*`K2FZ`oyY@8%Tj16#x*9fu5YQ znfvR{2OQbM1J26_E=w&~%<#Mm)KGRGqW1$q;PL*hPw4;s5Y`KfqCn{XphkNBi>OKA zzVPo2OG%#qx$IE?W+-Yf8Aj5r{aeJ`3U%}SPc=qI?!vpkmNrvPqW}Tdc2k2VbyYe& z8&l0R^b2f!*>@7BN~6^d8mzTWqdmu-Q{H{|(#IbG1vS2-cjx}+)gdOzJd`~4B--1P ziPL&A7*vZ^ID}1OWQ&-C`Dnay#()+&xWNczLgDOH3Hgd6$o^jIIzJOLr5>E*N0b-T zhmw{K5G(rjn(AAj$D-g{sJ=*-G7d4D|DiQyd^g~ z3S$~D-oA7gKbxwih4sAht1_VFWj2&^z#}9YmoicW6C(^rr7xQOoz0<(A`aB8j&LvI zw)&5Rshvfc26gRz=LQ}$5lL_6!w3Q;C9&9l8KgtpF{-5RpMYGgf(|qUnLA-4kOdPP@sXiKqFp7BoCX$Tge3+ zeC0#`>Z#c$ISE{E*By{h9K_1-D>0U$igfBeOviI9p{<45yl)f7E!8 zH`Is%C9cYrG&|;jGBYLw9B3i6G@m)QTraXX)zJ`i!w6pIB%=IX##2i5j$JjuSVy4>&uXKYgb9b1##(Tqx0FWwx$tzGljpih)C414}3RUe_7Z?zq5a3t9q zmLO|Q86LYj{7+!B?92WE_idYoSUrZyD1;Wh)r+jw9`4#sH#>&0E#bwNNcRuPlDB7+ zAO!xZJrPj@$|jwRN!1SHIRSVtI9KidB>8$2o-h3`FY)JszWpgAQwbDv<gi zXwvy}g5&9G`YfR4Y422nauQj2R(7FOJE5|c1_X)DqLYz%{gi4au30t5UnE~Q&}Akh zx5lI@2I0p!3<8e2pPbm~$7;13js1P_T z-}v+46kd4KZhyE;eFm6+i~)x{UtT!e8J>D`-3bwvx?F&F>BK9FEPJ#xN-Ro1;x&wH z7ryxFobrv}~W%grz2&-9+;EJIJpW*wn zcq_H_paR#FOTwqfbG)BrZIJwC8r05IS0(sp%vy}Z=^3kO|r#}s>Lxp?VJlHwh5^R(KFXW02E)A0wr~7Cm?Ca(pfCKGKu_wa|R!epZnBMBLL5VVNh>ueoDd*&@}XyM52y(*+BsQn$J3=>*R zD3wwupqvOD>^X<*Z^*QgTWIV!24PWZPCIJAe<)@#w3VB+ydCP>>_0H6no9U_pIW?(b z3vq5_tV9t%#ohM~FNUoC>!IbOib6j_opDtZ^9)0h+Zf1I< zR-wNHDz;xHFv`9aQbSbEzrQ;rXb0s)4H@??Mp$F~8?k=r0PH*q{Y8&8zrH7QMkB$> zag1Q049RF6f#aj#1Jz^2YckS1U7F8t^Nz^yG$`{m>{&j2t!H%@02n%tmTkH!l5fV1 z)xIsX+fZmLn})%3JvemkA6vDf?c1U9gV)dBF;dC~Bz9%_5wPk1Po40DP)3?;MOt>0mmV;Ga8 z+ULTa=wZ<7z!HJ7Wu({*V7kH>MhlZi;n8Z2ZG)a*U~1nEjwDmvdT>f5 zYkbv>^=Aa_^XlAZm(N(@zRbLpvFqF5Ulp)1@<*fq$G{AmgPOG#3OdYi}C- zv9_2>a|LKOK9YU&W5V^&I+3{xu{Xa*)99trtAzi(y5f~70oao)T#{U}<)X4e^~)F`BeQS4hE*+j*=ri00xmq@&ib_lhXRS&c_r!+EJ7eT;MT_DHnR zhM{!}6riiR6Fk}X>aLwDdybTUjCl8UMp1XH(#;222P<18h@3OkVwjTqA6M`29?-==d?$C zl&x81+MK;~P&$SYkya$|sGw6}HG^#nE=l!*jE`L0Vm_1_Ssop!DbxIv&!_cak-sHF zean0m>+l+e<(tHPd;5$_TL7F3mzJE@$KokU3%cnV6vHGO&6mj9RLr~nbe(6F+*+c_ zKKTjFE#D61!a_{UI1fQIwQxTX19y+p=-_NRux<(+_wN1L;4^+vtUwvYCq2W1OaI_v}$w{An_yR;Ck@j2T^}!k$YTou>v&sW@y$hzUVbx<`mi8&ujyh!MF_P4d4~ zi(Ll>h}l#^vt;Tn8OVfIjLGfCM~$B3-hLI$^`Y_`8=^^SEVPwu#614>D#YuZ0PKj< z_3y3_JT@wlNRa1Lo~IdCexE2e7jex}c*^i~DQb`Dwv8iNbsNe9;y${yy#`{CgJJw*MV_uGrR$zHvq z{XfCHpKoIQy?^r%W?*xth{68B;=*$Myx&fNslVRht$QR5m0iMqcnp~QNE81M6O8Qs zz`FXs=IZ->x8{E5gEf6(s;5BGDM!!a`Oy#tL+#Kwzc%~G4p0+b3qczfEI^WrIk3O2 zRH1*mcqq|B;gVNA(O^*IM@L&ytLed9qN>_#x1!(>c3S^tU90V?lPiZ0K(%x3L!5(V z8;)D+VjqZW=l+mY%U|}#*Yo4=`g|=q#XsYkgOj$%2Q_6O7oMopS>~7NUECG;T50AU zfa9Bb#`*`z`(^X~{&XD1FapXKB)9O7vB&GEQZAR$`|b9+2}vavuiPFd!NBITkoe7< zyRQ;-yXXA|F0&k_g;Fl6B2}R9S55kZqWIxXdvF%>wf?wqFlUd4M&SGFQeThXUpEt* zcO>qL3f3_;hFgH(;^)Wr>_V-HleukdsScwoq3fAlMP!d=ny#ru*qTk5Y*wTHmT^X9 zGbA1qKDthR8$15aQP~C#?YHBCTqPUubV2TG82?~_v$SaT-gp^YhXdnr{KC?VCi1@8 z#)>0NUSK_d+BkY~!h)jOI?D|ABfD=dDRQ$-dCwTEhOO{ko|hK6O`q z-nnw2@IKoSw)|Jx1lz~l#F<-5;Jye(ifbfE z9y}XMA$7K{pc{E+v>fJfZ(pt~t%MnIdr)L!#hxb5v7VILn09@_f~5MA_niB&v%eVt ze;Z&WR~%G+5zk(s+Uz6-I#fNf-{54So;wvSvZ|VI`Dz_dT`r8ulRLszEaaDdFQikE zXDmRlFT{_O+;6W!7)QWD%NH#zj-^_sxE#9r?FY}PmA18GLDP!fGA!rY3SwsSd6RG~ zHQI@7L#=73x(36b>T4jg1gt1BrX^Aqx&r6i@XTmD)-y;$M|W^ZYJ9~~lG;kr&gqS^ z;M=oQ8Z;~I%S(-|Xgc3gCJ6401=B87Kf(B3to0`kiz`kr6CHnBiyk%13s<#rqohK; zIhKlV&q8y)vO;awUwzZWdQr8H%@lS?!92HPMP>Ef&V|l9r3QSZW?p++qxo-a#|rCb zWQ{4uxmHZ(pS-$rO?gq&ky4_UUn2tw$5c%+CYm6smJAY=e`BOGNmiOkI4fN%o*;iP z)11`Y3>0df^z-YY7p1wjGGP2XM|||4T1{Obd>+4oOkp_VZb9b|euBY`ggE;2&l16V zbiNO2AGU!(2PmoNmA$H)BGIQ6brzGYzb?v$xKWj;sg$#8YQP+d;t1 z5R&jye`m3~o6(ib^~ZO=5%fO+pP$F^zcI#WtKK*J#mVPl5F{T683dkviTJ_cS=dfY z2*JY^x?n*|q**l{g&sRXQ640KY*!$?%{pnpvlwNk0v|oBQP~NMtCsrYcv%;LlEYZF zVc(mu0SV*xORrcG;L+LvNQO z8lgMo6$eE$Ty*luO9KJb2~9vFm&Z~ft~!5m&!;)gur$+F`b)2whf7>FnKe>2#_Y3s zRf-mxbBvGGRmfL1zsRQK?Cs)GP(j|Td+I~-Q$Q2NK~jyY3{ey9w+(3B9WzPeo~Ck7P!7 zi4qwJCLs%o|L`o{ytm(q@C4+zjKufMzKRBf$>pK+p`kuICQb&#T6g-Q<8oY9hDeG4 z0^f3MSVoSg#ia&|{JN^t=RNp4ukFMI6v0!L8xz>E05GlYW^|3bY;e^obd}=4-qjDQ zq+b+|Ha7#8R2F0qmeadw)v*dPGqbiQk-vquv!uOAKj~x}Ad@bPVszQQ-`G5)VN|~t z^v;^Zz;J2$zVUF5!j~N7y5)SN#EZY{6mKVIZvSFv-Q3fw)!!4m(5Ik|u$C56#7tLr z%_X~6hN(B$1thnYb+&q7W`AH*T;H#lFv+{E)JN`3BIFBDaR2+Wi7=28aYl zZJhb~+*8xX$bmST_qbJ-T|*sd+YFFy8TZz^?pG@#)^)z#7P$IJ+P7HWZrL{1RaNF3 z)*o%VM@VR0t>ha+TbjNWy{=n)FIy9Mmg>ZfWmL9%r?=e&PB-Lg-QtSTBcb1cP>X4+ z%YM7w?A*kbg}@r(U1xd73;nttQBV5k;IOpw!uO_yB>bJ~Xs@J`Oo}O8cayz^&oSjo zxY2F|*dA5`YbkdKZI8UEd#=g-;eTvgukuW5Ju^I99pxB?@X-*i7rP#J=qp@4$jYoJ+Z+UKR4_ZJ3@K#Kqsev(=k1d)TD+IDd~X zscgwzlnuTy?tWPfw)eF4ro~m0%^Ib{Jr;|%^4xAq5~7+E_k@j-xq3AN?-)0kF{I7N zJab`H@w>PxG#$5o z%s&(4w*^KGtixnWfMIOK2Stdjp6t&DzF>MRC*SWjJ3f;AS=(*A6>6RQaSyj- zg^1SWK(X=UXSF4F>m2uF(n$3Zuzl2#h4*NCNIsvVR`&$25b8}|Q>oIE8h0W8K1O%6 zb7-4s6v&6bPsko94HQFN>IdW#6iP-KoeRc;Aq3fj_O%6VV&{3mS5`xt-RC>k;JxIbUbvh@XUkl6btpjQl+b>6Gux{Oh4Ma z+{R`fxe3xfBu`6T)496$3JQF&2Ad6bA$8N(s~6}p)0MBteALX^ZKLx=y)OYAbaQ-I zWEhtRhVNw&@?}T#s}fH$95OeR#vC@j2~oPXMx|9=*D;vANswZOTf zq;42c%F4gGR`4=@-NkF4KSN+YYUb;s@2yYOKkWS*M3?{Jci4-tma7UxT;@CF zxMZ{|Nlv|ds0rD&%&(aR(CowKw0R-0VV309w@i7*<>wB;+# zH2L{V@ZK~>mTTJk$p-Q7v*(bPU^`OObpY~K09euhuD_C(sBs|G*8VT9TUoautxj{5 zYnn+VFVl$?j^nyk+3XrXTWQ-R#?1zkHOGQeLEUpxr6wxPBq8=}E)cOT$c_Rd?~d|B zd55kXJZRZIFp?I?bOzaqYi$}IdSAh8bF!NIDB)>SRJ66=pYSYeTKOPHx$o#oRoK4U zxyU?7c!oiX$qX*Vg5t*NU3I}jBMH?J&XSaQQLWWC?2EZu2+thWF3=NE_&L}snJXt8 zXRGU+)`o2bN1>IO*D8BwaxW7*K4v$*q&aMAFT#=Z*milL5k`#+)Aj7_t7q6_HFatD z59q(EQ}5jMPrd zejej=7gZD+F$(<2(<+(6Z*>c?wzYtn@wM`FW)h&|>m>&CxwbXr6vynWi419Z-P2+9 zFh35Qk)%*o?oiCFrIclWY_r;Y{x)9PG#_&E@5=WqEyyr_+O?K3Ut-rqIoe}}hW zHj~SKx@tDidcw57dStwA{G`C3{Pz%>u^FtM$k~ifJ3q{_c;S4HT~WZGMxl}AgX7fB z=Gp$7ldc2=X?~IH3KPy_xHePB81^K5KsPHzd_Yg0%BQ9l=%uDIQ^;8NCehLz`Vqd5 zC55`rNzmpvJUY_!C_a(<4o#<5)%q0k3wL$s64u}Gi*p+M`HP-C^rX#sxTS)^oMwN5 zGK^VE;hqzsHooGvV`pUD>2tH03MrAFN+>xE?hW+#r5C#BucMl7CMO!GX-VMQT^ zrq~JjYTFi2M$nIMwVHgW0(MhnR{CCq__Zw2G_A4`{UUShoi!s``;Xnoe3IFJ*vy1k zC#-rGII7dP5XHSlbwr|--{q__Bt~NZj9DFB?@nWlnqTt}Due&-PT2aFZ{EQ@ya`9e zqO=-IY8euXo3K%MwW6t#9pg}S1U=nfg`$x4#a=5I8amy-5v@;pFl0{3iVaKb z^t5*Fesl+W{e8oHDCE+`K2$t~&~ynOtReKK$S>h41(benmszA#bEwH%&X8e!<3m#8BNmGS-~;2dz`b-V48$NZbf^JbwOl6JS*+Au ze>j;olF(rZL*uQ;|9k=|SgHAcoqlb;VWmz~N{m#UG6E}TTe8Tj$ZLriXdmQ|M`c=K zK-f?m3%4jM#`%ah^A>95DA7gp!RNp_n9&6Nd;g{nXO!p;=QPBdkx1~c$+G%Mt?|u{ z+a$$+!$B_I>`MxGMVNC~eR2)yxX@qC7DFo-$|;>kFBIQ4>i*pmvy77cK(im4Y^}rk z@Dpq0?+70W8@}6fyZq+c7(Lfx!M0WYpmp%ct> zJmji-+?TH%i~!XufdUr*Ue+LTIEdC`1X86E5v~)@h(*2UxyaAZbRPUK!2ji=f~Bun<%xa~D|VV3TUnQhz`JHI$K&1-=?*KoIC_-@E< zx0BLfCIYR*wz_YDT$yt&?I8X)O!G&)qd=jIb|HKR#3!#k{Kylh+oXBP7OqV9Zm0#@ z?rSOk&UmdT`ZUXO^Yh`1E|qH){`MxSMTj3nqenUC*ENY4b33)it0_dRE|rQ^Svu!{ zkLXTjqUT{c%KzLDGf)N%3M|8f+!jnVYv^DjyPA64djaLhGsLQs>IAg<;|8t%(c9URb(KO8LV%0N@oG-q_@3 znb4lmc_v?dz^0qJ(kUjNoV`Y#F*ojtzHtw&?1Rb{%A8p!WiKdHvJ z6TYfZoaMSq-FZ?j#|;UlIpHjn$uVh(&3HAj`QgZPGiBLQq`kRu6gOJEBHF{gPyl=B zc16EY^?ZZ(bZc$WfK&tTae07TY0XJ|&4g}Lhl01ttA;C7dTB4Zqd)lY&^#6#3SaAQ zNV2sGPQmKCn9s4ZJJbmoiwp_2)gRbX&LgwTdbC-L$9o>s&Q%E<)m~<@d`+r+HvlGy zbp5SgEXdyqjE!z5lu*C(gBiU`pE~)Rmt2V53`(eER7aL-7942|AkF-KaITXgwGZ#< z`Q5>I(H7M?^DjUzvpL;ajeB~6o3XkZ0Z}lBgxILL0OX-aku~p=zs| z@)O+#@|8#P?Tb)OCj=Q4$lnoNF(#8TZj}-}U}Q7$aT_%^+NDX2*1y*^7vvfAM#XHC zCDXXMvG*s--%Fc+nx22wR(jYOmFwD)bg@3SO0>%P`}*Cy{jc_QHI6Ob{~H@eRL|$2kypFZ zNkKJ$FDaiAdATcUdD?`r(76hqc!j2;E{tfZc__M^yFCfn{HF%w+kacoFUA^{n?EwN zIm>g=H+#n~G+x4PYJR>g_p{ixUpijLYx`EHnYK4PB-}szJy8$V#_eYnKF;?}ev|UK z*>rK-*sSnAaMmvgA`h$|6tQX!{SL|Y&0rH|J>{nrOK7MfH=g)Kz5nrLn8=H*#;8)tQq)NZuZ5+!Z1^wjj7 zG^Ne#pM^dWw^Q5#x^A~@b7^`kKfB}Ji^0;>(pz^;_s?H2$AYzoP@?lne*}Sr{4?m_ zWUdlRT}soK+GD^W1pz>D;c*k7IN1BZP8V;uW~LRA{0hCA^kkUSPzh?rTjKmS|~l~z-)TWED_C_9H76K*M^r{?|(BNl_N!$4hi-$KwPeNU^6I1L~9 zEG|*nv-nQfL{JEpQwCleID;*Xug{RyhDK~q9Ms7Q`jv+bVp&(b`iiwrb?GD?zF56J z_JxKa%S=q)gXnLVQm1%7}9} za?Sd{uBLp+o&qviTM;yM$QyaW2T=Dsq+{k*SogwWc z55HVlX>W)2r?S96XsJ39tdkz4to1kFX1~P~%}6iLrD_qAJQaB{WDEbC4Z%&Wxo|#U zBM(f2f}5S5JDbfck*?IUB(%?qF|dRtizk(7ABRxbT5K}g2C)ziV0 zh(W=~O2x&Nh(Vr+iII_rLEO^G*@cMff9=}1m^%GCWn<`KDr#zMZ}RVQSyMZ67Yib0 z_J82b|ArUPwvF3tL;lXu7b4Q%KrG=Ld?A5~@3h_kZRy*00^cCO2&A<}J?u)QnG{;k z-!&)Ws-NxDxZPN{i4@t3Zx|7oaX3lGPP_!6D%3IXNq&$rJqI7onWHf6mWYb$cW#={ z4r4Fhn-8rL2JvO39{wB>Qx;W%>LS^P_B(;}$fe`CA=);5N4T_I zx*9~EBPJp6M`#;VR?PB=O|w}haMjt7L>ZOVE&7qRY|);Mpj_9Y5!zTh+M*$`*Ix?i z{SRUo;phH9Pc$Nj%6pm@2AS-TSLOk3xemeeL1R1zIOYRk_mhI^WG2i9yg}uXK=p&l z*rAw&%m!weM&lWw6@S82NfSu-{h|^aRMdb`WNeBjdAv-Y@7MCQpfN>kQ7+5NyWfqqm9+Mb@-Vi}d6+yz=6-f{k9;FZ9lTt9dJgRP#QjN}83lF27 zi&{XHmof{rL`?`Y6fz>g0IueZ==MG%*kZE0HO0GS3Qel#yIL94x~GX_bA1Jeg+weB zVi;2nilt+XY8IX4I!|~Ug5e!GhN{_%&_iH`FtdVh`ngJ{?okmK{9^XGmr(mW%>5a# z#&4i4ScceT;E4L&p*owpD~#`D6tJrK7M=d|cSKP{?{8+O0bvOT5i%P`m`)pSw>kaqG+r zwQa+NVZ_~T)nSFFkDDY$0pDNC%!M4yQ!eYvlXmbn*b;B`dK{T86{~!3Px@cgIn$H& z883V0ceCcT*s#fXmIkB6cUJvi^yi~gKFT;~{>hOFsvFl{8%n3XYN*?RRwTO$Y{OB< z4dRaH>3ZZ&z%4ET zabklT!e3~OsixsW8wN#_fC`W1bTX!oO!W*+!vqYX z_S8XBdgh`+)>7sGN(@(sB42v!$n%194EmIMR!=WAwdPDcQ!p3}xk?M*R2BicNz3d7 zwX#UJ#+yj}3{y>2Ix>CC%9itt3Qe?l`|le16P}jj29IoK}Qcv7_=s6qO=lh-my-N2Z%$l>5Pmzz;oG=~uww6x_(9Dm(pS zoJJ8$`q$JfQO%lqDi_kfqc&>MvrDGDxr1~qdvBxpoGAegJ zh;>PbhJaicp7q;4d4ABX5DQjkeMajjs=UzEWP%uNw#xB_^kuP4T8zx)l|TF-Q<*2{ z;1e6;;1b?@BI$%=-MfwX3@SvP&IVQuNe+qS<9eg97wFSlODdjtomd1@A48QGkt-ChwlNZa*EI2T>4K=CVKuah(%A ziP1HKk_|Q5$dUdU z+5PP+Iv{=a2ma%5@znRi_T8r029Hn*erKFdRjdAw)YUQ8sXWaXVG+8Cf-H>%pgNu< zhFBMC5ejD!s-XUur3hIu_2dZMb4A&SGirjnm;qTqiFEb$(rS^-mQbE!+h@(em|x;| zv{+rxc$Uk*7H^0OxAUD3Y-WvBavjNNkzP*%YZqc+BjV&=uh`p@N@&kqKxG46t@YZ+ zdr_5zj+neS&v+!Q<$CQww4li2Z}s{gf99~lCLkKki3-h{%wZpPGK?>Z3RpqFAB9AM zZOo~k4go)XhEO=FZ zJjbt_0gg?R0gr~Nn={`PTeKZg4D(2nE17EB@^@QuD@HR(HFSS2+Zp*GeYkFkbQGt?B#-Q3 z7F~Kt>p$p@Tza-ZnrXM>4EU;yhqxQK!p2(c!5f0zXgU6+Zb&Bl08CbEKT^Iu%!FJV zI!@o{OT9mqHW&Hwphro|6ELiu4`<%wmR10A{eC?pCjO_NE0ITAV&QySn@#Rpn~%>L zX}0c6nTO%?q;3!4+bdb1je*+gb~s{1wSfWqn$EHMQ>&{F$C<-tJ1g1XQ#x}@T%zQa z#B_b|1UUzX+cmOoP6@LhR*9*Z{6qk{)}14yVPt<|)y#-B5nWB&4Of&^wV>=Ef>!W85WX-qeZnVwhrGwK-`w&(Q>ZL9_ zs0*8|$urr3JlvuWJ|r1Doxvw=qRyE!4w%7JH})X7OY%V>sB>lX z|7e60XaHg0Qf(x{`50of9h@)Mw{}*v9y@6=v|L|0b=TCEM%DAfH%K8*W4Gk~ioG#y z1ZhL6cc3I{9)DJ{zBDd{OcW9t9EKB;8-)}+n9>a}iF@Zz?qhHO>vrGV-{Q)Yfz-Ph zh|s&4j{VbV=;uc}!tjp)kL6nM&95}3dGmc4p7$*|^?VW>FQR|rz8Z~Y;}W~69+KMq z86mbLWLFLXWTRK+m5;vwP~!aBM;>Wn>G+Ns+lnG^FF z0e=~stQ@45pdDzNA{ zQ_CRMXBY1Omac67hjbOU{QsAx ztn5txJ@WGZFx?&eGu;WhN&Iiq9nU}0UDAI{cL`!{FI^p@o$BmkUhbSG3A7D6!wZ=T zyFX%Ae&4g8yI)<0o%Vz|{Cr(pR`sy7zbv0_78MXddiHqgSyI>Y+-9&T(0v|EUk0^j zijTJ>XP$ulU|((bBnEfqYWPkMzB&m7d@%zrxbpr3_!b0*;ue05&mX~_BK6@nE8FOw zHU7|s$~rz;h%t_Y?Racj;tV9!p1XZs06WX~xJ34MSIJpV+n0r5N`K(TP0DdZc0e&a z6nu3&ZjH6QeJ1WJQLQr-IX;RW7qFaIJ2Ci3?VXlnI_7npN0*9g*5LgL$R$BDh89Nt zjliMiEgr6L1SNXzDEe5+gJ#$jx4Y!%sMb?u(}APrb~MRREg^ao&e`U-r6rn0{bwcQ zFK%hL3IToFRHWslc-i0ZQ=MD%0XfO;qY&FYSxPo#-R=&@dWE;!4$0CJOse#tCqyK! zX!Ud91Cpl$Jn&V)+Uo-xZH2uAqFIF*F^oro3DetK(JRNYQ^H<r@rzeS(F8r>*td0Lt-kYOj!O@df`kF$?>43Bq@>!5TP>9R*i*~>64g~ zR248~FFfW0DgQ3(mV9+74Fpc7mIV&h1$ifyW$;E(pk9IxU1NGcKH4=dO?kS=nt@Ma^XlMF-+njk8&O}iDQEG1!vi_!d_oyJN`7MbpP6656n@uxzgoWB-J{3h z9ys=)H|vE8)|~LI|LDW0 zV2uA=Xq8-W`2mx)#MzRn9radLqwA(rEv3oeI`TWW4tRY-@%R%y5 zf&YV*1Cd`^l)I~GN-sJq*^4N*CT`h>D0RG!TR15Xnd+g}nU?T(C5Rq^v!8ss!UL}? ztuk`B07tFue!qzO_W?uH7Oq-m1pwqD<|jC_B9Qj576=kd*62Ixwl_OZI@pZ}O-v0P zRg@owOVUN-QLqUjR^zds3uf#1aD2li2-3H0xyYNs-i0pR z$(LRAo{Mx)U_(lMaG29RZ^83OSwck3k=zLmiNE(_+NBeU6py@iis91Ms>Kuf3Sx-9 zqIN0E9n4zE*q-$0mpf#4ELg=0A-^$=0caX&$5*~tKdTBex}P$+lNw?ecoL8 zj8^OZLYU7XrTell+=|OHMX;z7Fe8xNW}w$%>pi%vA25&Rvsl|ip(S8;Am_tAN*3>L zrN^oCsDfjzSn^oR+gfRZ8^OyiLjh$7ilZyP6OWr^Z*Rbk{IA2Xn8zSt;!3+S4739} zXOb=UpEpwe{wcxDgt};?&JG#`zK_z8z@W2Esq#m${3bc7rDD4C)nfZcuQX$4j{8HY zeEr_-Pl770FuEIHMs)MseVjeVjy|B_)h*ESG`B-RVtOVJ*m^{D9YcdGoW+L)C%nvC zC1&~79!#1U(lL*BOM^o{&KU)Cff>KMo_5_!$ zXXPzF>dh^f!n9SVLv1CnAjhio{rTu#Sk3L8U|YtrM&frHBMohetTv&mXVBKgW)xWY z#O4dFzTdU#}86{D-b|H0Tf#fTEDU3+ZX<{le+Y}>YN+qP}nwryjN zZR?+N@!g&LIZ0i2DxGxdt<`HiYbFR0w+f}T1w}+CV+Xl_XF9W}IWM%Wc$*|-aCCVh z4LOtXw~=q_l-0BL_>InR~Eg{*n1bH6i&n zVl=W5X^Vwg2#h|lxGO1G?Y#zqk zm%&Q6CtWgmVi(8Zv&xL?L1RIHBoqIH5!LB->U@q=7Qz9dheDpkFi*CpNRmPw3OZjp zLoYN`WAt?RkXx2@zCqD*Spgc>f-)}8%ssg#J>K4B8n&Pmghz6+e%H`uIvlupcHis$ zPt0U_V5x$dq^vrusE0kv8Wtb@1_xTh&9ibvmqc={P(>SdQ3RNwV)-`S_(zlyTpfK-!TPgzu{C_y=z6WwpM2qKZS`G4!>XhMJR~qa~{%Vlbmr zOFy2v$}AR|XRsylwLXVq)8Qq?2sYjt`YnYkEQ|`>VhUvx#e<&<*xJf$zrD%j9~;4( zb#RsCM|e^9mMe;h@s|HUC6&UFsaW!i;ko!B%j1P3iRL1b{uxCQYs}-omcwp!^%LFO z6U#x#oWLL+;tep%-W#S|^XnIB^1Q;YP9-cCz^GOTa_Sk>e+;H4%Rr^0A?zW%LWUZb z169xrWu6u^D39u4-M5a+Y(*l~!m@&@{2JcBkE9dTy)1 z<{|=`a#D(YPB~ff`c3vOshBy&yKv&Q^w@2_I}YDY!$X_EcX#d`5jaMP_@cOLMvkgd zN8Y6;lb4?h?u67va^PcG;mC?CG`W|p{DyoZpW|Ly#@5bbgKbrLsJ@bI+HMm5(JGyy z_wHl^idXUZ!PB1+B|i-#M)+NtVys0CHK#Wy>xWBSx?ezq5av)vSH}O+w2%} zoirZDaKZHg6}F4sVe3X(V&RudXFU8m!uO&@bmhsTi zS33YuiJxMCxx4KWANl#Y{01+~Jp)zO1ao;1!zZ4{TF}GYG~BGfmk{G{A5N{LzNP$a z3Iw#z4#fv-2K>3_p~N|yE77qe84xToIv^55TJo}kuZD)**=Vmhp7C~LO$cg0_P&IA zFIa3)RZ52zlB1D>)2;pstVA*@`Z~UCcFnfI zit9dTFU^q(3bs?VP!kb9!*zwd#|{;}r$CwEqAfsW37I_dYz&fhD=Xh)K2W1j5086B zb#??k7VX%Sj(c&@_<^~rVS@gcbX%aVGkP4p^lN?YrOK-Ez|4r2O3&vHD)^I`&GvWE z&Fbu%Ph}FVXJ)(T1onuwIsa)O1B$E{C^MUm(blqko&pg^GqS?oosk0hfYbhJghkM+&29o83JklW9 zp@NKaw zPL3=|HzxumyA{D*v4EN>b;W`=!Qi1t{PHX}VT;e4SHS6d9MQsM4#HKr7Z&Nh-E@%Q z9E_ACG3s*k>skYmCe(1$rW*w>`v8(BA2a zjbKI%=dEfF25;^t>D{hKfX8avs<{LAj+r-J^PQTbga+G$$)xa|WbeTRTc8VckAJGR zs8I8U*C|vGD;VdBs{D2%gI|1w_9l({sA+h1u{|E`WF zCt1uTHw(;6T4KVU-3Mt;hGRJuCvCB3pBj34q_EAbqR;!g(}{+iJu#$A{f*5fJ%s3! z@i=0tN>v?D(@c^D_^r|890V;E^{d0pjhadxJ6{ZuJAdubjgBlU6KcI>*KK=MXkue! zur_OOFwSVIie*>A2VKE{^}e)g2+~H46wRcJfeR}nVHjS1GDupOTBl$4&w?(TnbfmP z2g9}XBZzTa2RDy)tsrO(xwGnj$pThZ=Mq$2(wc`@BFo5KRTWM?2qaz%FEi)R&In$C zdc!M|t6m3SPK_c-Ujz|N*lFnQ(+qs2fy09!0Q1bLOiHespX%sIQ0A2ho0M%@d8fLo zGBY*EOxjfS)Ck_Eky%T7wRyrk76swj1cCxGczU*LvFH$kImPRe_RRQTzHN!Lu~z;W zJD5^<-ZIiuEGL~w;mxJs;jttMgT%jb!eWLtdu}Wp5uTL0R1B7>vRAlxFKAZqrM(9O zJ+Hob$lo5*BBTDAo-e~S6Vjnr$1O0>2Y4Ul^-g@KkIKdcw6@#rK=gez(JW~=ma*km zWXx>r?ao&+lh7d3Kz+(UKc!s|y~}~&t5Je{EQmCFukEnX0}(F=II_`t3K5ZGfe68* zr4Qg6xueH)k5;pZKog%xp^=rtci^_&RJ~NjuW7{!Fa@ePdfHqfqCXqFWDU2mpmt77 zxp|vffk5w81^uTS)B#$EuwLiEDnjU>z2_Wd0AL`&SyK3uCMJ99ut2Wy^Jc0ekh-)v zorbXNz;w2yIj`-wq^ZR+bLYJNpv6*?P7+%cTG=x4SGh)?*FS+J*Vljq67!BVMhx9* zq&gm#VG)`OGD6GFzctQ@BJ_PZHsKoPN+q2cXA(zWr!Q@smxd3=gY?UH+9ny8MLuMl zlY0cvqNcwc_u`dEXcBU#rR0IdsRc0mBaYzb*+^%Mo`THT5ph;TXEm`4N(z!qss!Y& ze?}B_UUdh4D`T~mBM`QR?^BhS^~V*K5&Z>8iA$Dh%{IF80-bl8w~m!ib=Yv#ug}*u z)7^fVH^SAsp)XtuhT0K#vLY-sjfYS2*NW6-xWN~6C!_$jWzgXV0|uc9gH4NAyaFlp zo#u&h(cR>$I9_C$Od5Rb8{A8h^~LV@n3&={-3Ti-@eY5@~`j}2!yaQ zeuPgZzA$rNFt2Z>AL_S3a98$jout#V#B^-uu3v1Va-TWUsJl|lsQ2yjYj^GO!B#d& z?N4+%1;dKmtuJNn_s2ui-S4fG`|Ev(EaJy7QAtRh!JGyXg2DUk{c$k%b&&V&LG_ZL zD*gKe|BKUK9|GX#ZSwJ@RF(zCkYivkD6k76P$o+aqyc~s22o@SFi@s#?yS>?`IVGH zq-|a`#1ulFc9d<2n{vSSvrQQ~=H>fgF|$!Fkx&CTaq%Sg9t4GSY44SFuT*#bmka6#5YVvQms(HN;Dk1NXlw5h&EiCz+4Fla)2merEyJ& zNAJT}c>9P|`-WfyuoR3&oc?PauMiSaeF@q)NnnTK8kM$S#uC(h71|TQ@>jJPNVWQn zilYS!SjIdJDa6vzotsR&1e8|;4~o{L9Hy7DKK@(AAR#Taf+!q5A~?RP1sW1WW#p{E z(L`wD08y}H>Y9_ol_qG}fP#|v$oNyraxM^Y_XPSpP|i=NiWCD-0f705n(96(X;jj; zF1j7&ma5pih#GdXAWBa3$Je><7)$cZb+0c^qp}cgYal>CNy$Pwh(_;@Irdb3rtNZf(%P#A0Rwc>D4@!Hif3C^_Acjtznz z0ZDpO8U$1#1MZlx+=>N3I`_iD%cd<@&IN{WN{*)`+EHX~V^?llN;Jk*0Y03~9onGC zl_T+mbhJ&{Rq1$!+1GoqsCb4#89h$A=uvU)P6Qw$Lu^L0+MF`4O*mq8*Rmu3HsHhe z0m&lw$w&7p^;Vc+Ng+}>98bDa67CG_PLk4H#gP)vPPfZAg0{b;u!sk=kr7%D;`T~B z*Ir>XY$tHJz<~|aGJA4Y)KQ(WMMrzp?PX9N8_b4EK?1ZklH*ho2tk$cLw8^dtBAmt z+68#27t8qaXmTEe4DTZ}kS16CXVs5cb|ULd7w0X_vAqKv`y+6}ThiLBL^?DiLfi zF^=O_JW}b~Svh?BZ5!XKc^CR<#t#%ucrKZb$cbzV|X;d-~x+dqppURqunadlz zPy<0H{bs1tY*RtU^G9}8FlIhJ^tdXT6sNj6NeuOf^5r53xmZ;~_WK_kA+emp*{o*D)4M0oy35cE6G&%Kx7j+Yc&Bae^5trUud=djxzT zkkNH=k8gSo22z~;5`Q@?e;)EU!*$vRgXCORUYk*0IU(#NL2(Q71f8&EhB(+&N&2XZ zE`q@MX-~&YeeB0MK3z|#X#Hw$Noj6LsjRP_Jq8-Kl)mIYi=onG9@z^+7&Lvbwuj%^ z$Z8MnLa+Ux;m0f?^bfLSn|W6CigSa!Tem{xjIV2fwGB9kZ$$>Lv?s@$=Tge=pIyZ# zt%UUx0W&(I0?-i;zaB#-X-vg_9mOI)K63AW&GIWO7ofoM?&qIMQYN#AMv(vjkHlM2 z6dteVdd7v}CIXctWHmrT93AN#l<($kYg;sI1eyL$B?`0F5Fqr_{MROq#2D!K;_>Z0LX!|xTw z16>LISYr`L1CU3>R+RY^6SKk8x^w(`hE!~cSgYgbko+f zkNn&u6AcdqDde3_6%%HtZv2};g8L}JeRi67HCb_R1Sa_fD(w0h!BDrIe}exovy1oP zVZhe4&xZ$4Z4|YfLbbtJQyT5H6T)8W6}Kobz$CZQBht-qh7&f+|EG3zo4W_R(D-~#^Hx5JU z$Zl7atJk7etwcdA(27QAB=QJ%uW?-S=+{@2zLG>NF;};8 z2f=iRl8k)J&yG)pVDv1gB!w4413b4DYdi@)`;#MsMwEj#7MikzBdm&d@6q+05GUU< z^4j^B-1_e+i?D2xserqyS*%!??iYvOMw?kLVRV21dhnD^+pG8YMU$NW&`U=tt?e91 zm82%}4|3S<^80ttQk%+ljgeh3WLp8yw(BEe6+uZO+PMpcU}M2A?oJiH>>Vaukv_tX zY^9QCH8zXp;x!^VBpUC5aQxrvzdtBF`MPfAPl+3vaMfkKh+YVJ12ILk=a7F#8kPJH71?QS>tdu_=kXpLf3>ew^AIH+D9iYii9 zAk+}xy%o+HH}K*2SElKTdd!MoV4_}8w|v?FHx?4^gF6`MuFjdMAkuKnH&6ws9cu$0JAU7Foy?3#a3ih16ivQ7cr6j zG)vzKWZOX=8ZbcxV5jlpfidwk&Z$;8Ynr=97+Zk5S=c!K2-gylxVn4U1hVE;j8$4C z!%;!-(hBd1xBc1*(j-%0VEA_6CEyU+w-!2%B77uY7)Xzx>0%~yULXJ)vC$YEdZm7* z4sA_aD4WP%HQXkQL1;1|mRKY&f1fI51HV1CxQ&cwQ3wxo2T=so(7inj{?Rrydv=An z3&dwAkL^ilkAkmBo*oR^!X?*8`CQBt}@F+{;qH0?C1@ZRq2iGqEvdVg+?8O}65H=D@pD4e*iLC4XZY z=bCuy?1P4v)oJP(cdJorW8-LV{kIXrNdW`Q*s1HC zex^nVVnScf^;?A6Is`p`oLy-A+FSlcbo44wi@w(-Xc$;|2GUz`rC>W=sGHQ=Cth!a zjB*Feg2)fFR2pB1f`MizO}_m*gMS!izH`VZf}^T(HwF(bb^SptP}g5(8Xv`*?G%GW z!G1%U*sGFGrH+adMl;wLZHLH;=QzaLCsYE+Z#T8W*!H+(4X|Mjst8rXzch*Yo4UsE zL|8Uxw;}2(nm3a@P+!#%Lapo6fx2#^5ngY0qxOu^l!;);J#p?B2qvMk$ZT%tysZ{R zECSCcf*=U~@)>40tz~IIgHz0No%WyOw1c~(5~LAYq>Rj&;1Cs|)(#if6%;_^t0uyC zSmLgh4xmTvbF<3G?yj~|eusWp`E$}gAMN_ED^ove8Fv8px&glO&YJtfQAmOGTsfB&_=%2!7U7{(CG}c5i^F_ckuJ)?{ z*CsnHIEk@)NgSQNa$NKO88IAd&5=fnh|`LLrdtpG+IFpBcOHhRB6a6^s>T zXAJFn5mnmSS9oOt-yn*h2{QW}rp1Vy08s;0+BV|3Oc zbb+qg#VJd|OoZY7mMcv!kHo37;$~DHFL#@G%l@{e?TK|Mrcu>3mD>mc)*gW+?N>1T zhyvN|ZX`W4X`eoYxBbH%&^7Hb}SRWcym2DtOkFt z_mVWH-&(J##rigM+xIchf&gdNK!Bc!6!B)lueGOj?b*KjL52DN`7hE0`~NIWFtYsr zIn(n!|B)s>0I7qjTwFn3Q7Ahwc|f45aEb_8;NQMb@P}0!O+89HxgrP$E7MI9g&Qi= z=+HQ7dAfeEGkLyzL`!9nvv+p>gPC?I7~+&Pel7BPhuw+U?eg_}xxfu{+SN#R0Yo`myC*+lE(KL z@1r5k0<;oti(3q(`}NTz{Shwb>MPAtdc8sWCizT%)h=Is$zUuS&!Ie8;=QZEHJnQ+ zeviG?9xN4iM&f#vIKzJRiaC1pv-=V(yCaM716Bf*|Qg~zAa0qj10xupYCvM}(wdBj-u z8Y5FMDW}6Ak<{GLOO98JvytBH(#~W#@>iurL#oq%-Vp$=P9cCvw`EAv%gS_LQYW?8 zP2u4{qZE5mQHpQ?UKx>iQDjm&B;b!|Sis_!rrjsD6SwPn?3 zGebQX>mPF&ngbY}{!RiR2r!(E>4Z652pZ&W7%;dd>w;sEpH2QutWgE~gNsazpgr&f zQ`P#~bi@EFlGPlOV*zSO`bP2jGKP+j$@H)V-4Hemh(T?mC;F&7plbpmGx?V^+bwom zcsR2#`VqSU2mDm-pAK{S4%s|Bi9u6l1KH;tVPqV(9Co@HHvMOK%*7e>0e`OwcHNj@^Rh`J9+08`;V3o*wrObKvq~DkDKa{-1_T>-VZ&P&?Bj76 z6=J(bw}rHXP|!@=ZwAZFAf#!*f1W#a;K+W=jSHch=yLi8N&_b6c`_%jA|;~3c+-2A z&B_J?vD>=<{NjCqVfx}C3DzJH^6d1+Zdv60A%1dSe3G5Mi4E-^fsSa`0Akpuo2$-( z2j!yJRe^xHK)=kOI+a=J4u;L)X66XTO%QjNTO4s$A#Y-W9!O-L)IV!t)(%en+#&Y_ z!(sFqO4)aAFMC@VimcWZKyw1lO<`hod8jjPDf_z)-f^VnzG7oyEQ{9b$VO{kTEg|HuJ5ytrl@x2@XI8m(9`|RnUZM<$ zi6`enJ^nSsTcFQ4Gw4PU-Ca%TzzOd}kmryl=@y0{L(<>?$NC6}E0iC)Q~#JGc}-@8 zXWe&!-_Q^)N>a54)rS}g!wENUDYd7>-Q?;SP}rc~_MWpQiC5V+a7BEDsnRiq={i`2 zG%azHSrrX8g<|fO($ZK*X`I)^up+;b{GwUg4Sd%?7_L2-rGoXQXLvZFi*3iK)lr6L zzxlCbj$CX1;M+2^0%=8^{Cm|xe-_r%1Az{8bP4` zRM(r8MHeRpgZMwa_=k|t{#BC>z^5-=A2FK8vf#qK>{jBR?@s(@RPT8wwScY+1dT@;615aMe*Hw1}@M%G}9KRDax@hb@94F}Xt2_~%Z2V2v{WOxQ1 zw_bXac1L&$a?mdc^xRufEHq|BeoKQf&yWL^gXIJb_y%^uVV^~kWwcR;pu29H;DIgs z)5u2xDw_Z$P=k!MBm)%w(3No@X6E`3jrv#Loc%aEGWtZW{x(n$Cy`&+1zvZRKfjfs zwfH}PzhLyQYe~ve_et2_TE$z6z7`ZI&m*i{8iH*Mu&F_2;9@F%d5TlS&HabbGZ_cL zw)=l5(7Yc4deAccI%71TRpOKB)P0pim%D?L#cS&)9rUpjF9^qp;QP5;Nxv5r0Z*$V z{4d?Fs9#W9Z%LdbklR=szxLb0XlQr zR54&W+BwjoQgkr7lg#=8zw(kEvLv?EafP{3aU@qS7YcQGU4$?IG@+h+j+<(a-w|A= zoI;dNUi`g*Qe<5D1k%-~?$_5rYRPst(-7aFCnfA7X4ag4)&1F9N0IR>ngWM`#6)sm zc5>>9Iz#|pWN5=a4oIX;YRzt>cyq!Sq)hB|aWn!V^o*KE;udi*+%91{5tyai7BQo9 z?VoH%%Hpq9%}2^llSeA9$Bd;Fu4F4OX~5{+vOPS1k!oL zYGw_>{M1YKSAtSU1D48}fT9~b8pq%ELx`-08iT5#_?KYPUFowQUs>sCg5n!025&8O z3A)QZnI=Y2Y~kp0_DuPfK`B!sY2t{`><7HL$(ClG`);Go2fv|G_`vDzsC8v#2zrrC z^}AQ)8p6y{!z#Qx0{g+nbm15ZW{kLHpi?K;C`%Uym?aI3Z5M$BEpR8(436( zdV!qkVbNovPyuTa+Q6Rbpyi8?w#8gYW#OVy2N~8-joc9k(9x1XO3=|6qv46l#CnY4 z3I2^826erl1@MCe43=}j<*4L^?D#+NYL5KseuMU+b&=}ey7gG&D4FrMuC4?>xXtL^2B?t-A zhPKa#n}B*yhDX)dod9AZ7O7L_8@@&I8=jT&+0lKZ!tv(>8;)6aB?oeVf>` zeGIJzcYo!1u_Bpp1H`GL_%$d200Q4nHx{ z3jsJy)lQv75hSe8=>O2P6~=Lsb_AGCX@ckPm58Lfc5a~ZM4$PD)+-T6RXf$~dZ`bW z;8QCao2LSR{*o@ueh2~ngq-LI*-zY!oOwd4&u-R> z$+3spOf4p`Y@QEK5!N4=lRaFkr0c0GU*65Pu^`ClU|jCp%hGU#79DL3X^=@-6G`W~ zM7~#Ws&Me7arQfiR8O)5;r!NwPkVBM8W`?Xj{5503QovY`lK=CR-yh#bRAwyNJkC5 z3*#F+lf;fn=NWgjNP0-;&f$f%HG$qFZGvz-_Fb^9wD)(c_;2?^4aHo$VU0im*HZ3IexvSakFZ|iQAJ{V_W zs|&ESde^_VRL=pkEn91<-G4s{b6MMJi)7tKR3h-art}TeJYxU0R6Y2Dz-{Y%GwA)$5`~Ns^pT1Gd@T|0c-$RgZK3~?^ z<}U=BXi}aW z9W54(VTJE&^>c`>a$wU zC2Ps*d`>Id&PHa4H z76-Jc${#N6Frtb2p^7wXAGvzSkFz1;+iZN^4aFvKJws0}L{!wvHs~k!(oqkjYfZg& zhREpm-pvWJ5U9rwJyLYac8m0FD{0Y^n+JG+R+kt^ocD^tEdln`u7Y&1o3k#dudt~++szGyM*IJF8{Q}B= z^lG!!>+<+WZ+|wSMY%sm?H_k`fk2OC*#@&+b-X>oj=UCUDuE@B4u$7OtFs&VFFgVC zfDoN0+L5!=ZUJiToU436g-F(sDscykciqmnG^g04&VO` z@k0ZpgucK#&$Hze*m@zjW5;$$bzy#j67${>lbp2-O!EpPJfCW0Wqn|ioTW-}63~g- zF3i_$_<#MO<+6{DK^wAIW`4a6Mdem1)L0eV);r1cm`M!`%*+U%$G*wf0U+AWxU#i$ z`K#;MpZ%lG+smsBJ}GdXB#8a)`?@?n{$I2X4yOOHQ;U_6mGQsYFtjHfNLpjIFR0GJ zBaS~1^G`9#JB}b~OT4=s-5B<E^1 zx3%mTlU8!zCoqXnJ6@chpJVOuw}tHJI6je|Rk)vSVv#pe;-2HYBdMPxx>JR+w||>% znu2ppU+05s#%_pU5r2FpoHz~>8DQ@r^9ZeKBvYRsuTyh<-1flDUiUvX2+X+;L}F=> zZX9jU@*42oN5E&D-=nizU%@L3KWneSE@z5kB{KDKAO` zpMlK!a(!{W?{4c$_X9z&BFs(M%x?pY0K=q6l1wKmsm%0zwHJ{ck)w=6+L(r+^UOx> zk!AmQ-cE7Qz#NHBV!rTg($B)esmXFQ0UAlj)G2$m<@C{K$yX|2 zNw3f>2gfouX}TQ)6k$D6=CD>wA;2~Gi10+$|&gU<$Ai6C=f zHKvq#01|(=*<#^gS%dHp81BP;;h+N}^ySUZ-lc!E!BRmAK#r7b$<{4?5>`OTU4(Ms z#(4z@E|?UV!;m`Qvr$cobXhjkLbZDTG{+ELrabHozZ&zh5cFt+#ece#XSH>nf{!ze zqPr#n++d>(U;rV#Lx%KVoD1hPOXduA7h882j6q|B2B4HU0rQI#VujC*;@MTFhJ(jJ ztOjI^%PEBy7+Ks(KR<{fgAKegi`ev6Itv#VN|&0!Q2q+#$BNVqIV7AvN=X^%?zY{N zNe54|C=auXW=)7`Q(m42Mhz-FG}Gl|+UrgZur6=3XjGH{N73AA-?)T@a{DQ;#BikD zWT*oQoP@xl+hQ}SvYbGd>U zQF42fB>N43P6g?RA&{8@m#M#^^89$X{Sv&QD#iH-%}ffYfD;1%2^K|^8(07%qn+qs zCtm}LmOW4=>SNUGKCyd7Xa5myCve`ct9$|W#-cf zUc%&-y2zWEbX?u&@;d9{76&~8KH$r{?Q3S4`q)4N@3L({Lw&_Uf+l<)s!$I|f!HQ4*B zM^m_ib4MaIQX*anKcPuftq{H!-gJB-qv5DPSIrSEW|_ZP#FF~qOt8}pKTDX?iF4Nl z#t~+rh?r;HN7W8)KG`uxqVK%}+UEFouV(Bl9^!l?!oiQzk!b~9nu5M2gcAzV8_C%) z@A`nCmjPyIA9ZXX#(s}`px>TU1{rQ<78m@aC@0WS!&r!96N5eV-Py0N8+=yKPx%=M z!mq?1;WF4S!4nebl3GW5hXsP-Njne#Wq~+;0Tu=UN(rcx41v#^9A!5SGS;*Sd(zdM zjf2MX$m$ZhAws^ntTbllAwiN!5=lU$Dl?O??=U&dp$%Bf*SzgCcwXl=({Aj zTO)nodQl^3uyngPmQnHRy6T5PzvawFLeP6MMC4~24y8sL(5i`k0U*~Z3W>9QHO`cm zHFMRFYBnT6=0Y+SSSm#cGS(Erz6@%PH-p@GxzP1sdGkWO&=HfEALJ+3#*r8BH0M&X zKDqmuEUmMcuVM=xB>y_D9ufUmIfLp;#_0lh;+qgo@HZ9m+_D7dMS^Gi`m1=cEyRfR z3o6ij_xkXc{>56J4DGG1OWA(rD0sNc?h-5#Ne^7LPt^i5^gMlcc9$CgB~DxgLr?LD z<^K|=KB*1AL{~MW)s^V{VDMRDAQ`yS%h1CxoW=2`OYf~lUO%kfqb~H}B5vC$Xm2W| zUzSU1^_tJ1b}OCG4*4#Hk$<0adT+6q_9pQ{6>(lae$E;p25%CRrc{LTWO%4hBoBrX z#e8p+OwkRy$%9NEYtXlOvLJT-{M`-TE0r4#3b@x<57HQ`=0KG@&iAd6D;|ISB@xBS z@#wf@K-MbW>}?0A5gIIa-sQ6On1PbwcD_Zk9$kRKq@o-+*DMW+x=s(a6vQCG@D{8o zL>dl*vV`1?h#0nW*)kWrtA|ruQto&rHp!KWRO#x~JS4>%=O)V2$iIb@m*;6f(Dq?4 z&*6656_28xS1d(^jMW4|YtY7OySAVJ(bgnXQNA=(QK9rs*;AvmXB#`Ot1H_Bs4$AF z7%OzlwzZYF%|uELK!X_ZOTz|g5$)RLhpaV z4lFR#kgS$V0zTju&MzN89t_e4xNXb;Fv#1F>?<}4=MxV6G{+k&)nK>=T1|G7?i(Pc zks@x;TC8JDcB!(U`GN)<_LRML9h_|Xxj<4>>pR>lc+V()i6Yf6nuf z_ioL(S$R;^Nx#}s>~-j_6MK#id&abis8B;N87d*2T#p!E zLy0vq)Lv{(Ktsn3RpLL0P+y(-BG`;ZMq)K|hay)r4+fF~pc~4(`E3gV|7ek;`q$J^L%5Rc~nc@W<`{V<|e8HHKxk^5=iEwP`qFJWqEZ4JP^0 z+vsAF;IIyOGaH=d=W_6}9xUPP8o9xf&Zp!qb?qqH-#p0Z~m z3+45bH~jtYYHbBy7aQz){!0kpNXO@wJzP2IX{-hebrvsnCZZ;I?}&{Kf5f;=3DOd5 zu{>8vS_{3wR+HbV~ysSP|7r&Xfs8zJd8`^Xe4DK&SxNsQ?Zu- zAR5g&(rLt`Ngr9tc6|8-&V@c${}xE8&n$H$o1UsyQii4-7&&*%3l_tn^zXPD?z$TK zW_H#myG&&OP^je{MunCe;rp3-@;<-LHv^&xo5Tv4sXmj9ozE@g1-#dHY@Qb7hI|2I z8asu?wt+698a<+nTePWV15JhH8MDZ@Du#tJJ^!m869GTg?)2zi>P9GX#gz?(!8$cE z9@@6{an0P_K9=#5661>?;@iwqae!ZF*|p~J@-5!%8oP^!xL--v92mfuMwrj+5~j<9 z-6`>l`ADrOF*_^QHtBjU4{EeZpO7@QXTgoV;l5)|m6ePWn$2`l-=WdIpSdlC28C_z zTpZ8YU^EU_3=f1YBv9dw1+7fh<6p%-MX?6Ewml%xuw_^%+|g=nN3bF)JuM%y0d+NA zTtD}L?(w{8*$h)LEO10C2_K zs{w{UcU={pEP*)1R8<=1348FN(Ic@d#`0_MA{pp9NgpD69q}*- zQ0`EMr1v>ni>wm6Rr$+Vc{nIEZ4g`J&YvJgeo)^2sz3{MFFjweIabP3Wqhwc=srU^ zrnTHUjrfyS*fR-EPs*^}o5dEU#=fTA)3O|IDF+Rp=}t zOLeMddRky{2YRQ~sbfvj#&j&+{X=wIN-9(Z;UlFVdOCv z)<5-+bc&(bFGcAhZYesWKIsKq+NybgNTJx0C1S#V7cCjMSHRhi$8bg6UGtnD(VE84 zjLrb*YCHo?wojFQdPI^pDEeR&$m>MY)<9r4GcChoQBX$@=e|DT#b6Y=!~&3{{6bpl z%A?U_SYw&U;ump7AN=@-43MVCPrP|w@Lhtgmda(I#8NQWNL_oQavd~PWiLkKz6tmB z(k11d--w~H!xLeiUK(CzF3}>Z!-&z@VaZ+tivOIM=AY5Q;eyhh#-a0z(Zyn$n2Sak zxeVJ|q`ifc1CLV43dTl#3LvKnSt?+KQ{e5HocfBG;Z%- z8LpL!Jq8G*A``fno3+4HdFh1FUNNY}L(;rhS@sy%SfpCfhB%|zdb9>DUNC2I8ZER~ zAh414FghNSuPU$KCLG^yP;n)Y*$wrm{$bt^-4>49v%~qlaXcjj?Hd5Jib#S6|1lHJBo%sV5xtW zVQ3rEr%5|D>Da&#d-sHrZ(1)7G4O;wwV2{Hnk|H!d!fj}(#E5$LV(>Ky`Y+5gF-__t+OM}{}RaqqoZT7H@O4XyRM4r-_b4QN|onJd! zF`g$pB4zxLEmRDm;G3=WJFCU&lXNuA!k7S^_R!LR_W0YQV7Hs9gK1umj&l_gk4k?4 z&B4EC(43WUdF)m9aYgbgO|(uo`;OTTsm6swR^yyemZqyS9|!B_=U1aXGN_x;xnlRh z^7x*FtTS8bSt&92v6C!?@Z=Ei^~)(TA?r?(|$NulO7 zDC7r9niLKdtA)w5(0COK^&zP4Yv1%_;XD2oxl;-=h#?=*sS1to3iS;8@R)TxhhU}; z62VT?iKKKhLepXAPqu|-BQB|1g?apV^<*e6IvL0VIQn)8KHHwI8Jz(a>4&-)`HVw@ zA~bSvWTjS%%wVn8GeM>(ozlo;CCmNXT?P#4X`79M$mBz(j*YI~vB-tmI+E%-{?inr zYH1zd93Ur&;qZLJn z4}4r>KOCQj`^NG^V-g%`sUB?-CK0gApbDC*FkM~AAP$@QTkuZ6Fc8uR=8@<;qHNK} zUbz??KlHyEoqz`f1|Qx%Jxq!O_G&ylQEvX_27>fwMHnWX1%RmhWEi%ROM5XzWjwns zQ(w+d$VHZ60n;i0mpJscXjG}>8#P#|xq?Z|D$ERRx-j@?N@uON@j)}v8{oIpu`A^` zPJkUlSVSA7vlVBq8e}&C)tf!i;}zl-Rgrrdx|V3vD*?4vHmXVw3Gc z3@vXVk?JF_>dkz$h8qo@E!wjWlB7ouXyI4BG&VXH)FZ~_O}Ums9q$5G$=Tv-OLV41 z6;z|Al@`T^L`x678Hz za*yNMrd~;^bQIK%T(1&FG0D)w*Q*AnwDs8Mh;P>q#_STZFn0?E&1YX{ef7`C5X?_bs%^faR5PG-;ycDgs~?4E5pbFjfW-&~IK z)MIDhVdHFRodT3%1Qz|$$*R=@r%RNtraksqjU9mXAo8*E?%;b!sr^GR+#U)JXw+>c z+>vsbg};l5i*mg?ull=7jcpm|_`0HPqoUUj_h^}0#eg+^H+{Q$57^Jx(=N+r^*t@V z^i{oWyQkmp^^Z@RGc|pT*~zc7C~nl*M83DPb64S)R_^7)YqQI%2In&5Dtrb(D}TWI zxV(z~-#!K#1Ji%m$6(>);P}sd4Cy$MHrU?Tx_?_n1Vzig&}Q`1^EJjerR%fVD*{Ko z(=C{T_xLV6WkjNs>Q_0{)1!M+sCk*TvS-B|CoKM-|8C=O!@!r}ti%9Ucet zmb>5H)Nk|PbNYCn|917b&--P1s16?J`WW1S0S)VTfO8|W4n>yZ)A4n4s7>}~v_A!hZcx5qR}%X1<@#_a>$D#}m$NK{)BCdmrhhO5 z@10$S%IEdsdh+N*C-Dv+Q@h4BouGrDVp5E8>1;>hvl%K@mbaWx3M1eta zBR+^9I6oo(zG-UiL0NL7$FUjCaYWJRF&>Lu_$VG3t+_izi`l@8SN+>Wo$r z(52jWbQ8@k*-7NfhX(=)GtbmJr23?M$x%A=JretaQ|>`JQZ6WGoCBtfqM^i6DoRY0}diS4AnyTN5#A2wNTr?YBuvC^<1^F{Y-S8o#$SZPmSu zN6Tz;EW?$7A+XN-ed#td8R%o3V1*1~X{65A@M?z%Fzkd`YsZ1lw}&2W zo+)Y`-w5Vg@(h!esb3h13(kBWvDXwcz4bD6PEXWgW}Z%+Rq_v-WrH}4czFm^w4Ii5 z;V`|lRjNBI6Eq()X3ER>Es-s9ko!bD-0AyC8QzfdSq6fU_D>q`@3c@6$Rny6$DWB_ zDfZ zCU2c|(D>#4z!Wukvw4cxBrAXYFIwq-2ucP&2?>ni5ULS3(8m#+ly)# zs}$&BmD`bs+APh|%VNWp&W$E0oxWm1%=x^cUYBU!Qhzt^o+-6o`!KlHW-A{sB->>bl#+YX#Jye-{`}Mp9dRw(jfqXnVqhQwJs2c;LJPk! zhWzY%+Bo;?kIc}26-3lDsx~7Sg=B^`tqYyeg(h(-%Q+-XMw5i{)wPGdk2^mJ?a0i1 zm7c5~9Q~7-HKnGy*fokBE}pH2bIkA&4p^UvZ;G_pTyzW-rZzJy$zdujj(n-D%D4ba zWooc zb|n@ej0=itGwDL4ef@_vwmecnC#2jT`A=mrofJax$2iBcyl<*IH{0h<2~mfW96lpr9q14(y& zyV7JfnFz$o{8@itfC@XRKXGI~Tou4!BF^!FSKo`r9JtK$=72lv=XNq&nFYgPGFPCt ze-L`ln44O6AKi<`p$X2I9fQJQIxOy)f*&A+1&23c>qO-!2AWlfSpVls&v8UI#5rg$ zZLk|6@niBMG+!NgsV<|{+eJifTw+L8o}o|p?^NvKICl(hz!i{9Vw1Z%4d{{?WJK+c zSyo|SN;qb^<>sOQgY=}>fDEYqG?Iqb^Luu*?WW@%67otfpi7oj;jZgekBGvZ*et1T z+7-2oBWw~(`?}{Sy*@6`1K<0odd8tn=e(lyj_H#YvAWMw8T644Ck6#69uY&tzVm8Q z#g6B2inl|fMC3h9!s_g_BV>eI{a(}vIi}4o*SZPeb2_)G`s*PL^Iu_qgJ)xn6NML zFD6C}Y_ja`zSV`|WTMH60Mv1{jH9T=jis1-O;&Yb%EEoMt(=`SPqX}mi|s-p?JW=6 z;W!98I}-V|wJjm;I`Izz*CE%Y1`lVC6&s!pV0;YPYuYQ<6J*imui#E$E||`5=+010 z{XVR)zPtBy^j6x)jwtc*VM1_cyyaFjEOrb=XF5hV?ppmk)M$wwBikhb%buJZgRHqA z3-gXh@b}c7Mp1YP)^Wp1FhJbiYT2W}0AoeF6b)3)({yNNC&}JK#`5^=mVGX25J+hJzxOKN9s}v%4ny^7DLg<_U~U25SeC(LxWSGg7gkmh9q&JRo+%8 z1^FCG(Q?mYY=^8wJXXrK_2<`(4TVn5Y|F6>pdZKDHfE>H)q zw-NhHkgg7(NGm&A7C=F7Kbo!yuI}FrW#j61=pM~}6MELU4s=IW|H?y7Pt)^ z2vBFVb>e$Kw0JeYYi0zOM;WLO-QF!N1IMtGcj|JbG9S=_ z3YLtH1|?>jL$>9jLA-uj((FbFCI$H)7SO_+ilwz=z8lMeQEPqEU9@?tDf&Kye;CZc zBjn805-IfB-IdtHh3-A05MPbKbu26XhGqDJe)oy-s&Sk_7huMAs9>HUWkvUVGYawTcDDN}lH8*`)}Lk9=hzIrTkD)Ye6nKJOx}kBt(Mc@ z?dX=m4ATk_){r2hPT{~p*1AH;* zw)QD?Uc?h=MD=?+!ivdv8|9CKl@elQ0^!W1y! z;*uGD;QW6N2ZtW{(8`nP^+jy(N?b_ zmoRWeil|1e0T7YGU?>dOl-E$ifmtnv)W!g9aUe5@P#sA_KjBX(8W&-dV|IeKC|S- zl^f$qr5$l`l?;_B$?FtD_JQid`v=O9#=?_>rlolaIfpQcUlFm;dzOPj-Hgc^Z-!% zrEt?L<#BZ~sMnIAF{rgq<%JjPH?(=x919<+1H;6uN)ocvf^#fak!bZTxl~1-WS=M^ zg@;Uo2;PA5x{EYzZ|*meye8zLPc7v+Wp{(@{ii%i5Br+l;Q+nSre zfbr>jw@0V~cs3fnf?$>;*x7aG>tSB+Aoo68mpiyoiJ9jZelJ#)lb4Ba@C@WYd(W=s zzkc=7shPzhZX)`$WDOn=Ue^jo^&2^l3+*sTpL=-icb*RE&utt3ecc0Ap>9qMKi|Hg z`FUWafh&|7%7jJ7CYm_x=YA+F44Powv9iA~2xfwDtzBA|h!3PTGMVmTgYyxwx=Nwp zuDGYH=VnU1dVkFlBgqjXd?vDZNtDo}z@Tf})?&$`ATwc%47=cP!aLx7Oq5nUL#D5M4VbIN)#8B#``uzo{YJ8xn3X zR1)Fi9mxbl$+^wDfl&Dm2@M`8Vgtc4m_Re?S`6uOBj}z>rDK&F7mL`?9thfi-V!Vz z{>ksvhxC06iCQfXOYhZhNkg2i7cRd{K)C?2Os2nCst;{(GR@klhq*{L%nNpDoZ(}W z>QcF0Sc`IZ&4vC_cyc6#){HK>qDZQ;j#Wm|Fg6#6_u1@b43qofcdT%Zab-$DzAy<) zzm!Cc*V)>Esgm%*;8RGV|tdAMzXbKi2a719LTj3)P2NE+Hew1rZA zm&-BQwzajKbahh36)wa|o8CI3ZlL_R+3GrSs*WX30g`1^*GBH_Rv*;FS=VpB)Yge6 zmSo4rKIX9_O&%N?_2wVc7{i%T!gXT8u}Myj7K0Mnw z6x>rXD7%#LO&Bi=CF)qqJop};6k>AKr&5xD9b!|_w3E798=B- z%8a2p&K-0=L^C5FHXBCf@w%p!jd}?~RzmJ=&vBO*cJ{S+vw}5c?^Tfn=~>RoV`>d| zi0gqLL3attY@KB~`*ppa(w%8+D_Kut_yxQmcI0;ic1d)W*MqILu@)3|O^_ZWm2M`l zLkpODf|iX-vCKp>K5~XAyGMigvE-|`pYI0cimtyiKKF_xd;Of^2N%O+R&|^A#u6<$ zH6SAB{acucf^5cWF>whMV;2K9=zUyusaR0q0_o}Br_FU+wp5Wzfhfu@C`UoFm6yNo zztOtQhM=4Ntu5Dz=TeGkyH#sWnq>|C#;7A^Z*~58h;-4Z_ePkUyRi0=de3!7MDJ0m z#(xPk?F)e2CUzhu+1V?gd1sp}Ntu%Lr~)o_h4F#8KuEAZ@tuqV>}WX;tRcYFW_vj# zGlpjtlL?h#yw>29V~n5s^Y}P@Pc z0$Vckm%bvP*dM@a4#~&=pyo0D*Av)mER6qA&BL9rC2hN_{T1`93F3x)0D}dK&3S=2 zP05^?y&=ec#XOK-G4H0V9Yxc`t*<4I6%s`xHFKISam47V+T-QyP=EN>8xG$4-Q!^K z1wI?pwmXmGVZbTJ*NO8Bdxx&??e*(_b-do=r1at^KGht>HnelHj8DJUfhO12cLfK=5XUcYCM#a_!?l5&9Ng#$5)LZ|PHvyJrziU5P$#DI#( zdoVTP>Ei{+kPm+eBmP1)j0`o~7&`-lo5Sq;Zha2?&Hpj%fB$43*qhunT8##U=lDp( zM{Tm-A<|kP&XzV_CP`P)8=qi8Zccq7_WtJKh3L(LP|sZzi#~>mZv-qTZ1=_u6xQR?g5;*d$@+~B`@}KERo2}+$KJL0N(-8 zIc42dPTveEKR-_A@5e=*#O6;R`~Zevg-SEOacBc_8x;4=6M+oha{OW4NLTgZNJ&(D z6KneDjAx^&PQ0jbhDW z{)M2{EbvFlH5hII7f{`7dwYmztqF$;oAzv|uGyBjU(|+_cIiB64IHmi!y$RI8o}Vp zLz7ON(60Eg)d_bHjs^{Hw`fK? z1yVUnmPcF-#}%|>RmbDTFqJg9jupcm2iVxVE9^1&`>S_f()&)8jt%9vlTV09(c@>i zhnrB_slKKtmnrH*4x|CKlS>&S?nJ_pRW!2}&dF#o$QR8SMU51=P6Ey0a=GNc>DXBJ zO5BY$$Y_dSkHnEmwFf``1}*c1-<4c%3(yJ^W0DTP^jbOchP^M6Bmk(CZy6*N(!J1! zE$-Vbv9w>pk60JoerP{RAp+JTU{@wP*@DInoZ=qdxa*P>91KXh5vQG>M zg^3Hygs~8%dHf!mBEKC5DZ$d2XdG2fbjRJhvRi&G^}x43wal#Bbh>)ba>Fb`veaZcXk38 zqDFE$L>P?CBC{evGDYrRWyM?Mmk`7h+Q0;R`Jo#Tk~ZrFG!dhK6sx9&n<@nVr~ETD z!X6S&;?r`Q+bn!4N@sFSvbTjClT8uLx)Oo9k_4gav33M+v`gEDE`w{yGd8}$K8NDKuquFb4M=Bf`k%bXQkoFMgMsRE#r`~6C& zj9Ip!Y#Y1oueN-@sH?OIc1@OlEX&miG6-{KV*TzsN%J>V61;iz&?T7a zQTAS=Q!YkRZFIsM1MbetFNeBPn}TF*QxK+B0rtEh)2V5E zl_%)ro@zvt8S4UxDDok&7)v!!g}m}|NuPPm?X@B8a_6HjMPjqE&POC;BfT$u=&kBJ z>LMX^v9Zk7Gjli$rHhoSpIW9%s9{pZc|CbG=}i9;JqkmiGrsmrxjBFPbH7O7A^@0R ze$a$yoSfFS^6*I^w)nsJ?!uw8Py08zLIq3$%)d-4r-(gGu7+65MZHwmH*jLInV|HA zK7!#GaybjU)pp;nHgCgpenjafUt4`|Lv2}((b#gAY&b*a($-d}OinP!A@Mp!7lZbatp4{zX>M)94$D zTv^_H$TBz*5C$rcUrszIM~UriFd$ZbRa+bW`5ui=WTxrQ2ETQr+)F#qa*XyY(W5rP zSD~{ITho*jboZf%=QksdQhJ(TE7Q%KfbNZeLU^}Z%;HUxN{aU<#?w?RvLn%g_5w`g z@~?J1J(5nh;LNYfNQ0AuI)T7ENvX#peity{;vn~T4@M<$V>Mp^K-_bC#R&(g{c|%i#-kZcGjL3~f`*TuEH~v?Q6_&*!TR^zn)cwtdFz zno}l0V+j8kParsq0AqwaVr1h~PYxFx12m+ofvs*=qY5iv^Uq#W8<~ms5wwsHzY4=2 zYP1bdLOD#<`l?>DEA=;?^!)u?r9Q*}H46YusK2!Hw!jB;^5P76a1bwJT#SBd3JQ*- zHp4X(+pLMQGdmo>)8(mols?*iYHhTRVf=nU8zur#<7rK3mXm51e;cPnodw`0kVbeq zJzQ&ALm_Tjj42@a{v~|?!RyvMQ_{bPjCOQE&88C(-HD1~EBT^DKex$O2YPAsTli1j zO%s@kfmI}FP7R-B&wgvNPd88AK;o4>tz{|-PuH++7-E=8x=;eQ1JfOy!x^sO;#i33 z)Ii8YfRd#-XM1n08Rd;38FOW^;`CH4Cc+;}FRHi$3e`KFy_1Kr5Dxv3OHHqM0~*lQ z1uE;Sg03>-;@rErlAGI+$DBw&S-5_Jt|q6Tse&-gWkg9ec^jeE&8RRKgv_M)P-8S1 zOhK|qY)6`1h*doLbLxUa?VEgkMsukd+-2hrDKCSC9Y&U{YouwDpG-&m3-M0<*B2v* zWF)1Phd;35-=5Aa%I%gOS=9feC!K!nm0`pWal8Nr$^fYL{M9_e;>_Qzd%GlPHC$ z%c{t;!50$6#26cJR^H}ztS=+R>+8(ae7C}`I)Fg!0)$_ddWv(-#?-ESwZKy3+o;z! zB!GgYLbOZUXCPl$!<15rnu^jpV(J(Z^40P!8uI7Zl-K32iPLUNOoJ6j9qJM#5)zX3 z)C&BE#=h!GA-9|(rvNRz3o6+KAq&_sMcXKIFh3y#_9u@OIl9ntga!@$2^ec%s0k8*>$(xq`wLdxkj0 z0ArE!756|B3)0%ieCb7UW*l zQ|IXTG4qeh8xfwlP-oE}@4=vMoE6@oBG-+!wi6A4Ea%)sC9n~sEL!kfx$w;1BilJ6 znYUzYwR#LQT|8^FyZehZ?wG9e+%{nvOS6_R&3uE_xFCM#ge@noeq=`=U)GVF9&<+Z z0h_CL{DPekaX6+(2U=hC-5-tj_gW0+Q@N+X`C5ju(q1dTnC{hhgpw zOn~*Z?LR@_ur1cpHZ;nDZhYB9k48}1+>9YHDl(|IEudpR zeuy8xC)7Q)9AczD%B09xuPpb^!H?+qI_{wg^2?CRinK{?-1`WTdypiRH+fpHBE#NQ zU?_8KHroc}Bc?3IsPDGvVZ;}bKE|4NS(kM?rwmyW&3JB$%sdxlQR#`YIV{yny^nHG zzJ_F;?Ns|r@b68z);BaXR_jr~hJM{p?ZZWc#q%*~W%9YQjSG8PA<#e1lt76h%}Cof zvpa;P@5UW3vd0*1OlSgom!HmP!H-d^5H>OA5fI*~7HYC|EFvcrLNP_Ay6KvP9*cqK zX$0&5@$5)rr;$}(rr)3~>@Xox^%mmNEQDZ}B?m_fel2&Ov zYPe|WoBO_ZqM#>V^to{0zY6uRElL42>UCpX3POOI8(rYXF$tq>@r_4Po=D1UT%nHI zGMxP4K&keBf~#bItrN!WNm<`$$cUYasJAx!55)x5#N?E1h9XqvEMQIl)sfNsgbr~p z6+GKp9`27UI%eah?0n7t{dUp(dOKvi=<8@ibLmA|l)FG2C3KfTd~VV-V(D)ca(|+l zb=yp)L=|E*d~(0vpl!5SMWb zkfdRv{PU_Y`&UBGpgNg|MA-8~3pYcl$-RLNwrAfy&oQyhdK~R1Q3^ou9xG*$i5CFf z?Mh44NQRGGG1Ui>HmMNkM5dERZ}tApWPZ@F*`X`}7fnA}uiS}IZ;Jkj#j}6jB3I(1 zYqQE4P@Kt@O@ITNSa>8C5ZE1iHAj_K^WqH+!X#ms4JBiI%Tk|@?r?Y zXL^{MlM~V`52rWoN%9RZf^veGglu|(t+>LKmW3RGZT%NvwtS=8D)fiWuewEaI1u=2 zm&1=ea>!4bKei4M?Lcde3+Nh@+=RK+ZIhoEXjWCX%T{vG^B0j_$ywCmZ-ENwPN-Yy z?SU&IuDMoqI$H>(iqcjU%o%OBOA^y9IpdhxR#ouJQ`AneH%k4* zYSlS3GqJ;qa8HM;noYTqUTaW;E)8+(vHPeaO;IYWUgcd69x$caxawjxDx-carjyNC z2Nl+%$9gBrN=mWI6eik1-yymv&a{j~>joa|^$*ZwM$UhTXlG;kZwKL785#dS0GZ@3 zK<3!{Yxu^mfbs&00mGwvj&>`T%F`C+#xNT1J%{1@Jm9yBND>6Y)bw0^HlGjr{zrh4Ae*NG-fc${nV&F zEmqxG{aQ8w>E)(#0L##P@}Y#vrI};%UH7Oc2uXiR8*7r6cu=N9w$59Ncet7$r&R5)bNXS?tao0b1O)ASpU-r+0UoGJ&-oi zem<(isC+&irhVk-E`ygm|JMtC-_Nh@IJh_XbhM~+8*%-Y7G6-jnl`Y{c%0<8i2yo< zq0I2El7{>9Rg2hbqgUfCST)#kME?jCVztbrs#P$IV!7jyC`;u(d9k7umYuaF zHEuota8E@1eN#_x{JSuIWkvT3emD8Pn_OQX{0UicM=aX>xrInO>m2vELxya7{1~hk)`R-6ovVBX zVnl+tG<67{Z;Dh@AX!J_00Kh}l?e931cXv85N%AFdkSwq+ z6njPfrMc2wSg^EV^_ENLf0}@@Jw=G^!KSgPF92D@^{N>^gz z6#Gs30$PC0a--*b`boGoxsQa7K~v8QdF|P$>7Nd!6S_i7mAn#NI48Bx(!LAsNY`b) zl>L#^tdJ3P)7WXBgnbSL)z)+u8%7)<1j}P`GPvduUj>LEs(4`A-aVc(ANsQb$;Fl< zKwua_3TnNGIR@6x2Ke{ONgC9P2D0JqMxlhR5N+3FCMmdE;nU5 z!FkP>u|+J;7j7jrwpq#FTCNKvWbZP~@CxL<*ZpHW2KGdAX0|M=G|a*N+V$aFMKq$x zgjS%gq-5%{tG0?qdy&~ijU3`&NWL?s?-$k=#GFWv=&Mep&|UwDPcDnzU5*ZTYJy|z z6^P1x`lIVA!3vVL^({{9~~&`8nudgV-m~v zyEA(*GZ8BgPC;3Yw7R|bU{g#S9qHBXdRC?YhVLskRvu20n zjss1X<$=@Oex0#JiE_ZnsIxsuU&~@!m&E|54x0sg?mI&FycU z=i7r(tB2f{hLMfrks9ye@2oVj*WRC#<56KZuSIrDF7&9Td$sd^QrN~LeB$L%D2pwf zFhsEp?k zFCXS{SO90rZQB5On3=HkP=;wDh9;Q57)*wIu$;o;!ra&$30PB%$P0yjs}{Jh|BjCm zCr7{gb*uhFsa{5AeVTpyJLQ|>U%*AHZe7Dhd(UtHM@jVstQ#cWI?V6dnX%#s$3)SB zSJl`vK#GrDCxj01{_h4ikl;On9}cZSwAFb3zI7CxZNlVG`o3gg>XL;QdwH`k9ImhA zFJ6qS|1HiDFU`W1e~Dg4b1IGE|2A7mdM5IC&K6DLpIdYmY)LrTf%ykM+v76pK zte11)uH{%ly*|lzg;VVj$wf>wpLnQ7Pem6@(3t9#qTMp$TUPlI-pt&# zO5<4ZsLhhXihI5X_ISUFNHjwMMS9;Ag^GBvHbY80IT}hd1qlBVo_ zftSaE-=R)Dw@!&mE#m?=UyMK3fzWrA|4X@_5`4{0b%MdYwXD*LoC2K0L&^}1{UKKH z&dg2J=zJ zW9$`MQoO3jnVP7lXf$hJ1iQf2fk22gs9 z2-F2JDaijlF5TDwoz*x~v7ar*GNI)JK5M=3 zO+O=O?4J8bSWrXL21zLX1kCMz^g`y4IAMN&5L3`7+AD<$islW-b2suY^jzC7ezF6h z;&mb>0*4>7rX_OOwAPB|&2I3?m${mmaEHYJR)!D^Ojr>(X2DW=z`V5g%nDImQA#Mp zbnR=V#fu$QpPhGchNwG9#9~YU?T4LF!0}TdHLo+QzGU$j5-oqlWh*zT{3@f+V6Ne? zk?Z_7q8JT0utCU}MHB#QCY3{L;0CfA_7#WsUKjpOBXu=3B`KE}G}xbXaL&HF@B_sy zo>fW%F|Fuq9C0>UH5TTF+H|gs)~I2wvzx~;zt#L}Ve^E;Zedl{y!(;1RV%J$qNMdy zQQ^_i@-9H!XiMsz%3{HS4CNK&OD5GK^gCxv8Mqn+cV&%UTp1sCI=5qdtj08a{5omb zr8V5vSYwL5bDc=l6qd#;r`gwTr246B*`Z*i&WS-E%>ZUceUDCI#kQ?hvO1jWk7(ww zRXX~%F%rNMR45Rkvd62{Y0w;DfwY#sH3&~o>{y1b+&(!~uFxs~lon9)V_FOvlclK_ zXtapUc-cmT)YI2Q#8Rc6=(Vzy*fPbV?e9V>;Popll>X{w3xq;Y<{lGIknkqKo`$Lb z;BZ0!{j~qr9n1IJP(6F7pk{-27M_uU&6#4BrP%_u`WaI6( zV1$!~-jr^Vu{WSlhk4zAJ12Fq?MYdoJQQFvp_Q$Q3-g9;D?36)yo z`(m`yla9X;)j@@k`>;6YTi58i5m8Y>KCm?tHn6)M*D({8k?CSAl5KA^>wnPf>aP~S zr5g>7VdjI(s~&kY(%7n)z8$v!%&y;N{G9ML0v#hA_oFA6=8s$lEj!CeQx2Wxo!g<|Gx6IoN|!I`K~ zRA1l9@FRk9D5$XnTpd&!eG@PZNh%zco(|4;ZS*tjKmS>DNL@P>uP(DnU2KZR;a0T1FMh~*J*jLn#mx>AER%1W%42h0G7Xthl z1|srVH-y8ue`&g&(e=Sa%9`}{dl(jK3wIxEinP3qM}CRV&drU+udkm z#%7OMHG06ewMuvUvNH8y5wdl}0tT}bP8yU?b#<};A8!J65hAlloWZ?bL)zfn6)MK- z5YLZKC}WQs1>4RB%;PA_}v|_2j$)Pv-n%F zi(X@qLxI=fj6I&Srbh|Pd_WP{&#?_>Bjd28a&?GIOIsb01j9RUc$EedNQWoytsS<| zbPXD&%DaYe57+YCCtgkyWn0}M_q6o;lKd@7m^OTDcOgRn&W(NE`JR{4c`09Z&TC>4 z<1%~myM(;{m=z0Gn2}YB({WJ7q8835!W==tRHT;4ViiL0%_>-ZLplkk1|lOJ7LUMY zkvtU_58~d&T{1y43m02(%%EoXOXg0Yxqvo&{IxMX5Dvqt)P99tp+|QI@ll;Vr8joK zxu}?kF;vlfIbn>;OiPujANj_M4-EZ$J5%0lm(U?t7^Z!GMCD$#T6@bQiD_nzC|hTC z5Zh-Jn9k6;CX~4E#d-77SvpruW4HOBw`ZE{0J$>0S`R0BsZ6t+rs&=M*(EY=XDvq0 z>|3#%&ri#4yw-K%NBI74#kG22n6`=dRNlj!d@HQ)-S=kvIvOubjjCzC7-KkIjo*pc z5ZNjhsH6F?Jya8m!95pg3~E*)HBt}s66%11btq<_G5-gK8Y@O?LE}_TVcXB6|EodF z!D-y3JznGw&urqx8+2IsL3(054<3= z_G7~E^w5SwVe4ey*4XJZUu%l}35Z)rBJWTl^Lk4=-xiNnQWg%l(^d zAh>><;VNx*#h<>a2I?|L@*-T}W+gLPlL-R~+4XI5It zyq4P$O{e$4Uf#&X%&!40FW4TI>s61~2fa?|)Kw#L**evcXT^&r=;X1Y5enQZ6uhj_ zZ$Jj_pF>=ajTf8vH3mnKhr3qgahJ&bk?W3g-AMIdOh`-WH;_OWb~k56ZWJj7!Ag7Q zjsB4mRkuFd&4>DR%;0e&Vuuc!ksYFH{HAu+EpY#@QqD`|ls1DF_m6R8VD!PTesIQKbi8A;q%`s?cLDsj2QHA}kKRzbk;4stIGaia4N1|~=e_U*yu=QKIm4TPx1HI~oM5Pv$gNABRk%RO56@1<|3xYh+9Sq5V18P_6 zU6&YA-#Rxu2q%#lj$tzLFF=T@N5mBeshPXi`JIbARity0X>Z6pKFp6+aS-nV42N zfe6V*fm7c~fvG}0MFv(XwAf=p9!}3=8zYzBbR8fF7$6xo6vW8&?eppS6x3$^V+6aH zTdJMa@on}XavK?kbJ^^y?$UE-x(?D%?!-E+r37k9dzM3PHsMOjGu zsyJIT9nkje<6*UQnODn2CH|Q2jD_t9FO#}BOsucSQW@LI4XmHCd=w$nH*f6QFyiOO*y5bj*j`^V2qCsQlSdGj zcogx111bqNLoQb==k$LVJBJ`qqOD7peap6O+qP}nwr$rf+qP}nwr%zOG3bbXgO1o4 znS&f=Uz1G*6RDMYWxSJz7OGeb(6;Pt&C&%Jxo{FG^(zcb5y|HwFbw;4Mu(#&y z`8PYA#ymK$;ss|thJ(*Od}jL37s)FQ#^pYHnCzu}l|y6L0kP3}Cn51pTvLq(8!T^_ zV(eUw03AvTw*e#E+gcKmk({wJ^bOw-tMcl!U!T{iD^_ajTQDj zhO;*A(@d)IqAy z=vs0FWQm03|7tdMm*6S#wfkvNAZF{Ql*ASc=%RMk1!PyNlLc%HEbs_RLVTT+5^t2Z zwMU3cNTsW%k?Xz}Ao6GJ-RCE;FOouBP-q_bD)9}V#VKq^ljMdmDn%f=nU^LN8)9Qeil+d?;k1_I?a@PVs)Pi( z>C7xCm}35G;xA9~1i$4yHS4IP?Ddz_3dCRl(P#wsYCUK+zKD2AV=A_7eoJZ_N8V7c-n|Q zv16$tHM3750}en2^F5TNgtK)Roc6)erhij~HN)aq*7dC+JB9?Wb#uw@=+Dd4%p!`= z?el_e{2kSB>xg!+sq+Jl#;Uu!?pLT!Nq5%-UmK;RwP!!#w6x>RfLZH*+d(*cMz3wJ(wifVYuWl7 zdiTfVqVo0b!UfVO-`NpL4JZcp`EO>1E6dy9kW|LVcSEE8?q99I`jVKwbniqZl2=P~ zkIZM*?RjEe4FY2@&bICY%K8&)F&uv;-hUWe35g;w5_~2yfP^ZlJDXdNdPJD0lX~^3 zNlR_jP=+F3;9uid+T`8vZXFxEJbLD%A_{7@x!M9`L2LsjcpTSFPd)uyU%>~dXz72g zZ0=nu+CMuJ0e6J3d5wVuzfao0kee5<_l`tlGcXv!u^Em(6R(GnPzz7B8boXsl!+9J zd@kI0ZoTH?{OP}y!Ny2oXGv_8CbZ%ALwkV4DwtW7B!r|2PqoxSEC)U~3^3-2l^dPa z^Oii%t*K=~&0Xj)Uu9hHK7k+j6TL|adrM$2GP>03{c7=5yX=SE1C?-6Ns$g_*w#(B zkI~BS46u??DXecb$!(*HymowP)v9i>J(SNwEF4Pzx*X_|kIum1lRO(goCL{x>hv=b zprV9>bZ28`BI9GrnKW;M`TppxM!VMNwtsjznj(x7G$Uj(;j&gndN@JotTke5Sk^k$ zkLyS-c;y=<4#kqCj;;jcm2l&^^h$sO$MAB=(XJ+hj|d=G4iu#_nTkIa z7Uq?Ns3f5S>?eH@ZWi_LPmi=l^RyA9M?F;VdEvQMKrt{roO%9nTqYM9r2TwJ6kRS@(nw6(9Mw!4$#-;{*q_>Z()$GvG>CAt`q2ZFA=rDxG zF+-!6x&0;H1dm@q)V1UY_Kct#(3?rrmB07sNVau=2bNU~pAT`Ao7ZAVxrHk!B?6WM zt#}HnN?93ud(sdr6M8K_-Ti9`E96&rL=EH7=5p%62COn0OiE^ujog z?s;{xtlIGvq_{$9G4+RXd=Z$`v(K2OdWxMij5Hn&t&7WfM^c?tYvE{W`- z+u00o)CG6lXSLc4FtC8hIatS|gMMr2R!%xc7ANc!ir8>!Ws! zXP##RB$r*hmz#q#l+-TOfB>2o26145hC`65&e%C@h12((~(7A((k`;kMat?&JUxijXs6Jw{^X9!>;0m1 z`$*5WhAYqbivh-HSZzZK@_MA^SVeR3qtfn~BXu+Yn1uZ&#LHUNRG&igtz5&A)GQOq z_?ff3tE`gk!3D13ur-Xlo(WF~Fd2-{#o_uxld=N|_$DuG+f09YeK#OcbBv9w(?4QJz zuso%pymcFHTutn~6IG55D*0R(y^e^}mNHN1Xm$a6FMi}*3b8OER-3=D(OMn)LVssu znDg7$=x?Nic%WLPR?wW6)yxBMOAgALGGKx*2alIHWpd!!b+f)2K3=3WZwRbtcQEJ` z;dp!-JO@js%^oUa(8M1`13paY7ITaDK)XUY15Q4nqEi zy%GQB^g1;76-c?h41`HF{baGzsuSp5gBw;xKSkM7m2^|9n?>bJ*8E8o(bkq zN?e^7F0-~N^ypzM>`ASa=Je8|xOVWOiWUfh1#XD}oOqq6(F4N4DQ2k71;}C|*D1I; zxft{=PqeP(!=_bN_P$=w{3X^oNv0D~rl6$0*9dhKe-(ZVbKKSIsZuy0>(WkBwap4W zQ552h4wt)a4lP{E?HXe{OlnN2=rAQbOsQGFxUW!ZiqKqt=!HS1&605A3R7*0ES|n9 zk+yH=EUO)`k3gGoI&k+Tb8~W8wZArQpZ0RR){(}PyRiv{WpRt|x=P+}2yx39<#i2V zI_g3e119-^CHN!u$h$T7mET#Z^vD@ktCo>*=}}V4KePU^vRqpFN6N4)Z@N4s0;oO1 z*o4|~fooMJY(K|p>tEywR7ih=W6=?aVBLoe#`7lQg`GKuicU}T1*^$NWqP3x2TH`- zMm7VdA40QLuPfD41j|y<*lP;utX)XxMGMrRbewx{EatS|Z74fgC>x!5n|V(9uJK%V znqab$ONv?I^n!U;md3*PCiLIQ0w=p`LaWYeW1khbkxM-Pee7PpcOh6RMS4Wwh$Opm zdXV62eNsYRHQbYW*^m?~kPu!p8#kN`l@3wv*^bLL@gp>&IZG5(XPq4M)K2>F`uy2V z7?|ch9bdnzVyc6{w3??+oZv~258b+zTGtv|bOTM6M`>VN7O-Dg6VbL}o^hrvZTV>? zCk>NrCk;{J09W;rn%~pYi(V4U9LIRH+2!qHqNzMB$&b{mnBqkr(R$C)Yzt^nR?vz_ z%R-8S=76yEP6f|Br(X|8Sv-}`o`q|oTXLBQ|u2Cwr!7QTb=eD1}aXvb67M<2F1 z1Qc4=2shLD^umwbdWA~@+lMTY(Mko^B((}1-f)W_bpugpoY)U1gbMcvvAy&X6GU`` z_B~@SnQ@_i#Ch^Jin>ctgpBfEytx#Y!@SU7Sd7SUgdVi;7rgS5tsfvOrq{Jc>o93r z8Q_~6grt_}66kF_1!mAdI-(L}dVJsuO^tnb1$tI`agD}>%iDH$PxS`ME@2joL?}A4 zp|*6G_yiv01NXf>uPr6_j^flwKV%0^Mj`bsGoq1&>-tFcb_WXW_UC`i+=+{xCM#bh z!eoiz4WD;TZV+*w`)Xn05-oSpwt0P_hP)^*TAUg^oRi7UOQzx{o4RD6>rS4NmuW{h z1@07!uX8h%NXBs|3|gP+zpP{llHI6Mf;(PM8hm&RLsUG}mXRy7;$-NUBRNt@i*MRY zw|J&ZTX<*7Z)AGOZ=sHtlr1jbDkB#SC0N#<&x}=zFdNS2Q}{dkQt!ksw`_iOSjkdr zLV8R3TcCZ+-p-=j$d`DU)SuV$1FgD~2v(|50iZ}Sx5Z``TeCR8;9lR^xOUAh32cC7 zddnv;OpbRAHOx34JWu@qE%*DX|AQLC%=Z7Q#?Uiz{AWYqWGr#(_5Y|bnw77>=+unc zTtUGH!Ec7`9v zuUx#}jQ8iCo!_IKY;u~?0iaaXIlMpKWP4z_L&nsN0x~lgq$peO+~4lA?TlGgaB0U| z;%)!>9GM7r=X(oxJifS+c;;xgJ3mkNVd2tr1W2Ov`C`V5#sD7_dXQ^_o7v3!J$Y+l zOLK-E))B(xqWJIta}%!^3hb2I5=BN)fuE8p+yL|Gg5yFzIU{#a`|{}dP}MzVksKq) z0n!>iKqCypA|{gi-ayFXqK?+0?vaaIOyz?xlnv+g@mcEIB}qA#LZ7~*=alp&z$7^B zIvxn6c?qkLNvHYX$)&>KOcX;fr#7Ud?1wvqhz5uJZQAe5_nw{51|EubZU?vuiVige zD3N#R588)irIfZc;`~En_}P^G_BL zGr+;J3Wq>kjXyPp(@1wl;TVWKXUl;J_I)PyIZ*OYdULa5!EtLb6Q zS&w{_-k5_bc5J>UDh+YSF4{!3vbGOLU%mp31VGcH^*18U7f(BPN%x*#l?>gJqxYtt zdMQ{(x%!Z9zLk4*r_9J>?^hbtb8fF>V~2AhbMMYFYJCUSN5!5nGaZ88XQ2Bzh0GvHlMGjoftHqi zNl?Vs*F9O=yGsS(h8#`iMP}{R~o#D6}G!^rqd>RWoR4c8^B&bvigrV z7o$_KUBC|NKL1mqVF=*X#O06_lV8#9)6oUrfyNeY$<`y0CuTAyX`~xXUiseX0K~r- zHmUAE2J?qW1HgUjV;4ROqeEz`f{E$@V;!-ol(Chvu7B@0i|WM4bUJ8kNWEEIolHsN z18vzooVG7Ux~z9RwgkCti>As%R>SYXERFkQzzZD(BS5K(en>TmnUQ96N=0~JkioX( zy2DZbbtHr!HSb|?CcOToKD$yPf0AVMDu>}>efZD7#;7qhk`7fxY$&a~Y!Jp=T7GJg|u`1@^4N|4g8{Cw$a%MI=uTBNltU^pS4CoTkYe7`GzziKQ zewD5kECO8uq@m8L=R7p9MoYQ+DD=tM@tsae=w!>%khR{8)OZqViGz4QaZBcu{HPlQ^ z?g-+sv0n?pRMK%^aGMRwnX$LUW*UB6u7O@~BJD2v*Aa`}nHJu~=L@i<&{bD@J0^fxGi!0<< z=t+cfEb8v&@*V^|#spj!fH;;>GWuhL#0H|q&nlZg?iG+l^ z*KA4F60VtA`ME!ia{3{<+ulrO*jAseOG2&% zQ31_ADiRQqBvt#8xZd%g*~4&}BlkXVMf0SlhC{0hN|c)<3V$%9>dH=b{iyqCObMoa zxsNs5mZHM)o3}4;C3+HzTf$ZC1EgoAr`jzA(ta`6j{TFW8vlsjJV6coL^6DR)u3S&tY# zeMikQ24y!Y-|`;BEX9_6UwIRqONwmX^H(*DXGZdPiU*vowP`_F)`vNz@nGOId$58% zNHSLgZVi>aa>sFB`i8;+2&yGV8f1A^9Hcm_#{JS8TSCB1SWt>^R6EY-tbgnt0x`+* z3`tcxL8k2BqleF{P-8OGT6dD2<7km)ih8h$!>fkFvu)azSy?M_6e4k5SLpj1y$}0B zJ+sl^&%XSWYVI_d*=VZ=Uc^1A&LlHBAr3RtRjLPD?l2^WhWPNjVqk_{X|Fi3#IV>r zdukUC8YC`Lyshf;+#Td$daJ82Ihx7)wJbQ7Jxy!YLJi{$xmBH5vqzkc6^9{bs1MC} zMGS|@JtpYkhT2U$XEe|GE`voXcE~i42rYbe=}i234i` zim~k*^Y(Bg8dck$YL*geOi)8YXDehd)(Qgu_li9$DS_NP11yPb>zEWmklY1SDo{Nc z#0x66Svk>W`YG|xEMw(55!9^xY^X#ET-l?7)SWd9nPW&k1B+b>Jg-{F*Zhg4?-TD^ zcBQMFtdJrVtRz)vsaTR~)WX^rIXf7PX2Mz4{Z5?G&?6c8mYDzWG&%Wdr zk?rxe92V=N>MJiyi918YLo%kwkt>h+)77cv)2%EE0b2RTp(>WnRKTi}8XWiv{icJ) zRkRu=$D2?@3mJ8&mnO!D*cAY|sKjEKn`sFeRLV}g&2_qNpz`=&EmZ!Jf9kErgQyI| zOV4f`;?Ye4&8q{W&>xN~1Zru*c{y{N6aHQG3c(PF-66rX|IFzrnX?Z^xmv2EB<_Rt zl9l9#5e*FsK6P*`kw)VVM}cH{CQc|y=P{tT)gv%07G$IpL1>U$O zxTryZ*3>o&`T}QdP0SA!o9q4QAkh4XHXtB2%Xaj&RIq}xj!+c*NJP(4!cLW&98H%S z10gsu<&b7rc-DO6r&?$-s5JTX+c}#PeWrr*dTzo8YBJ$zj7+blg7;#Hz`5u6^`VsC zMFdNVL0b#F9z4^rLv!&I&(0Py-Dx)qwg7=k-RIzWN-(QpEaW!k_kzl3i0|^WdQ+*y z+-a&}7NExrhM5kmSS%5Hu;!_XA~jG0$%`W8V%S2edLsl^SPSBt|3H?9H_yb4$>=KOIhWvDnjg<6Hveu#P(Pl-X+H6370-KN5Z*~0GSNm{`L#Ko7@uLyR>W0;95}hpUmE4h1z#8+S zu*5?6N6Q&fUXzf4ez4nn#@$85Yu$|)cGG}xsyXhv2_js;-0|poI*Z~4(@(o;iIlwk zE1SDv-EWH#Y?n23;l=H^GOiNS+^uO^WnE$B^ZoE`2rBv7am$)YgVU1r}7y{_&_vw!+I?Id5p2I{MY@x<{H~F=_((Idx{}noiWj63)^K z`{*z2=Q^QOL+;aw-M=`q6qjy>5)@Ml4*WmGG+71HW_}|*sm-~2rLN!SRNY?f*_+rw zL|r$2w!VcM>UP?K)={p38GAf=JE0SItpL6aXu_*WIo*X?8wU2TcKh=CLGPQBgZF1z zr2c(uJBMLlhyKuqmSweE1$9)cq7LK1NKA}o^`EL>F#qIE!{ne*YHTLW#b~CftJ+YP zAJ^TKqsT0|ve3bR1x9SxF~!6bGSgS&XpxXr6IczPZ(KswbBy zu}yO&p=0PBmSNImgmO^_C+|IfwOV&+1#|cwEJwyHLj1J*PA$^=n#sdKid-08@WpHKDC;_KKORg zYCqfZXNx?NzOE6A?G_mWL79eEY41vCM2vEX;Zh%VX|fUZbzuzaj^{=8FHNXGVfCTv z?(|N2gpt1&PrbJJKlJS?BmR!*7Gad0lm)q+a8N!$TNQxw!}C8?pIilBR=l!Pa(j+h zI~l0UK!ZgaZEyO)o=Mo><|R7tdQEToLmrtC664ZR5qed;_Rn&wV_yU1s5&-LGHUA$ z%7dGh;4ecs8SNO~n=Ghl?<#TCoIv72KEy7CzUm)I?A>hRTy_mVC}r;VB)_yJ2cvEV zc3QRc{M!Y({bDX^bec7DN%jsiy_k$g-&b($b9@AcL*ed0z0ye6zod`rbjDwJu`BfC zfLPPlr-k~L6eo`w>cyz129hIDq>uDbDbUw+auBF-FU2M~UC^^D;E=BiAr2R3xQ5PE_RW(|dD=^Mkuv9UyDD1>@DE z_&y)Z?fpX7w8yeB&n`*cEmO{5w7Z zL41AGwe$V({15Mo{t(y6XluTGa^&{gIcV4ggrkJO$^7+=SN1vR_xp0m_xph78OZe; ztFk=9f2!2bS^I33UchGhn)X2@Bbx!^lU^mW(U(`aIPoC!^qID;RF?#2Q3HewG!-E0 zK?`m0Kwlbr?kHe|dM=O9e2=Ce`mH}vJXvk>1q*V<`vv*BK=X#g_rRtS()nZc`gD17 zUOEc1V+cz6+CfgjO{9whYE8c(trkHhgW|JT>Q&Qvo zOdV2bnGMVki$_C$`zhZRv^*AeYgI@q5TnmF9Shbp<*orIUwM%5pXi_IVT8<3A0t7kUk2Q z_b?~XjSF_O+TB*+r|Dn$v3A;R%CYLOA4maQMJNG?hYze&f~g7yN=F2F|I?HL+6oJr zMh8YpU^aLi+C0|;_!LOi1I7!8q!C@k#amG{T!CW2b|7&1)8&v!WfQEwADY zp=d9`>i~kxepTS*P z41F=$!dUwAh4YoCTik`7QjRW;q6`pVW(b6s<2WNs6+8gLnEM&F2hjqx0-XCNUHWH- zrbhXC_ZYA?F2f!bh$jGp4~>BoYMdsD!0BOZhP!7@vXl)d=N{lio56&<&EoOQ&&`+} zj7&2xF|*3z_QPsc(Z5{Hd2DW$>-slKf(AFp3j-VFG=6xhheoKg0?ko2qIiI-O!xs| zE7KAp)hi_vM_gdOpc()dpkJWAEajTvsC?}|w5xg-ZdGOnfmB`_mvgQQ`qo|DXj9z= zbf%7394sVwqXH;F3~Mw&4Cog0sh-1=BKYEcWmxb8+&E<=p_Lm4VYkCxu#E{kN;G?_ zWsch_2takG^VY)>v~?f#g2n;s(#+=CCmyjFPd=AZJ25YBlE^iHqs7}*`h4t$2*VJ~ z)(9?}BA;#iAf{aIq4NbwW~qEO`mmXgqu7x}vYC1A9cZ-5(1Nf}h*+d}&s;BLi4DZx z`c*Ox1XS9>nb5&_S8lb}yeIdFeuf?7MFs+?7EK5LjKmNYO&7p%HT@`(VYu9^gP6ec zHhhMhm@8#f-Dq9iC3lH`tGA4`(Zzu9qq;AFTV#PLG2{yk6#scDLKtu{Y=st`;9RZ* z`<&ygRG+pm>gL<)JXR&Hn22X!8;uN6`F*4m&8K3cSEA@Yf;EV12rEM%8QB#$W!`_r zE*hi+Rh)O+Itrv%)gd980oEk6*a9F>n&VMu)TMTg+T{l+Col@LrL(0pFGJ8%Af?lx z+l7RC>WEzSw(~BHXz2vh?FK{;u#Eia{?WYQkA#OxRPgRZE0P5A2TFPO*%}e#X~zn* zfFSop%vW{IhFx$HMrExD95W-Q$7F+ozoQ|^fVg;NL}~h3EPF%;XfJb3fXKavF=_wQ zdup}oE(?NZH@-n4i(eFBY>zi6R5@WP&Mr3!`>-&p7Fs%o1Rh4u2@LH(==of_+k|0{ zL~axrl(S6PMzUc56Vv@g){+vM`0f*0(f=aFZOi4-45yqY;emL1bWB_WdxT2&TR#{O zWH=&$E5Nfhb3u(tU|ozrkD zfRr*}Oo^Q+!;{AN6sPGeH6HT2!{ElLlzbuVUSQW6xE<;((l%+vtf*)PH)YeMw}7TY zGf2XeDs5hy;J2dUPq|V!j!$=|YjY=Y`KzJ`YROmjXAmMXx*@nJxSQH}kfHvRDSjf9 z1wnD9D9|OH;j)OnAqm={$Wj-wOoJYN8|e6yzbP)AJyWcFyaAl+Q?a*I76|CTug*Tp z&788|lYXrF63zGLeynbfp}#mE&er5OIl6xM!lGVI54=h+8!*g>rOASUfKFeC0X03C_+aGM>fyr}S!q~rop!yFti$H5hpTX}k=)9wP) z9K`oU7c&NzEQ4h)MM7tVpTfU5DIdPXj24&>zstv;V!z?46ozqt(SkOwBmprcqIuS2 zDmcdZ+|26ZyGWPY^uB88pYcPxph!&n=JY_Ul4ru=+}Oj$^TOceGyc67j7gMkt}&{Rgz6t1o`~O61{Qhq}7amD5+(%X?Dq`|BPh*)7c#MO7o3iN+X5b_@^CsG=Vu+W78smi=_AyZCGrv z6yQi~wwPO9S;*B9p|gA`cba8d2}I?>%u##r2HjDad}u*?eCN;~sZ*bR zL}ey@cpq9##b*TCRo38I{*w-0qW+U0+`ysmvUJuu!~?t!N0KT;;jF%8g~bNgU~;jm z4s?snX=5GDnAgkG;o6IjYFYZ;n;~XYRHM}^zVAuA3mk%~9Rn8RlAlz+FbZ2Yk8a;I zI#yS=RlPX2BYLZ8YRm;c_6uvU9frvW<9sT|4pg9u(5;SSqwan1>US$|mWV3)7clx^ zmV{N%)@Q=D>Xo6LukhlvN;kTPjV05rj>4i0LHLLr4;ql(H8kzpBpdo`Q@^HYfxTqk z6fFH*`o?x*&fwYheQqb9&M-kV9v1Ic_7o@lwm(%53RgC{v8uf+r3w~xgC6)6RtPQ{ zgsR5GU1MY8lH6|C{rOnO?@@1uSvZOtu{x1&2KBvcUQ9fA;6O>RNK3b zh?LqO8fZR#XhI@eArxZJ6DeIJ>*EESrUSuX;_buOw_1_@w7&DLF3t&7YXR$loqeGq zUEbl2z*m7@D+RWB+{7pycTv(D-&-q!B)(@WnTMoc3TuiuAAL}wXgKQH6q+6&iOY;; zRnFh^W{mbN3VDAk0Smygt3}mo23Md2676VkDZQIMPj-&-*=Ri0{@zhPgm9C%J3ooM zIdzVvXl|`tF3dtcSW~V0udK}ETd9PSK(Z;r)y7a7#3j&t4t;BAu+Bl#XDgw-lDzwS zB$zU{aK>|tA=A$6E$VcPN1a(FFC-k1U}-07s-&4?4-9({iQH6KW24EtJ-bbeW*R|z zF4$U6!NA3%63z-|&k{SXa+S9uLf4fUgPDuV-2A*0!fr%SBh`UPpCT^kW{HXP_KN}t z5q)B}Ly-HEAU0KK2}@#-Yp)k00#`b>`)`N{Dw9rO|JR<&;);aj+tzwy6gvk6tjvSX zEDX@zDw3^}$6+gioxhSdFaQF?KGc76Y5^nM+Vg`W#B6(USKXcO@vdHnWgI|`&QsRY zOG*JpMj<4JRYzX1^eKn!xS8mp=rnz{?og2TB-Y$1z#ixKMh@M3>hOC@5=ssz@^k=H z1uw()ZorNAFqN~V{@V!Oz1ptq{#lp)1>p+71!u{P4>riH0U{<2cAi726bLXtgQ``A z6R&)SgkuvUKKdk+G#gH4$3&eqNW=1QKI?JIaVE3Os&mUi27KQjoh|g$FjU#iASnFH zd9|uxT^}8^%puRXXhEa!rn_)n4ua|L9<%Jk1&0`?%y7^k+q|9hp5U)RC|5ZQQ`^;% z;mo5C`s6}6zFGccZ@C7sunCYvdo)s8xZ^n!%eSoXf)VU2f|w-~n(1FGxad9lErsdc2DX=TZ>L>!-nG&$gH+MSpcku#_ine-+!JzSNb{wBP&nRc-%l!?-99#*p-+h)1qw!;4ktNBh)E?W` z^-vh1x?c`)I0iXgO_!6So%wop{-Q^f)}We&1M)=b7l8=YOk0-^Zud+5<#X@e$Gt*G zBO)=xKAWsAMtk5rnFcpBpPkJ0bAM?|8N{}0oSaCGL)Y&ZeGB_l+atm}fT@~lhXYnP zb7)t_#bY2#G)RSvKAZpEoim26Jar=Y#Bp>5oh`D;&=y{qS2?3P4JdW(-koCWCdO;E6orL3v&|3lluVMnVHZK+PQZ7j1_(IPD zKZqdI+e1_8;&+@MO4yp z1Yq0OmM*>kmejG8jSj9ES|1rX9jt0K7pD#e%4K%B_7z>g7AUG%I#zViK$3}CGM)1} z#CD?d)1xaBvSIGnbl)H=ciANEW?vHhW0Ig~xyL}XS`rP7`@67Jr5i9FaQfXk3}Z2; z=fTF{;@dfi0)*-lfwaEQoW6yQu^LiY4Q&YXh` zzHzYz4pNZTIFhFWrnMD~%=}DaNJd@Yp!hGlEn?3{C(t3P2bq8Bva{k|U$EPJlY&!Z z;;!|6iT5+Z5mytQ;4Z1Kv5Xck0MbD5JrN-t;tD&pu@tLst0U}9Hxc5Cu_es^M9s?_ zXUz68)oIHU{hYfLH6DQq#Y-=Up_-QCfx>-I(sulQxZYJ7-~OW zXZlL@pqZP|E(SJfb~oH3d&KDVfIUhqeKjC8Fw8O5Z7a${hfyiqV}6JAk+aN#KLYE9 z|3sw3I;Si1e&yNfleG$k>0kCsXqO5okLO&Wi3nR02D4~*ht~AL^I+RFbEq<`SNkNh z=++ipx6(PDPFOHN79spCchypT?-m&_Ho^y4c6Y1Gi= zQa1)7C;-~K$EAqtyO6F1xqcA&E9vLH408oVF!2>6Vi3hr@5;+iWny$xQmkkXi~bBM z9XNueLrpQF7F<`M6C2I_OQmC+j;d^2Wm6u)}+0Jxjd^ZmZ$B11yD`Mg?hB_T_jirwdrT5-PoifcK8V zKShyr^wupGdxC2+VfqXHj|(~Y4$lEd9D6^X>4t*ju@AkM;gS-a zQROmtOAq0-Ili;ahQi@txBijQdhJXK_hxJ>2)OXAI8 z8O3p-ovIT>n$vi+tJ2f?ch8x?mH56J(ijazb9`$myiGk>$d2?Kj`gL-)IkQ87p+%2 zus=L~5HDI`*~i$?^mXa-0}J&eT6MHAE89ytlEc)*s8|13shll6)KKhr_BVb5-_VTC zYQT&^f>*aco$BR-HDO0xk(VG%X6uoZbQpu>kn_{jsavKu!>M6CFTP{_hK&=gDgl*Z zy*l0-?7})Ollz4Xa~hTMhFtn|D;X(ozI^iq(Ij1W08ZgETXiqTNz=p9n+qNK%UX*N zw0g<++Ok%$`dRQPVu(oKmSmkd%Q68n+OVZE>I!mCR*juM+@+xC}&;EbhfRj7 zv$BW12|k^ip{0_u4L+SLJ_9{HKAotAqmwf}2P4aWJz6`PIR3j^8#tQ?n;6*{|9f59 z#MaE&9G{7Sf&M?uq#bM7*d4VX{M_gX;OiyANhJ)v9{fE>d|Cid!yhZ=-`vwbvzgtj zQoE7l)qc4Agdy4NTzBg1Sw6N#u2V}ER><1F%P|co342ORAgPjE7Lw{P%!SGdg>`>Oh%3LPFUT`UNH*yyPfZJjnv!Icke9ke zh7_XqHy4Kdt{2vfHdo!3!WL^#j%1(b-h{~eUw2VW^b#Zm_@JbW} zH8|}DgqXph(3wmSOh!E&74X&Uy)Vr@9l65v;e+f~l{ z%{fv}nU|@|K9ZGSgF)6GAz?gn^k4e%&*S%^JmwYi?%DL3f zQjb9Ou3Kp{rd4h@dWk%l;c9l;{+jjFre^Mm_MArYdhFEdIj*i%QS;G4vv|0YW1Lo7 z{n4CVK;TBR*_?=jQN0>X1#i8c{@c}UQ*$<<*^@Ah&meMN^UoVktyb@d5h*{LOqF+) zSJ|&%rxph?NGD278iU2!_G%i;0EN!`fYVHww9V-EuSvRD-wFOcG8m9|2#nFfzpLJ5`}kmy#>nCiAdp z*Dc*W+Rkc&7mmw%sI4KE+bW>cn=L67I+QwEv;jI&&V3;G%H=8;+K1&O|FR*rY$ghJ zQiV3r)HZF;E^K|&&RSg*^pZ1WI#V})8q?|`=<+yKcLO9z4TMuqzA+cxk5q*K*fR7z zQlp*I$!3Vh_03{}BE`FCbD;ZgJxC($I`Oy^yoq>kYpH&$8WW2WR4qS%aQ>Fd%@{2K zPB_$a?BcT>nkUvt2TH`015UstSIla$wVhWRW z*JLOtCf5b%e`NLmTou}5YTto&$BcB~49M)S`YXFf6x~^#nm#UF_C4Uh;^Z`7JSzJZ z<7?gdp)#qe;Qc!dy{7nS+lKV`O-s@SoQ60RK}!;hlXgI+hDeHr_~cxKp&cQ`IDpo; zj^y>?Uo)@7M1TEeLqm5OXJ@f@o<^jA6~UP0ndMYWd)QKz*l0m zI@_?le6;H$u`9lU3lvmZG*nG?W-L@va{_^rQV5o9o#eJm0?nF}X5IO){N zc3mKROmtj7yVye#%!vV%695f0;{b>=0OW&!y1yzjGt&a?ZwM^T9t~y7x4f<{jbszY z4u=SF1ODR<6q0}qjXxVZ`=7C*^o@~SkrJrZ)yiRJP3Y*)<(BJDB$7_R>G+~~co+p~ zX@#?*;{3NIZYbsk?e0n3;gMk}J2(K=c_9GT+82;I%*W-0gl37jDXSIl5!$mKH0vBR z=k9{tKw7$tERc>VnOlCg5J+RPIT;Huuq%$wqL6-&lV;4gh|8s<$%Q|gj*DsSX5V9J zS>Upr^kN5rRnfdV6=N9)t+`#1iK0&x=3pooZOnmELI6yL{6`w!!BuCT>eZjGG&%IP z_lg(y>1}#m6ZZ|P@;_r6GmjU+JPoV>GMZd;fj9d{xPiP`bH3zR7ePZnwdpxvrJmrj z9`k?Y+^0G5n*YXna?ZrVz)nad**-!C94cJ?)ILJTibXW~DEant+=1HUiU$e=&0%s8 ziN=G;=&eM9b1;76-zeNW!Y6*>d|5bDbS<=wA5_{ zG}>}}GsaiDv;;V5dvtb4;HnQ%zZBIQG3@{9k0IzMffSSD00UE4Y!~MD)0;#5m}=>w zK6`>f==&_0_{_($R+&lU5@P`A!y9C}b|nc-@}Cn`=4q4S2`+M)bX6nXfD&Vsp($NXM7nl+ErhM}7q>iPq_PuCwn@L%vBKOuG2j)A(RXGUduFSDxF{A%e8 z<<0nisN~{G=Q!ZY+KK7+ZO;@q>~m5su?bNsbjpI?aHBbo$p{4l*WG5^3F=`&sri>e zxX#XoGqv89C>C6t4~{MjJEMK;P*LXeRsn^0-Z#0UX-wSV>$d81(^t^z+AdS#{IDX* z7c03oB=(F)3Vky$Uu)Qx?R(jw#k--a1IQ3aF;eY(NVTb&CHs`* zwLFKJN=IHElsz7^M24CKr^NmlKt;?vV}z=N{XY?;;PCiDxjBwVVbbBLFYIg>vw^v! z9A=9iTD0V)e+cZ5_p^^P96vG|E+!v5d8kDlR5MF_(z2&>X;tlLSKjb`-0L@Ba;q&A zR$Sb=Gb(8H>7HlNO#B>lZT~(tSg^19M%IlCV=HV!Sp5+iplIL?)~!sO5N0Spf+y%4 z2^m>+$Ve8L+P6~lkILKFhBz#^49k+YTNkr)i#(J};98>|+nmSStDo{>g$@imM~v~OMMc_5U*6bmuWwIH0PkV(n7i*AnrYlOyngj>>PBjkrvA=PKXanMIC=IL}7a*%S~pZ>mKwXty{*c+u){6Nx^qe%;Qm&B!4CZ)ISVVHKE^ zBeXCEKeo2%-yGp0S!6h(ap?ZOx_I%(0-VYYvVn%VP<71@%SO!X#B_8$*Gorr{WJ2HDKXW^SXrXl(kkO} z7tUB&DOp-m>0T7sx%G5i+IQ0g<@z$SU2gQnAcflw;T9bA2EUvDxbk1;5;iu@|1Ar{ z$U>VK4Z{pGove3-o%M$C!p8}i zm8B|_bdH5sI|)dWV0wvq!wG_x;r0C9>0REw^WY!uJ_Yf7J>9=P?uO8-;3P@vdU(CR zuLTF7JruxCL*!2o0+BcSv+Tn9yc3l?-jwgqH_L+hmQIbNAa}7SOMDU+1?jBzZ>4=& z$t8le>H6ZXz23Z+b%iL)2wC@&LYXEHluHwxw&r`>?v5N|=$f$-8tp7vOF5I4!ZWQp z2*S8mZd-Vhfu~aCEeq;uoH^}E_ZwR0{JuXZKp^ixF4D5-jmT7mJbMLL98`@)AxqI#>lUvcgGTlv;jHNBLH7YZ8>wzitUaToe%a z5|_h%!A&*2@2BL=I!g*{xmy9v#`qcsB5jULjytkbxhZ`PLsi`Co9phM*BvO8a6W1i z>nD}>hKBh)TrCn|4jb6msF6o66sRIecGM#ZVh6G@Q>t{XZcdGS)w-fN&7v)yFh`Tg z4QEg5SWY&<3<5#|p$3PHzdx?`@xd{g^59JVK3tWa!ToX_9esgukpnwhz6HPgzU}|| z{$9)X{m4R6yw7F-!DE3Dh(5Wi;X83iJ-HM2iDZ~!I0XldMoI|{cqF8h4!L_@8wzR= zvcjZ*q`)9IR4|dV!m^J^oxm)VhOF6?0Z*!rS&@`gL-DyS}@79D}%F3LK&kgmPq#HhB;r8XlaeT&Q*~yY2J6l)`O^85~5xQRFDF zRty>)S_kQ;opXR{f-lr|Mj8@_%zLn)v-dG5zc5=(-V7pk**_Kj{Ot>)!=JoPfV5rN zwgMf1j58p1S(W_5^#p+YZq3w^vPzek+c!?}+*SA`&t*tXpKf(Z= zW=?J$91__^R|$gHr5+4s>RL!7priyk(~}>e034pAM08oSlmelGtB#6CqQ0mOr;?H$ zrUay(Yi5Wc1THbK3U{@oTKN&{e>Ng%3#vvV46zbmBa4TG_FoaX;2CY*4*Ehh>e1)` z4bI({mnQ%sV30DDH^a24ptmyLI(i=m@dUKy^rg5AcJl-yD9y0$-AD<~2BARJT`IiSd)G05=!Kv}laLyM)9MK7QNy!yvH8w0` zS4(R}uTZv8sU;03bNRKiX#`3d!`j2munDVgENE-a1yRl9wniyu8bLy$LKo7XFkc$a zfsks}j{r(s?L0D&n7R)>Ja);F0*pK?{YRl5aTKJQLwS%TG%#6=R&Wv2xBiB`NS;sZ zzL5@6VY=iJ#uZr*qyIxxuvfpn?J8&;{cS4HI}=(PRE+9ka%^Y+v zZQYb(@a8;g93{q4#zBOZv@R2_jvf%88JkJULp&r{^qqF=!-FS>weF|5A`P~ z&kn#S7J?1^uFnKNf8wl!x3J^xIb^NB)5QR_ItvCr13?eK3YJs}OG{Qd3tE5CluU*ltVtf4VXZj@49~fEC{Hnpvf6BEDy^O4yuWuP&!I$0Jm~2S(H|VdxIsotj1`U zcJphb1gY(B?-G#Q%=a*R?B@vNGIVhR&t5293zui);R6DkVMbs|?uByJU5Ci>l1lb8%u`6(1W zhrbshK2Trt8m<)9Lsf8MC^z#R5xAJ7BLWk$`#`9w%VoZ4aA8)SQSEY!oVk)_*`gEq zUmtuN0SnN$038Mc2k+i-P@vk3F)-Db0;(J&X%urYSItmzGI#mgr3gqzvrGR7p?Brb zoFFH#N-vO84&)H{mp?&Hp={G-jhyvO5j@D{Mh`3pVxnGhI(Kli(*br=1MZlb3vBjv zx7Q-hGua*WM{k1CGp*Rg($*O<*su~jMj>bPtJaDT2phm|l z2$Gc?_2`I#H&*G0pp$!{iitZy0yx>YQq`mIF@u9AwfhBGOlMU%QvzQ4z}p^-Vc0q# zmfW3Cp(}y{5ZF&El+JpE)4me;Pg#1=IqGbf{Kjwgo!}S##mhL-T@O@XNFA8Ll11#W zb#M~Iu3t!bw}mJeV1ygr(IsK%<#4mA!ZEseNaw8N*wHjlI*}j%xCn*9BuK15C6a1vptzbvEx1$NpQ$gf~fRC#Nd{hO$l_ zKLEbJ12b#>ucH~W5Pc63;S8>F~nvi=nl4&U*}Z=`EJKv;p=-3O%o3(+#op zjxqEVFbt!A3?gfxzy$x<-ugx?b4o++uc~(WK_@O+bo3w=x7C^TP75ek2-2CeVHCvU z$UOjECb%2TT*C((x3U;{YXMTsExQT}hS5%_lq5iCg94DYBr7QpDzt4{N(5?)esG8i zkqecBl(~zUQu?ra?qWTo2v=J&l^-{^GX7yZ>)-RqoQiw_0=7@wbRQJSrBphiC?7qZ z5(Xr7SpUv??vzKC{Qt`g-qjsEtzW}E~*{+p9 z+?k=$1&#db3R^fD_Satw*eCfWN_(!)ykdA9n`;qy>u6DiULx(>BSXr>DeCGYm9#~? zENjPQ$EWY=O3uRUu?gbBe{20ST@9gb#5u=&R;TFjj4i|T?7$xYV}&w)^H0c`PsG2i zABeD8-VvhN)~4NOzL#-KZN^s9UU#Nfk*pq7D4ZWv9^)?i+^gB(q~BQCp?vev{yzLV zwF$-2zFff=WCI7IZX`8L1Y*A8#g*5>K5Sp3gUe#hPTIkl>C0>oownbmZ20DHfUo)HZB1uey3kq+a82!oNZ0*T*BtJ%Lsp>@Y5iS%;p23HP6iVF6a+?nlZS>aDQw|#S>u>1E~o0i zGqPPEvaawl?&ts^Ld}Kv1F^Qc(W<$%LR)4}D%#bKIHB{L#3-1n6w=h4nmD~zvtjc} zaD4Zh)qR4<@{I16-M?e_yKL39HdgOTT}+zV4=iVQ&5i!>A>!&YG%HB<7yvUiIY$;S zTWC+BPimMhxa(hFY#Yxj05zFW!~nvSEb!7ubom=rec`5u-df?f=^Zvv1qc|=Tiw~? zl{0<wwsRdaFu{6m+sQ+Gj!m9v))QIzVIJCHg*>I1M3j?l|Z&^^h$%E=&Y^4cKz z5K>>7>XZB_yL+#V=4Ht4*)LlhCsR7NUWX;XK*oM4_%~eCYw4?+NSNC6{@zHbm)olo zrRndYMwb11Amw}WGfVc0TzO6$`3uXfWBA-8LGo{J8S)s{?P5dsDDvU^QiS|8j^ZSXmf0qx@8xeHS#l$E$e3{TFe=Nm^{c8cyNJRugQ#K9kp8F0aDQp?@yp9bM1O z^}p{o_0-@PBg<}V{f6R?zj!9U8 z&XpSM%DUWm({(D=X^?X#H2T)6bO$Pd9LqHryk;2=Syq@hq}A@lI|gn4DEyUuSgR1G zO&OD%!0nE6dl1t4KAe=1D_n^Iak!&}U)3A`xASxtX5Wtd?0ItV3gsUCAJW&rob|>y z$60y>SSQR&=pA=+IMHX0i3>+>=z_$B-feHzX4l#igg@@i-in0TE71u>wOX%3 zR=T{pfwGMG-V04*WvngQ4Ys?x9yHYn`NsXXik6!8x}98X6*X>FBr`<;NIEaHrw+X) zBP{10Z*Z$+9=SJ2s@*c#Qs`Dba?}b`nf#J5mr#=%F=SkZg<%I@@7VFbm&8QfIFKUG^JG zAM~Bp>e>6XbC2re?B`|JuEM#^W@r*@I@m_({-mb7Q#XmZwA0#l?ddwOYcU#`I&V!> zsSlP`ocMnilxp5e(2dehFU{Qp?iXXEoUX7`=R)b`=!p$V?SXbDGr3B=7d(DMwA}Au zF^2rVf774&kMu++sxtiEsk`5}zrNoUuBaL699Qj32$@Y^eh=^V;Q3!!41spAs_RkT z)htw2GEPWjP{=Z|&GQp{rX;4j{tnDkWI32sg5${B>h?KlgqexL?Me0MOwwPQ6)OEe zCL%QI45_q*MeDD*>%F{lWE!giu{|W(1}Oe3Z)0j-El^!ALFofeei5>vgdpHiZ6onl ztqV`&Bj3!sFU@w{Ke>`Zg0wZpx=f4XzGq=tk~VdMw{?84kLxP&WqCk5fh$%xm5$2^ zk3?HE?)nf_pLnZfX_GcsYXdmgpn2ydUy)J5-yV4-l zZV7wMtUh&9?f9v3Jw)Y^H#+)R57oXs@wV~DE_b5o zHVtzE0fWpQzWZNIwNhM7CukjlsHc<{V=h=Iv%%_Y59aMl#9r9FF%6*YCzCF-eG1aM z8oT{jZlggK?{%Yht!}h{`SR1s87S~-w%a({In9~!ZVR5J(;WBX(Dh>jG(W{1TA&AL zUb#U^wc@f&%^x%GEu0kG+=Ou@h=tUU$ctc$2yL&H*guzjV!xoD9dJ(6wt^ zF~UBIwbp}J0=v3CGo?LqO;1f@EVx#jk-DiB(_`B5vd^lDed&b*JV=H1=SNXII-WIh z^V)jFTSzCfe(>AnujaP|BE*g}$ca^kxb%m>GXaM-S5qe6DSPw#!aY4Fm$S#uU zEgIgD4YjrV;1e#ZdVH~T?QR{E@FVB$CHIZN-An79jaAdzEyw*$?AQ%jQ*nvag|ABq zh`U3Q_RYUDn94hCPn&*&!%1u0d-e?VKH+k0wFMXMEqgq%Mj#ZL5>kQ)ES@_KLr9XoPKlk~@?%qA2cRPMTn@N*- zfa5u7iZZ$}to|g~Mgi?^v+k|mr!IR1kbl^hf(;_pajT6SocM(;tl5D3ZxlRsj{l{C z$IATw!Pj^vVvX4yUq2$h0*c$|1&a1BuIK=r8jpHmPxQy*y%pe1uY&yc21v&V@b?lm zG-56?k&?@2C79a97*rq1>iT}VIKJ=u;J=>6BJzBF|I*kWen&9l^Q@iIr`9BkD=*+3n%|e6YXm_x*iDFV7F;|JI}WphW|ZCd>Ze`5qgh zZ~2zj!}s-6dO6B)(oA1k+oN`*Pe<|JVyJjJzieC5l6?-^E}ymC(5yfe+tT5qBU=^Kx&e_v^SMd-?Kx|`ZN^H25?c7G z11m7e`*&4_E2zrgJ*VvEqn19*4hNd>>Tmq~EC}e!Atwh-6JgOhUU(=h-1ECNY%?Dy zT6Hs5tzdR?s1B8rBNc-cZ*7q0baK3_Uop_{J&nhk!r75Bc!R^K8Pq&l0hal=#2bb` z1RmwJa;S*+IlWShx_*?isnq4MSEUQ4^q;wF}IJm>~k2cLOuYvF!Nv z7f7?}>jY@A?cTp^iM~~|BN}MyiEvR&c!Wrvv@*0d(%1p110Aw`0AP4t1gCEoww}Y^ zf$dA)k()Q@jhUURy(r-$oP(%2)1IT2*tyGIJouBkaub;?qS5NWJ zoVafYH(eQMt8#pe9tI96IU&PG`{n+nd3#TW3l4KO#^7Kk;`jk719H0;xc(i~_`F-< z|9Sh~^Zk?;0725F$&90b2j6V_Ld6Jc5gLd{>IEwedHx_tSHk0f!l|A;)3<7Ydb@ri z2n^2ULd1HSgIJNVIE7RJ`DYWgpH}-q4aAjrLkO?=mJDc-ZwXjGT#a~xt=HdqV_l_h zIapK4^&Tr!xa^aM@5{sU^~hU5&sZ>61qjT-Jz<*(ftKV!12r4n`uW~!t6jwup@iPy z<*rQ+OAz>ztOD$0kD)#xzUvfoC4OciJ+wcZx z%7x^&_XlH*-gw=kb=IZRmow$}*Y{!)70r>1$Cyq8tQzQwDq?;JC!(w&XpxGnTlz|p z>+|4B68svQ7V=-rLvwLYW8|U|SpN^Oh9<`)7EHYRL^lX;DPWK3AXX984HSi}xC{i5 zh>F2_S|pb%%9bxH&AAWS>qdN#rP!v`IsyU`LJ;3%SpA!Tap{?&WIsfkV=Ur(uuJ*WV|(%Id}L)=}c<5gKvluO!*DS0dBNvx9$LBEItQG^VO_3Aqhef+|fL`5F;^) zU72rCvr*qbIh0aBi#V!ZA?DR!9KAr##KyK+uo{$-kOcwUUo45xt!RWOc#%&UH3dcu za=C)k;Vt&|Q5?5m>LWn2K@hU(hDc`ubxw?ThUrNUYa`2tC2hVfFSbXvwNTH_&mLY+wXqxbAb!DqS&(EAtI-AZqCJbN-3{X=gBCB_VO zG4^SeXnS&gZ-dHJ2FhX9-OCW{UCoKV;U1~jKb|;lu*LQL&mAjmppIwlEined zW?#(Euz2O!qMPc??}#rj}?%}F$Q5IYw)%2&u;9!` z6YG%bG2{<{m7!kSS`&0W+ExDSOp=k7zPdye__xGZ!k~s`Rkj<-*59!2l)Gy@cn-?$ z)G|(^Wt3(yC(Orq)FRt4{)vrim61CDGBmy{lH2f$$cSSB1AJ}D&eYu=pUCXz|K z_w4&+!dfmdXq!Ap2RmlGW8C>qLlw%!W#sF=2Fw+pgr=uj*P)lDJk}04>&Vz1Z=N(9 z3}dy_^g0_GtCWZW74Qprh96dF`AE!56Sp&RZZ#fLs(DRywlS9x9l)dcItHO2)X$6aN_7m;vI<{08e3WJJn-biQM-gphWuoNXIIt4 zcrc6%jp!izy`#>jew%Ir3-UquZBRntR-w>Y!*}e^^b4lHOU*BqSw${;z`!RC42ctI zs^GMbx!fco@gT|b|3q#EyC93FfIS0b>Y3u;Ob8&DNrqdI#Xe@40D^%aMN~V`WK&{1 z5JaqMhAZ(A9PS9(J|x{2z94#p0zyFy2W=b^BlRx?e62+-z4uXbXp$|bqAi=!5`T*g z&|4i(da5}`pHjtr$sj5SrX>nRu%YZ_e*bV1mGG|R&>QWnP_t7U^()o5{@(b^@xNnfLCl@nRr_TAoQOsq=&toMtx2hD87MlsUL@S>ToV z7;IA7BUtXj)#1olgAH`=)m9QUm=7gw7$ntz^%KJxg^s~*M~~^>>0`EH@>+f9fF}^B zdgl)vZ%_2RAJ7r<+JY4dK2oL~XuZjhQ<5H9E|))csM$~>xsVe#>*Fpk*3Uk1R(AMN z1Cg(jRxmefbSQi7Mx+bSdg_Z}#ne~1q+1%$d5UtSN9DbKoN|>QtujsZu~j>y>Y@*lVKl=@CeJZU?c>u$JYd>^>US*^ z1TkF93u3qy7s}y1FFsW*gzlc&|2`p4d$>gXI~cQW;5d#@h6c56e7aw!)xejw3B|B- zaok*Zyx@3i3Ythdz$VrA3SHnlZSCxbVR2ukrs9zkdk5;<~p>pyd3+(J=VW}%d z0-dN#q3JaEM#bvl4HG>HZI)SJn{Q4 zRx8|IHb-`PWs5uFv6V*b_o^U|d^Hl=x#5kfXq=UnOXiuwq+DQ@q!P3k%?@ zB1E6i%=d7jmW&J2MNl+G4pSn8r98o=o*g5EJVn-Y85E? z79V8V@*a{&F<&6;VAjMf`P3YD@BN|Dt@lSA6xuZS0uRquc0O`?X@Nh!4^D7dq=Yq& z`RjJhkW0;~_jrxIi30MAU2ib(5?7WVb6Hb;i+{Wf$8Os1B5hOx?1{gzLiaT$i_&$O~sQyJ!fo4{O6k5P?b;Osc(99SRZ0NWP>*QaotQ4{Mh(KnPjSLXB zJ%9W#BE@^lMOu*^$>{P)*Sx}m(y%(vm$s~By6Zw3J20&3IV;O1Mag*~eF@*Y>|vSi zY5SD}oAMZFIAMOuew49xPzqah4tj3cl=~wU1xSh>FNUdQVMH6ClT@^Xnh->TxEpt) z3M6X!y^UwQa`IH_XnPnrdWTJoId4vzzSzplj)0evu-j(*yW^AC-NJxKBGy@9a<`G1 zb@Cw(?#?O#W`NEfIS53pnKj>ZhhGn$1yVRxjAW>FM!RGvVi;s9zENsf^9NKTw)dR7m+c;h)ADxmmGG6MRW%i zJiT>#12RAZf*_#KPYY3Uvt}%L5?CF_?nT*U=*ums^DT>QFM|(_3>nq^V{1}9cqUD08Bsaf#gj(9^ zesmt8A=c3+py<{dYK?BDEzVcfK($*%8K#2vG>JyARNa6g__vCp0SrYq z<|iTKDr$hi7gW&-Iw33SiXu6lF*d(<-Iq2q2fMfzYL9e~n>{b$9%_`l3_-vKc+f~! zchmG@d&edc<6{{aflXwk265AFr=71FF#L{mROzUE&gbs)OZMNX3HV_9bFSSEE8Ar{ z-6z{Up1sd_GIxAo^i*~hWs5$);2CIW_~Ab<`hkf1F@+e5j}9*(QfbfC8t={>MfF_Q zEuR8JKiVPdKVYZUh|W1}gNSnylO;unA3ixP5KG&uERVJjQsbm+cH!Z!W)}L*p&FOE z+mCkD^Q9iuq-Qugz%vYB=M`gIz(f%gsInNV>}Pq1P-fYSRPmFOOsD!X;k`ih@4+?w z5F@G>FJ*-CMisd3tUtf68{H4*S^2fdTQmsbEDl{jT6s7E0qgW@DH9&1N7@CUNAsl(28gG}@t_!AdVT!J>xu^BDdkaipU z-9pU3NnG{28`0s6nH(Q|q+frwWxn^Q<@0KKv*HU3qs4EGe#f#K=p?3M4NSTrDtCC{ zO6PE~@m;Ej>}z>-9Iiy+&aRokKAMV}{Io~evLs^c#L{m}!XNCG4EgLaF;0ak0;A!p zI6BlLJucqt$0Vp1()d%;uInHnD=H2*5)Uk>#zWNgob$?e7r7jvNhxvn?wmvv##v3L zb{AJi>;u4mR&DhCNZdGqFkas(qDhlA?&o?B=3W zMzNvWYx1GcNgi?JOO`ETG|vx@7hrmgA4dPjQ~J8MLmPP2>&OujE^<84wbzPnZ9a^4 zZ|Xu=q1O8jvE1D$b8GtWfYQD)3kKdY`_66pu+Ro#VxQz6{`*MFI$jf+-ME>6e&*$Y zB~6XeGm0Ym*g*`x)YqYI2h%tO_(EU&JjZY-qSwQC_C$f1uI8JbYxJZ`&rVin%{I)} zo5eiq<%-)W+6mE1Vdgy-`hj!i)lh(W2_U9 zE4{dWTAQYb>$1VF&7HwSzC;@-N$VyGoPS|@a^DImVbR$+y%}Rcgw1nFMjdgP3Xu;> zzc+DSb1F~1egwYWP-8oEi*Wsr^DxxqUNAF7px!M9?hLWl{O;_n`g!~d9P@4N{oe?u z9RDwp^*2$<+}(1wgD{V4Q&mw_X_>d}XI>aG1sO9O+=H_BynkKljoe-HyLrE{ z-R&Rl44rnd$7#a=Y&mD)$S+*K4YS;STW@ZWHpYWV=iF zYZdjwSwmKK5g7X36spvF~`U| zr&$nI4!g8@TnH%YtJ9<-*aC*H6YF%wHMNeDcTC};z$Va*` z`h(|q;M83Hozs%c;;*{pf;q_wckBDm>BSh6`3dMh`_A+kgZI0`>nQ-hor460{TQYM z`;cE)I!+z{iv4NW&*xtJ>r7v-&-YXszd#WH5hFD|3G}WP>(@9xuG1ZJWR*niEu&%sfeM0AWjugnJ{N0b9i_T2Qdorgx?84t zl?rq?YOPB+zW_upmfz^wl=QvXq@1sjs{1AW(9YWa%~BPgUH+V$S$tqBT&8TM{eUPn zx~OR?_s{pS_~WV|*btA~5TF6zuIyo9V?F}7x%qi}_y#w^2AtMi!r7)%5Xsm59bIhY z7svB)t9AJ~`C?+VzwksQzRScFchl zluLi61a3XqDpkRk@mmWNJ>a}Nu`tZIB4|NCQV~IW66ew}>%)YwX zNeF|g{a*opecX|M6|Vl#I$Fq)=Y!43*BGR&6fLy?&dZ?@G;$qnB&dkA6Z63vC*IQD zoTqV_nf2puyW>R4y^};qrp#$cs=8aajGC)F8D>%~;}+#itlQ#dooZFU22B+A6|T`-HGW6@k)kr=1GP&}vRb{h`i3 z4c|M#s2ZC>>J2D#$&OefiS;+RU`>h>B=IFSxWd{nSH=r}QspQ3T_<@V<*i{G4BhGnF82`(Qv;AEiBmS6{f(!0U+!RUsO z@H<(f&?Yw$o++zZtkm(rr_9y$qyTD@vP{-MXs|_A zScKjzu~bVZV_8QA{qSDCD#y0!O$%r_f^pzRZsTRa_{K6B-7bqaX{PzJ1``)(aSfDP z9m_^}vER{|jGZ5V?;m6m%mT!z=9=$yiY{1+FfFVs&xlPl!)-F?rlae0fKy;1VAKuL zo!Vj#3?NvLG+%IcBpgY<%`2zP0cl6u?%3D0Vg3ZVu|kqy*uz2)i^w+N3}Tw8q-Y`6 zYa^&Eh0iUsR7;@dQ0YYeNYM)eu5=-Uq(lM|Gxb9tELrA}OAHk){f15eet9)$fS3xa6w9rQV84 zzyx2Vl9iv&T4_g;O0@)z9QhR-yX2UI(hHb6vwMX1{cc}WfHbZ7aCq{)&BnC=aq4Xd$7;d`(K6oLqdT#X9C98$PDBH`xtJ+OvTs+Zp>CQwwdA zO!9VmRp z(UzrS?sJ3HRUj!(&ccXxFPesK1vyn-rKtTbIQ&wkB<>E>k2Q&Jm$-+l(D zYU0lgYGfxjO1nIQKx7f!k}LrRItY;<)2Bt0k;p}qu}G01;|Q5BecTJf^iw&slmu{^ z=csx}i!7heIa_XspiH~ZIpPv3V=pesb&;x(R*+o_@lbiEdZB#cUjjI; z!38ptR^G=KU`cf}m-@x_=-}5)L!FKme&^aUI`z&Vyid7JR`Q4ob5y+5{^2=YELX z3+xAFq~3Z&#y$Eeb;wTE;a^f59?C>A%*a_|RPZF@gC9DON*$c;3^*pJ_8;gy*tE%T zm*Q>74y6OH@jKP-UP)J4F!Ew~C18z9v5s}dD|Iy>#5_jUTEw8#9A@5Z4DqxZ&QDHF z%F~RA7}XP{Z53NH!P{oQxH$06W|qSnBW^ZtfgRW)XMfFe^zWUH*Htvj^q(ciEy ze2L+@#{jvV3E+~5jNLRo#6&nVb+UY=Oxh^b0|V>b2fM(iC$>$i>3!}ZMhkDXP zFrPbuW}rsIhv%w{(SP>?b~`<)dPef{v>?U|T#V3zWXff9@!`fsW-n zAn&{4_%bFdM8Y(*yV>*PIi*UsmfXXaU}hp~Nza%oWomd2L_75qcSa|w^9}mrDc6DETmdhPeT%H$o9~@xO=+=RF zB;6N;npeSjcJ*IU#au5KF@f{R%ePC#jp!igPT#%Arl+Sqdl7nuf|_>}#MR-$27|Y3 z_6jjsTfxTL6`1_K+}wG}rrjDi5`nYLfgvFbYILxnqKwu&e{;UQTVQh8wQ~z;7uE81 zMxDl=Z6E}4o7Qw95o!|p{Fazpm+0<6V#d3)uqI$<1vm(QzTC{)%j(_gTTvbTJ?Y37 z1ceq{g$f|ZN*e>;9lPl8X-KaT;z{J`Dklzp(sQ*Z zH3f?+eK8{)iT(D5s?!x_a*pH4n-zr(d2ggnNZ>3wIFk@UIiSADFNoHP-56+gw$ys9 zB{PT-Jx-Cl)=DD zu*+zS)u%H|b^<4R$MAq7mjkM_a`qwTkDKp`S!P{^%SWY-l-k5Nc5NYq4^ikfn|8}9 zCtH}l`!?4WYCo;}UX86!KIrJs2Z5VXVYXpkbJDfAVdBN5*nmyg?)|qiH>gvsX&Hg; zMZt;dw@vb-I-dgYU#BQ9@%+||K zT4kBoTB$8_)on7iP)s&X4FI(3ps))F^FBG>2g%>CgihWjVi1u6xg}w4AqvxAqB7S} z6h~__8Ee~|!QuN=N*V$^?mriIK(PWnGCsDPP{(szP{;eI7!vSjb>y)^DOWjeb8@TW z9X1zc_%Rny+I(2YYH?zy7#z_Y3{IK>`ROolgFK7@4V^}N$@_qStilcFbgaxyX&EcX zK&gW{mVXv*D%hK}MrN+^4cK9^Oy8Xcr$M!t z&s1tl4rRJK$6Z?qmm>zwPvmL=?~cTd#LO2DMC@!E4WDMQ@f3?sMo#;0yc=r2^X;Pz9gjA{ z2o)^3P=&7}`;Zkx7NbjtyQC#Yv*_f_N_Nf;Lf!6)FVT6iYTHZ#;F^Gptn-A28_3(PRY5PrHOQL+<8tOXFOyVKmySX_a9H{{jbKdCQnh)ksUDgi+rCl39ac4sv+r+S1dM3XZ_bF7Bo?$;;dx1T zpA)hXXtx+fa3@e`w;J`e2_oPIS<4e@8?As+aYYTVT##g{4D^W(u{v@5)Ssj5B^?;Bf}p+ppwxxnqW~2 z$JYAIh)=yG%LpGwgluqd(QQY)%&P8*b(1{h^@MtND;0Oh556>6i>3X!C&q+jn=^($ zZJYim>&Wh*mXZ6jVI{J5IOcp5XwE%s0g8z+S0k=rH zdX+=1D@n>-AU(xWR&IQM3G8r{;>V-J1XcfT}KUIn&{^eyjz%r_4||U zcR)l3s%hhvTX0*lYfQzR-ah?ato)>tkj85Dbvg+W<<=(&eKg3z{NMt0;3qZ8Mf_j& z1NMKREer&9hL%t~JpXfK3kx$F>wm8wNX8kpA@;uh2c0}kpt0@OM|fVhAt+l<*NPWr z@XrY%A9ozzlXswO9B(_5OdaL5!CYl+`U|Mkg)>%%D>f|sAm z%iZnq=K(>iZnS@UdQ2KdUlPQNMrAt-`sc=uvFpY8`S8sw9*G-{qxZWGGlBrzqwqFb z4l5eI1=~x1;*q@z%!_+-cmpi%_`=!4eBUpZnTBocjzQt>q4%))!JwH*|2R?M5Rsb` zkwu|elb`ffdl+l<@i;B-PG7^IVm__p@wj%3Xzece5cho<+T;87Sk(dRnxej-vynbf z_{mg_9_V}M8U`5yNF5cB)AV-%R>QTfWeHYNJc|6KceX1XfKF-TT-=0&4XCWOHd5O9 z%I-_ElouNNg-Zem!n~JHU*6~EXhGBadKwZFMoon^!u4M>So5B2Vse2f&ATgN=oyYp zjK9=2{i$XKA;aVn0RvoIg{uJ8qY^W!K&NV8s;x$-s837AmtL??8cVFbI;e$74+ddQ zMeK?lrjA%07ByCs@mRY@N?s;v*PvDf35C?NB(_iJ_O7Sq&w3}Vr0>Wqrw5eubt>$= z$)}J{zU5!pfTV&5N>cU=kp2ETKHmesipGbl5I;ZwwS)WR7IE|rI^;Fzyr+lTT zJ0d}Z@hw}YAdr_K{VlO#F)kF4sPR8#0dm0ZN_AHQO2O4YjDeIYQ8b~tU5-_HqXx_p z=f45QiQ0(ngs`s`^_Zu~5Vdc;FD=F^t{#-oK75ur_~3ztFoYk|yk!NUbo4R~?1CW# zfe?fSHIhxrMJk*yC@Kh%AVMS~y`WfvR@!;WwcsSTRYNJ7QrOM#HQCA63(#VA!^u!e z%|()^NRPYUxtNvY%|UI75>a*2R8wXbpbzp8}>DPeRqr=(==O z3^rbpCZh#bmQK8xTTc9nRss_P35vo@hzH~_I0k841Xuv{&YsS&@hMdz#xG=yFK4L~ zKgPL~Ann7NxmgH0)qip9p&O=gq@PuKKs0w*xcs8qvC(gg?ml&CBkB_;>zAJ2LSgJ@ zXUi|;V>Mz;&O{699Ta_X9v5AMT%CKJ%yE&!D6_Il2aAK8E!~~geb%MnhEw-I3XETk z1EmsZUh+iDImC9~^A>@ui|T@rd$ti>DgjjX59NbPcOl4ba#NGbS+1q}BWMo&w_WL& zOeMBmDFu>(n!;o7AI^($409SLSBZc~I?DsSSw7mMRQ@&`6E1Ur-LO)ACqF30>ds1a zQN&K)5S?QGb_)to34qFftcXk_)De@P?2TZ+01B=$06H?<-0qp=mPA;?8P#lLFs15f z^MJLO_=S%NKtn(aOl8x2SB@4}LvqX%gi7fO8OVj-Yh+nGV`&RmSxqsQ?X2q_RiaT{ z=H-5lr`yT?x1>ufOBrxv_GW}gitmEH?QsznRJ-cj(pXT7({ zd{XPY%Cx;(Q4rhR)!M2b5Ik73Y6N9DhYN2 z!qkedY`P6es=;o+<@IcUo8ww&cY-&O!e&Tbl6P{abjfzysbr~k{2~GJGW3|Ds1Co1 zPX$F0f!_$UWL3y34N2O??GMNwW(#w)!y_oHfJWLPDQS?A*65Sd@@V1{$r9s|5zOGd z8Yo)))-Ad6K=x6Q{6J#zLWi1M^FI~js}^928+Brs9#02+E+Bz@AaKQC$)G*x@D%R^ zW;57)X)Sz1nVyQ3J)vMEjbmg@TITu+5zfpkC~)~`e+&PLy_(LqmTMUSTTyd zb?pUW*Q8u{h#H{~xt79-eBv^5p!oYLK@5jbGv|73U~(lEz3#1Y*W9Y#<%G7Ta#0!ak zZlc)Evi|fswJR{Yirw!Y)Q)Y!7YNTX*W}jS%*swE-ILR>>i&c@VO`$jT>g@hh9td%s*8M@4VC{hi)7- z?j+}TR&QdysbZYl;*hO7^(d$3HHUM$U8m&ks7PzCVBY^AL{gboCCRp0@l3jt$Y z$SD$CbLq=U<_ekPY$p}UZ&)k3uI8Mr#%8O6vapmLKVH@Vhe4fIa~J=CjCl zDodlL9_zYtwM1$BbotzM);mdZx>2+x)GWUVSAE4lHauwRy{41fQW0Pr(9R}s9gR8K z+PlpWvW7iKRIQjm(@qDvJm)*9!z`6JOu0ue3dPIh{N%jz;E{!Pw!$oVPG;-`harf8 zfQ9qw$MkWK^M&}{%_}ULPUlo8vfvGfJP_v5^FtlHO5^d!^B54ynk=W`&JUl-4SKK{ zydL(sh7SWWn&yDP{RAke``m}&vMAjpV?U<|YNG6lVK}zC>ev;wQ4e&+Y1lO5@8^s4-(KxzUsU$?BM>`NXTaz@tmFb)UzA^eS>f#AO>YPh#7I6$Oxsj= z2CRb_EvSP$E&3N%fM5WW^2es50`-HK;?^c`uzw+py@D8j?%{Bxlr^%#H`Ea8n9w{W zdI(}#A&qgM+aCHD#$V$h-(K7Wlzd z-?%}W+d?l2GN&ga*8Z|)`s7ME9_y`n#Zl!fNKlF=EIAY0Bjm`%nMbTInbh$JAJRe*;A zoI6$W-tWQKtIbcc*mWQu<0owXaTpC4RG*S>WGL#!a`yqn`C2I%_$bCB+>{lvS`Qabb^9E(dO`4 zKlT<6`JSF;j=3C}Z{R=b$ttGa@mOT@Xk5D4%ytluih7H6=c5`(J3_Rz=hJ1;tfB0B zt-iy1TG@g{=KaRGS#4-gGrUn3hw321%2##n0wj9drR{9k@WmqQ+V87p>r>z8utojB zx~kAZK3AS%_%(JI0DI7aE8PjZ$eB86I&<@maEoYvGmn^bi()r@|II z!g$+2Q3PZWb-j|hULs$XDL8ALL}LBeJ-9xM=+)gpOBZDT%E-(#k@HYK6^5d=Lt%w!R89p@hTo# zAGgoCbF+m>ST;lfuok(ny*=O$kRwu&SH2ot;Wx^XRe6#=7g}Mofl!eU&aF&xZ&FWL ze%6Y3_joqknf0E+nMZ%-CMAuQ>ln)I_@Gb#41dc@w~zVvG+>>n_rZ<*f48H{UWX#X zis?#)Px2?iE!2U9r4J{AOb(4$oT3?CteFL#4-|OErlZrMcF_hqR;uImg|Y6Ym-pdR zFeq(sQ-#y%n_3&elxBG*bzl=7rzvQSU5leCF;GOn@X|)RXr!zJ_2eh@WcpbWfN>(V z=}t1gvDho=e4B5gnR5CB*Y#x5fL`q4>3r;~{U<M{hb5TL>dss&6 zQYc$54oozC(6nEGw(xaUK}sTgfCiDVHb+K0YD7BWifPZo0bRm25%LZV8xt)I)Cg8> zSwxveD1>4y4%!8S3Tx>lhiXARa(%izNgc=cH9o7)(?NG0p!E#>`}UlC0(?M8j%REY z@AFJ^aI?F<6OA;A#ttO1q}Kit%=${LCmj75r6RP|`uB}z4XEgAO|pS1;bz@hkFf8f zded^YtBNzW4Rnq4>?4g<02UQiZIj|TI`!8el9zgbua%U%6u*C1iaz4Lnq#~={vJRTXSeW^M)$ARL8>LholY$O+g z5QkLA8FBDYZ%XSRtcEX7P3LPllVEn7LITjsXptTRHD@5IQw6#yRe-%eVm3OIC5TK` zc;9fknRZsV>TtSSX+-M4E&z2;wNKZ3^}C|`pTlcVjjfrpOcHyt43iQaU8qQ&O{&`w zvTytEm;dGUGSy5BVVI#yde)RcuH>>3+vjfH>xh7n}JGBf&1bYFri zovdwe_!CU&sh5CI=U-&iNOHsY(Q9KDzDe^o_12MuWwYA8sy&;TB7(u#?`|y;!tuvS zzRSG%+u%mV(pb-qMLEG1J;~l-1;ZDm`3agky`-8S9|k@x@|izEk&A})8sF3LI(Em@ zUN4#y*K~?HDH=b6GnWGC?-R!pufg9&djWkz9w~@rz0l{2=@gY9v`=Jir)Vr`{spLx*jd0E|elz$IR z0N}VN)T-E8yb*==N(D0_w!cI$0WbjSr$^uaSbU0Ss zDfx0pcW3?njxw|U2VyQ8{eSzfjhTs^@&AxlY)SsfE0=0cHVg>%>RXTyf<>m|esbyK zTQK+mklY+@0qnd-x20`#+utcRFJtsppYP}O;|HoLRg^wPy`TRw+UdQ2o@0=1e$vSi z71dvjDKdXP-8Fsg_B%UIV_k1`gVU(%BPbZWzs})EBYp>nQ590;G^GaEdEXho@A%8* zlO)4;fqGedu)ju__1~rknZ^g0UaucJZ&%~QiWp-?AbYLft|!ShDn6=(bPmcZrPQwL zf=fJa9(z@-Bc4BFE0KYC{1ihDLfaYD(duB@Jj{|$cuPm|`FwoE$Z+P)JGtexB?p$R ziuN|+GSw-g`x)3)P_~HQe9bUMH>aP<#$yygwXX2V>v%a^K!}WU5#ef4x@d z66yVz?`CsLdw08S%`qn9z{mtE8=23B!bAv}khTzP-oUWTyIP`#x}XyfAwLA4{ZNj( zd?*;mhNW-l^lTFoj`|nI5voDQH1SYOnALlULnfHV$9P0ga4va9CD5A+ZYnJl>ndDp zwP}_O0T+*|2vOa(9_w_DgaA%P>gmqgwbtTGDp|FXGr9vT*h@CD@h`5JB z+6d(o^0p37(?|~=m-duU1aU!O9~HDtsfatPzDSw|yz3k!_3&>|pW8*Ol$L<@A*JLL z>8QR1_z`Oikx&sEm@G?Cd%UZ#w54N(4y+yY znjkNAdk~0yHk81rQ`iJ((rUk$GU;oX`%u%;IsT~@$1+=@l`Pcj3o~fntX>JYd+f_} z5wr1B!Fr~S0HQGZ-!zjjOSt{*Gv%-oS!;|%2(YzfXS7iq@XJGyTGk6?^b zony7c8-}_(lf974NP$ghD#ZooXKE?F-|2RT2rb&f2>Xn*j^uWuk|(bn7=&q2Ywk1d zX*~9!+Kc$fjc#~R4cEf;kQ$F7Ja)V&yE1Tjgt`lHe@;7BiX|yJ%l4JA;mJsNfpVO)0#BXdR&~cG()cOsIWP?v?i=psFM)S}H3m|J4nI z23)Xpq?r$THSt8PB=--#JL<}@a6*aY_-j_b{C7!%#)`vij2h8oWoO@^DKu7WEFLQ6 zDRVqtFtlgLNJCQ~H8o`D!TOKwzvfDh4y(@cN^~k4!sO#mO$&g!-6FRt)2rnmVg;bn5a`rSP0EoF|A(##M8+c8lHm#ur>| z!|vuBWP}*TYLJZ~`2ttE{sb*d)4dG(iBCo2tkGa+2QN;D-(@`Q?ItRowvsV@c$-l6 zSOqd}x6)8Iy9lW#*Qd3y34Q0D?q9=^Tz6m7yF0PY7|176DX%k%3%_EsrLz64t!#!u z$o^mVKzVl@hrKrHwd_9}2q_qY9u|j!4iqP72WD!a+bM=NJz1V72k-)Po=6V>FB?p~ zz;99;d+0bsHL~Uz%>>6iuyF_>cy-_dGzy|F*4rJR2~`a#YY%W^^mrQ#p@wc_Abclr zsA`%70k~LvoAW;mhoynu-zJ;+=sr+vincWonZUy7zfWivrqR zp^>6?^-#RShzk1U)bVG*xG3El^G^&yWPxf7E@wb-(vm_&2%)gs*D`u%yhPIJI(Gd! z%s>zG@pfl8an)8PW0yZlt)_h zt@e}=s>fyyd2pvueovYFz0zxSx1_rrT)RHuxOU?=kgV|*Y`xcPvftaCzg|D*wYfk3 zaI;VEYN;$yY5n)#NIo6$4R4R9cZ&in@@levqTPV397+@9$x_9;xg}hMkj@`mB!57) zT~IwL;ug1b;awea&Q5}q>5wMO%M)@do0j6FH(D80uYW{=%CkPhjg=5z7rifbDX3CD zR-IlKonC)p8E}|Gw%H9N56p06D&vA!cZdVUndWGGeLohGI>eyiKn*(N5<)~09h!s> z1#2`7hfZ&X5{8Yt?}dn(YDM!OQJm;uuWAt|LwH$Fyq8zzhCjDPUzNUYca;+9AYZ*n zwoRR24WS&zd(<4gJXNXWB&yw@Z}DVuLj!8j$M+DSEhtW(auC>k%qwi@@T4v8rH7i7J;DL5WLpeYZIk~>w$(HPo!s8zvYAoVFPqi1(7-$*c3U;L?2~AyWAt&6;9kxqn{GT=Lc>R`O*{&urkev`j z;T12PS2z6Fc_H#quSwa1)Kpi`IRHX`M`}W-Vw#5ToOUn!`*(1eSVIh%u}s9QqakU+ z5@1Vq+&QA#$dUoJXFgb<%z`Tk@k%SRhd0)(OIh_*(ty5buS_^K-5^Qnw=!ohGiQ;o%8g^h z@DGy{;~*^|BZ<{rfuhCXfwV2!=!!$jYRwjxF{BPl%ayz}g9j2`l~y9^4*uj<#^=_1 z)jaZclQ`jES&c@;?z3Bku63k4V~)Br=u!qfPFQM}{_=m|GzPa;t`do6n-g;InP98u zfm=+V=|;b4@?mhNRkps`PQ3}*iGan{@;ic<7v5{SjHJve+44w#rv)$#c9&igF`9^) z(LaOFh9#7}$G7#T+#US0g6n!W?bmht3XP<0>Qnl93%g_i+pyFdA6{b7&FL?y=+TGn zS8Vb$c#(K6q;$eyiAw?7&;ZOrs}Vx5_IeOx5`*7O)U;#uQ<1LC*^W}NKdzL)b}gWF zrK?>S&nd$oKGRZ}n4g3fOOfSBVemc5M5zN8efbktt5a0NF*nT-A&WMy+_j0^x4Xfns3Y9EH&p{L^7QisEJP1VIIIsAo@ecF3<{0AJ+!JV84H7$N`a8 z87-$_8=k^$ymPeFZ{|X#DJZG9$svq@^O)4jP=}6y!-A@reaV#U@sD6}r~JkkGS2A- zX&NNguqmw)qdC}M~c4}Tbzj}&RlW5r)K@)wc-#t8C2H)!V#P>Achb+UK z*CUe$Db?m+unWS>|FePu&WSz=`LAH`s|9MIt5281H3Ed}y+tHItRdQ@4N4O~aF8tD zju#I>@hBiUCL(#mYmdpiMf=JBV9aU(QnX=cc_R}9=l?}B>5zMH0gOj#bY0+>NuK>I zj)rMXrae@4SXHy9R6yNA*QqOtrxFOZADkq2<9X!2qlONs?0Bo43@1=2?p)n&zlR1o6PUVd5KxnF*;SlL2Vk6C>w*IV7cWLkOzth)7rp5?@b)w%c_ z&gPy{F}`-O9A-p+gIBH9_3UqW3u$F1y{yWnQ3I=nITMnOYE6e5So?NXmAvqGtT?c6$Vuyp?XbnEat#g_ zz3GpE_-{ouFl9k!9e>TkE~jA??!!gdYJqg-1DM3z>#>KqMRFX(tjz`&TVPD7xty%D zm7kIR-5R1oYD64oC2JSUs!0q$5(Os0v;^+O8OY@M?8OQdveM!aqYb2Ly|$q%=zuGha|*C0E9aq9mHvx>_VVBcqK>+ZOG}(Y^3B&| zyIkNoDgwp29xC%yUpo413M;$zDJwSm?{e}{W!B&l)!TMG2oJ$dRMf3($JZ4uj}G9x z&Rr8sKe!FOjk#wZdVp*RfxUs@_*8(i8&)C9_Zs%IYvvHJ>vX$Ox1r2!tyvHAtDM>~8G}WzOz$ zZp0nj1CXCsHEUEcZBIRmfvuXZQ>z$0_Ng2AP5@c?OtcgG#ZvkiT`gDaHGRQc@awD6 z*UsW|VL~^Oooq69OxCfsxfqjZo2AAuT6tT3%%gRn>`%Q`GdR?Owk>-$c>4x$-I#s~ za-onNBaJG3v(9c$ZqL$U&g^W~xzm5PKvWUyUJz^qJA_f_<)Fvf@uC+S#@0OpSLB-A z)D?I0j^OKXe!HT?U+Ifu=FCdg7$^+W2E+%3{;Zn%F*r-R9>)zBR~9fSaW<%Bah&Pl zE-Lt~eoLdzZQ$zmaz3)H+!E|Rr zM#OJPxU9y9RbRPD6rux4cN?c@wpb0u7%0nz}Bg=xNTEX5w;giR{#~!Qmk-`n(WDZdRtgw%I+U@dQ2ID#q;Vp z;xn`rxtGzsz16v1x#MP+0g6EDp2`z!Bf1)kz>Gf0hQl!9ty#H<8!~>MqtMl4N-K7U z1TVXasBZ2G9(O`wLA)a3d@e2^nD)U~N<0%PJMz+x!GwvBl`TXX$nbjBRpV@*!(OzJ zzMT~;_2SKzkrb>3=EMTP=lWGNNp1F+llYZVRP9R8+3Vfz_ROdh$YJ~`9leiYfuwBq zRjvkbSKBmki;2PQvbo7?bY*1+*3-j;1RDQ$v&bSl-iwhKP|+$Fkmr3&Iw2Nx%S;dyx4d=MTSB(73nl)(L63$;ro)e)!gps^j)!5;Ls_9X z7pcn_)n+%g(@;Y#Z2hvxi>V$JMt9ZrryP0FK(}Un^~Z~=OzCw<%G}-SxeeZzz-`<^ z%p8L)!`zUC=UV3COS2c~sFA<={+;wswUzlyc4S<<>M!`@t3}U$u(L2S{FinX7FLe` zOK+(qW^?H2)l=wk2T+Un1Y*Xzp?yZCCzD!i?Z<(^On@gEG{paU#qDPq+oEcG%E4ku zE4}y|-%mos3q}+Wzw7;dzWa8(`s;0wsz-PAFbIwPuO8{F?R6PadNJC+i#cFh;Q$9c8=e}^}SdAnXL*ArMdU(`yn+IU*Z?a z2fr!gmmclYS~9P9R!^_TGx_8I%o24qwYE12(C!cT*_tK~L^-XVZ|B!Du%RM-Nsrgp z<|<#Rk0fw87^(AafN$=PE~a7b{wzR}z`Qsh9 z^AcHEY_HTC+loqabe}`^kMI`?_j8(O_ptr$y>^dRaja;E0H^!adR9L+7^ToM*N2|R zjWo>NQZl6*I^alK^4tAp|TF2EGKfoG=F* zaEPxgH$pM3&z&d+D&81?rD~ZJ^sMklKSpY9xIBJsLL|I`N0P+CV4~3(Ig4hJCIR1t zV?}T;=a-0&xZ)GXGF!W{F=o)m1*&n4JW@FyvhOnI?}7q<`SURw>Km9FL2ZV-Pn~2) zIK#O8{*S#s%lkeO+6f7Dc1ZK!-!D+rPz|H17i71aM%UWBFCd3HW7ef5M#78hoU1=Ua?-PE0^-@c8(XOcCuZ+VI7vQF%$&8Uz z%fqY;<|zNfPD6zDMkA6Fph`Vk$GU=`GkvuG^CL3=ujYa5@98snQS+_~FnKLVv~W9J zSJQk!VCOxoq^iDi-Id%2CaANZ0)o!Tq&Y^UGE#w&z=VmHXhAvj@|Ptcu2UMj69oUi z^?u9VowtWvz8U4EgBcrx^HLZZj5tv7A75nC-zvR~4y++%`;h{VC6=;+%V?C;3YV!h z*XC_Pa;dAoGGmH>$tX|~E{;~#!C3CQAEoq86TznD5gX!r_|fLDKMtkaf|?HDW$h!$ ziUAF=LvJ$999?9a;SHweoN>>Dkz`3Ac~=v5M==JZ1BR^4l0>~KVL5VIh|nA4Qtbux zYNk_YeV9pd}{5jaOdJ!hGx7p``YIQEF9nxKT`mL6c!)vxB?IZG?Wc!&)@1IvvK zVJi+wP+?9_B~K7$-tROwVnP9Mq%zx2-)lxFBZtcxrtegyB+VzQN4;=()`gyjylB`9taJEUH2h-)IW?e}HB$AF zWb`f>iCcE0K6{zzA3*x|aTecv}`kcyjLn;Fc>=NyZ88 zWp2^Tz3DP_5%`Pi-N5Lq|*1Ne&m+=6Ea$+WIW0T|$Xv%bjR5L8*+L_)$3 zi%-Kn>65i!YUsV+hjXYP)*y@s{s<;y&SCGT=LYivM*tNF4Pu*>BpshyYY!YFq`}$q zW&Eh0j7Rzn~6JL%;kbd$Ru#T&~(Ly@?UTU z+k*(s9NFjwPJAoVkWRROu88{TuNlI0LXz6W^hjO`it7|y!C zr`!yXk(R^ba@6^?$^_{>BWc-PPM@K?IX!lPb`NU|dl1o11%OBxxb})h8YDIBeRzSp zPR}_`{rdM=8Sr70*AUA{tSzsOHDCt%OLb(D*SpnRO6s7YPVBvkrdf3+0A4Q3LS)o9 zs?DZdb2TJG_-fGMfTd_B_sSmzw8jv=Zlfoy?HQK&x}8E4?5n^Y?2Sv+>O+68Wrbfw z#SVQ)y`vJql8M!Qh3B{idP2aHFcP|*PDHgKKJub==c$7-E9CFla8Pc-+7q#kw&fK? zj4crg(@&h1)-BA$MzW~@b3oq`bz#xq2DcBuiXN9@HLaWtM}=>V=J^-I#FMpqH~m!q zfUVJH=t~2F3s9h#mk1aeYoc}(`+*pyFj5w`S3#JQ;-18H{0xFO`AAu|nY``d&Q&yl z39Lmpl)KP{!CFO$RGTwdFYCc7PXl?9Aaw#@LLElrxB3(*s9cCafU8axVigTBUF~DO z+`)LZQPLSKZpXlsd(hc!4&reFy@v1*YxE!)=yGaEfROFLcd|e3t*OT73tmKmJw&A@ z))hs7i9Hjom8i(K6~Tux{`;HZd91FSe4We<(o(Dmtxzfonwa78<0?>QI(6g-yKC&l z#g-S#;N5N_pv{q7e389&!<7;pTugAboPK9^@Swx6IOkBoW7wFU&&ac>a3Z0%A zQOcF?4D{!EELeyaRfUQHLlmqC@!%fuW(7mm#cnuSNk%wUwP(HG5bzFD4PZNBMG#NL zF7IjUT{GgI01dCA>PSlBhA(b1SXkS_08{atpw0qs@H0Hlqvq6*sF)aB1nydJ6MJ-eHKT{L0l8p1=6D96G6+Ep2ywEl7zUpk zKi>}fe7u}U4#|0Zg+02A6!F=DFbhT1R9{p9euw>Qv8`X7eN#(V_qFMVyP9v;@0m>3 zbjNuNICxe)rT{0{1angHT6Q3%nolS5-Etzbw1c=-jj#?nl+zXGSl5*adVSAhncCOnb=upUNZ7IpwaZ_{3#V8lNjdS5$^OH{Hw>f*J% zs_Zr0NxysRwX;9|l+tDp@p!w2ngZsDupL$O-{NpA3+n32Se{S$iK5+EA0?31sN&a# zJqhcs?AFd>(Q_BpsfCkLF|xcIiFf!HS=wa&rA>KNFceNYb@@$a?5|OmQpK66toqfh z1e8qVh8&jezhTqk>>^Gh{}pdqkC15hfR_w~8RePhDl~17)(e-XYaf6eagK=<8kTn2 z*=Df@!SQuZbQgI=4>*v4vjB+H$blH^9^vfYI~H$pmUW9WH~M)0ydo(Qw*Aw2ubDBkd6PqMmoBuX7!Yb2Uz##AWw6_`)+`foMPyp=8 zGSlFZ`yRcE-By6UK*vsp*vJCC{Vyf-$9a##%Qr>cB9TnviB9;U;Fp}bX;>|}> zy@}hl7zgZ`fobh01c$L7MDd@inc{6#Q`F)n$N{aMVVuft^MA&IFa+_+90P(``Z!Yz z@k`2i4?mt$hiS!*14@Zyu5_P7`Zyoz*OPS#2>WV;dKk+DK$%540lO-3S(-eK&aqSD zILoAd7RmDwIJz3qz zaYvEm!6F+}d>l|*i9+9aM3TWl!4|e7AjsJKYx#fOkjx0T4To6ku~9!dcw&lR3U|jJ z-`44ij1OVO@grC4Aw7wiwx!P?Ni{KK2mT{H_49br@uwo(Lc>Ff!$I~&#eCk0T4j&4 z)@NrZpdGLHfm^xw9BI{fQ&Kl!LiLm*@_|+9d~I>D+@#Xfy%9VafWPfHZZ^|>+#P-Q z11FCrQ~x_)TG2+z^be&R+8UlqFS3^|j6mSqkJy`iqK)fF>`tfCs3%q_C#k|?=821} z`R)Les15e0B-rPQnQnGJ;_}Qrki+`mRIFN&k5mh*^S;AdZTl$>3D!c#ax<+Wf@aOA zhW3^|WnvH#fFLb1F2A*lnD;r}d=5E^E;gox4$1{DOpe$0RZP@OOeg zXljnn+jpCBVZg#EqI^`mKz|gkwK*=E9owN_dQ50d*iMDRA#*sFD`xhYiiO1`6g&)U zL)}ej-$5|d0x+c*NG1SU*L2PJltbh^1XRvpXaE>QcPnzJP@tA$Gs zkhYZ)ha$N#t?FwJ%)gm0HBdDN&J$i6Io2DYzD^7cGrX!y~8li->e#W!}#6l@t2_SiS}Xur+`5}=#+&N7?M-!kFOVT_H}mTff~t9&GJI&(vD z_l&|eR`cs~ZCcbsbOSfmZKat>c_Tt{4H=?x+RR`R$I2$gi_=jm zQ+Qi&zw!+7p3&EfspWTm4V&e(l;nUYH6PP2OknA6Gbd7Th9++>#DyO1eaofqE(yW` z8r)>gI`b5zy%NbkI10jWd(b@>g)#Xe;1KX#GI!jTaBeZU({i4<-azD}Ls;L_4cB{y zp7DC{3Qt|U$Jnl2yu3kGQ{C&%8Asja#f$1U$eE2Q-Bktkf^e*@@EIkZkD#{0xAZje z5XDc=DcWN+`noRfk~L6)n$X^ifGm&JVz9P4&I!Vg@5Npe7dOODhW&`i zmy^~DM8IVl#vzEel9cY(cM-X~ZGERPjUF+8FdcA?7s~`(M3a~HYsCs#(H=@;{M}A~ zjElcrq$5QV9W0l9Zsc6YA*UW$_z*hbH}Lnz;2R41G|!44H1jmRgq+8>3yK93Frc>K zTm1Nvwi92_BU=u5wV%Pq|9k3HAdIiJc&liE($EDy$;ujWBDUjYhNlGzN*~zInN&I*~HcyNfN$dL!1i`7nc&d1s4*) zz;*}6_p^-YLal>^`g*JyNCmc6ph^Q6mdJ2L6nkL+cCezW1^guslnvaa2jg91WBg+Q ziLk>7cKvXN%{i=jM&EkeAa@nM{e++hh(&S*eJ)ApGSDT0>uYhDYbiI|k`3Qn{#Yj` z|EPi{Rgdhc$NW~wb~nT6<0 z-Mwfmr7DO5LwlreoeRQ%koVit0p`^cjLU~fV7AL~v|nHz0@mWNuz)6^A+aw0;)Bp(MQ_XcCACa1gLgD{o}0{>0?gagZ#C_mgcVn?s=}`sU0wP?%GR4PcQA z)5`7BrEnRasgf%QdyoD)Tlu0%4R9T4cU*}pt!`-o&@%dVNf<=jvG(KH>}pQgk9bZn_|KTk&jOu=N zm=d>BuW69hGr?^GuEND#6D~{5EGsT9;!IQhz@bU^gJ~;MoD~CFP8plS$CV(~!D$Pe z#J`ZS+ZWbpl*jRlW9E9%M@ePc@X$k=tvItG!P8nx_@<0pLkgyLP4a=v57+FPYk;#J ziPSV$A^VYVIQ5UJY8DLM<(6m@sfTJS*Nw>aVN~I~rP>^l&n^emAJ6CizXFhg74Ohi zVvi1W^pIXX9K{*8kX$j^rNr~(v#mZVmNcy+P!~<~)K*0%1@gF_0<>!8l`=Dx2u=KS z8R`A?;lN40*)hp9gh)A&cBxUQ)5zm+RXx%&Nez6}^mOIy1&x8$P+%frC4o*wrw=Yd zFVKU&-Y9fu*V>Tzf{+5C47sL2^ZfF!$KthP!@3j>Ixn&Jke9zU%i65bo)g7x*4#L- zs(yh8%LXXOfuC4sn{*0=w6T_PI(?*V4~JEhHWV}D9G_GGJ9(pIL5OZ?ME&83mWtsn zMot?NsT|T`2nS|3>R2}&)+IeR+roPFT*vIN^cAa3HJHG0;%>=S;OXA&BaBg)9_MhYCl{tpJ`i1%A2h#QxJY#oEG5S_9{Bb&z_iJ z{#MS}e9}!uTK*-^;e3#v9ZSHBqO$E%6oi}5g~?daNd*6P?U8nT1)@Ht^7EcNj7-*# z*66Rg<2==JVff*rMiF@bPipjkn@jl*YR~W=-GACru{i(Sf3vk`TYm`(-hBW9;?`4E z{N&;r*ak!S{gVSxhwlIQ@(qi{i?DjSG%Xsw>+=_`o3K@m{pIPQY&hL4h4)3CEY*|q zdT+Wr?nE~A$G%0M@w(G4wWUq{9oT-)hTqNh;eb4wM6btyj&`t@t;^efxPLqk#or&{ z+kfP7lJBScm5TL=i3JuxPRUK}&D~M^ftM?_#ZT7Zc9ex~#KDX3CF#+b3?KGFUeISvY-f>i~2k@w8G*my4^ zJS8F4S@EEL4s(#UFm^325n5D?eYu=Kaaj3$ur?J#M{hBomn}GMbIgyO+=AQ8_j{bV zhT5^_j^58)rm=b~w~J#b!DjY=7y`l=VvdK4XMdaoAesMBQGPRW+5d=^y=U91npk!0 zRmbMpju4{(Vv`PWVJvB(R?2gk94x; zlCd?8)Gvgv!mq;cEr+Q)gbw~*DM`YSu#TcKjFgd54byQ|aHJ|51a}qKGrz=eS(ov01QN--`51oc zv#j6WobH8L-&XWu8+}$t5CANek$x*(Y*>2muA(CUz?|ag(pyH6D@Mu#Cca(HDpr$B zV3YVM8J>8F2S(qDP2PWTX~rechgP0qJj%g4wGeojM)m@L%v?ye87@Xy#NYaEO1ym- z<8iD=c@Td?arNQY#zL(<3~?HTrX$8Ifu^Ddv39gCB0L78DxrvPX!Auv;i0{zk1dBH z0G?C1(nfvRuxaAd>VnFst;~Ig!EjmXZ!ODIIjn#51sa*FB_~z85nSFyA6@xl#@>&L zd6n{1B~5Z5@>1r?Geoxo2cH+>?xg4TN% zrLFFKLNlTq7oy`P=GbOJhveH=0zfV#&aKEE?Vi!9TG{teHKzhi2D0s~@RS2&n#Fu6 z8v5wAv1qOAr23NM-f*FkcIt|l&cw)W1JD?GfOvy<=!6(cRrCc?({FW2{G*QNnyekV zGtX-WE2$-GIFU}!6C^oe+nYJO*H=%k@eD65L_g>uwE>}-Z-@A z*|658;USRmsY?O{S{t3qNQ-I3VL^ZTmhUs|TIXKq+80 z^>YT@fK%-QS$Y6Y52BmqQP06Wc*Gn?4moxYaDD~=PST*EBiV*dgR9Z88PhPIr+py) zWvnnyw4{#AD_!0fL!(nhCmvN7U3y6BEW`foYxNOWAwE$j*20C|9y668OWdKnX+)5W z2lz~a&I-7Ap}wM5a#@5MgGjeXgjjXqME}+L4_l=wwm#q>SGMophkV;o`1xfXF+re= zbooAmEqB>ulB>U9ejO(6P0`SYtl+HPAD^QhWX2@?{BeC9E>uDigbX>&{tvVgbnK`8VjXxTC5n99R|Dc7ineWMpAQRm{{Rys{cGR z>SzK-R`!X*7|C-sLA|u2IxO6Tle6na%1VL39tE%n4bv2OM2*Z9GE)4ZV1AA&*~^i@ z6)jN79NWm<^l_#{%Gumqh1K>Pu6lAhax1H*G~|Rp0mUq+aCEqmfv3(*Pu)jw845Y| zCN*KstHp{C=1?Q^diQaAqzsZrr?ONka`Y|; zS}STU2aOa-hn8h?C>S^1ajG>;2e&H1(EQMIgWbp-D&m)hU8mXtf#q2o`r9q&_(!MC zCa)rZq##@QPuV1u*i4PaKZcyUp`(hUw+nE|xp7r?nX(YzF~oi4$n<)&GQduzY0!%Y zhF~qMMqoir`U6|*H9{2qaVEUA3xIYY1O`l1Vt^#qPID6lF2}d&I8a4(*(+M(Jwn`- zR#+8JVndF?{1OIz)jt@=PCgeVmR5AJe^IixVq9IzDPky$U5Sk_mfbEujRJKo|ee;@|lp|w<`{jl0%+At8+Odc5-}RaiV<%O!xpT{#CO{lq@}ErA)GumB5xj zWixJewg?tn$$T`P@bQfeq0i?Y>Emyz8z$cq7Jjhqucj;?P3f!e*gZc7TtfhwvQ?Z} zf*&+RJ7Ta&$>z_`Tl*zyHs2J+4}WHGPnsFP4A`tmr}x*x+ny-vAL*HGEzYh68!HC_ zC?PkwkTlbm3fb###h-7_^Bkc?pJgl0nALe53J5My8?rz|ohF`Z+6FQYJY!{{Zv12YwEGK`+q>qgU-lc*Rbw{V{uN$t`J&Rnwg( z(%e>le|q;sv}*89(xGQeiVd^pMxT;h5BoSnOT8th3rzGJ-O5>x_5f7}>+-I$v)jWv z3HtMh9Hg-ftyy&ETJ!ucUIr}bjSl(EyDDY)0Ru`G0PUb#1ms(GNI;U#SHO<2=TTb_ z#gsSg2$G$!oD9CX>`#2h?yyYZ3dc9Rx|vd^-0sTGQga+n-|zb)#{mT^%nw?d`*YT| zmRBjRJ3ovjYQt!5lYA?wPBPprS$o=E1rzX~1zc%GUGZKsgrm{i6veSNlO5{mEzU1P z(IXXWe6!IgTtu{`bXNyEOz>g0>}tADGp;NZD>bN^HTv>{S8Pn0Q!RNqE)Lq+Kbn(0 zKJVAN>*CyNaA!>eqqfJUbdoeO^Kl2m(@>X_l3^UCI@WOa>$L9HgxkG>l}4BtNJyk2 z;|tYl{ZWvU1}%>{w4*$dJ+e-hr({QGi*U|dFSGQN^HemM$S$RVBXHg&kPoh{LAkA2 zD$#kh9MPoD;x#;rt0XQ3x1EF`+t}vm#oWP*Q0cj(lXpSiy2o^Y=3vEcRicz{6&Ka| zrdm^BeG;c5;!kx*Np&{*wl*u(FLi@0Jy9oI+}w*fvtEb}L-jfjUwoE&!v`@Zx z0-Af3iPVI&CYq9=tT*a?Nhrba_8;>)FV!>rlv zkJE}%C9p0&_BZSCHx`2HNcA#>+x2{xh51y?x*B+O?h@*;brm6|bHA*1BT@y>G#5HW zS>O6QmuBl6C#~dJr7VP9Z$OJ5kN0miRvodf&)AMD7l)aW_un$kZr?Z@Vw-Cb|&i$nt@)z2FMNE9a$r8G(xALj*LC*bT{Zk z(DQ}(fyZF=g8wajRNP^%@Yne;8294-^ky5A#fWfYrU{BK+)_XC8PH1ov0m+%Kkr#x zSzW92g3YlkkPjeE=oWE3zrdMxk@}T^T5j@WoVG8mEL@U&(Oy}~J*E4QdET+g{4c=;^gL{b z0=S+vf2TIx?@6c+KdQV`$sBM&kDcV0w6sWjBCNC*8TsIrdgKut0Dp6yPt8~TWP9=a z*MBhk=098nnOOcyTM{!H6Z3z(2=YwE;BYv+{zN=XL$`5w@c{^|sYd_P>D`UC(LCu# z((VnK)^zZ{KH+!+U>KPy8yeLUwl@7Fm#2w|#@rYPF{Xa@A4`4FOLu=x{d0Y|?ic0Y z@p<{a?y80<>hz13OJ{p|?a%`JL%)b+M;Nh}#yJLy0!sB{eSJpTow6)v+w1RO@eTJr zVRoT-Yrd%WiP+KkdVVKQ`9z34pu-XF{juxIAkKw`o_-WGe`@-u+n$vAi4K$ya}T2S zw79ISy^(_8Ot6f{G!I;H(>0+=+K{UEAGi9O(f2mEf%+0xglTf?Ri}XJMa7ZmhjIjO zwVwF{Nv4$#WeTMIb4QO^0S}X3l1?&aC~EVYBARZ-l=|Cnj)o{nb@<^j;IIGyw<1Da zWjLE?9AObVSKg2pz&e_q`G!mFor23ZIv%<>agxv=E4*l(rrBH0GVBR_9rYAGI_*Pb zYyet_ujPV9V#JO6+A-U;TU&xA#0woQ15%-M zJ|r6Td)CV8J=DfFqM0yfM*>^6q(6p95J`62Q zLV=aYy*^qXlWIfaitj8}e%UVkOJ#5_%lTKC(a3vl%#bx!ZCf*+mrI<0T6tEmL?gBJ zFGFMsKRl;aW6D%b_%@1*hi*CvG*3XHhdfqE`*HY}?bh~7tDD`a=K{kHP8Eolj-`*V zKnKFKWPa#(((zvb+ZS78Eg)`!HB&MeDObI$?IrZGNy@rTkib;+y1lj?LTo)Mhn}of&T=tk)pF!qRFCjwNO8$by(@Lw@-JouhQ~-?%})&dyOFRg9$G%DY&WMzWQzJmUF9 zx7&EC$!T}Fo7cV<76RO0)dt=4Yh-%aQ`2CZH^m#{X)()a9aJ-RA+>Me`pah%Ah(%D z6P|herZ8%c$8_Hk|3V5*zSt&1R+5@&GO%WYDR>lC6OVut8U6gBQRo2Tc2;D`DT7dq zyx2Q7BWE8UTSMorV-D!JMTi?6jzGGTi*Ck#wY~L$F@Bz&wjAs{>YX_>bxXGsw0qsDvt)%({N3yX^r32|^7?!cwHAC5xE|EE=`mF3A_;Seda}F^XDeZ*D zl&%rgA_lumdkLYaPNE~E(qk|nxr{MCt~5md5S z;yihsWGM(O(Dl6@xxo&Q*Frq~Na5+XcSl-gdvJFMCDvMMQDzgC6#`6L#Q6h6dWa}h z=mqTv`j+?8{=5*e2`NSWyO``NEZnHllKB!;FxaOafXyx^psV83(2SSseyw@~Z4=nI zFXX6t7>AL00)&fah{-60hrMcv5yc;Q^A}u-94?r$)>EOyiqHHl31MnLK8sgk1)J1O z7%WrzJp9^KK_Cxc16R?+$d228recR2b5^JjX46ctsyr-)rA(Dw7Lss*MUc93-7d9$ z;l*HOQ_Wz8T5s)oLib&2lO6RL8Z{%dZY-RA7Fh}})-7QgW?_l=3cpcHP4abMK?PD{ffk(wQhCwFVC7>^ZVXt{{&X1fjRowfHlk-dmTMEz!-Yq4OYz*_Npj`rSnCHI<{}X} zd`KcaipC(aG(km?Pji6@jwCo)o?@0Xb2<%&b<|!iM%BQVj0&9H8Fw6b;uw8ZyRHx< zQHJwSGW!s~K==WK4#GD1zoY1PR4EC*O4whZ=nCmSQ=M_}@KI(1fg*a*BDvx#KYJo7 zs_H)7WxRRnO^A!HQ)U|uvUV@t`0#=&Wtx*cZ_v@=(t8?o7<%|E_QAOI{d>dumo!_E zI&^UHqAuNTSF)2;%64*=yW-K$MI$<%M8D<|3d*%J<$-m(>0TR5@s4^jHdtZDRr6;# z6Qhe0zMv$d6lD)5WaNP+x1QPUJggy{|f6283rpn^H+^?}k7c%TR$-#0Cf= zrEhiCljFGhutacZ2hn1ZCy6Y>lR}0aJP7L~RJ;e-=zd1F%L)$OjC03qH9PbfDoF3D ziD>n&d_yrN23L(2kxP5#*ls~)tT0Ed&JuttM@yCgZyHm8?$;GmqNRZLrHB;g1jc@E z(n&LFprzwZ^&@@_ype+xtAuH5LT9+q1b^*z?3^YO?a|6ZY>Zy0pAFILw@-yXtTwnO z-;(31G)`NtCibtbX(LQ=x!DsN$bg($F|H@XinKN&=AmJp6U(k=rPJVL&iyjtBxQUR zm@6ZijsKe!?RF)=)r=%A;fF=O)KS!cH%js!5X~k-#r%n5PfZ0+Jq`*M=Y3yW(qB3y?YDW z1ncxko`D$Co%rQoa4H*0B@7(XgQzwg0nVS)Noukxk<~g$evIUaQ1>flp8+@^&gQ$r z1-bYTU%i@8rn80X*OQ*!z@LDbT-h<1WV|c zGNv8bvTC#Sahv>YBOWt`?g$%ld1i3=L30HdEnsTh3&hg@nR>itb`M!^^XW9Z5p~gPw#J8ZUjWE{1?T||7XHUX7l_U#* z<8shT+g!eJOdPSkX zcE0H7E_GW}ofTk^);>~iH3PJBYNWrOB4n0anGHF~6MIG=^5j-nmT%gjKmo;8|2Sqr z5lJFP?3dyv`Xi3F?(Ik;zn{DF0CpxN_`j?nT#7yw@*H z`pA&PH)pczU@>!m2UBR*9{*Ybmc;o_wE9GL29K-h#3%%8n%HNj+2itNaLfwQ5j$r) z|9q64sDHDQ?-X@A_d@U?d*U$!q@SwWygj0o>t}t7B$CEjgNXHL1fbq{h6CBZ$wST= zH;H7FyQzN1K}H=#I48@9yt251)3yXf?U2Uo<&MHm&W*b%Fh!hgOwT&YFUj+BI6`h@ z9|nfI&;4=;%pKL{G^p{fb}vF@eaTkR_tanu#o1YNyBr`p>HH6Wp2uK3HlXy2CFo zF-EsOdev;bqgn}x93r}BLf0;8a^63KD$F}|$hEUK|G3HxEy{4gp&Y_{kKUXnYzHUS zKC}1?n+vvxPMJ`qj?%s}DKlbgg-{n*s=>Wl59uG)hm^=kou)~u8?4?Mqjbh8|7JuH@0Ew z76JD7KV!Dv04(GHZfJy;BjZzLuD3eVv`Fki4l}cc*n{*a4x=d`H)>4e`c*OUBL&bQ zwfu8GiZtvrpJD!8WC^{#gMmi}gLTk7j+Z(ehU^r-88_HRdQZm5B{v{C9k`%in;2wW!Q8a@Mw^se7-!(=E#PE~z&|mMxsb;g--VSfgf@)hHkeDCuE#_;!a6Spa7I=EaiH+BqY~+SWS?|;K z%!UuV`LR#Bvd1nMLj5V4(S0%2Epo!eRF(#j=@=9P+PbK*jZRb1U(PgO{EG^--A-Lg zly<$n&40)t?YdUk1D$yAK~ST&BwbSDMpt@12P>5&WSIH)rel@)3?#7=sU|RNk zi+_&;XL*hETeTdv95_+e_iAxiW+F$xHCg9yEFyUUjgd}q+nrYhMKQio1Ajh0mL1?8 zkDQJz&K?fh#MRXC@Np$^XQiB)2FB8NkI06zQsdTr z6M}G!oq}v)H!%owV0qO)WOL#{OoAzT{kwn`%)_ zX_v7(eBx%M$M88wWs>vDwf3TN^P<4lLI7f{D&=fSShf)<_uFt1envEV-eumMUuv~9 z9WEdHv-amXl(D}ihJJF@r?=maxB5DYEPd1{!=yvdjPUqBb?c7mY`=kuoy>sD#w~UtPSm$e{!-qARGBlhqlzbOH^9-DM z6a|l|Y41FlQMup3tyfZ=nd8nIxVq#P$~q$3*GFkm+ny$_qOLy2>booKpfX)h8h=aP zh1}2+IzE=&exl-3r0A!mbIUo4UCI66--J8K`Kc@`rx{eR4}aDVfxmb-2}hPEO8l>HAtnxM-X zH`rGc%63d%5U3)YB7zwBw=a|(5!V-KIkpXI2rGBy4eNjERp^mbL?=_BFTO^9PjZ0NYXNPyfan+l_Dg+f|5wmZu?kaeiEGl)<2c)BEewajM?l z&~IY{6Enhe&Nq66&(jiMfn({PUxH94^%tLatH%S);~0_=iBc(iE|mRns~BJ&b$>AT z-&fD~qZq|E7<{R6Mmswe6ZrxPZ%N1(Qmk|Cezw4yk9ASUSAG}Dzc#PWPk2b&*;-B+ zKS*>`a%@Q^q0S5*Vue2`Jg}a%&Bw5z|LtRf{Os;U*kG$}yBJ__8KC25G zdVHUq;l6VC^w7bi{SiFeIK)C&zZdKRjm4$j0Ym5!WLJrB#JzYAAtb)%9F`KjXjWEb?@(W=b z@`a`JQxAnHGS`OO-|IdxrN^g)Foh&+A&smXPoX8s05qY%;x;iqoTstY*dHij1~W?S z(v=N{1>bbjqFhpUKbrT?u&gjlS)b%V4Q$w?8nTN5K`pq*N5qksf+%@46OxFe14$et zjU7^eWEvU_iLZ!tz!#i9(uQY~Ec>(ABT5z#Ei{A{Ns9W+@{(IkJnO*`JwNzE5i~na zqws~yuV@sq*n(WE{UK`}oj#w@f_e2AJS#-*oj|C)`uPro9G(3?gv zgz#umxYCy+~1MiXP_~i^WZgZ5OWfpg*yH1$i)5q zev()^(?+ab%*>4y2u@mcL>B4dl@X6Iyu#6KNQa1k!MMyg{X$0t_@0xxO^$Sril$NZ zgB$*z82f9duz14UR^iAdBINVR3I)d4Nd}M3U4Z~b82SY(Y$<>-0+_Qq82eG&((bh* ze@#E5%-zOH!5#iF5kTQ_>HB@RK?t@#0J5b$0Ghlyg}@@2%VvcHqnHYTT_5PQyFY7_ z*HT9I2yS;i)yU~110*}~V>SgzvH52V%*k26N0cJCs?sE)(0*l?+)I@~ix@BI*Hj9j zH!{Hsbax$%Z;|H89M9KGKm#i!*$CrqfO*z&uU0`z_U)<0-(U zMjb8r^K7SIwCKKM(<4x6xBYqYP}<}32~IqF@21B>6$rZYhJ`Os00RE=E#)0VIRjNk zQ-_3-;!t-IQyn}<7HRU;QA7p zj)o!`j=LWe{0D&FQR(M2vsCn(L0N33jjHi|qer1ShV1FcU;b30p zhi|TGS3#A2q`)raf^bo?MV*Qgs+~gsVy6&sR8Sjjl82k*&(Fu=qEyO0T6)BUQ$ize zx3cOz(G<^kJ_5R=bvrvbWE}Z|K((vWGFS;7dj?I;N}6rCKxfl==>jA98b*q$%P^qP z*$*&Bf}|&8>d;=g7vT5wJwFHHZN-3qA%lTM-nQ0~ODWMIq(>G7)dT*@Wr{9VClq^X zU*R#3TIKpkTrwyD!TC}QB(gPu>=LezW%tuQlC>rk!_M!VxS=?Ad09J@r6{hv~= zx{#-dRFSPjcg2-4cm;*-qMG)wB6(Its){TL9psk3m`WDeC-bU{RIn0SO3^;M2xag^ zbQeOScF61&1{GqYbDR4(YAj2+;3(JbVToGdXjoZO2@h(@V=x1h$n#C_;Ly-%K-r}F zZxQcH+qLqnFvi*cSZKkhH|PxT^Q~188W>W&{AwVrAeNq^YA{LU*0$BkvoQ2^Vd;58 z=E#=3zIG=VvsO?AMlL(6mhBf#g#&nSFbNUB7K7|y2&j@9cz0`O?UWKo`{$UD4D^#l zrH~w(l@wWcMc|%HM*CK3Imp{cs^HOF^961f8#~sH9x9rgZfcnZARruf26zkcKEH$^ z?t;PzFbh1DkizKY9O2lZ4#<>m_rGQ_mpm99CjyA)1t=W258@HH*F*fYl0)ly161z#Kl-3G>(^jNYk6gkX1u5lIA)6Pg3o>S-=(*yf0dY_@k;{+Z zVxWxrE#f&UcvGB2e5O33k*19UBt zR`q!>)#b>%qy-Pfr?KQ@IT)M;y*PQnjZ!CLW-(D;6u)1;nE-WR{DlD!*`ReN&BgbG zcn7LQ!JEgpvU4&i#AZ~hI!_8HAM;R(bv7{xak*{XqGayHv(Rz40UUBfEJC?)H7u%n zcuxL|kTjsuJrHVd$Tl%(8#&1BBh)ykqtdsfT0LmVgc^5U=M7`n&bCJ1IVw#?5+XqM z>Nt1AB8Xk%^v*q88*nuPX2w5E!QEDT5r4zted?3RkMh>1dDgd?~70R^di|-P}JRy;a0@ zzY}m@+wbg@5|NuaGG?C{a#~+2eY9C6l{|Z$K&{p|f=_IOc3JtgggknFqJP7*1(rNd zLc3C$X~rC0*T9?VF=ui96rt=X@OT*4S{iiDFMVRX7UIRsy&=ZDKp$44iGdGXg*3xK zz2=0m){+-9r(->a17Jp9C2{ZgWV0GPX`*iYN>+u)-=Eb%cZv%W0v{J-$0n8P?w5vAJ2J?n2ct{G{j2!p@Avo4|c=F zKE(%`YMLC~W67o=e%)2h#Y#uXHO_6)6dUOcybdD9%jB{L9jC}@pt+g+jzvOHME-4C ze#UOkh{X8OsaAidoi95vN)M^^+}!_;DD+RaGo19tfV2~qa_ooJV(X6v+*fx>6FzwZ z4={1kna|JliaBe~7Ht*0-6FS|K!$qh0@Q|_ZJk-{40kMBO#f{NQVPhn{GTK4Zy#K(` z<8xazZwKb^SisvGb;B)^`cZpbyPL)SWd#V&f;hfm}p-9qrMf=(Hs38n5yaqAYmO z7Fc&1q+ZphmSItB^wt#fLzaHn%moyLy zpR`m{{HeGSJAYHxDxK)4gOAh=q30(w*t1)PNnMOo&4b)Mhz(w{9b^u5j27qt3^wb%6#%nuAF@a~vbSRua{mH`JVWYEIsaVJEtk zBa#tbruv&RL&^TP^t#~Y%h{_&TMr+r4lbk3PZ?E78N^MCAUJyAjbh6vWngm|y;&rN zJvJy)ScSD+39if25tj9auT`cQ$_;oavsbf}8lpSx6qvi~8h;AFseMOBHGs15PgwL3 zi~$~RYyvhqTV5PP7)o;4x-%8i^zShc*PhD6Y>H1W9s#S|yKHfeZKaw|+}(_b&~CrFa-aIl()m@1T~CvY^TM7UiyfbHJOl?b41!T;Elssejm<*^uUoL&!>9Y} zwl0haQ(GqA+JpJ2_$IF0B@^o%{Fbemo05i-aRu(w!z*$0laR+|XgiAEDk}U?GlvZm z56^J=9|8Bln-rvwd99o~6LiLDuBDyAUp4jSW+tiWohESGAzC_EI+nNQ&TB* z|CWW#JLoF1&VBw^9AA~CC~;3^*t<3{m=&xAQ1w$@K&0D#RD{xh39!B{6GHN;F`B5M zh1~j*LYWx-hlGQL>3^GW(Elp5{*zZ5=l>=gbA0s7JMj91!dN#@x0H^~Oy2Y;s~qA2 z*7)}y(tv$P&v~cvGyQG-#Cb7-z(ste4`RF)6lt-C;`apy?=5`a`B26btOxS8@*mtZ?ATZ_Uz1mReeuimAN}V ze*9Nh@}z~cth9MRAdv_;P|8_-T_GnYKuch+ojE_M5vCjw?a=+=Lkcrx`yl?beckI8 zsd=ICPVk@CCEWG&qXr z08?&AdmT!iZ-e>i#m`4YL*AojiK5Rr@|sFGg{;PUR@CBBV~ud)@je`BXnh50u@^Vz zb2x#TRd@CR4{^r8r760|@6*TIYYMW$8)_%Ea{J~*)$zf~nAVVqx$e+uWtnuncu%H2 zNP-znlZJ=q!@e`$pP|+jF+S}Q`Z*D}UnLdgeEnW)zi$sVh@qGId*y)P(yd*|u+bR~ zhdb?imHNd7ywqm(y2>}7w11jGS1OWa5ed!n)1&74sRNr{%uiesoicNWaObxqs)rAAf21sB>N}e12a!F_7qFgt3axyp}w{HH$R6&t7XkT&!QD(&d zn})hNpumJ-h_Mt1REA8&Bb)33Qm3ovOsCdp>S~D#YH)z{ZOKK|B!s9AhJ;Tm_?%}) zMzXfaw%3fVqbBF+vcoMz@^O@aOx=9kTNt=O?)Bs{@oQ~H*?Qc8%)CS2t9$GC`Fy_E z;r%QCaehbEIx-en1U&vw#_!V?t$uv0=MK!4V5MTS$nR8ia1^CT_v2))WARSItAY~* zo|@czN7V9vX_C%?Wz`f<8<|F)lz{~gVsBY~Q;_d32T>d|B!(eZc#FvQ zncm)C<|_l=BMW~+1-O6(nk+8CHB!EsfkCRJg)|2?yA8Ho4Rm#tBtIU?u9S%7X{l&c zVj9%lt8HBeIBDeQkmJYVvS?kMm9Z$UKBdGwh)uQFUnVI75J@19{5SRryo_5OT{C0U z!(9wO&O{5~vgW*F0RHD=pwxDg4ir&;cRG**Pz)>-?@rLl&KzxfGT?7{sp79R9#33V z_`Ma}anYIrm=Rc=irSlGqRfQhj2~v}G7?Q+J0xaJjpCT!jWeZ@@@sz5+LmDxqD&Cv z<%@gzjCERtXO)IDIv1C!YxX)Ly;eFZSjv<$YkbFLPWlg)zB_z3FCCU&Rz8+L9$;|K z&$p3|o@Klth^Fe_vmkIyPQ_FTQo4sW21H}J09RIkDA75lTb>{i(U3N1eh9oqX>lhl zfHhES>%a{xb6pT&8|E>wWzjI^S%g&X!hHIhNUcgHOfi;8ZqVcw2L(MRv#@R<*)!T#l3{TJnB7fTJ zYKyD|I!4NPQ87AFReuE|#e`h{iC(!dPXDH2Rsg`9G+4^1gWjzugt-l{R+ia8i178a zv_{tcBL8Xig-yMv8jt*aoyO>SQTH%4w3y}g_WbL`Om1394L>dY{YwDjTIdH^Tgo7w zJZe;!vHKXvhl~IVM12I-62vd8W5&nPeC?4M&!&#GYTVlnUeT?iSNjp5LE?$>yVgJz zgZ88(J`*;Ymm~e;c2h3xn{QUN=eGb}X0hN6?(U5H(Z6&uZ=E%h{YtzRJnOO&7+vZf zQl`Hy*D^yx!L>mWjt~A3=61n>y zh9L)|mEWD5Y(8LK+c*7W$1%I%hV!$N`{y(hNLrViDZH7O_$zoTpH@_|Yx`?^;xXqA z8)tl9D8ZHYpB}W6J@`+C^R!S*2+dadqe>NamD8AOvOEY12^rP{M$ASKv4XKDV+W(N zOQWNp>Yr(=nn10rZt1f=ysKbI(MP<2QV3?Ku_$Qn~ooe8>@~O*{k#_Nj+~?6PM+f5^fp0K+QbIDV4DNgxI8B5iy#G3mXPlZ@(3>=sb%WO=U?_Q1YrhfCZD@}>qwSU3x59ZOAt*Hfg1VEHYkEMq6WzZcsI zS!xATcEn-H-KWLOJI`OU6uPT?7nRax)8-2~HAhXfbIxXtf*D?b48abr9-E{g5&f+J z31$&Ewb#0~391)i+&|_gcF#}5cIaT9B^W6Uy%*uwYoVV-gQ=48c0{)+=%OFr8~|5C zlorG>V?PF78Fj&ND29h)C{Qo}yt2Pn-K!sKP4m^l=WZ~Q?YF)O^p)s-e&X(ko-9KW zv!P~E$)_fdYS>)b-Za&X`Az^~gv9KZ(Hdgwqv+UH6-AU2))}aA(<661EelX_WrRfW zdz#3AbTw{DLRjPsSLB*Y1ynBIaBC8AP`I z>*`HZZkW5OT`~+jr>(gbcXJ`|^mkALpUNy@bHu0?jx*>GggfZt=d?I2!p0gZE6SB3 zOR`tJXsat=aV`e0ZlXR+18-4`VgC1U*g$>nbc_c~XEe`I=Qjx;{`{@hj&?Qvh+R-Lpkn>df z3zB%qbWZGf2%jQWb>RAs)3D4%pJDMV(zKTm@?dEgeJV=+#t}a0Z`qb;^J(HOh=xyDck1JxeP~nAtJb zeU~#!JW;aDV9rim^EEa9sk(%fUB&9sfYM-%m`G8>G*qVQ(GBVFBnQpI`2|dmm-cPABP*ej|91s&hA%$Fvs3b$DZOdD{RwA zC-GPmXqy#WdXPmNb4Ea_ZmPc0zSy9*-GH6QIGmw&z{EVC9B*lVjOs2qZ2|gdULB?X z7JTyG7;}$Emcuju=nkAyL@E6x19J;4GEBz+_M7Ep>#g=L4_zK!6tW_g#yahU$oQyS zsrRL&vaK<}CF7CiRGZ*5xqI#j&hXs7-dEfm$6>QnN!VD>WI5Xw7%++m!R@UQGe7&K zzZhA{`Yj~VQBm1F275>=*jc(*+41n@Yx)Q_@v3|!teD9-&&A36jEnoG*R$Quv4UAPNTC?R~p39z9<&vy7T*&5XpxIwHc_LY|KPcZh z#McvWxhxuKKj*`5GG3^YAX6_cDap#%!&S$y&MLYsAH$9qI1E&QHzD3O`lIcRHb)gq z;kvP!Av9HL-%T2q6V!KJx+dFo1cz{_PV&4@;Ix&dDe|(Fb|TFU|6!93{6^q(JD#DE zzf4HyvkHO^K&(0$b8>ml^dO&)$>Zl&=9tY$82fGi>gS_ zY!opQUa0}qiYCz5kwS9$)+Y>z*~J}ZuW>%O=tbE^M1GQ4@uw^l5q~aW+D;u^&lIE#N)^4nfZlzxFcee$g4)8%bNZ)$NIh@L*pixQaJH}IPLp8l$_##2$HA(GAcM7fYwwq@8{OWBER=6IVSdzDZTOII zjmowBcm^*}(bMt9L(5{Av23)o8nj#uUVeVnDbhXmV)GPSB5>_~(-a`*-T~=8%OaQ> z2@6;H0jKuLyZE0cepc51_r$O4VQ)h4N6yev$=QbBk1PSh?;-z>sD-1GGXVz!y;PGgoxtAT5_$&wJ&`K2{<=1Q?p!;wI-tUG3ofJs+mqFjm7jALZ*4+9A#6M8aO+h zL8r`kkaY0$)YfBuYD!usMRy*SuTK0s(@U z5OC&nRfaqRCL4w-@>Gi`k3C9LPAsw{^IP`004W=$?_Tk`-N4BxMg2H#EIcCv=R$$g zyX1N(SbEc{;J7~H;ZXZM;P>zlz2HfznP`YM)Zut6*ps=uNke*j@MH{VIKl*$zcU1` zs)9^loW@PUvvKq2cv#BAb^mpaDj}4HJ_Md-Glz{BePuh%Ei^82M7iRSweDy3w;in0n!u*Xh3iWL1`!t z>msB@hPYRyiA3T9;VuRe5=dN%4Lgf6enOF<0ki4zDLxPb6DOuz^|CkOh`(}Z7SS~Z z&q>TE3QCxJ)Wu4uFz%+pydc3QS-#o8e8T8agzJv=BcNVn({#&&eI*jwdelYM>MJYi z(HlvErqSM+Yu2}MdRKZ>Kp+R9)gpp3feP({I@L4=g2sc+tV@}LMJRFZ!ZQ2;yP509 zsFQQL+ZR#wPW&2G3Uhh;tNMA6`x8(M!Adw8t3R!_am47A+2#GlS3Z}yOUaQp9Z{QU zve2!Osxm%#J9Y8zLa}4~(f;Ekc1v&D*(8;5iElJQZK`6zy-ZC$366QTE1-sX(yGiaa{7@_p#XW4`zP-zVOWe~Hp551r#+}N-w9*H0EaeWG zFKst%_b}|`32lQ$y|*Nlfj%0&dVW2S3Vi@7*aISB<<*slYUkQCr?Zy!awYsw>L1<5 zKomVyovo?}wxOM#pOhb;m+p(@Ogm5A6}AF2w|9H>I7Gpf>iMbT`ns&a4D z-^Dmn@xoD|-yB_JsUL`SsNJT$#4-gGqt;Hb-lEcQ(Ja3GrCesiYRBE42N^O55-PdMO3&oMk897jp=x)JE={`*Z>684dsc&x z3!k(p#5CkB@JaYG@LreOO(cGAtfp`UfC9OqkQG$GS!XO3%zW=GlsEX>FMzif?|z{^ zpA*IBUfx!wKHhPjI(XvMP{hl?Y@kC(1J08uh=urdj@36O|5pa_T-wYvQ$MC$JuD}* z0?;Zw7wV>G5_*XlP0PsJ%?t_qtbkcOO3WfwZ7zLzuMGDl4V0A&z$vv?@2u^EUFO%1 zU5(opNZFgbX9x$u#!^LW_Rw9~qGi!YdKZe1$hixFI4>UxDMh?|Etr#h>{M*KIa;`R zhard77z*@}IM$ee#6Cgixl{_^BKQSiCa!PvBiFT~E@>eYCxS^5QnXrx803|?V6j0#Ns1TiW7}os zEdaCO!`FJHFl$oNh*ajwWa>#(5k!X{?I6*jh)!UVu0xQ%v#QBJC0b|_`djt+`))|c zNaGd#@wWc2RG@S6U8lz7A)Kh~T7s}k=G&T=M>RPJiS^YLmkd=bo}D*jy9@(6(IPT7(O z<6J4JdV0s5z(cutAGh(ryNmPo3Amv%lTCYuQte3;A{CAep(>E9lfHAuFX&jH=Bna) z+s+Iq{pIA#-y0lz=mc!!L_~SLB)v+TMu!T0_#70ifl#DG87b1{+NIbma$l%{N{-^d z*~TMrU8ap@dCF0vwg&8%m>yr|4)+`->1h9n=O4pRXM)O9T7A3z*;57?SzK+V<+J6L zIpoS=DSn3rCX+`9W)_G8=@7qb;|AN{sor>-@5Z%dm6_ zDxt~=FY$zzd4mv&Ef|khM*=E0sYU*DcB-EcSd^TZyOyqm&x`6PVNQOK|C@Kv?zy1g&5s zfqmseEY+&Ds#UudiAC8HrKH|P^yf7#1+JBfju3orl&`!h@W+eooeyp0{L@T~%QLs| z$YT3u&J_nv4&y6eCf(2|;Bk(FXnUwL6_}_H4mWPj3(nj)MbtrDPNAS7LM`UH!FYq5 zMOOSO=VCeN7(!W2v1BDIDeAD$pX61#+*Q&1r)Vfg_q_P{oxjV|t!^m-Af0Xf2_?ac zSX=KX0QzhOk7(~%j^riFtOK_~>xq-rL#;X2VuH!$fT3XX1ZRrysm2{qr1io6P-pQ{ zBZ)U&-6Fhbl?SgeJHm9~x-G#$Y}RygAkRiGaCqB{3ck!ug_?wmllN_GsmpNoF+6%n zY`o=Oy2tP;M~}e>$f(~vTIm(lP6XhOxA`A^Kn-DrK5pFhl6Nf6D~DsDcjgo(b`!Oe zY#l+W0+07<^tp^ZZs@EqkqV@2pF@JFkc7OzHK4iHY+9mzA+0GY#`%l3%;Y1Q;JRCt zIa{`^8RWDPyc*&1!@-z!^i<+qMD;B|Rc z7*(gER7JtaPdJ4uEA<1?$L=zagPUY#&sD9Mr;cY>0==P}vd>V*t8$Ro8w@tRE4d?s8Mg8?~ zAv9DEf3SCtj{#%CT0YPz#G*Ll&kml?CnWDH_~$3UpR(Q1pOUH_uq#jqKR#c~@8??w zngMV~Mv}z!tfW5hF(8QaF!}!jVvFkoH$S~K_{&yArruZNW)^`?F!y-G=lhHCDY)EC zchXGTdzcYvJ&N**t4??DeEqa}y`w!*bgI$2kBz@|3Sx$ynYl&g3p68USA+7wo83{aMT*kyJ z$|HaHzAK&K+g!Z6;hTy6y2|dE+Qp`jdfymdx#eI2``+VD<&u1JRut&1EAqQXZMX}p zA{ajwkd;JoR5NmT%-Kz#-0Be*suh>gUyQ1#Ky0EeA7_AfS*$Cvsh~t?lKUtELrS)h z9hj!1@D*j*D;6r6&|#K*Q{EsAG!6;vHsD;GFWg;>E6ek2c1wbh4&-%Fl>F;WgG>MC zEAgC3(&D@@$@KS91Tr;YenU_US^T?&q0Nwb#FRorPCfTs4VK!K1Ofp@){{!EMK`F%1=%VpQ5=;Y$lef(GU0ln zq-$|B+@0FlKpQ*+O%omvw5sM-44R6NI~c2ST_5YN=qa#;Akk|!e_7={;q{}En`iF1 z-~Ijx5ic^9vr&-q!sDN2>l3-@`e$i%(lzv*2brNp~j@M=g(5wJZ zi@CZ{c_)5>+wkm(#o=?~WfGs-z-kzO;7U5rDzz{;#BAdqMG5~!VZ0Mhq$NfbWeORZ zEspz`#O3g3yIGR7g&s1^hk15Uhkj1uxOFwMWlR1k{WuVF!X+nOh4KCoM?~DB*3kBf z!kl5>2FxY(w_DP zCwUJ9I{!~UfkotCkH(aVa(q@2 z$dv@%NXDD0JC!vja|Pf+N5dq7j1RPK35($ zmWZ1NJ@x=v2QBWQ9P;nf$=p(eR4A|E?ShVJ*ylud9Qy*&PLa$sW95DYEg~3gG0teL zr(V&i71Tjd-5aT?Ff?lK#|2W*#h7{5A`>ehp3`Nv`Kon2i)uXqYJ~kErZvp$6sqdbzCRAF#cLVy8v@EOG@!7nwRx0n zB}{b&uK96`Ok8l{1Tm%N==iG|os2RXi>dK{iRpBc`hHb%^h)KsPY)UkErFU71!(VW zJYj)a692IrBifE*9eZ_V0e|Se|X9TI!OM1^m&Yca+q|Kxm9TIiXlo$u5M?vy? zG1;w0Uhol;)v4eHCJo#)7i#4%XeXePQcf@=Cwz9lO3q4yCoL}nigH& z&74zx73X3?5Hq)ON zQQuGcjRr(2YPj)-RX^|u`sPAP4 zVZdL}6Pa8s(%={nRg6gNRf&1NSMF{umkbSn+9a3^R6BfIZ`B7LOGg9MEB;Enolm_; z^%loq^RsqB&7!t879Aw7wt>%kL@%gej~Ae-r<>*^EK;?AM74!P3$XVw@eI_mg;g0KygxuKyM2E8fe7`^F_k7~MTfDw&Pi5Fl2b%g!#-=!s zHvtby#xl4{Qf>jfS9ZlQNCC)JbOpughlH|dJ83$8A|=8!ih)TX&BY;re5w|upir?% z7Kl(Cr~dL;m5N3!Qx*<^$MV<@jlHmU!(%BuA7nK5t9{|%`QhR5Z@Sww>0Nk1DT|ip za{C8*)r#MA@}_87zrT(*&#D8J;G+6rz?rPwQZ+0M;4qSH5Q7?C7zirvN=PrIL*m=3 zE#9^SzL^WiIDL@=&`#1AO)Ps4xdfv5*=Q$l9VmG39QuBKSflO{VQ{c;(stzuA(r$4 z_#SP@0j#oDAycUQ#t$MaGX(w44S-U)1LFcA^}rhN6ufHlrV1Jzpr!k&gzb_+=J@^` z$ZVPb5%#GEhU0XRaHXZ@3w4aqL25WBiAY8RCbLvXBW71boBEOyINuCU3P>;!*8t@k z5F7K0d?2lx%L^#X$hf1sLjXiuebzPY{)6f~n|2^^!BdtROkn`Ec~^*j=Mi41OF-~x zP~Tw624RFF-k4!D0bsu1DyPyg(S)w=xZfD+; z8(;RuP5E~uG`HhK*tzW6zyYk#S!^nmG%dRh!j|GE9@XCNg`7Qsz*IvctPT;gcPI$y z5W-4LNN+T~zL26`gWOkg0iL1uHWn( z|K2>;?~1*!c$Hn!`8!Klkrmn2f+1)ZzFaNumVB5P>|7!50B^C2u3w|R?{1G$8;7MO>+cxS21_-jDE1JJP`?69&(tZU%Q=Xn5Dzlgz#|ImJmG@->hHnm3lD zq*$h>E(Wv&&eCw$b6eT!=5eK;#UGg@uD!dLK(?E|8}x^HYsw65a5d}QnO%g|b9o$7 zj=^iV5H?;bb%5!}0<=5VX7L3u2a#&zGwPjHT8-9YOH}`x6O^O?CcLv?y;qi>F8OvApgPiHdP*N zE)_UE0K&(IC|xQ|C%%45JQ0F-E?xY0d&#o;7gbw%lJPm~51=#S4bYj9MGo~(O=b#K zsLO8|MKRzq5{F;2VJ$S8R8*UR&`WT1fbHecJpmT$ZdQZ*DzHq6K4p4j#GcXIh4<>i zOz2OQmj;l35+eWn+{~@vRF5AZ^{YMks~TUFi?=z<$B=WLTUUL9-LxaY@Gyb}r<3J{ zlR)>9Zp@?vt)?^PSI(*5JJX9rn!?oB;;G-j0B7FywzIEbD|3P|K#~S1}KRJuokj+%x@=;&IDQAjH5JAGB&89R^Se4G?kJ_sWFGfqidr_ z$IE^@=G-=dJ46evP8Rpv*lZT$z$Gt9+P|0-OZxRfQIK4$1C70@sZ%;gVi8Y17BKI3 zKlv`oIl(`!w1n`oz<9QgDtuPmY{60NlWCk|8IZBpeB-CL;;q(*P!DdIs+^#VR5`Z! z-Zg|gruFBOpmEIVu8{P8KxNVJBvHlJ&IE#f4w}Bx{z2^Ya@kyZbCNRZmQWosv|To6 z?uktHq*TeaE<)CwY%9|;n!@8L*PB(9e{AfNvsYc{YG)t1g-MrL23@Mqxsx)vV;gay zMvgl#fP>i#9kI5y4goE$=CJv zq7!M>AMzQ`(vMA{sRsu4oEF)G&6F%A`N9aqbtIn-aS>&@eKrQ!iL=nvOLKKm%%^oA z6f_lJh+SMGIkCyd4;JPJJhnTWv*yRk6}`AP0h?II+;+n&EeJ@?B;cK8Bk2s&_*4*e zk;={}!WXcds4b4icq8PVh6;MIN7uU1>7An6_iD5-L?U5Nl%@(Uv-30OmrpS!LpDh$ z&t+ymjxr${xm9oe`ZvgznY7bGQv8!qOnU43L!&?Pqxi>VD|PH8~uxIOSp(?qxNv%7s%Pcol&qi zuQLEVh0+b=lq!cD6HzKT9w^?o$lXlAi4IjiUm2u+qJ*!-3EtSt{KM0gCLKE=o*KPW zJz3&@aH`AR`1fvFutw3_;-)LbiC1#_8X*mV3{Uud2G0Kw+x#iWNvMxdv&1R4#SmCt&`s203FW> ztIxkrb?$8bc9rX#QO_Y!pkM9z-a79R^GPiFfMP)Y4v1I>OoAakThQP;Zd$lHl<4BnXhdRJS&~+3PouM{K=wc3 zOT?Un$Jw=;QtiUsHSw9nw&EHTbDF4d`nPfDi4xdLdo% zcf9}F%;o=ny}dpJhWtXdMM$3G7lpdmUpx)n1y9?656r}$3c{of`GIX&52BbsUTx`p8jZ;Wf|(>03Cb_vxM9ni3UaV>$4C?BqP2lxn&QdsG_%COSAe{} z{L3OURP4F5QtvZHHGjD`B=q;y{8Br22{#R9q<|EUvu8=dg6#LtZ=dAx-^aAC@4HU3 z2MN$1($OtOIs68fr76;0ep~;7k`+<0LU+C@6_gf;$1%M???~!hWvM*gKa`%~;f3-a zg)(wyiq_o&TK5JMKB7Z2>$HC#Mx=NEv5-JFp|?N1p%r?2V6mXwx0m6wb>tN!On&v# z8MydJ`@(~*ULOz;cPM!VghJMkjifQT!}>9a>!(w`IHk(<&4Hk@w8b~PLbHO(VrL~< zU0A!zva@t|n(x7bYc3}XzB;``muWLj?jPptL$jeH$%iZ<+hhxMj^hZbWC0Vh@5Nam z?v^2;Sbd$0-gl-hP}kaMF!()?4uj1DMYuW8Lv1o^m?UA?IYF%Vb!OQlVv#_QH+5o3 znToYMGB?>b%e2RwLiBqdPTwCh<;r`UL8;0w<|+_eogjGmWA-)s2n9IzBLg&oh)h@y zalw*>h=wF^LPa(Z__#fW3in$HU5F4?a5kg`VmLJIq)Gt^B-ShkeVItgEmLs@30T9s zeR;tFsFukQdBBDMs!_mU^obaf)gY1ECA$tPXXMGKL}bas?nOCQIEQ2U;Y~ildp3}= z23{E9l5Jfyka#~~|Z#mp}YD~#&Aq_!6|CBZgYQ(1MeAfFlvw?VXV zmVCHEhIsh|@AD#QS@cYVmw}3BcMDPnpIo`s$XfhoFK-gGr|;9Sl-lusoaj-WnfP~I`R!Q<^@6w zbUJC?3WOLPhsA{&1GrNQEvnvQdMhDwhEd^gTlDi>S1fA=Djm^cC0ias%CvjbFx)AC zN#WI)?9P;tGVQ54+(mY6QvrZygTdus3!8ZMpTsS-KTFFKXo5!9eTKT;1MD5vKeuSD z!C%B08W;pK!W>g2WV5#A#ehXd&*^}Qp|?{M+1!h<;2v^Ti2;EKlSyIfRYt)1!HP3z zv1(F<>sOF0r=pvhw-+pW&4DH&4DSrZgxWCF6&Z?9im|q-W?GmwcHX2_v&!^xThjXa2uQ`@zk7nLfo~0P@DF?=aX*EGZ*Ksg{GtYwTW2LSgAE zZG#l=<M<>JSK>9Tm_Owbu3HkBP{D|AkvzGsz|)|4hfN}G z$7iG^82Ih3{{XOZ%=v#Yptx(8qAB7;%7c)fOk_*ofzkzVz`>c&1ahPMBuYyF59G^)#KK38 z;2Z=kFA(&L$3X$g2?%4%G5w|mPOiDH`;L&;fC$oe#Xks837R4UKOdQSUdg?DaI!dn zEzBx?@Hpy-%Z%J-cky>tz0Cy#2|3s7P3qxi)2G^?OAr^Wh4B&fv#74 zA7W9XzmY=2M`MDL?&6lxrFrU>JO+oa=3y=V`E z%GD5}6eYw?u7YgG>Yi7ES|JBECSZ=N5cy?>7=_hLxhgQG1B=&A8N<54>pckAh{qIs z@Qj%KDe@P?cv0h~%Sg`#M#SExD;ZuGwcEghcw6GMA|qexgpASTO%&oC-3UYJfxhMux+sD#Vpta7SY+?!?#bZsFx zB#+g;{}#<>+2R_bF+Meswt1mgYQ<(XHOCwbdd8Ik-#Z#3oOo=$!bvkezn+g&OA*~; zb@_F%wWbwk8O7qDmYv4wLn0Uy!ZE^wIM1QILcGA9dVV68{c^c)JunMFTNjNkE7ESpXl`pBK zHMknqOmx6+*URIcXeFaK1=sXBP)bC&X5*0f|GgyI#;X#x z$}?~Ry0}G|gcX!2KJ;7fcSHYxSlV*6qx`)uLS8(NMT%z@jiGrbJeS{h8*6ZFS_IVq@M6i;pUh+$wou#Fc&oHKVLwKOyA z0gEC043=pXPm!>0tR$44IIPMQi{2u4k|qt$Uy|FU0h~zk#$c1>+vd8#z<$O0EwtA@#$?kL)m1TFSL73r*P?o>G^&%N+J$VstmXJ{uB$LG@p7$qKTUYhoP^cmKP>ZjgEGT4{ z#iviqaIuQA2%|Q=u=}5o6j#n6p55DJ73Nfi^iGru2%g<&A)nh+cjFC6IJSK@H3>g9tS+o2hCVfriW`^Sx!p*SeJ$#*=t=c`pME0*CfE)WsCBqR4O?)@Y3pkR%JY z(j!bOB>@Sy(nLH>qGyd`cEQGr(qmqXu>?0;Gq{vwZFx?J3KW_6be9Zj#a7pFRpvZx zIQ3EOL^y6R5B24`(Gf-oOQFUOspksXqJ&zIMd6Y>+}fmnSsOT}2SMR&#gD}pMW0uu zvHdJ6F=Q(VXEnv8)L;`?B7p_}cHPRQSok<;V(0Mvh{wM3bCfnT-tp30V4VXz+hd>D zb#?h-UA&dan2h5|#p9T$v&`FVg{-X*X5>g|$PPHtLJU@V%IRh}Ewn@*zty!8~;)lA{Xy}}G4D#IoyRL)Sz(1EQM^cB#3#E^ zIJ&o-<9+3?K7{>sx{s=uXE;T&Y|vhv;0S-5jojhzFV80^=F#A9tQ z2G9Jw(kQ}0=h5r%@ktkQ*N-`u9JVzO1J7pbW?Oep!=14?p`cO`BznF~O%|<3d4xp_ zClRhtnucno$O^O2?qfuG>0kB390{|mw)%{?`k7ZdAD-@+G70A_Ir8c`*?%AS{&8%^ zS3XRu*7*|`LKd=81?bVcgI51y%sS^pMd0K)-mJ&qoe6ZAI*y3~s?`Vo5zpq{WPIVP8`RV1Kl*hBLRlzft#bps zw9NKGe@3mE%QK(C$_QK6om{wBMY*F7NAVS>=JEOHcN-M>^o}vg{DI%&zU+MVxI|Rz zLAy@w0cXs*LcRfF7medN2><{!17Fm?mr9KzR)F8SkV7X>o>tj>3z60xP!&GZtZ7>| z6~47xvHj+=D&9#dUWyFCl(2`w(TnGl*veh($Gk*0P}rWwrD5Lb)L_?{+Trlqw<*b@ zbGFi7upJ{L{~#3>OD}xgeh-hW)lic#Y`NjZ&XJ3n71fxAE5 z@>6T^bNG3?Jd-aE!WMNVCrk11Fm&?JT@*9S$>~NY20(S*yxyLrrGg7ov|i1nezBg> z`1&OnUf8b^ubaNTMV@(C-flnJrM<5sM>@tbi~~nX#{OYaLpGn>h($w+rdPp87c|NH znfH^vdv_c7;49G;SvAx7`F?}x$G-Tq+TzEgSyaSqQnySAqXQ7tf*z1dtk zU(eUIg}NAESW%c(b&EM@a=0)V2?*&RRBZD+idK80cL*t@!fmMs7>Wvu51GDfDcu46 z{OyvXOc3^b`Vx9e&FRUK{{%ASsYOzfAzZwt=1~();y5 z;G5|^kRkBnpdD2yZGgSnbHeboM*0t2R0xPWmuE%m)#RCeD z8j3#MC{cwQ1Pf?ek!8I47{6qcp@s(qQrP^t6`BgSI0f2nC`@D>$<$k;h1L$-zv&r6 zXu!jz0aX>I+1F02bWZS^v9swpJp;-UU=FqQp?a>9wOBk8LFUQdKAZ@V+;t2<5dp}R zukIQsShjzmv98PKNtnhj%YTQcRzar26%(FX-MCeCvehY?=0K5D^>`_m75iD2pQawM zZ%J&J$3`m9LagBLkc{#peqjsdfRE8ZY{|n6%+lpOH6@WDbw!Ofr=376q*^vs9C>`= z`qtXcqMcLW)~oi&bUrflu#P03=Ehs|#|;L=uT9RF4}Z+0P<$?kb2_ z)EK-bee|b<{mYH@Kn2zFmM|VPx91$k?l-VKxCJ<{43|Yx*wRdIK{`8UtL&&tOVY0( z*oLObV2;}h#;Xs_;c1_QY@neYUtflX;^9b_Oe>KQ;QUXzBa}>)hzQ64%0SX;?v&*E zFAlwb8Z)$O*?3|`L8^fAHjpVD&b*6I`GQ&PBz%=#qnvIVaa{nZtmLFX*v8u8pJGx) z>vlEp0^YEyuHx#x>jj;JDRpD<4Z5OO42u=Sj)PbHMLwpzCO8tXv@^$CQ-AY04xtLr zQyH;B!ZtxB3vXTQam&C9easFTN;YksPh#9V-6=dmYh2#_#UPtJ+Di1UT(KmYF?68mptgzIt&E;=cR>D-SG=B;o{mnr{bHPBbjgwYJiN zFzN_fA4)r$a+AbD9fAvsay*R%Spthi)J6IMmAb69sr(Qz+_aoG+Q$_<^C-U(7~6Br zo|u#riR|qomQWFH^X&~ip>D;YJIFh1Ya4J6Az3QA&E+szDr$L)?p;z2;HgzhVe$0& zAa2&p#m?>ko*8lNJnlMHpbet;zCZ0AS{Maoox95yR5gQk@Q>FwBtmv2soFRT^Ld-Z zPl#oQ^P1kC(HRP(&Aorc@@w2S%RVyRH_>B4s1td;a0%7Hj1wo2tvQyUWDt+nB7%KQ zbz37l`P5@_`%OnKQoNqQ7b@(d3YRWM=JC&LexZz&M7V~mV@asjgECdT3E2KPSYNjf zal)kY0rd1BNfcMCZ&Meh(otliR9IHD_pgqL#wawc$18 z+bK1vqkERII^cUyW@~%*xgpfYAoF5$Lv0Ngtp|56SXI&cwI;9zSyXv@#qBqyNLOAJ zS=!5gQkLG-7Er!YvinMc(;;>UF*ZpL5iyt@j`w(?H05BlHHNwhn8^@jquz`;rYB!B z#I!XpyDUGPt2?O<37#Iy+HF(2#P&qReIKv9>4qW=hbX*b`GG@X>s+60a9g zt4P2WVjS#T7~O*WR3G2jntIO}fce86+ArePx$r}Y{R$OTpDmqVN}4Uq!L~J4Uz41)`i1E z*w>%bh+;$13FzN!+{?^aolV^_Ex(Ufjg#&vqE93V_eH)Vs~1WzE@C(l*W-O4@DrH; z^v=?S*HrKgn;Z}8T~KKmO4*TLWZmc`w@Dn(JoG5Sii(z{z_xzBmeMPs^6HBskEm)N z!|O*a!+MUKKy3FFqPq_)XBIix} z^}2f~s^alN#a-o2_MIt@JXTi=4q@8ctLRq>904SH#&Ur533i;NN3pgq0wlwcaZ{49 zy%6kNoqb^Jtee-upXjov6$iVIObm41t!>W#Fn%u17x7N#ri%HQHuvY=Q0*MfhBA=R zQS*{R-wWGNkAlo_Ww`t8tPg)6HmJ|1@eVAfW+0bL8(RMHTpg{G1Dkw6n4x?vkR6e^ zjnHW@Fl}(IB#`Syq`SHP1>->>{y@vGCQTJVIn#RnsLdS5+_mS$_WHWCIbzhPr9nQe zc7BZaU#2F_J~=UNvVJ7F|8o&0u$mA3R-jorTXDoI4F}beut!fajO=RT?G_Gb90L%; zEyi9d1%YtlEq7;4K7=@Kbq9&Y>?86ZFc!C;atC%pq}w*^u>0TB#fVRSHg)|xaK&Nt z6-aukwbYvQf%m7dn~pk1z2W?1eN1?Mt%5eAy}-)|Sw&)Fte;#hkAlv*K-z)0nLkp> z0mHM3VECMt#Q$UIfG9-x)0$?nFrs|HOz3E`YrDbfxd<0B2fj(_bLi;A6$@ZIa$Y!B0$>GD7aaM$rrC!khde$c)G$%CJZihXpC`RBF~6zd zQg0swVdK0Zhn%k}Lgj9X9a-Iga7BXbz*(v&=g4iQ>nD>reNoNz!kKGoOm-TzM4rWx zk*J<&({R${L|Es^bZ5_G>po}QZ84K|#`4IhumfC-sK7Sg$q73F=B3)2v_fL0l!-D> zk#3aRd5B2{(0*E%QE&mILWMBOaxWRN9dW!i*VE8hxkF!(gWV|LDmg(f?Q(>33BNe# z*~bjj#l;o($7Tab3xRYhgcr=hSWVn-qH~q~KubgX^cj~;cepd5TTe$<=K#)3Ky7ibov`8zR zP!lM~ld$|tTHslZ`exc#C>|@>vP_=Uls;yeZLNoPpKDD<{mXX09BEqeD_sAxt1zrU zbF9=)ximNAb4r~=PCO#jWGH%a%&|z}u^X7Wu2MD~EzdSq0j;fJ)oS5}D-LsDWB5sx zt@#(muErhS<q9W#btbhaq91x&I_l0Cjh6W-}9H~Rvqx`|fwRsP^c)(a z38NF%?;&EEk1Bw#?#lI0;V4sgbvO_PZ*M>xukT2Gw+MR$0Q5a;`u;2BcY)ce)yF4^=~u=k;rG!E|0#To}0*jQne(((f;| z(oXtVbFs@|Jq0uA@J5!*?kN*SLYtz?H;+uDu{2cUj+T;5!vfW8{k}B&DNv<{K9;lj zdC58u7p_|fFxD6)`Br(thvkgm6=Z(3dj`)XhR3`*fKg%;OeeGZiEQeVpa3#p8`&S( z_3d+kSUR?&LB_>N4x$`&$|(2kAe-<%*d9i`Vwq~ zlW#Tt1yN5--^e0J$>p@EsoLbk-?-SRzE!)D0_vVwsNpowcfngtFQAHecyB7eV%6*U z&fG+2x{DiemENKS&fWZ_qGvgLs6tI0wECZk| zZdsDTw7|_WmdUC#R$yKgQ<)N!aR)VpaZ<#@D8X1KWTyBp6LAR#|ME>$TX;UuR6zsV zfNb)L8vYXDwQnOSxIktP;5^>DIxIyR8zgIw_*^4~^tbB9Ri0@7C`7aBHKMLnGx@didtpC!sy1t6z{R11}mkit{Zio}+-aq*E<+ z#nvG6bK0T6!Vw;OY6{!Y814{?7Wm2OYcxC7? zj9Sc!JW`NS4SnH?MoBO}D)$uid3O}`bx#!aP0tj_Z#n^2KWaRWzqg<(lumGz(!Fw~ zZ__iIaZ0!r`JLRj-Nv&rG)HB?xEQ&n3@;54X#YF>Eel!I)2;t7szmyMY6M9M)FCo% zhXgSEn>rNuluiXw;p~DD-1S}z+eLGLkUY-SmMT_{=g?|Jt0K}FnKnH3J|Re*l!IJ9;vWtL$i-M02ub05wqhBuges5!8HTM9Cm`CrrsO$H6PCM-AlUV-mXiH#2|KzVX1v{kU8^q&L)6Xn=(^$> zKz=Rve81p^;*epSnZB!-*G8>fa)Yr2@6T&p^f$jG#CWvhwvp${8aBXsxPs10@aFL} zledG0_xiI*r#FQ?vBjtm&o`T^p`~y_%nm2}_5&Eg`6Trpx(UbsH7mr*!2X|A09XG% z{vhP!0}vweGNuX4F#=^91|JC21x^iNH1yLa;)bZx)59#IS}};VYXcWf(**ru+UV&8 zpZ_x%*XQlaAJ2z#ZV(+ zpor7!{qy!v{&tvu@06ZFfW!0E?(BWt6+CPL*N6A>YTrBk=k0LtgUfq*=Kkt@{ zgAq{r<&}=+@_iqZS$BPeArjFb{(`{A(s1YJFgvarh_#Sxf2%Oc58z&PAu-r6t8c$L z`^&n&=S$8MLpV;=4D8eXfQjghqG4p1qYGyFB0y4v-ZgC&;>9ooNnR6vx%kQP;|R@$ z0!RZg>|XW~$|)Z*Zhwc!y1jny_I`ez%KQES5&ORG9BI~eTbR8oBvf*wG@#rsBwm6X zfscYP{IZiG@mev}uy}QLi(>#{`*mUZ5n(bWaIvUB2}J{AjrB z`d_7LnZ4ix2;rUa5A5-b_&)N#I$c8*e!IK9zTMt_qb3S7t{XyYF*yLsWsmyb!+*c| zlcpisetj&Snk^x^NdZsdMB9s8^yz69ak?Riv!Yp)yIyCRXw6XonV>&u5m`o+*#yu4 zw>L51k$J|hAmQ(88@G(LWuvaBN2rYp(?WzcLu>-OH(X?(dI zO}vR4{&Rq7GJhwln9BRky3y8>Z;MsWf6K>|2GV)`0XS8XJoQC=<9!(pEl)ZSkSsWZ zt&Ik@jZb-AYzX?8%XyS^qrt?FH-)Vwg86Zm`vGyI(uARk$-f=k_bgeISNh1-IG#eZ zaQ=m;xWti3zZwKERM*7+D2s~u^F^(fjMaoNE~(7JiJ&yLrb|h=WA1?hexjb(Xz`Ia zjm&d8fx$pp?%(-mnv+hZ%Dlyj%XWL0nX}Pj8)-5n0J%;;YRJb=1RmXnFMg(`)vK;= zzB#1qj`gRg+#hF2o`z8@fgaW7Z&fDsON_$ zD+6|`@@!h=NM>b;7rRvrnV~(+!d_R^ejZfyNg}vhh@M-T^7~XD&@s(sVU<3ADpU(Q zAHcHpA4!rhFz1db&K#M)#Y(bC!0Ht+6S=(MjzCK5Nn`+hq=o^~EHH8AWeJ$pZ&`ny z>>aUiYE9%yZ<)(oYl)9vkil1?n|> zy}G35CWpH_nLU5|ipCcAnr{&eN>)tjrUSO7yw}FKuwfgIZQF~VAm<)AEl>y_ruNU8?o>yj5a6dCs_+Z7_ZRv5lQ8?BnUy3sz&wfVo8xgcxn ziwVz#;^i_Ur;V+U0AlIK5SPej2)EEeUc@`l8EX*?~`6I4Km)QCf6U2pl3#t zBQOLo#~|?`yU`3uiv}8Wi=x}iE1kW`Xl6RQ9T$^H!?kfH(MQbPQR6BL!diK1!7EdZ zKPw8A(hV`81oF1JjifFG^Rg^V0b;b|5#b;6WuSp!4WLAzL%+cd6H3IZp)4y9Ijj4d zMt^Mt4kKV#;GoIQV<-yZaM67>UxpjH2`GTXwL47!|9`Iuw~!xvuWnw*XyTVd1j?L$ zLv^DdtE8Y01_78mB}haOfL}|F2k+syZ~c<5{98lLsyc`Ig3Mf)n2uz5i2J>=CwtMa ztk*jcn}~7eg?0slO1toi`;reG^+F=UH|Wp5!4{3gMY}*FiCq*$Y8|XSJa!1j!xl*| z=dy52G(FKyp-;5q=3_~TtE^2>cMYNZRbTj8q1p26rk?N4g06lyKS;2E7L5B0vR}XR z7isVw;fI zE+#OdYiIM9hU5}f5X{y_{k0&%*J)7XwzN^^;xc;jj`%vY+p8AE#}69Lth+U3Bj^vj1PvjMPYC)OAKNKDPCzJ$vJt3auuqb#> zJv4{}FV~rLdI$06ESj>3Dxt;%XOw*Em;fkTS4bKo$0){>l+TxT<+ zbq8_fR&4^d-Jw~Y>=PRupfZlof(vrS8zI`oHzp=>{M@@XsDidd#AtRF_ z6Iy9XL6_9IPs?~s%Y2^DQ|TtBL$HA(?uqGAq&vRkboYvw8S%f|>lQbrhij7H#LJ}p zuCPnw5{L6g8FsB(~a7w2EA*R^VX_RC*SgNgrg=y0x98U2n zriwvQ)sl*?QC#+vvG!mU42r8QN`Yv0l@LV6AOD*?*xc)#mJakuXfJsoyZpJH8DXGJ zb_%?#Xz91hJ~3%7!ht@DmGS3IE!O&EN1PJGGgR{cI)4N57dLC`4%xgNlHeX z5OGn1CTRc#YDC6(v9VmR)@^*%h%T#yWeLIkn4t24E?XkADaS!CJ84Y6OCHhXD>BvV zXt&m3k2l9}5v^eas8$HRy1OqZPu+KjJP=7Sx5c=Gv-Zd5$k4svuJ}ExX*u3ZiE?Er zwNWUtq({db;Jg`T?w270Opt;+8Ew)$FQwlh6%N$NQdG`cv=zir*MvGr8Tbr6?c~dA z`mR^c!N9jc&W8tzUeDEMIzZ!kqsc?6M4?R#J?$_~30Z9c^OyLcb+VoAoGUPjLOMnw zEeqY<$B2r|McZA@nU~44aoCi97+ZB*+Xlp>oy%8?0vW+m_Mx<6ka-`bozot0KtphzPETPiTsR-&3qw^i+>-EM` zpSkL5r-M~uqctZ|g=+Tizr89blvlB1eKC)tY6FzF#LxV>Y+Bgbx&-4ed>X7$7BK~) zcTS#lSeqMx%WEOhZys%DI;?UZ(OGi62lk;#f48t9h$x4scGM>nV}XJurlw)`Q~f zFwbpUpMw~O(i3h%V#esk-(&xU@J5Ng*B*PS64lM!IM-C&7;}~?H)l#H-#V%K={pWM zP)rgU-zYJ1D{{{MF{MOP5>MvrKyC#1;r!Nxra#(gACTgEfaZLA;H9q_K|PO#p$F*- zzZX;JK^wC7=AT#vD=JwNd&7+qwZ!lGtF6Fpbb)e4(ml&<12VP04TaLDK%PVu-=^sD z)E7DTuLrybJMw)K-y7zt;B9XsLK-@t7QzU5(~VEsi97G}SsX9W5l~;M z6@DW4B|}yj@<-S`+av>JmIbxGu#y!OiB*bH{`8>~DZ*aKTev!_no0o%-UUUkH=(jpQC9VhR=+ICt%))a zMW_q>z1a&;BPc5Vgt_25+qrKco|(-HbY|Y4Bv4q)QrytJa5)5J?q_R$M^m+`R~I9h zE8W)fVBY8zDaL{Y{f5e$sS%oa#3U#9pH9T)vm;$~B8fy$RTa9I%(@9R9?+Hrc$2Lk z#iGGm!#+q1w7u4)rMvaZA`ow(RT=RZwNUK{9{{aKvWO2>-ih~hblgi8XjE_dY0>L3 zk44at*FOvowwLUao$(1<|NRp;*d6)1b#WWcDb{4cT>tRKMJvkM9=?~E0$&-d!oBy( zqc$TIU=mroasI?wQJJbfZ>1(*Z9l>Zn!uluaqo`$=X{GkDIl8~hpMTS#WXh3Ih##- zqTfGMR)sa7Le^RLT9qfopV{2<4(G9Bk6I6I3s^A4(T7&09m=cXNbMqW86AQ?w67cL zX({f17(1sR(V=Z!w{7=o+qP}5wr$(CZQERJ+qP}nIDMYZt-AYRzoaUuB(o}&WR5w; zKmPC8cgu=mj0sx_+0AZ?l1G9O@yc&kE0TuKpQ72H9e$p#BjX4QvS{$@YU=vU#SQt6 z)B>lEhLf|<6?$RI77!AUl9N@p+fNS(9jeL@_jll5;*cLZv8&L4TbaJO-ic>!bg zE6Qgs&o3}e4BZx)MW*_1y0$t!>>-lo(aL39>a(~KRNX_@*F{z zJAcA;+?Edgax8QN6q1HdmP06MS!ue=`y!B1YEGR{9k#U!d0o|>yUsc)Pf&N6EEuxc z8a^*KHxbRJ!rHuJ{_Uso{=1)Ek8@`sn$+R8{rwQ#U*zvJ2YVqHhz$VrV~LDN^B$_jn4Y{s1uhOvoIdTV)xva6n*)TG-SYgZhQymMs zNNZE9Cq01PL#oC+99eo2^t-m{4%}nWwYO+b`ad<+LGx^O;u((mi?I2id+0I3d;~;! zC2zGZglxymF>py12DVMaEIU}~nz2>#^eotH#Z(h?7~?QVZcb&n>fuN>)6^{X%ST=t zH-%AcNefAR&UZR}21v&g6v>@7kCdy3>y|8eAd*rMC8Z!WfV!gmXg>P_yrpB1w`vw0 z+dPz_M~Vu4>1>+zcI+Bpy*Sf5X+{)e!P+_DpWjd5a7}j*`ZsG)F^!HUutXDW?yc{U z2y3!hjY=H`m^MsIkTR1X^EN;-g!q6>djcKhkX1Nn7K2L8nc?Q6qK;fFspflvu4X3)D0*HVzymz@~j#}@f zG#Cy7cC!PNvJ~wlQsmzAoc{nW_L+P9hcqDv!+$BSVq#$bk6nCQzw#<#4#e)4T5_8z z5FM`16nQCamIb0K$c*mlXAlFrNkI17mpd+NQx(-@rcFp}4dujS9}%xRr`3mpj}5%F zvlU;SxrJIXkN0Qc@Z$M2WRl@Ol>KDE3w&F(8$F%gp6?^bj@D=4*+mZUdqpfnDyIv& z-F#o4kso`t*EeJJ zl_l97cQT)g7x_X=86p1Btj1xhN7(vEDaZ&^?M(F)GW~xD1)gl>;!AkUhT}-jX5pXx z?wA1KGWiJsT7uv#n1=rW+3)n%O(nL#M@!C=_MZWpL*aMX38I-#Cvv+3)+w+TY@*!x z!s5%`K&KC~jitY8_^4CB|0q?w>tcU~6$i^OT8<}fI{pO{JW_w<2-cN8Ux*gg4UnBA zA}J=Nn?gPngD$u+^{MftV9s;C$RixT?5*TT|2bkoOe=FImMhf0*Hph??vEv#=Rybu zG%JBjv@`Uw6U|De2s@sPHf}+L)#YUNEF6G}p@kj^(C#vlPJT`esvG>dbrHV;Yu%1C?yHitjn$3wvrOoj{%K#qkvzRL*b8VctcO*j8*70Ly0>}%I);?~NIdVm6_8V`*~bjXyH zCQ!;%3R^&xdN$2w^mRh}4Vnqu#u33K>qbomdHO2lC(D#PKHVdJiY)tH99HI zUgDV@%d^zP{Y@!t@9BjOl{vt<_{EdVFaTwnT+p6C8>%poeTvG1WMR~Fylnv!5`-yx z4-7CcPYYqg%wcFx_r+P79wtyr0gUR!%NG|egvf5kP15VkSc%6Oqn$Z#~zHi5)YXvjrm` zl6bGktci^~2m8cG1BI!GJ3)9(YFnnh}RAhkTs_H&! zg(La}sGqilw!cB>9>NlZx3?wxbo#ph%jF8A+;)ie zTllt9Z-d=ld0H|puPXS)GXCTE&=VNIj-52ulHD(GR;j-D6Zf_w0E=xCc6u+n7a}iA z{)Nak?l0AKnYM}UB5E@^Yj=Rsw+Hb;dx;%lCy~|T9>&MoNr_z`_$YkRYKR|(;&SZL z8}oKB8!KXaU3cYoK>AC`lzD{Z{c+L*OaGA1ipF)bZq9eiaO8My!*=_+754U|cKMJu z=f(ZS6V+pl7Ic=1fnc8?cN57KS zPpN^TH-X3(PoAEmA`U^{nZYjUT{E<<;J0P$b%c$4_Ul$)M2_g!N*yn6p_&(1ls`^2 z)DJ?vmY9M&+Wjg$(K*1e$B}4`1a@~h0|tPBbmqC*!AA_yv#>!D>`C|hghgkb>3kV+$8F_ZGpN{zo_@GDK3E*k#})4J zg?r)W%$?qrgh+b-n%FN%vaG428GH4xKbS@0oR%rd%w1HyD5DI2(-6zkAs1GL*w#KKuEc4Qa*UsH zu!oJM-G8n^E5=+VqMS*hK^HKdL+Knmprh#TPO>auHPEihVpp$?3_JJq#*MJM=)R7! z%Oo8|yrz{mgh-BvnbH>o1%qHQ&@9UsB?QczBZ>YeOT`kv9mhbESuXt7_Q&a$ zJCg~d9PLrdza&!!Y5||e03s>c^HAqDf;VX(c@^pUE~|v|P&bu!LVFNbyi2l0(;mO9 z<^V&Iac%@k+m^uf{l<0LuN}(zjmC%$v$MB7qyb|Veu^S@*D9a}q_oos%`qhP*y+`i zy&`Ztz>Z`0+WQs1DPd)238HU<2319CC&jxx{1D7@=eI*$4hT(w+TWBm=?W# ztRK)@g&)wz8(Vb)vb=U8@+V=hH95Fu=3|}`HD5|uo#Ex}?+f;2r;@fDN{)8tKyOUA z&#ivH<0c3appp|b-w)>#HTR#eI@NpN*-b^CFIkg2`7zOM==Mdx?xfOuuz%eO?OnR< z?Qib`k6ONDPs3=|Gz(STwp-PIjyD~P7UPf64yy2zz{h*t8s)qgk!0XQ>B?aD9`^04V{lO=jvufSzpJfkS3^37REY#64We?k(#<& z%0pNX-m!;bh{gwVOEj|OzR(11bR54MR*ibZ+X9iZfa+r*6J`0CGx3HZ47!!Sa*(ca z$JQm8zl!S<%5ZwIW~b!4kSy_LLf-5K(T8OkfTgo+oIBzda%^dUUK~ z1hu)f;%H+w5-Fk<#xRC3(0^4Em4^(LRFyAtRAX;`s!Qa2Z4MvJe{qP>C=%@$WE2Jw z^T)R3rF?cTx7jbYY(2Ip$K$_L#K5vrgd}lRX}oSLpKnk$pMeuHX?hA--=ln8Gj{fN zX78Nuf9`Cfu5d&oU~{$9uA=^(9V1hfp~R)+f_39Ev3Qw4l30L!1nl|I*|*$DAFt^*6YI439u>?sBnK;Z6O4EvTHW%><@cSUtZ+q4lp< zf^DfIL*41lOtM_N3^xmEz98oLR1=O26I>&(&PCacQnD7-p>19R%k~)H9p{hO{0dp) zn8F=++2hJ1O8w!l%YB>p;j%s9K07#( zog%KHSQ{)*UWF+yXw}Jd6pl+Ndt@1sBP$g;EiaNKrwBc|T04hnmhGf6GlL@snY1K{ zy9r%HIVPy85djTDk;km;`7VX?rn1$0jA4UW;V!i7;$4{!HXV*d-8_S}S5{TDf7QT3 zScM|Dcl7INYu%0H)$u8=B)0@6yn(!F#}C=Fh0F($SfU9#+)<|r2!&%E5OU19nI92x z?WyP|1QG(G%3qDu_)nNY3C;V;&r_QEGc2+VA&G=u*~>HFyc*%##kvtZOr(v)aK!O_*^ye@bKdd|s6yVcrwV92y7< z(0|FFbmh2mbCwV^E3)FYT>}nDVov$Sh#FkC$Klbp`s-?Ch1tcRj89AoiQ*cheA1$% z2?|sjpfJSC{_L!j6Cd12>Xo#FwdLgks)NPT#Zr?e>P`~5cNw7u%f6*kBjyh^f9P=< z@&q@^v$3j2i{=udO@!}NipLg3h=ayHL^vCs-N&V3s^^kn&&cv!Z>uAYgS9zWxK6}ZJMirfJPMN;HZ;e@P zfBz7;Y}PoEe7SghCK&%L0!G}ftV0+8SAT01ZlT9JYs+cr%PC1P{$OEwuwIvlyih7n zHn|E{|LSZxI+}D1rw&7>N8z(oGf&W(H1d&b4PPbs9?v5yGAT_}DGU5#v$txY4>>Cr zb*#NGJo-6OJKp*C^OYPU@1pyc(qWm-g|rE_+IAAx|2nh2`%m2i94_9=9w+G7HbHAW z@xVOkQ=^jGm0j~=ij|7Aofp-Aee-PiU}sj!sgiV^Wj7{TAz<8=3Ek~>@ ze|Jh^yzhdFH8);#aI8dJY8;=E%iJHL7JI17Dv-R}%*#2yA3CPErOz6>@?0oSJ=oXN z$wJ#c>lD>B(dpsUo;ZxYeJ!Qob2CyiBS@Ao&10!xLiC>O_+n4HCuI;Jxlg$Ztb$Zk zV$wkxXA>zgky6S$1x14ygU?ui_@xR(EQiy_h41d4axmG|AmiN1Dg+NqV&#vMsz@7f z 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%0Dix+tKR*vYud&J> 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®8qJeLJI&FeLa?83I| z+t8+YX>|QP0=VK~kdj4Dsj8H^NMGvJ8&q^>vOlygePpCIxMYmYg&q(44bjybFK!os zx8p4RX@ajdor5RY+oXfNJs24oFLw>4vg{wk%PF24{8`l_U0&XCcg5ggUFt>RdL@iv z>}Ph#k~``>e3Us^pD~rWUWAviB)D&cu=$>|4brLKzfd;ZJtkL=s-t6vvcU6?J6#j5 zqXQb-sgWT;33^f81@_?wO7pgaxwo=UCyUK{48g=jn~1Dkt`QX#8>)H^l@mYQkqbK% zi)?oRf0Rkxl{i<&IRrB!{+%HGjewnW>|K0(kLtT`0fdijAfg6qoX7cBtm|?|uPtO( zvnxsfi!a)c3L}Rk$eV#dGu7(dLR=HS8`rNlSA!G9%~GPS=tl8Y1h2fbWI0GJ@q=)f z!!GIqX)-Ye=Fom92eys;xBn|^LOcd*#3D~Kd*?}FBCDU%qad6m4KX9o9-3;|Y^k$d z&QVMd`JxdYeylDewhp3BZ^F}UtCCE;j|9Q>2{zhRWDW-rJ(D$r?Dt<`>Q3Dfo=V)%Heq_BC|aR_rgDpL~CdBiCs1z*LEdxA`yO51vQ%oTs6`Sq`l483VxVq1kT zZttdiV9&*LJXC0?WwlB8e;UYl5*y$Dn8dIqLDLFNf3;?tXo4yx;Xkk-ZX_)_Rce+IFJC`smv#t{46^_)G`b8MYdiJw!vbw=h^@iB+?GsK%!?^Qqr|AJ|*dmNp`s1T!9zlsf(#4ONa0^4R3Kr93C- z>{F?19EiYNZ;&VBP{H}Hwm@zhR=iRGh`y|xOyF6rE^R( zkv?^FIydV?iKw^9O_8%Z8T)8Y)M^vG_J*Ld`C96pI7@p!fcfEQp{>iZPd(G9Hs*|f zJAbEk$@g-S?7mD7ugGS~uqPyfeW2c_z0d5==l`*cAEOqf!P`kHEwQaw!EbtvN=iBL z>gaL9L!0r;(CB=$2+ik8t;^J`DP&*}DSBOPI8nsX;({p*fMAyr8eg%E9EAkccQ3Is zQ|=8+wy`Rv9Juw_D;wTB7p(!?u zb(50KEb@-C0I(Zs!d4g79z95#(n-+DN9ZK9P<1F_qReQJD;18T-r3-O! zk&peu8hpK8Ik7~JZTHM7&A`J2?Q}|d5y06mfC>CqAiT1UOw5L-vv81`a?0yF8gPt` zWDM`&m_rm)`k*nRSO1iS8%{WD$9mZ%4Xp8XQH&k|H8vfUGG*hkKzwrSXUib24o>W7*~Dn5;GLu;BxXX3H}Si zh~ghc)LEQsYuNGu>Anxp8V!5AEfB=~d@)(7wdN$48troCUbIWNK{q4zehM}XcO*mC zf~ethxxsEP-r<)kThk|CE~M?5m2^04Xg=^R%Y@7owF;*Z(z zB`5aMxn$AV(9yeh1NXM9mKeFK-PB0CS<+{`iFRoJFu;vq6VFyp!Cjz^@+a&i8+6ZQ|Ko?=>6$mT*nAC4o8Qd0Q8)A4NcT(WG#vhN~X zp#PQ~wgU6F6BY?+J0ZWs{)bf*%)(e|me!yCZINnmNQEo-m~B}DU^2Pxp4vwf{sB%U(usK20m$r@W?l`=ne#Xv6ReT$IT@vs8_MQo$;Z@9Q#4~J*wqkf zqCBzWR4T~fQ`x3}u9Z1ucJdPg<~tcB%GvqLrp-(93_kBOyYk&G>m$^@qpt3S`VgPp z0meV9j5<@aYVZh%20Kq&m=>0BDO3kN;p*$n|s?-VYnP~y{1!PJq7R&K$Kuo z=@E7w^v+1_WIU>m;|NDcY`7+ptc`yV*>XUY-ZeFQ{k;??i{YgHsPM`CRwd1w-#DJG z{XBO@M4IXGE7AyhZcf_567-$-d*uFb@vW<*q;8((Dz|4ntZEb6c?$GX-iOJ!ZZyKc zrFxHC>@f)FPXoUK@W(sPGP93~pEtslQsPNjq72$-gz`)q8P?4z*?IvKcAZfG_$|bw zDi$^iqBn+5l)Eccvg}zc0?7>3VDGytn{{gQ zh3U&=S$?=^-mN3fJX_C&U#e=FT@$XCLX{eX!D9~#nHnMsQa!3fb;MRg3lI8o7v9I` zXrB`%#?KVBy*jm=fm*YH=N^f{#`H&OlKm*;`o5qu4F*U88Cgml$*Dtk?YCLAjt)I$h;(jRz~#hwW3 ze*H{2|87ewkptOG9k3G)iQfi6I&V_Bd=50NVQjF??iw^z%q^fTv)GQXF5HS}Z-|qh z4smz`Hf0Bg$}iNPCg|)*(ZwTT$WY>S!Xv5^grJ{Q@FZ20wM%oi4yxIWwwsL$8ev8T z3RQ5?yfK1%-75t_g|!L2Me5F6WvqklG$#x&jP^WDWS7vMVFp5v#A-z|pd~S$*+iNk z5+N*#LknFjQO8wXMRudo>LzBLB|81ia9;)=2dV86Y$Itb%vyEpgukjVNm^_^;W#}oKN?%3^B^z6~5jX>^=Vqim{)Ie#=KR=Tj%*Srh zp5BE`(ilYg7D#wV^fJte}&zQ(vVg_DD`3 zAS@^EYpRbX8Z)<0y^@X}?I~DR_~KJ5$WEk9!El9+o&zxSdoexAT@=zZXom<6wcF~b zC1j6YVDId;-%Q|wE#Db3rj{jQ?LjFuS};l&T@{Vb*LNr0eKw%HEnvp_0>bVn$Fz)u zVQfdUZL8u|Z`R6Kg@Yc0ov)|F3G7m;31}!lh4?LJUKlnr?wg$*8=y1{t5sdbaU^f# zIhbQ)SuTjM3M6~YP^GDv;(5n5<#+aUMdWo{ReGV>Rc0~|M{ze@%QVItn3i8St)>9& zxZG-aYY=I;`K~SCr7I_z6)MI_X<~k%c`UTl+rl1zVKi zx!=UVnxG?o=!}VhO(D=#3B6>aTyW7f8RH%X$>-tBDYDPekmuf3G?H~F7Wf~sY6Jd|1oGN4Tl zILcDV8957>ng?$p;!nP4$LGv!S9L$GH6SOjnYc~w4}p3bv#*@lbX{$t(7qQwD$J$v zOcYbVR?VPHN)!Ll&EXbq&nSlfr}p6Q9e){C;@WszwQLd^i1V180W`~bvr62!#hjpV zElO6B;z30ZiRFjyorsdzWZnJ_KfTPHik88)95em$?~b>s8o?@DY~z5lT&o#D_na2z z+yK|lhb&fccQxEZJ)c%qsB>prFjwrQ8*5RV%!b_bNj0kA7yYEfNPkC|)g|5!C>dMKaQ@Hcs58Tf2#h_<@y5q@^ZKhBt z``i`}C*3>_9>ELqRg4lAY7Et<63KqhZFhV#75@dVu&;wNx?#Mj;!Y6w)M2FP)&(`RLIQG;Xm-E>v-3*|rgnh& zo^4~1q_;NkCV{{+1_Q-7X`=>p*A6`(3&YY3e4-@SbjNkM{25nQ?n?Wgmu<@V=>{9J zx2_k4x4rG8>A;XD;xw)}F(YHWY~*G4tGALC#;-cZ6b!NIqA2^kq+)1gT2AY{-4*%>Gx<92-KIh|# z5~IErXL2U)ZSYQ#_&NrK3?tqKu7Ktd!!K}iVDF2dh7B{)uGKw51RUKb1d6lm!u`hR zR`(B&K%;ka!tHlG@pDG+)sHR6WYVi)3xJ#(_+6>j`{GSFE_hpRzHnYL@Sj->YIQ>c zQdforWzV7QEKcHh)d-d~4O_ClRu)zkJKboJC^V#yZy$+*xB2+=6XR?mwduB}Q8kDo z=o7&_Mzu3}+72L-_Z~fGGPs&f5Dt$z7P{+3N(%@pcR$ifadl^Hi?ph9tu5vOVTWfDE$P&KTonwz?}PYX>E4hGh>LV zNWQD+Sr&G$Xu$jJd3x-b){Lg*y{YzMejGeb^{v&GW3O6pI$R`6M4(P&4tLuxt3K`h2tgyF7FdjC)`hKL2;?Xc;?590=T-4O z=nH_UdUHQOP+XkU8ljOfUnD%OC3llqd#M^ z*YI=E=Dtf#Vs7|@)5)?(h_U@L7IJ>ePF39-xGEJ{-8^6G5cUK<#|;)XPBeUvUd1?z zRdkcebS0%!3ngD>ABUKg%~FC2OMoQc;*)}BBp6TEWX~zOD7v)aD)QXa$z_F|2v>%5 zj=Fhaywx1pcpDwS+(~}|Y|p%ctA^vsA?E#>Jp#6Q`eT{6m!9Hla5 zPl~Rt1-^rs!%bOpsH#NXJD_f-Xodb>mI;ooQIu)6^%|66pt6WJM!y;(QOq~mR%~?( zUbfR>nHZQeC3HFAWNser-Dw+Z&jBoPrP5IZ=o+bDPGTCiQk_BEE%a(PW1)L}@;$4` zD+6xFPVC|9cb{iek(WiKY|^$AeR&(^NZW}2dHot0qD-hsQPD>1Ph&+!`eq7N)Yyw( zTQNvgJLlqyG>-Pd=iv2@P^YwgflM5UA?O>0MvK{FWqh;5UF~+)F?ad!wzP@hM(bCv za3a9Mn;JcI3_ATMtLpz$hOv#t&%_H{<3vnLou%jgP1j0q6{47#+IvnlpszmY3RMp9 zA6wdM6bu#$fjH+@k$$!|H*Q|aHxV~VSz7G(Z5+@%QPLQY%<$|G@iK= zG*8pMlOVh+L*6$D9}!L^Cv5c5bSAri;yRwLW@p5@uT}dE`vnQ2(>sh_Dwwv{i4=uRgq4E>!2v5s;xB z(M6EpQ^hFjklT)EBsLF%fkn@6@8Ny{w$>5kp0EMq(P98m<~iuH&4=wAaubqY^}dMr zcEgq1#NR+*K0!)(W!N5Elm!+5|G?mCIwZ?A;ZHsNcSo~3U)NJ#YKKjfkI@3TDB0H# zjM}Adn04SsQqS>PNT(N_8IwxvLMDG59->kctD&t|VB~;;?D7SE@D^UjXqkb9UYc)u zEjJ8T-65BRYiYaQR~7la$K#Ex0EX3lA?~1=!mw5LCfEcu!Rh6EOol_ilJ56q2E$Rn zuK+%2^flcE*BC5290T1BNl?Puc7uh^q`ogy=ub7BVB(`+O{mywr$(CZQFU$dD6CR+qP}nwr!)&>yCQyI^tGT?QiQJ>{xS+Igaln zMx)pz$^boxmBzw5#S{MWVWYrR)7LhzPBRwvBuW;H^}XgdTnejSMabU#`~n=%+r0mW zgpGyaKPPPeKZ1_!zo-8Tf{uydf19vvZ?J_mg*goh2OjycEWm8ja`piP4#L0)w;oAL zP)bNq!H_~EP*LXj5o}YG`z0wM?PA<=p7Q?ouDn)jUZ!`~cD^*M2Xg{@4EV7j0X~!MtBHDm%+UuZWGnaISaZJNzddBIFGf z=C6a0hno-rAVU!K9#Eh#AaGp`!v;PrgaE<}KQ5uY9SIxW0knTVVT?woK6xmBfhjRS z0O?z3PAf9hN%#xeOGv-363TlznCIjLgt=-_C^(A$3)#CnA1embMNsz(K>TiYccj1v zVZe{Ijsb*uYA#8ZH;?EP0s}pMS;_`JI*rJK-4tpB7>S6eXtBu<;6JqM+0_C0J$;9z z5BXyf;seqcGYG_;h!+r@2J#QY6llaZG2}zYn-Cz&1UMGbQ*Mawjf4O}ALdCA7*2i- z1IT!9qp@MxOAvuGs_a{+w_}0 z8!BoMKLUx9GztPzA_AxYzbIL-ZqOI=bT8eW-9xW}FvQjD{ts~>+5jlz*w=|)cUQ0b z+fO{`Zf^WO_>ZO_e)uvI%HC(|lZ^?2#R98M@cp^cI3uhd^nbHchd#SiTnXeF^y2y1tOyP<7!}6chx%P*9q8(3 z@GWa3gtA2Yl*;{+Z`y?D;$iGCZ@$FI_>L z6*t2VE-xd5%q2Y_UKSUK zmd=!zJ9ja6t$3pvDgGrSxLB6TSGo#`|FC+rqb-6<#ea3%#n@Uk^QvnRa?SInu|0>O zg><{@S^O^DyW)P#l6riJ;X3n`G;?CsQzI-rSSEQTV75D8n)v2`^{{88dPanME3-Z0R=#=vryM840CG`7e7-C@rivQZ ztJy@aW>3;JW4ggf)*S3UY<(71+Fzi8`pOkogAdd{#e0MZ!;?=TmZaS+UGW=u!-fLN zij^L_}{T4qf-*7<`i{Aa*+Om6q!&e=RMdjF4``EwJ4&Da(D&-?$uITZ8&#b+!rF zLuwhsyANvzf=%>@+qwP>YWy>+x|T<%X;kz0$+BN34lU`?tDn=-M%OHlU;MabdIH{% zGYt>uPghQ9DU(D*uc@~n1%a_+5q+o-6?U4!WwZ0)s;QK%&3lPu_zZzN66zf2qBV-ZyflhmCo+uQ}dH>z&Q+WQ!cN_-*K&_qq*G3?3hP zY71kwhb*;v7~Es}?2I?9A#h8cUew-}^~(}5Lc`-p4)u26{bZ< zty%e3X?n2fV1dE!Ss>kX%u7@X8v#O;W%~YC@1m#UD2msZO8D=y&%iOMwsXaXFvrFp7&v+LI26GM6Iw{~pm+OK`_GfNpc4+|55WM5_sz>aNp*g> zx}iXmUfx8Gn!Sukh@$wfxeo<0%JVScGwAn!w`G6a85CEFy)MmTvp+@>%eR7kTDOA( z%7!au_eEe~XLF7zUYI#3@FYyF7ZNt$QTDX?y_^ZI?I?VqS!NvUvA=&bkj+D~WaOAC z+bKbc4}m{ueuy_^P{Hw2WVLI!iGng~jt>hr13Lr%4*+=sNzadAvqeNi1fD?I)wrb#UtbmMTo4_#|K)mDfJ(7*K zpZuZuEHpvujT6`#we9!_FV9ITG1`;dc~x4<)^w{L{Z_(rf3`mhW7#@uV&_$PB913t zcU^ry{RtShpFGohRz_6!s_Y6kl9ZWPjO{t@^~#rorgCkBHzIXc--VxyZXFOg0_j_s~lg2;Gs)= z7xL|lWw!~o+v}3OoRa-*@*(;&?1$9$0})hudC77k7zl6WwlK3en&0|7T&P_>Z^Tm) z(Ni>GJQJ_&^nv&@tsHtKJ8(1bH0*?!daLVxm%0^lVHDg@bu#fqM%6)N^?~(xFT*%X=<2={tqQp0oLMiP9l1306NC9|?D3|0EcaOppT~N506k|8MWAqwP_#m1l z$DkCulw)bcvKU}=AHexcs@WH@Gg55gCMsCHJxL6~l^ZQF4$!1Ykq`>JW9)e+#N(ID zY_%S)BX8%RQFuD@-o=_Derzhe_bFnJ0mw*-UtX;M+s$QKlVF`cfYV?*lk4C- zQ)GuWLZH!xTz}^@nwHQK-tuHh%~6gH|G2;)?{-*xvm9^#dsr!dc3mAxGkr*L<^kV> ziMkY*j-}`G8coAN=--1X^VpSU7$p+iUYyHT{5f}1EJDf!(HDpj9+M{~j!gL?Mdy@o z5S0-bg0LGe0M;mo^=TdpUcS3k4p6@{RP{urxI%IX`NZWBGCBr2Z44GhToE;7!9F#8 zTmrQTb|_YxsHlbwfqg{Z53*TQOiiXi+}dGOpo_oT(%xM(1gOWg42YkJ#`WWt^fAG6 zz?TJoqqQB+e)yJ8Ws%cu0nD7k_%m~I_zroLf*5wQE@Q365x}dhZc_1=48iLlAiF9ia;o!P3(NfqY(B`$8osFDw-zEsgHdpIF0l zJn@7GmLX1Iv&6^8qW$*n3`JW`As(3I zUBTeK%9Fect-VXdmX753tiBJwR{kmel{X@s4@?RgVeR*OwLW@EwC{ONerVmt*|q!sL&wEmq+Zp*`ioo#|^SV#F8&oy>%E z4C3GW7GmLa$@FS&$sMNpwl26y)hZM1GR#P1&2R8xZSS4JT~B*>5xvP~ho z7ylHGEy?ICMb$15?^+fE^GT{z`{(QlgbX$59`h^xq6ar+aweY~?Pf%Fx`9A9xWvVT z4%O$REUxzxree08&X~O_?6Z}PK&^x#JIz`lvua(&jd3&RCAywnDP?u_!!(FNya$9i zEw+TTl!*EvNRrzg{hj;P2^C=8DFnFog9leN+uJy!!E!^X3L7@y+ZjgM1)37!nuNBF z@^hLv#kZxn+r#ZC%>~-$y8^Lo17!+$6RG;$_)4xloNMA+nnRuG%O0IyXVtH-x+ZYV zg-QyReIS&GofTBtLI~N&@pYnW+34EbRaON~5DTQ@vwzg>2E}J|goxQfS%r-`c{(0) zYHO9);s?uXK-oi2mZa^npk7_gyAbR#FJNIP9-~b@|LB(@X?(N2{GDQF6y2?7BMP9_ zhui3pA92w<5Q42xf=aReMjb^WKyE zxrhO&Cr+)Q?wf!ovwC-95fNv~e3DR~Tyzr7{R~ld63WUj^!eiJa?8_1Aw74^rdDsv zsOI0NZ}-99N}tv=kyxEL=c(oB{P+5j=2?!1aQSH(~zt^uFuhIC%~pI+*U5E>4? z$F|~LgCX?QP>n2#CbJ!a1wFSW5k9Y3s$wH-@M9#nv^woIsRV%qwJZwzWw!;v5iwiD zq!wl-Wq#u0O{l{pEGkGw)aw&ei~I9TQ~jbTWX@}YecVA3u4*=?!tjN5`@8(lJin8k3f+idkq*9FvDwR1)H9J<+e z_))@{PcgdHL70}MQA|($CiRuC&1zz^E7Mn)PM>c$5|Xj`0NFp}vLaxCwi7U1a6|^F zc4^$U7QPrUf*NwrpFkDa-{r(eSV5hFy6HC}e2t*oE!ZVwXKJ%7)V`;C9*mA?1?^Ao zd_`DjX-`lLO3g4Q3tw8Vm5U`HQf<0ovs0;i(@Bbag67y|&dqa;ohitYSs%n_Cro9i zw!XdG+NgbV*hrPyq!>Q)nY|rHa>Xi(P5sYUdo>epp6Mittq=eg5C^=NHpRccj|TSe zS%+a&klJlz0(xuqr4?(TF|j=$^Vy~&dOMD45z|7K{( zU1wC4AFv}1mM1o9WJ+_EeUc1|JJS*U{pLcCUhoHzeNj2lL*HwfP0F+t;{h*t9F^&d zpI?jVdbc9rg%|mY(XZ}TlxNKCGacE_2gLyrQBPWY!$&I=SgKY2=KIY!B79E^$R&Y(h-}{Wys5*62Are zJDOf?WL@?l$$kdeP~7Z8MF*vrgvq#g`dn^flWni(N_}aPo@lOk7HoMHJbJ;55}ad1 z>^qFO*51nH{WUpqo;_Bs!wi=U9C1~^mO1WF;J&(-W(BU6Tk{_1siAc9RpqmJ@UA#4 z_pU7{F9nf8t$UNB=NNK>p*R-faf^jL`Yd7Xz12*^>HT>#l|`-}C*6|I$XCBGK2jZRJ-Ai&@1-Z9 zFE;Pyux4aVxZGPfl}Xlr*RWeYmefn)EZ_iZxc{pqaR)1I#VZoGk{u0XQM zY|Cok#XCP{Hji?rjRGsRU2>IN^=CIP+d5Ch!hK@H+IV5NEe2SRhd>Jmh+V~XJ3haE1W#0TrvT_-J%}813hBLtz zlIKxY*@77;1D3vWwFuG@e$ZOwZ%wO4b3SyC(yJCH&x#mD6rD0Jl7wm6)xLB-7xghj zw0t`ba{G>!u{Ck*RU_#S8>YWQf^L+f)H;=gCF-!PxYaH5HprK z$KbB3Tzl!y$3eSy?EFGyg*VeZ{^EMYB-b#2=~r(V6{e>}ZkEmZ7_$?PKdF-N8ytlK zo3zF~NaAaDIZrEm!G^-uf-OBpa(`oR-?b7{$*e*FuNr)I#8GffAiTEDu6!o@pp4dr zJO#Zc)?RCL^^s3$i4J+}`jSMnx$~ZR!0Oz~x$g-M47MggLdjk(Y+C0CbrAD-5A)x- zIN_iGgnlsH$c07~)IQdJb~8rM_S|aiuB~T%J2OX{9c-Olk1~0Sr~dI@Z&8ORrb2*2PM{g&{at(1$>lEo7kr=W#6oMYRA*tQEEbIyq0NK zElKCqNMdf!wOM7nDuxzaIp$;9eccRyy-2*ncQtLI=`C(YNj;6(^X~BS{So%F{0J}pSXqq1_8!pZYiNac z{kyf4!y4bQ!)H9KB|OyS-+Ra>Ju>iUsO2vFnISN&wRL%-Ml^vrvAN6q1g+jq;(aND zAzMxHbC6YByE5I?#rpJg*wY89&!_u*T+@OE?YbzI-Za%q1>+S zy}JA(tkXJ#_b`!|$X%7}uV{Jvr`YO1Tw&rWYZTijBLcj@rZKFH~xx=yz&9 ze!lePiRH#&e>yE~$`K*4ysF~8x09XBXVNE|gznjFEf1BPrvV00DE=(tMu{WG1ZR?^ z)|?xzmy>1VjGK=MdrHjcK$tjHs^}Kp*D!`c<9UyG$vHEbyTy_t-&Yv>tVGwW;!JMi zIbY@*VCJ|V&B%7Vk!MOLWOcR_MZsOm+}?u~9rT13VL@X5?u#a~U?$LSY4#{CY|H*# z7cvjzQ6=`uW$>UuJ9fYak7<`m-Gf`EmUkgswfA&=zulnqbwo+Srj+s?Zin-?w2~0= zWQ_Z~*1Ob?S}SQJWI$MIt4>D0Wwh;hL;msL)`65i^ zflnnTQ8SS&(?}>Ah)WFaO+>4A9icm8@J>%#-3P^foD4Wz^X&btM8pvDB)r^Svy9bQ zbo7D(5qoAEVY#T~U*v%lTT zhqqc^JDnTwBI*1tEc)cmLuKiZWa2J2Gxap@^I`3db8&>P_#rD<=h4-S=7tWlIP$63 z*|M}&#^y;h39_Y{6!CojVw{xTNf{IyR!nz82&XRS%@w!@xcDwK<;@CiEqi_heKM?T zf0Snv@3jiru4K*{DQl6%X)YSm z^xB=wbX6xLjw8Ja(w!B%Y-PsyxNy#xE4P@;pz+hQjI$ZKUBpbR6_%un zyh_9E7Ona-^a@~jmG$P4iYCbqTK6Xu+<5eg$KC>7&E3VgFw1oUg36z`w!J9|Hz}?= z`}YDF$6nGY&QFfIrLRGkB`7Jm8X~zG>1%Mf>UA3$G+|lkyW! z+bn{G;%%Aj^A+?;Un}(|nxa`+)wt<9rr}*=#0--_LG6-%zItVBb5V^F6;U=2SWvF2 z@I<_&-6mN1{J4`Kl9a8w64?fVZEr4`u>D*)GvG!HJnu07(APq?$GX+kCdjB z3p(S!!l5*4ci}PZ8HFMciyJ*_+a+~QGcCD zlQo@|-WRw`wEHM}HdFL%0x*$et`Cu$Br?i$O)pJ~UY6 z^Hu`~;NLdamJ{xN!(Q(o$lq2a`vS(r-;Tfd5wl8~qcz0lyPQ5&)yD!f11LrGr0qBf zPc!+M84QaN53NA+xur+}Mj0qdIc-kIStb|e`_aK4HZnY?)?_!u6dh+;xWo6_n5sKh zH6m$lih4xRv+i5+*T3M-X*C`HDdhW~e&zqh=$P3#|0hPr%JRRa|6|Da52NGwk0GBL zs7m7PW(kQ{=mHa@MN53Z!gjWjF$_i>?8q1(l2mw55>&!M1jNDu0f7<{(gKoHg&)iA zllt!MulK3fuKVozCy%Snt0V8LbFaDAYLtv^YDd;L*4KZ2#UfAlN*KH#;LE0KU9*?15AGM#>G)OZeeFf44w#ATaUwJ!CJ%ng8m@ z#QsxJ4bJiuQ1}C}@<}WJ@^-omKxh=#yZY80rr&!8@f1_R<1YyjB6Hcx-g%wO+rS8j}+`R9v}gT4uU4pbfx zFTmdaP#+)*ehD6K$jED-u^kdiVheBH5CY$5aI9N zJQyFu2fL)+_ut{~)@6u@w@2$eUxa2wx<7eW_$YU-ujsJ7{H%m`r)>~Gzqy$V0@>%XV&EMC04zMh~y?Z2Vu5h8A2Kj)*BYv_@= z5Z)|4bPB(imXN>3VbA+B5c)^H9?kU%UnUfVI=sI0r}a!(^+jvEC><(0>FT8 zBZsa^0yrT2Su=NjyB%NwLkfRr_&~!-(Se)b`Ax zdM@-ocN1Yl!TSvT${|^aFAtMe-7^ZthSxhVf=o^Vn z7{Mnjym6g!Q1U%Ca2lV;t{c8f6;wsqMa`7Diw-JXk^=#DMc!RNtG?pyYU zjlJCEZD2{DGiID8N6|YHq*(^KX zpPEsddh<((Fqar{eXn1nOT1@8(G!&~H!I)y$lc<0*ldBAV+z}#x?Y|$V=fP_#?sSE zj)t7y=@=)b?w-mYZwzncz8os0oh)n_%htA`ffk%Fm8|5=`{Hg~0}1JwqE85Kp^u&P zgizSb0-l9PGEylxqh~2`l!l$HrLJxno0B50<2FRr&4PneGcq@NBN&yw=@H``?yGT0 z9oe4s?tG1VCWaZU9(G7fR0JBW9loA=GuBmZQBn*C7WDs}Ohf6vN_x8g)QPgO4$K-7 zMS>nfAJ2Dv89U{X*nfrh0hS&rNJhh=!n>DFJlh_;g0k>^G?c2|}; zSc-4i2Y%wTs9-G;#oWHINWFcEcbG|A(@Go)^{s8m@<`5L+{7y+@AF?_k6C` z(>9jqc5mq*$o70Uk2s_*=nnTC`+Ul1dlxC@YJQPe7|(;30pHG`cc3qM_gK!zC?+C7 zjvRqwQdO~)(E0Zys9dg-0^&l8Mn^spgNe7!I35rtUg4)aRH5-Mn52m}Gh?H?t;w$n zi`@c{y_>5|;ps!9gy@|tpI~?0>AC$WnpUQ*n2lpn>+`HM1s*oHx@G z-=MWV9bRba%6xD-{@U|Y;_Oh%A!%9+(m%vO{-==f9BCHMY!zLLU!8`OJJ;@Qf@k(9 zM+&+$n{*|N%jK_f4jJ;!UiKP@y$tfQR(8Nsfrf1wXeugK#n>Q8E_)4!CG}3&l|bBU zq_+SI*KS&7hF)o{uen`?^7MD2-n(j!(Wq0uGf7;7A+(OV=_Z1K$o##Peo7 zm6rEM+tf|~j2hjwnvnxG6El=$l_SIJYHqZAXFDtN1i-o>5h)2NN3VW>c_k2E(TJl{8 z>5M%RHI}GqG^n4$5V-!ZF{92lI6n=;=Y8w01J5QKIY!Pea{Kd-sx3afiil~A8%Pik z`Cpn^AFgY?dO?zQelz1cIUIpI2Yq&xG5#*a`z-t0iNUDDgovaYf^Jj8+DpkPRt%GPjJL)E%vO(m zSS{I(!LH?-SzTvcS}MkyX%;KH11?#7PO|ll#Rgp-PDHw<$&+9g?R)I%JmBJWfRN)zTALJm7fX;0Ju zrJvG9AoD1im0*x=TZ+3N)6{W~g7X3*fBHehekb&0%z3jAS$1_(8!Z_kBFtwG_pj_P z6~}KU+galNXcV33S?PD@A{!Am5v@x4?$Yj(OhNiplJbS|kpKX3u>^Q$0LjJrr{g5b z7HajW<6$%u|(brk+u>pZPwM{Ik|f2>HmNCuv;k$w6FIAf*}G8v!* zu;hwZ?7J!;8IbSD6qr0@-4CKJ=3lFssf&VYE!naoUIWOjBv?-?DK&+Ly!F4UDGL z1s2cIB}+At2e~IToUJ^TU6GJa8r+qt6YAtUknQ~VHbt(5>2oosr3c+h1uV3oD9DjO z?&f#N?(RUU0|Hk|Ep+;7Ud{&U%o!F=j%qHsZN+?d&~?H{#Zrnk)sTOUTi_QjwGQnz zcGlt_V7K+!X-7$`%CX2=)r$$IYy`kD@Ju@!5p5nJ#xwGxRGDz0c6cx*1ZN;7)l)Q` z7%k(qPOxC;GKNh%O5EMDZXN873=vj;cxAsq59b))K?;9xn+fFuW<5Qg%=CCy?7E#&;L9|O zaSR+s&h7A`svg1#HVT^_Xm!m#@;)#w6{8UPz@_!L=BD_z5 zGA=w246)d$BpDud?V=`zK3H#W^naaU-0;r#&TVsxMDS%|ceKqD84uwh?+goQwbb5zqmSI>mnsaLGp>7aIG??-BoehZKa)4EQXXDZs= zzM*jOXObulzGt9yO?kQ$2A#2!v9#ul5Q9VKUNdys>4V>HYa;39@X^rR^1&tV|G^n1 zk9j}a`jkK;Q&s{kahWf@Pvq$zhg4y|g`wMK^GB$aIo*|a+yY*rpv<=dR}8hq>9iXf z>7XSuV-5QJCdDv!Wa5L)(3pR)UqQz`o<#cqk@RVdIIcPPt5xt!zA|V!2vNW?0HcS1 zK+}=d_ih<;o z|JNTRFU1bRG}l1`Spw&8WIIxjPdtNax|fd)!QrRh>{c{8%0S>`qvF!JMVR=rvi_0@ z)<;cQHXE+$*Pf<(JO5&c8vi^yP;5ZAl%nbFZRKW&tE_4kguKHA=9UbmOj0E~ z>QLv21o1fRC@QZ-d-o~GAMvFgEHTmBPme2PX|5pq=_ixNBqc-?F07^zoIu!#aiX&f z92NB(`SLBT1bWx)Io2Y7znJ{#)s`C3*kTBdi>KbVF)C`bZDXZ5eIy7%M{??qlkkbT z%Aa$$D+d-Q(khyO<6)6Afpk0NtQl%o-)2Izuq)fzn(pGL9ngG%=}Sye<8}6yh zio7>!-Xgf8*NNUJ8hzs;%N}gdzt>LAAS>SXA1>u9?AZk`CgTH`HY%cYZ=N$W}M#eTeTVfLH2ZO&IW{QG1yC^m_Hoghd>9<|3nz1g9h_13xt#}df zo@-Bi;=hs2pV?6c|0IXldFS^EP^H{B?RYmVDf+T)SaxUkZ;>(E+QG%#yqDarF`1Gw zExY=WK~Z@K39=d+psPCkoChU|EjzLAPFfWBHZ{Kvw75c`J1$KV(E+8?Gj!G%HxyoY zW*@*5z4(@VRAU@`L#QM^0x+Z^kAHD#3)r~fdSTR4VOO{0$(%B1=-*(UU&M{<(OR@;m{5lB5Ph44QNqPo&C?A4`b6moMX5_Zu^boH15hb?5DvB#d(8BZgm5 zDnJ7UA+KHVWLy>+tzEZm{tMgLjKFpUYm#P^7G_RgSWZddWn=cFE%BvNiSsZkXr_3! zPhF6L)Ygf99$DP{uzijE18y{U&$o?B7Flqf#poZ`vOm$TnX3IAknnF=OR6L3SbdFE zbgzt=+1c9aqK#7u0F89$V-tGMPW<;g^NJ>aE0!I>n7`D(5gV9B3$G?Jwr6@Q@B@9h zY+jB7Xy=meMF^ zmQk0Uh;JJ?#+hOpXCg0M$(GD|mCACLtyB0DS7NnT@%oLofU$Z2n&Wy{!tvSP8dnWO z3o4TmjwJKn9_xq4cVpWZ)80ch>c_-Vz%u!P*M$+ElcD>3z4ydQ4``5S*f}Dg<5RWB zi-MCxWC2{?Vt`D2bZy>_t6p8BaHc3p9D)NWP$P&s7(M?YwcJCQpnC`!oI9doqEn7F zl@h4xjqvVuK|0v5uwlf*$~~1QUkoe864Hgygm67I)!K(l9g-m6s&y#glNx-71 zbsr(=xJMzbb+PIMxh7>5f1zm9^R5vf+-U1AJ~=uB=L5{=JnJ_YR)vzi89sn?iokx5 zw0&$=h)1$eb$6r@WMbJ)7hfQY~E&;xaN0LFO_>BP-pfb^H}KoMn>Ap;NeK zD&~<;EDoV5A|N?cPRE!>GJzdQxD@z&I{ZsR882J59waO&cYXh0N_u!0L%`C`Y>JnxNH%d=%SMx`n<2WzAggO~EQn;7F z;#tZ!y`}@6WhpJ%zKq2*m2%pIF*?Uz*2?%cZNjs{W3iyTW%l0m6%;FhUCR4c%Ket4 zOp5I)_jQl%JC~6+D8dqlQL%Y&gbIdz^`YxsW+qn+s;$n@-Pu3hzlPz>(ZB8AE^nP? znQ}#ulOYd>w{)I#Pzsc+s$4rt=OLu>t3@e|Ogz`;IT)nWN)2D>k*VfEh+Yb#Wqn(eKuk1-}Chn}6O+UNb0 zK8lm^iwALP{UQ@rjh>t{(+ea|#L71Ojn_ew~vvVH*`z z7NPRNvf-^VyX`KCuOWRQ@)O>Lt|@gymyx=h_f3d_m%H8Pl3;w2d>iry)4)j@8lS4J zUCR}uHU?~K#V#iUgu=(py` zmKJXU^8q>q+5u~RN{2gt+)}O>2sP>U*w|5Bm0`i&adJ=->+j3(**RV4@<)fs65CEP zo|{U!4yQvP!wc(gqSbX;LOVAXEez=lTEDl{`|7k&(b>};ZWO`A{c4n&MF%ZT{~gyb8qNVT){OiVcj;cIr-CH2U+8|7O^B9) zp@+SdG(y7;imOi1;3Y6vCC_LuL$|u02c-d>d{)Hi(Q;KGDUy1xyw2pk^Qkm);*zim zm5i)-L{o{uwGubcNUC6TMCt0P`Nwq9;^bdFkwRv+0`JTskOxSF0d=PUj{CGjOn3xO z5v=&R!X)xi_Y8jPz39?P#kzZahuTTfanFbA2tfrWxp$wnna4$0Ijm2r!bd7PFplZk z7mp(!Iys%()P$QDP`bzD>uBZYnmqQiNJ-U?WJb7TFh9>Ta)a;?YPH#W)%FWB_by}v zVUtL7newR{>74=h5)ZLP`4n$*GAWbn?Q3AVd{w|<=iK6( z$v7zA;-q?nZ~t`J{6viMCWWdYn$Qx6TeCCr(GPomQKppocH&M@dqWsoP~RbXvoyGW z*!Pjqd+L4)8!u}-sJpx%+eCE5)n3_2YFPHv-c646E+xd?k{^t-rr}Zv%8oVR7htVH z`|PY0O`OMJLEv+YVnFH1P3885#mmw>H*d**@V!805m?lHAD1qMMeE)hZmOO>-RaJZ zJX%1}Uz@Ac3Xw7)p~@Mv9u(O*dZ_0+F2?S%hRlvp-DEOLsn|b%oC-ECOdEy~G=D=o zn#iN~-Xta(Ri_87;99akI|?S??v6DldFFn>B+!F_kkMhZDnBAa=UqPs%{J%cmOnRT z9={rnk#Y?nLlnitZSWvDxYKwm)iz8+OHv)6eLIovVuA-r6N0^=Qazkt^(kW!MQhu} zfi|MldwS3%H|o1zP-YZqp!`Ccp^Jn3r+|&+KT>o|jQ=ZA`{$u!Wclyb%Ku})#?JUp zVaLZu@c+I4(NpOLuA+Rozy<_FgnLd)&4{T1$m0_HI?sW74eF9;C< zZ0I=zG*Ad==xAvOVL^aI`~=E-{Uzir{HWHjPax)yLH-aUDxeUCLM;r=BA;9Zj4Zu> zqV>V<142kkO5Xj#fm5^#^BN*B0Of&;bqZ`Vq7oW#^kG2y3(oueW9euw1H?QfpdsJi z-XH?D6$2#X&E4^Q{NQ1(ffxb`@^W?*#QW$c0KDtCpWs;qh2Z?cp<$j=2QkirUI0CX z05O1Z!2F36(h%r_h?kK4%HbGR7C@x z2_#(M83y1(?7=wt_Z0m6J8B3v(5K-6h;e)Y`|VMXkl|mz2KNlWVfJ2E`T?9tg#j=I z@8J1ShLBJE#UKj|?(}hjeTw^W8nFfxLC zpIRSVF$W1L`hd>??FZ)k!1}ZD(&z^OP}Z=a1Ux+i1A%@P?`Ki->lpeF!32SE@@5!7 z_W#jzQwpWMD``KT173hD0#RQ;5c!dGCep7zE^Dqzs+97^(L-$^k;EpP!Qhq`KHbUw-{#8P)baD zbrq&ez8h<>fC8MpSObWR4gl&($=6~L3IV31U=RqR(pAOFZtcQ>gFp}^Sja&9_Ax;0 zg*=dcEUSW01jhDK&tIifPzZv?{h!_|-Fv5g%fRj*o`ztK>@*Ep9$r6QpM>*!6d?Ys zT9Js5_dl2lz6;dC`^626LG0X%naSoG=(S*`IX_wYMA7-RjUW6Qx(^*U@?qw5M307K z2!L<wD4l+=$p{NnQhO0T!E^RGq_|kxRX2cdo_KYObr#1*W`?A5ijCGk420 z$&A+2;}0IpCT|{|^}JVWj+(>ze7&)?_R6 zQ_#qn)-xwZG>NcvAiYY=km7iT7vCz2e%nX_7wARLd{E`L!s5ZPyDt+Dn;kuLrp91i zuQ_X z9~8CWk6qMT;~$qpLaUcd43viR@+hH!3t;wy;Y_F387~2(IOn7g)Z+N4s-e~sc6|r! z<+}`2)vPNbkZaA@ZGm?Y$0b~cPb(u6MyBOzaP@Re(6b27?j~nHR7DnFJ)a`#ymCW& zKrRW0hI;rbXp@b_q!yv%cxVl2R!|g7cGO7Lk*SgX(MnT{PZ=x|AFuFF2f)y+QHF-^ zLxsLVlS+mOQ*mPglCsfY20fm>i!HU^s_G+D0K3Kt@ z!}$38rY8@szEM(Zc6f|=gIGM67xDz4Edtq9K`B_JdTh+E8ddJhuhIJ5l-}3qxmJGu zgdJb^+&=&FL-t*z6-_{UF>Ri+k{e&b=sVO`RM**)HL;K@E7RN`9VRm)^ruITvX zF$Jo~ObZ~NA^MhNJKL38NB3IK$=^oeAhJ=~(Ho7d(7Ji)aN)ZuC5ZBB@iwd6D%~FK zId|zb(0RN*S|>=Kq4Jd5i_)79Z3rEdT&=whFe!z`#SvMA!Gl|tcatnmorMo z^s1VD`gCBuh%Hy@`L03JB;{7w+!HX68t-pQ3=p(!1^Up#BIg{5j{`O4J#_hkMAqr# ziO$^GiKRxmG}`E20yPWVE@az~s#%RE+v#0twX+&|(|F10>O|}hf?53eUNyC4_uT3W zZDlRC>7e-^Sv%t7rgo$)9br{;A+7{UQSP5Fz>9pH1vqx73vxKQJ6Y0d=r~#zQ}2{n zFE-Qi!WC{=Uv}HE_CIa6uOcUFuKAuLfh7dh9;E=;^AU(B-^2xhh?5yF1K#<(x9pI{ zE5Wq8r)inaoG?(Ru8k~%#L5&VsRBCp8?zy3f!&EE@1N_~YdSKMPbhMiuBd8CJZ|Ph zBwdnb7Ds4;17&%vunQ=|M&Blko5b@?7>UsylBFvW0NuHU7AkI$fbt^1e_0ibE*?q1 z#|yO)u|$Sb$HjhTDdgp{T7U~iY{pe}`LZTz&_PX1tEoz1ucttCdv0=P#lt!NmS?@u zR>@z|fw!+h*SLR~q1TU|v60;tZwX$XY3MzO+T`GDAxsS_C9UceYPJ^>=|Ys! z(QQ5+H)CBtg9Sv+HKMO=H9sb2#h(0>XP1=+f4)O8a2J zRgkRGM+|X38}R>7Yxhoq@3TzTou@B>)874m2z%$?T%xZ_ICgHF+&H9o);rW1Gli{d8-J<-fP+-V@_*w4b5!qj3zB= z7TY>M)_Tq`NVX%r#*ZknT9CfGkIq*1WNL#Jwas6`9>+-HV+yY-`A*v3tjNjh?L)x^ z`B2~LZ&gU*Bl$8a8Gx-De1B93znPAB=D6bCTDTs!NZ_1MI^cUK89EE^XckHSVSjpa`hqq(DYA!iH^uAZ0EntK9(Y$yhb|TY<|b|_{Hl=MajDe3=+gzPAM2#yHKL{O6Mz~} zX=`7%i#F*GMJLz{fNl-ME80F&Ud>_JG%0Y$l0Qro!byp%-I(OF9eAdxY5m>ItXPH$ z_x*OjBU7*SbyYce#YB0e^|(TsP9|mMbigZ`ue+@Fts5&L#1m5L5cTrYjk8@K*D4cA zeBq!?rn75I@$4S5dYf>l5^-nI`XeNsTDvd!hqx|BTj*eD7^Vlk6^J}Wq~ZA+xMAlA^m8GD z9YWK$knMAa>R<4cwBzT)D|4H`)X~C3{Qgdq9{cL~TZ8OAl3U|Lx+W{&i8Zwe$zxhI z%T12$qJmi@$sx{><++vNEja#dvJoQQG_Fu5NB5?0si13eFvUoWa_tkMq}6-8+O)hc zP-Gc>+B1z=Tx+Rc`H#k@D;|~ya(6vFRX5C|$>Co`M`(x&TS5M@GyyQ!UDIb-I}6Bmgx6450^8Qu&#TY zb~ohp@FUsW{4EOagDo(f7$LQKQGE~Rc(pTcd+Ct3xAJ4F20j7kyU=V=i9~d6Jzgf% zj1-$Al-!P}%M|1el@(Yq&Y!=vl!gBK0lh6KS#;@X=({7{Q|e=A>D#nT?cy^CSAI4a zPZy;1lxd~^uhd7{tja5fGXVr=3$UTaYI0htY8^5H1l&$;8x4I2u zBqd~fS~$D83eY%p)MHF#w0#^`%Y-DSp}W}-{+b@PS&_|bDouDcBB4Etp-nWq#>2DS zsOTTBt(J@}l5cRw&k*iV@7+{qjP8J&?33t?e3qW1Hdrz5XLdOTCTBkRuwazCGSvbc zeM_~b@e`Cm+QKH&JQhc>^O$)P1*gV^&#Vbj1oftTM{DI-CWrlQAMd0O&#GMz8VfyT ziNhzrRA`=M&<4}Is+3<*|;Dp|R{S(mbK=2vnT zbH|GgGo#-xQriKK)t*=n6M1{&Ss8;LWE(~45l73yIR~Ds8K*^=4L%s{Z#skjls>W( z?qYcQ=D!53ntTMsZJD(WNYooM6H=s65u&%j&FvEH=Zsppl~sisx0L5x#H-y@i&In&8bo-HYSt|nFQiUq`SLYc?Vc^>v1b_B;v z(rrQ|-0Rkz4N@^%=)AO#DVJvE%-FQr(;QuN0 zy*&{L1r10$75@wRrlkp*2$D2I^rz4`kbHg>D~3vZcI^4n)RqR&~4q7?a#t$ohzE@_VVkiYaTi1^2~ z!JOpofOe3!c-QkISNMwK7C7sRv0*{`)h+*O#B!NFe3#)YWNXt@x6Q4*7GEtWZIchD z&=|91e={Z+3YAi5^VIDwbT~^!)8c7CMJ1B<6F1KE{p*N{h@SDO4psGJ2FOS+UXhNhRo-5P9 zG{qJ@)K`g7G`1?3+pL{HSGf0LMRI?{DI5E%Lt~e-W(EB0;K4|HE>4u3)M>p3V&%1B z{PRHt0dMn|%hZk6;Zm((EYj_)q+OHNQ3A{M{InSvuq=wmd-8l_Re{N+s=kf5G-5H| zEU@&R=GO(1P$qv_ZP<*F_c7uH;yyzKBaLsmSnkWx4OHKJ8YLofr`#;7;UYjnj^?Ml zX>JNeFA5Q2wFQA`%Ia0lin^Ji0TOO+_l}{9V02Mh4&bGVMlq9M?Q-idC?7i@$eM3k zFJVWVy+Gm7GqPllmlo}peM!>p{_yT7Is2%`><$=V=-CkxnZTVz4(-s=RD0&@bwJ%- z`%uphnZ_9{{>t|WbY`kq&fAi43WMp3hi?9!FIuRc(ri#XEw@+AXT7-A_eov~GHq&K zuT|w~*nq^`>L-F9(1q&J#S`eMpxZlA0^{NLFqaHF0#CeT#__DZaLR@_r_O*pIFqIc zr<^3^Dxc+Sc_p=$A#)7f%p|!*Qa_T8R8G%C8mAs>H5jKRM*-uf(qM!EuOc0q1M1tT zm0R>=GcEb?^6gJNB&9a+-RzM;w{*kB-oq>iO?ghN3_s9@b(ZTp^)i#(^uIEcyQ`uK za%9ndNG{RN-fZ*r;8DGak!MBqWbHys>ZkA*Ni@iHH-DKpVcXGUOLyz1z8{YaweHk8 zx(l?|@Mv`%nVnlwO%8p8(O%!R78pCT+A9fY=6jXqx=`#v;0RGf;^S!PE3bfV- zyDa{+(=BS58n+@jubWA3>l5wE8+j!>*~-^rxGVhAxRf8^(PMF!pt>}ptIHrhxSUzg z-=I6G^zd$N1NT(&FB5gJJWSi%jiWYW?=c}9zL8AGc+ehVnUvXO2$@Ujy-dEHhb%p} zUQkOdu=KdQe)3WxkQP=~69Ul}lS;sAZKfWx`IKo84^ZlDM4u{ze<}0l_cQg^>l_Wy zxlG2bR8ddW`PK{=Z(BdWb0aucaXP*$1=@g++rvqhjtzlvfQB1Vx=fMH6SZB$JlQ!` zoot;QrnSJfvaQn~F-d`ecBO~|jeZK8$8i5-1-glK5&BK(!R2yQl7*3#B!u`Ri0Pn1 zRYBs$qom4u!GBv5vmc{sd8m}{L8gj11BKSvVh$t$Uz9C(dtPBDN##VObed!jGZQOH z;7wdhSZT9bl1CX+Y&5hZUAH3{RoO`oL4DCKxR** zkW(=jznytiPvSzHWBj&;fR0}Td3frAZkeJ%M=mR%4J^*Nd=B#`S%ceWI^}+tU6>s} zXVYYh=Y;4>S!iYX^MZ;0^Hv?H`r2aV-G)&BANsk}pu#&gJp;lC%5{S9{v1S|eo>ox zIS>F=R0bF9AqjXm%O`w=akPclzLZ)9Z0nJ3II54-htoK-opm^OZ?z~Iw-Wu~v}Z`z zo(Yv~2{pN>scOcXsE#aIp#6~7&r_SsPc1@gX_Ahjwa&U9hK8a}Y^}6n{ zxH%Q?o!YQLqq4W(6kE6Xno6n_1wL6#jx1&;(rn(Yvy_7{o?PpDGq*EZ2{}MjY`97X zH<-eIj>N<5vd>`gS4}0GWG?NN5U>#)ZaaFoRiUThl9Oow&_xl~?!rCp^D>8^aru{TinQGfP@`yF=RdJ=`Q zqg0qod}^^Lou`$@Ifap1!B%IyeN6l#j>bTnM%ag#u}*v#FSRLl^qq4Ad_o{P{E^29 zV&;e*E&_L=BwkbvS*4FA|Bv) zgS8{8wZ}7Jxra`tJldh;oCbe$x-GzZ7Y+V1OAT zBH{V8=^cv-ihOAEmOkN%D_lFFOS)wB_VZ=%zGl$jAb#_nED&2V2}DfrDYh)T#$Nz3 zJ${-w>*1tW|L5#eAIsm*knqYNbmeW@yXp$*V#X@H?^sI*GSFYC>MpWi#~)tS%ws)w zO{Q0@_%MAM8OqH#ZdSpP-jPDUL}`1A@9f>hGS!b{y)O3OqUf4CmwEH&`b!55Z>V(( za?ZY;(-GZ*LTdRTtGBN8(@|!A_HTq42UhL^)d;tUExG9xS>Xl7UG6{zv;F&-ZXBun zcP>oBOlEh5QP4 zn@CVgA#iEllqoqytl1dpW+}d8INa}m;OM4_*{(Zd~58_X5wAcI_AC)H{bOr;TJ+ zTX&S07jOL{t+A%#jT}~0zCDidAf;|StG&q)56$AF(j~)d5gk|ih@1P{seDeTYfFst zGj9bBk{cfonQ+DP)Mujmgp>ZXJ<{x@*2{w-=6V>76#e&kspbdg&7&;X1Y;<%JfEu5 zqwt7!{!8Uu;+DwDwoeEZldsGcnK9&*49~V{V^Qa~qX8e%z?(F)ykmFvk%9+IK3F*_ zo5~aNW(8U(3mbYex}N8KL26J>z^x&kpch|1GWyKHR#COt@F|HVV~C1yeOR~DfEjTt ztdF2+U2|!}eOy(@&)Ns8*I|G875qF}UVIdrEFt=)!=rczY~37jkwqqJrkWesXN#IVI3 zzNSp(Jg|GAeqd?(yciL}P4RZLIa(eYF-}jomdTw~pjvo*0%8&p;5Xb~qnt#WaR7SM zJm`T{qO5u}YdsktRO>(?J+H6i0M%iK)f)Q7t}kb$hNJ~P(NPA`JLu;KNP4~SP# ztg>J@FT%fP1K5ea=s^=5K;NFko_Sr!*U|UE9R-2Z0#W86{C}3ixaIwWVg=H~@vGQ^ zY|=(7R+AXU<~|`c?qH)vLweRAub#e_xh)0A>IsWGL0>D=@ck;>@*WVffV6{%h$&-NP^XVQ zbX<3>8T{>NM`H*PJyo`Ewk5T|{jh`=_0@(P7{#e#7H!P&sLl{Q@jELQfAs8J8ijpy z<)j?F)=O+e=(=(`{vJ@C8&1d|+1-a5D$0K$R?keb3!#{Q|6@1HMHL==AO6vkGU$U8 z>%mDggvfaLH(wQxE*;wJahzu)sa}-6pfit!P|T-7CWl^U^ZqxqWWw?_bd3bWqUWDY zsl5pIXd4223wy%qNcz_XfvhhJO5kj~-+1`&7}#}YGG6(R(;$S_Xh?QulyxnPA8mN*^D=j?o9kXbY@>mnC;_nIv90m z{!gV64(}JZ3-`Grkbu76?aSvdh(L37N3E0YYN5N$W)x&MY8RqdNZ+nE7tgou9IV%l zCgE{{{+3f`Aw~Oa@r)_j@S6AW1fPAHk@7YCSEe=PYNOubs!GZO~tu={KFzzc( zS}Iv{P2#JBN%?g|g(W-d{Y)J0>F=BdyV}(A`8m8;w)q1M2PVlZWZ2sknM)uG%%^)* zDAH(7V!w)@0TCN?UHYplckVJ9I+EIku-YF#>IbKTZHJ%@FkW%CzKyZQHfV+?d=uR4 zVJ4n*$i}-y=n8Dz10m9L3+JH%VJ8QxEgRl6rp2X5Y;Qc!6upW2)HJsb&!Z|XmH)7vQBUOAN zu05i*#vwY(Rjki$CXqHd6GBbTz05PzC2m-6?zz1SfhI|Eg_rR#pR(!9r~I}OD1T-c z9*#>!k6pq3akE=(kDXJJ58emDruweeZ_JM(>!kS^9@faZTXO zHtJIiHO8u>VjBn0W_Urpu5>?YgcbNKCfPICM3X+55`3YBX9O4UH|NyVlksZI~?y5)9=%6To6$8P~CYFq<_GeSl9w?li` zyvWvR_%~J}NI7w{@{Ekq<#AAG0Ao3~u4SXzP{>_rtzQb68JN?j}FvGAG zoib*yN4N3Q8F8z$Vfb*+}9OQF@`GX=7HvVx|&+nOoD(Wr8lmilyRTMkEy#q_|z`Tq& zEJIv;f4Gtxn+KGTiZY@6v1f3stvVf)kZgyO zSw#U#qQ0hn0>f{oOEBUqODzQ|WP0+&l0V7kaIt;jda=iwF3yyyQ6UF9k91=1#6#xa zyUU)@Jov-uV(4*or0ixPP18g5H+a~$&wZhR?U#e-Pqp^uVPg0U)HplnbZw{%^%aU^ zjEV`;^zj@yaUuYX$cQL4`$Z?iy4?C_AFQfs33eS!95!-xMe+#sxrx)Bv+fpeA>KvJ z26nszV%>r%eim7|dM5Z1{J{5)RSyrWj5+rssxgPryGH5SF>Dp5SKiAd_;u$(PM&0bI?QEvC-dF|xN*2GGen`j%(mx-+$%3#o69qEQonigZC2ZQ@$=4`S@ z7>DqxoJpMJWn~kOzjzVP27;uWUsrIK!`FIT>OZ$xQ zGcumMZ$O9G*s9Udr7_WD6@cu03=I{T!VSlAs9#N4>yK=iGpN>> zSopd=S}jqS-~9q9n=`aav4j_m1x6PoPbje!j>uOUGm?y!q4eh6xD^fAC6*FTO%Fm9 zxg9})9Er=9QIxU2jG1F{!3-vTN{QXvgXh0~d!*Z5V zj#uL9>74ft#}LT7UaHj9x|S!&Qh)12)?sxkSN0&vl`efA31dqKol`jbstS2P-J5wm zyjFuJ_g%5k;7Wgf9u*6V(rRxGt3kKc=pSE%FyS$U4B0G<`IjH~2i6Ia_Ge-cakb_K z&?Z9%R}!h(k-ZK-S}jeUcw#Z(@ApV}U>dkzCYe7`WL2kmcx{ZVsb9p)cNb<$p2n4# z4Ikh8$42zMyi+L=O?Uy56_axOwcJ0055@|tiN%D!RsuEG2#e)y2I@C&w?1NUN5E1> ztx1WqqD6)pIy4GGjvD{Wf;Lcl%bDMqv>PF(EUiXiVI;gi|nA9 z*9O6yk!;S*8y4ts4%!n!SngtYyGUiRNhkFlpp^_{X{F%lB&f4yk(>r&&R#GJV!yF=b6!4a*bf(k}MAjPDV7tNbb5n=NEjbegc7^6S-9FpLOIo=9EG|gH@IA4yL zUKc90C${yq>sx<|%(rzS<}JY|J=K}a$kuW?Qh%lHQol`X*UM@Yau9BN@4hQkP0HfV z@sC5oQ(or)GJ{`Y(LH_VVPisq`dT(ReldQAerq0ED4`ZEcvVccqN&newWq=uGe($f zC{~Vc1+L96FpRRT=(h83kCmC_v)#|YQtYw}=Y+-r4Jt-pM`BpeR?Z)DkHXfFOA)Sa zp7ZAywotDWPXH52h!-233kp)FGU{x3duDn^B?;}2w5^Wa9;f1Zv7_f#RfyYjj}Bz zT-2eu&=(Z0X5df$VpMl~U=uM26a32^SB%)0Vjmoz$Qk8&uxK#%Qfh{r70Zp$@8I`k zQ?ncX^SIxzUFcZI>*nC!RO?x%5urnU3Wk;&4(osmxsgzL%1USh-sWq^?X9wo5{G>E zZjL3~?$55H|7MDY(piGvsOjPlVs}}qKdWP=U3tc8`q{0cREf4 zj5`H1ZF9%;Oh3oOftFd(Aq#JIcZf?y>w~?^*fmSJoZ9-b?fKd*qkxd2EN_QZeKx_5ob7yWJ9aVHe zp1RI}ea^cd%>?m$liLifNa5}P4DY-cvIJfSmbd>7k1lZM{0gP%4h6$B&8WtVNM<8l zgQYHA;kwK4YWVe&d`%Q}-_>41py}MQVI+J#%{7|Ge(09J%SL7H5^YYGV1_A23S8c? z#-k2?w3~fJ@$$|dz?H=;HT%4}u1dP1pKdDyRpxiO%<0yc>oz?CEAPb}W+#ctpFun3 zYI?MHnLra_6QiXmvv;G}vR(;!YUwor_MJu5AtbO*U z#W0{?H_M#mnf#I=reo~}Gvv6=DdPvfAEgA#PT4qTI#bRTWJ_tez`dkUnmsENxI}4P zrlPDC(KrsaYup4Ws$@fRd)>#HkSage=ra}+uZWgTKB!u35;F?&&gvR`T9R_!mZ*^j z{|se~MTx(>|N8_6oM(bgVZ10Z`>8+HZ&9c@1SzvG$iuzi;GzTwI<}}$?`VEpsbum4BS5nGx1Q1(;A5{q~ zj4|72MC3j93bazeB{M>ymh4&%k7Tr6n*n;Eg8JfeT3dCmh^_qffkG1TFS%&tSnq3#}w z$qB*a)*ND1Gmh6T2m3H0PtU~e!ZwC}&vToioBHn>&k0f5q<|?}jV^V6u|hL@&>BoT zdHk3G{9h&&1(j?hIo1dA#BVxPCX{ah7vKU7wfr9~Qg4w!pY>=pzxEde&`t9NewIMh z;Anz>(JSjAW# z!HRG#;T*U)ZJ%@yO1`ZM-SgH?bgQqCv%jnAZ$^YOseZ1(Tv0f%|+V5?0wQF!RTTb17iJpE{ zA(M3{xRG!kgQ`=24AOd1^KUs!9F}^lH3YXWX|((Fw4a;i)81@38j;&@GYKzjg*Bs% zNr>&Ius+HxxHL~yQz6#^x?p*q6y9ojQo|<5m-Q@gd>zDb%Yku=;{nx@@rn9q-?P0%`$$bZ8QV5F5Gj80+*I$*CDML>vFG{NmwU+=9q!q-tFY_ zR$Y7N8Y|Ec0+X6DsZQ<9_GMyjYfl9Rx{s-Y$`{tIm7}eYAXl6OGcH4xF8q?tx!Qzq zvvT9HwF;jY-p1&f)O&PERe3dQhMl9%mU1ApJVMq6hmedDQZ>|Vt2<42oQW*#@%&#z zOMUDcJf72*FXfV!Ph<3Sl_K$F=VGR1#_1vF*2u3;zTy31Emr2s%n%WSJ*Ob6F7h>V zq-sxl|IXY8O_L{B!*?2bB8MTC|H$TbUGFL4h{D12NO8zwteizZ7SV=(Z<~6 z3ojl({blv#q`Q434OXY7-Ht=@f%}BfBgUM_D5^fo4i+`l#U#QrH1ptKEFjrozsjz& z^c_d{GmX8<-@@sZWHQlr#yuvnl{g%f7C3$;lYIHKEY@~AeR6z7&%uOYmeO6p49tCn zf%S>08z`sPN1}04$o`upCx7%{5_WYSRmPR|a5@RLsaJvD_3ULRLVxZ5u{_nWUY=AN z?dsW55SHtGx803a`&V?aVW8)hD|~pvu$m;latdd2w_a%pPeYXNp_&s5!4MP zP6pelaZjz~#inx)&pR?-ytoF1M_&6Ek&=L_RV)8JeD(%j$3dk~Y_Z6@Bui*C$!ByN zk=DP2>DpXowY07nyO9=MOpby0ihx2+ORo5U(d?Ay`|1)e(wFV>xA;BFoHVJ=~NiHrPYSydIxst&$gj8|7YVNeb{0Zc?A_%1H3x@Ax67BarmK(RwY`<0ftA}Fs>59(_mbf8(m{+r z?bunU8X1l6h6v418FS7#AoI17jmdC0irE6F z7dgF{QTdn`bDRqK-Ku_$w*xs2K1DnG5gZ?)y}+T{XO`2e^WcHiae)K-_$0D9@xT4l zU*y#fzCmA444?i_HI9{q?f<97DY@Gj6VS;TSSUJK6VS;JFwpZqo4HuYP3nf#0p^f?_{`3O-tL2(S*+{-MPP?jDh~6KD_9G zdbpf3;x=6_jES3np~xdznhV2p!l$L5R<6rU6zL>&))cN}{DSo>GB0XsDrz{Che8+p z?T_G0=Pf@hOuF>uf14B!*y=4)WU)?$`{_<(32#6hxrbfytyGx?a60~@=ZC^FXGhVH zU&okhFvOB?L%3>SrMS@8MF%_BD6Ejc(nmPGheG;WV3^v){YtPJ0&b;^27_y1n zDTpuz+9WtYpbivSYM<=afD9iIWRBxH7UZX4-UB*3oN|^6SRf%ZR)#u)wgsZy=7JtI zg|V5dwB>Xcki2ynVHwh|uDq>zW?1;x%e#OwM=Vg}gngjpZdT-VXKK61^WQkcDo+aa zdHmawQv!Y`^NGr0Hov-xQs%KR^a(co0z#DnXbo|K&=qzmzk=mf>1yFLAUqGyw2R?y zBBH4HQ1IT66%2&aAT%@t7_gX#Z)M+!^Dr;6iz){rNd}Yz_!x}hBmz=W&}qOk`)dk| ziDsCm4YEi*#{2Z(ZwtCsAkp7Y>9J1a{3FnBFk;d4PjlJ=lIpPK{KcWAABqzf14xNq z!vJ%2^%=u5`NBGTc_!v&5Y)&2R&>?Bo;I9^?gnn#Y}CHma^Nb)M1S!f9>3my2>S&6 zO5rtqHCF~)5Lr<*`mZ9U|Ly71XM{CG7crK@<>b|SU6bwwUiw(F`!Mx+Ij^;k{;0DG zd1T|A*van6`_8S&IP!S2b@ySnsv2!_%5J@LM&>8W2tODAF3rJM{E$j{TB4tULdY#W^rpHo`+@K9iNR*!WUW&Kb% zTo6xJO%&%&KU#P*QBYa1V*K2oI`s8PLVdZGiR3H=&|Rud7>s(0b@`+K=zpQ zhgoLQe8hibvJjPu9Q zTll>YLw*uiQ$)_|YuIWbRCp=GimD?RLRzOFD#+CeAP(y3haEj3rcfV}bw-1+72q&o=&-1MV;fOU1yq?4MU_iqdtm ztLH4LLm%8xLDo2VYywB2)EVTWVz1fw4^=W>m#Wxv#IEWVtb5v3scSjn>GLpm!u|t~ zkS?6HYQucyAEjBp64!ysmMU&IQV3k8^|mq6r6#kTP&_ zSk+ip3+nHtFngRw-VitlmncZy^17XOJdsc`t2B2w>1Hox3<1r2h&ZEWp{-_BXX;SL z#_Bk?gVC$6R*hB5e0N?=ulCZ5b|qG?+R}^C(0{gWB?i2;GX97CQAT36f9Y?MnDof^ z(B#urZ7+a|$i9NxmR8}E_$U9fI*CGZd#4GQF*m+Bfz#!fx06_#ikA5dCEbKyZo1~U zR%LAzAdC)`UA1o*7#N#kv=w&(sx5FPv*FS#V!dh8d%v=&BJU{KtMAGdqE>}LB^0zl zSpNYcpF!Iv;!+2AvgkdR{?d5eYMOZL&|q)C5aUI_@^20Y-_UERDQW!s_9(W7E`jav zuA8?BG+#xN8u*hIqWxD9B6f3$u@DFaN?^RegJsf;lFg+X92K{iHT{UG?xmklf0&ax z@Ba3PUJhwxf_H;MVq1n~pm(@FWzt}60swYOGr9L5#Aj*TC*{!LAj(#bQ)$PW(-?(7LJcVHEzzvrwNCX z4?fQcUCmQSb#_1R`WcdLlsxle6r{lq!O*DU#i2U`(YsJEjg1zU{j&9nV7Y zv#f3p&&Ofg+sxi`W}^X@w|4CL_Pz)6-)4DxcH<7*uQt$rJnp!tCo$JQ3k<>yMr@O|Iw+~Jfh^c4ugt;2+%Tqfg@gsMT z<3fy)gTFbMLnq9s)*%6x;&NV$wC8W1qcevT8!0U=zWw~m-l>>_7h#nd=4Pc8r;K#-Thr88NHMk`O= z|wCz=mq3V_hY_!@@vxiH3!0w8dC$gQhy7JDB_k ze))AY^Pq7NyvF@I@%y_?CRe2vp^>+QIY7&RHde{*rMO1xZ2hnjHhich&-w1)u#uHc zRbUvmeuJ05<=vXzlEg`}CqP|aH?5g}k0mbos*y%81@%3oN?NlnLd_>e?aGrtAEBU9}?Nn1eG5~WUP=%P=AzgTi1L{Tv%MI~_{ zgC*_}BN|9tYza9;goft66fROQZqAOYu7F4|HU_@6U6Mk~4qsZ>Qmr9H-413koOUWE zdK%w&UqvR=9jbDjl4!=?%mKrt!cv2luw51uvgO@Sw9k6I-Q&%TFk82pDbMfi*oQ>hO%Ce_Zae&W`jbk7w#Moq8@o*g}~|Z zC<05AW3|J9q#r~-ajIscCNpueoU_jjVk+(FN`Q_OA%SJ-Ttz=B7)Xjx9JMa&)%0Lw z9YO*?W}(6GpB+nka(MW2e#8pu)DIvk;}E~(V@i(A!%A&@;2~D*N-pk3BM3i!Qo1n! zjKXNp1DkMJ6dE$1Nm2@5x)^C5x*7Hr#U{w>z6YUO2cZ2qoK+E}A%(&Vb)}!BG`0Nw zG7{=4n>%@VeWeNEIpmkD3E=__mZSv%O!5Q)Vo9PC2qaO<4^;dV19a}HH}r{?+v&U7 z`)+GUDf{L2arE*^Ct9o9i|ExI{ZMDkZ9Xc|6uTolSsm14pjL-`z7&uQ)zM}~!p&H) zER&U$86JXrAgVe9CUT21F~U0&4Z+cH{%q3CHWQ=M@M z87qDDKH&VkeA&VeCC=R-$hiQ>%(ni1N1U-nuYEP`rjF{0rSJ89v2*yqM?AV17~TpP zcn0x4CqRrl6;1*_VfoN^DP!H(%`}Rzd=lRgZ5nvK_T^-cEU>ntU$pDabN(14;(6W- z)EnNu)UzyV&xYl~Rk8mQhiT1NzZsQxvfix%0<8xnYAA(0EU<@qgpD{+UE9mj|!-z6PrQk$^T8#Fp_od;vwyJvQY~94(nrVf@8_DImSvA|) z*}1ucqapb9EQpY4?C?`n_qKFtXev8W(X{0SYwpzj&FP6et7qK8G3pIM8~LeqR}U+4 z(xris2EFV-Crg43qkMLH@f0&wCi2v&QL_|VjDv*v7{O4GEU8%bW_?Ep;7wVetwG!U zUL^Q#nXo6_fnlpa^T-E~l2DY6&?Ajz7Uv}OW;2-Is3YzEXN=4VaQ8#=zyMfv2%0Fm zSfCXBP~U|ST0pmj=|ZI`fZbm*_HWjvxuRA@y7qXMw!_GkW6>4O*%j{6)l~15cg_`B z@)b)^vz60%26(1a?a0XiC~046Xzq6B>tphm)oszkemGRH0=xktNZ0Ph82|5_-JN@jF(pNH8BXBi$G9xhi zA=M5J#wHYWlE&_?whl&)F?hnS+?X&n&13RE!-Qe@;&DU(@-?__+)za~ETRpJ^~t zQ2a3b|J)s00}B{7X7>L}>45crRSsBwOf>$ll>`e(i|sJ)bGZI&2wi!Us`G?CR$)ba3zWG`Ct!M)OH< zQi|rx|WcFN~ zWVg2$S%V|O>b42L6QDHB_M|S6b9n7~`2MnlA&Af_c*PZYwEQJjS_Qed7=rvcEY|p# zoJR{!G5Ez5oW}dk z-cMCC=sq30#Z{W!#X@`2L#8uIq#FMcnM-g7$w=51&TIFk5A)$4ic6N>Jev{pc#NQruN zAIei{)ezQ`dUXKGQ|>e?{J~KhYLcr{d~QMD@Q#oD>%| z!CPn-%>6PjotFBg0ofv};`*iNE|jbGLAYox7WyLrxT34_|ADCg1EIQD{Ra|R<<}oU zcOhTZ{|{uQ9~!U~Q>Ph>tFda`XCu0r+)=}BBY<|{;^(cfXdUS>Hya-$6VYx>Pv^j) zph!|eLqns$p`bugM1xDi$e|!lQa}SwgUq2IN0LYLNqxtzAWM=%b4fkFCO>U#B1svk zU=yUk9Z4bF!L^^AJGp$20@?UT@jn{7(r_r;u5XD6NtTha%v1)hwQ4?13Dsn$}_X*}#w#TqX;RIylLku+lc%o%ny(-Bh!FQ~Gp_8oSh7Vu7) zKX93^=(t!Rt{5n9mji>`Y4G+_+YY3}*Xabzs(1)RU5+}>0lLaP=E_=vKF z`KKBbl-+JGB8oRF@xBqH5JY1W@EPGp8ml`2z0{A`I-{i4pn+O}Jf4Ra+C>0`v4lD^)9iN}=(3%alKL9hH% zQLv817Sp)qZ{B=vJ3M>D`>zfXLWzADrUy|?RehY!&0*d!5wgAWC^17cfZQuu<%<`w zRnB&F!L=scrl}0Hlr{*P2*HZMmh;s6nV}sY`ZP#3>C3q;bzUZ_<9d1Xb*a{#19lOh z66`Hz``7E(y~phV#%tDbRM6(n$iwsl@Q1hOcII|wcKn#(3Gs0WQC}oGLU2cf9e-w& zj$V9Bhwes+6zWDc6SW_mZ`H4n+5*+Q?*3%@;&ZI>-d({@h!*|exed@>Wnd6+SU?&1 zOHbOQg;ib(&Qdt%QDm>i5e^rvpw&04I11F<_(5yR9*iD&1N7yb+NeH#DSpw_wQVK&wyUyZe4S1i+ z1zh9eEH)_>itvUehJOJunK6-ipZk|M*Y2yES#L+}@1pW2npZ;Hlv0=jBbCJP7Tdex zeD`{?EUBOCD;jn@6918nEsR|MeY7QHwFo7DwtcU$E}_Hhb@>|dk&co;u2*{$q*AvF zmRM9Abg-kjz$GD2Eu*;oSE1lt%8!99%e(o_3(u+a~UaoKY} zD`X*X2w_0*H)gifYQ8->(WGaiTG+9KqBqqc zt_;$}Y?bgG(ekwF=WPSBH)r0SLl`J>Pr4U`EIUj%Q1qrZR+$NkTDEx!+uh$HNIaom ztA~^$=M}uOY<;q8*EJuYTGxg}w>~P5)qCW6%t=P5>4m2+V+0uEDXi$caAJqmGJm2A zhekF(<(eVEfnl||rH#%{$J1tt%A{#NGC*5Mt)wq*)KL1jm>x!dhd+n6J%ZME&M2Ll+toyY2P9fL=cZ*@0*mgtiM_I>ql_%TR7 zrdGxn$01F1n+s$F?08#%Ub5nj)gOW+O07&ps~*2S)S3g$y(LBO9|a$gx6}6_K|w(t zj9&|T`8|pM0(H744KPCxWB&kt4e$R4#@q{I!L`8u0W=!_4QOt|Q9fX0ON=)v3hc~+ zJ6f75U{|oRonH*xJ&2jQ zDQgd?F+@`hs(Q@~qGk#;g&0B1jIXJin3`zl|9?zap8l_!7&R45?f(r=$rQlux;g&_A^A1Lv%jhMOMk{(hC7SA`a{-xRpDD~89YKM(DIt36M|u_&rTN- zz~MF*@HO@xNj88}=+?b5c=X8=C({(pfZvM>%k3X-&5t3N(<|R%_d6%u$d;a2B@WWS zCIJ_A2G9~-d^>miGB883)lvG{+7g;uf$|xjCFq!4f&}Kgh!2{643Sx&6`mo62|TKHBF)^EG<3 zhil^kRleJy@j+{9#Zx38l3WC%(0DeJ`PGf>bY=n1(WV69H0ODCB#%|~TYjlhd1kiY z&m?p7=C_B#R_B2>Zd{&^lGXVDEbNY6CDxb}jcT+ikF$z!dB2M-I+?~1fH80N8? z8a|g-S4+>^>~Lf&FvjhR(-EZlCB+#6g|9tq1Rz<0O7<#0C=Yb$$kfXs7&+D3%c;V z=hETIN0Yf5Q4)F=q%#@X-P~QXu?k&n!dUj$H2cSub#cD%2qDjYcec zU3W!ccK_FxKo!2$tJ+00Oo2oE5zy7Ok=AMT_e1Lb3jnrzPr?Bkx+j6bUfh#N$Bxn^ zaM%>O1PQA~ml(w^?n_J!cg&9CI5IYzJv2AetyY|zC5w>4yH@M-QHEJHLRA}bBqe8h z=j<4(o3DG=SsSB{;n9+WvUV=qXL}BsInmJdZ#kPy?bEa_OB}XTHWx{a!#QcNX~=}* zCA9dJl4N1+`r|q=pBByqixQG|aKe=Pr?qJUv21{&1yt8a+?PN<=JOc7%A*CK3Y*rT zfO5*IQ;3+QIb{E8d=%%S+d2$)zp3|HV#M8uT7s$yYW2!jUf=g=s`+y-SvRuvbPXzHpp+wW`_z}ZvobqSXqpOzl#GzTo3O2F*42myl?-qUi z3^<47%_38UJy>HfNjzUX$||$6ORf+QC8eT$C$x*A5lUiab>gy?h{6nKsna4?P^b_lx2kpKjCuX%wl$6w1DcpkvZKhE)wZG;Hrq#D)QvH9DfGBMli$;gN1yd@r~uQh)&KoSZchC=Ei9=ku3iXD7Uh2Djq8#5w89ho zO~|x9j=hWn)07e{jBWaG|3II(7G81ws@Xmc;6gb}!`gAk&Gb10>ya z-i8$}{u&BL9v4sTavX(=(cW~OWOZB}tiPn zd~*Hq?Pm{e-JvMW5T7pYuxbNERaIPW!TL>3wp-!jrj<^%TDGel*4T>6EwtTi=d@0I zw$f~Ib#-y_Kgu?zt+p%eDXv8srgt~Lm_9bWZt7cZExA&uu|F*mR?#(dj#*YPf2Fv( z()tJUJvFXYnVLSHd@teB$?DbH?basT>ugBe)7mtqeAI~4$P)_Qd)A5XIc>V<(eWKW zC};T&tu=mrL^b_i4v)@vIeT`V6G{vC*-)cy)%`B1ddq_bnqmhu=f}L3)w~cZIpJ>C zo1qTc>azq2UYP!B+Z{e3;`b42R&R4j+0y!0q>FdonCU&H;pIV?NV`D_-NMn_IbXWF3T*IUe;z6^zv2NY|CWRX3;y`^7c~m`A^@? z>l#(bm1#3+=}m(eKE9WM68fW@lN>H(jF~YrY~^s5y%fh$G3)rX4eI8Z(xNVD-09J? zuY9_oOIW5+JU#G^XRzv~9hI{tEj$^Pepk1NYx&HP+Kvm=aweXc`djJNKl~nBXH_}r zO_54S3$49+XQPL9*UyV->a*3kosK<^nc-FbD3>}asU>CD;$q>2qAzdx&Wd#v(po8{ zb!}=vXZ%DZ=S=HiFCRY+3ToprFUs$Jdt>79B*wGjcaE9{)Xj7~oK!DPfBEo+#tUnc zd+QEw6p%_zuKv^O{)q#53+ZWRFI}`Sd|lI2qZYrU`X`HU#?^vwIi7ohN!ucn?*(!f zEK|JLcJ!9jhNkSs@qN=~52e^{UPB%{e1@z>QHjHR%xPP|UM!7PZLnSKBra#>yvhlG zXMw|3doU{afBcFW;&R63+LqIdSK8ScI@_-Ti-T`zYC5=zFN1fREZ94u>d^+osU)Z0$|8MMnT5aF|lkAtVKiRf=Gll(9SO)8@?J2M>))yS# z-^BTS_786Ae~-bwH{j>jQPxs6Q%pX0L9=JGo`U_(up;*7b7m;8{v9594trf3--k!; z|33Q%Kk>)|etsRr0v_2Bzt0S%*|X;;_MZX!4LN=Sor{vf%vlhvSPuu!EN3}GT+0Dg zj#mG^abo*m#kLO_r=C5SA(-EKr)|czTjx92Z*kacyV*%xk!?{*@N8gaa=Nzb?bbPo z&zL@A78tj|%559Pm5}+vKUu6_10iz8bj9i7a`PQFIczoCvT`-NYrpleV(YSj(RDe8 zt-21We>pNVxo63tuJrf>lNNK6mYsX&iHL-mI&zyB&udYwRlKjupVRg1jqV@e+s#HkGJNl9tjg1#}j}6H<-{jy?n^4oyWUUgO zQCORl7}aPk=X!l}>WhZ$Hn!RMj0YL&oep9>512G}zdD}e;+lA7yTxth1N@4sFE^*| zux{w==_PW{<%Iv;l)SF1(<@KC#yJZ}6V^>+$&rM80mlm%r=mF5%zfjw;-M!N}J3r%G zMsMe{yLtH;6`eVEgMxZ>ZF6*9?DY>GXDtvMk~1z?=9H>QjX(NC!bmI1PhPJIzTl&t zGUpk-uY{Suxwli}mnLRSc2H%sa1&D|yN9u)+@Pr|zS=`0Co2j4D*PKeE-tmpnHm(7 z+1+_75kAy*zP|fnYGCv+eZwgWhteeIT2=n*Lg5#vnpFEMqu->;hrWA35C2+KK6`kW z0&xjbtvIQ3+Put`mP{}6G_QQ#r@=n7e2r=wI_o#3UcKrzlU`L9Xq4XA*$KZgqqg%W z3wqTeUm?7P2r2Zt;LRrc!>@?V8|TdWU92a7UtA=`Uayq@h;bPmVlQ2F&-a$KSSK;h zruT5u7&AMK&a*dDY_XcRjqAOZ)?_91z(Ubz*M^oBi_)V8{G1D8zpXhf_C9MriG>aF zV6b*AeYYl!^p?%NyDKx8Wv=m8~a;<=9g zQ}(!bc8%lBrx-mZo(P?1><1o?Jmphnh9&dQ9C`3_Qx~Ihd8t==N0V67DbI3^4%SY0 z{9N2p6%k~V!RVy9RgKP;DKS$NP3kT7GdP#DyxDgu#3-|+vucTNZfH!Alyl7fym5}IlZ>zJG`$doMd9vrgKEJN z*WIcn7xij2CxpvXxN5T8=DoN6h^=#+8p~GU`P*_la>iw}HkF)QI%!!qqoH(1dc%%R zgNrOn>~m@8tmv7tP`&+Cw$Z{URj>Vo8$FqvFw)jM%CC~=!|M%~sU=?A?;Y$N18+nQ zIPjq)J79}L{B#Rm7?pHowEtNh>9u#0Qb})W*8z5%dAZb!S{M-|Q);e8Pf$?1<3YId zU$;5<5o6+9dK_zn7RIV8Rz!{GJ;`1Z?_9TDHis}j0PO7d2Eti_q zOEOBIoFlWzktG*%<3)v|@7$hc9uYS!Y#y=8goT>hhg>oK&QXX@ZL1h(-T=>dGP(TB zo2x!KHTh<( z13aUBwjG?Y=SDR(j0LLvr>zft>^pNnj6P*xDwuatmG66{J^bc6jq?dmFd#R)<_ng& z(ix$kNI&UYCx4erL4{6z#Z@BNb|s$f-S#r9yiy>IjPRd1dW35v^tGz=x>LqA$}#S= zyvn*SmdMIh4y)T=SIu%zQ}1}17n+}W(LCy8D+WZcxHz<#;{7-e(4V~Ca@k{aEny>$ zV983&WKI|iA-S8Kb=k{jl;45BnIFur6_kfD0d zrMz(mIWeh|-aqC419oBgSZaRTk4avYu6JGN+$@}3Q(KTLms!(UuM(I)2Zav~0Ji)g z%E<>24q?HRMQAA|G>Jf&!J#Pf(MA2o#qpB_m>o1-2Nmxn()xhsWoL3h^IVJ8-?Fw_ z^(R$6xZiy#~K!j|W$V$nM+sxdU;IO>0wjduz!){ggEO1tawn^@1? zUXzz(C{{n6d9JRtNl_GHA+gUK$n$jwvg_SwV^}VJ@~;4nZdK~&&_3i1S6)xKyib)c za_jCDU5T?tdbyG~C9`WWO*5iQBmF!(yKz9p*k943j_NO&pp4mo0^<~;TP;3=A+^se zb>4Z@*TFs5JU;+mU&kg^O+x|vjmq6D8B2=S5%TGy>JnAEigyI%XVkd1HRg@OW{ooR zzwH_TYN^=v_GA?mW}UlEV2sAgX?dY?>8Y80u%qPuqJ#W5^?)dBzN3_@@3;upl%}v2 z@jR=tc6WA7>2eyqt3!POIs;smyc0?O`M{5fg=tsx8zl(Pw4gdSH^OMLWl5Vwr}$YC zxzs1Yg_Wxle`hh&zzkmRYHhk%jUy2b>{-|Gz1~TrTZG))7F8A#&GA z6kxFLOxLsC3JmS$m39Q+Y|LyQ7S?vf<2qwZ&mq~7P& zF`4y_)&5(7aMl^13N5zPm=+6_7?kj4cZ8Ul%R5@~aQMv6a*pY(Y7wLDnF+-`!H9AI z!vC}&3ZY(e0zR1s)ZIO2!f`f_;s*47!${OZ?4;NnE3^;ui29VHcKr{^?9jZrKfl@^ z2tf>d1@aDPc%`?z2vVqbNv=n+wd3C9%8_Dt(q9R z7H~FXIa>gE#Eap2GqrVyJrQWPd9Li;Ob6j1{Iv-zapCc7v0VS4D@ zD&d`oM9?Q-u`PSvb~_}?{M?iA7Na>e1q+*s_Gq4QQ88N768bNkmRcJ)nwPTKCv>J|L0AlB<=6)`#*gih3Que%WrK zbIn1Y{R6R!Vh+*Q6xAmPj1Ou79 z=d~mlqnU@PO*o=-L;pX5CTqc9{jK7_1Qb034kB4_L z#KWLM4c7{G&0D3!42FPZtFe%<|J_G9Fe*mkCZYTO}q{4ySonRHoz|((# z@1!5DLUm28yy*4ER54v*3p~y&E}d)?<=$c!Xw$8W`Wegrzc>b6OCUgT z`ip(MKSKds@L}}BSe2!CZoWTw2o*m^~acgksi@{`g>a=yece(;Ab`12C3~G zxBoh@4tOFCO;^Peh3?B}4dh-hHLjY;9wQLj|C>-T5xUfhlO?JrFdmcJkh)#9tEy77 zJb)#YjNOO|%*y{hY;BhcfSIEr*4hmbC)?b9E4@}@QQGsRn9ED*NHg}VmULdka)JLh z;Uab(G~HI8nxZtxwC$9}l8f{^f|)CD$yHMwYrFva)Bm%mG21U^oZ~`3DWO7M^b~?Y zQ_F{Za#u_}vvV7+Jy6w(@k?P9&`@{Alj^kooYXI{{s#!e*DKlT?oTO2K1Af--~46( zx#0H$EH}^}ll`U-i6|1qt&-VxevxceZ;C1AR#_V8|2KGa-PmB6io>`o^`a_8qkz%b za!TVqcQYnkGpR1UMcIKiUF)imMhN410{r}csap6(1Hu;`hYAru|E3o%Vi|_RC6Pi6 z7x$LR>_dh@Ccsc)j88CyAGe%>V@MVH4>ZQU1CjY|MK^G7j7*Q`wdD2fT7l5(j{8lW z$D4V1c6x) zKZqo8aT<(gWY9UU!T=J;=D0!kjDU5a|1%#fL^IXNbG@A^n%ucMdm}?utQl9wI}A^I z9w|)j)fCJFruc#$FwCEw&tJn!IknF0g!fkqcK_Pkh1&CIY9juEg-0D}P}PZ=UCuYE zR^!C}zg>cMKDkTAvI>l6EqM+v#ca}%TFb5`P|o85rP^XC>b*g$^h>gu8zexs-~%LU zETj$cjlWj<_!lq^1ZYNT4a{Hx7Y&N{2C=9Y?m8o<5t_*9-WL9`@j8K z&ADGy{(b@(0d`Zpe2hk8!p38mi+go$<*yoEy-OvL3pS?JMzM%Jd=5;-gMzfi~Ee^7yd3gqOFZ|osvaNh|m zfbdWQyqQ~Rp$_to|Lxa1(2CqI8hw*L+V2U*t ztjPTdjwA?K?SBc8$f5+M5MwmNlmVM&2RZ0YM}6pg06;l-I*;a5hN)I4h+FfQ2ni z{X139->!_g^ZXY)x`x+`8;Rl)Mz?052!+RfFb2SDOU*rMMiLICji-z=dq?`RK;rp-O1`#p8t%O#3Rx^LGs-!{DQ@QuQe#85r2kiS6IC}cSji%!oG6|?bu579u(JK9 zYKv%Omt;`-Ulo8_4Fjuy{)$kyK;07eV!XDsTPQG!;)CKf7IAbS{|9nW50A}<5umM~ z>uWJT-WyX{n%T@nh$FXUJ9t)fJ|SO5K(_y?xEIT91jG1v%vSI#niwR-fz|8msqXRA z13icO=BZ0#sbzNU$PCYha|495|5ZTv_4RQIXdgZ}uQG_(;(h7^WntDFPe_%Irk+Oc z-nVzJAx(;l`4ccmn_0Hk<6m zsewW1>F)L8p>ME1HAJRCGI+Y!544BDLvK|5HYKbe*c%8Da4?hcsDB4pQ}=q|S+j>h zL7pKqOFE2(W_wvFXxzVu%;r;C+k)LPn~Ce&2ARAixvDQsQ8V?-Kk@@5ROzkr8zNGAECoqgP@$Ft?^`#nw>@at{WJnUyU zp=Sls^+)yKj&^D9CgMJpPi@(9Omh516p!lLKi<|>j0s`VIHM432VW>d+Vb7Gz)(9WVYPQiZQ0mJo8j9u9!H`{x9iaKtM^qo2QjMzu38VPaQva*QmcE zW*?#(0vAbE`CE7Q-2L_Kb)*hf%iiv`A2r)x$3B(FU!OutA=Ja<6JI!v+x7=PjozLumtH=`T2-4Oi_Z?8 zu>l_Iw*Z(AgIk1njr;`6-r_?tOXZUdJN;=BEu|-)=fZzVv6Q2d9vs>z+zx z@9R!_%@k8SUH$i4QK*nzb?ETBvz|mChjV}AOc_l#RIdKrRiypIyO*YZtW;x_rC-9y zBg23mP{7l262VV4%h6C#rxAkg-VJL ztJMChA;|>%H9$cs7cMEKYspC)J&ueeuy6h!BFv`tmWcfQ0(fQ#Z=w?+T;)u!oQ>@( zxN||sC&}Bfpk^L$$M9zgmu|I~rQeLGTdHi-CWZ3Go$Yz9p4%yf^PIw(Aco(A`(0H{ zGG35ZtNt|z)gKikfGmzz!37#^Ar4B6mrd27mFQN2%#_6B_HO-SM9cMWOlm_UhWc1U zxounSK(TE;(ahSLXNI)>=Ib3cw(HmUD+UlFJN@n?p_e%Y-JOZ=WaB)$uY*P?75xf> zeNnHavy#)DvVPcvc4Q@ln(_$UA*AdGC4etLO2kb8B=f{kt$wn97(VG(P;_^}qxO42 zd{h`yuJMnGL%MkIrx(1XsjqK} zF;G>R-q{CNCeLRMi=KvbejV+_Ew%xb8gLab*$4c4B2CDCBR)xurA_&Dpb4a946-{W z5;9eH4hX8fEz{0kmeu1bwC>=vu-Q(E5cfswUL+?M^W}v#J6DGwalUV?et79k znR`fz?IE&VxJl)dv3end*T2PnE>D6xSR*I71&q3^7^K9?FkwIJ(P@$0WIYa#tHU#UB|f7?-__<|um6$1Q(ci4M@oUN?C3=!;kl z^8wA?uZPN{-)aR|pW|JO_*j>XeW`zXWwvs(-TzW|dz}C%bGK?HU76|QS#!l9U47bB zB&@lMYP0v^5rBoQl?!wzr;P863zu;*nc&*Iyl+h3$>W=e{B9#1Qk4i$f@pbgHYPv6 zv(9dM21~(s9WH_i<|^Z`d6!t%nkz^PlU!cAF@uquzbLM3DjJdb>)p-~vWD4m*+a#x ziLO(##ugtjmffv6;ZQo0=fj(Yw1sg;ffq1=Yu3U|GV9`OPP=SI1;wo$0a9J3`a2th z0v~gmU%``*@Q1C>kQ2??Yja=bDGE+~_g#8RjYOE$K=X7`IE0V*GSH|-K$!$MMR4;y zg^UH#A`wa~bhQz>A{%cuN9Xi?xyN#02_wV@Pkg`Sb8NtEW4K4vx*3uzJGJ!)M>vdGGL+pN6g<@zcB^ ze>h4WUe9BYxa>xVTj~X=AC_neo3;p9GOP5t|c2ro=nyoRz zX{LFhTcZTs=@38?r4xS4Aa?VF1e@3lZlZPJn zcyj1S=^S`QeVVBNw}bM+sO}jVKhjK9w_R%$qDaezi5mr|CTv9E685GwPBh;5hA)4j z*(&F}T_dH#WU6&{QKUsp!;25(jYYq0UcA7Wd2Sb$T-b1|BYO0&`t~#N6Ibgg!TV6r z^H=04;e8${y)M)royEF?utP84(`wiR?TCfb@b9Ev%&kHXm=kImu}~^^4|*m1I`knY zRC&Tc*$1m$VifU?dgp=nI7(+n^H_hTc~X?H77-YS9{H=XcI(xcyALU+DNA zj~3KFDB~Q8HtwXsWW0N5C$-3fMIVgt3i=->%2>=wgvgMj!Rw>HW*L?Zmx5dr%<>yV%Z(LwIf_%QGeq!A{o_*YIrW-BdN1@}y zkBqIWN-qID5PDNEI0-#@Y&NRY8njDMk8_V|K0lo`>=M|@9I=-ArZj`e^tkO+$Ux+O zhm9ikF4o|L8G4W7#LvM8WTBzhF3`7L!lQ$=KxA;<4(haJU-Kz(d|yg%k_eA>%XnN`>RnDMf(1D)36 zK#rARPrH!oREze2v>Ci3MQcoveV}h82%+WFPDTe|jBF09n{AQg&qU#KAY3+=uPIF@ ziP_0ePA)zt-|LB=j3NyWi_RXq@4eum5?t7*Dh2e@j8{2BR8iUzbL&`@o|5TNP5-^- z(k^D;&2R+p(;J7cG-d9|n|`iBhmrX-MCSHQ2nl%YJ;LAHS0+EIsn1%T+`HEmjAi4~ zVzr)^2l{rDrdz~aL!qYu;v6~`>=kG!;DqsLdmtvqWT`5O9yEz0|8TJbt zm*jsZ;|ThhTD(eF(ujkjX>_R(2gM3Yn*yFtwZJE|o5y;gvQFwzb!P|pl74b7}5RS3`4wdR`%kFR} zGM2p_p+#{mTj88{e&E`xni{;OXRc)4Z05%SXx)%dgmq)u@;*VJl8di3o87ZdP1D->Th%cIb*8+8dlgNdLmmNc>DfJhEm8U9J?>W;4ww0Te3ya7$#G zX3VYHFmcnPy4P#Nw%CsFHEp|Hn5gJ#inlXSUe)~;eb;x*7HFd~BMbAZM=*wEpe^8~ z*OxM1^t_A^Ao5yHXi+dSXEH<}ONOj%xEw8k2te=w78J1%*$ITnBQnl6(ILN-Lb(?Q z32Z?`cq4!2u^A4U@(8{Thx`HVEg-?AMR^^(<{I8W54`S!HRf z37S!1JraKVOs#H}zRU_-(PG2%Xlcxxnqnq3FLP|cL<66 zPy#iVEk~faSa680Ad`KB_0< zmk5;d*=1Kw=+a2d!$*$kLhXb7Zq+}vRACse>tXG|LRiBHpa|>&U}?uSS#~$ z(HiFfGP_`40g?5C%hOD-@Oa8t6rJmpS9ls+TRoyd(9}-=WojrZP$K+(HPmGjCmlXP zo%^BUvt2``m;YYMn6Mn%yMVqiQRP+Xoq;y&eUmuA{Z)EumnIRJ4rwd=bWt8vj8xM=nF~Ih47?2Ic&o)omlG zDyMujd6E>qzy13Kn!0U*h%ZQyj-B2$!Ncv^8A&d8eFS#T%t00z3wV!$@Nrv?wrrSX zB)=9#fC?W_(S)*Itbky7+D@ni13GK_!n2NLTaNkhM+Z^b-tPv0$a=_lL*ErtKs4@q zuF<-z$F8J;z~f}Ca#50_l13OG{4DZHzZKyM_Va*{{+pCZ)4bb`&a>2w86GXV<*v@1 zS#DdM10=bKN)d8EqS=VhZ30wWg9X`>K@yeRc^-VXw5ii>I1Z`SD-b9T9J}{UU9V6_ z%*ARED4(r=$_rhUKl&RAseU7Y3~e8Mk@+_3Pp=B>IVF*Ovm8p9C8JY``kSnUzDMFX zxgS6C@wR7U1s!Ocn6vYDjHj8pV`D+k5WI&#;K4E%m3^lx=>!i&rBeH|J*dEhIuo5C zWN;!{8b=8j@HP5%W@cqDt*2!!NW5SFucomiPUs0EA*m>L07hU{ zm{9fCf=WSHn}VM1@oFIwI#M8(Lha&c60mQJ6_8r9wbLZM4JS!>zbH%zsJ`C*iey|A zc;t^@VEY4=9+wu0N*h?>1rDBtDDi=M(F)nbQOrT~44ubLI6&JNUZ1M5n^_DXYVAF> z+1+Ql>`G$EQt-P%jS&Y3D|b6-oK$Nk3l$V&Cv45LFWnlNDaY2V+8&V9^5j&|WuBxX zm6|-&dbIo%(ci#Cv5GLL7yQCptL>6XPot2VF|*q@taL{rn`47Q66MA3QD;cZmPf2d z*)JMr@4UEH#k#PZVi;+!hA={=-{E+@CwXXU|#FC zw&Jv-s?To;l|6RE^a{2)6D% z#yn8jR8q_=d6b7(J`T#^dmxg42hSc%e&oPB%?K!bWYOW!r&O)SM=k3b7P97;CeLOO z$UmBKJ2iQb`=Git;R)3zS1AC4hJE% zT_|(2_eCJDpfseZXG#rXNNA=dvo4g+MUiHo7VQPvgD%RzW7dYH&+FTz^i)dxh z`fPIID{FVa|Cs&^41{bNvr=K**u~+|!%@BHCvdh3LhaW?l=1qCres8!7e1Dc+e%1n zt5(znv-%xfEqNA+gh{xr#Z=MP(pe;$BRV1#;a*F~l3sdxK$x8{qIB4m!?%T9OhSSU z7VzbT#;Tm;{jE3aekeUu+!QQ2c<7I!2c?9@>u;$8A`1%M&nN&$w5iFXLxD2R%tuAy zB)>$(&W&bK=0$6qC?mM7mz-1fCAu8slXI4FsG)%gNxv}51O!Tg>Rv~`bu0bxyDmAP z_!)#79UWPt`t>t?MC9}OS3F+-`>iuphPtuZ;s3=L-z-@sD@cyr$cS*QLw!n;K zFEaSfLecMjWG(Z0L=SKJa-vO#dmR0pyRRa9(l8+h%&(HNgzt@r)Mw>2i%@?}bUG18 zq0y*!&Ln2|7oskqlHOA$NsLL8hst%~wA!$yF3O~-mYIZEkYNt@z&LUS z=3nV+x_`^MCH50^#m>LFeWb5vb3-(w4$PpDarE1m5BytZR*ll(9uX>(brj+u6*W%8 zejq{yM2l|<85HSaJ|bj9K-`-wmT5MIabltmLLcttReC9>zK;7I5G=gqmAaj}o*LBz zjmF)>ia!}03H%i4w36?Q*3a#IJpY-BSif39mct&s3 zCUDyAR;XN4$3-0ahD?h{?qX`^({{mYsLQ$v_Gz;+s*Vvu@jV=gAow-y&t3LceWQE* z7ld5F`wN9Z>IM0uMo-N!#%HAT;&|v43=`B>)#vEVYg2H^gS-Wrn*@f#D5Bqqj5(Z0 zoo*N`_eiI-#%4K`K43+;kbPeG-`m$0^wmfN?T;|EC7|6b93oBn&SPFhbs04XXMex! zlb{a!U8R@aF4*DF!^;o|6e!+`T4o>?__A&zs;j3E;s@LgCi4&4UsnEsXnd?8tZc~k z2lo@r@(9k^c_xcYMMMbBh3NE!J&G9Bbz)el(5e9$wC(f zl)O|n#;E+SJL-yxoR#zx=K%LNj2)R)h#xs_0Bv(el@!|g7jWVn4Eo1p7=x@i)?klC zuk;d}a%-I5UVRCa9(p&dtN1R^9PN+q=`?MBMI-&_8^PYoQ1K7O`XQx?YnUokhhi?< za`05u<^Tbp(NLH}prg)-_IaH6B4m9uoE>&d-zNjUUSh4_;3$_7qYHbAc)9H`Ws(F9H`NV1g zGc>HD6hInVPk|LUUkBA+qb?dD(l`}#RNe9-5JhVL(xGftf_}^{)+o6h$5`R!A*17u8ffI_;-6hEdfWtBpdWOrl#qC7ie?+ET z(U*T3qTLhC##qU=$kI#$0fbacT9o@z03rZRGA5|iO(?$b*9pcqkY$;Gh>7QvmM^~* z#$@?B;)l<9*Dh``h_(}lcI)E=V!vGg^%hW{(i3J1k(NyeJ)_^;BSTey@F+nsZ)FYoupcM${_}tl(sTixW z2NY39Ra_5i^4PChda?X>z2KpLZJe=wVCY|%wpc%ccawF|rSz^LY=*gCl=!ipAG;Pt zj*Vg6F{77R6=q$P*+}K&-uav$J+TH6i*(3l=r?Q;HO%JWYH+i^$=l>K<9ie3io7}m zH;PGc6}hkY4mlc0?h=f`!x4#g+4b$8Jrjur6kEdbb$QzVgd(ugI4Gqz2(~ph^#*_x zwrTHTdyr%P<)(DRkf+3bw9vV(Yp;&m-;EFhjU!5U(BbAVs=<{}1FAzTZ^M1@MuGGS zvqC1`)U8JO;( zmiR}Mq(Pv&W2tTpP(g{w4=gw%Sby|2L~=xff#?dnTHjpu`b9wRE9ubt=pC(gqEF#n zms5N_3d<6|EGWTy2J@HFsW>pr+PlCcuD2#tiO4749>x8Dz!%hU+8Zq6V8@dTV?L8Z zD|fu7!!XII=5}h@_|*z1AjoCAJV*jAhIKZW>jgfU`Oc%)L7x(7>I%>_H43O zi$DLuwo;}np8YUz)LPej&T9|-hvX^SXQ5Ur62MhIH0{GsU{kmvKE$i=%pg$&bjiNho=LSn~BQ{KJQKqiQn>P_*f5 zz1*&Nz0$w~739>+*Cy@+xqyE?2P|X2*HkuR4AhH>0WTM#9E~KLGi0=1{wDSiR=(~AsuXeJFV_tHCvF3Zr zWhiY2NuR$tEqp9B>snpnTMefDOtb15n-s^Gx%QedV<%UuUT0Po!bLGhbpjX17h?tL z7oe1o27&M!Hl+Z2>qd}nNKT;Ot#YdP{OS@1Io*(b?yWYsVb-U-EH2#)Q-fa>-zr2f zzl#S02se16(RYOctP4=r0{T`sYhl@IOLqa)_>^j_ZkMgH@6vL&`SFkCHtU9)#$5{@ zN|8py-1Yp7Rr6zp2e0bB?7#fD!T#w=ohOF5#d-eF7~J{hP~D=mPP;3{goY4`^Un(% zdM*Jb6Ubf?3mvUg1`&dt61ZT?pgs!)44&a`z)Hgx@;P~x}Nmdl#ic1vT(trg=twg zp!-;CnHMpZS~m1P7GUZRPU&=L#otQIdO(Qn$mvEO!{UQ7x0l#KvlsPCz>AQ@588=_ zxQnW99DZS@VM^Fi#FF<-4-8Ye-#;Mv`RQhgFKE67Xf6?ws1V7Dl~HO0L2aTL$e=0G zNg4+u>4~lfdW*82s#v`isWgMuG?&0}gf znjxQk^x-%5yfbvt9cv})nl1FUY0chj=VFjevjUCRQDt9+z5+gniD*lZh!ppu#1{lI z{7q!1@%7#UV^cRpTqmoo%vm60JfQ~ly4(mQw5S9P`_*R-RAcuV+#FF;$tD;_*4BJ( zvp?&I|gH6V-n3EGa@*KLY-q@ z=IgNR>%JPlcw7Mac<@kUx^v+W1(4_ydMrpbQZ3&#PDOjf*q#|#Tc@Vm6n9I~<4%TH zMzZ@mJ1&?pZrhB5F#FB!3`Ywy(5S?1On~a1k-*k>Vu$}UU~VKkQ|1&P5lEA|h$rH&*LxBl1;jnDd zLoaUX@o9~Fwi1m#5X09f)|GCHyb-~8z0NscIXmgKKdcWMR(msNY>X8nSoFa~5sivJ zP>bR#`s8fdAftrZ8JKmd#v=Zmkzv-_UlX1nt&vUE5u{r0bIJ)9vSm*Mc+&}xS%};r zRnk(|^CAc%lP5&9vY z@*O&*vh5G_ZnxhJE5{3|H*VLxEp$C>v|FKp=d>aC6DNdnZgSRtAi}I;=r9E{PU-Z% zfer0!%RvE1HEzn~2&8SodSRrNH6;}3`0K%QYvvn)=H27vSzYph2vo5x2SvN(llA0f zKF{T3!`yC1R|d^Tir9qF2ewW|9Zk+S{mC@*NQB@?-^(+mmYvhC-rEC%t|>Qb1)#$R z6&wNOz5JahsmukQyNzfig=KxibSP2RYQgFt94|sJv>drWhg-bxSP|xVxg)>ao&`46 zTy^~`TCRH+5Dl^sC^%SN98^Merjery}EX4?n5jJTv%+sa3en}&|% zcU)qzx4`W4_T~_fePI!dY*-ot2FTQ6gIpixk7)WSTJ*Hx3> z1Q5ivzoax?d`nax_j*DsLy9V~KI+r$>zCxwB?!o;`tK_z?{Seot(*8=G>549Df+Md5{aD`q=Ra2^gau?|wvOzV%Y>4E8!| zq5h;by+k|lS_o$SKB|~wBZ0n`RK+g$h6Pb!1FHgTE{;xL5W5jh^mph!-#cSHQa~hM zo@!e5Eh#VJ#jV?0@YNnUp$}%M`+a23b{bw6Vm2^RkHFMDx9418YTAOs0Hw`P6hdk^ zpacM1DHAvX=254sNP9j@cE1%Gx_FoL7wD;avdpZ8U-)6rz60JqS9CJlx0#|lZP+NhirAkdd=O6sw`z{Gq)R;EGM1NA>mshc*B6TFE* zW~{O2UWMd0f~Jbvps+Nml^5DP2u|p#3o9KS&3Mg76;&&{;#vmtF*=kazR4-dx3QKC z2}CdoPehRlHjo}C+H5#!hW9e{ijYIYvE`X$O}y3>Xi>a|@r!VPT_g_9uNDXZ(ZV#wGJRZ-mBE%LE)@upyfgjz z^u%tq)D|MaC;PEwPL#~bER!JMn^HMa7>db+ler%t2cw|oe=D*LVtXGY6Z!!Bi-Gg?93T5>@G&Tl(vh;>pwY;Om20l1ibM9PfvcH!5^s zR7%b*{@|qaE~$~Nlq^ZBp9py==oUBn=zSzMKcVWF-%$|mYgUl8^z@Oo?zst7z=b?` zs!u}7UA1AM`Qv_jZ7j(Ny<-4+SG-2azHN>?oA)GUh2AA;P$^Hcx58BVf#_Re(WvRA zng6@)E>fKX{`a{RP0X5~`f)fbC{cWGrS%CF!C@Kl>3~KVM5h;ZHeDQ8(`e)w(j=38 zc=DU2+|R(3tQ9g;mTVJrNe8Awg$tQrP^R;ua<1~y=txaUF&v3RMXr?Yu*-doYyEl6)+PLeh%NM~# zcMv=WCBtYdRJ7F{m^n6PF~bK|AVea2y>U~U2zf0Tha{ZsG^`Q?3u$1!IFhc{bI41= z>nMs#t-uZf$S2+OTTxguV zs(C)kt9LV^w#nXp#52qu?conlZ^eOX{=e<8_Hm(cn6YDNCg-A?x z5MjsJeTq-emYTWKiwA&ow^hujUk2YdG?qo9!yR9Y+`fo)<3L2cJ#MGb?nNNmk^g;h zysCI4{Yvr+n;5xF!wIpf)E~hiq0dk>`Y!Jv`YagzGYrm(?Ne&>BgjdCy`nHvajXug zrGmm|Te?3t_5c^DqwiiBjY;{|nE(fx7`u^H__ZuLz(likq3fOVhCQKLWNv2;o432U3SmB$BhCMSBL#$w_PFlPO?E9YXC%D*kY31v z%sYD?<>R%G6S9~XXEU&Do)#ZCzC3HCb)g3H;@W%LBKx=vML6V+?3++Nr*wM{S2G>G z@`6l2hmR(f@H{9-+|Dkh8qq_;qMv1T#b5Xl;VReqwZKz!M{ z(0ezzd*^LLb=Zq~=G~^tNcm4ztOFTeGTuNm8hrGe$Y3~+06{d{@;Fl3Zw0+M#6&IB zqYc>vxdv{55t|=x6|bHX8vXPXV7zEkP$Eil87UJ@4ZIEFE&&I}d+9_o$_lTd=UIBy zgqTZMl?bQYKed9}GlI=0JeR+}5y&|nOc2f}-w50t=Wqr-VGzsbXagmL+pkJUB0Vk4 z)wT5i>eqEyu7zu%R5&z?U%wG!vr@eB;mS8q-=hmt(X~rJf$4@EfT-XcS9Yv6Oo16k zuS(7TQ6E?y`55R#0;vdpAQ*Ylh1?5pW0bz})M7gJ55)f0Vi4)(vtT-;im_WNBov{S zXL8mgD(tFw=5GEN{rxDU4dNR%NAX-6ZZ>n!er(DM8YhGd=+@1f-As+7C9Nj+8GTKq zOfMBQwGa0AjZrh|Syqq2#V1!S;&JO0U5W|~4%D!h%3a{gU#x7}%m;rkqDrr&SBdQ$ z-ZF3-GP)_qe&!j&C6WA2`dbWk_8yhw>NkndK}@1-k-(4ydKVgkg0V*&F)yN`8?Xw_ zAI&14Q9MD!gx-m2#-=`V5QPP~w`J*fRk|b_D(xn(jxwG(iq*jg8wyve$Dl*2M&mc{ zjC88I$EUCF8AAE>!oiW1UE9DHBB0Orj@6%oMs?V*4lY5B<~fOG@S3Q{l1R$XKH|U% zC_==`ZfS2R)7=%j0*Ek|A+H5u|8;sP8bcyU0z!+?(%g2g@2<@y<_V2^VtDGR+%6yT zJK10&q>x_+82n!xLzk8%n&qKeo6rRj#u#I*LvzjUhYfQ>9oDXdx%VOY(QuhYkq?ZP ziBMhPkFOyq4D_{XK{h+@uyC5(T;rWVBgQqHRkm%#<)fOWv3uc)Kw-BkRcc_;U9c0I)i>YRK?kSF*nKbD7x6jP{OGQa`4XmS3q-i> z2m+)Vk=M?CQ|6NuC`RPK ze&bJhPIaIyw7)Sq9VWwxJ!$>$o)}ATH;x=Dz-@D}JbP+YZmj^6zM~^_)(r=l#;_qW z)4ZYeBESV5n#&`%B$+igM4z!o4a#?1p-R{PP!>^ZZ93-VdzgI-GTD(MH7p-yK?L}q z3?nW8V`aBz!J?baDc^=^yXIJD%A0xNXI0b2NN}mj{R}}{`ok+CPkE>2j18J6!;?*r zhIkXdwdm6O8;Q}vv%e$*qDJg?LTJ9lphv6{mU$D@AfGA}pqk`0nil5PB}3Oa2SW5e zpL@NY-=pCf#Jj!8MBp)0@WRv^mdi@jZcMjn3NW=EFJb8 z;4I#?S}&sx*Z{npgTjApEx3Ri-v~(nJptbv5asz$JbMPS=`gKC>$ZDqWYaz?J;^Yk zNyBybNNJGW5E?YJa!@(qyB30BYVNYZ;&>}Z^l#X*ft(*VPhZ%*n$cqkcMcicxI6zY zZ8RFj1@o#t)+EsUui&9$)PQ@^DTFrPvE-C;jO+N0H=Tuv&(8^b=W;*8+uwD8bF@OC4ws~j4Ygr#eKGLoFi<)2F?IL|-&haN`}uG?nNe*I zZwc`E+VHQqyN3i<_~JvzV#w?_hXU@$|JE~f_-!Dl9%~)s=k|JJI+epAR>6zJ%;MAO zv)cZ2>Fj4eyC(`6YQQzS^){bx4KRuDrp0Lhk0l`gnQ>_)q*nqcU zV|mRGxz+lNYScP;q`h;1^+ry03ea}1rHiTatj_vWU%yC<7N_LahQa80=jp!c z{6_^9?`QchI%G-dr%jKOX*+e8*9yh5ma$>~7ceD$e)IfOp5uF;f%nc1j+IQW#aJ9I z>>)M1t1Z9DVW;mUW$k33aQhoYz;m>PGzn~|*pcbZEJ}WG<0d3JG6?hZRGZF)^}S!8VC(#Tc)?fEl?N>_B0xstnPW-v2;wo63F z_e;vv(#Hj-ag}LKqtnoLFU(pwv2Xhy1 zuSSkUH|P_0YJUzl;qU$oubgvfXKDFnQ=sIU`BKUh>kP!U#h=u&%!K&od&05fzcD_&;?a{aS`>o0_c$;*J{m^ZGv~ii+4Rf{1B=d?pK+`)qw1oWOSfg^GqTdX zm^w`^sI@u>yy(CCWT4!aj}HsoI5Nt?QSNzBz!sl2{CzXOAnv9HrJLo9rTbiTTOL{Q zLD>xQ%R?&FHeUYeuYPTp`zg`byABrW62H?O%%3BA@Dx?;ZDwid=MZ!8ul(a?*Jd5^aI*pd*kD2A`XQx?9{kr(ARc1ohPt4eJ^qo} zB=FzJ3}c2&xhWgg*&Ioq?R#VO&+*3I)x}B3mr&nC6~f9pZEzG<GDXrw=<;)Pe=T=?W*!^LIct~d~rOUG#QY#oV=X#T)a}OX`O#YC7Km; zxi&&uQ18?SPom({4zeX&bsvJ>jmMtP%3_LE6KU-0k6}~err@F5Rc@jQE4H}uWvZB#-1v*#tMv(C9R8AVmQc$6}SzgRJC=&IFz_M_H# z54*JL$fjNO`gvm#eBvt7D$MJjIaX|)D|m3i+*gwe_P^MbrFJ^5inxTkshN^%8whl7xnD@{6b zsJhgm%qXcP>-Uep8eO5uvsU)r*;s=GkW*uZ_iXN;$_YB+OLjL%3##>#p8!Ojl+xW^ zh4$7fvWFO1t@+R^#y@F46T1=;1MG(c{JxeFGo^S?MM7dR8Lee!EDpMCJl8256pE*} z!#&pL%@zc~RkJhqYx)Z*`&M)sAoV0P$*gM*oi`)P0p1ncp)vq{mM2>>dEQK3@Pb)p zmmE*&D(Y{G&>d8kOM-_!{rR^!Ai|`>JuA4ui*Ea>(i1631sW9YZ-IW?HdIdp3J9l- z_z|_*7Q<2m%N9Gs^*cba#mrb-?+K#m!!fgO2FOpq(QwpxM~=qikL*bnR2BIrN*1kw zWxB0N_G;FlUwdp~0kX6u%hPj{~|$lI-jC`1n$An1U+W zKgI2IFue{E(M8yY!;v%Hd~}C|uN2VVAF1i_U~*PhC1ZmCqJRs#s_PNkfri0`9gf6_ zFRhd<;;Ik3=i3$KW~J0t{xAkUQO)l>GbRn{N^2(|}(vJPd zV{p<>QwD1TnqTj2tXVU?i+9m0X9t_B%fEet_WS9^sh(D)E>^i6?ERd2Ob71&o&dP} zA=SYtN+4OtmmhB0arRV#f5t-)&Hq|U#Ir^hA_O0lnWJL6tz1Q#ajx+9$O>7@gTuhx zHII(i^`y{v$b!S0-03xw6JkGR7OQf`t8E?JEJD`ENl05W{Dt4Xnv=YvrO45vOl=xc zPhxY3*v~Gk!2sR|ob*TCq~9_gKLd}`ewk>%zl{3o|0?GJC!{$ONzzE3kjE+S!O@(y~D$7>jYAQyd< z3{Qx04aO=ojz6SCh8(i5v_R_?Mwonj!=(3Q?6Y9J?7oTQw@+aC&>eftM}Up8ZPuk< zvO6aXgYygbX;Ho*tZaA6v*`Q%rA6?R=mx$0FO5K!F)M7XWx-@gM8GfR|s6ifpu438B}IyQ3COwv>32EYQ6C1 zYO_B=AtJikjj_q$imM(d8p7k5Zs(lP7ykaGw=QOmOv#mey%RQ~?tuKBMIJ&5dzoerUL3fXnnA9_piQ zX^?&cl+xA;XqfgorFSbzNl0f zJwM_E1E0d*I)s))u=g;*>mYB`z7AoqacJ=!!}3>;E^@V=?E&RP*{+A9rjl!#{^uPu z%mDdj{tq7sCPi!7=tje{vuO9~dTqLGls(H{o;QO_7UU=J@l8c(MO$lsN&1c^$-Gcy z2_%r^h>Mn*Ak@hk?}D z8+5NZ~IlkUKx#JX#j>=y@^y2?WyYhIb*Df9shEf_KWh*feT5eA|GD59bWV=1)IhRQOwWQnn5o6LKj-;6c7x88r=+vmRBd-MFx zbI$jC&-Z+v_3}nCuHGe}Mn{J_ur&x_`DL3E4&~edLK6x(yJQ35n}w8~wy^QQu1)`p z&-JorxF_ZwABJn<3?8IDSTkD9Mu-QdS#Uv|IqaZg*A3TG>zEkj5 z=e(wRMx@T0h7@a!`+{0Gka~{|SiISlAI-E;+3L5$!fF{N7{&CZpcoi(@G-o>@RY&| zq-3Y=fs2#gfaFz`Le4nBxHpaXisulJEQz(I;e{-%A_B8(k$QI0F|+L*vAfU7tgAG4 z&SU;O`&`g8!`55!$JvFTt)LW_N9b< z<>LVRsx#r3(HsR@i#@z&qK;1zHjaydR{89D%^B=y6+bqwo}S9h@=3*z5nP;T8Vq0t zYyB6EY}I{PD!LNGI?*E#<4Do$}8F_;Y_i=MNVHy^e|f>)59Wv<>_L24EID>0`J4QSR~M78tiB zlX2^0r*@3W6Y3O1lE-}}fWXKbX^E4<$$GmKn}q-+Wdy_TWyy?OPOF?aR6@|Hi|q*8 zw(`oPX)@e8px%O$&^wV_Oi;F#H=;@KWgma`#@fD`we*!h0?vRX>_&|l%pV5!!=z*Y zFP;_zFodjk;fU`@8~SG-)iZ~$8$MAwu4nq(boc{@>3o<&n@~b~|7glWMF<6fzd5?V zaPAdUxa96uFLhSJ5S^Xa;C016N8A>({62!u@{B1+v2qu>Y>ptnjCvX(?pogQ}Wb(bm1^Usom6GO5(5X!IBKP|xTjGNT_USZ>iLZRyIwBf$#G% zPdISdHA)_AwZAhKco!6F&)G1r=Y>TZR28hhJJSe%y&`wlq!W|k~)ug?fF!H zxz`%+2_-2~(*8{qw?l#$RNbZnvtfGb14d5R4z;UAy^M z{w0syOP+vF0A~snOMWq+#LKL<0i2&NH`#3evA}%RD!Z$O947ZM7^JkHGI@FyuktCE zl}QkBb|3;mrmoOK`uG}^JSKK8@#M7gHCcs-)E$(is3(jdQ5Z*~v@0KZ<{M=Mxbvr4 zcX6Ox0wvx`KPsz{wG%U<{y@E_M)4c;O>Of`0xhVWIa_D`Sl)j8_jvVfvu2I#%-OsK zYRtX%Na3bcdx4~Fvb>&+0cxDwTY1*Wlz54gqGO8N8)g!0{Qsu<1O6s`E$_Qj^yCR# ze(a+Up7C#ck5gFL2gG@`81~2aFTkjcHS$ts5jLMX0thz$WK>VUo_|3An|9DC&%Q5u z+6-&KG9fz^4L|W&EN5jkGrE+mP~sgDL%Or)ew{uEt?8rjC-m>gmi&kZS%&!~(2aht z0ys(Rv+R`*zrflZ0j3u2JbPw5QFj4cezj;*Z$oLZece>te~n>`hEN)pyA-dO!vR8V zX;a^HpiOFwx~m26EKA~0h0s^iML6r)+oE8ZCk~Lx^uDMlyp+m1Ej-;m5*8%W%k0 z>`c+ljwKABbM}%Xp9gDK9D>QBVCwc*@KSRM#OzH*pwu|%2Ttpqa0+y*ko1hWvn)uw z6WanPzLqlO;mi8d!LTassiaDz z$d&*N2T>8uTHm7SX3W<1CLTDW+4Vh{$DFaCy%Y)!wo#9K77|F1YhVkLLbB37THIM6 zm0F=6F~x3`+E znwwIKR;`}z!oNR5o%Z~BkNS_#q?ud%Sga;>T21iP&E^67wz1mHXMr>I zF-~)6)S3Mz>Wo9lnNMWE6ua7*#ajFMuw0YSgSf%GiJO&BA54By0LA z`YME~z}gyH{hjW;4RWf3VN{kFu;tNc;6<7nZWGkHyg=!${^A7~A)0QL?F0xC@B#v- zaMdtQ^gQB3BMSvqaSoE|Eb0r`9L;S7hzvD8bRUA0MXLXLo~D!(o6dL7V4lXJKZFP&%&&ElH*K7Z zpD4pkT&=t70%T4pBM-YyC#!9tw5j5w)ug&9+ju*u6FYRHyA*6Q7G?yu6lVysUV=Np z10;WxFEY`RhZ#9w1`KqSHsBot4wzh~zw+Lh5yF?>WrUh0us3K7X8}<&`2$XrO}+d* z#y)_3izU}06bfkL^R|jGok*1lnY;Xj*^Q0pjw&`UF6|?+gx}RnU;}CkvGLY0=#CLV zlL=iyuOcD)ow7LAhn z9_H4DS?{2XSbLT9VW#JyPV!+MRnL{>U@-39sE@~za*Mo=F((4@9g0*G8MB$C^ zt43V+Xs@MXU-#w4enOCD1x;2j(Ad6|-6hFv&whKrs_p5*^L<>_=-~b+S$fB)`Q5ab z(huT&pVgM{=Elid*e)EryW594m6E2q^N1R{fjd3oZx z$uW~Y<*>$IZo&-#g9sf%H-^;P>c8}jw}dJtl!(g0_8UFdvxQPR>!fW-2r40bBRj|N z=axWgVAKRco){Bpc;*?Kd9Bdf@S6DpZfq9Z*o))^L#v1F3j4R7v>+hhieC{4o!q=r zqX@jgk)M7}TL~@`L5e`xoQw?s7Jo=ZmC{O=%blvz_VQuwF7|l<^>+0ix@tRL`A<6u zpGds+B8gMq&t8Bgo+|ApBxyw%zw$MaRXq*PD7v=_p8Dy&a;xZAx9Q~iS5FR%b(`c( z>Z_bFCjN`tTlr)`ttA>Yi!N<3Fx|)Ix$MoOH0Nu8ua2Y#Mc&9F;4Exd>Q93Je_o^y zxSj=W11D@Sl`p@cax9`Ew>k6^K{uKJ5?;RAcCbheyz89s=rZaRy3g&opB`3|7 zIMpIt;o2I#gF<_9I8QajR1o9{L%u6aI-ePTx!4+A{B|(sE-`bsugAx21zW?K9WTE>O}#mn^(Efs}WYL&h&l zO5dZQb|*y?yeY?b!tlNtaUPOJ6g49kzZXE8Po>Y3xB!nq4*7w*xHS9<<2<`{zUfDF z-^XS!z{sJF2tFT(r_$v%y7xmW_edZoAt2c@{9hEm9B9m;r-a5_g?!C( zLB2wYwuUUWtL7X{lSXPAmq}zjFFKz|hAIu-wgVr8saPIe-$0aLxuO7nb31BmthoS z#tu|oA15YVBnv&{gN+moGx}-diR7+EzGm&wTo=%NP6xGSRLEjx^a-s{U?9`cr#KqB z_j<-!x2AUm3dHi})6KiGQCkA~cQ%QEIse zf_`tHHDkxr1DZd?)XbN?tjUp?gPjKV);ky({R{kkuCUr7A^|H3!-fWEY=_Ncg?U~A zKWn}@SuR4YBa^i=#O4oA!E-QCzolxClnQ8Vtbm@`W)QWsuH{=JevKVy7=Ae6B+XB8P?4vK9O4;1$tIT3LDJJO`5deYuJk@TN2BXNTli+PTBV4Cfx%$b2vcuY{Jh zwurEZ(|W_{&3f!gIW(gdKS)t7ehNROA=R}B-}EU6k>EgDarKY#2SQ@Yor(IB#ypO^ zu^2npo)sp5B4kNP-p<(1tX^XRMg3r?MrK!TPWo*s(I`reE$5TPB4s1~m9Ps~vE zm*GyaScXgCWE+aGl_E$G0o*(bg2EJ>{kPFFA%KaGlV`(l#9JRH8{teD9~9T$ybsGd zC_+|4{GY;KX&_cq=bNm%G8a-v)cEq!5yW!U**S`W2%(OG4zSsD0YSMpsaxlEWYN4Q zPWh=X`rT2XHem$vpM{EuaY}D!X>VCQqB5(O!~0DB#EJ*bjBBn_Shq%M{;ptJL`fWW zYh>zLZWh&xJauoZ@G}%xXZA|kn*^nuOf*^WOlp%-mv`|hf)q$*o z9oH~Qe{hmFIK5-@B9?CncYN~SDo}pFM}PM~$Nj6|B!>Gs#P^JzUZjI|tBz5{^!U`X z)wV%nnP2;kd8E%*kFRO{AH&nZQpPD$!Bq7-gOp_e+-dwi6_=`savv<}ESTMDLAwVv1t!eZ0S=AuN8nvP^o{)mc*M4DTR zrIZQG%Q4m+-o)|~a=uNv8sDXN^i5leXds@x1>Vqh1Pdh*jv!z!u?qM5s|)-?ruXqU zxVm<`DPGp`F@v!-v+KJ86XdjGN86IIqfI!kzNU>bx2=aawzN652$en9xJ7jhn^XK5 zn{f)S?S9Y+=W5o@9i@vR?gK%G;#ihjiP}LaVBZUPg?tKmn{p?*9oMYjk-sP8ab^K3 zWFT9TKhO-MP*IPHjunW`MS=`DVlU%lQ+OZh4U8av2Lxb4*q;RiO6rNOvcdEv^-~^e zY@1be-XLnc+u6qpK^1p>X53a+>p1%dRsI}}R$#6ON`_G;y7R4eXSANqJ`EF^QNa{4 z08qY6UJx5n{aNd*r-lyXMg+G1s`;*vBPh1s(tMM+Jb{!G3?s@?AkEN-8)laBi@dY0 z{^RX-&_}c45aaZLtqCMRji}};8B>;SsE~|(g$#1!{on`RrdPmgIy2^5xQ!o1*T{$4 z#8y@SP#(Biy>KHV6n^?<>ve+jP;`I zz^k|9EMA9tzvwQ64h}92-qlpWRDQk&@OCg2zy+fO?GW{?Thb|Nd_Dl5i`d)oC-@5q z3JaDs!esMyYwjJ~6#RQGD|>fNiT zt&zR6ui%)cL4=|j!}HE_XzE$Lk}m3g7a-23@9N%eaq9zmEaCHCQVsO8hz<;CyZ5#c z?|F-RCi@Q$-mw=>LM`o4%6~s+mNwhSX|aX@{9H%_edcgp{l`9v0>3iny~$QQ8)v8B zE#xe=v5iuP3WC_^gC%1@-1f{md`fHnp4XoUH@KL<3VQ0fVC4#fx9A#~&sbLbPi(^d z@AmH5d>F;>cZvODuf#f36hhw5x&DbDxQ75r%nbqJm&w4L?1xtfw63kEEf%X2M%pml zGlQ9MMn@%sS)UesuK$nTi|f>QRo~j+m+Gz}pP~<%eN>)b$Y^1K-gS9`cSE z;tRdRrVUGf7!Noi{hfu^!wD|gksk)+%mY0Tw8hdv(qkhDOi*&_I>h+vqEij}CUZ^d zeK972)g)sg`TsorTx5{q*qNFLK?$#o?hbof(}bVy>j=6I#RiA1nqZco3}a%Y?G(E7 zNVaW9zZwjfModErs!sJ3kH(gv-obp>#7Fa)ElqM@%F#w6L%zAS@x-3}EYb zYH(|sM0*VoZz!W$P*6stE?DX^K_wj;=n=zsY^tr@9dPPr#X`?->1k%5`H{5dsO?|yG>e?kwqYkkLu3M{ zA2c`e;eO0>A`OZz7ZOY6%#z?jL2`Qb;MIBO6zIdLd0RN6VQG->dCmskLcZ7u!p1JT zzm2R@&UrOVkKcH|OtTk9Y!GjHjLpQ1masT;)eh%mx*^ z+B-Vqb@HMPTeVG(Ep2*+IL6Aq50kVfZj}|Ky^@YdJ^&_~l-0}6$CC_CIzQ0EGz0OI zR2OT=`eks%IN-1_$;xCIc4h6L9O!HhYgAu9n7qzy*eZkh%zzOo;~|Hx&Bg|=C=9OFrHkM zWJ?3(&>;8D>aLND`Yk~+!L4r9S=aq=={h4E&`URR*y;aG*XY8SmrUVB{#&Z-(~Kp3 z$kl+vIR-fltzxhg_Ct0Nh}84$c%Bcg zuY>mf6t{+NGZkwv|Cr)~I+-&W=~dHfv1{s1);p2XP!6CQQJm;mos=b>*$wSD3SGti z35dWjNu~E}Ksan513U%c7;{zmJ6sJ`0NC-UD7tasm?v07u+|rGKeu?g>beoA-(mu9 z{y3*i@D|PNe(@k{2s9%33(t>-XPwub>Uo~|F!wl`*7i#XSxk?>6PT{TO!qs4Mfg63B)E@bxXFJki!Myw71VNHKwJl0;g=Vg$ zT^ML#QJt4Eg8cM~2)iJd5X(57z#(Ddr^H>zcWh2nrN6*u=g5rFg&i zBXutvR*{Rgr|t?bZT=b224v*lVyv7n+QrVatxkcx89-1gTxAw9^p!wBbr4<>OLM!B zSO#@4LJ(bH*OwsTV#%pypBU&kKx$>orzX2pn=y4yOLU_^_vJj7Q`>6yldOUFUx<}V7W}pdZtI!N_aE`OuLLy%DU=`9@&9Bed$}?i<-D3MfDpdUiXfFANpHyc3>}DXE+;tT`ACb&*!nXMTwj&#eCif4u{;RtaIDd11$1koQ z?J~lTOi9_-XIRr}#ZUxS6-3?t>ER*98$plBgu_{3_9T$+1oohC(sJqQX~ZwcQZ=={ z(u9xj>!&mi!EOR0;`As*PR~pL`^@zE(CfrWe0vVG>QTjSI2c*YiAY2yci; z{Wq(@@njD-tUL5GT`h&rL%p|q(FJV0VAY@snpB zAXn<9LyII%=nq)5#gHGwn;Xwj2qK1(6E0vW?(mi_|%oj2aUxtXX+EmhpZX-Nf4q1otd>M_GAg_0()e;EU)tV zlB72ct(!EIFiiL_SY$e6*irTbA@8|Vu9-M_8C1?&%KJ{@H>r+1LZ}F7pMBT2e{7er zK7pqv{j_hvN0LjUNI?6E>RnBuw59l$RFe+a-OEL853C&qKYujZ^e?@Z2|p_#oQG? z>1%Yp!K>kbys45!&qo7r*|%m1&KN!AMIlWJIdA(@rx!24P#bZaL`=4VhP1#)jnszj zp3I(tW953lbVco8bV{eHlZjQ)I9*l*b~V{2@HT&T+`0jHIldrF*mTY@=|NBtL6CV% z!U~uuk#6H?FXx>Ukkt*S#E|YbCk*o7WevaMG==45qFp?Xsn@()BGl{*OA(`9LF z4}Bt78{Bb!?A+f`j7)&jGa*{SbVdbm(7g`?-!fx5Wm&Y>?IqAC1af+IS4rV%HH{-y-9URuDqB}@UAFU4fwr%Tpn=FzKbXRuTEQ?{#^RwglSHvh~7yplV0&R1$o#I`1FVGh2m2?YX1f6jhH~(5uaDd1u z{5OMCAp))R6QOf0CFPi*YfaONT(rpS{=I2MS`Qw_-ARH!KO`>fU4)2mw$N}OgedB= z?IGsJ@h+?5Y<9h-$AgDM13bqzPuyxo%nU?tqdp4uy{tRxHu@eF9OQvHn)eK?0N}9n zyM~l+W=H0VpO66L7_nWD3@F%C4OTL~m9Es;)7QLKiSfv-9z>wn1Wv^GN&&W0h)hF& zo$9`q0xAC`HVcG2aQfF($GO7pBo8kV3c7gR0Db0&yJb;(%`s2>!<-a;yYx)RF$38N z7T1cZnKcbM?}~cn%W!X{WGU1HTg%xWzYH(DQ-4!KPjxsHr3-( zQ-CfDnSguJ5q4Pxb02rw*EZ+!9?%N3*k0D-oAkwVdBY6$gsAyB3?n{_s}M^c$KM)# z!S=>{kQ{=D&=u{rjHHF(@S}WB^;BH1>HM(x?pWBe-}D zHD%k|4o-sEYHjFGHMo@{bj+T_A!+<3AYGvG_!lsIWddfx1VR<;%Cl9uhOYH*OM8pM z(NKOFPU#S3ljr-#_z^dsD&u6UUZc8EK6J>vhjt3z4@^$s8B}uXygj;=L21DRVv!Oj(!~~}nBohG?GobS%2K1}vC$f;s|3p8Jzrk-z=nB}#*!=^;WV7>5f3Bl1oc+7D> zx$@hH9@ShrnULg5&IkjWz4P9npxF!QVXzxaqGJve3K4hn-NMs7X2EvLNv*|`Z1ntR=@iQ|C0n8nQ^Y+yjV3jix&iQpfR|9uq6(Tdj@Cddg1Qny~|bjjHvT;5$Ki54hDPrS0Yh zhvGDcXs;s4uL?+IxZG!aXlomDm4u3&ui$F*cb4I_Q;5>~sUmMC7tC^pkS^f`Wo82D zB!D;>|5K*gS!Lc`K|QCrR}M+u*x?uSgl>i&bwHjsWT2n!IPS)=+oqLyl}j9PD;lD4 zz0;6z1EX*!SOA49pb%_}Z8NVzTcGdP{x;8Ohi-9y%asL2oMJqy45Am zt7y9h%kG2qvMt)GbxoV(2kQ$fneHA=z+z#u9@ltL#B^b4+RQO;>j_}~9w>1e;9QFC zi@yZ*fJw?5NAyD_iD>w>(+teLSSJ~Q2@x-lg{pJCXG^c^itd_>Fz!{9yk)p0*T5TC ztXthH|EAAlSR)zwFZ$>gbq>?4 zVc-uh(A5V(>u@s1CBr#-y#0K%!&D&{_Xm|xli--g;OP*lfY^my4Wx*`g8NUKQ9nHm zn1decuy=<>2g@LuF!F2uVW~G5!C1@DVpc>zEr3J=p6TX#kIT*iDF^LQDzTr3wrarw zP#FaJUFVan$CX!dc-}{12(-xrdkcotwkEv%Qo6HKd0V1$Y_~NmT&zQgS!*0lb_WH* z*g=E#xwbwT9J8S5zq&m$$R}GrC?L_RFr<;QnRD?*Oo)M|V^^mPND0OnbCII5&StNG zB@X3c_2Ki=;rZjj&5gr_7DExWN(6ngJTB@{M!D?kD74`SCvL;iy_42>2J49>xzR#lt+lr2HXgES6_CeI-V%fWuY) zDH=Hy?MDs!2=~5+kLSG=!rUNvW*+S5iAeD3Oq~mq{TX!p(<|sto=O{mS?STLse?uG zYR9bP^klEiFd1j-Fb700gGoHpF;Af{T*#-C%2vB9^x^=gp81)^Tj3P}paa9ubaK(h z-_}uhVfj?M`}Wzv^}zh;Jo}?;ayPFQZ9Z z$KEOM%}1Lc@d++xf6XnY@E9;zMY;!!M2p_9sU^yg3aKS({E8#=&10YEJ63jPT49QN zHa!iEBIM#IMd-Zlis-C->lt(biRocK^D=>v!aR2j3m5ja@`(C5vVJ8TPQr z(O?GQ>HPiagBYA_7i?{yWO0Q_1i4~LjyK+zzA{$^9P2&b<5<#iYE50ZFP|Vo$l5hs zqWTzpp&kM*1eTX@>?|{f7aH94rfGVn z`>)MYa;BJ$Z_F4iUctW>VGhU{^YgtwnfHs>;D>-Gp#~6kD!;7SJ05Pd&HKAxWiJ2a zaBl#InD*1r-YU72gdXJs4I~B)|CQ(%Y6E#g^8v->9ri4cX$I=UgGveE*=`nhhD9q@ zGuhF)q#6HhvpFb)qG_28c=|o-uNBRO!LNuX+@6pwNtConhv?>Kbw3Im=@e%;PFn0-60NwjLqpvz@8vt489=Otd*#yo;o5lekm81HQ$uf&IUK3oFKo^taAdodu72(|J&VgW)x> z;bwFWtM2_ZNZG8%CkSH%I3m-jDTdKY@A{Ps;bc+62sf8K)?yzqZ1f$VZnf_fn`aR1 z#Z3q=P|rcBLMH|uIB~?(S4tZx?v%`JM+JIhO)f>iYFLs5S?>Vs_C)YJmZOHzGie+x zZ8Tx_cDmAG3Qh9p{USx>Nz(-9NtAJJ)QRU$;V<4kp!oAPJXUW5f5Q54_qpUJf>dt( zwEQ&KGe|w9X*(hH^BCv3wEY+ITi2t8C0gs3H|3AwiIl-9MB~-l7*1mFR zozZ218_WS)bOzt?W!FsgeslUWoN$rf98tW|A&YP1+2C92)9c9n1Zw5az3nPpO`yzf zk~4EyqHZ8RiHASGgs#%HiJ|FY=8}z65tY}RamSC_Z(D6XLG^iMRCcE2(uNgI$DBEm zVNJoNg~4Fpe#x*=Ek;2Zatwlthfpv|B(rn=nBdv*XoUe(q=KXO2fNa1=#uA|zro&G+71Y23zE@VxD#}j%# z)Q03Syci}DD-L1%jEckJyjggf$W!nkPwg$(yB`fC1G)4Mxc6EY)gBc+BI+S=M8bpn zNX;3?yrM7xy&!IZ@*s#}#pePq?XfLLtcVBVh)`m9}m`6g4o7 z1gR0mIxU_DYQDz>`^G+Hac7+BDloG89g40@M7Co?Nhf4&YY?5qR43I)B(;~z+(h=1 ze}p=YSF%j(YK^p>z)T$5mSE=;D~hRP^OF*C>$%9nJ!o&%57y)L4TVx)ZiS6M!QOP( zz(FBP0N3{PCsa92hs?HuHo5{$_}kf}+2qz*=h&V@$@X1A8<$vUK6G*6-}N&`iLPXG z9=Iwr7lC0NBK=tc=l-r_UL&4PzYAO0hVvzEu3kQB$`t#7m9Nob?waWq5Lc8~gSdjZ zb;W?e&!0numPHEmIAqN{m}M;}rzM(glUIHr=-gJZy-kxq(oUMb7X9au<*INd&8;bI zXlL95sJmp+(!CC`k#RBk`uUl$UhC7h26Y(pr%q#v*D0G%_s2?`pm0I*_<>I0z+RBP zGVe_4*Ds2hv+uA1e}97zF>jHjOA4sNA>R%qk;~x$qB@Z4IYcm9P0Sqq8XXzC?J6>?0&P`1Vgf(zdQ;b zzgYV=8AV}K(Y^A^v%<=iks?0tP&59(Ub?hN86D@s?e2WweGmc!C*X;mEKY8!x1vOe zazEb?_Y&I_fQ6DC_zW|F*cn1M*tt?1&h22Zh?MfLUSsY5k2bO09cB?X+`VA@Jzkm!WWlR=(9?ztwys6F3HzWQ;Hw-iH z{Li$*vKQEF4tCiz(zIax&j*S@t0T^2j#;`H(DDnMaU6OVQcm!kbbE!iQu42pcqh_V zM${?L&KD@anb8d3AK2m;$XN0$y9Y);^L}kjf!$38qVN`1(xj`4z%_2uhLTf6j-ydS zp{HmpoI^jr2k4pLw}U@KWR=AzjDSa#AxEt%eYT&_sJHi6=axHQv(+^ZQMcv9;pG|d zjpv2f87FETCxHz4_9wzAb^t|duHL>$B*GmY8O5S7$`=vjBG*aZf}9f+#j|A_!dG}Y zby{XNpg>aEO>vJrvn-!+6(`#cPLkS?X%a{~D5f(+gSdJR`V^!yPbhzwSY9Jc$F&=m zw9B|iq$DM|kSn**axeGOCr%p%=o2Y3@YuP@KLp4m-X^6hUE*L1iU%&_(4vYiq)iHd znO{mO?6#=ouVDTV`PbXn+B{^$z&0{huMs>nI|A$>K?yL#j|Xd*{>zwW%1q3Y_Yq)p zS}tWKh?^k7pgws?nK^K%`z5(F$2OO}4BLl4f0HE9QQmPxWACKcgtb7E?;~d@yV|%n zuGX|cmo=v`9PG;U_PR%DGk>IgO>~j9J2EAOH^Q3UWB_S=^SO^bwC5~BaNvTX-Ehty zbDcJ^yPb!bK&dWv#J%uHjelD-$N-flj>#IK(Tp zA`Rtzm2f$ue{(r=RT;}iTu!K_>VD#rp0}y5hxGPPhCBc1pBKhg6yf$-bG!+F=2;Tnn?!vn6!rS%-qnXGAJU&%2G$|@|-l)NK$Q(CO+ z+B{(omD`S(#w+1f78vw}(4JA`dCI(L8pceIfFZ?qA8uuzqAxndAC7q+P2Sd8cW#(2 zHB{LX$~gylvFyGBcU;p_B{QRnd+N07O3*$dA*f^^{-m6{h_OR-Iiye5R5fNkQ4C5R zcs>}YiRL#jHbEr?SCGFxnGIu{OwMGqD0qNR-OoN$4&)^PAsE!SE}TDkCD-a;E}XYTH?Z?{dBn84a3mxa(QhNH0E9_ z-x7n_#{Ut2ft67(%xs>SytC|{CShbA>^w|Kxf~hYh4Il!M*z4f-bhS0!;X}?H7SRj zA!uqg^}D0&)G9r)bK-;FvH-DvbAx6JI`)jp)3n zi!nskYCpT{8S71l0jbYzQ}ebJbDf#j);J{#g2mDX?4bvwSoyOuB9BjDCJN6{{iTqE zIOVx{7{qSMAXXU7<20wubI82JuFY1Il#6;5!d>&wkONdz*mgiPt;rF0^w@fm0`oOp z$v*o=9sbm}a6i@{W5^-e5Wt$?h0O{VQk*@c)x63#hjA8>|Hqw{RLqW)9ukFJq*9go z94;RA*EV4Kj;L2SBY#5l8p*0H`AZ?qRDDL7% zTh@0-=QnIF3w-$j%px9gk7Q^Z)2&z`Nxd0`T3L-kf_v*n=CK`<2h>%=So2SM34Sm5 z=O|9FRH-&*OMpa8y5Q9S!!&4a+T0IZ2vPo-RAcWsMAt~CJhlCWm|-sWF3;&7FSD)N z+h(VB34TxA)n_l+{MF!kqZ3$iE(t~j)_}rzlWfO0PoR#xuVoG4)}OTAG!`wjm}@^;CyAY-(#bbIG!#E)RR zQ2$jpwd^ps8y#WV!?*@Ek>w(thS6By{=Y5fhYV8fbQM;5JLXL%&~{L9fJiJ3xsY!F z(WO;NILrgE8FV6ex=JjvI|i#bp?6GeT>`~1gFh9`ehQo6HW;P@8|nnci7j2d=& zX`%hP5_UmBixd|?hqh8AIG%wzG_3}tFB`ND|Lx))TV;D~t3kwgomH-1=NsU_BZ6N2 zet5T=sP6ZoeOeMM2qWJA06cB6U+1nf(6G1`W`c7p^|2k#hT618yd2ppjoiMQN9|AE zbKQI1aWC(sYf3k7Jo?~!{KI`;GG;IP{CdhNLvLT3Exfzq)&^eoU3yGcicfm!!@AQB z_GbhT_2Vk9NaCl~Xq>UPJ`9?yu{nfao7$!8tx+?tovUb^e?sG;=Gv#lvxQ}%j_ zGB?Vl3!LN>dG$nK=N-5XN#xe&&81rDuVdFDt#rw&$qu%G_$%s=rLU;NDu1Z=&xUYj zZCg9VBQawsPWD_y0o_7w34<7_b6x0(IoW%sXG*74jBUXJ%n341sDg9T1@nJk1iF|1 z-n^6)8^3Hb*z)Ti2Nh1m#z7{Co`8!X?wohjbLrhJe$^)CF0FPB5|BCbN--gjS1GzX4$WP-d9ybmur{2QDYHh#h^(@OubVCF;{w`D)}EvvrxBnR92f(+nAe@4POS*gGl4r%Qe5(r*!@oD=8{ic{{IMU zL?ZoA&gFa}w2X&$bYTtFa@YQf8g2!}b5B9oJ}7fVLwOHqpHMC?Pa>t0V^khyw8{h- z5FtySB`P}BaP#n|o+(TN6B0{NIDlZ^#qk&&0l#JoD$zp~so&Za&L;mfxDN2(F@mh@ zvjY|g#O%b&F^HXITMU@PiYE{|h?<1A-Pmd$gTn%I!>vo6HLw4wOj>$jQwA9vc`yS+ zfLff8Orj3wX*8EV3%IQ`5xs5-x|>tiNPSfyjUKuCPB6h)0 z=)n^?GAHLU`*A2@Pc{=lefx(IyTVvA%vxphM!A%nEumrjvMx8KuH5WOrFzFkcPK+M zJ8c5&>dcA?Rz%;vjjV8l*%!o_MgS9l$pmYkihRPCp5c< z)lzR9Ll0S-MrBPooY$ZUn(G^4-eRKMN*4}^y;%#9Yzmjyl?IRPSw1goMx#ftlb!Qx zy!I0LQhQ@H7h}hGmvo$a$2T7k2eRDDpns28cVr8FSyxoS)YX1Ms*5!*DNPQfDLLV4 z+mvhT8dln9DWYWv@T{Gpl*@u08u(6i`nkf6(7TwSnV7i@wvX~Rb9Z>te zsIO7grTD0kn@&|;;8w~n~ulOp2TFK|ML z|D;%tLjYQM^rCC|)y?=t35PFJajU#tX*2{0_Dok$XbyyoZnJ zt=_`ZR+fT9eNdi_u$d10PH634+2@2E3)5`dWbtdfW*u4&^D};**65Vbg5}fLnjNGs z!)%T#G%pg<%$`_UZwvgq&GAdWsWBWYt6`w5h8!^9P^BPZTq47AH-(SIl8nU5sQY*J z!5e=&f%;c@;;SJENs2u~;|8+iXEWaau4(1FrEIu+TEnlwTH5G>bduFBIN|bD(KH7Q zzY-d_;uFzh1Vr+|c^Wl)wJno&g!}Upk*h^D{1z@*NS7KoL!g3po{bRIoZ=zhz6>-^ z!4vau@cYUnC6ilaJ=b>b?e#fln-Z8C%4sgM$&3H}9b~z%KkAX+d6Aeni+Wh5#`I=D zH66i3AwBRr-?U}hdO!pdTU`nzJ8>_A6sIkL$Xc)d;KNyw8H!!T8<}t(`)nbfstSG1 zfnS%c9a^Ry=GKczW=`p8cci4jGO-;avir^#_Q5^Mg*t|*MV6o%1#K1`op&4@69^`Y@hD*d|p7?2=aMujl%R`H%!JX?T+;o2rPeEjx3IJnlcYil{c!;9ixH!1m<814tSr zBrEEipOMlZ9^tyVU9{O2zUWzAC{UtSkm5hgAhS$IVr73_V(jG}TvE zgZ=slJe1iOE<&0X`Kb44evv?d!wh>$0k1$b%d`X>b07kRxl~6)Af-HrSRwUVzXQ9* zWts5l{y0;Pm+S6&r_*TQ{~wO+`p{$hFz0T_lAp#kM9)z9 zNAH>s;v;G(XGXP9lPBg2fJURfBA`h4@tEZCJ^0e5VP|baDVP(8R}nPI5TJJGEgZkl zMGBsxs}JX~ijsIs|7xTx+MhC`3_12gN5M~urhP!>LLV@qWyU@V?JhHLqyE;aTN>Q? zZOpyGY<1l)mA&H0;bZi6x3>hE;?J5Cj>60ZCp%UCJYNC?HA;=h{%j$aWD%E>>nD`* z?!=AzDKs1E`gc7d!xLt!6I}O!T}9K&G1|*f$_%q!n`h@d2X6k@D9XSTjfKWQQC^ze zj>5+5b1sFlJ@lS`AvD`g_{zb$=~(HHa>R8q=VqS3JLsNK(RX-O06PFmtF!N}43~nswE=bYq#CC&}wIcXs07O%42P^nbGV z-_Tlt+;viFk8-nB`+3KmJH{=9MuBC$kC`9M(4$D*zJ?6u;q@A`^aNuQfe2n5{E=%Q zo__9M`;I%~ee)U$qe|ymudCoj{}zckD{vMk95|F#-9<~7kNgU!Sy{zpRK5k9zy4jA z20pBTmP2C`k$`SUCu+I&9+6E&>J|UqCp=y_Gy(4kJF8Ixz*ggj!L>%Go#KC6%#Jv8 zTBbE3l?^-7NF%#Rc;W#TzrY1a>Nvh}Cxt$5H9P@!eu5B-O?*YuAWP;=s~;N*u6a3{RZqt9xtb)oGFjKnzri6TKWA`qgT^IoXhpm zxD#)j0{;cnl9)~li6?23x)io*@Ufj0SkK2*E>*92;(4Sq#pE!09c|2<-wAf1`^Nrw zTW`!J>IY1j+HJdNV=FQJ0JZJSiom~_n^!*ZUl&rnoZF{TB zNlJ|Ff0B#Llq^VC+niiT2oaciruyrTT5fP0H(R6w*sPr)&O<0GIN%@*}cU>-NDALpFmuN#!2q<}+=hrHd;S7jy$T zBC_W@F|7GcBpPH}&-e-rIBj;?0jPU7Zg~GoSBU>2Hnb}Qh!X1kK6Y(Wy2y$6FXYv~ zO=_FRPHHV49+7$|!dRE5x=Y<4EH+_iSvI6NT;9Py{DK$?IZ&_kekQoQ+zSZ49uLJK z(zFLr64@0R`!ODvg z_UES8*U^VX@33I%V;)fOls;*@1bz9=vT;Eb`F{xtLB(_7obY{%YFLV~s>?E4Z{-k2 zQ)sygO)nNM#7z(W5XHa9zA3 zN`&Hi##hX{!EXm|tM6K=~?$$k*3tPy1qlu$>0fH1!SQ`#|LVFDk$m$3JEj`^cvGx1;7y%fS84ggDSLE zjoozHh>2s%VxwV3khFCF?DM2lI!^fGBm(9GX=biwX@=pYO)Np>P0|v z^vj7)#0(04J#iV6de!m@^zIG|gy+t8L`gknXdE{lr7(oFGM3()>)$4wB*pG#q)bpK z`}P(RVoRQ#brUtb977~;3B)sAmWG^}%lIg%C)ua40(XBM<@9Wm1j?NiSN9_Nje3@> zx4Hlyd0Uf!@&%@b;cCQx^Spa-qB=lzw+nxn3!+RX*zE|-mXQ-NrW?zhd)n&l!)=K1v|LYo1N{0s{CeOqRCvw@y>7+WW%t$VXwMNdn1hfgxA@_#T4#GSkgdjH zPURRlJafGc-=jAbd|&%vijDtk59h!wzP(~OYqK4+c|>OOEgWCO|9WyYpAo0hj~G%C z&0|7@dQAt?t{R?n;Lujx+Q&Urd23$hMRM1Z8r5>ajrKh^y}o8#~Py~Qan zff>FdX%d-JBJXZ7473COCN)Nl-{~UpLfz+&lcS%|;k>%_b4}hsdW7t>@7ikfv6-D) zK4Y+v^5L&Fo{huajPaSp?VBt6;w_=MXUXdrzOCe7vHJcFc}obq;^A`oG8IMF0Fs~z zh-3G;_XEMbuW&y710mM=L`sBEMZP_~mYSFzKp}ST*T@!YjZf2QDI!sL|2ej1s(a_& zi@_)(f)pL~ikx#mfo;fJ)ii=0wg;yHOFT>FCwXushyx96TT?+zl znQik5#ePHajGiQ+0USvYM5a0)~7XcgQ3U^p*q>K%qP-xXAbqVR}MalsSRA492j z42Jd2Ww~s?Rtw_W0}s5?KB^U}EVMn*Ehp6b_f_lKq_J|S8E>#)%1RT~3rVbK7Z}+} zMv-oXth&nz{>t>sdc5{F-Z0Ia*EUil;Xz0Sz8kK3XS{;6zJYxL*CD2;ibr;L!_=R0rRD6J&Sy4sJ{ z<28G$I`qK6n+>-LUj8@E4fT+SGkQa(dDm>-IM3DWH%;Ug4aC63LT127P87fuhM%;m zt~*S%?z;5;CH1>Rhg=AN=<)~Qo;*;4CHV7Qv45vcEl4we+?!i|Q4-GD(h(YVpk@_NzB^0yOddPzLb zCYCrICbxR0UDbKg4e^@AJ8B6`BR**stY=>29i)z*UHR{PCu+b1Bxlf;{7CpMr4)0B zl?`rhafXD9-cSZ?deyXE%%ma*!ghvra%nGF&hhV(fso`?MMeoU4+Bk@gU0s0IkFe- z6@I!9rD=*JVwep0j$~X3% zk(&+)N=_<)^&&JlX2)xjQ{cNy&{^c}-{c_JWm>2aa+_p$g6YwjVR9%c>%rl?1T{C$ zl!%Nf?}mv(habWOTAkY`f=v+$bcHQsAQ=7)sx}D*9A||ly&K9*$P9;O39lZBN(0(U0 z0SBBl{H(95REucBkWBPT?~80`B8q%-O+1r99n~afQV%Q3z`O(Sjc~@*anx7Y*X!Hy zmih-d>p2S%)EGn#&!a6nB`hhL4JP$dC9n-x#6()Arre0xZXHRG_#e*T|k z@t_DjQw|T!Ep&JA;*oPN1drJ<26Ak)mR>1mf2VjOwgv<&8ydZLgqOb83H0f#YnXrZ zyAxwU%?Cm?nz!ju?Vs)Kq_%i|y^H3ARCdE!Ky(#MTh+~-Z_dhkl+>5|qukQLEbwG+ZkW0w4(*fS3B_qdj?$Ki%)8pm zugt0pGL5+D>4r&(B!;I{gI}c6J~AhH1M}m*5SYeJhehGGjd>gmGs5~kha9rp$U?v?w4mnJK!8>x8v&kT>swgD@%r6YcSQY zg6BUqrH#_FH`n2}_=@>HfT2ECcyfr{KT7l61MD*M)1CD?fsR^+J9PuxeJ0OjoE1MP zmo)Xf{qrQrfMT$T%iR+!BDtR8{wcCRYxtZUwFjx-+7j8ghM(*2aFSZONWz1StqUY(A?e3VZsWKO0B%`9UfW3 zph0)!k(x{1ptu8OZ1DDbRC415EMz$Emv98j=H@5!w`$%(FA{sV^{ zN9>+-^wt-e215PRf544vhI?zUXQry8JtZg7IpPDj=j@uOg&#VW!%!%wnpYKM(EN1o zPH#Urnq(lXql#Gg-aH9OhyQ!NR6F?LODs+Dkfy`Of-j^8c}m2tIq#L%?+<0>rI zmz?bIaL_>;++L`?>MbJVGiSTLrD&Kr;K{8qI`=Dc4#B7){amb-r4?~_XZpM0I#hQD zf5A!g_b>J+j&+_k^C5^Hkaf|BeK!fZCU&8RA>1i^)nt#J9=i4HK%^1*tJFz9%{&j4 zJY64T5r9H3sQXFdjb~U>3Z}!&y$O3AVxrlR0_7@Dcv@dSkZcLSQ+jOyY`;-~kCf1T)AqJ5U>2G3? z!|s_SQnvh$v+Itlxo^Wrr9tFq81+;d$7-ReC=JPJ9HWeih7s+lMMG3nil|PBa*Rks zdu#8EjP@QhPU|$!d;fk-#N&DY^LZaH`u^_keP7pgU-$i;hDdNqYzkrTW5JdSPHk~X z59X6w7G6%M_II7$HVw&bGXwJZfe2%>Wz9* z3X|>}=FtR;{w5n;l2Y80@+UO^58~#xrMK1mqpJ{=Izl#GIESk4Xkmc%p$9XOLY2cg zY*xVb^pZjqQ$EwF))f)j6b1>^f%tM5iExD9PwFJ=wc0fD2Bd6D_&3lI> z2PDVzu9ly24o(HrWh?qm|1h{6-qGITUiJ5lAy7Zb^^0T^@fk}%3z^n~$9^@mP1lK^ zVkuF*lR@S-)ksHIp&)Y(`h@rY#ZVxhb$!LA_u0HI=)5D@vZrm|hKoeAuYw|6RChDy zlGFzKmk=wtK|Qr^FW7WqQi6AC6C|mdX|`F@=U=C2aF&jNlWG$3lSaMs$$Dp7`Y=kt zxd2vp=I@j$!vP0%Le{>Jb#|xbE1a^SxCYn3<68e$#sXtYwQA(0KNy0h3G5UvJG_2?o?#{SVr(&$Zik_tFa`q6_Sk3(OF1YnihMyS%%&(;K;tC$w z+a!&ZY#9i5J~5#X?(={C@O?#rworFUV8>^#O^s?u^o<92a%e0d6?Ispb@HD8p>=He zj2t=AQ%U<2IX@s3HwI8 zDy?4)4=X4y7KJ6h3iNkA!|Eps9+utM^H(u`bmpfeJ^DA*#L65&jgbgob5@76#niqB zOnO19r%k(5(4QTzbUhN^ry+~(Q2oKAHzycoE_SwvIPVPF8fwIoG#vK9KRMp_e;-mo z@8Y!m5pRJOH8zSlH=L1b$qav=0Y~%?azxQs&5Ygi0!7qE`f~vIpd74ZT`WXzgNW*S zR>hG`Yn{YvCvq^#*-w$pd*_KEeve8Ur^dsYwfi>_B9?(XlO_S_-RiW63g z^yQruK6Kivz<{;cf?B+l(CgZ&tcsOD!QhY#4Tf%U;5vDJ?AQW3`qqQG_; zHCD>aF?KM;!mZMxZEVy+*V42RPBES?Esvx9iY?oC$c}|+R}yYAEQJr!W-a`Ra_I6S!(!faG-G3dT6AffxB|F-(0n%@@# zg|N4@(2RNA5jdRk!QWN?TcEAbxeeWN*HEqg;2F7Xca}36(DxMIq-u6f`01H|4D zs+dnTOx@5xnVu}*Pevx!CFET-$_1jS%s*(YQTYb%;cYN^By)!)ct}smBVd!K*{%Vw zdE$kA-+dv?B6MYN80sEvPxbH}{f$}khZAzE$~so_VnM&AE9cv{Q)C>iYNYNNQVG5G z$ovkM1G4D?0p9;tBw>qwR+E4ad!Pr}TxrItvR)nB7=n|J6g~Kw zT|dvigzv#A6fWDVg8E$%7nT<)Fqxf}RFF}s`;d{{gDLG@s(kt(vTWCAXE&hmVsI%7 zC9cBW!|aq^BF)`x21birz&dqM7o?dFO`=WjLRW7-n&H`1$-K#iH#Iv&al4 zP|M&6HlMM?! zK)9=dtlmB5T;cE9)QQ=)ouvyoJ{7Q9wMtyUMeNl{9FyRlve+O4NmBzD36=!Xku_@{ z-+D^h_#}2y;3pz(@nFPRrWE{cbJReHb~a^;aU)9Ux+58+AIaa;(O75V4Sw;f&%@r} z4P0OECYJ5JX5s#MuiG8e_F?)Y?lHnyj-qNV%wQmR(rKg8z&lpmz=E9rtN3wK$2(6* z+Rz_>MiyK@katKKTAs=3jsF1X9`OxpE0^-v*N!t^XWS$RgEPFmsRQ}Qb@ax z?|@Z_J~c#K!y?M9@aVf(#2koph36s)T5P_He3!{yRldBIOTdHwHC|j_G##;iOo4$+ z8+t7_By(l9t($iKqW4nwMDG&Ae?L59o#?;2mLKP?CAS*ijdr5o%jQ-8*R9;E;(QmL z;5p%jv+ofU(1g{eAVIsyCOYJWNDF;z*cSMSf~&X?!`dnVOUyjFs|4y?Is>c1Bn?d^ zc@sP}${!`1gGGF7$)^dfG2~a9{%~YhFQG@4j3@UO6$I#i!`$EfBgG41xoFyOgf(Ti z_S8J(tY`lxIIxtKT+&ln)KGKoU+$nv$XXC~(rBiAtN}OM4BF3YBJT53+{k9q z&9WiCq^Y0Wg^;y4tcMxdn)&BofrU8YP(m+l?V8A#r$Eo#uCD0H5L^~vF&5U79v==4;uQML> zVeR&-G?1?xZL>e6e#4k$N7xnyjr-TUl7Zr? zyOR%to#+KKtY8Pv!0qoc;1=LVUo)vc?*n4@n*O7sUUT;RnM*pfK!!7}oo)hzLmV!4 z?oW2Fy1%dkdi)>0dF&Z8wsx951GtCnQWHEeBQXch+aGFRp^1x7cvG)c4EXxOfNYo1sWpd}h37RxL+G5qJ@>8F`LygDGsBK&)EO zrYe_eA=>s_d~jO488RoM0kcqNxn#>?lX@H&+AN9D@3$zwiPJW#lFT_o>Pgc|8++)t zvCnkRoliv*#N$=CkP;(_!>GA+*DPGI&fNc( zhqHU{nb$weJ>IcLU2SMp&QLQTJ^UqG7TRlC(WlkxOT_7B3%WMTJHixt*!zDm3(gr` z5Pc2Na(iGMI|Ob5-g(c|6bZy_Lo)nS)vuPfsR?zONw!=*^1ZfrBBqaU19SW-uEK+| z)_{SN?-+Dn%5dhl>XS8jHx`ImX^bD@)FI+PUF}l4xfhPdtrK&j`ykC!qh^7~e7`Ky zty_zDNmINK*C1Y!r7}B?Gkf3NfCYMb2JdG~15V4tfz4~?&*5c^g`z`Z z=#B4PeK+MXWZjRlKW1HwziZcMx+a&h%-dfyv(A&#F$f-&nc2Kq!xpM%`0+>RK1|U? z-q(|?#6?KK3Tvc7$#-MAVfLN9Hd1QGRDF)ejYL(Q-Ll2&)ef8(!cgXrO(s~6_ z*B^Nm(^T#Z8!G&nCT4Fp`rg)pM%SNW*MoV~uy98g#?@5=qkJ0`NIu{%=Jg!uQeWjF^QI+r6>xn?l^=iZf zLGtDcS-U5zg@#s2dRR(5GcPAB*?E69XU5anB*7Mmf6JNEhiZO^c!@Vw+AOwjYU+_3 z~EM&O$49&>aJa49k}IF*o%lyxIoxTHL}|0OAoF= zz6PF{fhJCEMtI!|2dZ$#CY$9j3380+!@;Gfb0s|{{du?>JTh;Gg=wlDOiJ&&_dMXn z_y+p#BPN6~3cUhlr#bh+5BS}#oX~^mE!Xb~tb6JdD?K|*-nXA2HNN*LLv7fWm>bgA zU#pJZ1S(4b4n=lvHH7yGtI)yIbBNP@`XDb$@SAR&p@XC5U=Kpo&Y>MIVi;x*QX%5) zjxpVL0o)*~BMcGg)1rq6`xijHLw_GUWA%$81JxW5PzCmA_0^1Au*wGz88q{)s2;$I zzR`P<9uC{7q*>PHhwHuPfQGlzX8lY*&?Lkh-wjEOjy%S{$XTZ7(hBy>t*m=G_VYBB&!`cy^z%^W3yr2+TVJ0&M#I`;W9 zjs5o<>wgops-xCkd?#TNA1%grBGb|%e+;*_>yO@1D60vkM zjLK+TgV$5!=sxNL`UyRcyz=P!N?67UHZ`XG;l#D%k(~z9-qkHK;u&hd4;CStXGEn5 zOU^ZtUY_9fg~@yJX`xt;%XEJeg<uuYJg8^ z*!MUo0O8}%1%Hu8$g;oFEnbaVELAyOk-iw&z0zA8(eLttrm30f#suU5-iP4Qh6jP* z)y9jkfH^eax*Xja6|JyT(cUf9IO0Y zjVr-d(+~67=)?u|%?Rl>F9`R$R4sNBvSKux&kXOpBDC_jkPw^283HLlaL`k5HB7Ba zwyd!7TC&u|a`?c;eZeh_%gdJ|^H_T6QVKE(_VE8Dou_c#;Z_VQYo`5#4OONTxI9By zZ7pA1Nv~1n61g^t-tyc6&h=wJ$W-7(h{LDQY%vH=$;@$Drmxubmp;F|P5YzlBy`K? z2tT99%I$wP`g%0(Oim5N0to2G(qse;qXyGJr zi8PcW=~w-f=IGPE0xT~YWTs9obF>I^+#AQW`!*M#1c3+#GjUkRhdh5al{myiQGlxl z``lqBqfN>qeX>&RoAX_E)!8JnkC>u}?C>zl%+Sk^u%fRL45{Nqe6e_9bph`4+Gf-C z7{{k#m(<+XW$gMihU412`xd&PqCu!Qyt$yC=@l}%zuhh=p6-HZiuQ|3dPVC#>V=MH z#=@vU^jqM&yy&EXmM<)6wtR_Z?9yEFcS#S~!P~djpt~l1N*%pJFwZ-0N*4-au-o9g zG!04Ut2Wh)gyTXrw;}~4s^z{9P&R>RIG3GHz{Knu36!Y9LyVa9W0c^qW%ig^sSg&J zqH4mw&)^0^v$-C48XF?iET&dmPtdGtV zA92%9hu2cC0Yp>rL9+7;4pbSKp$=cI=|9yZ$-T$|CwzKbxdTIbQvLS=J8Mt`bZUO4 zZCds($fyzxtj+8S5x$y~zVCzYFe?=}v`TDs?@qAK87-sAq^5G?a;V0-7hGg= z*@di2NjO5_Ua@krFn(J#m5G!eE&@ybxY(LLRS56#qY{JWX7C8GOx%>+8Pz9q`-3_1Z+3_l7y~sYnjE9LosK;cnFIV!o0<+6fLw$k^0%!SN$B zXcs_4LHOa7qL{-@d_-)cJ=Px-LI#*MwPqR##4&A+Uy=- ziBW6Cd9LZ4d~C&U(*!TPL?8x}9Or$20ERx*J{G$`;MUec;FfKLm0xrDc=M0>IQ|`$ z@pQ@5o&_`|*Vkn?Bde|6g7nQ5PP3ZL{K;8F znt403V`X+&286CjLlsKdsw#7ETEpfJDG;5(9!GddAvD4npCOv9d!-=|+Xnti#ywrx&()IOdn2XWwW!1vaF;lruy2gotaJ1;M(Y@QH0TR0{ML z*VVyvC=my*oX1ESKJ`t1$aD?Uyt9|iYF)x|7!lD^lk|8B}s0`c;3v{N??bJwP*MVw7V!8--Z9vC8)vfT|Di3{w1&2UCu?f zGC`6-C&UhO9JT*3ufRi_aYx@gZT5!^Sd+_PUmH13=&wE${E_~XhE4;jb|Un#AgW>f z1B^D{5D?fGXXJ_dI zEMZUNp3CMwH*r@DaSHTd-+%}`tAkyzSe8G+v(6r(H2u+fG<>+o3fSDl@A?zIc ziDu`G7F0-5Qs=G9x*Z1uXEW2YloXE{x_$_7;2Lah)6{misn|XZv7K4G8P(qgngpg> z<=>3;bXkG)U%9>VUq)~^gjVvv&Q}(AU45EeX?q8>8nf|-{R=zvkcJbfNra!5CTbj42`xJtP}=2`&_!*Ke=e z4YG#|V*s*y>{p>li$V>!G-UPcmLksBu_d_SynY1->D&J$YW?{4n8275?3jRI<{)ey zjGE^!4~9OEM*|c~l6=y24LHLku!~XpacW0kxKkp%$5$|~c9mmEBgrm(vhByZ2xH(q zD3m2qdNzTGJfdsH3AB2$d1K5JpZ;P2B8Ky?a?!AcK<3gCn^HNO?AGTJE=2$4p316zod0ER*uMSAX>Jsou3BQ#9vmw z$Dtg1ykGr0<~ZBJu?QN`E*nk{<}C$)wD*BTt}hMmFt!&x*GBfXEu2LAM3CMi>Iy>d z^rRjus(GT=0?_pL&~felS!mJAr1xtQ-C}V{_opO^RqN!*=$jNzTjrZb{#pF|w8|O-L65I&YEn%9HN|vzmmR z{{#DQRffog*#MzLn2?A9GKVZSXoG$NqIAL(Ud08F$I=T0gx14EqN&5PZl)Sjq)s_o z(X(gSTJ}>NAHdboK$jh!r+%(YT)E+R?}?ggPTw&rM)c0NF0K-JNMCXVclBwjd#gJU zG$M%KE{xf;yY@>HP(K$K8p>)ATq=^D@9^x+yz zIyy}G6si)S=%e#|ph}b$bTPeofeQ7A0t9=n6DP1q_57uUM`k0p{ZD#5Fy?tjyv%c4 zo^oH3V{EpyjNk$ggJ71odf9JgdD}5^Zb|^`Pg)fCThm9Fs}k;Wz`tnS_77ah{tpb> zjnr>}@u`RP6J@Q^&oT?qL-J(m9oft))_=roT>?MMi^AfeFYf4E!1)g6_Iu%HKDs*8 zU=H#J!$-Q?Npmf^DLM1|0aVV^X+qa$LMZFCMBECh;*55g&J1bgu)H*WouJpPn4gKm z9TzZ4Ij?UyaBJrdFy1>Y|JJnxQcFpJL$x>pu3GkCHJdwVDVx_kX^M4OAcC*2T$n$* z;_S)0E^dcDI$uz={f@;~q%EG*AFHG@ z{}5Ups`c*G+?QB?Wb`rWl8HClgD-dBGk}GLj+dgx*he+etQV~2SSMKK=}w_tjo*M>=&B-MH()pcoo9oXjbu}r$e!Sq;Hdg9 zNrRMr4|?dZgem^UBm5iPhp_t@S+-OPDl2;6vM_yAlUx@qjWsDh2rQWqn$c`Gki`_I z#fOV@Z0PG6jT%Y;`I0+Jn23jU1Z0(8r05N=r7dET*46ngcdds)gs157<70tG;7hz7 zOFNyUK3UN1koG>!V7TWhCPBS1**6J)bDiMG`nvQOf}DyOMRG3Tmww}OviRi6OedN@aMVDx?;zmW>1SsT5G~~6ML(Ee+hD@Hf{oz zo+2M{$Uv2-^h_eJX%7^H$ydi2G3j4vGl@fN`W|cwEa9T4cr@D`|5?*V_Vn}oxNCl< z^NOh^$$O(|{24e_72!3ypT3D0@)`yDK|o1%4B~=mo$OdK0%?d+uhF|Q*TSXU`Q1i6 zOt%HR64$+0jKP*egLr&5v_JN^wcxB&oC93PZ0Zh#Ireq8@TkGU+y`BOF_VlZ0{9)i z!h;yCi}4;t^89ZPS;|==Lu3qPs)+3xG6_5d37-JfjqXi!VQzf<>U`jD0Lzo!rIOU= zL;tFhf|xhx`H{1hT0DCiZxg;=$1NT+oQQzF_eYTUCxun#Y%B}W=-Q@SM72O?Kq&Q> zDEyl?<~5D}+!ur$4(qs3vju7(o^!G&XVTWic(NdCe{UYk1MU6+vh5YwC^$=~0hQEo zBfI_q0s;nk;y&h`PM;miNg&z4?<}2osRqlnOh=q6E@Tp5@6uO=$&@==LEa03KN2Py zUgr{fbiPq4yv$temTjl^Wm^U-R8i0!P=k$pdqncklvwvXcy;h<{iA1&`rHK;4}jdv zWhN_8B&mH2r;rRc^)J1{Pfi$>7aJd_H}U}a{b65m5@#)IYM)*DtTA>@|5sc#yV?NE zgwt9zJm)*9qzi3SnDFirkZhSqPjI;Um~0Gdzy_^fLrr8;S zoUz%nkRthe8g_4Y8^CT`Fw4>+2mGY`e7k$XIouhX&)JBxvBl9StSt3Z%>pcoRtG_N zxzvBhZsZp1rT^Ij`*Riov*L+YM}I;)dSO#Sl5zEv@k4MYs%WE^V9ESTpuD*5)L(yx zAiz5>N~jTkA#~UY7I!Ee3w?w4*#R7yTYn4 zM%XKa=?UJVUj=efla4KY_-0MNnWWQX)VG_P+LTAFv!ELz(!5pn-q&U!sg}WB-Ar9w z&j;;+JND_cGB_>SHXebt65VMAyw_aGm^pVg5c;}z6a5yA7ibx|%}+tz!lHMM1L*AK zx6g7TgEbK<0H^^%9n>EeAq4;&kw2NjXIQA34@jpkHc2)$3f^65p2?!&i~zk zOp~oUIuXTWISfFLHg8R%m`QptSx%jKt&Iu~^;DSC#(VHBrZV@G@?c7&tOT1)UBXzb zsYu%3fzi#J9OlG0rL^TPYT>&%v%*(nKegdB3=tog2FH@?Sv)k{RGC^rhr3mY^@%Pj z*)exk9x0(KxhA}I`_|lIJtO-@0?Bhwf@w-cjf;Vnfqao(5m>#I7ylsk{fdBAcVloV z=R>Lcb5-WkraK0xLf!ZCVMh#l#xI)cG7{D0+H4?eaZZ|CSUgLc{+00O%@BSD-fArE zaJciTb!zns(0vp4xuN&D9Y_?`fl=SI=P(PeMNbrP8YnQ-1 zbKbUB_!jFUFJx7Z9IkWOjckUi;^Z7Sl4ebi^kCa_(Oovtxw-8nfS5C86F18$SDwLe z2(M&c*6o?wc*B~0LuPpKz0c)Sn4ayO+`Ci7jI9_xH7T>hw5JDo*~RqrclpM^d6d9zGZDw{Y#l;-l;=3{RL&f`;*<0-=m!AB~{pI8?>{&?bt-sBRuS- zTfc`Wpa?Gy^zX4M^c{O+20de-OsQR%)|1gfOd|9gSz1$S06hAp3WIPaEOqG=g51sV zx9Jsa_43b0mIAuJK-{jF)?(U|HrTTzT;I`{Nvef9JPBl$_A3{rzCo^>ekPO;+xz%$ zBdV{bq=L6FdC8)0bjHZe2=}e5HF`y9=YA2h#x*yRwMvr;-L-C9eVY%xcxA?4l8n9` ze4N3b>Z~I1QtHo9kGvVt@A$7#4>{9&JpEzSDC<-+nDY7YA3wq3_^%&@VDtMWZ zWdj9Ony&ra5Ps|ldzBZ4InV_QwkkBev2H~gz7{$QCNl0gd)i^JRf8`^yjug>!Tmyq z@6b-Cnqf~q*m5RSjy0XUTvIk?)HgBq6Z6O2X;>8_>+8Y(YNsCs!<^QcU#HBfGp(4J3fcn|^u-ep zWS+_X7~u9IyILCmBEWl@Hh*eu-eofPI*hWvp!6Nx$Ledc9q=P;5A6 z-cHC`UJYJFu^uO)G#T$ugFSeSuTSeFhXFQ zgvbQlBmhtS@J1mg%QOizM+gTSQoFqw!%AeWRQ47Z42> zp|TzibMCOK@)kAg()<+EzE@q;G$*eRwiOC1-)^;??rx)V=@^R>~)bn*POSUUnJoH46{kj|8Tmnm)$M> zv2vz$JEprCIb9Nmi4n$siAik_E@Dq@pD4uUs2S)2={NbS1=F-0DU()(YODC_(#AS^ zz)y*o8KfWLMrhQzDIw2C%*I&A+ekGN?HFb^S>5rwL38K&5})?1X;AiQ9p5Y;0x+^2 z43?#PU363Fst3A;6zo+u%`Z|{!csnh=@6Q4vg1q(i zf%1LS#g1WG3V5>`^etpUXV`e!!ti_6*_DzZ8~uY65V6#QnNlwVOX!WH8-4~JsOfi# zdd^SE_YXYm<8*2uOL>?Ize@LZLlB&wWJ}%#Y<-x;R8Fq>j&TZ-8h(rySk>+FmF*>T zwR6<^M{GOGP*ZOs;U;5)+GLUw>qvL4m6s!_JDd{5K;?f~Z_9QTc5kU_Y-roa?Vk_w zK&dvtQtI?z6e|awST7;n2w2DF(@vAU^ebZV8DkBpdr%b7Q;1r^epk%oyO>NDhc+OM zuTmXA5j@~sTx|T2g$A{M{Qm5q(f#Y$X?pgCJNvV%k^kV(ZLA4-ZmCLu(i9bG!?938WG=&iS03UQHYsQx`RL(e6WYS zxy~aEMr}#sYL%WFt}-swkBH6Jf*oOt#atfEUFu-=AilQf?vZQMGnI;RH`Rsd;{~;@ zEFItLR;IY1M{h0Vx3@jo*msawrE7iJHSCTSiED{xqBrtk@%vQcE*w-&ezmFEW|it{ z?j_d*;)1xBs2o)1zN)g4YEux)g$|Q-?PnCeY^1-y6F@kqF)r0VB2&gzMozVS{?H*t zqRw91p=9)Zv~b>7@-BVVCt-rd&uXvHUAVAn_)YmGr9gaKNu^S$x;uvBEKaz}lBew1 zhX=-CI^TS^#f?g-^{8`EPmK4niQQ5U#yR85-bmON6(|wXTgIQM>}C>-*zS~k^yugi zcNim=NBjiOp{#A`RPuCE>5QJ6BBT5~Sk2W-OL=x3)ZkJ0&a8GN$);0ML+~lKUwwzk zrZC1ngNyDoEq6Rh zFswhc(RpjvgCRRh6`6~BC88*~M?{SdO0!?_=&06)#dgIzv^ENhdncHDj5w`1%?Wr7ExC+xYMg`>t|5l9j z{iX^H-{&I&LrSdhcM@$M`MEkf+xdjR56GYX_%yV-TACk})>%v*=Dp_`q#m4hf@`aj z!z#5aep#jtmbYFM^<=1Ll?rA@(4WN`G$^bOd{xxNcIdsbM)KQ$i06bP-20+)h0+JF zhj{VJOS50&f55D=Us__>5~lI}#R+{ub|P;B%+37{97Yc6ik-;K1BY*|I@(z9$h{Kz zrFyWPNTeGVa>D)cL6on)8zbV{q==5?B}YFheUEJo9L>gXDB(s*RrkrA&Gqr(=i#D$ zmlzP*m}O_VoMj(lDfjab>vnCnG6_pB##27$D@VVOA7yGZ^+*yECYyp>CXBt+?EUfG zLd1=3fjibP8fR1kh{&0u_#*Uh@i5$*)tEAne9HS@E)#RX0WRS7?N5wHQ`av zhd}#BYsJVq z->lIb$dn?wpEqK=zG6;*zn^PI^&Z?~Ki5PW?~OF4S5=ir4s20vI4_~FNSI8!DP((7 zf9k{PW4OKv;?up76qKgJ38xTS z|4^nyxD~@m$Me0REs)94_L=^D_evl3HEN1-^baj3Lq(cO&?_x=LaeL&)k;lqHC$iQ zaEPIaVStfiT2-J!K6Y|ZjuOpweRqswp?9c-nncSmNw6i)@e6W#C0Mqz(-&C?F7k7~D)K8ozAX36=Bjo5uM;e4pAdm^;55q24l5Pk1O1cz{ z9J_UiLr3oH=nzJ;GM=^1Kv^Iph_ncQHSf9myh|@h+wzShskml`=KF1Z29J!1&sPt= z3>INJ)btR|ju)BG*j2{azi=7cpOFwHh=glX<3AzMZv*<$56hi}0N<&7NbwAsX2;Bb zC_|cdgPbWk7Alo_mi{2EnezF>(T3soGP}LHagA98twnU$JEf2)2P#&JCbX{o_ApcX zt@W!FyBN4UzLsK5f(OkkyrixuFo_}u`%h#qH&Oah=*{*%!Hu`h>vQbJ`7dDr)x3d5#gCxc zX$lcUTLS5@Y}&`!zVW!dy4q#5q4-G$9kyBrH?o*3#|l19u}J*OeWEgT#)XNNg>~f7 zwdb`&6Fk|=;r`Qx;u|U9##DfQPHy4p*+Nua+-%w^_#Ca4fJ4pLzzsnX0>ixTDC8+HUoG#iS$6Mae^Pi7*Tip=d;~Z}(fs<`P z4eB0on3uiWD+)iiSo>@`7y0N!V}W`V?gW3Q;SNKNC%Ff50s#8taBPZ*gQP0avS-rX z%gWqA7X_6$dv~0i?{;vNdq*inz5MIM9Ux8zKhG_SRq!<3)^bs<>#v1dU)sA+%|^;61q5ZypS+6 z>pC$9t?SpI`e(KU?)BBZCB?)=yt>H5q>iw^3VF74>=+9Z*${7`~Vxk>lYf$E;#`^QNC`00!bJVtX4_ZDU}ovI5-u{Q@PA z#gE~HouD%R%Dlf|{lALuDCrbgP5*5sJ%1nD1=uy3cHNd< z?v-ff*ek&+>%}EUzpap}1lyA`9)9jq?(4bSt92O=CDn7);`(4?q^=1=UCU;-@H+W0 zu~C1|p9ZLSFEh9$j;QBq>HE-b+4 z9ElO!f7?*^Zglaj95o*Kk9nitj``gwA4qz~z3swDktGha?a6v10Sm7%?O?kV7GB1l z1Jze%GV(jAgUWkkWu4)gr8+ZdBn%a_Yr==NZ=*aQJ4 zQKB+8>FUXK^Kvre?l+cRY9-wGVE-JCOzvx$SNu6+SHu(WKEh(>o^vLSg*NhJ*PhT< zgd&)5g*PJ3GZatGDx%;H`s3670r0?2Oqn2+O`hH-@XWICmLI8(q|FuSnCh3+REE_Z zFXOc(R|pw3*R)|)WlR*e=vaEu)Yi{OYABxQdS!a~#LkN+2#KYBXv}vkT5h*RqUD0@ z0~=sfU4IJripGme!oK#-qBq(LE)``=zUIGY7DT_Bv!ABOW#Cn(t=@k~IJc$}4p+qa zy>6cUyhp1$|3ogFj|1dDpoiZIASRiWA)x)iYjYNO0E`6t= ztuJyEW1fmuvA>M-kZjhH$_RHF(Uzr{H)FyaPw@t}Zsg^n=Ep)1%bhL7tJaBY`m28_ zg3Pt4^e%p2eE!#(hqY5a{sL{@?R0XW$98=62I{LGY?GRB_doH#gBKwQ0vTj3Y<I!6nios7-3>RqvHtXKuf@_M_up1l8n?!{U)|mt9_U^6bVuwg z>6yJsTjyV;?~7b)p6hm`aySAc|8w;?jms46o5P*?^T3f#*Y6SgJ_EFRlxC8Q%L8BZ z7nwbh3+~(e2eSFzdmWVW)~PIaOWkHk7S#yzR+GU$)s8u)>8E~lvj0YmZzw5~Q+4_# z-3aA&yQ9he)*8~>Hlm}N9R2idQiL>$a85b;_#k|>u(N@R=*t8lt&IhGua1j#neCUz zS@f<%@_n`HDovrH>O#KnHkO6S=`z{1V+YtT32PvEFF8FlOZQy5Y+d?9kzo3XgAJFP z1K;T}hhH2g3t6g&)^k|Wck60j)>*vSPeJSB$zz_o4s291<5k(RHPvWR<*G7OSy_S7 z$G0yHv}ZA@*2d_vH0sayJFKl+CFO6w5n{jmnkxFaT0kiBnf4?ASl*{1M~~A4!s=cb zN|g3j59V0|Rc%Yec4A|(M9%TwVA$FY^fMU^%g>kd=HDTw(;nk%xAT4*7g_(r@3tI^ z&f7f_$tgE96s}`l!})i9k@#@!qV|Eio=?p2f+m3P?|On{hp2kzYe%_>TY&YVA|Ies z9t3v*44DJ0a%W?ldk6jTn?jqTQA zS0KE~ojoTD(ic-x_@n$a@e`<6eSEz^z%4|1R1%YN>A+9)iT3#d3c87Cnv`m8`>}(*+TBW#(J~&x;9L9amld4Ot@P%W2zpyC+_G{ zw*(0wbBpEXkhqYxz+p#u8V0OEFDQW{-K|G-obx!-##e~J_j?d3;=i=2yZ*juttoDm zq|kX9%ODAAs*BVYsiSwZoYeNbuwiJsf7GK714G9GwT@ma8NapCpN3=Wqbnn;E%WAQ zAA}(z+2{MZ97Gs^To<6E`|S3%=2Md5y?5YyS^M+&hbR89qH7Jzj6 z@I>9&imf;6mQGiJg+jYcd4|7TKk^1bTLeNo_zTk-wOrE?HsOZa^k%QGlYdvF-7z{7 z^<6wfwxRXSn0?Lu&4KJ&BLDGagKgh6pRe+xqQf5LJ!uKrIN{uLtw~yjX!6(Dm^c{P zn5T--6pA<6aPGNqC=W4ZIOI*H96h^Zj6_b3t<#4VTPN!@7ycNx(3c7~>->72tC@fT z8MWHe_o9$(D1>-=e|RbV0KL}bEm<#De3krmmV1B2(*r-AyLR@_HFldRL2{-x?|E~k zNb#av=)vDr5AVQP&{JY%HO&`HH~SD`=Yp%KlgyCLXcH%r!~S@{^K`M= zFTJBzmdqY76}cZ1(a88Gg1mnYt@>5Eba=PP5XbZD>^Uq{Ok}Qvayu34ad}j;%RG@< z2lB5p`zeKG*nC#8e5`ZajSs~;>~3L8@*D5t3%<8vs_uG#K8}R<@}`fLUW-Mwl)2n` zc!=c58s~AIkgC(TyV8x^wqGnLKmp%2jP7?fye@Xfa2(``wyT>a4@R*j5<~AF65Unw z@<-^I&+^@hXWscaxDiv4$Xx`LD6)Q|0^L@+Cw5RIFu~IZcrr4Q-(U6Iv*q# zV;iq9WFx$Ia!Bp-;dxb2+e_!dJQR6m&yM1?J10#OCyyI%LpwNADo?l*!%GFJnyXfB zYb~7qF{b@=qOP{SV^pS#RoWFk%xx)m3^No+?ua;0Af#KaxmT`#tSo>W{u?xRZ+PIf7JCk;*8A6% zVYA9F8sTUP$$}JeCDfwMC6fDKXv1G3NxaUpDZcDu4-{WpnjFe~G1|=oV_`{t)O{Y% z4M@mqxFY}2l{UupJyyu#eoywtKBH-Z5WmoZVP%({|55z$02+6YLyR{n);b}*pKa-F z>DMNe5rI?zr=5M(SS&Fnl-oov<5r)oAHLF^;#&N2$>9v&*y!vxD;$FJH3!bEMu?ZF z3qrh<7@nN`_(J1Zuy7ZOSGwblOom@-|rdam9<|w5Uwc77Y|%{q|$r!hdV& z$eC=v&#clvuwsp7`7}GWC;q9o5fOUb#wm!!X|gluuNp}2kFC?GQ?CI`k0(b!zo;ja zTO+jX@4f>fTJ#g}#muwUq@fif8=T`-hGoAtwnI~S4~OvirUyx{06l@|ci7#})v-?% zw)YdBK)VChMj=bF2mj#8cA@o@3PY~J$EKE|w{0&nd zjceG`x3d%_U{|zO0VB&1ZNa=_n*YUkiEOW~bIQ@TevFnc+2H~Br)SKvs9vfJ%YDuL zr4#Utl-$spY$RjLhSpIHGKLD_4W)kgjnuYACD`f z84svG2pP+0AKhU*gkB#VVou`>@FAGEpHNoRL*VDJbt&O@`#$>{;$L>i7h*5I&kMu% z211>cA!=><6H6+dWl5$N?3_@Rbl`(0wDFa(|LrK9zj+3zf9Vg!GlIF`{L7d159R2Y z#E5q)Im~eW;v&(By3^$8r>YyXi^z6%G!sopC4orQEdeEOIbW0Kblvs9nA`!eh?#XO zk1%N*dWBVLy3K(A@2|l;%(m)0r3O4>FUS;a1=v%rQp{d`Y2m6T2?}NR`7C&Km$6zU zl#g3(r+jgKLf2FK^}r0d?Qh07B@3sDXy4uJU3E5AT$>ZbJ3uwWbtiegtwGDgm-<6R z=O#9XH1d58{K7hR^T5}n9Yx&+ww;Tb7fHYNey)FSCg@FE_krLG3NWZU{ek?TPDD=C zlY`YKaj`dO$<=L`D(qi11JH6EwE@aC8r1aIVRAZd%ipG;J;x~K^kwF_5&u!$(Q`8) zT^vdpKDXPb&(G4!m(jR;tk2mJB%f|NZ}ldnhuiU9-Z);dVyw)r**dT}vKKCK$hlAP z1{>M6MVNWYZsX1RPwZ$_z$HEltrULiF(%{WsV1C3BnQ4~!LVmS`YFJC)E?M!j=S~w zh+M+GY>(FP2P0KO_ygpD+VC;&p{ekO-@Ikvg!4%Ntpl$!pWZ%{XNQC_RT1_g$sH3K zIaQ5+ghCryF}q%%=US5J7Uk9W7j2eVAQX3S7Z`lFqOLO9Qh0Hp-~TGP?@1;{R4L&0 z4FH({UPUbiqQ5^LzPGWh!FAj3%?z?EP-Hp46>wV1GF_2=AxxyBj}tDgUOkmL)@Yhl zJZ|Qb$We0ns%JF5avH_^Wr>2{C0VCVFtYv>O}H#*3q)`rwdG?A{z;d7{8s7fqVPsM z=#K_VS#`-}p}46~ue4mf?UC6YPlgg%rT&=j#Ngi7!#l;jUmzv9tr#1uX6*barz=h? zG}?FYbNoNY;@(|lk0O#NxNFXs?DDFT$Mx;jROmz0vxRum&#)c= zJx8B#fVkxm$R}Ri7bI@}W`4)}_bSa+ig*h&Y$x+nK~fCsK;9=;P5mdq?VDWOKnTYc;?44t;R_r*U z+yJc^Z=WFbFOuX?iJaGJ6q;R^pbsW3p+J*KfV3miQY^tc`53A$<#FGgEJ^P$g#(do ze8<%rTvxCLyWD8i{iq~o^^ij&QsH6GRp9~tY)l!(Zh-8M^3SV zpW~h#d-V-xLtL?YMFu{(U6SU;st-FK1nhm9VsDu%JrwHdY4cb5!L02g^7i31ujAUE zjas&;a&e?>Qe0EXsAd00X$8Ebvn!Um0+UnC|e}!Q(a_U@8GzT`XXxbdH z{j&ksy*x0`4F@vwWrKFp38|4RU+B|Z}bK%xn$&X2u8$N_rg^Op{aL;&$G=EK2McxFn$w{ zW2WFUZ1k&k?e}{xn(%2NVSkevO+k{BfZF7w?y|`dexxBYV(C>X@h@NILv`sxgLlq{ z7fwNWSEo`??ZJLQH)VkXa%VwOuveL1ZS8S=EYk4^KkL}ADe_)8Cr8smW|dc8elPm> z8O(mKezh3N4vF6i%8$GDrba(3mj96OIDThJT12rtNTg4cZpm(fcjuba5{m@28$gr+_G7(2DKQR(eAezJD#hMK51?H#6AOfP85PLf1jOl;17jtgJ&T5yOr z`!JsVeKi!xX=F6r<42Srq%(AEsCws5cGME7n)k0R;A$;M8f~T$E>D@wHqA4t`5!%c z=zZn=_|CF5VRF)rhkRy@yuWGgcRpJlV=B-O=9Q>UjTWXpgOrx#joAdJ0_L{yzq(zQ z{IZ^w+2TgNj_8gSlEEW5_q81Nc864Q=;4If+=Qpmtv~#LKhe927EF@|#>dtv>%h5j zAwxV`Xa2|8mB&N9fA3Zz5g`$>gh>f0*+!A*D_r7}dy01B(bI$WT=Q-zn70_@4vTvEdAA~bc_i7LZ zwy}}!wi<{II%XX2WBCC)TviQ1P7dhoK6kOfF9ka!@#L_3V#XkF$I#WZDD$DM@Vs*& zSi35Kdua}1kT0eu`NPi?O$D42GC-F@|M`C6( zAI?@388&8{*JVh2iWA=?wh2D^aD=I!NwX~gMwf;)vRK|uG|-WxE8x`)(p(w*_yH#5 z2xVLEpZgktak}|8>JFlPuaOjO_2f%P>5WAcM9c34=E%9=C$7LVcf?^Hu4#DJ#_d1N z7`_1Z{`9D|QW`KUI9?P>T5i~zXQAYx3mC_)N?m}PTNF69J8@Ga;YpebhyLLer3>l@ zyaj7weDg<)s};7+Y7M=E6tV2{xwir$PJk}GD_kv_T^m}6iIsUssS`cE#Xk$1#&FI& z8o`rznP5N~ zI~laAbSLe|&Ero`5K-Wt6C38S8tAmXG>#R`Y#j;&$|!;(SOD-B`1pgequ-s9e<%JL z%1^B?U79|>BzEGQ|8MSSy`@m1T=us}n-d^~hppcIH{iH;CZfo3Chr{tudE|gM5h$K zs%f4cK(Wskt)%rOAhqjW*1b5TPQs6%gso@*oRu;w9g_=mM#4LZV^B4S533p%dQg`RtV16*apjPBmXzq8$9buZ z!G;N=7-Fk+8P9Jtb=NSz1O_N$hcLRK;Q;UF!hg-^kM{Wz({?YiQ=3!2x|k`Q7`-kx z>hD^eY}OHd%^^d=Zj<$<_|I}JLRCU3;SY!?=u?b)iwxze2Lk*K#Q807Y+-t#)-_-^ z;FqKZasRKOX7jl8zxLW@D6qh4LkHh2-}O6SHTd7cy%daaoB@Kl`vO+heJ*qeIL@G) zbE?K*2G}1YMAo;ZEIQbP1dF~m+TB8oD-!{B2*z+iYJgsv`7Ef`?;;RL(MYq^(9xJv zKniAKd*5}X5-JOcYZu7R0X+p`12k8c83yHVd;5kUI-R$LOJiedEIQo^BEZ;T;$ZPt z+tyFklxK}rux#BK6M>OwF0C6YK(_PMm`K}VY{0jq3~Gl+#G+${V;rM@_{z;w_e7LQM+DAJ#tg@skD?!UC|%pi4X%d-V(j{hb-<7>Wn!yi47pSQ1bo5 zcX`X!PI>>XWS=!LJ_l3w?|dR1ESk)Ck8R^w`$o_xxxuq^FYpV2A3>gQMlR&!)ZhF? z-`7Cq-9vK=fnL@WtBWj5@*B`H_B_&n@tQ?mNpODhQ&44!na7^=Gx9moC^B+S8z`xJozzj1Ms|}a~*p~t} ziQjz@wbHPj<{?oGQh^NrDp&&3f7G>Ez8_HSl77_UjZLIPg0Jw4-x5jM7zQFX*l7k6 zdYy{wdXsx6|3qW}Q8D#n;ZNB5y*PdpJILWZH3Z0uQ9mmvl=Ec~T{HJ0x|Z(Ym*d=V zSP6+duhBK=ZbvvZngVeUjqRKwZP) z2oqSRS?h2iRmgbjn%N7*q*l0QRm~xPqlGIeZ`AZCAZm}3&WRm4;{0^EK&$RQ>{~hC zEE{1V82}zTYxV#$fWtjR;+?7g;;JxMwxWCv1%u+MVwT{Om^-{QKy1p|7qFA+CRx+Q zP{%DSRv*CC+QPC}&HyHh`+A12p>O4%k;GaVRd_Fx47s&$h|ExsAB!r?sTdyEA1fxu zCKTpHA5h>Ki#-P-*&H!`SRfvlo)}!XCzpz!wPtjJp_Jk@E~%OaK&9tR?i50ZOF%<0 z;yfNP()gluNG*;qz1Zl;ekA8zcK#UyP#I$owpwHse@Zo012e5xT4~F5>879S{WcVC zNtID?r82(3Ni4$^Ndv$25+kVlk_RUZ9oO#B6r}!U-%$DRb8X>BT8**s2kn`mn0aP3uwa7fo!aO-;_xJuZox7gDv~LAt^geBvZ9xp>#( z#8^pQ2V=iDoy;zWQR?~&FubP=Hy+Gmt){+-B|UsIzI^R^Jp|451c$h%gH-t*sbPlv zDRjI$^Z28IkDtb_^zsv0v+3KwED*?#7mxiZSflzY!P?dKsby|sJw}Yoj&A=}KrW1z z?E;*YH}Z?;7RQDa&x38ubxThL8+mOc+g7)80PP>hBFZ#V$zpR}OHfl%YxDV=*Jf?1 zmF-~yBL{F0N~0WKO!C%@qCXI6EKX=6Z5X!VnKIfhH)9@bbXK~LBwX92ZPi;%eE4@HsCMct6>;^Y=}5e zx*QVX5qiA}l3V0V0N6HMp18^+dZm5|ICS!4>8jIh2I*N}NgP|@56|G&wG+e%!+6Xj z^pbhpsO?>}BR&rhi2DyONB|WLWwc>ooEuGF!5z)T!?3yxixWwIAcRedmUR1#Kqnh! zk`_piRp9t(W+2M}ELjt{*Q<4wz)!Poxne_S&RS*dN67Z>UtA5@TIXNp+tX{eC}%$U zw1|RzO0NcunUqprUO_Ju5beh#G5zcq$#Jo3fZ~BrDDb7N077mI?gkUF{((4n)7;@L zBdKImv<9oA+NM~}ut-OCv5KYIher5Ns@Cfr`e31jpjJ|z4rYQ>f*J}X3Sf-|d)|i9 zZSm$zsDB>i(ozJGPWiWKnH{grq@gz7*Vp#DI$A3xH+SPD^a$gdxb*c{aKYYCVzpJ-Vv5>C zH=NI|_NuManOe~V+W_{6AkDQAS+$oefr7{PUvg-Jf~RU@ULY*`+jb`KKKw2{f0sIO z6Wf5Jb*K))SssV{Cq)M(n!}qCQZRpc5VZuxwhA^t`Fk2%<%;;cwF<&+Ir>OXP+&s6 z4cJkTrzDBqo*1QlEI(qG72Dt*3ARp-%`E~=OfO2VPMB)Wiq9}pYC5k7Mr_e#_T{w4@6HZNH6*U`sA!24|eqXDLpH=wL zpHyweUUm7Z{%Z^QxBQ{gsIds+eK&JZroH;#aGtn{oeWoF%-Iv3 z_2G!#n^PZj7V)+45K0_yxpuk0uD2)H8p!q0dcO2!u_f1eY~jaJz=1v%$^F?u;K+5w5qH&yy0 zNABi6Sq(Zcy(S37TJ?p$o| zvM`jYa=Xtnz=75k=^78N=pfo>5 zy`cRrR$zeZbuJvSY)xkRBZJ}*R1!dI?i0$`hXmWHGjsDh&_$qHLcj_YZZbeDDZ?`u zjQ2qlzC>MFdwnW>6U-WO%88>5^X0!t^MGt zk~%>D_xZpDZs(&ANC!d(bcPlR8V!(=8x*%W1O=N*V0KVLKa-(3FkkL>wDV}#rJA| zC>vxojl;~p9qfrAUJZv5C%)Q5fVE(NuQ@Tfo{qx6D%38tlZ%F=MhNPUeX>?+2fKrh zAw{B@DOx_ELJO%e{lJsQa5kHgXRHeb!%ww<#$o}w{s&+rV()1L<4pht2-lV{{a149 z#jO3Bx*t(N;jj;f7DRyJdKvvLyEJod z?)b{DzbKFchVai*s{Y&WxgS)1Vjn;P8GIlVT)S9)4UCJ&*Zi1xYb9^`F|frlz-*)x zNFl9}NmX|E@|i2VH^EVj1WzR*9ZP;=iV;i9i4FW(E405#@e=FV zE(P(**F`;$y=k7&LMl zWA&+$n<6K;j=vSGEtPAs%kTk|QygareovumXvY!YPzlvj840cHX6dJ=80c{4Arw}P z+o_|A+Az>w;GHWHF&;R&e1YQdP2%3GlXXqo9*vXLkOlVSMTmQ(wNwIfet_Kqh@(Yc zB8E!kP0^iKVWG^(Eb74;$7d>`!e1Ut`klFT=9JyHj;9V!7xzhzW2cs@%>;0JV)@(d4nO!J2Cwr9ZIlaL|p;_i>e-rZ*vfK~??SX3{jnOfmM8Nmq9cKl-Gsfj+HrCS0+Qpm12CM9Qs8$> zQY40f-hs^#hDUci)?y+8)uyW5XKP)9fKz>+C*(NKqC%bUrc6t~A5uADQoX35Dlnk~ znU=Rh(>(6#iB>}dirgz%8l4S~wF-Lb0QlP}?TU|=-s2E~_$=}D)obiPMAz&!7tOqm z*xq1usB18928D%GyDBX7^lo@I+~PRq4iz-I)<@oDalj$C@$c>@h>u zuHtQ!qHiIQG0kHqFuBEPYb;%#?!4UEp2O8EvxjgHk7-=|@Ve79g$|P|X3#XTJvUb>6#jpc0qwF|brO zC=G5pTqd}4uX;;0GoW%`x{bvKmb%UZ4Y8mimeXekglS);$XuW)84I4-#!nX;Zvo0p zyVx~Ei@Z_Z+t`fjdrJDB63XU_7M^4dqTEmH>-Tq)b9HVLlQVQ&z?gdG3CE8h1o`t$ zeUCx#dHj%J0B8h3@XXRc8$WZwryXXn5Av>Ouf5oSoWmT-lfS?WjI-@Nu8VVGhSpWJgdsZ1M6VRh)epV`Ms{nZ zqE~~(FeBoI>hpP;Y+Vok=ks$@9WznZepH+RNJZD0BS6e53Z^2KC3wR1LQdKPv}$)B zxXe5{_YC?8hk;$!?x_@$lQ*2;cZf$IQNK>mh*0TAV0JC<_{9SDgFXx?zG=xOuMkQdP zf(wnlr+0i!_JF~6>RbnomP>p4p0aoj4A|lAId47Br>FWefeXs>aSq}Iq^s9!69UdtK$xG zv4Q)9uMz*H&?OLPrNDs+FouL41;<+G9~$ZHpE6>&3mh=AwTwmtRO4K|Q|^k^15Zg*NGaITpIeSvg!^(NT7u?ZQ62Xt z9FeVw9XU#PUwlrw!NL4EX2*fCc4t`6DB9XivIQfU2_?UKOKDrjQ}(ospsddZ=&M9P zYt~O67y{4PJ}!vCP0z2LHLqq$&`Jrr@o^)^N2?HObA+4KJakH9?e;L*QqmKc>saDvb&$j^bJB?8dlmZ_dfp|K z-)$iLIVfc%9~UU6IWOywD<{25X2Fc1W`n8}Gaih;Jiu5$$C+{9CXLS9uxrEj#I9VP zyYueQtdG*88=v^KL)NqPlO41Y`i&Q(%~(HUT#g?cl37}Mm#VRP>`oU5b$94x3 zMv|N|{+WVnu+s!Ktk5d~oTQ^XK%r=FdkfLH3n}sy%1sgKkvBQ-aklO!+`ee-7uvRx zhG1#pIJf~|9*-yzqNot;@+O`G0R4s#FMUy1DzgM?X8skV0An5sgciT6c({ z1T5Z3y$;kFezkuXhxSWsMy|f*~5Y8N2-`W0IGPn5FKyu~) z<`8Qi{Rie?(7@gG_o5G5QO1b7>bR0Ov53wHhQ%syUx^GH1VUsAVs!-t99v*aLUW*1 z(YV1Ycklol`!WWMJ8gE|mru3yj=96;zb%mGCRniBd-?hz5b`C?n)l5yJml%*#uT{I zKtKYQ#bU3UoXV?+?R~{gaPFvAz(3cqbH2#n>tbs&MMZ{dUw z;8=l6{Agsr&^&#RR;1iPkFn<9^IGzkMy(twpvNQPL18U=$skw@QrGwDp?s^aFk|tD z=qQF%pY4-13bn*uI2s@g;#os_t5{Q zrmN+&ly8s<_Fxxe!Eq zEf~en@AZ)j?z(U%8dpn1_t7(f#^5a60ZjTXK9En#XU3+Nz~Tws^`3l)n)TFuYrj*I zv+!z6P9#EPc5E7;ke*0yt)}wt@tL%(c#gyhflRx0)0y_!^RmM)kHb13s`AsvrXDq? zA7GSpfSs1eH(%WcBN`-gE#$NNY~{b*VFggWF~RlnrCgd<>({})%L|`hPI&<^pQ?U1 zc_(E3$rF%i1vlyie=DB99*xC>^d^attmy+;Bn+8y|6Re!Czllddi?Y^3RWYn33CEm z_t(3{Gx^mJLi)1uH2cbIdPO_C3QmD+B2~sbX&^KcD`QR!0_mJ1c5v@dJ-DWE*m9h7*$ir=876!Ri zz+3JTi{(jMK?W)<6iGL#)>UB$ z;T36`6*yQZq}UHY5SLV$n%rdP%1zq;%4^k+#5ql#YLZ#6#J#f^{B_hHA^dX;_SqLp zLjjrmh~~M`KA~)yJM}Nj04xC?q{o4f)*}m$DG)&V=^cQY#|1W;Z05w0pfxx!;dc+y zzh9E}W}N?wDzXmz*-*8BIahWt#0E>ORa|83WmJ4)I|2SfqQolZ+7E*(iO9Yo9?ar! zeI7ctfuQ9SS{^sEtZMDY*Rz~9K!0RTI=Z9>yFy~q_q!0Nn(1y_{$yZWt#p! z&{{unU{D*C#e-`&a_@6{B3dnn{?Q%mV6+;JZh%o8KWN!dKCH=c zQ%t(&cZkq2p1(N7a1NXRTtHu`gY3~*?g!`pvNMNJUZFanBYEz?>n5LTQJV%%GtFLK zl8zVlHefWe5*Jbx?%*DgnL&SMd(vjr__K&zxZl8IMGRLWLlyw&F|iMI<^$lLH^Ob) z5*b9?_CBT%)d^k5_-(D?N5Gmwq30g8c18-!s}Iq~I0t~+OY5#5aBg@=m+c#A;!jeC zEt;|abF`tB2{@)zDBQxx z>z^sA$y|}rSzXon=aMIDF{`mGd+1Zd?^{pbyG}yT^ke3VWaVkXv%PSipBK+=56}yh z7=TN{tH<{@5GUI5f1Kt1NuB%vb&A^>i$eT%L*y^?H)ZKS0;&y%nbt3h`-dNN2Dp^m zMS^`!Ha`_yv4)V z;HEiXVv9RdguBoQgVAz!E<;*;q;A4Kd|Ad2%BzW}x?<+8ZFuU=W_J^pFXltnG42xI z%i?7nzeilrj9>a}Y_uCaE^CJ$Rz9M9Kk35Y=UziAA_rz_mcW}Y-T$2hhp}o!kJ{e& zQkV6}qK5tAoW9&pEzlFl!*s9tbujeHcM zJiHi^Xz3#64cyo>2G{NvmtGk}Rr3(c@pE72XRZCXvEBsJvG8DU@W*lCD3sOSGq#tr z?=fV5rl9}Go?#xXy-x^Dv+p~CItTX%n`-NQioUvSYsQWR@yj}tPmR6wFFi1ERLSZF zS1@W{ZoquFK7|r-o=>NW#C&qr^o2jMA2+sHE;HM^7Alyf^>PI`c_{a>kn) zfF~4k^S142>1Q^u)VnyvbzJDQ0eqjp!)M{gi8l+pRZ2)1SE|4rblyr<#>oUm3*Nuz zJ(~@z0bSA@+bJp(x~^aJriTJ!;v2s4r-Zz8uvR$PyfAYCdIy-U3GW6jEc$HQGgc z{J5g$r;e7+*yR?{pKshzk#(wh0$1hX0PdlN{I$aw%XeiFnxFr(-sV_b?8hGiWWTx7nXGglEnu0UM<4z6xL<2&y0Oo z>^i{SmP`bd&)|mWSN0Vh{kAlHk5bc3RaXO7cu8fa=B{9Ycj6#!wm$cz?0amvR#xPR z*0nl$-Sgn$M}^KppWRS#buf(-W^qLE;2qwjM?0mV+OW_wP(nn%yB^LTX$z+5 z__+=yqMRsN#7ZirpN5`Yu@V*2rkOf+%%LOts@KSfr7I-6Ig&Ajne9p}d>o8j(w3F9 zSFYHsRV@_k4T-8nf@ovV*P8j~Zol3MBLeEGQEu?xcpI4C1J#FCW48t_gxvw?yDPwj-3%70 zH2(v-RQ8dei+m&kYplow?u0ApD|pijZ}-#=7JWTuB)J;7YDlSq&plH;Lzhu8IYA-p zQV~ldH$9gtT8}{^rMt}AGiH=|ZnS;axZIc7}ntNZyIzejKUzVp|0SQIg0;NR-P z8RV$;t~_|7G#so91P36BOJY%~{m6>WeBi^jY}Z z=|OPJ#W@t=_+G3cJ&pk!$LvQLhIf!}+v5NnM2o?=Ebf5xuIl5*5AOx$XRcl{kIHyq zU_$bzQP|A{b|hN#NExZVC%B#CG#Hs(HmrTe_y*S!iAbb-x)1NRw^D@IB4>9mkD<>!)CQqE~SY*!vye^pqWYi`;vTN5%{ zS*7_owu7}L;^ST$@QWYA&-ERX-p*0hXZ2CEe})t?q_!rcO>c83_t#?&3br@?jUj@& zv&8e&L@&56nRI8Y{w+NT{v8kiPJ62(H)RCo0o?fLO6iV;y32?%Yw#qIG^hE2pDnXT zz6_WY#oJA#NHe!k3GN**8^3GEj3U?rO`n7FkU}^0CxC%t&edku11Q+wR~7RfeTQ~- z1H{sU-69OEL*=+DK}#{O{8g? z?}+k?v`Qkt`O^D-QPNH|rP5aT&_q>J@i#PWt*a!S0rez+GTZeuH#IeqBN)MBDhnk4UU# z_IPPO&$TbwtviIV61=Y*B4PttU~&GnCH!wfOt>oblJqRN@Z}$y@qJa^9JpAInO+B7 z(>Dx(j996*O920nBP?%wHF$-_450Fg1I28>wj9keBvsR!HSX4m(So* z&WxkpRTyQjc>(ylW?27V909`TNa*{6V`3F3-ry6M8?N5;z_2Z3Zi|!n&Hmp8^neY9 z-YJl;YIS*BN%!N34;7MfvW$}JmlvbfukflZD2zU0lK}(9sbkB{M{oDU7yWHB%`u}5 zEI`Rnf=iOH)w3oNH4rkU>`d@bk!&>tdT&h^P43=8kwn1-*nxSNgn)Bxl#SBZQM$9O z<3rKRQ9Hp=3|gzLt5l_e9Q#NJh^Qlix%+e{h!X=Y2Zh}#u*b!dcKl#xW#1<%w^6YH z*Dh-46tpzsFsfXh#8qQyOuVgt&Do-B@?xo5F_^w1OJvN6nQ01J1Y9cXd?IDnpq z_m0G0c8iO}O7sH53HS^O7NrP_nM3r|rE^DdN#OskImtb~s*%eg1YrxQv>?HzJmHAw z_|9aP$ijn-c{3Y)26+bSK7*j7hd(|8h^pP+!SOx|6&HKcU+Ei==Z`w zX$Ci(CHMV_gc6?$+<=5Kus#vXaWwh#pYKNj6YA<8O{vTGTo{KmKMsHM2#0f6a4$ zS&DIY5$J%!M;+nXw2LJYIQs0;>pHHYXniAlCh zZ`TWOV`089k2c9%Rc|g9aTb$qp&Q=Jrv2_AdldbZ{1fG_SE^cbiye{4__4BrSDPj~cT-xn|GfdHUuh8B1UCoXH3KmHMLCnhMRn znLR}EEvZh6HgBn&*so+@4(E~^ob`~}*Px6T6&X%?9K_6eTwMHd&!R-p<-)^~clL}P z#-8*sF;PJHw}zkA+39*E#kcv!RHCzF3g(0(((?qoCP8G_Ii-@kkY?C5CFXrOrkx;} zbVu|PB=~)KJk@|2^Q>X+0&4K?JpBa@Q;x0S9=tt>lhhaT!mb|G*XTAG^{CpT-MwkQ zQdt1f59zmcgynpx`~YJAPQH_EV$1OKp7+zgd0ffuxI^ypp{?$OR9UUU>@ndF z)wkA%u>ypVN}a}<(^%a&H0w)ku3`|k{D3_6ke1GRi!}T5F(FqeF@XO(DsQFL*tR80YiVXr6u;RGe{C zgPTp@$jstVvc?TFYJoJL_ctu4i6%hM*xn0EsGOx9Mra=Utf4O4XNb3;n%YG;op-B? zaCyu(l>7~SxQ{j8E*If;S0$S{$obdtRL|!iAFm83ITzkhJgsx&OuQh(auaou-r3G( z%thmj-UkLy7`pe^2#XMx<*+mJeoMYUL^_ME$o;pLyT3-d;t1l5YT&>19mu8Sa=f-f zg&cRs$MX~(<&{?+sd91B9y*}&M9|id3m53B#3+UuJmOjt+$^0Lrrb8)Hjg3Ab~XE7)=9LfjIev3DG=2K8pgj}{+xZ%eOmn1D!DSS)Af`#E4C zAw6Xa^izu86Y|TbQB1s^5%*Jkd8gvfY&?_z5t!DUYGfZg)9|o?)A&P_Rrr3zpqk)* z`G`pTdzDs#N3|*kpBH^8bn`Q71+mNgGIEKW*?JOtm}`yBiATOELd`UpWq(z$Lv1>< zN%E7~=KwMk)fqA+3ck}QksRlAWtqp!X#M4WHD>ChyRyb9rHC1by=%5BW&2_l;w1FL zJI-K(lw==~mv^N0O}~8K;_ZAf@C5wH8&78wPjVrUVEdKApZS^~-!Fu8`sQ!l6;5|D zIA`HMgwT58Tjn^T2p{-5@s?ry4b0s^=7;u;kM94cLD3k*wu+aj_w`G-P&1#iM&v}Fyy`s zTCtn6UVa3T3a4uyEHOK@|I_=iXpIOD#Q&*&ke!0~NQ_aR?Y*-K8%Gl%q9vX3Q{n4VAabV}WS8!wjh;*WJv`CioS zATgAWtZ}az^OFfp*P5Ib_lLc+)aHG+C*68Tg^|xL$&_O*s{bQ)qLW%jrTgUsz!i+%-%gnPV# zzt}=7ob<_D&kQ}sC!%I{`S-{!&99p zQMLjoFwNT??yOMy7O>$cOd=rW?Ys($8_h+L2#X&-fe-7>3a)1OdF5Y1{fYk zGv$YEW)Ftr-=UqV?Y2|%= zjvC^7Q!eF>X88%z>oT67Oz*vuJRj8k%FX^>-;d4eZkz~bK8-0z}2_jZ}yUsa2 zfmYyZeA0P6+Z@%XlO|PYzIL8KiK;_U%RKWjCYy~Msgs0qFrl0_EN<7p;$10vAgO!|reoYfgMS(yxzwT=OF+jjBkcCD{1*u`4s|mV<7s2N zU~)jnB^ULxx4rC;B+FE)6x@1oX-Ot-TaJ@u45j=D+Y_l?31l&Bo&Ab3mq$Ib6fW5s zwR6jdJ;HL~)ek;6LkjBK{$xsx?N7HS?w+NvyeC`JbBXp4C&Ph@NYvZ0-NDXLae~)PC zlo_(jce+7SLe<&$$)mIKs^ZKhCw(cTN9ozh@7gmu?Uy}%Jn^yIx9SJay^92z%1pAH zG^E&?5G;~Kr(<{r)S_*rH2XX|eW#&KtT!T29y5+l+0A>x7xds{vxbgtr7_<~nVHTj zTTl&i^5U5_#D>EG8d0V3?AK|y_^m8 zKAIkX3-mf_ff7)0b>GT=K_Kma*3@)5A7)c$$73Tr9M5J?U*bL@e#|_Kt6Ci&x|l+z z#u-Twcy|0+qUQF;9?e@cb}Vemt>GB3OxwW_>euQss&YdxCaodrO$}{ixdyYgU819m83P00+c#EdT|uMPqmP7M|_sBWP@$#eP8u$lBAShA;-Lpll8A zX$IAC>BV7TNcs+*?Lv^<-6kA3FU8wiE%|mG!%{=N`9E3uaSirOLbM)xl5$#h9%ap^ zx`mQD$!h;LQT=aM_HAk041L&hVA-}pL_mmVQG|dA&xOnX50HPQ1`CdA&>(>Vtu8trgY0s7o19HJt_%wS#(xB4$@~AA$kks?p zTk}%Ix;x!O(Y@~QWij?7xR4a(eUP%9eGbR)b}8B{!BQS_F4s{55>8RFC7 zLYp%GnXDJ`CwH;0B^ARrQhN6LO#Q#guN8Z=#dT=swC_3G8TWXzbl$S5J)MTW#NG)S zXs@b$4VTCZURh#9DQ4W~WmG65>DygvJVZZ*PCQVdgqownlmpYfslY#Kq3Kwx=OF$d zO#yL>lQpLM4pR-rYj#IcPtbY_jsz+PREyuZI*wTGr)}h>Vg>Cq4_@8en}+m*x4E#o z4!?wMC)`I&*MQyNckW?sc$9Pz!C;y_4sLv*7iZ>588Nx!KGn8>n%|jWT3jA5ll$41 z?VZcjxXtHUX&0YCD-uh_B{OJgW*_Fnn0>Ub3K6Q^WHdHEEJh6LY9&^YY0|Z!ve1F~ zyxX9`qHaaKzu|TCnqwO&s$U_AjOTx48fhY*X_40nqvd~2;>R+{B{S%hpP}9S=L{ZF zW43W&h6v~EE$Wd46*!KkP^4M?(IXz#UCqoYgXM{joc{-Mvf5ZdWOb(G$ohA=U-X7g z4}BtY5&jc0($}z@gTOywrjsfsWynA>r^8=h?=GOkSpgeil%_`a(o=g7>#rmPUFx$V zvolwdA4)EC9r-FagP~h(A|myIN;r{n3?2kjs&rdHAlyp#s59&NRFIsDcxgsotbzOD zWhYUzHQsl4L?>z7Jq!vR$dQ_c5NaKYagTIdC*_N;zcbx>oBIy5K9h?f7uz>E3(>aJ(GU)U$j!Cw z=eG8D%}ue@d$wtw%t*-8qkBjeW8k=8U77f|fKPw^EsfRZl++E0h>AbZe%mu>N|2^J z#i?!GA0YXL2ZYs>PEkBe%xm_%LU-a^mB>YcZtn$GUd2O2r9@_Fyg;AhFKgUh>1oXu zc->iTE<2&%E;eCW^h1~C&IvgHm;V-Wlce<_ck77zax>xi&Y5)Pq*W@ju57PRnZSkj z1$8?3ibKeU()A}m@x@bEWR%5IkxKX^kHi3NbZdCRex*I(9`yxqE%0(hBtX45AYqh& z>#^@J7uiX$3w#W*cN#hPsZAygCLx6yZ?wAZ>?`q|fG~P`a&F%4+i;TFgM|c<6E?A{ z=hocA)gH_(k4*JUmb%mZe(aIy_DB?aPKJK8S4n==*$D&acKwh|kGYXs(Y>c$w}6Ig z$)|-M>T1R;PJpMk=dJluYtV}w7NZD#jZPiHrltA4Y=mx*;$4&AyV&Xuh6aOB@3)qp zBRbnLOrB|IA&WjlfQmldA_vlsqlW#lWc#YDa8p9u^F{glYtCNE!QWYsAceYTolt?R z7JVh}v4jshbZP>!_WsI(9**66SOo;4Pv@COcTipVTM^&kSqQee^s@%lnAZqG zYj_X+nsB#nkl`7>g!>=z!;cK7E_!{dpoiw^#NB1dwm+*6swy?}!3a{Hc0gxztJ-r* z@_|nv4Ssjm3#`}_gd!3_4%7ymAT$Y}VxC_^T!Pqvdk?K>KD(0SI3YCW1I5=w@^gX` zH_x&FNKhvBKB(KyR*O4l*c0IR=9%a95mNXiLijvV8BM2*)u}Gg#)CI{MlyOEwDI&i zPU&|xV3?BV7JEPlM|;jnw)%IPXKS^6*cWinN1%}_;B42@6npiW1ZEL)F?Asna))jd z#oJHlsN{5%N;OMNHbcBzw_F|wvCcj3<)>-ZDwdb~vs z=Q1L#-m{9j%+UI;j=J}qU<2H-9q*Z+vui*VMUwSKEHm_zl*pQ-GZ-ozhNwhwxkDMWNpj{*7t zeVyf7^~9o==qD102Elavn!Su)z^YTaXDKR))S!d`(RFAkXd<%Eb3teuCca9{*&N zvgO_3i{z>g?+=W4Q`$gVmUn@Q_M;0`;m~eDRIwS`x(bY;+EUr(2F2Ap}gm&sawBn@R z^H`eRBV*b@)%I=IW>1nGYOJVFxe~cbhBLGKs&qFUb7ENP@(Ym)p-VYbqBfmWj-foibG@qZBcET|N^FshAWsxQnQO2f+(dgz9`hyacGW4! z=7V>_2G7&jE4FIhPM@fNzkmyEwc!igm^;NE@NI}}Yg7o$E1dWZj(t=Mce2y`DP=S? zl^)IC^B=T~KA!*o2Y_3gNAXS&7OZRUo@6~->Kr6}4tmgkw;IoO3Xwv zyzBF8Zh)$N(NO&3=|(p0k6UBXZYg_AX$h&8z6a5M3fEJl(-Km6&4NQ2SZqfw?LsOs z63Smh-fNjhNu%7=lY$K{y3x7TIEDkREOx6;bP_^%-L*dzurK4cuM=|nr*^seRX6JE zcXnc!1pAS@(Y0-ic=m6?F8jBhQ{6k5_4Y@~3+1w3h^Tntt-koT!OX~YRpQae~^MrpPagg(=WOW z`k`-wnm1+?(H+zECz7=WqBZ|o!1tO6*Y9dUky|~C^M1XsoK{E+VS)lZ zU7xw@&s13uLa6>;!O;xpQY*<<3n(CF0UiH^91yZCz95!oC@*42je5@{gmL81qn=|C z-E@sFsH0~OykKiJm4jWmS8}~VL`z=&M6Uz7Hh+VbgsO|nNAOb~0^7VpWCR;KQQy^(?-1?V>0#zF zVcVrFluv`|AEr1lhtwE~BC}Ql&O46yGHK_raeDt%>~bx+NbM{#a60zJ^@OGH|2)Bw zc%Mtbd%0@F9p?p~|0^ILgAVXA?pK;hMAo?DP_9Z&yUEe)K*uoN@>S$yD*$5>czTSM z7pVHHlBHJg0iWR%Dsn10gBQ<)nV~imAESco-e-~Doq27Gr} z|ES`g4aa@1eYr%q>-Udv1J#l=B?zB`mN1G3pr^dITtIA33$ZM+l z1d+j65e-B0qrWL(PmUTMCOpoQi^l%9hQ3yt?&G1dn7!aO`L6^Alp22cBx+C*k0RXJ z_X4^@y9(%HQ{NEQuYGW~1?kiyV$1Y+dj7y$zlVJL{)?$k1AOXJUmr|1U=%%%vC4(354_B~W&KRF0FMjB!#JT^eai*TyRQx<#iKfy5q9-!a0d^A+(G zjW~@iih<)l%)nDFBWvd6*$7n^bQX0wt1!nKIWM<hdY@>&uX(o zSHWG#k?-KnMJ>NFo$3m}ZtD4pq_NTO(kNp4lhVD%1c0SM(UL!4S%)Sj@$H?tEa8SX!e8v24+$105LGAutt6tKb7? zd?Cfl6$HHdQZLOtMLfoBv<;79Pc44yFExxHe?AM@?|V;l8j@@~GSqzHfc7bs({*i9 zPRtxC^zyCR^We066vf#$yi?gpQ#$thq)iNb`1-=NdJnq8TV4>SADP((^}5dGLO09^ zJO)Fz@Aa1`k%s#`946^evEwY4CXy1BepHL^lB)uR={eoy$xq%7c5Cb~`W*9Pp7fr4^pqZx zN^xmZ>pX*3n~(Wo@nm~sj~J@5J^rj;?Wp&V1Zn>9MKXmr)dvDxk(z;1_KlkVCbd5D z4*xNJ42-eFo^?Mi^skSit^>1J?jdU&9|XtKFzq%fpFcnv`M-kqoQb9Ws3-LXO^5D1 z$scIIFSjC|);MnyQXyCF&BQkzU8aQhyw<;RO$2GQU0{-SSCy<8vm*g?5|1v`$OE&IRcZeSVu!~tmyAlSajTTx|s2*^4^ ziHI)_RNo=dE$TbajN9C*;U;j8!ilokH{G{^k>GOm=LkBC1L5FYk5x6<|3% zk}MS%Ae$jBw<=%34EHVR-^^-18by|4SEZj1UuN>F!~f~H)(4Vi)54}0=%Pm6nD3ec ze*mVW+0=F`8W{{5JZ-V-;8_cf=Mfl~GtAPrChu9{EU#)TdzlqUb8F2({(d0sE#`iBApBf)dTH4nvQt=XIX4()(Q>sX-#O{S);FI-B-J&CU6 zcV2z`&Sveq3U5be-DgWdx>)gE!{m3}^6Y*T4csnnR*0ddEnuv`M`|#2%xu=N?6 zFHY~+>TSbehO`m6zZ}cwQ2Tey_*=5fR~?Q~Z-hudxZ!X};h^^#&ma4+1r^2V8Ki#e zOAA-6T*2wLn$%eul3T-IC}UY)rh7SurX+aKGY7nL%^Mi*b&bR@A5@RHSw+7@O8503 zAFGD}GUZyYCgC%O!(bPo-VzV2LZ3qMi8)+|ZI&E4Whi`Y4kt2cl#g}oxJYl(0H5Nq zcX{uUvR=S&J(Z^oJEWs}iYiPV9<%UbyuFz^#O1gg!IX#$nm^BLSNE%YC^L}9dLhb< zroDQXrN^jaF-$LyYxQ%twlA9E%BK%=-%5vh93t9WD}Tvw-p4?i)YDaF&oa2Wym>PE zR}5T~`jef(^zg#E^hhe?2IQ^+(?(SN_dhwya*nS*+Ji7#`oK9U&$$lZoem`_qI}DO z>H&I(k`281{?wl-;=8cJoti!L4%BGUXtmOTr7yfNOL|jND`;-YLNbB3=1ajB z;FUr#Bp9Xjb{1hL@S_z|4wqB&tmo?B`r#bK4eINcXraaK4Tuq^Wyqjl5d3zV7I91!59%wXiuKXUUC!OOock<_N zGLpE68{eX9sHitsuv^CIm)v;9WFYdC#U6l{PXWmlxGu5#vGiy!%--6QiUp=xxmO3~ z;IEX6_1xPNzL#U6-fOW_6zR~Tk$1rW?jd-bigoAOt?DN0&t+HK+Z%8@JJ34)t^Zyy zo1L$s(rW|8J!I)cj+{>@d>l4Qh`<32%XuWJ)xmL)pwwZBOa_K)$iohbIk-++rj!)7rY+pJJP(o_P`K+W)@dd2YW+9nN=H?@-@O(?g z-oPdBm+FJ15!+nrrNsylPV7qH>b>nScCqkQ)ghpGA)Xzl>N~P-XYR*x)TwUkk?44% zVZI`&_!bdl8Zvl3|lf3Z0>gOdjX^+R$no4}+@Y!NCYru0$}Uuom$ zAKa0(O@)b64sWZaBOU`MFXTvLap_HPgiK*D>v3|~9-BI%InnCbE{$04KC`FK*4JIA z$|DtS@eS#LWsMIi5DlrZtSsfU;$p#Dn-Kkl+QgpFERs2wgpxm6QlGhx*5x$qTBzJ? zXRn=8Egie@gMEoKOFyDI4(W_;JfkESzj&0UN{i{;WnC2=cQl%&WYaHX@abE^^%Yfz zvbk{;1B^iLCKi~s!w5~mTxZOT^8NYcvUg;|V$o!kF#1ytU_%t<3p{WFCk@6QrvgS@ zG9GeZOaWfACH24teryZ7!HeTm>-Up()nW{Z_M!~99fS*P9`U?}zl1yoPxZ&v z;phu;*)7Zv888v?*(0x|(|vM;!jw^ze3VHTku~s%G!$vwH+pjVvB?Iy{K@_fV!^P* z9K$AO&FZYxA)?K6IfH$n$e%bG6c+Q6hfY%;^@E=@FjtE__7N}gr!)8Xd?UD=Jus17 z^K~mZA@;;d(TGs~!?c&^@7#hV!6Ngn$bcW)<|&1>IZFx48?|Eyx+&GvHDa0lmq>XC z7yVc-bF8o4!%HY-Ayw-SUt^SyDvXjlY<_FQNU>`3{j7LWMR0ioW1h1ob*6mN?1Vl> zOXOHCa%X2u(hC6P^bL#>)`U8rrPjLN)0!lFQ87_L&av$eJ0e4F%9*ZaIQ`V0-I70l zim)q4IB5N3pQiREMKbubKjJwX<*hhl#oU{xLaax)dn4gg1pmUINf5aadRuxvTFu;{ zBnNlY+ZnhNS;yLQrrJ2B`ak3uK{_Ux1N0}_(um30K>EgAwweHkeElWCA!(Se3EMnX z7q%8X7BoqJcN^cyqc;vr1MIIYW%5rS?I1fY8K0L;V#?YkD;rjv?nfkLH zK-U6ZcTwN+%qfWi!MAB77B44@>%Xr%bj#H8QTP#dw7Tl%idIE;O1Nf2Pq`4$m(zB}}{L&l!Y=b&C|d+bVM zGfAO{*7l(gzy9o37$A^8cnyMVbN0Kg@RR(BG}-@-fcG&-wgz(*98&sP?`= zM%`2C%EoN9lx?2_O?)@ou3&*G2U)5WEl}G>#4o&0k$nHFEXVR!C9?!&u@Q#(g}kPm z_XPz9CJNy5n2!RyYX`}Wy;O;sr`*W$aM$^tw#dojHui44$aXrdEd@qSPkqE9Hx&4l zldIS6smZ(d_ST2!(?|6^IP!e7%FfK(h$BhxDG}stLcf-yC?G%ybwf!KqI@=>33L+S z-uj)IOjJll{Z>utHO-Tod{k~X>W;)TYfpac@3cgs+JJu7Q&Mk%v!dXG%V; zzR@j8^ve`;5-S>4@}g?*A7ajwty4Rw%LIcKdVJ*mwE^f;y_yS5*vBevUj8dEo=<*1 z$tgMvG3#8YWzNmfV6)kQ!(Rj_{TjEVG&onsp`CZUrpD7On}j2k`(q5pZ#9pmlmeey zUR~3bix(~*W8am;=W;jy>EYW-hYdBQe4fzyc9Ow19_^ z;@e>=wcV&q-^psN@R1HBM2%urm^V$NKI|?|7X- zQjKt3r*-ZS6%Y9fPPSX3Y-LJny&7B8?I$%pADwbi*_U7~;G~>~EF#tkplr%e*f0zd zj?53m=L#X7!3+;MHVQcaK75$?R3E$KLWA*#m zK$*jOnpE3dRNdG6`Qjd3zg^Mkbms6Sg#qh_UM)}eJDW+)Xs{98KOn=j4?;0>`pU8> z;kK+N*RO-o-sZGC^!u1I1O?iq0N#8q~HPYW`ZQ(X9o`kV0`|rS?`;B z3xp9^%|Nuo3Il9Y01L!p`)Y=E80?YUVkokcJYb!t(wdU%SZ7*$asUU?-$uN32vl}D zaw?5BnEnG)52^VXpub6d86PMJ2h!k!&cV_d&|7XGhf*gHSEe513`PTs@)h#@U_Tw? z5R0Q0LCqk@%upfNlYP`DZnUSebV^6;5|!kuoC;L%<^`^1wkOE8p0AsOe?|;Ff3!}C zGwJ?x@*ar&bH)mQ2VPX~P|C)XDlZ2Joa8sKgCyR{?SMP?(d40JLkiF2cSoMcTmMz0 z@XxCNR;palLi3^AjTtlDPkJkJlk??SGhMp%Pwtxi;`mQfN%-pdUN8_^?Eb5C<^n(z zy2Wif;-+A;;}>?=u~1f z?X*EYM4{7>JZmbz8Au}4O6_j>Z0wMZFL1Ix|HY#cBB-#|b(es7izcfly+Pp%Sg*yi z%|$*cAA@RN7v@Ico9R-L;10uld&^i6$$*ay###k5>k(V=WXPecoIUsl`a|h35srzn zHo)-V*Aq_aR7^_f7IS*n}x4MlFNtu`GDZG zWOBu=0eEfzg-R*>N_OjVSzEK%t;%~&3a|B8p*nzeF;g9UEf39AhdxE?o20Pb&v#_j za5>QX_~-aT_M>M3LhYwn|0>VR^Q|9ngX%LJ0x5^|!>mYUGz8o?5W_F1nrp0p5E9z~ zNm=K5+vgO;W>b;1-Yhex&+K*E=Ysc|pq7`6;hib4QuSM3ib{InRI`Wg*#i0GoPM5- z(UAMW`r{sP`LFIL37O~TOMb(kS~Mqw`me!zHR~ymiI5)6dm?5<=5`sd!S94gN4-}? z1-dU)B@=7o^lt^F%c<1An6icxz8$*%jrf+^|K2PU@V1U=XOkykYMi!V4lTyZ%ktM> zU>Ej&s9doC695&U!_IZb5K}d0izo3##~R7pZHEjOrO{@v;&o1@cVj;i0kcD41bZm0 zL5CB_=PqNka8Z(fcAN6ODamI6|Mum9>#L{joI?*a?(Q)=w)^g3`UBB)*ALKq*rma8 zJE_KO8XQP?ye9e5XM*%IzG<%$6d%{YuKt;aJ95-w4hYG{N*BK z@+AO=W*yd$BlnDu>*6KHF0y^503(C94Mmc2F*r05{fMc=C z+uVWbXiNRaqYfV39THi<4Sm8)IYN7a9*rIY<3V#V;lz1UF0MTBGuJIlI0wZy+#P?6 zAZAfBWX+C+@AyAFx$V`t786rrwRrfieSkW8H;M51=$yvZ^VOeD=Zw|eESkkR(wVt` zQ{JQ0x}Qk;%4w2bR`viW|D(Ss|4zcB5dEJ(z`5dYg(?2&ke6&raCy8OIY2sNJDK@2 zzIdtirvGZ3v;ku`ze9}oOm9jsn)XR=iJqkcYET1g)Eik_#QHVOlC0mgD+88b%S6q^ zgIjpWy_q*7Pp?(TI~wooEcnBT^ONfPshbZ;^?e(w4$cBnXj&_6qT@q>3(~_IqZrNM zC3T4Xj89=8MvB`ZHgv@YtEPM#2fckMf$9u2=^ zTbPs)%_YskOqp2q*ja3od(bP)<^%m5ADb6mbesJX+g!;WYsB}NtV_LEjJMJIPeUUc z4Y$6YS%ksE8T&*<&Fo@1=WPy?MLRHNhX3uipIuz3jCa4_Tf0Ha)rV4 z>g4+NY0;4he70NR>a#F!zK}11d7X;zTRBe0L zkC+xpj`8gjNUgYcYqIFssJCTit*tM?M~fB?bhcw!tQh49`Wu+bh$${e;ohEMV@RQA zV;eZ_)7-W|uc6+}m;wycC4i{&FRD;f1Uf2-=4rc3y|w>{xu>6oi4Gj{nZ)77sryhJ zcu3JV`dWKrHW2Z`RGn>N$J%hz(TyVW-e~LV#qNR$2jA`<7G4xTo#Ag^Z!J4$FSt0f zw!rYfe9CDJw2rUjkRuiDb%u`wdB|7&rn$<(Nqb0s4y7*gOaByU+rHl#HwWhdvh@0#+sZEszvU)4z&f&T-3wBRWAIzw&iP66xU={oCzQDh3L66U*`vh_WZ z0aK5<75_m>jCSIK9a{3$DF}Ji9-hSWz?DX#s+!bMDUh@hL)neu_@Cd?&EP z{a$~qt}#kkUmx*Ue=Pp!4@_Ry3%{-w=j9QD$9i( zDNMIhN3XN{!Yj7U^I)nT#q*7cyG2ri$-v#9*MQ8cHwEWFjUYqRM?QbiuIF0bLb6WKOz zZ6{4&(c*50@|Uh9nl8zC^rBrh$$aaN{9tcspSHIEki~rnzM_?#M8kmKnF!w_s_e0= zDhfK9LtAZC`2fD+raioiDzutXiiLrTA)3+e(^h!630FE_`6FD*ri_3{$5x4-hHvVA z?Q^p$i+{1wA3hxKPx{18?s6tdQu^}K#&%q-o z6$9YW_7_l%ZfnKd_ZQaGJ9wlGhhph5PQm9BnF5@H*{x|i8HD2D9zn@H;pK93rS)Ti zO~@4y4ZG550~ydtNW*fT;_$63y>Sor1^$%F;p{Lg*Ln#~<&?!}sqSTcmV)S_r5n>= z$$%=v%1n8Y8OhL|WJbEyXn4S0-OkSJ!J42I^F*Bf>amBI*1wIq#gF~;MsV{L)nbKq z@#w99F;&{?4uCQ5S2OmQBT)y|>!TVrUOgsu0fLo(nGxdHO7rtk0k68FsS;_s)bdA_ z{d|g!|I_IUxWD2>yNEzJlyCu--G1Qw$}Br5+MgY$z*4BfFQ_|1Tz5BL-1}+y14ab5 z8EEMN3q_AyI8~9|*^a~U>(RBnYij+RQ-ci>qrTpU`N4qel`9QWDE;Ymu#x33pI$>& z#YUzbn}PLZ@KfrpVcU=IWOEMK}bj`R?g-5FGGgM<-r)9#p(Lfj;U_A;7Sg2W$?T0Zh6z z^5++ptlV(ncbY%%vNJyw=~=ae)Jt2$evOwn3!a;cF2{>43z(dR4&Msx-cD%wd25bi zv;--gfZZqlb3lB1^#}EW4D_~ztRcR_>hUV}bW{`6zIdPsB|?AgMOUACnN`ai@CN3N zxxgwEUm#a|n(P!HL^;x6mg)jUROz%lg>nh-*Kn$<4j#+}FJ?|Q`M??TeuFhOEt=WG zraUc~moV%GJD=6PSn`g|aP;VKubH{_I#2eyxpO_>MDm)Q?5IEGa^bsIr&Cj}pt=15 z?KN|-8?UzM2rPKb0O#5Ekg*fFLfJiaob$s?9^h)3+s`rclv_&&9*vCD?_E2yeQJg2 zcHPN5;l5Dn*p|!vulBzb=ce(i3zP@6_b$2JKnMwclw$j6QPsWM*|{m?<(K0*0~9~v zq@5{3h-qQ8|H?90m{WCgNZFGbI^|jRdp*tSa>2@z($)gsA>1>|$10s+xbbtp9&iEJ zvSjtb06$ET)a5k-kh*6uZMNLClkWl4irgcF=~-(9G}4|}m_XjMQK>aZ|H3nJTDegJ zJeNCaIy5uA*_tQlo!v%_27x7UsEKV>@n2!okS0Qq-yb8I9uw)wa(p&w8?&hIrzZHdd>9TlLGL7lHw? zTr8Dg=}%n>S2*K#Xu8%rku9TNfhp#h4rw%*-dXh%IC}T^TWUox zD8LeyEjHjlk}G!PdQ?iu2HyukEJhX-D6e=W#>?cV^PF?Cu{E8VnepZh9+6+;5Tj=@ zK?EZvr!Fqbd2Ndm%(i(Tli=yEn`%iT?E3-RIu%jIV03M3%@ei!%r=*k{6fb4`fGPZ zt1dkv^;zeE5d&?*%n>yYc6^#iZj%O;?%s!8Oq@MJTh-X(7gJ2)R|1wU^CLOS_=Dv` ztP&AnerHZCNo&to%K-Thx(3ts3)MlLVFK}T-1zA{`q?@3h#ue`TFPBOeCS>uUQU*J z_k(Lo?|zm%)r*SzCE!#X-y9z-LoMoK=GQeY-%v$EP_KFY=l3AF^f#`Ce_r|wMfkv~ zMzA|!R%{?~%wQ5#WtG%B<>nlpvf+7KiW-echX~UD)@!?5U7$mH7oZB?f#)V^p(|j) zpI+{%c?$OdN1t@&)$P$D1M|0Mz!Ia+yFIm$Z4Q@oUlyX)w$!2|Ws^RoQ+&8#uIC3H z91n$vY|rj80libvLmFcQao)STrwJwDaQ7sULvT?c{qAy6DXTfY?Pt2M&&437cV)Uz^%gbPlBl(BSIbP)dKwy?{AySq6tYTe z^f=>L&bHF>kxht!A9s{F8d>W6LRGH*;9D${Ryto%K`z@|ns*h3U_caqNXRAa)?k+j z`3v;I4$s+H_VZzj=itR&a~HqGfV8#~7BKJEyj|$J`Gp=uo}3}Mmbaj_2P=Zg!K1Rk zpXtQ|ST|InxXlYT*aiu|yWQ?=$pg{tkm+ig`X#hZM|=@;v?=a{UdgV6pN_UoRglm+ z(==ngd7UWNGavh@oZc_#dySe6PmmL^n(bK4ubO3)YDTR0PL-l;%y(=`vB79& z>cM#1T=as>UJxLt0l~(TEaSI6eJ}4#xMc8^iDC|$9_xtSTg~Vqgqd3bU^Zd+N9dBhLrY=lNb$ge)t$2$MCnuf)*|M)K_!B}Y>8NWqnvrVdM z6VImq|!RnkMI%_ePG?|c0P_1^SbQ8oLUq36%6=UemA^2peoDljXl z%s|iL_=!*Fr0mi!pFDU#i}Rs9*U6N+(5Z7)We27m@ubl)oid>0%4f~lEDMQeuY2ix zdLU$W&E|9N6O>WwU-7Gx+jG``O!b{_bk8M7$<;-TPW$M}8mm*R0TZG63uRh?C$fE?y7p8s!gkMVIA=7{Q*0}r5okyf0xJOclq z?zsL1r`M5L^7QI1$@=G8C^Fv8!I3vGTQTIh2Y0ze&Ru~NUf%BsqJ&8{3QyLy{DIun zWeLW*N3ZOM?cyGulA340XX;qijY40)mK}mp!4)K33leftU#H!Vn7rf^zI?Qri4)6N zMM@Z)~Vy`jpdz;zj^ry!H zK*CPy7rZME-WGIud9DDsbJwoXf=iwC+!B^Q4csk!r-8%=JFwb093<{WyXg-Su20aL zzdJ?CRSU2og}vxYY%WUjM)8_~7}&NOBrq8Bttqo9mjA}RV!7i!Qk26U+qIr$1|G5d z)(Mliw64$ZnREAX;7w}_I6azrgki>qYQ*q3L&5`@)zr5y9PD;p{5oQ#!&>58MSkhi*w*b!&p)N7ENPj3 zFIys%{;KhmgzGq{#?Cw1IHN{Z_M`(>!FSDIddWScNsL3zOv$K<#BKi2fNHwWTyLS@ zQtt+0$Ik0Nd?f39Tnnv)6gIwR`5f40eC3@my{)+&jTA%YuoGWi!k#p6 zs^bY8Zjm_4j+r7C_tE^L_q@K4&woGY+R-yhL3mvDD;w$3854ip*77XBScfFc;`$Z= zU_mMmUTroGPm=fmV`buup6fHDb4Ui^!BJQDnN*i#>X`&V=*80vDB zlcuBr#}2?#)2eIJ1bdz#hE387scQnpnYlo{J*!*xt3T;DJ+vdAiF1Vj0G?cUdE7xQ zuW{Iux%%34{{lyQGU#nEE9*#1fN+wH;r$Yo46ZAjO9rgzv-O;D{fsSH2{)p0Nb1o0n~G{6e-!G%FsdQax!%z0GU6jADY*V1Ccha0IA2|fNmRB)aZ6+kV$ z86~(F$iqxN)-jr!UYw3!Ot(G$7yYAZ{V!w|_q}$W%-xIpcb2N26=qD3pX7uVjg8_S zaU@$6MNt0q-t|Scs_qvVRKABtc@}?)!k=~eQxr1>+{aYRL=6cZ@;T{eXWy^Mk7!-_ zW%$R{6ylg;f7N^op#FD-yofRy^MSyBL`wKGL^IL#8D&!wGFN=dGbyGridEnqS&Pp# zwe(yfi3%A@h7i7V{DROQ$@8NDQhu1nl<-^UoCwxvy|kKRCS#=>}vjl zlBQL^Q)iWB=44%RrN>L&={n^tvs-}Yx+C*ZBaPLP%1;9~{qmiDj#(yP1%$j<=_2Gj zm9@&1-Xy8Oty6m{@ZVQ}Gbicwa_?G?@-A)df-Fttr3Uw(L|F;~FH6lM@`JM14S zyd-Pm^nR$NMyKVONVU4hWGIVV2rxRa?tYZWF1$U}ah$KINUzp}TETDp>G-3YVN9MJ zZm_|MCHlZxw(e2>oxq$Z$vCIr#8y6_`KAe+$%{t7b{?~5YTUAX*5LaGbBtDD!Q#*Q zOe+ED^!c$X_=`!6aOrwN$wN{COUs@1ficNo*WO^XkpYu@e;J<7lehSE>>4EGE*jj)e+_ZFs& z^68~!0C`otQ8TV7wrR0$evJDOSC$?*5Y9KDZ_f|%4MQOMlCiYet)@Eua@6?KC)9uG zuZ$Ytqa;5Qm9xWrtImhzCAicLc?*LE)}jCKufDPMjT(GoOZt7(RQPL}@~KKqSFk?& zM`PN4#w#Sh=qjee@0yu@S@W}Df4UxA2go!J=L_Da#pEOHdq2ITb-;4wVw5+}J%W1I zkchS-W&dV|_OUGf9m3v=XZCA!dj3nu;$@$f{FI;5%DPP48f2`*vMX?>bs5;szVDi( zDr5#%eE(Pf*qM`oO<)Vn?0BWa zf0E}1JPsebyLiJOi5^tpjQ{ahqLPT3PQ9bho&0Nl@hfdTxyMlLuK+g%>!qL9QFL{_ zwARsRcEG|XUs`@}KC=m$x5 z;u~BVyG()vkmr{+=X9b@%s1Wqe*4u*gANz|^}ldsB<$c~>r%0*jq;*EA27H4>2FNr zvnLX+Hxrx49j53$y%5t9U{LuZzVOW9D*gyxtzM@y>#5Fo9_b5W^kB%x?cB{t@nnNM zt-K_;F!*a1=X$>_52#M8+jxCKLb#y$`J@dbDK#mpHmiSJXo}KAt5ak=K5I-bsn;&i zx+_b+?sEuS!>>u;NbwbPQ=dY2xn$zzM-xh9@YkMKS)w+7qLktczc=nEnfCUXKsD_* zkLyQRxD==yK|Ulht!hlk{t27^mZPDE1ELD5AXQ!1_ktI#FJNDXsunzv4Tw0}sAx@B z0@U8DG=(m%@T4(lyv2p}_=0ot%wyjuH5$@_ng{OhePXGYe2-@bt=H}|#@(Fv zDy9Do5k;)ph;=KxBih$U7nN)-l+!A3S`l;aJhSTl-8+hE#>@3!A(ztQYxrt) zfyfB_oAF(B0lM2APAQZHnaGSh6ZA26$5m4r?;gE0z&&|v?4z_WEir!F@UvA(iB0nN zgB=l?)O?aL_G<1GT<58o)m~?IZRQydJNIxS1#bmrr#bUxi+3;~BrltdI~k@xII3kQ z$JaL$1xG5Itvt-n>(`Dk9XOIL;XpIt9U3qmCK_a=Cui;7`{`LoLr@T&ko%Q8; z9basH8j@Jn*mmCXHTc%dgPq)xC*>ISxfE^TO;r+%=ukSC$nb~Xi6|gVUu%3JF{y4R z=6#v$ls;M1+CJ!{#ZkLQS9}j#;Qe~%x@gm6>t|Y2qLRu>fog^;_Yg4XmA!N&?;9`J zM`cxQ0Y9tiW991B3&^il@UIVEO6`Y#DSz5p6`@@DQx|sa?14!&I>Wx^>pq=(3;Fqc4?R>bt$a%2+kAR8&A(QmgZdWwPX1 zWIRm8mo_Z+5mk`qFC!ZVwCu+f#o&hTYad*o-Af`>e~3Ewbg5o-yb(_ zxafT2wwe+zCX1s&(6Yzl<>5EG&Q`q}$l)6gdrWNQV5BQ~ZVvM;$aDK&0uGMs4DxN9n?;c0qM z!~61)6T2C@vor!f-{>oc1UB8nd|Fdmx8~w4*v+ad&M)Pp<#?k42AgQQ9!OdrIrI3e zU*ZKLY%?fLRm1@rPfFwZG+rg+W$=St7|K^AqmYn!MmHSgJ`;SB+xBC6hTrt7lwO#{1ZFsPu)fGwGCodyk=G%S2+ zM!q<=KJMy2SSXP!bh){El`qu9*#5bZaT6o2XU%Bw#LM-3dC#a~E%@H1Fg`0xVdX=o z?&A0N7}4W9c2#=JgyWd`JIgC;dN1GFpNo3)^_ASGN8yj?s*7#<-KtK* zDS|gIkwtw){Amqq)|uMlw@6- z2fR4j-(hsiy|>U_2d43`WYLItd$o)%dIhR2JrSCZhc_}SxCZR&w{q}b}3WnwdG=kLAfiUnE0M&Q8hds*2dBhl-hqibXRj|HiZMayx3kXr1W6Y zBdKERv%C_mn^Y|0-^IV%r$l$Qw*B?qlw{fZ7eBX%w$q*;+D>~1V$N)1P(EUpM9-bZ zW}iY6ErCftaO=MKp&czXXRkNrx;y$Pl1^1NYj>ZpX=G5h)TpK+m^Xj zucekgye}_y$I5trBvpQy^6eQB?XSNU>^PUb9}@|?a?xbj!k^9p9R^)H} z+DQ3?Eo)q)mb|R(L!oQ3#nx4B;&0&>-zgwJRhQ8YN7I!k^?Ynm8N1&Xchg`u;dFn2 zg+v5GLxcriJ_1Edy|qauyz^{mFSAL$$6IQXEE*bSt;oa-tCd9o*uqIp0gz3V?VWp^ z1HF7>*(nvNV7*frsBt<}hxM{uO7hHt5w?`iZ^Z zY0>!8ez|5#tDy+Z&TAC{F>2S&))lK_^EFuGMB-j-sy-Yfp0Teq-mK0t{^yo!Q@bnG z<^fkny4K+%KVm+EI@GT_!t;tHk69+KRRYdkdLhhj?-O@dt)sLFox38np0tkFvZ>6M zyBzz~{(zw1o&Q%9JbUU@Kj*XPzxtfdA~*aJ7#Bz_>6t_8-4?;yGi-C1ty$;hUUz;U zBk>Q%Vt9$)vz8V-6)}~vAhkVQ&$OL|8nly>nwwUE6ngdX zFxv2=MNFb$*KI3Vj(nJQl1>-{Y@HI&xo8Z z`sSkS_-`U+tL>UM*p};>waG2^D>Tg;4m);k9_ZfpdIiiz-3#6T!3}W=RJ?3ixe_|o zMLqL^^#ZC`RNQ`swdH$7^ra&2Md@wMKCfS#ZAYQlh8%@Z-von$;=2Iwz5s>=f9x+- z$F8$;8WmYocgUIxgGNzvSW?oGox-;C!YwgJJDf~+t_mv?hbwrKxI@jdO#AEz5t?wW z$>dk)=c|QYjn=FJ!>=Syhb6*lQQS(DYA4lQR5;I+-tJ!k*w&9;{B_rix2oiu;2;=^ zL{d+Vt>=STU^nX*i|#PpU3%eh0eAi5iJ8O*#O;FC_Sh; ztnhg5rYUs|&o@Ne&Hf{ayczo@p1TGMmD_yP)M0O4=!g#%cf|iI1^sdAUaZ~<@a&(e z=ks)hf)opCOJ_r^HS69?X+Mu5te_lU}jBBvcj>Gj0m=n4FqXb9D{clp<_ic5; z_NvwK_SVowtw-_46x8ffvO!&QG#|UV%0f`zSev}SVJi#Jl5+H^t7LC}8DK0U)R?BSoe*#qf zC*B}*m6d%FQv)hH0`@<1#k^Mu7Z&k^=?s4lxUht$Ssolb;bdE7ms>pd3H&d0xxY?@ zwrc%7pwst*M~DT`y*z=2%@I30D7P%j#9v?Fu$r@epkr*|%g=NPfBTtkfd}nYS|vzI zS^!Bp|4SgrZ=Od-jO(@A`S(7ixqKH_ea{V&+A%1&?8KYaMj)!l{0#=We`AHtLEXE@ z+Z&+?7!n{30zvVsjQl&_)~HhZCIdjPKXtdTXp`A8^q^{uDSl+gw%RF3QW!!FIOQRy zYtLiqIT^&g-TtO=?G1iLw_74WB*!hfwx^2Lcfh zWqkXJPYgMSAHy2?{QOzLD`%E@mTzK z7~<1>=?sq9ryqOK$DCNl(L9mFMpi08+~h;VB1W-K5#I;Bh$9#lLUGw%{Yf84_5_C` z{vqP)U>st^$_%&7M<0I^n%&cHhrgY}^@e`2#yc$j?H{7@|2e9MR2iPTNi0K#aaPTd z_EB6b)2S=zM^_7FS6LVg*De$W^|`|EmAWl6vLMez@p9?r*kNXA3S>xv8l+R8 z3H>^dri|AiYvK^(bApQzN3AKO`O2+IQ{#{0;O;hDUFv-Kr)e`o8uJ;K&wr&`6|7s3 z(jLu8Y44fe+A6p?Z!)?&EL&8{Yid!=Js#%YfA!5a7N0HK6NeJ}YchNDhbinb%$smp z;g$6Vv1Mk~Ln8WvklJXt0i?V4BgIhbRYBIt=a6CCRWdk4ATAr+-I5zB|6)eX-e$&j zu~b4@L^=LjhcU(l+YedctnJ6GVrK=56ssy7=@$2I zIv_jGZjXSzFLfBMNb7;WtH?7oi3{+-d5pi<*FiR{te*t&rMY>zwcc$sr1B<9%kb&b zqgmkYzS3D@3;O5Dw)%q5WhCB3Y~()#v{x%FJzpd(?U|F7u5Ykxdf(cT&(sE|@eabf zqxD%3nT|U##rh%CYcwiL!~G+&{=WhXj3=Q+ARi$?Y# z1PgtKq}dVgkbgLqVqnD18s8z7VRRt0)rYTn1dAaW5`smEgMp=CL#6D9mLM5NB=i~n zHbJ?g>*fhu&h-2Y>Tq_8`&@ zJ_Q}bzDDdt=;0nBB*{vXa1@Zc2P%K%m0H$Z@z3i3 ze*shgN7JhOnyV)%Lv}9oMa_3}c33ebV21^sjJ{OR9cSv0g ze1~9Cu}|gh5tN{Ew|uJdU|ip zn`Gh(yh*@K+i>|L{Oncp;mluno&Q~io3Vk_())pf=ZjZmQC&U7K)G&#VlbYg7=)ci z;GKbVLSpyt5zwr}hYjro07BRd9c4#!`^XU5hM~bj3W$~fqDcvI>PryOtVARV|FqOs zl<0C);TVC-M}HhkNct8wbQw~?heq_gAX45Z_7TUh-;tqzblfbD8R`d^0vbV3;D?IW zl%ze>a;yd*u#2O4q;d?38p3es6La8rDY8-;sQ;kLUvYWoCqcuezcuNmXJS8vxitdu1jzoGDT<;?}^fRK%X#aWDg&Vf;V1N z>PECyaezn$bYL^isDwit1s}bvhHKKt;bGO|&`~TT78_U6-xD(=O@K|AL&j(XnsH)! zH6?>-_Yva6@Ck5Uws>A*@0PvLR`KWXFVuSp`9nq=`cpP4(%zJbP66Onu0$k zrb4VZXNDV>e)ZXkY6ZXZ-?E2`&i8O<>Yc{3=E!#e5fYJ-V>Q0{B$IB5<^N*CdP+Ut zuy&FuG0#Q`2BW%E_jph3kFp>E;%mD9i`9AgS1!|SOXpz(-OL9rj4X;ZsIgH-=obN$ zzvc8)vM@b~-U^)a(ZcMS?zGjz6sV@54*Gv`RQO$HR>haIMTDngHCrxB}g!zYF&rS9XK(8ykcp)P8k zoHx$J!#NP5siO`$07vuQNCr2CMozrC$4l%;3*!l#5~@Nt5R68cHL^Pg9dgE`P<;sh zrkH9X|I|3sNkV_!#f~l+$2uYoYhGh&aB!-tJIBi80rEjeM2kQ96#~xlj3_XR2(0A-;CSn;7{UZ5z|D3KtPvUp9 z_SAE<5S}CAX|UsHSLv4<(b9DKXp$!Q@n+&;app!PU)L{UPyc^13Fq5#XA+ETikW3| zDQvnD;V9ohpqcrCz|uHbGEZZ2Rc z&+JMs8Ziyt)1SMT#I?wu4gZm>JosuWQt*c)`QHf0ALH3Fvqa;g;oH)A^IIe!pqOFP z+aYx872K0t6Al}fPa5L~D>H3j9k%AthT`kZLk#-0(vkquSfBn|wd2CibE^&ffqXcej1b7XbDOgxSe1aq zB;6wv?xv%vgg&&uSKX;;RuzpLf$@q(;w74`sQHp|A`Ikh32Tkr0*RMg1DjcyHSo+G zjYFn^P-7*Wmk$&t$gDx|G>3EsGHW=tu!w@y3faxRL*g7=flz#$C<-5`@Ay#Du?jO@ z9(IioS5j$@M-l71`SlMf-fzaGaO7Z2!-4n4-1-DgLNvAvsSPecF;YAG8{#J3rSRnt z%W(ms2C+!A#siv+A4Xm5z};l5DM^|{vjg`vJK_?qha&)*3KxBjFY3yzhNj~m6RR+B zghYIK$96nh$Z4~lKGr@elQ_&9h;+zzo$R(!I|?_@X;<9w@&9L+2$r5**Rz2xY|u*Y zhEm?F6w@1PdLJ`0(0!v=0zlYc2G+<`${Jt)K zvRn7h9iqRR(Mrvzv$)#BXNP$Udl0LgQF-Q4ROHj1O@gL}>yzU7+v?O~(fC?_$y8 z_FW6aEXYn!Lwqq_%d&PqMOkPTm^Cv>y0E}y_ruE zMyF#oz*KpUAKE=AsCXZd@uVaN8wQd#80Z8gm;}+LXK)jUHmL-B{c(YuF+|nH4h}fJ zhhqwRl6dIpeSO>$_8dI;b0u@&u+h-AL6xQr5A-h>ycm8d*Yk=~`VPqacHIaNYwjLS zm>MR&>RaPeSymAldZ!_$d`p)ApsCOP>o+~w+Ykk0Nc*V&gXUrG0wrTwLmodvCS0Dd z`yIn}pYbl5c609F!>+cw3yKf~tct5&zdgPXT5Z@)19iL$elv0|W#WY)1u_4Duww*W z;#E=SVq|09ond{LWH}GoDI3?ZKG_ zaSY;90JpPq_$0LNU=cnXS6cc){9A2X{dVgB;mNdyRybJHo%qvk^8aK)^IsRHkY{Gr z09#M&)w+NG0e_$1${!h+*`@kl$@~1iq6;5D_G*^fZ{d8qJrk@;O@ zNS_E;-45E{eQ;s7)$bznKUHLiKC<>xQ{OA&-VlVCMqT%RdK+k=aK-4}MXxLIf(faY z-alj?QIzFj4Dj#d|F$NQzVulUPLiH!!v-qRFcSk;=P;@QYI(lx+j(_Zh(SJ;skKd) zbDEJ;A&LP_G35fb?Lp=_9iRGB$Feu}-xt^qyL6+Zk6w`qn`eT$JHBzh!fpK_^pw48 zaUVV7u?tZKr2ncf=xy&OM46G(;W`|WqB-WKK;wp_k>!A_lUi5G*FtYbk!L!XJ8Aje zvL3dcSDrV&-$Nm?Zp(KQ*wHkjzO}gtK5Nw1WM&?b-at>Lw$A^Ma$5w&<=uOqJyNpZ z-^0L4En|9v3g;{>vxz%BE$;3hxpPiy^uAW9$bGGfa!=HsToZ~pk+I_fg}A7L_qAsl z&jLD?t9lP7c|o<*hugd<5UFj$4B|q1dm?K)+K!BCj1RGF{HTwUU7vLB#<2?#ANm3t z`0mjUIG3w!>)&?4b$w2|&*V6D0OIP+5_j%hU2EK%y^z~XHlE^eL(&Rv6IPT_xGl1a z!><`HVmtn1tQBp(-hMrF2x~2@?1&BCowFgyUw`ruFJ(5&k-RzXAXq*t_ zGfoIWOW41H*OxmyW|iDB`O()$xn+QJ2{7+`BauZ81%)3HBZ`9W*9^4zldgg;2Ey6 z5vy@5`bz2ctlRmU_gyz03U^}3H=Q__YrUV?1tA873*-%=ZCh~Y7Z9gLE^p7;p)d^9 zV9y_t5w0?u9d^QBG(@;hy(kLEux5q5`_}rtptVb((#_|VckVSRN%BUyfzvVrj;z;N z$LR9h-@6aIX;c52>injmrs^A${Thp2t~K;)gv_hF*B0IixV2l|KfNn&2c-)C9@;Rf zW8@TMl_BBsgqAIp@|54d@t=d|wV2yHQ%P5gQAz*f{hkjopEvQJOx*BE&g(exiEiwP zo+w+55vi)n7$1fYndz83{RAxhNV(_sV=>klHdR?4vhW+^N3|Vk^5TNSX&>^6OB>&y z;v&Zzq-egiU;mIZPY8!0$QHCCG2!_#wghcjE%zxk{L2fWw@%WU(Gend2lGPr<&6G; zQ|+WYwWo>4Ab5S_?s}dg89Bz1=5d*A#3z)&yp1`b=Of`Qx_fMh7^CJvEEAWD%Q_+Y z^HCQfA90bh@eQci9@NNHGmMg%GNOVssO8nD;nvt=^4apv7ut^xG6hN9K zz~9tS5sUm&hi+zSVQ(^SC>`zJ`~TSc5_qWA{_*TtYO+KkBReV5LKz0BP#K|JMrBGH zQrQ_IWy|*-S55cd*9#t`~A2@1A8dxmTxMSl#q1&~b6hZqIqLz6EX%?{S8_+^=@yo!PGsJ#*qP>3NMD zHa(qEG9%q^gjo03DR61$$SJ2gfhA2>YJG&==VpAl!1tjU%9w`m-VX$;(f#hH*{AN| zIwsC{XFbLA7g?10%UsS~iravmi$C$~$U&km-PL_bb>gW2qcKk=tBKL6dQ=z)=p|8R%<#F;b3uaxGrP0gJnR93(5$sx0q9cs#=Nopg0 z4>!F`5Q`Da4Ye;XFFSoWHx64=QD7GuP!h8Uug_F)9+Y|@Jt*Zavs!G8&Sa>~mAmJ> z?Ns0OYbEPkS${NL=7sIpC*~ocHF_hy)LqL=@!J_)5mLwYuW&x2cUF&l&Ti%kWdl{` zaBg^?^=sRdw3k+V*pEXpG^KNgt*BerMZ`w^l(ejPep#CaaMi%LDt2Rf!~Jew19w!E z(tIr1-!xG0jNny=GVPD^LmRu!O?KbxewZ=WHrzIxvM|abe@WZx^vmwm9|c18q4{pk z@%6jlEukfxDyViYq0$8Pi`8y>^Y{)&I~}7%zHf$P=psJ8vNoO`yCl2Cg^3kg_P;!9 zvH#_z&`p_}dY$d^yw)_$Kju26*lV9-ulYJL>qE4&0`cC>zN#fC_OYt|WyhRL?JVxs zS6vv%8R<1#@DrIHFxRnEut>W@8lp{}g4qddF-M+pV<{&@DK!u(Eyzg_pZ)i%b;#jiA5*7FDuIan$p*GmTPQWSgP?P(aW{`rzas5$OIf+74Jy~{tXyt&9zDo)TwY7(l-|?eah(28*r}sShc{0W94!dr2sqex92Mb2_ z;oJs5{UPWR-Z8$hW~clqkk!uaM%~pKk>hRT+w61CuT;DIJF!F`}C(hv(?Zw(I znU(MPI@m~NphhYmcCba(tNMprsXDc%yC5Miq0;9;hURoH*R0CL+9*UjJAK;z*Aba z*fHleT1WoQKvGs;mALx*=T4;q&V$au0-00G$Wa|T8f-;hCte4fA|jqY_+g87mkIyt zxQ=A#6esIFA>E{F;3~m827LjOvag!v+NLz$L^0TOERZ>OV6JX%h{MArf*Dl; zqt)is2e6WL;vZ&* zs+8y5boA7xrnYGJphl>=NgeGER9?wRup^V7hkp%!9LJoi<|bn$8IipUo*C@ zF2^Rv_PXZAeCZc!*}KhOUocjJevWC}^}f_MGkkCI1-Z{#KG%CFI}&>*7nH`dXlMG_ z!<<6jz6`b2cw_12oAOdn0(OM5YU|-#x9pGzDfnuGE$vXe=IO6S=@(loGNURQqta1m zz9r{+Wjw{6g>@A8cFY(J7!7HLN@q%U`c!2$9T)K_$i3CNa$-)$FPrCR&2eteS|Sj` zr^#o1Q|(k^*cz#;j&^EB3zNj=3#YF#j)2OSq(?}#weF~7hL%&P_Q{@UcFCT%Zf?J` zy;#oiC#QK&!WO5PZZ3ArdvDFi9ypuz;T3w>9lul6VdT9uR?Kxdy(GJ@UbL)$ya3j` z@WFgYDRkFLWA%R|`d*TGXm=3s5rCAz$l-<@ZvTSViO0AhQVAlJAX3TyD(e6ul^{~d zf0S#y9Mim_ zGFZGp`k~!Njfs)!2Gxj@{E^ns`rTUKyKPi~gb4awmrP~x-hkK$e%U&`0z1-{McUOC z=t>G z_tKVi(?^VL?a-^Y-=S9^!}X`qMhBsLS3C&!eSZphN^d`XKaf$plhk~?SD|z#iH$q{ zFmS(ceMV9~d#rj_XYA339m@=MvunERARS|dh8sv>TrO@#Bb82%1d4sHx<|X2J2K4=Wz2& zCVs_#O5>n6j@TXuqT)0m!;h*i{^33%0zE!0${j}z&%L%3>OMa+pF;={Jmi|TRAK=Y zrU5cS6;c!Uf~{Vv|?}Dy})4!XbXl0y!<|50Bma?t&4FF110{m*)Mkb~}T`{odh?tj#&ifD9y+Z~Q*bpNAq z4F88Ux}Jo zgQ<%oUs?IaKD6xG4-Ir129ME3D(DL6g!zg1*sTd@x*A`AnkkdHMx%D}c&uPRIESqR zY@;!e)`64V$t@ZK7?$lx=|~VGSiP3Dc3od>;jwh+Wg&*$9`Ksc(@(Cwrs!PW9&4tBD3^K8l5+?Lncl6N1n>U1rowWPyx=klo1+kOf#l8hKM|_K+BU!znoSwZa z@bxFkGn%|ugE(T~LX0yhffmX!TkXs~4 zazx4Rlz6i=Y|^(1I=fRMxUoAwsII%<#lf-{Pm(jpU3cfp-Ds=}dX>C-aLR3ldM-xgt-Lj}U;lWQX6`47+K=srGpF=QqET`a|%9aI^hc1>+c?~tHwJQW)c z9oDRkwV62oa5HmP0?6f^*^ppDpNIm3OjtSH4Yz(tz5;oO%~Tv2+#-$JCqt7tA))!Q zuM=~LoA@{hbOOB_uhSsS>Z;yMwo>g?y_hs;%L=WI;zT}lFzty~$(Uw#HcH;EL%ryy zZGaNRN*#Lg#T!Q?Uo1}&J ztfa=2uW{{I8g@cHQsOaz%94;jQxARhI+@Z+uJ2&uRu#EhzTjuQtXOUv_-NeBXp}19Cy+-!3NR_x|xK!kZ&^Wu7p0-rT*G7EfJpR$b zJwo%3L>fdL3e&5%5G8#nA6;vuWaIn>U59=!=RY2bRhpI-+5!ySF5Wio8ZTm)e+W(W zUkW>#DcJIocGI^r9BhWw0x6qCZ$#74xTBeO%sXb*-Yx5Fuq{0FRePdv$Yp|_-oxMwv@~eUhb(2s2ChKbHDgEV1%KMCzWb{%O z*eseaYGEN-v96rat-V}k&D>JT;e|%2@^y-r=aF>9)tR?N$gRqLT7K(@TErs$|9Dh0 z-P>F2a4xW^w`doqjOld!s#wJHy^rtzCO?Sb{M!*yuHw~UT@lh?GnSfLX&o@q^bN-3 zL}Uq{n{2(uAGK;jO2wn{WJ0DOWvs(TK@Fv@*N^H&?V9r+4~A}kV_QB1ykGjp>V}EV z8v}n;2;(ECXJ>zlA(!#0{E1!YiB4a;Qcnx88ESJy)g}4`8)I{y*u7V#2H)7x;dxl= zw9#7TV-Uf4LkV&Z>&fitg)*T|vHx&(gR6I4Ym4@^G+@3zoZEBw?cMVpzbdT%YW=g{ zB%rq&U6ZwmTds(Tk+YqvE)gZTG&8(2wSz@Vl8sp`*zQpvruasJFuz(De>FlX@Ld?? zWE>``G!>hKb>jPvhhF;`8w(XU07u(UQrlMlg|uIl4N&RT^2={hr4>ZpS%^N4=r*Ul z6a||Rr>vHwpDK;ProXk=9#%Gea_6~C!A5QtEM2qpi##tb5qAVSHn$fQSv5=1EZdqN4Vnx)4O zY|*BAuvc;tTeR;<1?yju6rRiMOjhC~f8iY6tA0`D>fBNr_V$N1FIxros<*2$KW9h} z$45k3>sw>C&c_n&CA{;Psq8i+b}iDN$5$Iai>6hSppDOFKeStBv2s){vn)I2p zEx1`+h+MYzQO1$<5I_2*iFs3c49neGE}0$2dqHuJ+=q75h4e%v;GhKFr$gCgszMFY zpu&O!iOLxV8HB|S)LL&b%nlMNW1Q&>hci&I0l6W0^kmGAjy#ogovx?!V5l&5a@CH9 z`3v3dLmyiAvW!7N^4><%_SW)HY{9*S_riLyKRd>An6#%<7rwBFrz)T4W~-WTd+-1cz_@UNg<>08xlEYaBMu8WB|{*kUo z)mo?L=p<8x3v-X`u&sGlCQy8JQtU~)UtmS&4~2q&YvA_AHxX|(UY=O9b#t}SoKg`` z-@}vi+)mi&pA<+Vo(&_H!KJQT(v$v>3LnlRNgc^lDQ)lS@~;9=Tr&;z!u%#jbCI&| zV&(d=rZ#;x!4lF_y@zr;^By<%-3I2lamf>L=t=D5z%knVi}OKvLvUC|ic*WR!~)+S z>Zoc*hSf*qC}^4JM`c|}c2GDUzwlfLr$$>w(foi-D%%1oYcbuM7x4x3l=MiClJ%`k z*-Kt7I`^ukFoWa9&nbz1XhU6|Kr|FR3BniFv(``hqohmQH0sHj9hxa{q>M*vvWe*w zAvQKJI_S|#ds0oSYZWM=lWGbH#iCa3DBH_|s$)~bdZWq@vz$;@8~q^VFrgDy$-(Zj z)5-5m5_(}V?7SmxU?8FVM%4Dh4GBsi|eEtGy{Sh%2vQm9CKTDLS#od)Gk~y_}bfMb| z1~anahZ-_}^4ks{zjpcZ?}dyj>uq`ah6S$CzF~@{I%HP->ylWviqY`4# z)ybx&i}45XYG~HJtcXy~M$-n&x}fuEbfH)@OCc5wN>9N#5LeUqhk=`-%<&P*U`NMO zy7_IfiKqPc7ea();A0Sykk#K^20ru>{R2bF`8}?p9`5mcb9FN8HUC5&b|U8tByiRT1rZGVFtNSO05A;m2Z zJN?Gx#wwRL9S)baGp3a?ZfrmFX$|#(Un5!L;&t+ytnyJm=qWC~k-aNif#kVF$Y-tR zzUgE%F=ESNFOzNq;Sm?AN#a-aqEj?%E&4;oM)#nvLLM(3_dOn*Rv_-2P4akkHff)H zQEb`;v*ZW6_4bnp@#lU`cNa2d>c*kjWXyj|USs6Be_fv(B7Q6=NIzM@*8PgFsB}4B zqxPom<^h?iftUwwU7?%0%OnhT-&A&y*TL9bzZr5cq{J>R&n)xV6PtZDc};wK=UEDD z+X^YgwvvYXS=iXSjRc9~*P%pwyVK|mL)_&V%+AZpCo3%S?kUYjpFp>mLi|@)n&b^M z?Pm@;eg@ARo;jSCp>E)ihh!GJ#;J+0A<5Nq=f;iNMnY(rYWy@rrqJ=_QzJoue*uIeWCGvb11 z7P!eQdSIH<);rA}QeVlxID8Qwwvw{B3%AK2yJi7RGa<{8YNEV}DQ!*LB^4+r@8$2` zgUa2UMO-Gi!;2QHL8An*Z3E>s)U4$-l&!lag%7->Y>Uw^FAToVEU6u3LCIu|>zd5^ zj1_9Ny*@oya>`n5dbUKU9x!H?!%#gDOK*)Lo5n9x}!%dkEI`}94!Gk^I_C-$vI z;x#Y6Uj8~EhN0X7J!R*qBXXteUZG0yV7L?`$ozDaxO46CL9;4l(J%&TrM@e54YX7^ zyrHq+U<|oxfdO`sp=kmC&4P?+1z67I40W~&V-=RO3%lWoL`_QfsDag+4)(jPIc`*r z>>A}`UF=o!-mYOv9u3P=crNTck9la``RmHZJUO+(ti)}SM%8HdGPHXfwyontIBDvQ zNIT1Q_|VUj3i0ty1`Cr`9%D1g`Qms zk!~!LanLv?LGzF?!8ii6CwY=4wMp!m!^1SGR&DsF|LfPlGpxFMzePZ#Nr_e>RACxuz)rQ@ql9X*lj$?lqm%aj?NkdQP4)yitFdf5`T6yMqH zxMy`+#Kpz70$<}c)}58ueCgtIb)0aC`;dPpVc{yYd#Ug7u&)XYfxES?{9Mr)Hmuqj zg}-UQ>G9Drt@5@}$G!5d^A-a=58RA_1NsE$tDz2)$uoyHA3m@K=vS)l#tJBll(p`9 zQf+pb565pCnwm|*px&r<8ZGov^VR8bq`GuaT5LO^Dur|l?e<}L759fViSf&OQ|qpJ zZGUv4K?(>#T$Plu|dpJf+iPMRlyn>nJZH7o@#pT`B82O>+kG@7E?`Q}tqIKP$_rOD+aUj!i zCn^f{EcOIC_*@;7NXcZ%v}#|$$itAd6k}!%C+XWiObZ=O`e@q%e%9gf{kQ6O$>y8R z4^f=sfp1n4SSO4TH4^non4)8hV#B)~YvMcd;vCAu&Jm9oM=<0(e8qBn3y+*HDp$d6 zdX{urXJ6gMs;s)K&K0ijJs0ne(zSnZ$mp2s`{jNHAI~28Ag*`!8q2f0YM+7=#ij3` zvbaJHWg_e);Vb1S)uT4v>*uK?TAdfC zTJEqkH&jG`^Tu1OU$31iV?%RqTyQFEWBSDt+Wn5tk}kw-yt1)kf6blF)eqdR^{G+It~J2A%J3oL20oo@Ow(9jOKXFDGk~fAknjks@9=aV?9{U=)g!_ zc38SOG}ppb2qnx;8iV3%v`hE`M!v=VP2LG@xrG;WE<~2ZZLc`$vgEN< z@#W4t@!Jb~YF$2D+OJo7?_giWB{`3io znqscSWkFm-s+f`lWZbHqO7^XA(5fmi*-$wTl!$zslj_i7zd}cLhwMC`rMDvAm92M; z_gYf1UG6(d7xjPM5){+?9qcr>4 zL>QJ9pv%lBTTxX2+K;x;fLOo}V;o_82;)N-A1v!3j1OUah{T6Te2Bz{NPLLIhp4)U zs*9+)h^mXIx`>SrvGE}`KE%fNzs1HkB{C@E6(&^-ggOkh*4$3E!M;R#2 z>qcyY$7$68Nw2W6IoQE~6+})xKA2g8&O={4~^mm$_nx4FN>4E zUYt+GbNU;JBJV{$^YL49S_@5`2fO!m5p#@5ECxz)iHccS?3rrAAa=Qm8T)NNd0P-v z)kyrR@cI&&$`Y9m?Ru-qZtF+i@hFN{8b6}KXTNqXyDvj(p8e_?W;e}Hn2$bwG|ndE z{Rg2hE8XJA8jID~cG;F@7okbo{%+JDdEP8w>1~bteb0 zyT`YTZ;{f&b1od}>W!Uw=~gP(VxLq`oMMG>Ae<=?c6m_=ewCzwnC!ip5G&O_9x=VcSrU-4xAR4Q`S?}SdMU$@lBuLm;HF$D8y{U zN24`=>aPxFpJi5eePAzYF(q%p({5pj5yR3PtH7#Qv6s1TP2JcX7x?RpFeRR(r{cHC;%aG$|x2%}9$9 zMXWEzX&&+qN4w4?3Tg+Vr8LeSvGNbMUAZArE^qy zt7XDPD7sRoma^F`F@GBRjFzJdKB>j8+M1wt>p&OUMoObD!>Ue)b=OjChu5?%-7>uP zrp;i!%*m`LqHfZ(&50fY2kb$q=%8&*L=$sPh()HOYQ)-R!$i$ZVoZfPrUu>BPHX&u z16zfNTe_o08u-1KuQNE9lU|P<;;hc4g<_|#bm4S*(L2jB95<;5k*5;K_d{HY)pt;r znR24b@w?dtjYKG!Vzn?%XXE`cmuS4qdz+k{R7RK!>sEG5xzt*5DP85=b%*m-ZwZQD z&Zw5l-s4iB{F=W&=;&3p=xyhM95>nQJ%d`wMr_5fq%CPP^n8&Pdu_QzdN-ZA`kjL( z$%^E!{cXYCfm3^E#?_4%DYRAYSQDngws?Ijvepbg+y0hX1MU&tg+0Xb^*;_WM~ z$TFe=Qn#Us*B(9jYaLd0pbVuAurx-#rmI;!wNOE)uX?{|BDtf3sXE_H9$L&kFQBst zS|Y+ywM|ATw6+ zJa9(h-*oJdH@#85MGA98ueuwn_o}P7Mm#0zAkC)D)-NE~mtDuI7wwpJ=x%Qx{$qT8 zt=cj+l3;3Ju1~B1GQs{+uD4fJsK*Sr)uz3K^XsTB63z)7d4cPcIDRW-8#g-FU}P@r z>H;N185N9OZ}7HrzPTpp?s9*K_o~G<(=G=1|G->tZj;jPsD?d(aHz&2ZDo-z;2BR| z<+~%Y@h~+(5Z7BzV>VuR6P+(sosO3?Kvi{JDN3VH zKvd`oBU!p^)=!>Q+WN=1QlB|!C8+>sG?=SfBJfQ=g5A=v6Md6d%{kax*(>3ErL#c3 zRIS{B<%MB04(g^~D2?;elFhFiPAcq=>d#Llr_TB2@$LP*;tz?206Ui{1Kg@$u4XsX z?8{WOIB@W@x)J-5^Ziy`(x zy@J%)pbf22??1+`KP)4ba~@1hCZ7M38VHntV<+>@|E+;!2GRIPrB?|N4&mb1UB z%lO{KQ{lpUw!2nQSii_=i&F)*T_o#v9c+>#5IUkrU+7^yn`YE6bl*5JFR;7UBYu(o zO0zxGj4LGOX_^3q$_#$KfiiuhYdU6t>5x1+lZdsqxMd}=_ZD-T`#=DRZE@y(q7u#ft5MRRz)rDp+}h#cf~7B-Ob)SQ{G6~7(@-5YVvuzWPDnWa_)mL>oP@-Vmc%l zw-jXZ9}*m^={>IZMKWmF`FI2C6+Q{6=i}cQR_Nq$XoXnz+e`ZLwbFqvKq*%RI;<7C&9YGLB<8M~@K#BeatDJr-KKMSb6^d?tiF@8t*C z&(Ir*UCFF4-*Ua^r26P^&;Xe*7yZ9s#dBL7=qVkhKNhEb`zHsm@(RTHhU7R}#pR@7fD2kQljLlnXau@nJ9A+T- z#{~)iH?e`eStbYr;$^41WOsyFj;doovxH&a4(h(#VR(gi_51ObCAnFLBjv(rYi!tJ$Lwv-)zmPeijv(p?qK^El>PQFYa3dvnVt90n zbUc>GSND7<#4N{gqw-DVJ0bHNWA;{B#K(B%*jrxsRGGQ+R9f7tzUTtC+PbsXi);(L zSLGR}YfNn2`7ANT*Wi9eb*<~!>O)6XZVR>+8}j9J1}RpbCFPF>P1CSuxG(BoOE(wL zrUNt5y6-QGFt{WGJ%=MV-hq%9!ia62Ox?#D|tR#DIz;5+x>4j@|+B znsv+Hoz^Jas<(K>b*Jq12*sRq;RhR5`~>ye#oAwfu7<1JFE`?!!+8|BD#O2f1Ltlu zC$Os_SGKO_*tqAZ60ede{zL{YD5_I?#5ScTdc?NaSjZ=LD+n^F%eLzqNh)y|u{Bo} z;;fA@@X2))BP<5SAaE6qgL!9Fo_`z&EMUgmTW#PA+DS)297l>w-2&|*zKua(-ED1|~c_G=vuZaE?yuQCc(h}EPgWgq{ zO~=UBnT?un0*_^GeXtWHSGcV3uAcrn&U>Fl>0Kj9*69PBQR9eEW~L)6fI^IL;z8q>Wd|k+&Ryxn+(+!}^k7#-;nl2l%2oIU zu|(!+G&@Txe$+`T9yOnGxpHnhhnin#*_S`l7NOQj)cX?8YC#b@8)e70Q>I(gY6Fu; zls8#sLn*>FjhH4?UwQs;{boZfw2b-c-4^vtOv;|jz!&QF5WXgnb%8ikLC(fbb>fSl zs*EXWKW899DbKPF7sTu*8U(ZNqC^wL`RHb`??u!^nMI|zE0E>go@y))GtZ35>x1lO*-@@ z%Z~IhwyzdPq@Ba~x!r)iP$Vg-8nux2r|?+H1ocuQ+A87bHO$Oa<*n(=#I>1r!Hf#D zDlWL&L5#p2w*;6LMI7$THA{ygQAD~>zvG<&I?79(17eQ!0BvPA`;kMh>w-C~5` zqfOd0J=1KvNZUM$h9d75*OK3zARDe2Dm+dg<^K55V zhV4(K^hf%;;~Z0d5hH~N*X!;`54Kj@-E^4mHNBNR8O8Z5@RaW1WV*Qk@-T%An@*G$ z>|sYot*+PIMoR<{)2tY?dSBe(l*8g~S1ER6Hqn3S zzQGSOw~{%v5y8dTPLW=cv{3Y5GM+&p`sUL@lj27&ZWo7vsa>)Cv{R*u_o_ue(J=JH(8mp<7W!b5f?=mu;gU@ zvSjM0qoqA~qnXX~y8|CL{Cw*239qwPZ`GH|?NHidVzX{A0VC1@n~b)3zt~{u9vnv-ym4!qZE9~oc4)w)3VG%CAqRH zdgKlnKs^`-K`Up3!kdhOMvtsGQ;oy+%Ehr#G+wFC zl@3#(6w5)qw{nA{%1lI^Zr_H2it{mn)NXWe|1uOb zL90ZmY>W=Un~ky2F=wiwkJ8PwvJ4`1Dc{>MCW>A5E+fZs@CXO|o_T?T78_uv1F%pF zWeG8I>KbLdvoLtFqR|eWoY6NKUl0Gc)NBPSI$JB=I?RbgYt10F2$z3YHc!Q%CyuhY zuh4Wxv`P6`w4Hk5)Ez9FNy)@3 zu~Tx1H^Q5-GjSRF`wo3cMqkArFl!#*P&-G9pb6rj_E86N8s*>$PM==!ljEUT&76to z=i8qjW`97D$17tEIId5RM?SIckf2;Clf>3Rhw_QHjt*g(jOA?l@o1aPm9{g-D=#y1 z`sfPGN4Kq%a{O;UVl;uaPlLtT{(~PNR7U&sW~H~L$&)o1Q^W*pR>Wnpd8}Y0B)IcV7 za;wgl1iS0c-Uf#5T)g*7g40XX)3@1I#wJbFl2>ToKAI`9g`F8;aDsWD4ExkBl8@75 z#Rnou<-Ls~3|fXarfWqQG>mW2m^zbz`b*-VTmB8=a7#arkvwAh)J|j9-KYz#S6Y9T zyOv5EG?u`f@~Kn9o$;xQz%(0+5%y|r$nF@C5hK({zj$J&;gu}|zG=V2w7;AGeDKrhyI0ljJ}+;i3243Z{DAv+4Vr&=fztK`8R=smr$>z<2C=WkPxTozc~|N=6RVm zPykB8FDqG=x8~2ik#d)4eced^$=cOndWqPZdt-BP9w zOkD?vHk2!v?G-&ENnn9Mb^yDP120;a6(w8uurrE}^WH*U7}}sJbi!AR@NrnC&J`9a zWa{)k=%oz23o^aPs5RJCz3y@C&wDPfU^qM0O8+QV?A5AB!M&hm`l-+@0YkG$ak{Ux z!hM(fF1(8uJ8x7UQ}tOp5!3uxTaIoys+9z=1qOo_fWX*Wi&?=a2ZYdqX~k=*0O*Px zpo7|dFo-PSdo9IAY~|sr0JSjNxpGqad5aX;Iy-gkq|TBA&12Wv(h@M+Re^K`wu`%H zbxxCo{8~uABLmDXgy@zX!WHb&EK-IhQ~>1V`=->TgPu1=oig3iH)ynZZSng0WE}yUw2j+{6Sxx7YMf>I`Bh-3zs;(j8~0kI4=jPPWhnrI7z_bta5KDS zpWM|TEE@m`#>f%drCZyrvTwpSfc4wQaq$d>v20zOCRfO-1&I32LjEVU2!p^~bjx{( zB@SSL0Lys@3*gm*21|-W3qua#ghf=;C7FkywbOw@2d%`<&M@RFoXD(x*N|lsE$@95Ee#71amG6SjZPJp&9Z0103uSZR2zLbMFPH;g2F zuM~`D@Ku0XbW2!tRfZ82Q0x^TnT!JBIN;@DL$|yHu$+gm7V=l24dR54Q~O{ZvMt zdwy634(f*7c4iYG6P14;<&GqY`(^oXu>}T$41j?D(M;}|+tS{GNNX@H7$ct>N9g;h z#)rZn%Cd{JGFO4|4895$1M`SWGHL)(0ma@)08+sITIn@gM{KRr?{Jw7JZ%841R|hR zh2TY09N;Kr*wyxBpekGBXWPuJu%cm;DRFuxA=>nFe}z$o?&-6ssyCd{dItWJxu9Kq@e=02u->p20BQ4s%SvBjQ70LyNsOnNXeZUW>%ove@BnYnoI4%3s6UbL z;PPqL#JdHG`}VDmSb~+xyzIGTDF%b+yoJ1qP&ABZ z@Ku0XFpmI=AB?EWlQL}p$@l=`&@VPt_siM@GaD|#B8M7ss3C_Ma;PDP8gi&1hnn0D zL{s}qb1tH(A(|SZsUeygqNyR88e)D#%#Voq5ivg^=10W*h?pM{pBmy*Lwst8PYw86 z5T6?2Q$u`eNT3J^Kt%#YkU$Y6Py`7SK>|g-g$5%&HN>X|(n65vM=Q$zC9{{PKW`}_`Nb>$r;NM)bpk^wCH z297g|4;;q&PjR4^odGxwWt2=G$zO6^nBl`7d`D4VZEIQGJ35n-%Nfu^v+I@-zcylL zhBL5GL@t?@mP@v_OLdD8H>ZuU-{Ge_)~IyRKYTe~uLljCJ8u*iTUivyX;dVQC%GC0 zP9B+037m?+jwjg{l`fErB2Q_iv)^U}PSq2KsMUCuIJiP;!kNynGW;WM`>L#7F;*r0 z`IIk*LYxXA6=j=_jhejRbmy;G--pdMuyk`G%^b>y+Q^Kgv7!ZXI5Ou-#FH;e{dno|s|zJH39LSc>NewqK&XzU&5mv=_w`ALzq^`R5{1*mU9QQxcsXsDwj*7dx{BJRLlgOs0#V@KelpXeI%NpUTP4c3MFmrA~7qaw(giL36((Z;|Sw zmsnq`AN3#h;bf%0HAtqg8ZkM9`D6yQD%NCXUz8q%##?`OB2jTctFtzdXD;FCNzaR+ zXAT0JGqBmG-oH(0d_e zY{1m`nI_Pl=oXI5zQmz9)D6&&b2j5Lg1XUuQ){9c*{JmP<7g9T(s^n8*cZ;oyCd@* z-!9`&rSE4ydE1MhiE?J`;M}jkGA&n|%n0N|b(~l4@{QKq?sMQgMSsDw@=b#ttFO`4 zUUS=WtI5m^F2g9^F*ow(1v}B&X=j!%)&6Ab54t^tX8T5zr_$gqZUnBfe{#I@_5f?_B#AOX)J1>K|plB{_dd|D^Hz_W0s zcIGzQT3+riJQ7IG0||)VMgn%D8>!sai4)%P9tNqUep#bn&}nXl=8aU+7G6>`NMz+E z@?y5rE#Wk5aASnQlUnT`W`x?S#aIHr(=P*_7f3jitqUySCGUc@z=^Jf+^kP{a@?d| z-dwmT*&eeKnA#*xa7%pmVIQ1(h}k~7d?v#p{ruW>aE3F<8>DCc+!syy1zt^0v|FMy z{0exeF;E|Zw|;PMP%$qDwOK=xm(TwFLr@-XPBqfas#r1J=h;zs!)56O4@F}nPkO1~ z#v*psqEvB7@Pa^QC%pC`b{w4IX*vmJ3WG=jz7M4F3WKarHU{1qu%PctJemm7gW*ir zsUZcm+6WkOlRRJ!yi=>~T^04D7FhIQ05@yoa$))>;5X!6S3^f*nl<%r9FB-T5;y#mmIXV~yrn+r$m&26^ajPW0~ z96;(uDtCQ;S+jHG0g*crC;;#s#@W1wli-O{j%PMZauE(dAeom68xO)5;5~tH7EZne zH^MM>_+duqCw6_t@ah?+-!Yfv4HE%(E%37*TmZ}>F_$>FV*=1qW+yOqNwyBqKz<=N zLzg${T4`E8*z{QtVVZZ{(45-K14!03+i$}+1Me!YG=R#dp0VCpEV_}(%c-~g_F*gs z-dh+6En^`q_~CfX*->UckeH7Ewmqo@K$F|6j=ji3;9060V{L$!%xY8MLINfqfMtFv zi@`FP44AsXV!oq8&Nq+@6nMm`f$V>fx~s|~eO#hia--rb!GOu|-~`D1J7H!VO9)h> zTV|YqnZRovI^a^lo{JN#5@Kf`XsDhA6c<~5fDLzKke2-ew)`bp`Q&nW5fs8B3~oX+ z7u9Def{Ru?(LZn%E{%SNAz*2B;^}&k)71e<0!Ms zugn0OJ_{ncCH`dk!0}lc;V~jEzT-i9H*Yw=w32yD>pQl6|InNa<2{_}FKI%*^_@j= zF^R|5rn;)rVHNDH!Fvk#zW0mY@{A7Eq6J5Io>zcZn~M60$m?#aav_)f_nx&s~_@TTtv%Iv`e z3IzOVq;D{U5sZ5(exs@v;FQVWv6Oc{T#SaNpzkCB^Sw_`eo(A zcn@ggQxA*-+~I>j;{A6Hf_LX((RXb7{s9m3ZZ36=)x?4`@K2-64mWTC9l&J)0BD&z z=oPcO3HUP%@(e6@U5ziAVIhKx7Pbae5CHv| z@R-WfYHKf6!_x1k+Mgf%T*jTJQM(!JOf649;T{sK%4jZoP-9umJ`kAt*SsHw4fiwx ztm+4B`Af7q?Gpooz5&JMVmvndr!xrfeeU|wxsnekQt-n_KO)#H8{ksaBsgw@U`_*A z3I*nY+_gLNNcBg|`_%ITqBn~G7Cs-AZAx+9r6|eg}ILbG14e|q<{{6H;gd9Z3`A+_bki!*55g`X?3tV9U5psB9J|g76x;QL@ zB0>%#cmK<2!FKWh$RQMX7kJw zz#4;Ca)8YpvE;nxISvp@4o}%YEIHr(6NtMCaaSSkD#Ts&zsg<3;yl8S7FjHCkqQ4W zxL8;BV%n=BzC(xZ-QVhVQ&2}oY5CHJqOu*Sr@f-E7;iKBnu74{D8ggS!SwSc+b1kd zl4@@_f&bvYCM}1e!G+AN6PBN)A8FR5--$BtOS~IpK*4Toksi0}Q}yr~w~I893{aV{ zRni)>eUuO9o^SOTfF}MMz@l%ZIq{?%K8jp5RAm znuZ*>A($Bs5AjHIs$>^keRdmXcO_pH-ZO}mqEzP!Z%TU)cQ6sK-}HmHB=}wJJ@8I{ z+kSZ18Jhgn9zOUhasd~p&H1{uVU)|Wz!-}5OK3r2)z$lbIp$vt<$lWp)GKIg$1 zyPx~O)t`2P$52)ghn1wj`B1YKYThj15!yC8?r_d^UhjKB$r$S#QN!j+8? zQ5O+)5zPqEj1WZ{QKS(?8nL?oV-;d|;aR8xkk^ZJM1K%~`k>+}^5sx$yz<>lWAn`6pyvw)XtUrs+LBgYu@F*mj z4n!*=iZr4~BZ@SlNF$0g655S~c1Izxy4++0Bvu!R)kR`;kyu?M&u9S2Gy0bKg`}k+ zX=zagNERbEqZ7$u{AO20l3wAYP$cOU$&p5Kq>&uyZ(00EN0g_UWRA4|VFdzjx z(h)@(sqdnR)OSJ30U_mpkm^xL^{5RXFb}C7g%le@ij5()>EI|lq#O`Z4hSh_h`1OL z7bD_gL<*%Mb#;-ty4>=0b76(eY){3d?_viOIOSz-^R&cUjtLTTLW2)h$DgWqs>3BQ-Wzm0(D|N5>IXkNpN zX0l0A=e7q#xB~_7l)z0KK#z?cfeFj+F_+}$0Qx+u8QdrW9FOouj~(GPssMc;Za5Lg zc)d4f+d}Z#NWdK;1}48Hw^YUk&f^sb__N*=1BIieAbRJ9(@=Eq@Rh)5-V{K`4!Hfp zR4-Q|#S(9SS5skMMwdC@N~IsA3A{!aKTMt5e*zm6sqP2bW|%a`!h?V+B_>K$4(B;2}yRfTa#x)d8hxr*y2H)GKRHSRcWUT>fb3NN0a9hs6(Xx{!Nvtv+ zw;R6BIbvMQF)xP7CZyUJU>8-5eeVz%;lVLE1iaV9zDY`xZn;wnD)4@ zgj?@$X_nVyrkOa~v|X|o5@2S(wUaybcXn}-+Fobh8< zo94gg#-{wx)n*O+EZ`1**42hWn*P?+=ILK`wMpi6wSj({DR}H#l@BbhRZ;UK=xT%h zhh1$-x6rjFEF1l`65&=x+=fM8s^IoR2dtIAZ|)bOFwp)S0Py!3Jb;3&`d+^O2Y_*b z95^ilwroR6?DxhxAEkR?=+BnB=N^s-x&Q=4&;?)xf-VSm;Yo1_cL51j$YEsHha5(T z?80qy_%}N8A+if1>RKYAE}|Lzb5k&)83BtFXukNDdK{ui|IPY`2)ZEX@*6txA?Sjj z3xY0)RTuOsN36QDJ}ktli&%Aeo*u-ii&%9LtL|(OLBy&HJco!?7x74c^P6+K)Bxd` z=cNbzJ`t-fV%0^gx_=&SftcwKGaV8h^`|x^NO%+yO@~C&!BK@sG#y-7@GmoEk!U(3 znhuH8oeh@$m9e^G4s6t1-2Me(1b5fdXS@gpPQsr&4jvO*w@z7K8UBF5DC;@;c@mWM zcH<5nBOE%Ttmkm{;2G{W)+Y}f0T(Qeo;htt@Y>*U($mA8;C@EgNLgdL)lq_3>E!Q+I7mxJelLtr3Fg7?uwgw0+D{FL=J z9X)Y|;HA6|d^&O948f9c$itPOykFVWRBU#pzI;PzM@pS`{2Zko{(uy+B=4<^`Sm*? zT5pB;;TaCV8m>wT4m^^y=$eV`L zRjVcsW6_ZM zUpWgVOqd;EsCBf9tJq>kUha8G={UhOP8H}E>n~?{mJ1!3nJC=6{Eys79>69>2NO^IpT!^z^ML6;0M!A_@AF{Dae;T=D z#(tXoK%82Y zs(ka(ZC?TQykyRB?DWvHc7K^Zn(yA&M&itL>rB@`cPB1n?cNFnPa&r>kY4a}5^=nf z_Cx~j)E`j78H^=D-KW6yw+ftd%koR^8C)3#{qUy@|Awlcp0NDFUAcT-%Gp9+0NOXS_d#DA0T{^ITefUdyUwS1X=w zcoedB{e44l_4@G#tgoHM?hjQAduhI6hn{YGMj7=XPcQjpK&8E?@A~ol7ZVMt-edU~ zOu7p5rSLvZmz$Zw{?`g0oJEezc->f2v@NzeQ5xTRFt*|{|C46Ii&G{}r|8ZKUL{~Y zrluvopn}=^_)ebj^Jr5}ow@s(TyrS^lYX5!G}XGqQ_ba)dX0kN%Z=ogUrH*v^R72O zDE!PO^F4Va=-;hT#IzcnAFFAcv41pbdS-FcE2*JNH#!qki36WIX^yTfYYIPooolAh zu3$*v?^k>h!I4%{!d2gU{^dawI@stJYWv(5r|Rz)wofGo{gQ2>6suYO_^bQ$-HQ1e zz%xfZ+WcEjeo%axMr`S%S?(dc%UI$+a3ExDsiBR3_p?@a@(dL8OV%Ex*#1@Z4<5bd zi&7MGs|dJt&k$U>{PlACTk;T9_shMpOK5c9+?(@8FX^_27~`1D$!=-Y1+I_lB1_N` z@B@oI%7jW-KDz1Z@jITiP2UWA7&*CVd3zD#LCFg2`@0ndu8-j0=`s&ee}3@zGVpEu1;dfz{&bGwvxy^^ z^au5IH#kGdWJ|C#KmYFZfYBFp>Qiht?aaoVQxi&LnI`boH|-&ukx`=2*DuF(3)m|} z6g|uIgy5mbhU`f)XaAFFndO03y8K z5dqz#Y4@3mPZ@wX43|A9oDQBIjsiQk`2Vr;Cg4!^-~YIMC&@k|*(FQXp~#jsL`hVN zWGf7jU6Sk#D#?~TQIajhO!l#cL9#WLk;uN2?f)LypL#yu=YRdKuDV=v=|1ms&g;C+ z>zw<(X9Tf6Q@;IK;f>COLZV*dx$`q+V!g9in{3#$@1WmlUzK%*#Fo0yfga~e_zTgl zpo#bNFJIeEt?uYCwtB(2Im}`VVrGJMAFL#A-3-}Y3w^pTZ#Y_UofID)eotH_`HXB! z`Pi%rLs!2;lFza-xQy-!T6K?t3zqI~4bIlysQ*et68`i?bKv8FH30Y|C~m#i zWlgN>V0<(0uYk|mrv)_b47Ue509H4+mucYq6}w_u6h^EcsiCwYvm zP>*kZIh_rHz=xdcJdK4WRv7?)2ztlZvF@L<$m!-rXBjnDmRx)7VfauzLC!69;D2lE z4K}=t5M+1kGM3)iJ9@8|yqv$Z>jx%#cesldTz;Y1AN(3}{LM6784>>1Qn3}#AWvua z`719tTzg3Izh(1A7(x_T z&vXZ-c*)<$YjktN_IO!n&7%uiFP0wkUva-`6(HiK0^)rl8kXoY-Tv~hcf?cvQeUs9 zkCCwG<8b+v{)6B!absHuPCPXDIv}kI*JHL*vY&dsS;ld=;d6B&6PD<^bD6x_M!dF5pbY;Zy_(`UqkNA3C{^{bL^b)9tHxM5$E<= zruB=dqH1>h5o1wvpP!fW%O>*0Z1;H|ouS1Ctp|MgHh$m!RtD`A_y#>NkpO7y3GAZJ zl>7GD*!{+B`=x5W4-o5y_K7O&+tNJv$y~wwgOefW8M{VI3hW}r-ZZvcLZ*A+UafDQ z2t|wClL=683ag5XQB#H(z>#aC=VxUWC+8*$_6+#e(Y{Yc@YO+HDi&}k&kHNNYH&mhEMPL z;H3I!1wGNa5iIKwO;PIW9B<#Ies&2R;#;rW5yoF zqm9gGjNz4;U z7Im4x8~1#~n^OB2rm4cXLF=8IXGxSX#tH8;3&x_e)-V78W>!Lwzu!s6l;@A0{# z4r8~m?rC+gTYMU4KP{ZM`|u9wG&~?$x~x|qn~j*%^|Y-DxQ8$|y>h8Jf2`JxFexcE}yq>ASJQ zY|2@7WD+4vca6vE!Ns`0!ReKtCUKkkTkP2Ta^LM`SkfDEdlynXRN)~pPn+`k)fLC6 zu&bNnpDuYonk>5Na_GEx!m4}gvFVTg1}iNQs&;}xgGaD0z7+6d3l+Mil@R#FCF#qf zyb*hjV4}VdH#R`sG>Z(oRu}jRU3XS(EKkbFvV{Ph*nxv;r|1U?4Cg`nig|wB|b-1}) z1=pM9aU0={7FX zq!8qWkU8Q9!@fb6pB<;l&i}Y_Bn!6XGVQzc;aG1ZU#K1Z|2_TZi6$w-=3S?;t7B=E zK9_E`^*g)2w@H(9$4!0m)tQuk94}q00(smDDOVWZc>c1CFxn7aaSOH|^*G)Ye~bVa zcG`oxa>3V<2Hy!;`Nj*1Hr;PUN7RnMeomaZs2kc+|xci-io;HVrA5G`MKUF zMB4WJp0$GaK)YDX(vNNSqegQu>eh4Wtt=Z}4_lhpjnkYxaG4#VC^96>G4Pg5APw7* z!p+y)PT*o4?rBebU$&c=IHb*7M(B+oE+x5W%|1Gg!vCgp;2=|zmSEi01*zY+$1<&(v$8KSN+C{}jbZlTr8 z10FSp&K;^AxG7XJ*D{E>hzjQqPSmSuhuDS490`GiZ}pXL`vc)CwGXnT_~1Ad zd2`Y8(~)iKiX;0DITTr1&!ORZr6Y>?VI<$3nC#6Wfg4?aSw9ks>VJdswN-jX+I}aO z)vv^!(-!6Z;um7kQXxu z#m!Bsg@K)+i48S3SI4<>lg_?7{(ae_zTy=zTFqBVar8xgqBfB9JyKPLx77=^4%vwn zvb7_Oj}~&e@buDk(3cMNa&5K+LXRI%czo;0`(7e@7b5t^a)OTj1)l-Fw?ukH3*hScel=8&=5Mao~4cytcg9FH%oT2_hY`Vjm|bzK>jI(3*f z1(L(jzQ?}4%y(tx%n{*7F8;0wIK>eg)9B67(HGN*fz7G=C&ZSp^lj>*SXQ~~hUK3Y|MN9fdxyX!O^jCQ zdTlJ>Q1|||M;C_iv!yzMeZJR!=szA&wQsI5@OWp3XLc!DmyJ0bdc8M*1+U$?k>Xc7 z>t+#Wk+n4`=bZ{MElg_O%Jq=tztV+C6vN#65X+cM7o38WMsa;Id2Vm!}eO=0py z(5wFhoT1)1?Dj?w^hJ#|49jR=m;s|ZGL57L!-Bd6QrvSfxR^8TKVNYDrO%@h&vX7~ zU>^$4pqvJ^wpZ%{un@!|8FJgb^#907K{C52#5-Gc)h10E{>Xi*h{FO)*gr}QQ# zJ4`&MWarWy=mjOZZmnS4tDd#{6MQ*otM8f1{}0MRq8DScbHru`QLlZ7@iJxnhpNA08_N~bsopNI~=1g zl3y!~fh{XePnLVZ39h9AA$uq6wshPG!U^}~n8?33^MAT;bF>$}3^FBu;$^XTm(4-A z8KM9MyZr5{qu{FR$NXh3{99xE!(lbn$ydCbq~bol?<=WA=Cxw1Qvoq{r{?kxrJ8{) znZ?E!_GI9{^@4vQs*qz5w*_agJc%>jIu9w1frTH#34^hJ?|}(flEC_y+IpBo!!@g6NtJ@z&d$(Mbn(6c zb8v}Zc8I9<1C+RVmDkA=f0vAZLKzTeX)`mFub$c%^-?;_z(zyL}WQ#?Rg(|cO@xqYV!cJ*UYE5QtH*YV{$B81--3fCBf zLvPE(eMC_1(?DMB{hKmfY}=KlyNm{UbYKyl&ujopDuqEN(UA3xt;G)fR!dYnmwyga zbrtwKnMz@k=7EioolE;Pc6<5H!U?n65O$Q)(2f%B#WP!^>xIE>661TqD4m0Ct*}eahv)zcZ=J5qe03pEou0Qg;xRTK8!#` zC`?J=i=5;d!){69%hHI{F|dsnu9G0O>hTw0{TCS89R1?u#28?crUvS=0gPZgMZX+b z&FIM*Hb&}=DdbOc%U{ExEQXY&GWWo!pK!M*$LUpqCE=VJ<#&Vwl$Q#x4;td2fP5pCZ7rFE~7^psxPJQ?WO!p@BhoiZ39^}a)gVI_1X}^ zp)OSoKsN~DR{;(Nx1~eGb{2VHnHPGVDPw!F0&B5=b1KE{vKZR8u}Bw@3PHy;d&o8NP6EbUqaP!?dR0d{_rUB^#4eq|I; zLOE3R9TdiCTEMtR=kwkWelJ}0#fwmny#6nc%ZLmwT-&~rlPXyE(OQ;EUK20e8V)}f zDr<};y7nxrF`DdJV>r=?t6fpF9JQ)sOEUvoST6;hUjxVeyqz6fe2q98(`5&znH{dD zEW{9DyC;kbF>5Hy^2T#GvZt&#P%1y$;k3zVQ^O)D}>2bf@mR9$-YS| zH%{(m9N!@Ee~%lf2~nQ7cg{{a2l_%lu-@>vT*iUqRAXIfPm4x@m#=QYkh1gUua{)( zK-|5nC~fffRvN4?4f$x6U5UDLTRrNGbkk>n6Wd<=VhsyCAbzJ_fXe$MF5qGWm;chd@N&^xKr_?o-!IE( z-0GC3?k$x(;|1EpPUh8OBm{{BRi4osGgFB_(G)3SKO5e)kMW97D)cnHzCkJf`6#1@ z?;yw#C5Y}a0Me##F_z3GtpO`L*6KTb7u?+mIE(dcy(9I1Fn-ePXk7${++y0zN`QhC ziqm9j1ZtX0L}e;m8H`!AMz}_d=k41%YEc$cL_*r{uY`pflFF)9uo1P;;}Cc_>2L6~#ds-I;w5 z5{ES?I&G%lH^tc9l9v`pH#u=Nl3Rz3k&uz=3`PDSqK7tr@Z0d25TP~2j{SCe^>VBW z+})`&$R@1^xPH?2vkumMEbG(2*h4DYNd32hl%xp3=U1cO*$e#!OWhg4zJs}m6|Piv zPp3bvo(!b>EFi79H-jdWAT&~l)^qt3(TQ6BNSFVPd3;dNmo{pPUB^iN+s$1AO1Tk3f$d)ELZG%;+u0~PNg%S zM;y|aprn#uG6+9Nktt~UK;+r+Gv=mb30#9T=AS#WcrMu&!N}g=Y7GuGy(j}*@(f0| zx;Y0HWA3;VflKbyAEh|HCt=?9-veQNS+OphT|%iTnIf4YONGK!?Vn}jqFa>7aE9-* zwwJ}{^kpkA3(z7F$q0Tgi$^@+M{|JL%BL5-J4hbJXzO)w(K0+^<4Z~2%a_E<*q@P~ zQJQIIo0~Byn44~;+taofp8uF=g3|73g)9H^gLet?PK&vIr%3eg7;=%6rT!81h9S=w zZrGaNk|Zf4tiE_P9|ZquT3_4*tOw$?-|Iq?7tT-M(%4>J>E@q;KXRJk*&mqcCkOz~ zO>`~WV}|^1gNpuF$MXY*Xb5d79$+2vVPpzlJi01Qb38+2c;b>3xAI=0oMv#XDCJXp z&qfSyYwPem9gifVe0TT0ep~SUle(FcLg%TnvqXi?vu7VXN+q0Sa#}_Tl?DRfNd(aN zIArsRG?S|{)ikTkGy2=6n7;uaq}0wl3c%33w@`Vf{FhwLTPPG_j>9Ln`V@=uVbh+O zQ)jdeX+6xmf0|NA{9!_dDm$;Cq_&DOkM=QLl@I?b6^7lq=AY9ss^q80{xuUlRhe29 zY*mG}9q2{CM2l#R2oEPia(q=R%aPd^K7&pBECw9Nk@-V7S`VbS{!Z&-nVr940vyEe zL&A|88^M+5w2VVLFF$wsXrrL4oWb2FPD;r1dg(VHhxi|ppoPOl93o-!C-7LwBq`c94By?4ms8{E2z59t$dML&9M7(ehiKEVvgB%nu(}g&3jjJ zy)ZHP!0EjoV{YFHZI|vz)i!*X*~F}_OTpIFxYU6Qs27J%7J1wcx`2FsaT%}rF zeQ4!rk;|eXV`N$!i|wAOw>Z}VDOPAxzxw~?B;7hnkgAcBf%;)D&=1p=NJwKt1?w0| z45M-yn9rm>J8oKZ_$q^-Rx*E6O>rC9K6euXc4+ z;JVh6?roQKG&30M3jYnorFZh5RQ!bE@V39gxau-d3q_2CXXgJp*y8x63z1k8P1V6< zM4-FH?3?U>r}C+Y3=fMS|C>QF=fDGAAJ$8}6JKT_c%yUUN_zjqH>N5L0{>TB$J{zh zWYrua?$k+tl`s_ZuUJaS-1}0(?~x_h5MvwId=Awb++%v6y=V9j5%W{I>OTlb&4}=U*w^nkO6FlvzhXjrvQD_nbstbP@CXMkc>iKW$0*!L zBo-SZZt=Oq{1QdTnB0fyj9e=9<%?4wp0_y7TB3js5Sy z6M@q?0*ST@;6?$N4&-Qa=PzpW_d|gcy%JD$Jgo#lETAI=kg`VxuT3O_#VpRcTn+MK z5D`D)OV*2ok)(4q$4NUee(e5PK>ikc5}`N@OoFr!qXefx1u@N~ueBcm%&?_VbO)C6 zddgs7z|J0=%Q5gUbq0dXf%;c9gl~qOy!!W*beTgLGHuXzhwymdL5VLiMAtkRp`MUx zg7k4-zXEQ>_j)C|f3}^WEl312WE)v?!r|LjNg6}`RFl+dl!hd@OV$)ez`69{GzwwT zb2V$iy*A-6*CUJdU_wQ##BU!*u8@_n0X33t9wQOwdHXK~j=vbM&SxeaP~Ke-)y<@B z?fl_ho3w-2Zd~wy)BpsgxH$3v3n4R-B(SDntv>9vyqH(?hZd*JklCPOK*V&g;|uB; z2tMsHI@i>g>12KWHJK)e*Y+sv?K0XI?z=iCfP@L#SrN3*9}YB^X^v5nR@#|@{)trW zWNypR<_H%mn=}k|tYB}`aGuL~=P8g$jrFb49&E{H01vNzFMkw`nItg~{Ngk=#8$fO zOd{X)=&u>jOi7RMIt-#_1E-n5`LaXW?O(l$$00a5Rwuv=S?;FrrP~4vae(=~r7=?` zy=$(-9@vmp^`~x;BIp;&s2wLq=mhA;%cA?iMQFHK8p6umqRu}8Xp9`x3PuA3V_cTF z1+JwCu2sPrZEKOKLA^Vu`~zpF1Z_u~8)l^HAk{e*=JHi6x$2V0yonSIsdtd~{pffQ$y*r>VXO4}}G8-+E=zZsH17 z{1#3{Q`|#$CktA}i`qF+^;|}E9z)|oN2o^#p%%8gxxaau5l{ya65Rd*fY%~Q{y55Ia zkE^1@H0YxWd5~u{1D>to+Ig6*pkW7 z_30I?8I08R^ta>~>-tSeB~z1^IyOH(>ekCjMMOoUef@_>{gLV`$-Fg~M{|`sV6`2 zdC!?rA0~ULeux)GCltQ1(&DxK36-)dV1MMm3ZDa0*~mZ%ugmHD=YQ`s`u9|{$h0Ny zPGa2Q-W!VyUsNB8<@m|4Pa#lrS3_Z<RlbPB8odYBO=#u_`}Ns34EoD2b57 z-w<=EqMqN~qJ~x&bH8r;1+ZXO@JShDfe-eMrUE+q;4}EUOdIwZingDs}*Cne|jaU$~^R0|>C6ob=>hmNeG?2JEi(TcS{KRx#m) z(YNtO)PJ66e#vUnq*k!MN&R6Lb_u$pd)PE*Ml^dZ1&=UUrK+0qN-#1uf|S~z;m6Nk!s`-VIfq3(qXJvzON)i>4+_`vu}b^SPmy9KsiD{3V4 z57gP9q!r!6O=rbb-DX=aJ1KwV0O|pc?W2@2!g_*)Fu*Q0E&>`FO}pf{)b&@xLX_f`k2WcNqX|XrG;$lx4fkCu*uCI@3Pf0fBg;u z7;<^rG7aT4N9)!kh znE(|$wHvvbm|2caOgh1%f6FDm4&tsOkQg3 z>ybSs!P*gv6!+blq-11z{^zu?jUM=yyxf+N@Jib*Hp$M>Ef(`dRbsnc2R1S4ION<* z2z;Cd%PQ~QUB{ylVU=Xe^MQw1)6DPIW*#-kWO&824y;eo=W}PnK7nw~0XA?7Z0BG2 zqh3i)9g4c;RR1fFl3wc^MHtwdZbkUMm|r6Evgo@sIiLxEu%rtsE`*W!NZGAso^+`* z;qjAhSGep)!c5W4S*BDmO)=TxQmjz9r4uh>Ie&-Fceo*ssE(*k2rA;3Q&m~fK$rln zm;)pWvNib>u-joZC^AJ%E>jbbN*qb(F1vue2pAQW)TsE_1RGS;$Qs3m$4Kw0j{ZRJ zZJE!D=**n0y>+2BX(=EwNt^8Bh!Zc%v(BI}NibfXV@_gp!_+NwwU2_o2gR)qw;c2$ zR{GlL;=$AWcR#gt=Xr`c3Oi<3VTe8nL21Cz8VI4Hj!3^(F1d+x-sY8zPPt^w@#<=T zV!&({wZk=0y!b(#MCg4bBn)8P^&hBgE(o>p8O__G6PYr*-uT%f7@{YQa!cF{< z;CtjaAe3D;t?wY5t{)?0OMPsm@q?~iLF*fUX1@0W-B+jAOsg~2Pt)<=!?@T?OmD_CuI@%q1>fkINzY`4~2 zd28Kq53I{(HK2!Hc7aB?x!?o&geZ7f!7eg_SXrlq9;v#bt<2s=0k24qE3np!moR80 z4JQphBYSS}LV&*?ur7D2np985G1vct%OEv%MzBBV1@3$`D5`(SQ0nk*g5c^^`pJ9D z5X;`EIj#4b!4|de*e4J#R<_hYRYhF;_)a~{Jq@*;Jj8E!JXD8LlbC&!Hef|$qq}zh z+dL`_>V)Txhd~-ZE=npI$mm=hOLrmcJrn~|gENDUCe8Sq=^tbV@Df_^MWz#y z)@uH?l)cIK1t5g0Vucu1c!I~;tM@W}keL;TPPWup{xes!Rq;mCwQUn&SDt=qNnlQ( z{YO$u{0l^4xao3&^UW%6%OTGWxsp1Z-QlO-+A5o1ow!?<*Njvi=O4a^oQO))MAQl*WY{aZB)88*csgE>3Diw<_9N!ce$l#mc+?X zjS-n=wq>~E@-*J|KPb@&j9*KrKu?Pb_UvC0U-a= zU1f#S1F8_(1@suX$*Y_i>z#IFx)bUfweNHn)mx7dOB>xkbjtF&9P&3oPZ^=8?jup1kHh!~X+Y{AWg<-9T0{HwAH24t;AWKiM5JNlm^> z;PJ9*imLx*g$Q;3%iWdX&;I)5(JraCiY``nxB9-ihwXNHiFU^=Hf{Am;fwCYij`FN z)t*V6O>Z1&Ob^wu%?ysR0zX`M6$LZHW{)R86JC7n72i_(+Q~gskfK_`?bJr}Qlj5F z)7Sl76qx?0nE;HH6{@;HfSX?nUwCh}_EM%D(l^t?3g4It-Il3_yj|9AaT>A&K7|_hLoLbfl3#%+NMR^I^k}8q#_= zN@c4=4J?@;_7kQH|*o$$pdZFEe;5t4s6t)Vewd%5}HiqKbB zRcxLU{8l0z~Ktf-MrUFCRh9ib1UE$vF2}8IyEv z=U=!(2jESU_*@%=nz{KA3qILDF_xnPG(5cO0dI^0++>CgP{;Z!$M;}8{1d#Qdp03s z2xZg32t>~OLr}h9Nn6=_v9dGsO?m3XsJY&w47r-6^?!ueTc-9~(TjjVYIo$>&$Tor zD6g6jKy6K0oV`K={N6lQat*(%mCy(C-wwW-kg+~(>i$UaWiIBI&I>&+rCK28CvVG8 zt)R15F5dLuLCpQ|UA%LmLoLTHU-RK;sA24dSi^e%;==MUsJg$jrhq zieCId)FA7>9wC9#dZ;SES$j*tbozajDfRBc4op1BQ1T^Xuukd1%EIp|#J-zocG19- zr=D?|BRs(sQx3@G5!Q2nR|lt7@>igT8Y@qD5|6Swe-j<}{*(X-N=tKeha&SFv4+## z{gOMyHIzg8lP>l56gHIjhyuZ$LIr?#gD?sqig~`t;)i9cLz7bP0g}`HXg> z&c8aXLMk$YAl+~Y==gy2g~ zt~f8COY}DMEZ?C$aAjpoGl&PRs6qp*`}8Zf)z^fDL2m(2H) zqJBtGu#OVrc^F&NWXN{y5?gk>-Ayd(dy|1Im+kA-$h@_1Kx$xZ@TK(xI}TBF)(dsW z*T3D%-!kxZg557%`4l}wDZKFU5|?xF+nw4yZ&YH9-)rr({XG2;i7Db=Bf6+=?ejGM zDh`>q=>WbZqA*Oy3mltVbS&ksHXG6@3Co8H2ZQH%!do4zTd#)6qe&mue(LLw__H zfQe37=zeo6_r5;{isY_!x-gZD9&p*~)0S{+`hQ40LJdG$2bqI!C z{M-|E76Ke#HNFyrJU{eRk-c^T?F58qOt9dCy>mJ9^tr)krsOA?=l`BNfe~-N7 zmeOO}GM$Hc%MU9{8%8G(8pbs(wN#g`M!{qTUfaME9GBH-XVC@l<;ii>UVrKEd^1sj z^FI-UG~Fk3?7j`vi64=1Y}y%^cTOIw__X||Qdw9+ueL11K0n&JoQBNnp(|saMC@x> z|D+b+l{U3h{86!M47E2vBs@>>G8lh;!f77mD8$L}dvJbrVPo7U_9rJM5fNQxY)AJV z^34M274H@7g!mqtsj5QFjWo@3UR%U!Rxs2V7usMpz>hPl-@ zrf`GPY$-D5KbVy}_5oa8W+2N9p5VTvNVSYU{j%P7^qrSKlU^lJT?JdC%CXUJdTX}~ z;;r@$1G)39#?BWxwvshE=|==;3mbw(Sika=#2Iw&S+WWK_%ay(g$5N@y6CmbKu|xP zaue->2qd{F=V9F!N!MnOp77?AVp6%4;`-_p-Ys-Pc)oZDM0Z0m{}-KKj5&*w~JHHs>6-)C3A;az!Wkw zV+cB`T)8n^er|r^r5Btex9VW`Agi5oeU(Q7d}rMFc6!H+RJDTF7Q{a?4d@6A8x|=H z)Mo_KV!kqkNCjk{p5?*wNl!59s>r-ry;@IVd&Y4@P?Fcu(t8w4INOm*MwYAzYDsu9 z`R8h|m4znA0ui)Bq{Vh1*?5(W&vVt`<8?dHKYs_t?-Ht5Gv|x{nyKy)fm%=8$O6?8 z`oT-&XVhLlkYKVpvqv}*F*z_6ej}l7DX56C)1TvF?x6U!4{%}Kqh8tFh~5O~yaT&g zXpw@I9Y=Db=IR&lF8~l7O1MoMUMVDCEc-|x{ z<>!%G#UIbtLMSX6J8kos%)dx))hJM18i5p8wMc9`?JHKa(g0(ji@GmnC5yFxi_d;hy%sYh(+wHQh zf^zDWBlW}`T!S~k1|X}K8>4JHn%N`0{rbrxzt~LD-Z>V$c>&AWoXEFrlM5m%dh0op zDAmxgAavi?6i1v;mZsZPbJBEm8AJL_NEMX$N*bW9%VFCmph@t%Fd3{v5I4$cejscC zt=fv}yaK-)f7q$LGYh;tPMQl*nkLrtky<8G;f&ba@bH!hQ6&0d=)(T5h7c$69rr(l zfXVDDQv^zKIA<`8A=V_ntl--V^G8J2mW_*CA%+4h1s?!|RXw#HxDb|0c8M_bT}bPB z1{s2SUjk|~*sbsG?e+5eh})j~lrG9rB6ue(&C!-bPYVy-u%l*#b%%B(@>OWKZgmJ( zLD(YtcF0bbRP(SH_RF?@p5G~ClSYW`o)=K_#N8>NUO@ZXi-ETr)9Un;*iL_3(EGE+ z)1$5NM}rPAxE=SK6=SsFbm~{ZuRgj!ulChzd(Qk!3rw zG0!tLe9}C2;)^Zd$fvc3hm+4zZA!F>Q;SGCc6_Z=l}s~!pmIc7AP>$hr(s%QXb9LA zf!CE!;!W*QSogL-iC>p`DM?@p9tmO}rj>zn&1>$jtTiZ+B6{>>FoxC6(Zs!>@(1N4 zFlp2(zhwMknQXy)&T24&qrU*(P4=pgQlmBa&nLt7Td1ACXL;5hw5n~;&l@3iNoOL# z0@P4y-{NthE$r0roRV zxW7fPO@i3R*|8PR_-YhP!p5^svOPp7@hs`>&aqR6U^S3|EdxKS>{jz_q|^54R+$zE zr>}%V6)$)fp`9Rs3p}5qQp0fp8gPQg(S%AgqH@dVcCqGHDF;|Iio~hyP{2*Lv6z5p zwy}7BuOd9lsbt=YkUi$|K%^Zq^J+vR?ND|vJ=|^qH;kNHm!zIYSGOMP6NG!qdnSyK z*cS%EDxUf8AYSxDU=~DMm38jKB?G203O+BFh+!s z@o7@F&_|LD(xil7Zv|i;j)H=UzJ18TQH8XP?D)X*@8QcLS!N>tgSl9R#kq{mIrQoO6&!QEN( z;5^ju-xe3Vnlu&x1!#ZOxABc2AA_|_psL6j0p2&@N zI165yRe_MYrGK#F(iTqPuoStQDh;k&JDf<}r+Yx>=ZrCTb&FphNb#6N*?zzj=3cD@9L zg=Zzz=HzPgAm>n1R14^&lNylMUbsquB;ihozaqcD6_Op#hEJs)psiq2x#mvH>}bgd z;Qmm&B%6q$ngJ~4zbZnIm?Ek=Eg+xFln6MgNEEaS>F#A)UsM}-R9sE69esQkkYvhpsoJ>zHK z)IveG0~oWx6ISrPRHPq1SEvX@g9I3vFBE;}F2O-ejEz3`LBbvO6M>u2t*83$pkn_e zLc6^Id*r@ns#Dx~?2%u%iA}8E8#$ZU0JKRa_Z=#g49Rna2HCKT!e-8`b6G$r+5tOG ziw8mQfN&IqXG&lA9=rPtJMc4FKyzQC+sTo;3#p^p-GGK~ag%7yFsI@u*x}YT32Hkw1%pKlo7l8N9S*1APdG9s_^0YF9)XPFUY-8wUt4tMSpwG4MGSX=z zxQ`U_+@P5(&#fOkdr#2TWJi!sZ|s^V~67@HfAxY?Z~pJIHj+3 zD%GOG#AQft33jL$cHh-&vA_db>=VWj#6G>ZA0Wkw8#dzDRYx0oCY9mK-?D!%iU8jw z3NvBd@SGD>55?W>NM!{BJUAIEb~FEw@GVB-9}Wmo*8%!OiCgaJDjN5GLx^4N>at0r z2j4iRJ&i5F4QWu%sc&F%8B@8905VRLjBowZ-Ney2+Mg zUq+KHnc1!Jq!XO)xD`p}p0?*&pIx*X_#RG+L)iwwuy8p!H+cWtERULd+Q6WuAw@_S zB^%+XRB=r5@l!-3_*aChu$uAyhb(5hsT?&axjC}B*6}4d>pXUAG(yuuR__Y6MGWZTn*ybKzk!^rqGr0EzIjIM(exLIST44{< zAmWWbugJYW*{VfVhB~7Hc70RQN|2S^r2+}Z{Q~oFzehp!j^MW3!J>vu-%h&uy ze8Z_E_$@G}mx3lS_vyj)Wwh>!g7GaFnf67gL%eEfDw;o+(E$O#;?XN)kOoRJ&~Yse zReXGsH#`WIO!0va8Y`S~ZKD4X%79O!yJf@)TO+NT-#&|k$$TgURpfiQ1w8Ne+AD2S zl_AYGYonaCg9FB_nR5Fe5BbWWQiP1hSP340!=VB_FrQombS$D;ZdIPw@VR!|MQtV~kic z0XaS&x`-D9k6eSdjK4J{V(Wto<6p&4w24guUJM_Nd92FwtP@uRnF9D zp)2T4{;j1VrZ)9TY`5ccz(cD^02nV;CYlf%$hnJ(A$R}m+I?=9{ea4Mk#Xjuag1p6 zt|>t?j9pyDKW#ZH3Sl8<3o70!UvglaM7(`-=`JjM-T4i`1$ZRW-;bSb-yhS(t2U;C zH4}R+LjhE&OFTr}1Ct%eh@j$f66e|#6H%Jlw-N}H_a1o!Gj0~dr^+BP zN*2r)0uTKxpwweO6K&HDChS?mWi$!siM0G`l&&ApY7;Iw-1!-C&3MSF4Z)c~&d0(Z}Gusx#u}|LRq+;FrDR=)-NwK>z>1gk|pm27)_Erw)imLNytrs6}aBd8M(5 z$-2KbD1^Ov1?;ZAb$acI>nd|zM3?!1=jxWoS`G|_$X-jNgcH3HoZY1G<|2%^Tb=*V z@56J7Aj2c-gZJ2iL;ZIl&xJ;+fZJcZlmsdV4o0$S((zKpk+KB#qA+)N$f*}{9t;}Q zTQSdJ4ydCV;AxkEt?EM1bDCrCU*BiT01cw4Q-M|u3%74?7k?SNN4aVR%@HJiewNKc zd;fXD{V@T-U$IC$Jd1a4=Q+zZi*Jy(5dF>a5hP}n1qw8o8Qd=a47jh2b3nu`|nR>TJ3)+Pt4^XP+eW$A8~DRHs~iPa6ISeh;5>yNYg1zB=4lD~U` zPp1#`*znGK5y`KaJ?&D;fYu23L>GHYTIv_5R6`KHm3i{LpzqeOCUgfH z=Y*-R$nL*P9(MYEuspEz#*~a%j7PpiUY?)F=&Pl7TB8;;#4m2NU7%JdYWuLmjv6uH zGQ7XIR|n~UY}~e3t3u7`9{W%~014XSItjnvYwds?dsloZ1sfA6Nz!h2po#FfT%x5P zjev@sxziC|NAif!>f*)DD1aG6Y^dm74d&W_OZO2+Hq!I}< zP6T16nfoi#hG#!Y(dY#rR z+7ChaROSIQtIN@9?zrOeRt)4l7Gw+ic|q9#tHiz$MIT(K6i0hS?v`L(fpFx|m0)7y zg#3C2t_W7|*EARI(IV%@pI&Gamlr%LMEC3jo>Qq zOTkOZK-}QRt6VTxrJn@TvwjSzJ(VQV3z>lDS%O=l8{JTp)091UX7Oy&p3pgTr|m}W z!}sh&zdA~l=U01>`Y5k(XsN&0BR>sm;%fvNZWMc-5$*j7RZGfIjA`<(A!S_%()`W7 zy38!+*6>Gs+jDOc0ULU*I?!C7!dLGu8(|%+Ikrwf`6>|22 z=lNq;_XX545mMYEZbM6-xSfDoB+`obJBm3j2LSIOjQRDMcQJ6P?_s1 z=)HBLpAg%rhzrQM<#iwML3-A_MwwONZJ62K&x1{tgUUS>tb_^Y81@@-^y^as@p8e4 zVbfgrN4@ky13rZp*f4WNGHTNBlHVtJdz)JIF*at)%cztq`;H7)=?5BHG$Bz=v*K$W zI4X?#eysb`lSv6Ealex)g!YBOuv;&q{WY!-n;RdIeL#MO(k%+l0B4@WLhKKJtIDrd zFoF+$YESPWJ|^Spxp$Ge2RkA0<_HnzW%SGNMi9^bU}=Zv0}%LP*LKdSaPa*;XVTg( z|9|Yg2{hF0`#)~q4awTr_exnaNcK=FQ9@a>mKZ8ovv0{*Dy39}B9Sd2hHQhfm!;BJ z##V%}4hFw_W@vk!&-s4O@BIJg_xu09&gq=zIj8A;-Pd)!uIqZ;*S(?1Dm#Sy4?=Om zVT>PUQZEkPH3kF;7;(1N>~F7ir1^;d2HHHBBX6@YEGRL05mkb-Wk^K;#MVt;o=w97bv`9Dc~hKN#?$&GdmsS0JsH{Yw}rR{u${qaGFA?#XyhQ@h8<#EbBB$hB!+ zq^#R{R;r!U^xBNRl-?Q)l@FOMc8FZx#gfgY98n%kNCVlBCq+Vk$+#(gg)diw5(O9U-e}Pb17Ar5!>!3~NS=yiX>&(`33^8xe5dB|A5s8$Nn=ydZok zqJ30S)rKHiuGt1=(E3L4GZ z8jv7SGFvbo7Hz5KDy)vkj7q5w%?=Y06oP;#HcbphpZz0*2fqzqgm!JE&-hT7Bl~*E z7s9mI*X}k2xaHT##|P67>q`m+`>0N!xz&$cvAIPQVh*kot!t@<7gdL3KK~&}D?!(1 zMn#k%G<)JNMIesM9Y57jt?=0K!cx>AH%u{l9<`D@GK~l&)K^@OCv0>8!H>K=OVcf* zEOSHZ5rTnyUif-N+Kyc%~f z=A4c0Ds>FI_cJEn=HTBq^Wsu||I_?2GJwRFrss!XaA1t6rVE&v!lG=$A!QHecc0|=Pk=n%6SBwUbIoPL;0pCUfIdr3Ec1}_ZF@w%W? z_ZE2V1v6-6fEDLo(mlEc zNWV!boPxMa5U;xU5Akw_KNH7gEUH=CY`VrQ;OTi}!QeA+!*-SR*a#xf(zFU@<$G#f ze)obe<~DZtEln^tnR2^el4P$8xPRR};`jQ0HHt&af^+fNp6t?)ktw>zW&@fgHN|&N z@)8`KO}57I7i^g@QKX4PzHMU@)UXJBxWn~nV)Oz^eAy2(&_6tkFnC$^(hXiAx`7P! zMao{xxmf#O$d|L=?0zQM`vX#~PO!cKU*Dr(LaE>|(+K^`&8;$Vn|R(yL+<)<8gakh zwwm#LSqQSA8W;c*L@>aMm&ljk-g12RxdlHvCR;(8{d9F?jlne4I@RHtgl6LJlrB>{ zCw{OnU(satTPEI+)9gpAk;hExp24G$t5KnZQ6$PtpZ?1R6et$HJ;d~_z+@%@eBKbk zRcq{=eiDA^A%MaA_t1^9XTSt_$2Bxgr&fc>f;Eafo{~A_MhIi*zk#5}!PX^PM^SO7 zYCe-N1mr>s?(_B4gq(X+Dy_DI-{m$X;CRH^KlqJen7ToR+*O~GP8(FFGS0nLbnjCU z!oUJvAPZ{h0T;Y~`TPr18fjhv)7?Q^*uGFv{mwBcGLe#~*&DiQJ>EWDfG^>dzr(n- zhB4Nb;&Z&z@DxJc469{EPS_cM0DY_g!gmdb-(3RNLZ`%2GgHdCYYNh6Kosc28EmADU+2%>w8c2}>=P@{dfRl|+GwO-f)^-;DBLx)HxSREUX^(88ylNTxIoowX zV-%}Wfm3q@?{TrI0Q&myAc-5T`I^*DM-7EYG=4Uw@LzR&(xu~EULI{$jci~ z1U%fKz++4^9g=_L3_J7;FsdX9+Lk}O{K55bPJyupXwKZOKw@ud0~u9$*+dzcFx`v1 zjUf?#ipid(X<}}Fdn;fa7R0(2Unpg9TI|w`(Ee*o{dsgOFBtaU5E&X!1V}ZHS~N@M z)kx8H_9XHQE;)~+AVt8ubF>23%P#?9tmFm9f6w=?@MtmtsbK{6eGWBacE7z}>@WxB!6m+$lD)NoIm= zTR{l8tU@LtSjynRk^SF}X&-$*McY3`R%tFad6B)cliXjPQZ=8URPaXGYV2V4v348c znM78L9pSAFgWrT>1i-y;g7BFA1MvE5)&+nA-zkSdTAQGz_@(TX3T&r~r;lB)!FWJrwORgQy0tj1F~F{N%u~~TmTZI;G2qS>5ViGAzLf_q-<1NT?wZ3R zwD(}~n+jR~J5)7w!BWnDiq;$w1XR+lS*Wh#?X6aYFolVLnMO(fr$^1Yl>Bo={rB!v zRghOzJv@7t&D}(CR3wHBoEYO2npbCd6j%GG0V{%|5dGD>GZS z(Zsbd#O)_v>X5ZaL>Sh3?ZMS(&1sJZva1M0X5OqO$W4OHuG?ST{mLig123%y%weIkOrp$Q{7wYty-s3lj=d{<3*vSkON@tXsHx1x>y>0U>|k=k+)n$HR(mwb_P!vCdppD zqgm19VaP4{W#*w6>27GC{iiGTKCi&iUS(nlZ1IpN7aWh7U8(3;H0DEd3qNnyPg2#X z`K_vGi89GMVb{Z6(Xg6O3NZ^lx}fj8xE592YC`XFmaUQ_GS49*(kUeJZrJKH9gy14 z8>f2#89o}>z9D&44PwaUbfN%_i+5;?bHgh<)qwkBzWDfIQY|VxsvQ=5FweOrW>6=O z|5H;7Zk=5kXDOqygX3x9TNOkVRs-s6%nRYUHJF1zaNWVZ;Bh+hfrO_|$obxyd>UY1 z?U4LkS+*EWXuXf!Vw~AhpBY&BzLW&CJqWb5xa?yIy2uCoFzJKCHUH*ZDq9(Vrd=AR znZp!_GVroEC?>CXKhv1(krz8X)?PAy<1q>H_Bj0j-Vn z_GKki%aBjb=^Aj0wl`z-AX$A!fUE%;@*}zsbm`3On+ohOqjVS8)2YBEzH=AdPTIoM z-^-3>jm&Ms15z0Wg0gneT_6KFOQUF7kLg-{&2-^gk%M9I$eGoP1JUnhN+IJXc`Xu| zA@*V4_MZV5exqyZJGt^MoT)uC$HP=N0$!wd-`COxm*@eHp~&vv_x!YS?PZj`CZgL zkrZ_Yf_|Z_(TRYv?79I1jseY)fgR-dXDX%7*i^GcRD7$ef!UebQ|dc?8CzJMY#5FE z^FH3+G-R}kW%dbuM+_@i7$4RNVbi5{Jw1jfF~j+fzt(z!?zKsOh%5-)kH$4Pc>1LO zsDFTzy%X1b;9uMjEZJ;>+c(U-m`9t`q7IcvEH&}2u`jt(NOY?#~wTeF{> zfiv-n2fos~Vk`F~SjIz;ao4Zn^$ZI+3?{M|X3l&m)l^kg-NAcZH6|m2vV7V*j}j11 zrD^5f{-^%oBBK1m+B?&DghY4kY`Q@u7Q^s4s}ssqG+UPMPnch(6Na!3CjV*gzhhCi z+j_nug0&;N1`#|eK0w$oVs`a?$=ho8Ly5%Jh4wfJ#1a? z$()Dx8_}Cwh6&#BEXSi9!{VKfiAu2DkpcVCj>2PXN9KYI58s@pk%nDfK(z%XM#5UF zUh%_K*DZ3<+@hbex}av-5-iT?Pb;b+*Xa6lsNyIBj1E|w;p8`txHU8YKoumXt`h7{ zMX^~9k8ny`N&eHgiRdJxgh2`=*t9%UQQ(F~_o}nNANn0Rg!azKJp=bwcy$eatfzWn z_*@56%9eH}7lh0umSZ)Z08JyQ%)3Emw#b_a3GF`T9I#b+k0^Ol{8Lgfx-{--Udq#9 z*Q0=2$vDCB_TKQ#BX44?Y|<@+Ji->5N4D?V5wHxqRE z4hgTmwIPjEH9P1w3$57TKv`X=zq6KtNSKbDFxXENW~2%2^0hm$KQJua4|r?roHCen zfSEN~Y{47z&BpP^;=k=G-j-L?WGja4;QLj$X_fTudnq=TIw#_6zUCwi*o zui4BHUtFC$$xxYeqZwH6%2m4l{VWK50t~+gQU8&8YN~HKT~JdHday$)O*Y}7{>hrG zR75rstLS1a{q?SNC)DM-yc3)^J`%RSv=joa`90=}9*i38hq{q}@Pj5^@=EXVPjp|UBxd^jbrpE=8p|r0$3eoygvevt~A7_Z*+^CI-;42WD z4GH~OzV3yEa!EfH|A!oK8H-fFBPr7iSodcDh{+V7Pfjh^EVyv>IC>oB?S35H&INtj z>pA5(E4RwINK?)o-p|F{1{h}%+bdxjQ-@HOeSmBI7E!=Q*qVfY#4j33X@*}h^IZnB zuvQp2Z_wtGY+M3jDhpT-OOUo|ZsK`Ga96mF;{AShmbO!Dl_ooUcZ9zvtbQ6hLrwcDE7Q}~`v0AjKMo+? zY;XYX^$=7D8Eg3D6%9}t2hwg{TttZ&0wDpR7qKXNae33yoTD@_sR$TkiQXoUZzRhSmYlGkIanGOPGh37&JW2)5V; z;0|hGF1Yi!=|M#Yd?0mKh3x%;_kH(OWUf6bzhBW>c^1yv#2UgAhkV8KLg7#2Vl)T;6^9V zlq0|eY*M=kTX|O{el`~-e!Sp{({~bL92el+DA5+`W*f- za||$Qo>UPbQ2qDE*r*StE(9>GR;%$BOoYJnREV(K96PN>#_|9qLqYwkF{W}W`YbcM_lz`q*c17AX z?`#GCLzD$v1hN6dS-S&EKVuEQQ8)MvSX!=FAKq+v|3}{ar;H$zEc@EEt$klYnR9)d zLPS2!sfYfc%w9rK@u}L~E0g!MnN;zTU$$9<5Ct+GJuDYyA%5PPf&Wg3wCUjm(~k`G zPX{N=Q^g>FOZFV52Q>~4W@FT+NWuzJPr^Sg=sMg7!LUfP>`PRwFYx0ef|frIh!Qw6 zjkr+IO?d08CU2G#e9Sg#Y43wV=&5kkWnvNsJJ+*h?^ zgD4*REwL0BJ^u<_Dq25KWRZY2g8{sj!9nxo3w5y{rsHfy$5<`7iJ#qh|EbLoR7*mJ zzM_dg-APB4&s!(Qvnn@ZLtEu)E-6iK-J+vIG~-QMD|eflgn4E)Ni*BK;yUtL`U>K= zcG4eZrCQAxKipG{E8Ci)8FTG z`QWGT?(T$63{M~qE#>w@ovcq5fj5dPIN|g60wYTIz>nE1Vz&(JbI_0RLSlt(=n=B_ zntM(aH7U350e`VK0KiO+vz z(`W^I;LhrfM+XCuhyNi`D*l&9p*=y07ne|d#V0k6&k&OV60E}XUhiKal#8=SY`fh7 z?{xUaMWj&ey(W22*jB!qb`)Sm-To=oJnKg`s``5UfB}z(G_mO3(IEO%mu<_Z4ivx0 z=&eXttTy?9f=inavII{{`&zZ2OQ$<_Rdk^90zJ{(T+M1~zobdWpJwCHAi6WGP-n87 ztk0CG@(#!6G(gBo#e*vb-f{}Xh%$uUAV&Rrsjakg#0ourgW{qlDc^L1yHnJ^W(L3? zS{8xFto51E;~z?n!ns{#eluzEp>Dy430K(;Q<6*3K9Sn7`jQOB8J=ffPpTcqZ!Lo} zdRR$eVG^?h60#N$(O?m+8Cr3?=>ycSYZ@Wnmir0H(gi#=l7h=dL1!c1Q{Vp`pl*wr z`bX@^j1*YkUXE`vE|_L;cLI|sM+yR?E){J`^GC{tN9hyFdDz3@F~qLGv`#)(_EBc^ zGqBj2GIa`A%nD%9FT)qCoM|Sax!dONSNvu&foAmKJ32J1L@n-1aR4p6ID@6_BT;0a z-0n4Q_R==uKEh73Gcps@zgTJ=9XUe4mHDQl)K|m=;OryJ0S|6v!UA3!enl(I^_@j} zwAFU`VZJVY2OCwB)NbGV)G*fiF}Pp?@I24OD>od-ZZHW((@>Z};Xh4ni% zkV?|w=x~C~%x>?{5|$N`3_1W>>J<;x$4yH>>beF1_hW4J;}66YQ1aG*j7LC*&}W+! zP`?FI4xXY#y}Sau?X)=Skrle7QGyiDDrjYl4wRT^I30t_Ra0LOwj=+EHuuJ3K$g}q zGFM=`2k5M;fNM>F9X($smH-vMIFCZIm`o#G)SRIr6&bVrSTnoJTgJ3`Ezf#n!xbdQ5%v9BHK0*+ZCLC)_7vpY(l z3{ve!mp7$rBd%rq{`JkYXerV5k?_b`r27@l08{2yx_-Cm`BNNa=YC5KdP%7~yHU{M z3Zrjl0I_Q7f|gHP0;)6MdejvJN;RO7ZYkLnvS&y0J~#ndwV4wR-ez%}LK@Lb?GNfd z9ZEF+43168UJ&xjIANb2B!pBL)j|`e4*S}DwLlg)ffRl&7wp(1e71Gf#K$hC)jG3n z*kLQZEtwbbC=uSTj~$$%z#TWCLN-ycNNY|~(~8`vu^F1VdPGU-orHacB)l(*F54cQ zwJ10P{OUUW2I+zNRP2ih&PI03t%31IP$glLJLI>zK$;a|1AQl#u7 zdCT2BMwZYtw1{TNK7XGAS^eb>FL=%Y*x_?O$m1J8iAOMBq$vWXYd~{#UFEvC^d|be z<~WmlT+xD2oNVauK^p1+6R{4?#7NqEqO(nsL^I1Ii1PB$@AhdLsOCeu$UtXH+eu?2||b5UssYn*kt7fzC>0rbtgnXx6`|0Au65MX3`x zsqZ_q{CogG`%~n#$LQV#C$NC=stBaauU)>FA6|uic44Tu_8McPtkc`q5dkGh9bmpC z!CG=OetQ3jTv(GQ=tuI|suL6i_rr-N5)}=v_!mXrv(QuIbOggt>7hANCaJJ9))Izr z{41cU5kb|=qu}kHiAT+7ZXxA%R%eQ4Vj{gdRbWerIg{kQ8y==C>Xs;owtV;iev485 zE#<+Q0J(R^2;}wH9(q~{9tj^InO!_hF&Vm7M5=|9HLf|RTQ%9X*sf~6^o zx)OvwIt#xwWgkR)jqcQrq@(QO?2$(R7)9kprKxm9MD8bibaoR}5~YoTd`g%PTW%Uc z1PX=4T$Ki8V(c5ja$*tn4M3>XFMA$!4k-to2X2f(C%HNPh+vL6XFEg>XVnt)qUk(C z-}!aq`GWWbLkDk*NGcFhNs`ATA-9j#R3G8gx1x*D)s+)@-qEM;t`A}5D-`+Wu`Hw+ zr1;J!olC0`W&ECfj6@s0PAs6B0zr#r>GU_SJP#C%iUI9k6&DyG5_ZP!nfVmcA(2GwV*1!d6Z&}Q&WY)l zWQvR%9`-hCNHWy*IJ{*=cKJre;EqOpN6`Zhp!AR?@-*#hqK7mC+I7X@_UlI`JHgC6 zR~1>{0tgCH5#ATAm_3U+cSzn3gGu;QA(W@sob#0!gAWs+X&$0pG&N`FYkqvATRF9Z zzgu?n549-%O|2$FN1`CP`prbBo(lldJ&riou6qDIFro{3mU>Y03fV&si%CHse>qq| zcSwJVDJ+*Q?8^rsg)GpdwQGiQMC{zMV2d~NKm65!w_nojPN|#4>e`~sL=54R6@ExG z&Hxnpk^QfX5HRnugbpa!5PcJtq zF{fmdbdnfz9|*}y=n`Pc=Zs&>Bra;FC577*ygR`7@ZzCa@KD7c{N;0ss; zqH&a&=QnXY%0}#THe_Y;@x@2uT@54KQ;*JM$&LS^oa#T76H=%6+&GGe36yy4=Yhtp zoCVo)$rqHvZwGuZcMrY*(7%twdWgf1b=k^aklz9$-f5ivm#~KRCtzj!a{jHsD5g#5 zi*fJ$8y))KUcfySSXJXju#Nm3^aY5qM*#Cj0+o^C@II@jFm&@IVo*fRrOKjD7xd&vu*fnAarS$sar0fR-Md0T6_HH{ma^OZnKB-oMJ9ZUd+@#?joQa<0Yua( zBwFb?h^VW6o@nnwMX(6)*0??FlDI1|GeNI@PB_L!)Z#*-;HOP33TJe~2X$<@Zz=~|BpIEMZl0PWeA>^ang zIa1c%n+AUDu7|wKFKAC2QC;TNAVyM#Nr=7QJI%OvHQMir1m%92jFJBLs7*yYKqd^v zJ&?8pgtYPukn|jc&uQS3=dI8@#|2cpt$9Ut-PcWJ8eiRir3IlR1<$Latd|VUosE^f zb$mE=9W!K}5DV2kd$1kkw`BLqs0ik!#l$gg^$>>h7Ey;!8t1`IJZ}Q;q?~yKvugW} zcw$~5MCn!Q*y-5q)+-49%b?687(@;-c>5mB{6h{;ju4vr=Dhb4YQlzOo{REY+yV_b z;a^p$UAG0z9mD;u=yWi800T~~6u3M>D-{681Bz*%wUJi+94s6GQb*2Ysru0iHJjo^Mk9BjGrwJHn;1a9-caImVcmy+vT~ z$Z83nh-l*$P!ipxKC zvsmt-WXXD~MGBO&N0dqxFwt|m^(;zv_qRf=+de?cLHA@Q(Lko)YN{e%JAL5j^TR4` zj{Ar<8qB{hFLNQB0I49k0t3yLhen zq}Ny*4cc`8vI~sRYdfYwn8xg?@VE}5RSc|$WKS}`s^0qk*$BR^@5|^5V&5@=&xfda z()GX8$KN&@Wsgh%l&I7Ho#FW#1d=OKCZrs6;QNAZcvV_WLmIfs0qh1YuzQ3CGmZn^ z7*uveb!Hm4cG=n80p9r0;g(#&n)0#qFn^9@tJi zY)Ng&qDJwtqT+xzPy6lBOi>Agn~JXMf~KpjJppxK1H&0&48=n=pg!K|cx$7CI2gk$ zjQ||<8Xir|qiz7-Mr2oDXJ34(0OaQ=SdUP-%2x^{l+wrb89Y~HoaHYDUw{gK6S2B4 z)b%*JJqs+QC)%nBfg4LjKsV;;^8AM;HUec82mMt9zlsjPP9xO6A|V-eE$aigAK~*nGPXwQpz~4D81~;pvMp1mj;x&c>o{@*rii3SstB zKZozwtl}h396jaW%?yH#PWtW9&QuA4pAlcw4L7eR*+@wrSV-tVkRtdZ#J^Px^MzmyjcDuDYwmW{L_yD=3 z|CxfMf!x(>N}MAN_pQ(^5f2ZpaQ2ldc0H@0Hrz1{ylJz%h%p(|zHp4*4g&{#mK1dNP z4#(}#p#`mnE^xFdcFQinujduvOj(o6;_zqtMS4hu#IZX;IaxE=h>_`F&?{=zyykdq zLmFq33pgv9H1!(}XFRygK_*~!Y7v*Sr)dWVAC>quuWFQlB%@2H9h*kU0vp$=2u9iK ztNr`eA1mLMEhl~7mf^_e(CvfHBt}d-2(FOR{u;Va!tO>Wi*OXg?2QcEf1e)wQk>$h zX~YB|#*CjTWNl80!Daj&l|w9Pr+}#!Mk11lSkaiI*s{pxXN6{ed6ReHo3~u(0dNkU zm8ydrY$Pe>MG6VP!8Rm}VOBk~$8-e2Rpetgkjel!G0kn*se1_%rT2@O&PlW+eI-Ve zLvP)Fl3iG}4LQe6j^NI43d2t)nUG?()+pt~zGf(6&-yW1DHBjpAE(2vX+Xh3uc5@p zAp{gaaSn_=H4SDzuj0i=$du=3e}23BzxXyVP`6|alyAK$&kYQIfiU=+-Gj_(oP=a> z1`HnLOB*qGOk&4GpXa!WJ8beJ7-g7XLy0`+$D1gSd+7V$Q57-RYM{Qu?66!}0*ydw())#dJO*)@tmfc297*ZRY4Dn%s29cDaj; z7Z?RW)JHr%)}8~F&W?o%xXZjC1!ctTc}hr*Q5eihV~3bIaA3~ebXb6KCV+K42!5k* z*yA>^94K&RHi8G)Y8m;GQ2gIv0WjWY-Ir%AC+p10EUEbR+(hyvbmvC=P_k9C;4%oxun9H zEJ_mUcF)^~I3|Wn+lSin{KSMNFF*oBk4+3P6G9ydK=)Rjfb*K(guQ(E4%+54t6Oyx zJ#fm1k7Np1Ed<3&K(imv10v{3Ubk01qy0AX8xxAk1m>mRf`ksmF^YH}uS37-H^cAq zC~UDe<^eFqC2{zC?l7W5#qUwY{WqY_?<*pHmQUf-nV+Tzdwi)qmu&`dsgyY|M-=H)-H_|HF{<8<63m|cZHCmiD^42qUj_#PRdB&$^z_K z{aSr;m#rr%$IK5t^jyTLJ@DhYV%5W4HO*aYwi+n7i#Z{!bIlKf=Ss))K;ht^{X4za zuzlRhrOqcy}X)#?DT*&8*LxYY`(;Logf4AjkFHd3t0;G(I>>%AGxV@T-f=} zvNce41+s*a@SmSVq+D@;<6HF>QTGTE7l6d78&zqBQ}l;|8OuZN&dNGzGM1g^*Y^!} zWt@KlWmEJ@voypmc@?gQXrIy3QN+}a;aY=~23q4I4`C%}jGXn^5fS>QDUu^d0zd6? zxN~#FF|&&Mx)+#8S$n|!XRB@?vE}@qpn-!XizxNdS1@~~-L#u3)mCq*)NSqF_&uu8 z(I3a#&x22St^21^H;&qTXn!7-_Mt`M9Hta@B2ZQ(VBbnd6)d0~7!rSW9*e{(14~Mm zyTJY5Gy2uWLAe$qqG*jFw;&efntA1eHdmxq7N`QROH4>BWo%iGY5jig4zCE+$s6jj zQCiw*&I&qdY`qFs_dFTDI@i>#G==zJ9aCA3#I6xkA^40Wsw}Sxm@gbT*nnW^gSxaE zKfcU~)p)1bNtx~1KH;X++jleIP_=dc%~F~n72!f20ksAvnvI(7sDs-4i*+g7I!}a* z6olDw5GI*y(I=7(Db)^3dM!_}oZD&Wz0(gv8xZDKn|D|M9Cn%uMq-}^4n9U=Tl!ZZ zi@FX3W>hVC{w8JuWWJPS$B~)Y^_I~w-lS|zrAr`+OL#DL$c*$Km z=(|zbr|1u7c1dUj8}4{#S-Dy(QN_KcHth!YubKFPFkER|MB&EnL@q^G-$Ylz)UNiR zad+X@1K_xxJ3zgX)TjQ9WpWXBLNlttgYa*l5XGf5Yr~nIr9ym&w$&yqj^QG^QSMHS zwU2Q-LnReNqjm2sqMD?2`@f=b0Vy+J_7yM+;I5ok39DQVM`9ms41_L4WR0i-*r|<) z+373m?>hDccgTG*>pb%25`7D`$I?j~yrV&Q_F`{&c8%r_f3OaA(eQvftPGPLwvt7Qzw^q-K6CMU|w+!hC=OC-h7b!c3$0B}{Z)n{nnMkr|gooy9y z-aUPp)8jWwF(`Va+sdymx_t+Spf`bFTC?He%Jd6#!n>GrnB~3_Fn3xl*l2_hKmzLx zob`3(U!eUPJJrrEqS{IeVQQ-hNbHlIUTD9MEnL6!zm(#24qE#Q2T{6|E}_R@kB&;J z)JwQv?BV{nrj6;&e(>1RUJy2G?T3Ia)`9R#e;8=Bqkulp2e!Zn@!{L?DTXBlv$q~s zFZr*7SMXm+1y4wvsSoxlfmQbJogx9NtpW^vtau3pLjp(4-A5*neEwi=zn#91;5hk* zYan8{d;8*IkK^92CiLzrVoqqmfy*|HW2|E?{{qws-6AT}oP!oD(4x?|_DJ*(G`D#_ zK+ml?wSW6k6FAtq8Rv2A7_Ri62_=ES0@iAUV7~cAn6&l))YeB-)6gvt<)~5ojJm9};Hos#EA+hmvIk^{_GEW%EqRTV_ zzA`$tgz^d)K(l(K-JPR5`!2C4sw76pp;4L6j}|!<5!^!Q{Aov^m-=#j))smb!hz+V zZFKhK!O-BsjsOARQzt9%*<~acNGWyzt>j2hNVAuaKBzA7YrK!emD9$5+V=`7oQxg3 z;%`?ity?BPY-@=assNSXhQKHEj7vw{Iug4CJZU*U8C2yPg#86DDC36erb*iY zGSwZ-C-W5v>fm6&gqSV>B&)Ab3d3%YmZZj%?euvrLu$|OVgXaFFnWxr+08rXS|!^e1S4 zyC24m>(If0JpKU=kQz6!D9<#+n!_v{Y+(Q9+i5LxsP^;pQ~U2GEBmj|a<~9vHKB3M z(<4AT{;yDBHIlu%3HHXj@N2d~a4+?%*i??A8KAn`)oVe?R%%D0H_ZqK$cpg@$ z__!as(c18Xy9(_M^TVtn(crxhU^wm#rqzfg6rCyo_m>0uHr@H>=VxvjZ3XMjy&LwW zM0eVPF#{6vRtzMXvtblZV^0+9hF!s71D|yIVf^9#C<5lZLB_9oHjnnMb^gpBI7b&C zyC+YC1dQ_|q)g@?xG*2#GDI;24w=*1I}ml`q|lEXH?mJ z6PF~L!K6%UKAqb0btcb;?)VoBoFCwGWHYFN_1=@LH`WCR%{lOmP_QtJev8JH3zWii zheW1y_KoehYRrk1C8DH|fRaJ$Io1cS8~Ro2I6sr}Or^UW!A5N}wB4xuC|zw)_ZuKj z3bUu5czFJl+vp5t<*OYMBAs`=dM`%p&JE5Ge9Ef}3au8py zT``2lNf1KD2}kK-XQq=bM1t#%Xd?-dzarJ~O#&shE)~hh!Jf2ffVH7Ge|XG>=euRJ z{y!8>BPjgDdXD?e>so8ox=8qwudKu*&Iqf#N$}>3lZ`9WO+b2xz}u}Q`@L?r;)o+e z9WVW5b^?Kh8ZM%oDrV6*7oaz4Q}40g^xhyk0MBCvtp#O_1h43mF)AL>$3bYZY_P71 zFQOzC(fS}-Zx=?zf#MQ>g>`{Yeb*i|v=a>p(jk5?A>wOOf{SIP0D~ogi>^LvXJ+r6 zWMzDiPLG&@#xtab>`?J?!@N4kP{56=MrE(MMpk*poO6becd~FU{>|LR5f4MNyg==4>`{%b{5sP>>r;=!#)%MB?pqgH+&9Twg~owPE|*hk z7tzjYo#0Awu5@BPsi?xF=<+XCAc0W=Ex&^gW3FrUyWudQAO>cL<9;!XFkCN9TLO_M z|5L&@B-W@HrUuvq1<={QrPjGGTK!P;TL_8#u0S?e4Zvqt(73W|G?j+a0K!i3c|P2T zbJ$G19lhj4Vqw*fogz?)UE>6~?6U`0(mnRB&r4Dq6eKeBiG!6Av-xA7(xkjrX!ip- zefO{nzb@ts{+rQgU=#;2gcc4ZL>?k=*_uubf|yMAEiptZM5<2uEP#A*m&O-9k5&rz z+Z^gUJj))E1uDlCxC%OTATIq1_kn08v2#SaZ4r;@0X;76DJsh;6ukv@RU z-&TJ~_$^C_ZwvLSmos=7!cRa!lfi0zCxu&}t$_DbAXD2k<8RAm!f?O2T(VXZ|R3M$@b-Ur*+h1$A>g78t_` z#6%M(bhE+JU@}J-h5pCO{D0IAtt#mE16=Kdp;Z8e&_fy%MqQy~(=t9JEtEF35Flzn zs4{v5nS_D=Ss&BTLi6ReR#(UghHAyC4{Q!rg!n~ZbAN3DNCfES9xysv4laA3Yk*La z5t~UyY#`(apz>-IK?$M^G;~^op!`GAKIn$(V#Q4)_PQU?1}B)*W1%s@&=xmGs1Zv9 zTxiPVm4%?GNWvW*-hT8r$2`A-x1f1XrUsj_VJz&~i zK7gf=`$97OR}sv{6Ac#(-y|ZBn5sf;tgiei=}{C2J%FT(%5i_xS1^9;-{aT$_XJM2 z<`&gs@u$fo&J$B7f$9HVXSK(@v@1p#fE%nd97!{Vii11;BQ}Tr*5^hq(XWL0%rAaN zggqi+iC&i@!RLjRNevTfS`*C4-b+HKQfr~bc| zsJBtOjoSZFsAZu#1bP_%J&pyrWd)9L{>D5i{xkCct71`pn!k}OtN%>0LNmDPkb?8& zKdDC^shfrV7fPtv$v9*MCKo@6QqM1z^;htY2!5mXkp7($x@^+ue{#ah@$(_2T!7VX zF{R<+O;-C)rlhRztJ%j0CM;W|aQ5>i$^9oO3W(mJFoe9CbBUXCVC+DvUqJecr19(fX^t|6NM~%YZGk!CmC$p-x^4MyV19KcPT91bV?pCHqntIXztGw} z!7b+hl=%o@(dv)zd+Og@7V&IwN!l!e%%e z-p7?;Ei<6pSRFgcMx3B4LDP~p18-|50CR%d9@qV{yZ0DLLJkX~b$BCtu!Q!(Lv6@4 zg?q%_L(M1F`pp0&u4zW-bT~&{J$2#AjUz@kv^*r)u;N2X6|vKV&MEKZ{PeOg(5~TP zZHt;xVxf`>}Ei2?TOeW z{Ppx_i}S{((@ye6>r~uOg5+Tc-6Ew(-bv^EPYAt}up*)8&A|M%>E+wA&QZ48X>8#` zCq;*j*LisJ^%Ht9%ELB#SLlh&nTO0q&6@%GYv&3qQSn|9d!i(Jr0@>7aBS@aj*v%M zg=h~xFd%k+1}{aO-wf1WTSVSGe^pkOk)`uQiT#H6P7hwI20|mk1ESp9VWCCnJ<&O7 zvv1`{u#(EYi|uf_Q0MWdEn?z_#Te?J=+`AjVP;e+2|c(g+b-L7*>;ru_o563-hc@F zGSrA}9LiVDiQTwv&c|{6yy2)*u!KjWzu@A#LyZB!?&MJ9*MJnAK27pUH>! zP382s7H9*1?PskeB}TSL5)YF-QB78%Deo5YYX3-J2Ij-#5QwW)DAUoKO$^ z+Ot-iSE5{rh33W<9J~|@UwsWPIf$BVG~|07x!`e5aJk8@L>)!J10CK-tv*h*D~NW- zlheITCsppSrs`DRq`q7iOL^?Z9>XWCMeW};>DCLvAAs^Vj*W1t{YU%8>r7aeB!lUAF*Cev|hfq-f3N^TDg+v-_o;g z(s#Gv&7sLy_;NRV%{nKpYTeb&FJ>Y5QoK}rRj5?_XF+qpVy($IDOTe<9I$;uhwoS4 zBtM`LTb)KrXPlp*`l&Wa@=B1JV0)3fOT@*t>Y2FRci6$gJ0na1PMnd}p;-fTSV7E> zYsMsL-ee19*%3nFA;?B|==njy3>~ZDS387DlU_-aUcRNiF_s(qWfV7?hl|eReqU?I z7dVoKPt03>kjFQH2`p6W{((jGkL$6h`n%3m$cMk|OPIz%4vIoE&P4GUL+x|o ztCp5%&*)#%&(|x|7k<~uHbbSuBlYsmK5Dx(CjBCfN2OPSbj3Q!jgOz4r2G0fIBLn3 z4NdiO7Z`Pw;wvZ8Jo=lAe{alyR+C0}sYb98E4@zOd#hfK68+oHH)r2NOm;LG=BX$8 zlr_@XzL7l_m%J9{)}~RnDg$0XGiBzNPPK-9mM8WN(ynr=UD9=bVxOvIk*dKPMU__N zAUzpZHUJZ>rIat3juCvLDncaS|N5o)iWPenA81c^>nR`@}wp zkqVQ5qDbjUxsyWsPYObGC_4HJxvtgk>$LyA$?TPClgKY{X6^KXv}ft4Xk^nz^F8?@ z&x%z$R+IeJBow6Do`}UwuFn_2lDxx0k|&FmOOlmVICvcXiLrc$^MafwsWqYd(6%{9 zf$`&wgS5`4h4}=#sOn?efABL^HrqfZ3>`{~n z8uKNS;g%jZ74EB$S}`K6GL9M#sK3`eqEy(E0ExdCa$awIkx8e5<@SuYdl%SKvQqry z5NQr{G;*-kk&5dm&7L}HhPq&V!Ig81H7`pKKRCum>SOG1;+6+@a(NE5lJ82?r`128 zSs-%Nk46|BdBl5X=|xb#);_mCCUsz**3Q_RMU%9Qvdzu@Pja)z zpP-x#)3}(nSITOuSJaoh9KG<53l0YKk6mBq>gB_Q29C3=Jy8!)Uujr3<7`Ypr99`G zt+$>PvyNuDKK@=Rq2Tbko}Z}8@ZOD1)9YQPpG55v{eKi5LG4+7lUHbpkjlbQG z+wcOz%7xcPg@%Pjm9<*SP`js62kVV_&N+P9+rRv%|3X1dvO~#Pl$%gz(9z%%$tP{t zl{lU=I5L+~U)$$?Nu!9qlcVm7%>cRL)WFD2=QoiBd9mMoJ^d8{4}AkWeTX=zIDh0E zIBa=mXHif|6!p2LqY4QOGW5|oTDMOO5tkJ);YeE#|GNUp_-5NHcsF%VJi33?FA%7T z9$PKIFjmd5;H%Yf{pa|A(s5nbh7FuRiOTwL3jS089#<5&*tS+Cy)q>IS`|-q>xb;! z25Y=P_X0LCfR1MZ^P=cb<){nFQ1}yn02>cu9ZeI(r#02{!5`Q2H7b96$%#8FxO{&Y z9>Z}y6rcMQQlQbze2c@_K-8s1T^7TGrkma?MA+j{uCxG`HR#_Yl6=vy0D+X)PUjZ$qys~Zu#bhY5uuFisNawawNr)=tk}i z*q`2gL)d(4#n*BB>)V#u#>{p!VYV~Dc8=Vx9@}-*Z#xrgv!!hwxy`V_e$Z`Bu+0g! zIl(q3*vDoSZ&}Y81b&lV zbEx92nl)X2SD>x-<3m7K-g;NnO3(Ud>!pc+ubF`>c^k}CgD^9(s&BBhXZ`r(z&ZGG zZdGn~lM_U3wMc#SiW*ndoY&gR{sljq%-%g!({pMYbLtz6l>>}{8`B$WfdedN`|L{a zwr2YS=i}C7S4Y5oU+T8yz0!dzZFru&sMzHz*7Jvp?WB0lp&pxa9e3UJV)V63<#*}Y z*G-jR%fQ-;ti+-p56`NYAGDk9<7~4rR|~wJlLFtk_QmO|dT|hn<{f0^OMb8oef6%D z@{+>}@H7Vwge6rW1owvfTl^vg_Wy$qo zYEQ*9$a6njl_}$LUys0$mcgZD^;6~A@mH;TUQB;}6fkjl!QAP?+1wnf@8%D{{#_ng z<>z2O2QxSi8t>hG4$USpLdO_;=m3wbuLLYtv8^XXHHM}zXZ8q*xwZm3# zm!YwQyWlDg7Sss_ztfoeaNRPm(#2~f_kEYsqvI~cg}%?7E<7mz=)gOiK{zb|Za@mc zdeekn5fERZXzh3JBQ+DnXy{MVJV=?E@LjMh{{XjqsWx%x?2E)MgF^-%`kwB`2udt~ zLlePhDDAeZw_Uv*)!R|Moxryf_;#({uGQPLY@3#CGw}bPGjO;a9A9qE3vT{fOBI;k zoiZyhK)VqyFsmKd%d#=3KBUh30;B%23!A=Cw85)B+JNsBaPh=*sZTYm;RH5z1`L5I ztDRSBcSGj7f|-Ci#;F?YkO)|B+gPr8OS4?h%{W}O?tmMq8ZyPd+dwfCXrmaG4^%ly zB^Yj8H5jg{hvN};k!HeG3nlBX`(yjDJSpJMvU$padCHn{zV2i~|5|zAQeY(bpCuo= z+y3iZ{)1fI`=6W0-E9)!DYrKl51ciOb(qaea5a8URet@JtK4FfHSdJ|ZUIGB4aLl_kB!?y?JH#N+dnD37M+Blgs_u4?7fL>Vy|iZb(Zqd-LLX*O{;X zi@kRavUOP&2ivx7+jj4^Z5z97YqxD{x6R$QZQHgzea?OF&5iioiFxzqM4S~BwQ6N4 zE5D3NRIab2xgY9UOWjYhlU3##D0pX+EF)T#n*U|ZHPx|$sSc5A;<^ki_Y18$LW+G+oPP#sq-oggzFxSZV>)#KzZnbWWB9ivNQ_gXoS4=9hrf{vy zXtHbFUCM_pF~^Re^*_Aw@Qv$y7eQIrrt1REbKidedmh(>S`*FFm6_~|Wz5t(0xPJ2(IlD>dJr6APoz-vSGx#6J!zwG6e7l|ip36!p-0 zpc&QlGI&Lc(VrU3zVF8+W2P9)X=DrUUylMx)ncJ+Sh=*FN?wIhicuvRN-=3zID_x{|;)HO$%@UTMtB-P4r>7>zeAeE##6s3a_0@7xOjTKx+iGTO)fWgdn zi^EDUgzsRbR_pgeIsP$Rhhlc^JFiUbMh$E>AbP@>BnERHT+cRAkfs4GZ?IG`E>qS; zEh$SZOr;V7rR+&Mo4ibwYW;VYkA5zgsHJ|HD$G*17bvl6YCY=rJ-RK}rnUnhRT%xS z$Sp&5c#I{?hmSZBhK7{tg(~GlN`<#&0xE?x1InCK;*eF^t}a8`v;Xc10t9AdPy|+L zG;9Vtq{gW2&8+sw6egGAa|w zqEQ7wNxOsAdhWyce|HeU{==gGu;@Q5`p+)<&o27UF8Yt4|3}dOql^Bdi~ggF{$nov zV=nz;F8yQC|635pKNkHzPN#pIPXGUPI^BNR7H>MUW$kjn;0KM;J!U|LT@cjLVmAH| zBn%2ljSi5HloTpNEVM(A?Y8GYS<*c7-kf08V;ymN@&>Z{h}d$@w%0W+c{_hR6{tP4 ztC3o&jLuZ!vc)|vb5Ax}gB%r?Kxo=$@8$S-(~eJW$owL#NZk<)C}g?wnhGs1dDk)U2Pq zJ$5$r$-#d@f5wb=t7x+y>>v!r%2XPs@)L7uxYLyEPhCB&qt?ng?l=Uh1Fv(DwjM@f@f z;H{R~2dU1{(1(zn?Vsl{cL|?$e0zlS2ck9BPQ)z_m^2v+kL5xdi+h{8zleh%kJN-|g`4fKj8EnBm+01P@8M zm?}sn;WV>sR10fNdG>hIU?A_eRE3R8I8RU*c0`iMzm zQ5Z-V3n6EUdSMB4yk!$O?+v~Ip_T@#G+-fG#gSUtOW}v=T+fCGEi+m7*T(RnjjFS; z%#jPNGF;3}iE3llcz^y{W^>Bu^nOXgU{88`EfNrGwb&5k2DA--nrI5ZdkFR<+H&2B z@JZ;x_dx+fe*p0L2{mhopF_&`z$J)jQj>Go19kgLMtX0 zB5t@Y0~c=LG3W0uS#e4aVFd;U@w8U-{oH7zya*l||I) zrH%P+9)b@wPcjv!`lXtK+b~gI1r7$wEaIhs{q+{fuV<4a~cXG0G zPM|V4x)6<0GIK60&t8(E4640|6rg zCmkyRBP$&{3nwQNferz^n1ije-QQ^ciwghxO|SG#6$b+wM>_)t6B{FU0(uDoCkN+m zDhYqr{4jB`FfvgT6Z(62MH5F`X9pt_$G=AradQ$=a{3FWzer)g@b{On;9rz7GWgEF z5&8?K|0ecdjojG3@nZbOPVv8MrA=(ioXiPWzdMOqSUY`_l3vvMd(0muMz+Q#->snj z>uI`WGAlCx2icr%)b+y@tf#ue-ZlsCKDqA^M5V&|6azg6bT0s zb{LT-9#DFHwxb;kzJT9Ek{u4Ra+jm(A;X4%b3lWW=dwf8K= zGt|j(qnte$ENeiKtvC)`ZI0PSR|7=@){9J?V^n}K)f_eOKGx6t3`T0!Wd>@`8Q_Dv zDo0iD=LYxr8TKRQUXkQkjRDbA%PZz=T`U!ojFy-YIfDx>d(qc}+DT@vtQ4))j|)1u z%d=}Y*=VLbeD;+S>(mQ|86Em3~%!^l8N2wOxe{wd@S zhf{cPr0TQ_McwA*rgY|)_%}!Fv^>K6b)Y3=uHkzHT-3Eu%T3lWBRq3?B;sc~KTw?m z{U)4-`@l{6E80VdMBE2DXHS5SH^*iFFkSU*Wuqko3>3xFyKI3d}Q z%!$hvK4QniP$)v&=_`qf?0z+e;;_*fa46zxRnVz`^#&f?DV#DNe;&@GW9O(*QQZy- zV7IVEg1;v^qvS!BbP2*>fUF3l`a%ADAbALUPGPiYkUIrg_dqXvkTGmm$?)4Sm~iGn zC}x5MG&vLhfjd7huE7<**bEWGqVAys1@Oi&`^f}O*CLVUip&( zD1)e2Zmdg~+s2sT$DrhMX?bVoL=!WXXI1s|L>~RucWo8f26Qfpk+u;sHVrJ2&cUJ7 zsw0~a2gG3JM5}AbQJ{4>}pkI8=!J! z-n4HMmvP|m2KM8Qs1!mUr-|YLDB;@f{yFGPh?kWc3t281 z6oP`h!Y3o%Foz6fldx{8_4F*N?)S~f=j%X>oS@xMw(onP(yb(_!~(+?P)vi3_W>Dq zFMOP~8w1m<*p=clu79U$3>@r@baooMPO+5SoOU)Dc$Dc%x75rvuA*;Vt$&uw+jJcB zGO`SU)w26BgAAPj-`8dDWeT#_C#-7d_ZkxW%XDLXVmb=MhfM= z55M8gdIbjNoK6{LVctlDKix1$`&+==PvyZY*#r6txr8ZL$&q8##tno#l`z7u@c9j! zLVZA}!6pqzi(Ydlo9eOZfV{&_spFUhvpmN*B=;dT(?m=zmA8xrfGp=NK^IHg^~&8Y zy8cwMli=U4QSyAMZ4#O!sJ3sak3{VyYl_012Xdbvup{X3IXhR^{0}8mH~&HEFtL40 zf&Z2||4Gcz|CcCY;$&s{OEUiJ^FK0U^+IPX8mA3*<4J8EzJW%;wwqyg?pm9moFi2y zR)oPXYk))C0sZAe9$vCSO)iS@XT#g#FYvhmN(IaCSxzDiXMUcK2YSor$2UQ^Eile^ z7dJO9FEk{+&|e7tscqG1LeZ~V_k1xY(a&2Ic({JN6JuV!a_ zA0H=EA_gck{>)NPl_+dfiY4R4MnTUCr^l&OTCI#H%q|An7njl-zFemmfwEXM&Q{5- z50V@g;MKsNE*)C$3Waa_!mp+jjE!sag%3H=&p*#x*@C@~9AB(!DjUfx`gZi^KIXE# z6g68eHI(Floc0+UNg|?A>f2%?ns=KHYn$bgM_P@qZEW9dZu!HxSDamYJC*{oUJ{6X zXOmy%%vKX`gZIl=?x!aDlvjFLmc7X?S7Y)K7xTF#5H_baO7^rHV%NiP$YxcQH>d?K z+=JX>klDGVri*MWP2q+C*ZDNqcd)AE8PE$L(9)}yC416sjawT}vE7A<;JKEj$luFJ zaa$@YGU7^|;MT0(>F-FJe${cJ{|MbEr2TDeVpai>fh%9^pDO`#Zd2=PiDEOC){jY^ zA2TtBLkkfadFgoSJ35s08?ewZ#wS78iuyWprY((&g-6wlFKQ7B_)GtuZ^Tz#?NO@c zN&xy~cfHuOx%x~OCzOSaD$Vt%^%q-v@dwZEcVYhcqrGR!5f0P|?L2qejw+uuxmiqP zp#_WN==-<0<3{)5jvthH^Ir6MM&{7Psp=P2n0PVgvdp2h3vk&_XJQ5xUp0(SCP!~# z{>Y-m!Eo%^3_QO4?`9msJ57XQsPKx%80Xhrgkf`f2ylh)efLkkH=FQZ zpN|i6Q(y8xTA$fANx-2PLeqUu4wyj$-Xk#d2Z|Cn6$vi#LRR;SfNK6>qA!b8kl7)? z(fBbxHrwdDB@_|B0&aB53eYw=S%j~0!^|Nx2q8<`(CMrLEqN0e=O|`TE%W}IFf~?J z&YE=Q=*(3vpXT)KoY_6st=&tqWi7*!?%$Z}@cbee7fou{QOOdq{d#}*Ubo~3s1c{D zZWG|qWRet1NJFoG8n@=a?OaQ)x)~cH@ZtiEKQ5H6nxW*96Cy>$S{2`5WruXmB99CD zEkR;{4|_6YR0-T1XHu)>aAs&He0Lrdu~R~@eaqSxcMZ07xS!x+4sSc#WCl*w>K!1< zN%b&Y&zKfMlmoIBn9b=U7ze55`-IUCGcky}Q`1>vkYc-rew&i_`L@)3l>ppjG`|Wz z^vAKHfe)zw53?wFe0|pfiKXBq8*6CQUB9~MAaqnMU1x;j*UkPtL$~w_u#XY5YSfE# zg{-4SYjLG`ro)wri$&3G zhZI_x(<;T#IyR>>9k{>VhaGt1pqz$_Y0R=~XQ#qe>hYT=dD{nLlv;*{n8HoZ25zvo z>cLu$lpZ3P{y1jMXvCw(m_K${l&vBxYG;etf~MAR#n`OPu)pE`q>6jV`1wh_VvvlV zw{EVwDrnU@vi*u`5m=9B*Yldibd~5{Jbspl=`z}`bl6rfevLK?GZ}_JT-O`!m_o_C z!6ztkcbVwEI>TiWtVYTFPGLeO&dVg-A&}IQf&0%44Loxm3v#xOXSN0qz*bRRqMo zHyvTM6Fn$=#)S>x*TUw5cTAQ2&~@ko*3S*&lHT7<;FvlI?!=MdOe_O30=VQdBt{v! z2{Yp9r|nuwTkHXNZKzE%6r{?#-nMxPOiQi0u88XEM%`fPonA%3HZ1$)qL>SsGps)D z=rci~ha?^&%v8eNQzUm`ZCvFUn`F5@bLVl9Q+Ok*=W(a!j*Vy78bEEZP4dNu6I!JS zY@!@F%Yq`^WAkA)Iok(FvW4A{^SNmUsf~W(MulT6rQVGy>HSx!vju;cD`rRn28jCx zpjjZBc-wg=VHAGLw_xQEDQteSI3S~sL``HjO4(4j&=jxX(L)=8t-AQWS%B-4ySo zn=Op{3+@br^$!HzM3!N#q3VMdVK=@Vd;gvPg6wfQa-Sc#8YyoKGUh=ah3vi&&abdp zR+~_?6kX+EYVlw$oIic6C+Xvb2Q^2xM}_u)(%W=-m~a!{c1?gtcKdPm9_h zEtf1l#ruz9j9HS4xTf?j-b{C`+ECdC7q?|V5Mx}2K$szu?&pTiYf z^II%5rYVVJ5-SI%x;xPLftzMqFQCdPkDwyNf+JECCsiY2XZMYO8xom&?8&9lg2shH z5HZUq)M@%2?)3R;L4yggv|=3CjtdPE>nVZmI}t!-%_LS(2+P7o&WuKuQ4By>8t5T2 z@;f9--cZiTFtr3bNPlsQyW?>?`!c(=uiet7!pwA_CV0cB4H;KAn5|%4L}Hp)wS#a= zE};mf3)35W2(*vLL)sA1wZ>Od3N?6o7z(m)$Ow4zAEnVV@dc7t#lg>Jnbo-XFqgEi z*;CW0Rc~hAg=2+5SPz)AdWVlq%gwhG1!t{7mO1g30}oj;gICytTdC`G9fDR|x{lYj zUZRz^R0X7qfn}s9>TryW2p5^1=`mG0Yer)E$vMN8D+DSDZRjS|Jil%sOPBNXN{qPYWBOd}(A$ znB4Hdl{3H8yk7eQIoUM(kS0BFv`=~nfUUz~oYf9$jA_Ur7LqH*m$gsRl0E_RgCh#L_IbkvS0 zh#Lt+HYl7x3y;3LrcHPBo$81CLZPGu%b!W@k}_MQQ~q+|9djayW%76~3S^BTJMIJJ zHr{G2<%JyKlIi*z&LBp4(%V!$xrbq>rYY8iA0nzpaE~7866a2a-}(SwdpU~QPfwh@ z-{*zPv4RZXyp3_Cl%+`c>3mT7N0c=oCvW1Wm@2VE7T$*(sw6o6sE}>0Djz0z77(t0pHJpfuHe3~1OYBuJvlZx0N9z;5&%V6o!o$S)yM!q zt5G1`sj*OJX2mZ#NQ55hk<`OKls_!B^OVDKSpzb_&<1G@`sQLUP}N&>hrEpC=&9mq z$VM}N+LQEUkNn0^ek5d$;GZB$Y;IQR_6HWBu&uk+;9j?9;n1xs?|_gcCM8W9{3#I- zDPxaZ6Td-bl%e$Z-pDe(_(ZSw?4_sb^)s-mt=H@)h#wB>g(Y=>T7|h9xpy4u1sfps z>Q5%V?{{z3ijJL|4xG3q7eBr_Ob*xyD^n&VXXCWLW@taA4|TXWRpV}y<2|j; zZs~G|Q>#*-HwDmqOO{Oha@;H`Ex2pF7MDc*n_;^f)MeILh=k*%eu#Ufyc@za zJe#nD-Ux>jvlgJ0=$W{VJmqLZAg6|*N)7d;USu6P`V+Sg-Xh&gTZ)gQEq_ipbU_xP zj-1{wf|W0Sf7OjIKm|NGhyS44Gqe0}b$b?O_Wz{YS87VxlC;2fzNyXQ+g0MtLz}}) z+sM(^6dUiY8OlM{rHmV}hrE9ri-aqdmX}}Pb=QcIhE>O)h@2M3=zWo;@PED$CG(@z zzQ5l--rUZi?h_d-=r7#fT%lv~hluB?=!J-6H1d!D>}(sH^%wOGAV@U(|T_sItnbKTpI+St2zL zLqyH&1pI(;*fT3idud++2EbOkw<1ZZFyy)cQXCW9 zfuXgb+{r)E=OQhpx$;^vc-T6%%$i!ZV7sAK-TAdC6cr}uo*JU@9reTdb!RCj47F4r zb~UEGTLu8Fn!#4$m&foCROlFxdj-G*v(f@1Dwvn3EXZJ;}vB z7!3w9?6f7leSpahdG>>f?b1%2H>~@dazoc%cZHQ?0q8J1%0bRLr;*= z1hJle+)*a+q}6?M(21jtBPQo6zsWqWFNLCe*`KTgkA*0_1h+@&dklb5S)FHq{pV4j#WZ=xB3X%4|YgPHllkO8A3$# z_YdPj0hp18Eyf@S$BV=Q*BB&x^`&LNyS0%h-3-&#B>loQCo_3xFOyi=Hx?^f{W|_o zXj^XOW9*fEubg$&@$|9f3&i}&wdA*!0O0PQbKunWv%p(GLGX3=!?i4CV(Sq zrd({RzdmHeM;_m<{A_v!_)~ATeBNgjvZ;`Ae0W$yTI}DnqMjeMpl@_ycuURBCcDmk z-{R$^JQ~MeSbuL3yu%Yth3t`1ZZZJ&%FW>RFx7| z@gPNBSgi)rfL!xT*dpyFuo$ZLz{p)zMk^7G6NH}t72`if3k`)_FD7jNQs>J}&1pSp z&3Kq;vELK=BSbe@VcamNuprCR5^q39Vk^EHkiGx8f686B_#)VmE@AGsU9GFO=doAH zKz8@tmq$3qL~NFVvRjR`$4c~h1wM8vYkAZW8mnNnqD@TMu9T9m z4me8+U|#e(r#U#5M&85Y%GKPBtSBDP6M@FBN%8|!qvNflk)@hg9T_VZe!t{q<<`JQ zsvp2o9+JzI?hY)*wkq^$CKD5L^EURhSES+YgEsl*F{$x~$rN}Aa`#0C1p4tBXw+NjPVSQhvHI5PD=(!QnwMHA z*}8_3-aWMyerr$KMlw66%q@oXAF(?&=BW(X^U2((2i@;w=4O-2)!4+e)I;m#su&k) zc@ssN2Bn&Luy^fOSqM)FmHoX>F)937w4$OOinO9HsF8Y~FM9_~TYD+K137wVwI22F z^l~4y=E$lhisPSCw=pSQ@ELwC5pgvh)sJjpa}QKe6`uOM$w|s?NyEbHbJe=;%AtSO z%0+w?hF6;(>vs*BQnc^P!5hVqk$84{AN+zeFRG$zrHXzMkb7c}3r zZJgJom#;aRG#k#DsQJa3X_pA*Ezc92VS1~3M&yn$t`3eMizlmeL*(qZ>eTdGKQ=}p>JuL_e^N@L$uAC&jB<_OjWDO=~s-9vOzuu_{ku9VmT4>x7u?xi<} z{lPXbOTyN7)7oRT?%Q!(RGj=m+|xPy#0!1jSiu2ok(0B-zEW*O7E-77ws4e99|GmV zYtF!a!+=jknbif9;H$ge%e#?DL41b&x)OO0Sy|rY{Rueeg?J@fx%uk|h;O818ye78 z%pc-b?zSW5Hv8uHG*JV80(rojY8rd(F9csQ{Gc1~XMsrm@gb0Xdw7Oxh+$U%EL&~@ zB7vT&-tvo|#T|hVgiaRx)J@V#z5`gz6;&Nd<(X_QZ&d)p!{v45%JY?*i)|AdG~|Tr1$R>^)2cCPdZ{c1o#l+!Wh|zlFY+58cJ_@ow!evk zO6{%loTV)@f*Fv`=(*As;EaSPd0>sqgZlpIe&e5?vTuJ6KfAF|Jn@PBWqoDPf^<+T zFKvG|>(YY@Q{9kuk>IcR8=hQMg~rNlVYVkRzErh9%+w}AaxsqPP9er+whsmwp4^?u zr!>%zthwx7<_!J*aDj1QtTsLEDJmpV74=LqGaNMjv0y||!=Z^((tx-F+}}UXP2f}& zu_LbjNB$umRwd?)`9uNvC^1r$QVhCP-l2HTl4dmK8|B(6Yyg>q{L~Dr&P^}*nWyWK z6UOU~$&rLLjb2-o(Te+?E3R++m_AKJ_3%WcnE)fBM&nryAgM$W9}2h?x@-tv0`=LG zf)L8M0Pvz+4n`z> zPAeGJp5dMO9RQ3i0FUln_uC~Lu@U|L@zF#dQzTku| zgcvD$Z16=Yeyp2mdzDiWi!sb@W1sv&f#U%GL9Ju`>kRdO<+5e`K4AV2F53<*shD*( zn9i%}Yy40m$$4mXkmW36p!@lu&G1Z3mXyQk$LTJ;Q$dYn-s}g>6ChyjKO&0zV&O<> zPxSm>5OYhuc>DLx@pDHZM=2psYC(|l<_(q}FMEK;zcTfiRF`wfkK{|Xi&AXos$&!b zUasK^5}nE`6OT{C)P&WHjz5Le#Ja{pTt|bRlScH?Vz-Lk$UUsmM6syv;2G!gZuE40 zLhE)=e$~LxsJ$yiR%rO+Kjiz``XJs{dTI%|^giP6R%wjVzr-Ky*ts(|$1z64uZCvT8Dx zR6kVLl-3~49u~e6>kmA$By?pQY}+mN6j1qda?&OAWra@?5^6;G*wpQE!RQ!Ir=n|; z8S=rbI&(RTlp29KggjS&v45%AXwodQr}X26XgE~C+ns@9IjFaHLZ{|T7dCbM`SNJC zj%fW>hG8Dsa+(;6qpcx8p3cKYr19f`dp@cf=*2lJ04leQ#4;Eq4FIyLNF9qh6Yzlj zAOmo&Z8ziD&!-N?QwytkMK6=12mPJ z?->OGfrPpN%5z(Z(AJ&LFLy#4s~-N653g)*9FksAtuuB7RY@I2P;?=ohN!IWrpg(+v+&Vage`nbl6w<4^gO?iCO+s5)%NT14OyJG- zl9q4J(iAe!Cl2B^H|HxaRXC&#!6YT3v6Z4nKnp^jsNRyP98VNPiBX+^ka~R#LnR^U zTQPhzQ-gmfQOFbt5yMntQ(jhuH8SRkK4un+pylY|eWo9Q2M0h&lv-q~%5`~rK0iQr zykzn(&KYx{a6Uz6DJ`cY3?R zXUt0y^7pV;!)CrJs*Ouplyl3wq!iSMf(s));;ozJnK1@UOtBk~B`N&mTTlVM%556;7`oELT3tSLKmHcM8Q6AMaDn$e zHXwhH_zjkYIoo5+q5YB-NvU`rP+C-Rfxh)yZrPgj&0I8nRATe%tl}nBMGlE#%_Yu+DEuIo29(N1mE}rB zQOYCB8N#ucq^4k3q7(W9@r&AgR{(#X4~1{=$M@V%f6bk29{VD<`-u}5;Q0#FffeZ~ zMWxsY=FXSm%@z3&H>*-XUkJS3^D6#{diIUCI{s)*?dHu^->bnVHUlYE;%avPD<=`? z8HOu41IAgfa>1!WkjJSM2>X;c|Lusm=V_Yg=3_`4bIE5-W{=G|{z%trAN6xRKg_|@ zr(KTkLrC8{d#*Ig@G$wu4o=)IJlCZvSX&?&EM+~1bl{)jvAvJ? z9o&RnQRi{D%I5S37P3oCJG_d);a9T3V{n}zw`P7%T+4vZ->cbHwkHoKNA$@YPA-Qo zOggr4RtaI*&2soHI)SZjo&VrPqHTVUT6F7F-@F_X6&Am!l3uj%>kp)4YdRJ# z{WR;Ue734Au7@*Di2z%FgG(vi2IAhWFBjicD;pXu<9x9Snt`4G=W(J$&+cAapODh_!-dcn zZ$?{+@haNc1rB6t{YQ^!Y)WS0$!rP9@zhC9%;@MXR=_DgX{Px`8WSb)Rh=K?O`U&k zrWXyJ&H4?qPAXyB+6;R&6=+!vx46RpUK*qBt%QyxI%z`yO8Kx}+ile9 zInXZ%ExX|^JoU`-uRhi+*|4#xA0l!E4;oa-aD;L@Pp??)0BIF8|9!N=);L!6N7p(0 z)R^J0GJ1Rm;!bnX;z``vNU{fl{DZ9UtG?b)x6mTSRP`3;xU2*qGD)z5=su1+5aK6a z)t??IX|-g#JJ_)1VX|cliZ4iPXL(#Noqh{^2^Kaa!2F#+A}r$o1Q&~83B;Tlvb>II z-7bI8xgZC1;-HHn(Ouha{<0PM2i_4_F`1b%y(|-+*$VT3f7h?r@&D9r zSpQA8`ByBMoS~(X({}`%?00+?!(X9T4vtO)9L)a@QCa_UT+PbL`JZ&32~7>#HE|@L zrRw9MeL~}{AtH!vk^~Ll1YF{5Ko|Crz#mGrY>R+lqqSW=UHQjFYX!!y(}n@56TdYc z7StA0He@UY)6Bx_yFpTLm3SLW#P6lCfnWT!9HHCT#=p=#GWpCBTVW;3g7?G*Vvg+00l94Zqn-^%#FLjqh0Y&(ZvJTJ$ux zN!<=C-nW9xftr!%8gSd|kvlPkYp!at7;(TrhWE!G7}uRfp>G2VDtUPSNQ4 zbgi86jHVCuafE-mFDE$A$A~mIsGRZYTgoxCO94L;b-XJwdt+!+hxkV1cDjbPB6_%j z#h&6Po5i(#zsq(hoNPv{JiDglQpNL@X@YRg{K>>jUwc5&{<2$suy6?)96B`z&JBlY~t;Vg*lOT&%uRy(-x_5GXu?>dHEQ z+uaw32WLqn9YoCnPMn37s2TmlPg=ifcKo*Fec?t^uH+qW&nXTm1IFL^bW!GqN|78n z;=+QzwR(X~deKLOPm_-vD4CIM^5M7^uqDz#3guhKc;~^gM&zN0*bULcQ}?LYr#!rj zwh7l_XJJpxWkITjX5JbE6_>W`+W?9jZ!0)r!IN~e?hsANm7{{y9-9mSJgKRiuEpND zm2#X|V?^Lb{OU~d68C}L528a04NWI1X>Mz})mr9I&$)xo6c)gyRo#LH*ST{MF5z?+ zJ6T2YMljn;$vFDiQ%`D`QMmG^Lnh}Cd<&#y7`sWHs4zBWS|ue{ViSbDKV#213jIWl zuZ#Vja_+6Hq*eLDDh+1qdXMZ|${Uty z(gL@XN|SjT-^`>@X|?L-2k)}S|AcHsloXxAOt?rklC#i1RpM2*W#g^H3+@NgwLH<6 z)cb^ov&e$MU)g^dm*5iVc@*XATwTx_EFqq9h2m$|lYuA0{%rkp0kBB|n`mcdv`q28 z1HRhulv##Nh-vs3SpiS(%1}9H28DQd-a9HYepz{jjT}o+N;V~dX=+^6^HJ`~ zR@*Bxc6u=BJ9~WaO#U)z$&RT8`1o+UOQJ&$IuC+OMmNII>o9zATjK4|`l|l5#qyZ* z^~%mnRxij%uQDj3A91muA|+5-Cnnuy8Sv94$mv3zOG`Z4THu?}SvSDJi z94$Nzt7_GJ)u1oP&NrP7I%fwm&?Wa7c%$XYods;U?981db?ANW@<$i#$ON?iWo6CP zPWNSxP7TV!_ATDU27h<_-MCggUVNZB>#cV4vj}?iW3%y(h0fe-(MH-2?5#FcmP%{Q zg@!1enPKGr$r7S?R)+tTwfW@O$}6w=L#)Y`y}mZB0L49ev~*G|;Y;9rWq$GUPi%Ri zJb=cjA)GlA%uIR?JLS^Tk}-=;gL#ofn&jLe55iqi6<2vMzzs1+=sS!8hM4t+kNcSw z>yWi92mY?VdhgdK8P0|EsALw|iWi8UcLBg~2VoF00RtA}h$FlLz!^2f=#BIcVgMwF zG++yg?Bo_#6N^Hg7TUAIPtKk=CkLAEuXYwNL=~Z9&ug|kJUg= zMd~Jk%owhi6$VnnB_C49tMh{*jhqT_U==bvvGLfSn-e~W=YF*tXO8}1)-vSHABpD< z6M`ADjd(w^W_F*Hir_Kd=N}r~gLq3{hOC5^XUvOW$>G2tCMG@z*2p!j<|A{*0~u78 zeFgiYAjS_uh1(CA)>@Q5oxpDp7SuQz0HP)2w>lMv6h~0pW15;N1(7Gn4@EO=L=mz% ziZf9Sn3f)#7Gi?3h-N_yLBOJ_pjaPbMua$Dj~`s;WQC%?#tE#j3G4Oy&KH;E|(+6)|fDNc# z(bH?36K~2)g-&_L$>95-sR%<(CKbah+|aTpp>%G}g0h*8%;OaU8svzJf8y`geNg?M>Lw%G zUm^eh8)q5|^S8?RADn3yI$ANfO|U*&dW^pMs2lWt2J>x?SjS2Uue8I$J47eK+AJ5s zUp}SKq>{{zHoxbbfxtDc@NmQ8DQ=NV^EkG=Uw7yYUk>=;y0qE%xfVg z68|{7+}{QI(LWQR8KuEm+RHLyuHT-F-R@ye{_=jK;5fQ2hRHlLn}qdRjDG)s^I2=+ z_kMNEqg7`RZKmB_Wxj;8e+GmS>hgvm?B~tLJq$bAh6(BT&M+rb+nlrr>fikL`S=GT%c3!B<7|MDNDTCdX;Ts!?>M(S5vo-f z!}_Yc@VMi`%cH{k8MH=2A_~9v&*{C+gvEQLA+)kEs3a_UWg7PMBuvVn5FbXi+RqSy zRs6d8u})>MjTK{$R&7!?lxvw(tdUhz-dc?nPsY<5+FL0sE(pEvejK+82QOk3%4Eo# z<{b-Lei1fV7>VC`Q+anf{hR_8RJ?iU)rxhewv$1MQR&f>L4g>ow4Rp>^x7_5>gRq} zMXypOq%2#)mF5LW89=k?r9p88X0b{a&T=BYEbdR7C4peR5 zk=bBhtgD@{2XfkZLszAj$2*!;e1|opQxIHbe92w4A0kJMF(1v@7kq*di4!Xr{+7YzB2G!@Yod<*hd2oR!7l9>kuoVro56DhPrLGa6Ey}3|=IuEt zafc(;0f*QH=PUSenZ_rmXqm_-lK-Ar^_S|GI-ZX%Ugy_f4rGi=Nu2KOfrQ$kBxB0f;?FcQ$116f9 zr}JvBs^rQOAnT-9Qy`@leAF?X*#e^C> zRyL0JQ-n(;wwTFQF{1FD`BI5`G8mVk2ZlAIKc@ zRS1MQ6X~;B^Qx*uvA9uw+ps4OX6p~5*veJ7C>QM9fdzK#A-8s^qehW$M^7*YR2 z6_+h+cdx2g=L0Sxp(>iYwy2&a%jx87M(82x8X<4Bw$a<3Pv*|Uj*Y`X%In>&pK!^E zRkO3zOU;;X0o_wK1Yj7k(<5L&M2-dOsLnTGeN2onbJO0pyLerDgQw;gg3ByoT*Ebr zIE8W!l+ybrjksP@BAjJ~F~A3~Gg3G3@2mDB&BG)lAXlhq{c0Y@tJD;rX&kMcqtHt{ z4<_9pO^llrsczpZt-R}S(Cu351}jLH>=FaQ4Qfk+4Qi^7pjl@Ky^+qhsEnoa4mfeQ z^6C}OBp|IGtL026rp!&x+E+hfu_xV6WjU$SJg5&YOOMSSA$X@+FkfAZcZSiZsI{KX z$oAE>W<(A=NQcbLmMD3B_mMbW`y({{n2sH)e!&o4r$e+%ew7w3>pRi(iTcR)z60AE zry=nOGQd@K5Fe#C2PU=EoiqtS-;XMGIH$9&%!_@zQw;AyC&ck$5gour1Ig|>`+-bW zS1`+(fglI8JW>XeMwk9j)7%xZdDBLM9zgv-r^Tk(AaFlIxcw?LD0mKF(*pB-E6B&3 zVFQB@I`!r0!s)5)0O4oJ+*fS=YUe}}#~wY<#o2%W06f%8j=+VMM*u2KBolnz;DC~o zl{9)eVyD0ikh%7GDLL^?sPNDHrZH^mVll@9GvKN>f15UqB#k%oteL&I?jg*EWFB5D zY|eQ+L2LYHp!h%%?}=+;R3)zE>2l=e`k4XZQ;=w~SmwI8YEtDaOG1@mP4$qV`vi<7 z!gs{&6Zny-lk1?69+FASD^$nG1c2x#Lbcw9y`@Tbte!=nk>dt~ey_r?Kn9SgzfN#T1UsS_yJ&||; z@G|;Ysb&_$)zVi;P)y}l`|`p@o;UwOJfk#+1jwCqqTi+LZS}L$po`OzHXFX6aESw!Qu`KmB0B-0PH@wxT^^;$36@Nw@kSpo{D!L5J{=v)HlOW zxdU)RDd-4jePS6QE5`#bM_hLHt+aN%T)Xc z-hevau4O$3(SV$ibGFSE@-L=ex75!5!P$zGo!uKOH-+?Lwi&f?AK7ZRZb9jNVrBIC zx~IbI&B5)DqG+N9tQ>mAOdRcId^zx1LXxbXP0+;1V+=w%X{(QB`v3sw*u{Cc!_9pR zgMhyd^t_r8S={A94dQdbDN&mw=*YXrNi};`*oZbvxy!0QX}xQXFb6a6QKsqYvf42| z=Cvg-1x!u&$+j;1ab=XCDYL&%ZZq;CeGK6*09R2d=0`RIqgd_l0O$oCn|{ekjT$S< z?-;;9kPOrVOm)aL`B(?mLr8TZSXoyHb^}SAFZZ=r_V#dNjM!`q#~u!wU?-SS0a*jrFc;w5S!F4ej`=@gV**Um$m> z%K%~0zZ|T<6Vn2ZX}XY>CxGm+jsn6Mp9NdI5LwV=m4Iv~%hj2^$AC@$RCafaRd$og zV-LfvxW5`-Hs?K=__aOYAnssJ65~9s^cR_b{MR?#L!%1s=1KbdSEeNf?E^?r89%O? z1&{2dS6<~DCCWm5@zC+Dyn%Yf@-6hk-wVAjcyhb%K$%2tgu3(xnK%h9##?;7)%Pn~c^lN1mIr|MV9c|mWv-7|ka1zm)M`21(MQ{T56&d= zrs#LiIhpF%0)_z)GF1NL%gITYmh!q79XnqFp+3=w^<{P&z4CqK!HcGEZfLWbLV4ev zpEQLC(;DoTFADv1>q%QZ;XmD*LiYM0ltKvZq3?7yiGZ`}=w)%&1xK34pxk6-WE`rO zaME7f(x){Qb9EECa-=2j(`_|%&BhFHF}`rOI&IUpjudpc<}ZFZ-M&Z89Olh4?(qn| zmV-{V?pkHdHy?%eGWra*aiU!~MTx;~M39zsU45&kl&jpDrH8PPm8ifb_2Nmw8(L1< zOUW4n0zfJ-y$hO1b5b()vHLV6o9^iv*3*D;PGO5%({rS}Ub5(7!@b&BsrQ>su}I}t zMt|#N)cr*TCX$z-f!)-W+k|WRR9SH2Tf%y7#oc_RnbBTgw89nHvtjBlhiy&u zMrFp@v@b$tj~#op#%LD)EPS)>tA2FOloMQD4s|GClTA3-c1RRLgjHgB$(1%B5BF{K zVU)4#Qx%~4w&biNk~~O+U~%o=_d zP4H>*R=G$PEnDf1gt*5EFZT0EH4>ea2Y#_+F9vtYQ49NoMW)0!Oi27DO&%5wYlyrz_3-e*$FX-WX^FRBDQeXEN^tsM+#NgXW{@9h3J z2OY?SQV=xa_;9b?&PeBmoH3fZpf*<5E`uY&k}6*lj#q83P3J;^bms(sr;}Auh248d z;i**sK~jqn$CxltfjQRv2()$s&dHs=n;Wi9HWbK06Z`quc7y zMc&Q~vC8aI3dT$Ntc$6gGF)rYGLz){D|JO0FM?lrNWK#zGRM@!0vEG(FRr z&Rtl6&f_$85QPU~%2+!(=K3cd$PJfHIjIMF1t&(tmKMWs_ug6BZKnp)q-{xA%4ED` zit0e=F@X9yaU2 z#h#y**|$umo1Hqo)qN`})~Pzo+n_r-6T@QMid*i+#ly+JMLe0Z{m6uPmfIN(TfU=p>YAkAQG^glp$ZA~6c#n(kIv%;t@-<(x+o}GUxd)ddR#%OJ zs^)w@Jwv`rD{VZJ2pB8}@CwRf57$hQmi8}j!OtDje-KaD|ECS+EDW5?|4}@_*{s8E zzyJ0b`3Yd_(FYhjOEkh9SI+(4+R2QtfB*1Qf-s%CI@d}guzDD1Zs|B?689_SLpMDC zPpW+X&;6e=eR8&5Z!TYtkDH>mKkrwqCvG2iQ^?`^Yk$aX%?^)EYV$%>7Q^Ki<;6!k z0^!5s{haT1@H3zO78QzmzMS8!kb# zf-T9>D4yD*2KIa_jB@fz+Z*O&)Xp!C$;|iT>)as+>*wbEaEG4UK^vH@$bP^2 z7u>r4{yeAm`+RZd8y?{oQfL3U%5`@7NWr7E!E|4=KcAQjgM{Vgls@ms-~dpb9%rgz z@yW^S$*x^2K?Vo}osqJdv!*upX;Wj=EKE;}`8LLgu#LE2-_RfrxjS@ugc;fe02U7$ zW8jL1jNcc|Z={a-IDLAWdV2b4On2XzvgVxez40MD&?%V1<*c->vT`ZXPT0b-UsCXr1v5HYMKTc>j)||(jMRHxbL+| z^-3E$1e0jq0?0`Sv;X0RvSHm)BQrO(0dG}?bytSo8lq-TVL*%+<>f8ye{2c-JH)>S zTbc^5pBG7xHOl|>W@lVzly;}g4o)ny?dL65C7TTu zKe&64w5+EP7@4RL`kD>ubGY%%v@<+KiKT{|D#~Jk!T(-gyjs{}h3q z{|Bbu8@P{OMv*8enCjVwrBa-5K4nF3KX0$SAqPF#;gwD1PDo-(k$zBuU0MN^eRyEZ zLsG5=-5{1ih8wtV1J@H0KlFwsC~ckV&}PfmTb+d|It*N0mxRTb(04lv{hfY7#ab9kR8Bz$b=PX+vj_jZnZt?Ix=9iTqLu? zfF_BRB&a!~ajzm9mowE6hlKzkD%ANdA}han?MzRRtwavtvkAIDLi7uE%Gud1aV`ac ze|2w{bDgGxb(Hu-YkQhk%H%LfgfM2lwm%cw^Nop3$&N{wOwUBf$G^$K=l0AswhJ=8 z8KI5qY-qG*x}ky0#ixtZ}C7%~CthJ<~%>akFH8ZX(5$jlESg>MysT9v8Ng;p`MP z5s+(`>kHOcZO?848eGTVt{#Vu69O?nq@2ks1(^X!J}W&{3&#S81UkxjiVd8$#KA{#OXLapd&`^p;rb31#<_l@&nQJ%%-cnQ6C63|_J4NyIY&tp+?!4YGm9QzELE z_fumm1&VS@7)=4Xm7U9bRB-kEYLhBdy5Wbdfb{UbS(b6D%tJEaQ%F70OyUM?*z}^i zohw^8C)UYZ_F%edgH+KBIAAu{*dN#TU^Pj`hAEi2KN}kRy&TZ1w-#Q=VGbpJbiQ}b z8-$|4VGMiE1{v`Y!-%HE3==9Hs3ws0IK;H(NYIU;*xl-2 zIuN^EYxh|e^s8JIlL#w6eSl`5XE=Zi&o;14tp@2szZr}`A7@^q`iW4p>EMWCUOCL* zP-@Q}s%VV&#EzPgs-A2e_sGE^ISdG}8>A;kneoKsn=4=uSl5{#`jIBl^(xD5bPm!) z<4x2wp(MZ(bix`;u!ou%2HIE1dBZjGgx2YUc}5h;_|-U31PD3P1$Uaqd>Hp|*LCqB zb(v^doDMXe{fC)A==Ud>eis!=>z!5MLMaq3nwKk-+-RBBiY`I%)_l=;`DdZrsHI&F z`9${#r+P>+u9rf|+*x@YqqZ}L?8>O#bylf(jJ!#CVqQL-S%siQEQ;DW6zxo4CZ}t> z%Stmb{Y~yxW`n^oZ?L*F<~$gLXMt~;05r;C`^+B12GYUOBp#N)2v9x$04KQMFU-w( zl|UUV1P1_+n-RjQ8xCZkE*WNn-{ki)_}w14>XU{)AEbJfX;>{4eY4afv%X@jjCax@ zF6XvLCcyU1HHLGWHDBCOSVkw9X@;Ks$5x4|#o2|+6x@|JUfi)QG`RJt4BEsaQOS)5 zjJ4i8OIf`wa(sbpMl)!UGmpE~NjSOIR-b9*&glW9VxWz2?8Eh!A05c^TeEtpTfHc{ zH%Ptk$v->Ny3UNw1FM3l9IeXr7b?jk_(H0=9W)d0_bH zPz9W!6r|?OY(-<9$K6JR6UW&^NwW|Vc`R~TNX&#-EG!$1k7TUCgVX37Q`t0ED`=c0 z6*8A8S2WOGvubP0lPolG(tqA%dgQhp*c%mF&U0{5-;Z@VwKmHFOvq&wds|C;)tl~f z$I4xvwWC2WX8l!*YA1smqv0@w5ng9QDQK6}sYDc!dSpiWtq7&q!|9bGkhU1|dAYE9c*Mz0{-2m>08jc zD3J|q>-|qd8NE~(TCze{6qs%-349bRnHT4Jtb=7K3Qc998R>+8!V5xoHd#FiHfKn} zjkbxHQMD|rDTT>P3PQg#B-% zL|QYgrN?!i{NtbCLtmS!$dh-P^vCpK(TrA2F|>W0XBl_5&@@dEJf}xm3%~&h?#mHS zDCw)LXPC78)>h0RY-6Ra{p0#)N?xxz!uM}YMcgHyQV~2SVgCkW`SHRzPmAed3VHL? z96o0q##$x*)h_Q53T|X4D!xd*q?#nQU>$^{+A_%=H}%Tfqm6el9^hfw4}o0i9fu`x zTb%M0|DI7GTX^tDRNtL89xP`YF z06{t>-t`W3+qg~8V2zeeBVRk8&6%%T|UnQ;~unV8fHgqy?cM7 zZ%?Wk(uYza^~r)ZpGfr?spiw@Fa?OSJd~NySB$6~OPqNF6go>|`i4MyM}cXpIm{8w z-iS6v>Z86=jG(h3x?n`3phN|_>c2WxOlhID-L=^DCS3FSQ+&`4b_UDgF7mnGmh1=9 zA^2Q5>V4F8W)G%D^SDy#5xkJ(W@2i?^JE}-4Kd+XxCFSZXOzRe)nolkEuZ)h9!{tmQ> z6JWFN>LXsvP+fOE8#(g?GeJ8y!?2J&)%1Gin0w@yzmd%`k7qw&Jr1BC{fygm;F^ux z;4bzBnO!2(;#($USJ6Ix1u}e#Wk!PB&O)uy*H4YVAR1N$XFSP9rR^R;b;%OOOTu0Yya2=D+Vup!P-*l-{M zb;&Um`zBAMi0ADQOKVsk-&A5_T3Xkom2UWqSeH|^lTc#OR>d zn;akReVEW+hXEl9ERg)kMIf`mSmg937o@Xac!$_)9~XH1A$;T! zCprnH96avc>bkb`c|L12K-RUK6aiOjuq&Y z9kpEwaL~-)BgP{W6!jJo3Y@LD5TUGA7c4**w`H9y?Km}y!@c<7d&$gohS*u?R!H1D z%>N|g_UDRfpf5G0IYRgNmT2Nxrv0w6Kz~&Ygiab6&`%|Ku`?agNv46_L_5<&mcyr3 zy2}lQ1Qa@NJKgDsGwpp;QdydTgCM(w^B2j)Q!ElsmXze;*4%Mn2K926b$iED4nGbd zD4V?sAHT-d*tV3@j00SNgB%pG_i+SsMZ$ z0v3iQQubs4&kcYzI#~pxOJDj+dM=`L6dT6@%c|4c({bD&x{E>Zf(SPwMll5X-Awy_d3y?! zTqV+-IYp|tN9noh*z47&JHP+OJaVeD2KTCu^MSAP9NZJ-hcH0jVUy8=Y))vyF&PnJC`%u1AJps+^dmTr@ zNfgv+{hlJlx4~D7LsT9jRJd{TIEzt^`joQAxcZ3eu)LR!=DTo?${DJzON_!|Jo6r zANer?x&2?$7Xp#ZX%oKD_^FCe)ZN}l{a8YRy*2{_wKPV-rBj}|qTKgS=Z16LM4*hF zkQEsICbr(;ZNiWzS(7qtZv}h<6>f#)ekrx=3ou#oOI>aBg9CZw|3bVT(Eb$vQu7~{ zI;{4Gche7VhpXec9T*OiTL=b%*>S=CS{3%PG>b4V;O_eWsBOC<;3TMD?gw>a}@OGiOtE`g#^E7h# z4qXKKAaFRTB*_7fw4yDlYHGa}AvYKc zYGmvEInxYuWtU{2?gTQP-YL3FuFvX_X;YaqHhLiTBZk$>?n|_2_|~m03d$FR32$U_ z$USOi%|faJmoydT`2yBT050p85GRoIR61GO`%9 z2r_Khh9L(aXM~Y~y`;m!Zct(dL$0@T*2x|Pp%3WPTYbH)%|727HV~7@@(*pKEXGuM zSNM0|f&?8=N3%Mi}(iXpLQXN@CY$JISacN(;@Q<@X zwy;4M1G8YxRWNr(AiCrwO--r4D7nuI_T7-7RKMJv3}caO#-cp`F#2yuKYlm>c>vkZ zf_-qyH2C4y$M5%zuM5-7IqCIEdRimP4-VTbfxU5v5E>)`|41pDP|s-|B3EE@1t84PxAP1X-A!_AXXTxSp5-0JlVcAEBiRXmZ13HMl#p1oquNb7v4PO;Fj?R(;`OLNo-0otxoaDoAyI_?C(rNawBa zx!D%aqP!->*DL!lFDS_i>c32Qy#+>`_aiiAMf@P&znX*7EWm2zvRb0ec~_!jt-XYYAP<`c%65_F;J)bzHJBrMK?JsiXnJ!K2EazJc(*fB zfWS769eC;zf)JTJ>x}W-9GJ&HtAyR5X1D$2AMH#NMAJjb_*tnxAL+Ul&d=n_FrIMB zT+n4HQs0yOi;5Jhu0Vb}5n6sRG-ePAG`gY*0zU$*o}Jt>3Es^pUg-%GAJ20zOQ3Ih zNxkIg6Q@AbvY>jSth73-D00k96S8@1K)Hs*)T&JN?`^AB_uPibj@{tU7DYDVx+k;t zMlpi|@ZlV=#iV|S}AFF%l#VRWR?ixR1 zAVCE;Ct_Z?6?4Z`PE6}Ea>NB|BQg=L0fYOb294#01E6{394tCA zl@1TZ*zBFu3lu1e{)8yO(=25vn3EY_?U@W+vD$=fmWrQlDEHp(5f8Uo4Q1vEx*BrY zG`^vd$Y=a-AD!k3EM#f4;gh=24}Bt~>i4RMIv! zzq&*($_qY+F+7hT@s}V{0uV9)!KgHYD6Z)O4y3dHywmTNaz9<+0(mJtnYsq`mK^0IWADIsR!r<4!1eQ=Mo`OCUF{rB#TE+#JindRpaegzl=p6rqFTEJo zh;i9NDy#k6Z*`fR3xl}Spev7H-Ge-b=1h=sYE!qE{h=1!)>I`ZA3GR0qdj_`D)NDi zE|6cIN-v#RM0%AnINz-F0_p1->c_$-&(Y0St7W!tE+AbN32;qDVUWsRMGEC7@2||L&M*@FTL|b>auuXl zKGkLV?*XY@kiNpZ^V^VP>Ra*tg*KfYaEh6=9r?x+0^s%&OFMoVX`e+nJuJxarGk;K z;%Pm@ANvESSfTUDCPZk`pPL#^mJP9_^?~n-{33*KCf}dNB$+XO1c65)M4|bnU0~7i zzTLLg&E#-2lW8q`&rNBEr=G||V*z6!Gjib9EGqf0g50#wc?Si#Wpm7{QVj)f@}7U? zHcwIEHV^~Gtlo2Qv**?+;ZqGJM#M184wb{^L+1oTOT0zFBCFgH`3#uMqASoy&V!V# zPq&mbb8r%eEy%aladHet0>OG5)QX?xGLY>&DI9OSAH-yzrO53Cs2Npuo{nP8VC0=1 zMtvV#EbiYs+@QprA;8nKFc#kt;_hMK&=x?l#rRxT{F>v#OKdGn%7a{JGYdQ5|LNUF6L zn%45@=vpOPK*J<%*Ti&!rAVPa$6Ql zfOmBQem;jZ)W%R4Xva|yoFgbo=<;K0cpUGu#??K7FE%tA0@B;p@^o>T4+={kEfilQ z!Py6ZJA@3(Sc>bv_nAU@Jh4u4^eQfng*sj`$^QQN#2ekUQa$fxg&@W$U^qJHg<+dOp*??x`uH5(d4QEvhgPMS$S{U0*Eri zGz4SA>x7LM!21KVyS`>YYN$n-Xn6{DwV6EBCe-SzJ&I9sEgqH2kL=-deAtOFA)Gao zR_x3HpScXa)S6oCyl@K^*CwQ$ImDkC?Hyj&ZZ?QG{K7v5Tyn#0N07JKS zB$>5}cXxikZy2R2J*8LUMpJg$4}jQ+WB$0=A4ZSL-HOhBall^~Uv=Dq6345SoMu#r z#f&D)rk)SsXKOAfh37AXc7!))BuMpaQ=ey(s;Go9+}{`K$E{Kj4aEfBle)_39`Nq0 zG1@bvU17l3ORh9%wm?m_)?~r^w}_^&wDNaH|R% zgsLLj5`51qg%x~(0##0hBXfa5nnkTUkf>~lF^gGYUd?#}xI+Q^{N16@9zeO=0%dFL zfZ;&d1!O8UP`E)F$4)e~5cANL9^G4vBj>-f+D&}7n(&!raj$5Eu%3fzgDJf2n?PEm zl7wBFju8?KLaWQYl_l6)+?);OOFWrZ*Z3@5b7Pto_(*jFUE4rS_9t2a)*4R%gplN_ zW0VTAmb!3Uu0>ZPb5%X`>fPB&#xZ4yEIgkbff(?kFDKRXV2`h(Y@PT3q;13lC&P2% znjB=&ch`{A;P_qTe@8Glg7E7y+6h)EyrRsxr)usB5@h~hv$rqD`B4bYBDFk{TH7_Z zg^34n)8L~=$In;E`Bo~j;4ECs>Q%^eTu-e-la*~_3i%HS6vz5+ll-hLs#(?hY%{i1_vvjtsvpQcnO?QqfRX_I=2Z)%t zUvEbwu6}J_5%X~40rtu3~%T-LsmDcPZHI5^RsEWO-K-;ySAR<7*S4|AV8|RaggDEM zH+TZT1|0h+eV;J3!v;zoK>75c+wkSM!({m`sC|Cm7p7s?{?SBiMHj^ErXuwvIAa)G zzhsaM^xoTFvYlbvK8&;n*)?=MWY?P1ZgA=993$v)T<|9C*^hBnk52t#>EsVgI$d=ZS6p>%o@@;UiFH zSb~J6!G8)OFcw%E*2!f)^Nt_Q)MjBSH#kaN!MHF-Yr3FiN0YqbWQ?bLLvSXC_eWX+ z$fpqJIv?VUdBGstQR1Q}2|S~&&h>ZU+GM;YYwHs(w<}jOV9!Qm*Zj=DJh5&r8B|2Tch z_&N*MZ2Is81~t^%Yz^c#^>)FWF`kON;SWb< zXAOUU!0-h@DN9RKs5X~XnRF_o$WVPE?iurrdE~+zW>PU=jrwFem`kO z|F?5Se%H?%=?;`XGP!XY%++a@p>i+#w!ELunU3~U%h?X(i{tGx>38L0SThTN6$Rhw z&+Z5Dm&aS+#=$AP|L05kT1lRj62@!^LNS}LZ=}m$^!*E_8z} zf$CI4u73j4l}stFcU0_He;@!KI{#4fo5UA}|CxCWl>GPV`FZ=|BK^M~CXV=R9YM%C zn~Zq`^MOBx{{BdzW@X%8-al-Kw;733j{5y;S5=xK}9`MkMV2mhW z1=TR>scy6bZGkGZ#5f954a})-SCni&RtZNLW33VgLEWH|0#JrZU9A#9%ibi3psbT^ zaW;`>NWW@SziBACPZ5IMV0DGkm?x|*f_(hQV)}%Ik`^o=IH^JkmZl|3&d!=?gB$?a zuDGhGHi&@%Rf(cU`zCU9r8uR1bJZmbH<;~dQ0WqXQqYa{9(GGN0bK9#YoKghBKm>S z6A8=v-#$#u3Xt67w_geS?$*LvW^^Wp0(P6m10{2MVIB&aIw78O(@0`*&m7;h z{pc3VQdkZ*3`2sTdJw*>RmIg__}Z%q4MuQ6^o|QfoDbkA3)xrhFmCy2tL_er)tF9J^P-#H>@icW560~jL6&LAD=XYau%ybwUW83q;gSR-9FeG&z?tWiUlxKv_ zjwk~D^5~hvZ@}x2w*c-3R%PjFE>~n#7AUhSYt~zp2^CqHZKy2A$o3<~erJq`pIuH` znwe@q>uU6x-^qS>$=ek7#eMmZ!SKQ>YiXVsh@Xok?g_p0E^RbZ*!FpK5M;aPp1CB? zhMFYLwoH)4LVv@KbB)pPfzY+U4Z!^4<=5;Chf;F4)3m+Fi^dP><{^J_3qiyuFqzG^ z1;!!-@$>-@iZrX@ppczr2Czon-6NusrC0$aN)n-9J<+Os-wU%i^At0O`YohM2>Ja@ ze;=dF6dT}Df)beg*URX`Ac1KX!;;#MldL1jUt@U|6o8A6KQx!v4KkhK+DgHcZlcHa zhCS6|Hk8%!Xx7yVuo)ZD5W}EOTa7EY5ZNiUSPxPZ$EgFXK%iT>`2~-6M2`ws#c&!# zrB>x$lY_yQg1<{iyC0=!VMBf%As?)ad!Wi%bN70?%4RT z2RM9S&r&Dr_xLQ0v%v3No!1H&z!ZC4?;lM6gY5U?B*g$sfn4p!Z>d4YmvgZ37GJKf zg~b=}W=cCX+$lvwpTkgwpsHMNM;^%5PW#A!7r-c^-T0RW0(LNF^VAWLypM^jeKW=9 zTd8(CkJCUvSf8l^m*IWot)oP}YJD9B!rC?{Z?EB2lC{VqUlItMn*n4x`x<+n-qe(C zZoKszK`;o1OniH_^s}xNHs$+q!$hJq^Tf%CsqSVv88{8DV}|f{&mP560StwB&tj+z1z`%|OfNz< zX|dyHa&Zmc($)QAzCvA!e-a==PyO#MHIB+-H+YWT_8ZVpa+k8`c5DC;X z#%aBOX&^*h+n$W*IM=FZ&SgDRjSTc9Qm7*xj_Ieg;UYXbj<;j;;I*(e^=J5`gM&}3 zw`Zk`Da3RJjafU^9&*cXUh3k*?13zFW_L@!cSMOV?-N77&ac6E`(mkA9}}rZMg23Z zfzs)Mqp)7_D!-h~*2n48h2%V7`hcnm6gv3{xE269G6ww#LQ%3l;04@L^FH961YMAV z$UrY96~IJrT8@3)*iVGWGt<~Qv6-*60&IaRwZ#5`=V7>&EywbV4(mr@ou?12#AOuN z*Ev16fVa2$X_md+dMFX>rc-F=t7p>-%&xOT+vh?$Pa8!!*4_bIy5=#kJ{a8+ zLFPOhAccBR#Mj0UU+(>e`9vflDXaI3RcR zs{-AgH-Sz@<;JE(Q$?(NY2{{F{myT43t7xrA6IbJJPl4iM`qWA6~bpnxinsk0J)@X zYkbh1+*;Ux%=eF(4NoxLn-CiRz5-ViSc)m63TxOTj==Ea}MJRIpMxDF3a~9OpS-MI~poAQTG*G902vJy7a0T5g3Ie3DhS_jP09 zA)NP%WMxH-v4-yYVZGd`ZRJBFuEYCcTY6LzvAc3)o~SH&+KzEULtU&&38Z{%h{jKp z7C&0hj?i(UbUH61K>}TXt4ajV=BoZ(B9=Dm;19X%c|T?aurx@I=Kp(gUG z0L(>;h@Nl25|QaXMVOi|mWwS_nLD$rlOHXA3NXbWWoXl;N-wJTxR(3C+cin;g_WG_ zK}Zj%Z5>MJG~($3<;zJ;vmL^1Gkz#P5~GOBaP=qIBeXstFGt8*7P-9V@me@vS+~rl)ylx6%wbLE6nII9ueUNpDqBjgZ7{W zIZeO7U9we{^)k{1zK7<|hZLrN%Pbf?1HKYd6uL6#>bOkM4I(HEukekIin+X}NT*2B zkM)kcw?@s78Afr=xFLTfg;Z8;K$_WY;Tq_!rN}CSja97k&*+`8FcApPTtgA zq1FfccDzxc95vm{g9}Ss1c_)%6`PsJLcl$wF+WK@37MA>64v!r{;Uh-~g^LR>g$X72Ry%2s4_GB#a7hXSAWZ9X0h|88 zfPx!V^qP54W=t3OmpTx_+FhU}Iof%8sW=KYm(NIc>zn>`g}0s#g)ic22`3HyXL4>107#8 z*sDmDNBc`vdaj#W=cfLd+V6>zUZ${B3s^!%n=6N@0$>7q8c?`^B!jkXH6`R00CaKE zqBderJzHca)SJ4YKr?7R`yg3+(V-O%47xrNb*KiedXH{APrYk6_cIv0%k@teZ4Dh7 z0G=<$e`u6UH;cKG`Ad!TI^)jpI`auEA=l@99WKfb8VF`A7~mytyNxHVn~yq8iFnBN zH6JO6qs2>Kx96XA%j7_lhs^L8T?K+MDdS7lZKV(6)SKrP?ljrGL>6iu7|rE)qpI0l ze2v~3BEEgYs=6&qvb9MDdw26#x*fKdo3d3(diO( zk|@Errwow4^X#wp!Gwip&s~&n2azK3M(DPS@Tl>p96qSNbN{r>;7K!kml)F3#iu2V zR#;HhjZ|VHnX+92zXnbu9Hu7IRy3tqIYcW0m0)GERGHAOq)aV-6{2+PTI=d z#jUwWJT#&AG(39loxZ;@nKtouV~fBBPW~m5(16dsV>QLleM(h-D>c+RU&oSr?hI_1 z5a~!Fm(+J3nk%zHDdR(~%aewBx*rGIj6YQ)|JsP=5sWk0`rv=^Tj-ks-;%HD zkZLd0>CS&5-jS!0j&a(yq6s7Wo3ZWHZUD(qp~;jZwj!6$Czs4b{88>c9GN+_7$Osc zUZ?3>_5|sSg9;mC@c??=u;Hu*CvK~s%=2_1kh9TM5)UTW`KW6_y9~Y^N>*#QAHEZ^ z^0Wuv2`-BcdLwirxF|Z&9Q|70nz*XO{kC)MgP29qISYi*WNrFG#sb|y*=nd2t?u(} ze}`yg;%sZn;~`FsJl@-SFM)r`f=^e6D>XjTDonUO7d})dz9w*Ce?ElW0rEyWd-7vG zT>&r+NTt4Cb}T(l1k+x_-tUjHxb`K-;>eC=X@0rS9C|+&@>qYC2tjw(go#hMcCc)r zR-XZu1k!D0EyrSwC1Fb%4cH~W_9an-d)XeWprE8NLlMfl*pqj#h;KJ282HySD8-8< zjmoT$AFy+m0aJE&oGdL9;7Sw!U&T6K1T6pOP+S^QL1BKEV(3oi$$E?z>3n5wjRv90 zH00bG)2&2FPI#b9A2JBf`7PniZkRXuzAxT&AadFJ2nTR5V}ApjJz^kRFPa1Li4K;)JZx(u`vf zE+EW+rpBDIV}Uye$f$8@C=RSyo^<+cutYms3|I%JO>1!rLfb~W_u${_C^DV1DaUA^439)N;;$~SL&z20zjw>?!v0R{K?$N_XgX6qTBKU)tk8L5Ywq&qRi z$7M%Tgi>~yx%kMS?qe>uk6pa-n8om(+m!V!6WvVA6q3jkX?i0!^@g7;SC3dWytsC+ z1|s_cJ=n7rJKPwK!mH$A_UpNl&94dLADSfuxohV?aUGhkuoiP6P)qb_aTPc5(ibt% z1EP%4if3LpONP_jF`oWT#(CY_8Kb^pvuxdmwDwZ!mazapeoyofzU0V~@ z*u+*prdlbr$1awM=YPm^K6rJC6y(0S$+OXB(YOuiUhB>2!67)Uh~P3?OuNe;|TJH>r955)Nfov5sR6WCExTzuuK|-C2dxM zu^Q(h-ffoK$~Tk7z4;1%*zNfOI4MA_PA`v!PPl(5YqN}nv=rsS1uPJnM_pWBGMJ!K z6vYObx_1&84sv#HvIR4Y(eYe?O40^ky=e9gUh(W!E|lXD=NsVdcpRD@uQD0#fc7QH zGM>BcneiqF=LfB&2g`>+VIP6*)L3OBmU3z?Ffh)6HD_7^YA&?I)Lm(Y@>J(*GaE1Y zc<4JTG&k|kv*idctsM$guN?tUA545MAZ-W2`}^2;f|9dFJ)cB;6qW)wN&X0YIE8=2 z4PNpo7_=p)YM!j`fvV*(kY8YDZm>5ZsK-Cq_oCty?Y3eZO0CGe4q|=>`79?QNo9)? z&aU#-*H{u4QCykNRs6Gzj3u6R_wq4o?A0G;M#-f?{+_mY{G9=PG69E;Ar;-!ldH;_ zkqcfwdiLY0TQw;;*0Pof(W#%1m};#vFENabM+O_*5Ms?ZnXiEhTAgnn_nmHx3&+MU zYaMQRp)=lVb)@OKp92+0o8_2m)ppTlt8tyP`g8byrWQ4c+q( z#n;y5!maqMU`b9+`!v*=$!R4AXGX`Phr-6&oppGNid^MT+^6mMJ8pOH%)>w$fN-os z3j{@n+pHp|7ilWTL~G0EK{{Uxx<>b3dnKXOzr8XkuJ@l`Ef&CMdY`J1z5b*%!w9wk zFd{Tm_k^%i#ZI$&(!*$cZNNgNHG++HqI$?y!P!9B8LZh(U~DMyvJ#r`gRc&1Gs>5DS}|z8T&h6y!kZH z5}iSWDuB-RLTg4oBOPe*ztNbK>&womr9S95vo=zwQ&0;B;CNx!n={3GfI!p*iv5Ag7xD@BW(>B@6&Ewkp*BR-C`>H1s;WQQh-11Tb6b+ik6 zp<>42Nz>c)8kchU{Hs>cV`8qDxibt$Hlai?GOFv-0YrUdQpW55mWrAFJI(li z!f|3_{TDg?A309a$t3J{eXsQu{0W^t{6t)2Tgq9AfAVNF+hcic#tGjG96hdsfBOKF z41%U>YHF^k6uY_E-BfgG$lfFlhyj51^!?u7^^ebAe?5`PcjXVB4i``L^L`$d$CYu4 zm1lGO-mfL&ga+*oNaR;y=`NCA-BhsrzT7@Gn-R1i4Ozb)g)*3Zq8`p4b|1p!{eO?^ zC02C`s7Vo08p&&n2%j+dfWIE|!ECRcDN~=Z*-D&@TOISUP>V-@bN^V>M7|*wF8_uN z(*4{$#>=)B;TGq{stc);xX2!O7~AOyC66AFO{p*mNp;Ty2gW4?&TcTr4sGyADy0sX_bk@=CrLr5d*W3<$AG*%#$Vl`a*hYMn*;&=$TRb5fOz{_KUeO1A=DIa~w# z0TMk?_>GKB3BR$bn(tOp@jT;~m+#8S^W#3g2fSaMz(`pX4o{2aKt>P$hG`6*{V&F@ zDLA*F%f`MjZ|ob}xUp>;H@0otwr$&X^2N68WHSH5%*#AX)#nYIR!b+ro>e+{_}wdS038MQ47m+= zS$WL1<*04n$A)ko<;Wa|am zKwBP70+72xDc%01$OXB&>q&LNQ&A4jrLX=QR7Ervf`I?62#$$7*=^ESo%jZlO%_(9 zL`k04G##2IR4lcW=z_RvR(fr^m%1w1creN+=M$g-si>i2Tz8ep-K-=;D9Q zwp@tkTlCK)hznH()XLXtjpY&63dC_%&k+t@f?S6jd!K#`-^h2!7ygM? zMb{zZq*zD?^NL`a8ldr`=6tqr^)J(gQ1!Mq!G?#hdDq4r;L%GJGnLr?I9}b8OpcD_jWv+i(1R;*If)9oD@w(X?iIw7$3%$$y&WE;yx5 z=v!iq66j(tO8UrFQ~gQ;*6l9qhWvq2{8$zzD)QLqW)S0I>#`EPvNF@Dv?2wbWlB%Qq7OfVE&)KCl* za(U=u5=sm9Fc@+f$^#~1d4w%c+OC1sPA=LqL|=~PJ%zH(x=PM%*bLsWV^Y_%^i62l zKv3-4GBJKyzJg_CI5K{=r`m)O4{1*ncjjpqB_~H?69YdEO(n+xA+e#Pa~hCL2WusI zJ+c(!ICr5tj&JRDulK&CL%(wQ0aR!o~KmY~LO?GC7ELvBe#LUkirk)HL+VH! z@aVd>+=NeieY*EU1=@GCJE^CM%N~6Bx73++n!z)&^&t6Pg4_*^=yrqlKTTXu9;x)3 zO)jgBl`6k5!NDMcK~$wimSbw0oc5V<&l31qk_wou9?O}t3U90fH3TL5_$9p^m$@-> zFG69ZkOg1m|6!fC!y1Cjzae^su>8yAv{bB51_n=6wh_wAW^za6-Q(9O*6dMi5DOj0 z#9m@N6Dx|$s{Bbn$Z;Oo!Xk#von{o8{zJm#w*n(7-yHjGN~R1$t3JJ2?dFZ8c7{m{ z49jrc+vLxlWIO&>B=t(g6E;M`^k#qMRIeEoP{$Iq4JT7<$$A-W+L)f<%HRJg+A0W zBk_mir!dC&K`9xT%l4RjRWM~{nrXg;#!lBI2)%vO`8!yNYEDmU%u+IqgB+PIZrj?q z!*y2)f0)Y&@Zq`j2O~6f7%6wwVKH0D3C@Z=zBH@N@Z;}vSCg&C*LC6Bf^2L-?Xjm5 z%Gm>5kD0Lz;t>@^E%>lg_k^-lGiGTeh0;W{Fk$~eBHG5LMy|QZ&RUjbe15H)<1}a~ zRv@X9w`gWv1n$JJ9+Zaj(E;;6&)NYC94kwL9$2%jU_4K=z6>D%`%sz?!2F-(6Dv?2 zoY0}_f6GPgAwUQ!RUINO610Kfpr8R%=#pxreXZV&Ebw~rITQI&(0oh81YtRSe$-_<}%Z0)K|lxnrOxs|g8F7^;|L+nbx^%jZk8hxhTV z)$XPr!?lD~#A5BUufmp7dRZ@>7QdCiTRGzfc57NWHRd>DQAQ3*=$NX;5E#Ro z>#hKU_D^G4YA7C&Q(Z{snml=1Y}pm#R`8aUcqymBq9Ez{F4h55Sfiv_9Z}^tmRDF= zbjBlj2Ns`L5fEMxU;rrxIYa4E)B;Sqe?S#5`=rQH#1km zVxPO{4+b1EAp2s8MXD`IWt=46Iae>SvETBE$~*m8Eb_K_4=>ysB}}U7^%clbsh@fu zpe<|X&=f+di_#y4Y^!KUm%}HD)Z(8*%(3ZHGU=)JRAWNa?Cz;Y^{m#I|y z?E_gRxwXQ*#bXwxg1iXTf`nV@JYkl27%wNF_$28K;Q4!HW_CF#q446S2j>M&O)tY7 z=nX|0WSY!Vu0#|*i^eq&Zu3b{XOg5sbZ>!_M8vk^dex+sdC?Jx4-wc@I4sSyA?8EE z{7y>M4177r?sN>ao_rPnVi^_q`8E?(W7Tn^-ESfP6s$j%l4;kJygT96hVH!n?#n+= z5cSpV*V2R(*}1grRF$|y&sDVyWSA@3pUp{j|BB@75xCiXU%S4pB{SjlRlv&jcP*%~T+1fR z9Bv!QBwv3uUGJ}D14~-&x}|hmuA=8p4*sQBp!mgPP3v~3csuNKCv_-94Iv*dz)6!Z zxcu3(ZN_^RY2AWv^uiOgJ=dD{(Gu0lSHOa4sv8eYQ%)r!fkY8?<331}*^w`A43`{p z1bTRcyDxX0F%~IPe%*Q^cbqLt&vEAJXDovbb6*Eai~KJumk85&y}rESa`W8Gl9|-t zC3#^$y#L+|>i4o51Cwxlh{V;P$g~MnNi}Wsw4Wnt_sna!iwxsopBTn(*q|0N)^R~v zz61eVL%FS>GSn2VPLTb8G#G|GkU?20^1G(MHQ9sGSj|7?`j^OavKHOWyHlg$Bc5B7 z3`tTa>#~NxynHOHP$o)Vz*B!371O}!X7`ZtG309kkILPH334#XJ*%QM;@ajEVIta^ zR~{eY*;S6t^P5$HjP#)D;jz}uZ8w(z#L z20`k3H?$^MT%)wCnLdYW2HDk&YBH*4Yfg=GE%sFOIu$>F@6Hp_2TiXJ6>Mp7_OOhk z&IzeOZbi=HCZ7&4er8iIcvz1!pf_7`BT&M*(rj8*Z#A4-PdLijUPrM9{pUaXii*FO zm0*Htm{-oJU1}mR)$br4m z%KFxZ#5zH#UyF?1weaQk87)p*2Jw||?GCdtRQSBqXCAKXM60=^x<13KVO{SQy-@vY zAxzZc(9q;!a;M4o%ng>hnH5jQE~|5vezOE=1sKQKx2$#>0bQzyo+RTGe8D%=@U|u#y4CNI@>yGq<7v0K$>$o`HBh48!v$6>sP~qtLP67yInVz| zMxS@avtosu`WEuM1skjGqSx8skMcWF0m*QCpR2@db~$?MO|{5u7G22@Ll>>hlPju2 zWZwcc?66zUGt5)}lHxNd-AbYvY~RALHs%qR>O(Z|#>MeCY39BZ^mV{uItE#sQ-HFB z&jq2zXKKA|WN)^2O{JSiSx`V(4NU7S71c$*&Y?DU#1! zxmZkr$_87U>#B?7sVDxO8XB-K>3Hj6Vz0rf5S2Q4?o1nl zJZ>oq)aJQvKta)_I(586o|~$B_9kILT@%>2U*xwy%}h$MZ0!bvI+`I;>J7C-G~j)~?`=;=kYSb5A144&P?H9vMu4lN1nqvKRC+yOJF_pr^ zCf2`i)U9K*_DW{nBeZt7Zxu`D@?&cinz3bib+c&76>YR#+7u`0#F% zhv!tU1f{N!(m2dpI4v=h^T8~PtE=j5(<8^^fom?ORh|4s+@?^3jJEX-Ui|Lxg4r`= zvIW(-(PiBtkkKZ0pZbwBl;*47VkO!2;yepFZ}hzb6_7e|EJKeJa;1f#Htc4h5e0Kw zY#g+5EYN+ms2F%P2lme6w(_uQ{t+6(GM485arHXhMYk@o)CXQu`@!sA*mR!Yq|AKJ zkOtLMBPT`fGvRDml#^-or0xvK-{V=;K`oHO8>+s-`HPpP19jZy+uEXNq`;xt{Ae~Y zwV%Y6-}}LrRAFtiODaNnXSlFeuDP5r%1Di;J;7K!sWnHBnau)h&|N)U0ddrIvYfT9WyS179u zRDlc%i)5hQ7B&J|o(f*CV824mz_$DJUi6KV{X#D`w-ttp&Ykf}*^z3xDQRwsM(c5X zUAo=)hpH(BItmHl6rXTy9WeoGbCzw8PqWw=ST_C~^-9Sr;!Ee^C!$G*G3=G&jhb$t z2JZa>op42x%Y9{sA9Z)Qu}Y_CV)aE{TN26bIZ9G}?5NYLS*>6d3ZCEi`wy8xT`Ivp zxT5|h-`^q_a2yeN`aPe8YVd4%wd!y`!Yd62Hx(VZduQ{Djvac(k@c$RDrJdHjWHiU6r@6wtb( zCfh@;F4F_)e8=w_nGQ0$D>-!+8boyv8JJZU*YRP*8t94!RG6Xs)pKazpTxx8Vrh({ zYRK44f$kt8(anI07DW>mt=A9>98FhO3q5K!9$B$YgmE+Gz($N;r$EU@)@d@6YYlph zV)oU>nJinSW&M4bsdr3(LGwuZT9J5)RFha-i=Tdam3a}>Hwf3v>5tR;UBY>|9UoPz z4mMSkIGL31ncbPvmYU9(nx1+EoISQS9EqN{kv~)V*Qi<0pM|pxqkMjrqId_aTVlMI! z&27{w82mmv(miaU2i1l4uhe~{{=KL*duKX9ckkSf;R*caGzK3odo7Sm)jlr1Rnm?J zCl_VwOnF5@=b&ZYwE=UUsYVEj9iajtIi7#!YJmI@s05)}&)*h^m=-H6Vf(KAuw3a{ z-Q9=xFnUJ@H{r!yFVYJq&A-*J zd9<%w;j~@;tDbqx7P9HF)~T1jEv>(tH|;_{1FJ!277A0ZvJ37k#wrX`6}H*QXiE2A z$1-Uvyw97-RZI!baL9emv~~2P$0p|K9IfdLwQR2w6EaX~Lg%y)R6iul+4D(eGNkrL)iD)-O{A z*gj!+@gtf(;~8X|7Y}vSe+$d#%Qqy&`wv~puiH>8Nj7J0)N8ddf#rmxO)y`Ww5CAM zUhWs{lW(5T5IC(af|@*rDMrFu^Tv}l6#+*etWj^;gC-$VNdovsdgtrn)zJB*gUw%c6( z7_MwCGY+bTf68YmvwiOcc&VF||1(OIe2sYLpKhdYGX|CCL04t4v*)HlhGt?3YdmGc zmV78snzAZq((L*HLdkN?CkG^yzXQ7+yo4ibwsS=wK5|*Z#rLqY1dHzPH zy#M=H1AG&LwO^zarGg{XB5In9rrDks>u=grB@$2>iy-l=e;yeM!mYLz{h|_3 zi-D5Dle7x9G`N~GInGBssinC9YxFGTZ-AjpZWNgOFP}RmnxJn`J+0Wr|05&B@c)*{ zrT^c25CH*q?nuXp?TkkgEV($0*`!68eeejwpActq(57T zXqHJDjp0iC@<>%0s1{v9nib0$P0Q{@v4hR1bjsxP9&`=R$bN{(g3ZVhcM??g_BAp+SD4kEAR1bmCpHwHdhB(!u6J)ZQf}^2xYCb+zf*wNh>ZFW zS2?O7us=tK7(2Y-*VOjmo8VUBV(ZKRe7Ewvwl$yc;E)_bBLh+{n+KbJakP2Y$nh2f zZEFWMaKYqJl_RfU0$L540)5GQ5!abQV&E_0x=8%)+MeN~fujirIeY>kyz?#MQK@{P z{}@tBiNf+1g&E(z`FPKfps`@53oDE1`IPdXo~gt&;%irC|75C32O@;Uo&4Q_hDF)~ z6%WLWfNsDRFCS3$(=8dCtdSH!;}YMoG@=?q>%Z@Z-c{U%X!k-&XX+5X`YLEfN{s|%H9(85si_oC^RoqZkKKseQR@+I{Q%*>LT)@ z8JTc)tLv2L7U`B@_+vsUBCaArA!FQLFQ#72OsQ|2P_Nvk&?eF*-lp89*(U2I=BD8$ z{JQoAdY-gwQMICOQ~L#QFL^Xw_Naucde+RTT)!8F9QptwVENBxlKM#)3PUBSaI+f_2uFxRl!u-UNS5OG|4 z+{BO_nHiad)ndAlbX%)>m)@y!4RS4D)8j05CdqaI!?~!^1!=z zwUF&WUv_W$`s)7jj>b>AK+!>K52OpM3DmKRWEZ7IpBOaUi`b*u!yk%ahY{6p0L$Ckp4ug^R; zSG!GMwOY#y9)`Ec8Wg5__fPBU8_Kyh4tPidC9YHSgr7ebE&_WrJDv;oq3hhO=12|>J_oOJrnBcE$ux7xS>`o$ zM6O?t=SeN3*e^SrJo+t0AfndgYB)L=E z%Xyr#o3d4M^(u}va(7r~u7_RcTTC)@>bMMbhmmS_lsg%=q;hjn|EQfkf`YfW<3qsc z0Kv5X&`b06rBicI0sr~;(Db_ImEwTf>IbslCl9#^>4LK{B~S2>_^h?!AUczm9pmBN zgl>f^cf%sc{~h*q{FZa_E&N^Z`S;qV^*irt;Pd$j|D>nnyZVdk-Dl0mU8ti#nk1!eZ(o|a{5H219!8a zL)5v%sl>U&k=%vciQI9-Wxc&>vu-ol+M%UP^9;RX+SzOKQF-N9JIBdu_OYW{wO!}x zO?o9lTh&o}YiW6DeraO~puDZTqP&iFQhr8xmcE3xVtg5X8Gc&tIF|L9)s>~|l70G- ze_u7d!kKgJ*?w<(9FXAUi) z(%t2;`s`7h%Id0>ZBHlKgZC<|mBucL!Hc1b!PF3}%i!ZX=X=D*;AQ0Brx2p66<-SC zDc#fV+C63keK!mzaQp8?@Hf;4#aWD8rd$txUB7OKO@uSy?cM$t0+9y`1KuMWy-ZNb z!4Ia$q1+%&ggUr~z-dXL8FF4&jbH9a56GqHfxL1?+{^x7P;WqsFmF%~s)vA1O4Q~fT2Pp8@<}|_>l8FFR%ZG6`^H4$f$=$JsHwhw9 zos*veX5Z)E>G425aU1|D?#N&sbGmv$HIzRLdc!c2~jCwkOb6^73 z6g0h<1qopIRAZdtq?n?oBuNI2XC!^!FgN*9BOeBlZn?s#11sb9S%p@Ze$Yio_xO5n z=Yto8jRCCs-Y6n3qO0MrQjhM(j1uvBU5jMq^&FmMt(#$7Vxr}~j> zCnP-nNcNgOmG1x;^(ug(zfTol0ESx}u1j^*7{;_Ius>W}1F zH{fDVEz%hQXmFBRz2!9;;Y!X7wIe%0p7g`wvb9Dqn69pZwCeR_9hT-C1IMhH7Z-`H z9bj`lp_v(i;<@PQ$FbYvqvq<>9PY>_{>A)*hTZV*Hgr5=dxZ9|H2`*yzuoh*4qNk;n3s4Y8$l!1N$BwwTd3$j}_#NKx%gUKz8^= zY@Y~vTTI^;%Y{>01;WMo1?H|Bg8*rtSfCgK3Ax3AI|>Q21%f-O98Jd%qK#{bup{c{ zPful6pX#@nIXeffNp-AmbX*$+^3Hi2pk~=uEi)M70DUyO)Fwq<1inwoNs*$jRhHn7 zvo9pY#by|-wJ%i3jz9Dff|*xRG(4g zq@1V*vsOksH^FaHw|if>xaz)L;c%s$-8{6s}_j5`*3bh*og<8ji4CAbGM&|?SLLAj8PEKrJg3Z{j?@D}N>%kuiOT0J#i>qCqe4iw;bl}Q;((XzG&q+|n@Yk?5!G&31 z^pz&xD2>R0E1P`?Haq>*&`Y_D2w*YFb5~@Fg-Evj@7!2us$WJJq$?ZIid!rfw-hU2 z6BN!vkBj&&9`Z97^6q!vdICHMdSt15Hg(p2_Y|C1aXH*KU69=@-O)&Q9|2BjGXwYS`~>LREB@%) zUOcjw`2d|>&`+sZpGZ-1ls~whjED$iJ7oKwi2DIJNx*PMy;~-LKcJY?e9?>pv{<8( zKaUAuIHG$h;&UpLkk0a2crtBQm+t8a1kwaB8G(7*?oBZ>vL% zoQZx%SoR<&YO*vd0G;lx0n2IlJyXWyK!DEk z0^ED@rskPAYqB>MgQpPVg<$|M&1YpSaxF1zBOMw$BhF>`@WjX)me~H2{beAMJ241z z%AaOxv_^e2Pd!wW>5WpCkDTc)9s%&w=VEg6$nT7Q7KMfRm^V1Klh89`sEyA_cH#jj8kKhKzAP|{m+|qg>c1`kEwx}@}eDVV}{9m|3 zUpPY5T7aG*cSiz3ZD5yixeF7(G1>3^Wze}-K>ya$0n_vfB6!Y&=BU-WAlykJ)Ee>s zT@27EgnaD<$$9V<{c$!RA5Xc(553vw4`V!~$2_qUAUGDae!-dl{CFCj2sRoBzAZjE z)pHI15+B%1s1tQIWunwQ6a=QdY68CwcjWU8j!J!GKf`{COOOy1aQ_aCOASp^yV*jL ztR#sBh;fS(gpq`iB%sDi%#T7b#zztrgy9-*g)#0CS(79&kYpJl(qTz5j0&&kuau75gx~t9e6TENs(j3VjT!DCQK5!k>pI0IfwyMkT{HSGv=ViMT~+d zNTJ6gD@crw4i#o9#Y)tNQjjt(3gA28hgam&OZ?IDnjGdxH+FdM)`CIUt# zc?^cD_uCNG7}Zz|b25su18+;dU@?hT**7o9S&V-ib}bnAS0b_xHqS?k@t62Ho_vf| zK{`G1RG_G?H&yEQn2FL16c-3aV&V8(bfg~%Pkn!V_5b8vOKs9f3I zEfTd_m}h3h4o$Q}k|Dir(eSJO3&Z>kIT zKu^NL{j+<4cKWyt!UNy)616nqPSVsMv%>Ihm>%9~o=1Pazz*=BMvy?8xZ^RqI|vS% z9@1@zr~P}HS4I1@-frv`D$yj80LXNfga)I!Sl=1bG2I~`ZGIb!qlA*A-*z=GosH@E zC#qv+c0sM;8pUc@^Tn9d`s1b=+G%8u~vYxtVqAs2Ud42fh3Gho?+9=?UpaRoDq-0dn z9A-#WOTqIZ)65{blw|5~^A`xD%*{3!=8|55Zn$igNvy8Mk;$1=tVs)7N_VaEWkt%DU}%TlSK`7tnE3f656Qu#wx_ap zuH7;m;atY+S55L&SL4nDE7{M53}s#mF!bY_+eiYu4j=?SL^M6-gVpRnp$CKE;KN_U zqS!`|HHG%z*Uef>_75;hEK6oGo6T@z+2Yc|$Asb&W=~99_i@=d=!h;Gm@8@wrQDt% z1>&EQi>t0m%Uu7RUcO(qw?9lr9JVy-TwX7$UGB$xReR-^`*Seem(y6W)lLTrJAK=g z!LYXwjL41+SZo%f8ZVpxq8KilrLT(T@*Xf1KSBY6uI3KIh3oFJS^l1}S0oKZmk;=| zvKa)eNe6|f+L(mAntC7%;)?MJLNS!X>!DO^!W-S3m|9)!%_=vETg;~0{1nF_OFdrK zy7*=}ACjZ!^~YO8*=ufxPgz_oHa$9?^6v&8FD>7(IosbYc$bN@BpZ}k6qYV0NtW0b z>JZ#&a!K}L{5tL$aH|K(tQ^BO694Q2J5lE2r5PNh3^rN^jTHAv)zUGK!_$B|1a8;} z?YJGjech}|N`9#l@L)r+$H3NL;(+k-T)}CHN7DK_8)!ccM=dR7u$s^4G+*6s_k6jv zzTTZT^?WLK+?Mo_N(S^5MZ}e|t}N@+v8Z*pH9YIRC-}TABw)iwPn`g6pSHiAo}6$6 z4(Hd_iX{D6YX7<;o`9%tNy*LaWaD zinC(rcB!P9v<6L42Xr?`o+30>G_*u zsfGaN&eN{5Bb7i3ksOl@^OsO43aNQ=G1S7)X)wjG%C5a#MXjW#5<8iOYJ3ui6EyoD z_&V#7*m54?McBXdTk3gDG%H(i-kZ;g?yIZRyNp&C_qguPr@w!|X@s{Y)Fww!So~*` z#qEKRrHyDi)bJJk!p9d19gxPJ3IUyQ`Em_*tZ z)bjtsu*P8$;o@Y|J-Y9Wr-sZC0;m;rYO`Y15 zW2RrF+!1l=L-*7P<)Ja!+Noq1LDUoq>=03(gvp)AE^VJl&l%idGCT%cA~lM-r#&aw zUiz%i-g8Z9r?TC!N0uFw4bc?v47!sw?dEZ}M`4Bpbc7y2Bw;6F5Y1mUdU-h-wHU6Y zlb=5V+NkZJIeO70GMcD!T;>wL9FcxY*@E&O?Tpf*NOXHx)Gsor1T8Pfv9Dh?C(fCh zU%a;@h8Y+eUP#x*U209&w7t0OoY1V%3O+<3^DgDl1|93I+fiEH)pb_!{PkG#{HC)~ z*Ka>>pf@C`ac5FY5>Y0uv)44dx`%S0)*0fufMUnb$kn`>p-n?PwJtSPMU6IfE}+@jA0Iw=nst@VFRKV{g8U50Z!ey zoKgLN*T&>VkUPlGAX&STUDVDm@BqTT_qL~?r^CO(bUYgtmaFweLEcN6)t`7~e<|+1 z@>h#inq1;|_V9@R@)i6!>g>-*fflH@2!G)G9psYZtr3$TNvKK6Daf>?QawJwKw%Wf zwDh|`P0XrX0sC4ghPi#YftWYZT^a5+Ql^NRW;xMd%y~Ysa1t)`6DBtfw&RW)g@MOD zYKy71nb79LXawvS%&ERY8jdtXp_+6BW+lCa)JAeu^a=W1>U|P29-ib{ax0~t&Pi8e zeB5u|J})*J9<u5!6q&s|fli#RBw^uJZA_ zSUA*2w^3yomCom+L_FouYTZ+Q)dv5Zoz+ffF7ecK#H3cYFP3N4gQr~=c58ilqG4ok zt`Uh$1H-gj5`O3s6Ah1F0oi`RATcoxWqDJWzfe$lT zkU+J)kt1HvCH^Uq^LGbImT;CC@GAZoih3-`MzWwK|_mjrcN!|&<5pcw@;`NZo#&K~+qb!!P zY0Ua7#C~RFA_@a*&v4R(>AsAN_h0X|4+Ebe!4Rw5!kF`jvr77rPdd{yeWqKU?<*57 zW-dZg!Z~PE-Mmh{x};L*^MP~yfk_%#gL+ccXt5SdH|c?FS9{#DQudbfGVz^MtliO# z3jpke)-)0FlGs#Bi}6xaQU_+6UQVK6PUCaVshcrBGdG%}CcsK%4QUUngbs(^--n3X zG1_eKVudc21PSvktr92VD9*3PrdWU}^3xXypzevPu8Fj@kI`v^UB8oFLJZNw{Q946 zWzQYtf+_Ul?qddRz+VL79!4&*_%S!)upyJ&4zP7v3joPQ@_y9`s#y43CCTbm=G+`t z0kJ9qvG0^KC!61+`dGD5_HaonA}9vbSY-+)A@$Ogu<(~s?WV_F!}Kc0yo2(HN6Q?| z$dCTl`z70ONbIs-5Q$2DYIg~3g zuaDa+El*C}TFQV`YF3I#6x;5hSXsn25(+D<0ZiKX-CUwrm_gM#1y9iMIn*L)bWAsF zp%};7dl0GdMAI{PjKfSi*K>r;vvGLH+PO7gqeWQ!ti!{23cD7+IoVpS83`p!cv&Wz z0ox^RGrVsmI$SxZ#;9jbJ%z0toqXBBMX!xx$D$#3j;PVSV#WfVl=D_p|*#r z#%9Omi`^|erFn?sCMGZZJ$GWtF=KjUJ<)y<$L61i#49rW27^KDMgwGpL`%jXCxjBU z`a|>V$i$X^RN-CVDbQU-gj-ISbmtX8=2m4lkxz+F=6oKi;%8pcfJ*H(HqA)&D&_jF z)ob!&gKM?;>=Xi&g4&4SsE$dI2yqD{=*5Bak}d4pwV6qdAT-im#B7Xa3!4biLuH=@ zP8}aD*MMr?t@{e9jOcIil?t5B7GjyrgClMm4S`H?M#T3&L$NrDCG)ri&M~!EVxAj6 zyNZ}Dl1WCDHZlY6x~?lsrqjL;N%D~NWO(0=Em~|=<~zE_=U_5*&dFr>RI4+(w?j^6 zG^1RiyppnC^IW;x)@=%2&4GvE8u;2#XGspSn z99m;lt<_m(lmD_-Jd~92P9{+?(14+XGeqSmOM-GIrvzpp1y6Vdpl1EI!q6o;KrR})m2FDa#T7B8;75q%(+PC-hTQ9Ni={HqbG z^AYC>y_}pE`?fVqO|?f~@H71v_M0;-@t2(jW}Z{dSIDxojq6^vN48$!CB|MLY}4`F zj#n`co!01CS+kl(OqY6BYVt9T2A#8-V866u3vLrpifR-g+LH6#!EAgSZ?02eGQ1?a zZ2eu@5Bnx#VEMnX)`II&gYFgGqAq_0cZK&)iQNXj@V+mhK~NvdT^3>{y0LU2X_I&% zC!b!l!FagB9D_sH{LWRR8Vov~d(9xiXtAVbDL}LB;dEr9(4{sZ&w1P8^Dn_Cg06;`If1Dba&+B8yr&CA0; z1ipp_+Dk!^{WcA`48*qOLyx1`WjZ*Umgn_WPgmPn%6!nL(Osh1amwL*VdT5>-5?&(9xn?vPPVeGpq)R$~!EQm1E7$E)@Yj*+w}wBs7$ycYUY#`> zUe;3iu-mu;dv=r{2_r@|(SaL%sW{7FqQB?81l;+}P8pLIvRW3e-_vZPUSxEQJvJXz zL)Sf?aMjfB$)2bUeZKv8&=hh~s(1XU$3S?|NL=Lem84QAR%!m!lfW>hi8;Ul{wiMs zLG*a+=yIRv^7b}KqVcPxr3f4f*N3t(OB7)mbEpeph)>qPs#;&m& zM)hLoV=UBSzmxhKP6(Q{CX2wXwY=x8C3t9;f9pX*vUmw9&t4lYO1-#t-KoVqM2R=9 z9YCMcRkKvll`|6|2P85Km}QnkB-6h|_Y4dT7$Ta6_f#T>3}j-OQY{CGuJhT{X*#Ty z0hkTqd4rhbL(+{005$Bvrg~w&*c%&VL%)&n8cVeLKnmY6YG7V5$FQF6oouI^8eN^V zq*18avhTK!Ym+W7cFrf(r*7gN zL!)jc_)pxVJo$l%q6c@If~Ta9X*Qp2(k_{^?rYgoK+Dp_Hgv5`^IiTo3nVh4N0yh!!z}o{JG9jHD9hMcSy|*3gJn|Lc8Ji;ThGp(P1M z9JNH~NCcUVRpbcW03$~DsIC~lNa#CwS%Qq~eYK}E7LnkHlG^oUU$rJcwj$SAZft}U*0D1UTApg2O4=pHZ#cbhf3A#s-363cPp0c%E1 zs32?Z2cVa~9afNLWH^e4W+&5E2|}Yxi(=8&V~Jei-y@G245<(~bfuCzlr zUXhdo&H!;c$>|AEJ1+%8uL%ktA�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