Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 206 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x00000182 | 2394189 | 3 hrs ago | IN | 0.1000197 ETH | 0.00002293 | ||||
0x00000182 | 2392543 | 4 hrs ago | IN | 0.00566711 ETH | 0.00001354 | ||||
0x00000182 | 2388970 | 5 hrs ago | IN | 0.00852252 ETH | 0.00001161 | ||||
Execute Controll... | 2367161 | 11 hrs ago | IN | 0.03494614 ETH | 0.00002126 | ||||
Execute Controll... | 2367068 | 11 hrs ago | IN | 0.049 ETH | 0.00001962 | ||||
0x00000182 | 2362804 | 12 hrs ago | IN | 0.00681979 ETH | 0.00001177 | ||||
Execute Controll... | 2361091 | 12 hrs ago | IN | 0.1 ETH | 0.00002435 | ||||
Execute Controll... | 2358771 | 13 hrs ago | IN | 0.00519932 ETH | 0.00001774 | ||||
Execute Controll... | 2358760 | 13 hrs ago | IN | 0.05000896 ETH | 0.00002494 | ||||
Execute Controll... | 2357861 | 13 hrs ago | IN | 0.15717156 ETH | 0.00002081 | ||||
0x00000182 | 2357707 | 13 hrs ago | IN | 0.01001991 ETH | 0.00001355 | ||||
Execute Controll... | 2347016 | 16 hrs ago | IN | 0.017 ETH | 0.00002116 | ||||
Execute Controll... | 2337705 | 19 hrs ago | IN | 0.01 ETH | 0.00001981 | ||||
0x00000182 | 2323916 | 23 hrs ago | IN | 0.40001812 ETH | 0.00001852 | ||||
Execute Controll... | 2316663 | 25 hrs ago | IN | 0.045 ETH | 0.00001733 | ||||
0x00000182 | 2311886 | 26 hrs ago | IN | 0.24901812 ETH | 0.00001335 | ||||
0x00000182 | 2310914 | 27 hrs ago | IN | 0.49996502 ETH | 0.00001877 | ||||
Execute Controll... | 2298627 | 30 hrs ago | IN | 0.10662747 ETH | 0.00001733 | ||||
Execute Controll... | 2297068 | 31 hrs ago | IN | 0.01 ETH | 0.00001175 | ||||
Execute Controll... | 2297059 | 31 hrs ago | IN | 0.08157045 ETH | 0.00001735 | ||||
0x00000181 | 2285658 | 34 hrs ago | IN | 0.035 ETH | 0.0000151 | ||||
Execute Controll... | 2284961 | 34 hrs ago | IN | 0.281 ETH | 0.00001689 | ||||
0x00000182 | 2284883 | 34 hrs ago | IN | 0.15302023 ETH | 0.0000182 | ||||
0x00000182 | 2281995 | 35 hrs ago | IN | 0.17872261 ETH | 0.00001191 | ||||
Execute Controll... | 2281444 | 35 hrs ago | IN | 0.01 ETH | 0.00001569 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
2394189 | 3 hrs ago | 0.1000197 ETH | ||||
2394189 | 3 hrs ago | 0.1000197 ETH | ||||
2394189 | 3 hrs ago | 0.1000197 ETH | ||||
2392543 | 4 hrs ago | 0.00566711 ETH | ||||
2392543 | 4 hrs ago | 0.00566711 ETH | ||||
2392543 | 4 hrs ago | 0.00566711 ETH | ||||
2388970 | 5 hrs ago | 0.00852252 ETH | ||||
2388970 | 5 hrs ago | 0.00852252 ETH | ||||
2388970 | 5 hrs ago | 0.00852252 ETH | ||||
2367161 | 11 hrs ago | 0.03485878 ETH | ||||
2367161 | 11 hrs ago | 0.03494614 ETH | ||||
2367161 | 11 hrs ago | 0.00008736 ETH | ||||
2367161 | 11 hrs ago | 0.03494614 ETH | ||||
2367161 | 11 hrs ago | 0.03494614 ETH | ||||
2367068 | 11 hrs ago | 0.0488775 ETH | ||||
2367068 | 11 hrs ago | 0.049 ETH | ||||
2367068 | 11 hrs ago | 0.0001225 ETH | ||||
2367068 | 11 hrs ago | 0.049 ETH | ||||
2367068 | 11 hrs ago | 0.049 ETH | ||||
2362804 | 12 hrs ago | 0.00681979 ETH | ||||
2362804 | 12 hrs ago | 0.00681979 ETH | ||||
2362804 | 12 hrs ago | 0.00681979 ETH | ||||
2361091 | 12 hrs ago | 0.09975 ETH | ||||
2361091 | 12 hrs ago | 0.1 ETH | ||||
2361091 | 12 hrs ago | 0.00025 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
SocketGateway
Compiler Version
v0.8.24+commit.e11b9ed9
ZkSolc Version
v1.5.11
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; pragma experimental ABIEncoderV2; import "./utils/Ownable.sol"; import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol"; import {ERC20} from "solmate/tokens/ERC20.sol"; import {LibUtil} from "./libraries/LibUtil.sol"; import "./libraries/LibBytes.sol"; import {ISocketRoute} from "./interfaces/ISocketRoute.sol"; import {ISocketRequest} from "./interfaces/ISocketRequest.sol"; import {ISocketGateway} from "./interfaces/ISocketGateway.sol"; import {IncorrectBridgeRatios, ZeroAddressNotAllowed, ArrayLengthMismatch} from "./errors/SocketErrors.sol"; /// @title SocketGatewayContract /// @notice Socketgateway is a contract with entrypoint functions for all interactions with socket liquidity layer /// @author Socket Team contract SocketGateway is Ownable { using LibBytes for bytes; using LibBytes for bytes4; using SafeTransferLib for ERC20; /// @notice FunctionSelector used to delegatecall from swap to the function of bridge router implementation bytes4 public immutable BRIDGE_AFTER_SWAP_SELECTOR = bytes4(keccak256("bridgeAfterSwap(uint256,bytes)")); /// @notice storage variable to keep track of total number of routes registered in socketgateway uint32 public routesCount = 385; /// @notice storage variable to keep track of total number of controllers registered in socketgateway uint32 public controllerCount; address public immutable disabledRouteAddress; uint256 public constant CENT_PERCENT = 100e18; /// @notice storage mapping for route implementation addresses mapping(uint32 => address) public routes; /// storage mapping for controller implemenation addresses mapping(uint32 => address) public controllers; // Events -------------------------------------------------------------------------------------------------------> /// @notice Event emitted when a router is added to socketgateway event NewRouteAdded(uint32 indexed routeId, address indexed route); /// @notice Event emitted when a route is disabled event RouteDisabled(uint32 indexed routeId); /// @notice Event emitted when ownership transfer is requested by socket-gateway-owner event OwnershipTransferRequested( address indexed _from, address indexed _to ); /// @notice Event emitted when a controller is added to socketgateway event ControllerAdded( uint32 indexed controllerId, address indexed controllerAddress ); /// @notice Event emitted when a controller is disabled event ControllerDisabled(uint32 indexed controllerId); constructor(address _owner, address _disabledRoute) Ownable(_owner) { disabledRouteAddress = _disabledRoute; } // Able to receive ether // solhint-disable-next-line no-empty-blocks receive() external payable {} /******************************************* * EXTERNAL AND PUBLIC FUNCTIONS * *******************************************/ /** * @notice executes functions in the routes identified using routeId and functionSelectorData * @notice The caller must first approve this contract to spend amount of ERC20-Token being bridged/swapped * @dev ensure the data in routeData to be built using the function-selector defined as a * constant in the route implementation contract * @param routeId route identifier * @param routeData functionSelectorData generated using the function-selector defined in the route Implementation */ function executeRoute( uint32 routeId, bytes calldata routeData ) external payable returns (bytes memory) { (bool success, bytes memory result) = addressAt(routeId).delegatecall( routeData ); if (!success) { assembly { revert(add(result, 32), mload(result)) } } return result; } /** * @notice swaps a token on sourceChain and split it across multiple bridge-recipients * @notice The caller must first approve this contract to spend amount of ERC20-Token being swapped * @dev ensure the swap-data and bridge-data is generated using the function-selector defined as a constant in the implementation address * @param swapMultiBridgeRequest request */ function swapAndMultiBridge( ISocketRequest.SwapMultiBridgeRequest calldata swapMultiBridgeRequest ) external payable { uint256 requestLength = swapMultiBridgeRequest.bridgeRouteIds.length; if ( requestLength != swapMultiBridgeRequest.bridgeImplDataItems.length ) { revert ArrayLengthMismatch(); } uint256 ratioAggregate; for (uint256 index = 0; index < requestLength; ) { ratioAggregate += swapMultiBridgeRequest.bridgeRatios[index]; } if (ratioAggregate != CENT_PERCENT) { revert IncorrectBridgeRatios(); } (bool swapSuccess, bytes memory swapResult) = addressAt( swapMultiBridgeRequest.swapRouteId ).delegatecall(swapMultiBridgeRequest.swapImplData); if (!swapSuccess) { assembly { revert(add(swapResult, 32), mload(swapResult)) } } uint256 amountReceivedFromSwap = abi.decode(swapResult, (uint256)); uint256 bridgedAmount; for (uint256 index = 0; index < requestLength; ) { uint256 bridgingAmount; // if it is the last bridge request, bridge the remaining amount if (index == requestLength - 1) { bridgingAmount = amountReceivedFromSwap - bridgedAmount; } else { // bridging amount is the multiplication of bridgeRatio and amountReceivedFromSwap bridgingAmount = (amountReceivedFromSwap * swapMultiBridgeRequest.bridgeRatios[index]) / (CENT_PERCENT); } // update the bridged amount, this would be used for computation for last bridgeRequest bridgedAmount += bridgingAmount; bytes memory bridgeImpldata = abi.encodeWithSelector( BRIDGE_AFTER_SWAP_SELECTOR, bridgingAmount, swapMultiBridgeRequest.bridgeImplDataItems[index] ); (bool bridgeSuccess, bytes memory bridgeResult) = addressAt( swapMultiBridgeRequest.bridgeRouteIds[index] ).delegatecall(bridgeImpldata); if (!bridgeSuccess) { assembly { revert(add(bridgeResult, 32), mload(bridgeResult)) } } unchecked { ++index; } } } /** * @notice sequentially executes functions in the routes identified using routeId and functionSelectorData * @notice The caller must first approve this contract to spend amount of ERC20-Token being bridged/swapped * @dev ensure the data in each dataItem to be built using the function-selector defined as a * constant in the route implementation contract * @param routeIds a list of route identifiers * @param dataItems a list of functionSelectorData generated using the function-selector defined in the route Implementation */ function executeRoutes( uint32[] calldata routeIds, bytes[] calldata dataItems ) external payable { uint256 routeIdslength = routeIds.length; if (routeIdslength != dataItems.length) revert ArrayLengthMismatch(); for (uint256 index = 0; index < routeIdslength; ) { (bool success, bytes memory result) = addressAt(routeIds[index]) .delegatecall(dataItems[index]); if (!success) { assembly { revert(add(result, 32), mload(result)) } } unchecked { ++index; } } } /** * @notice execute a controller function identified using the controllerId in the request * @notice The caller must first approve this contract to spend amount of ERC20-Token being bridged/swapped * @dev ensure the data in request to be built using the function-selector defined as a * constant in the controller implementation contract * @param socketControllerRequest socketControllerRequest with controllerId to identify the * controllerAddress and byteData constructed using functionSelector * of the function being invoked * @return bytes data received from the call delegated to controller */ function executeController( ISocketGateway.SocketControllerRequest calldata socketControllerRequest ) external payable returns (bytes memory) { (bool success, bytes memory result) = controllers[ socketControllerRequest.controllerId ].delegatecall(socketControllerRequest.data); if (!success) { assembly { revert(add(result, 32), mload(result)) } } return result; } /** * @notice sequentially executes all controller requests * @notice The caller must first approve this contract to spend amount of ERC20-Token being bridged/swapped * @dev ensure the data in each controller-request to be built using the function-selector defined as a * constant in the controller implementation contract * @param controllerRequests a list of socketControllerRequest * Each controllerRequest contains controllerId to identify the controllerAddress and * byteData constructed using functionSelector of the function being invoked */ function executeControllers( ISocketGateway.SocketControllerRequest[] calldata controllerRequests ) external payable { for (uint32 index = 0; index < controllerRequests.length; ) { (bool success, bytes memory result) = controllers[ controllerRequests[index].controllerId ].delegatecall(controllerRequests[index].data); if (!success) { assembly { revert(add(result, 32), mload(result)) } } unchecked { ++index; } } } /************************************** * ADMIN FUNCTIONS * **************************************/ /** * @notice Add route to the socketGateway This is a restricted function to be called by only socketGatewayOwner * @dev ensure routeAddress is a verified bridge or middleware implementation address * @param routeAddress The address of bridge or middleware implementation contract deployed * @return Id of the route added to the routes-mapping in socketGateway storage */ function addRoute( address routeAddress ) external onlyOwner returns (uint32) { uint32 routeId = routesCount; routes[routeId] = routeAddress; routesCount += 1; emit NewRouteAdded(routeId, routeAddress); return routeId; } /** * @notice Give Infinite or 0 approval to bridgeRoute for the tokenAddress This is a restricted function to be called by only socketGatewayOwner */ function setApprovalForRouters( address[] memory routeAddresses, address[] memory tokenAddresses, bool isMax ) external onlyOwner { for (uint32 index = 0; index < routeAddresses.length; ) { ERC20(tokenAddresses[index]).approve( routeAddresses[index], isMax ? type(uint256).max : 0 ); unchecked { ++index; } } } /** * @notice Add controller to the socketGateway This is a restricted function to be called by only socketGatewayOwner * @dev ensure controllerAddress is a verified controller implementation address * @param controllerAddress The address of controller implementation contract deployed * @return Id of the controller added to the controllers-mapping in socketGateway storage */ function addController( address controllerAddress ) external onlyOwner returns (uint32) { uint32 controllerId = controllerCount; controllers[controllerId] = controllerAddress; controllerCount += 1; emit ControllerAdded(controllerId, controllerAddress); return controllerId; } /** * @notice disable controller by setting ZeroAddress to the entry in controllers-mapping identified by controllerId as key. This is a restricted function to be called by only socketGatewayOwner * @param controllerId The Id of controller-implementation in the controllers mapping */ function disableController(uint32 controllerId) public onlyOwner { controllers[controllerId] = disabledRouteAddress; emit ControllerDisabled(controllerId); } /** * @notice disable a route by setting ZeroAddress to the entry in routes-mapping identified by routeId as key. This is a restricted function to be called by only socketGatewayOwner * @param routeId The Id of route-implementation in the routes mapping */ function disableRoute(uint32 routeId) external onlyOwner { routes[routeId] = disabledRouteAddress; emit RouteDisabled(routeId); } /******************************************* * RESTRICTED RESCUE FUNCTIONS * *******************************************/ /** * @notice Rescues the ERC20 token to an address this is a restricted function to be called by only socketGatewayOwner * @dev as this is a restricted to socketGatewayOwner, ensure the userAddress is a known address * @param token address of the ERC20 token being rescued * @param userAddress address to which ERC20 is to be rescued * @param amount amount of ERC20 tokens being rescued */ function rescueFunds( address token, address userAddress, uint256 amount ) external onlyOwner { ERC20(token).safeTransfer(userAddress, amount); } /** * @notice Rescues the native balance to an address this is a restricted function to be called by only socketGatewayOwner * @dev as this is a restricted to socketGatewayOwner, ensure the userAddress is a known address * @param userAddress address to which native-balance is to be rescued * @param amount amount of native-balance being rescued */ function rescueEther( address payable userAddress, uint256 amount ) external onlyOwner { userAddress.call{value: amount}(""); } /******************************************* * VIEW FUNCTIONS * *******************************************/ /** * @notice Get routeImplementation address mapped to the routeId * @param routeId routeId is the key in the mapping for routes * @return route-implementation address */ function getRoute(uint32 routeId) public view returns (address) { return addressAt(routeId); } /** * @notice Get controllerImplementation address mapped to the controllerId * @param controllerId controllerId is the key in the mapping for controllers * @return controller-implementation address */ function getController(uint32 controllerId) public view returns (address) { return controllers[controllerId]; } function addressAt(uint32 routeId) public view returns (address) { if (routeId < 385) { if (routeId < 257) { if (routeId < 129) { if (routeId < 65) { if (routeId < 33) { if (routeId < 17) { if (routeId < 9) { if (routeId < 5) { if (routeId < 3) { if (routeId == 1) { return 0x8cd6BaCDAe46B449E2e5B34e348A4eD459c84D50; } else { return 0x31524750Cd865fF6A3540f232754Fb974c18585C; } } else { if (routeId == 3) { return 0xEd9b37342BeC8f3a2D7b000732ec87498aA6EC6a; } else { return 0xE8704Ef6211F8988Ccbb11badC89841808d66890; } } } else { if (routeId < 7) { if (routeId == 5) { return 0x9aFF58C460a461578C433e11C4108D1c4cF77761; } else { return 0x2D1733886cFd465B0B99F1492F40847495f334C5; } } else { if (routeId == 7) { return 0x715497Be4D130F04B8442F0A1F7a9312D4e54FC4; } else { return 0x90C8a40c38E633B5B0e0d0585b9F7FA05462CaaF; } } } } else { if (routeId < 13) { if (routeId < 11) { if (routeId == 9) { return 0xa402b70FCfF3F4a8422B93Ef58E895021eAdE4F6; } else { return 0xc1B718522E15CD42C4Ac385a929fc2B51f5B892e; } } else { if (routeId == 11) { return 0xa97bf2f7c26C43c010c349F52f5eA5dC49B2DD38; } else { return 0x969423d71b62C81d2f28d707364c9Dc4a0764c53; } } } else { if (routeId < 15) { if (routeId == 13) { return 0xF86729934C083fbEc8C796068A1fC60701Ea1207; } else { return 0xD7cC2571F5823caCA26A42690D2BE7803DD5393f; } } else { if (routeId == 15) { return 0x7c8837a279bbbf7d8B93413763176de9F65d5bB9; } else { return 0x13b81C27B588C07D04458ed7dDbdbD26D1e39bcc; } } } } } else { if (routeId < 25) { if (routeId < 21) { if (routeId < 19) { if (routeId == 17) { return 0x52560Ac678aFA1345D15474287d16Dc1eA3F78aE; } else { return 0x1E31e376551459667cd7643440c1b21CE69065A0; } } else { if (routeId == 19) { return 0xc57D822CB3288e7b97EF8f8af0EcdcD1B783529B; } else { return 0x2197A1D9Af24b4d6a64Bff95B4c29Fcd3Ff28C30; } } } else { if (routeId < 23) { if (routeId == 21) { return 0xE3700feAa5100041Bf6b7AdBA1f72f647809Fd00; } else { return 0xc02E8a0Fdabf0EeFCEA025163d90B5621E2b9948; } } else { if (routeId == 23) { return 0xF5144235E2926cAb3c69b30113254Fa632f72d62; } else { return 0xBa3F92313B00A1f7Bc53b2c24EB195c8b2F57682; } } } } else { if (routeId < 29) { if (routeId < 27) { if (routeId == 25) { return 0x77a6856fe1fFA5bEB55A1d2ED86E27C7c482CB76; } else { return 0x4826Ff4e01E44b1FCEFBfb38cd96687Eb7786b44; } } else { if (routeId == 27) { return 0x55FF3f5493cf5e80E76DEA7E327b9Cd8440Af646; } else { return 0xF430Db544bE9770503BE4aa51997aA19bBd5BA4f; } } } else { if (routeId < 31) { if (routeId == 29) { return 0x0f166446ce1484EE3B0663E7E67DF10F5D240115; } else { return 0x6365095D92537f242Db5EdFDd572745E72aC33d9; } } else { if (routeId == 31) { return 0x5c7BC93f06ce3eAe75ADf55E10e23d2c1dE5Bc65; } else { return 0xe46383bAD90d7A08197ccF08972e9DCdccCE9BA4; } } } } } } else { if (routeId < 49) { if (routeId < 41) { if (routeId < 37) { if (routeId < 35) { if (routeId == 33) { return 0xf0f21710c071E3B728bdc4654c3c0b873aAaa308; } else { return 0x63Bc9ed3AcAAeB0332531C9fB03b0a2352E9Ff25; } } else { if (routeId == 35) { return 0xd1CE808625CB4007a1708824AE82CdB0ece57De9; } else { return 0x57BbB148112f4ba224841c3FE018884171004661; } } } else { if (routeId < 39) { if (routeId == 37) { return 0x037f7d6933036F34DFabd40Ff8e4D789069f92e3; } else { return 0xeF978c280915CfF3Dca4EDfa8932469e40ADA1e1; } } else { if (routeId == 39) { return 0x92ee9e071B13f7ecFD62B7DED404A16CBc223CD3; } else { return 0x94Ae539c186e41ed762271338Edf140414D1E442; } } } } else { if (routeId < 45) { if (routeId < 43) { if (routeId == 41) { return 0x30A64BBe4DdBD43dA2368EFd1eB2d80C10d84DAb; } else { return 0x3aEABf81c1Dc4c1b73d5B2a95410f126426FB596; } } else { if (routeId == 43) { return 0x25b08aB3D0C8ea4cC9d967b79688C6D98f3f563a; } else { return 0xea40cB15C9A3BBd27af6474483886F7c0c9AE406; } } } else { if (routeId < 47) { if (routeId == 45) { return 0x9580113Cc04e5a0a03359686304EF3A80b936Dd3; } else { return 0xD211c826d568957F3b66a3F4d9c5f68cCc66E619; } } else { if (routeId == 47) { return 0xCEE24D0635c4C56315d133b031984d4A6f509476; } else { return 0x3922e6B987983229798e7A20095EC372744d4D4c; } } } } } else { if (routeId < 57) { if (routeId < 53) { if (routeId < 51) { if (routeId == 49) { return 0x2d92D03413d296e1F31450479349757187F2a2b7; } else { return 0x0fe5308eE90FC78F45c89dB6053eA859097860CA; } } else { if (routeId == 51) { return 0x08Ba68e067C0505bAF0C1311E0cFB2B1B59b969c; } else { return 0x9bee5DdDF75C24897374f92A534B7A6f24e97f4a; } } } else { if (routeId < 55) { if (routeId == 53) { return 0x1FC5A90B232208704B930c1edf82FFC6ACc02734; } else { return 0x5b1B0417cb44c761C2a23ee435d011F0214b3C85; } } else { if (routeId == 55) { return 0x9d70cDaCA12A738C283020760f449D7816D592ec; } else { return 0x95a23b9CB830EcCFDDD5dF56A4ec665e3381Fa12; } } } } else { if (routeId < 61) { if (routeId < 59) { if (routeId == 57) { return 0x483a957Cf1251c20e096C35c8399721D1200A3Fc; } else { return 0xb4AD39Cb293b0Ec7FEDa743442769A7FF04987CD; } } else { if (routeId == 59) { return 0x4C543AD78c1590D81BAe09Fc5B6Df4132A2461d0; } else { return 0x471d5E5195c563902781734cfe1FF3981F8B6c86; } } } else { if (routeId < 63) { if (routeId == 61) { return 0x1B12a54B5E606D95B8B8D123c9Cb09221Ee37584; } else { return 0xE4127cC550baC433646a7D998775a84daC16c7f3; } } else { if (routeId == 63) { return 0xecb1b55AB12E7dd788D585c6C5cD61B5F87be836; } else { return 0xf91ef487C5A1579f70601b6D347e19756092eEBf; } } } } } } } else { if (routeId < 97) { if (routeId < 81) { if (routeId < 73) { if (routeId < 69) { if (routeId < 67) { if (routeId == 65) { return 0x34a16a7e9BADEEFD4f056310cbE0b1423Fa1b760; } else { return 0x60E10E80c7680f429dBbC232830BEcd3D623c4CF; } } else { if (routeId == 67) { return 0x66465285B8D65362A1d86CE00fE2bE949Fd6debF; } else { return 0x5aB231B7e1A3A74a48f67Ab7bde5Cdd4267022E0; } } } else { if (routeId < 71) { if (routeId == 69) { return 0x3A1C3633eE79d43366F5c67802a746aFD6b162Ba; } else { return 0x0C4BfCbA8dC3C811437521a80E81e41DAF479039; } } else { if (routeId == 71) { return 0x6caf25d2e139C5431a1FA526EAf8d73ff2e6252C; } else { return 0x74ad21e09FDa68638CE14A3009A79B6D16574257; } } } } else { if (routeId < 77) { if (routeId < 75) { if (routeId == 73) { return 0xD4923A61008894b99cc1CD3407eF9524f02aA0Ca; } else { return 0x6F159b5EB823BD415886b9271aA2A723a00a1987; } } else { if (routeId == 75) { return 0x742a8aA42E7bfB4554dE30f4Fb07FFb6f2068863; } else { return 0x4AE9702d3360400E47B446e76DE063ACAb930101; } } } else { if (routeId < 79) { if (routeId == 77) { return 0x0E19a0a44ddA7dAD854ec5Cc867d16869c4E80F4; } else { return 0xE021A51968f25148F726E326C88d2556c5647557; } } else { if (routeId == 79) { return 0x64287BDDDaeF4d94E4599a3D882bed29E6Ada4B6; } else { return 0xcBB57Fd2e19cc7e9D444d5b4325A2F1047d0C73f; } } } } } else { if (routeId < 89) { if (routeId < 85) { if (routeId < 83) { if (routeId == 81) { return 0x373DE80DF7D82cFF6D76F29581b360C56331e957; } else { return 0x0466356E131AD61596a51F86BAd1C03A328960D8; } } else { if (routeId == 83) { return 0x01726B960992f1b74311b248E2a922fC707d43A6; } else { return 0x2E21bdf9A4509b89795BCE7E132f248a75814CEc; } } } else { if (routeId < 87) { if (routeId == 85) { return 0x769512b23aEfF842379091d3B6E4B5456F631D42; } else { return 0xe7eD9be946a74Ec19325D39C6EEb57887ccB2B0D; } } else { if (routeId == 87) { return 0xc4D01Ec357c2b511d10c15e6b6974380F0E62e67; } else { return 0x5bC49CC9dD77bECF2fd3A3C55611e84E69AFa3AE; } } } } else { if (routeId < 93) { if (routeId < 91) { if (routeId == 89) { return 0x48bcD879954fA14e7DbdAeb56F79C1e9DDcb69ec; } else { return 0xE929bDde21b462572FcAA4de6F49B9D3246688D0; } } else { if (routeId == 91) { return 0x85Aae300438222f0e3A9Bc870267a5633A9438bd; } else { return 0x51f72E1096a81C55cd142d66d39B688C657f9Be8; } } } else { if (routeId < 95) { if (routeId == 93) { return 0x3A8a05BF68ac54B01E6C0f492abF97465F3d15f9; } else { return 0x145aA67133F0c2C36b9771e92e0B7655f0D59040; } } else { if (routeId == 95) { return 0xa030315d7DB11F9892758C9e7092D841e0ADC618; } else { return 0xdF1f8d81a3734bdDdEfaC6Ca1596E081e57c3044; } } } } } } else { if (routeId < 113) { if (routeId < 105) { if (routeId < 101) { if (routeId < 99) { if (routeId == 97) { return 0xFF2833123B58aa05d04D7fb99f5FB768B2b435F8; } else { return 0xc8f09c1fD751C570233765f71b0e280d74e6e743; } } else { if (routeId == 99) { return 0x3026DA6Ceca2E5A57A05153653D9212FFAaA49d8; } else { return 0xdE68Ee703dE0D11f67B0cE5891cB4a903de6D160; } } } else { if (routeId < 103) { if (routeId == 101) { return 0xE23a7730e81FB4E87A6D0bd9f63EE77ac86C3DA4; } else { return 0x8b1DBe04aD76a7d8bC079cACd3ED4D99B897F4a0; } } else { if (routeId == 103) { return 0xBB227240FA459b69C6889B2b8cb1BE76F118061f; } else { return 0xC062b9b3f0dB28BB8afAfcD4d075729344114ffe; } } } } else { if (routeId < 109) { if (routeId < 107) { if (routeId == 105) { return 0x553188Aa45f5FDB83EC4Ca485982F8fC082480D1; } else { return 0x0109d83D746EaCb6d4014953D9E12d6ca85e330b; } } else { if (routeId == 107) { return 0x45B1bEd29812F5bf6711074ACD180B2aeB783AD9; } else { return 0xdA06eC8c19aea31D77F60299678Cba40E743e1aD; } } } else { if (routeId < 111) { if (routeId == 109) { return 0x3cC5235c97d975a9b4FD4501B3446c981ea3D855; } else { return 0xa1827267d6Bd989Ff38580aE3d9deff6Acf19163; } } else { if (routeId == 111) { return 0x3663CAA0433A3D4171b3581Cf2410702840A735A; } else { return 0x7575D0a7614F655BA77C74a72a43bbd4fA6246a3; } } } } } else { if (routeId < 121) { if (routeId < 117) { if (routeId < 115) { if (routeId == 113) { return 0x2516Defc18bc07089c5dAFf5eafD7B0EF64611E2; } else { return 0xfec5FF08E20fbc107a97Af2D38BD0025b84ee233; } } else { if (routeId == 115) { return 0x0FB5763a87242B25243e23D73f55945fE787523A; } else { return 0xe4C00db89678dBf8391f430C578Ca857Dd98aDE1; } } } else { if (routeId < 119) { if (routeId == 117) { return 0x8F2A22061F9F35E64f14523dC1A5f8159e6a21B7; } else { return 0x18e4b838ae966917E20E9c9c5Ad359cDD38303bB; } } else { if (routeId == 119) { return 0x61ACb1d3Dcb3e3429832A164Cc0fC9849fb75A4a; } else { return 0x7681e3c8e7A41DCA55C257cc0d1Ae757f5530E65; } } } } else { if (routeId < 125) { if (routeId < 123) { if (routeId == 121) { return 0x806a2AB9748C3D1DB976550890E3f528B7E8Faec; } else { return 0xBDb8A5DD52C2c239fbC31E9d43B763B0197028FF; } } else { if (routeId == 123) { return 0x474EC9203706010B9978D6bD0b105D36755e4848; } else { return 0x8dfd0D829b303F2239212E591a0F92a32880f36E; } } } else { if (routeId < 127) { if (routeId == 125) { return 0xad4BcE9745860B1adD6F1Bd34a916f050E4c82C2; } else { return 0xBC701115b9fe14bC8CC5934cdC92517173e308C4; } } else { if (routeId == 127) { return 0x0D1918d786Db8546a11aDeD475C98370E06f255E; } else { return 0xee44f57cD6936DB55B99163f3Df367B01EdA785a; } } } } } } } } else { if (routeId < 193) { if (routeId < 161) { if (routeId < 145) { if (routeId < 137) { if (routeId < 133) { if (routeId < 131) { if (routeId == 129) { return 0x63044521fe5a1e488D7eD419cD0e35b7C24F2aa7; } else { return 0x410085E73BD85e90d97b84A68C125aDB9F91f85b; } } else { if (routeId == 131) { return 0x7913fe97E07C7A397Ec274Ab1d4E2622C88EC5D1; } else { return 0x977f9fE93c064DCf54157406DaABC3a722e8184C; } } } else { if (routeId < 135) { if (routeId == 133) { return 0xCD2236468722057cFbbABad2db3DEA9c20d5B01B; } else { return 0x17c7287A491cf5Ff81E2678cF2BfAE4333F6108c; } } else { if (routeId == 135) { return 0x354D9a5Dbf96c71B79a265F03B595C6Fdc04dadd; } else { return 0xb4e409EB8e775eeFEb0344f9eee884cc7ed21c69; } } } } else { if (routeId < 141) { if (routeId < 139) { if (routeId == 137) { return 0xa1a3c4670Ad69D9be4ab2D39D1231FEC2a63b519; } else { return 0x4589A22199870729C1be5CD62EE93BeD858113E6; } } else { if (routeId == 139) { return 0x8E7b864dB26Bd6C798C38d4Ba36EbA0d6602cF11; } else { return 0xA2D17C7260a4CB7b9854e89Fc367E80E87872a2d; } } } else { if (routeId < 143) { if (routeId == 141) { return 0xC7F0EDf0A1288627b0432304918A75e9084CBD46; } else { return 0xE4B4EF1f9A4aBFEdB371fA7a6143993B15d4df25; } } else { if (routeId == 143) { return 0xfe3D84A2Ef306FEBb5452441C9BDBb6521666F6A; } else { return 0x8A12B6C64121920110aE58F7cd67DfEc21c6a4C3; } } } } } else { if (routeId < 153) { if (routeId < 149) { if (routeId < 147) { if (routeId == 145) { return 0x76c4d9aFC4717a2BAac4e5f26CccF02351f7a3DA; } else { return 0xd4719BA550E397aeAcca1Ad2201c1ba69024FAAf; } } else { if (routeId == 147) { return 0x9646126Ce025224d1682C227d915a386efc0A1Fb; } else { return 0x4DD8Af2E3F2044842f0247920Bc4BABb636915ea; } } } else { if (routeId < 151) { if (routeId == 149) { return 0x8e8a327183Af0cf8C2ece9F0ed547C42A160D409; } else { return 0x9D49614CaE1C685C71678CA6d8CDF7584bfd0740; } } else { if (routeId == 151) { return 0x5a00ef257394cbc31828d48655E3d39e9c11c93d; } else { return 0xC9a2751b38d3dDD161A41Ca0135C5C6c09EC1d56; } } } } else { if (routeId < 157) { if (routeId < 155) { if (routeId == 153) { return 0x7e1c261640a525C94Ca4f8c25b48CF754DD83590; } else { return 0x409Fe24ba6F6BD5aF31C1aAf8059b986A3158233; } } else { if (routeId == 155) { return 0x704Cf5BFDADc0f55fDBb53B6ed8B582E018A72A2; } else { return 0x3982bF65d7d6E77E3b6661cd6F6468c247512737; } } } else { if (routeId < 159) { if (routeId == 157) { return 0x3982b9f26FFD67a13Ee371e2C0a9Da338BA70E7f; } else { return 0x6D834AB385900c1f49055D098e90264077FbC4f2; } } else { if (routeId == 159) { return 0x11FE5F70779A094B7166B391e1Fb73d422eF4e4d; } else { return 0xD347e4E47280d21F13B73D89c6d16f867D50DD13; } } } } } } else { if (routeId < 177) { if (routeId < 169) { if (routeId < 165) { if (routeId < 163) { if (routeId == 161) { return 0xb6035eDD53DDA28d8B69b4ae9836E40C80306CD7; } else { return 0x54c884e6f5C7CcfeCA990396c520C858c922b6CA; } } else { if (routeId == 163) { return 0x5eA93E240b083d686558Ed607BC013d88057cE46; } else { return 0x4C7131eE812De685cBe4e2cCb033d46ecD46612E; } } } else { if (routeId < 167) { if (routeId == 165) { return 0xc1a5Be9F0c33D8483801D702111068669f81fF91; } else { return 0x9E5fAb91455Be5E5b2C05967E73F456c8118B1Fc; } } else { if (routeId == 167) { return 0x3d9A05927223E0DC2F382831770405885e22F0d8; } else { return 0x6303A011fB6063f5B1681cb5a9938EA278dc6128; } } } } else { if (routeId < 173) { if (routeId < 171) { if (routeId == 169) { return 0xe9c60795c90C66797e4c8E97511eA07CdAda32bE; } else { return 0xD56cC98e69A1e13815818b466a8aA6163d84234A; } } else { if (routeId == 171) { return 0x47EbB9D36a6e40895316cD894E4860D774E2c531; } else { return 0xA5EB293629410065d14a7B1663A67829b0618292; } } } else { if (routeId < 175) { if (routeId == 173) { return 0x1b3B4C8146F939cE00899db8B3ddeF0062b7E023; } else { return 0x257Bbc11653625EbfB6A8587eF4f4FBe49828EB3; } } else { if (routeId == 175) { return 0x44cc979C01b5bB1eAC21301E73C37200dFD06F59; } else { return 0x2972fDF43352225D82754C0174Ff853819D1ef2A; } } } } } else { if (routeId < 185) { if (routeId < 181) { if (routeId < 179) { if (routeId == 177) { return 0x3e54144f032648A04D62d79f7B4b93FF3aC2333b; } else { return 0x444016102dB8adbE73C3B6703a1ea7F2f75A510D; } } else { if (routeId == 179) { return 0xac079143f98a6eb744Fde34541ebF243DF5B5dED; } else { return 0xAe9010767Fb112d29d35CEdfba2b372Ad7A308d3; } } } else { if (routeId < 183) { if (routeId == 181) { return 0xfE0BCcF9cCC2265D5fB3450743f17DfE57aE1e56; } else { return 0x04ED8C0545716119437a45386B1d691C63234C7D; } } else { if (routeId == 183) { return 0x636c14013e531A286Bc4C848da34585f0bB73d59; } else { return 0x2Fa67fc7ECC5cAA01C653d3BFeA98ecc5db9C42A; } } } } else { if (routeId < 189) { if (routeId < 187) { if (routeId == 185) { return 0x23e9a0FC180818aA872D2079a985217017E97bd9; } else { return 0x79A95c3Ef81b3ae64ee03A9D5f73e570495F164E; } } else { if (routeId == 187) { return 0xa7EA0E88F04a84ba0ad1E396cb07Fa3fDAD7dF6D; } else { return 0xd23cA1278a2B01a3C0Ca1a00d104b11c1Ebe6f42; } } } else { if (routeId < 191) { if (routeId == 189) { return 0x707bc4a9FA2E349AED5df4e9f5440C15aA9D14Bd; } else { return 0x7E290F2dd539Ac6CE58d8B4C2B944931a1fD3612; } } else { if (routeId == 191) { return 0x707AA5503088Ce06Ba450B6470A506122eA5c8eF; } else { return 0xFbB3f7BF680deeb149f4E7BC30eA3DDfa68F3C3f; } } } } } } } else { if (routeId < 225) { if (routeId < 209) { if (routeId < 201) { if (routeId < 197) { if (routeId < 195) { if (routeId == 193) { return 0xDE74aD8cCC3dbF14992f49Cf24f36855912f4934; } else { return 0x409BA83df7777F070b2B50a10a41DE2468d2a3B3; } } else { if (routeId == 195) { return 0x5CB7Be90A5DD7CfDa54e87626e254FE8C18255B4; } else { return 0x0A684fE12BC64fb72B59d0771a566F49BC090356; } } } else { if (routeId < 199) { if (routeId == 197) { return 0xDf30048d91F8FA2bCfC54952B92bFA8e161D3360; } else { return 0x050825Fff032a547C47061CF0696FDB0f65AEa5D; } } else { if (routeId == 199) { return 0xd55e671dAC1f03d366d8535073ada5DB2Aab1Ea2; } else { return 0x9470C704A9616c8Cd41c595Fcd2181B6fe2183C2; } } } } else { if (routeId < 205) { if (routeId < 203) { if (routeId == 201) { return 0x2D9ffD275181F5865d5e11CbB4ced1521C4dF9f1; } else { return 0x816d28Dec10ec95DF5334f884dE85cA6215918d8; } } else { if (routeId == 203) { return 0xd1f87267c4A43835E666dd69Df077e578A3b6299; } else { return 0x39E89Bde9DACbe5468C025dE371FbDa12bDeBAB1; } } } else { if (routeId < 207) { if (routeId == 205) { return 0x7b40A3207956ecad6686E61EfcaC48912FcD0658; } else { return 0x090cF10D793B1Efba9c7D76115878814B663859A; } } else { if (routeId == 207) { return 0x312A59c06E41327878F2063eD0e9c282C1DA3AfC; } else { return 0x4F1188f46236DD6B5de11Ebf2a9fF08716E7DeB6; } } } } } else { if (routeId < 217) { if (routeId < 213) { if (routeId < 211) { if (routeId == 209) { return 0x0A6F9a3f4fA49909bBfb4339cbE12B42F53BbBeD; } else { return 0x01d13d7aCaCbB955B81935c80ffF31e14BdFa71f; } } else { if (routeId == 211) { return 0x691a14Fa6C7360422EC56dF5876f84d4eDD7f00A; } else { return 0x97Aad18d886d181a9c726B3B6aE15a0A69F5aF73; } } } else { if (routeId < 215) { if (routeId == 213) { return 0x2917241371D2099049Fa29432DC46735baEC33b4; } else { return 0x5F20F20F7890c2e383E29D4147C9695A371165f5; } } else { if (routeId == 215) { return 0xeC0a60e639958335662C5219A320cCEbb56C6077; } else { return 0x96d63CF5062975C09845d17ec672E10255866053; } } } } else { if (routeId < 221) { if (routeId < 219) { if (routeId == 217) { return 0xFF57429e57D383939CAB50f09ABBfB63C0e6c9AD; } else { return 0x18E393A7c8578fb1e235C242076E50013cDdD0d7; } } else { if (routeId == 219) { return 0xE7E5238AF5d61f52E9B4ACC025F713d1C0216507; } else { return 0x428401D4d0F25A2EE1DA4d5366cB96Ded425D9bD; } } } else { if (routeId < 223) { if (routeId == 221) { return 0x42E5733551ff1Ee5B48Aa9fc2B61Af9b58C812E6; } else { return 0x64Df9c7A0551B056d860Bc2419Ca4c1EF75320bE; } } else { if (routeId == 223) { return 0x46006925506145611bBf0263243D8627dAf26B0F; } else { return 0x8D64BE884314662804eAaB884531f5C50F4d500c; } } } } } } else { if (routeId < 241) { if (routeId < 233) { if (routeId < 229) { if (routeId < 227) { if (routeId == 225) { return 0x157a62D92D07B5ce221A5429645a03bBaCE85373; } else { return 0xaF037D33e1F1F2F87309B425fe8a9d895Ef3722B; } } else { if (routeId == 227) { return 0x921D1154E494A2f7218a37ad7B17701f94b4B40e; } else { return 0xF282b4555186d8Dea51B8b3F947E1E0568d09bc4; } } } else { if (routeId < 231) { if (routeId == 229) { return 0xa794E2E1869765a4600b3DFd8a4ebcF16350f6B6; } else { return 0xFEFb048e20c5652F7940A49B1980E0125Ec4D358; } } else { if (routeId == 231) { return 0x220104b641971e9b25612a8F001bf48AbB23f1cF; } else { return 0xcB9D373Bb54A501B35dd3be5bF4Ba43cA31F7035; } } } } else { if (routeId < 237) { if (routeId < 235) { if (routeId == 233) { return 0x37D627F56e3FF36aC316372109ea82E03ac97DAc; } else { return 0x4E81355FfB4A271B4EA59ff78da2b61c7833161f; } } else { if (routeId == 235) { return 0xADd8D65cAF6Cc9ad73127B49E16eA7ac29d91e87; } else { return 0x630F9b95626487dfEAe3C97A44DB6C59cF35d996; } } } else { if (routeId < 239) { if (routeId == 237) { return 0x78CE2BC8238B679680A67FCB98C5A60E4ec17b2D; } else { return 0xA38D776028eD1310b9A6b086f67F788201762E21; } } else { if (routeId == 239) { return 0x7Bb5178827B76B86753Ed62a0d662c72cEcb1bD3; } else { return 0x4faC26f61C76eC5c3D43b43eDfAFF0736Ae0e3da; } } } } } else { if (routeId < 249) { if (routeId < 245) { if (routeId < 243) { if (routeId == 241) { return 0x791Bb49bfFA7129D6889FDB27744422Ac4571A85; } else { return 0x26766fFEbb5fa564777913A6f101dF019AB32afa; } } else { if (routeId == 243) { return 0x05e98E5e95b4ECBbbAf3258c3999Cc81ed8048Be; } else { return 0xC5c4621e52f1D6A1825A5ed4F95855401a3D9C6b; } } } else { if (routeId < 247) { if (routeId == 245) { return 0xfcb15f909BA7FC7Ea083503Fb4c1020203c107EB; } else { return 0xbD27603279d969c74f2486ad14E71080829DFd38; } } else { if (routeId == 247) { return 0xff2f756BcEcC1A55BFc09a30cc5F64720458cFCB; } else { return 0x3bfB968FEbC12F4e8420B2d016EfcE1E615f7246; } } } } else { if (routeId < 253) { if (routeId < 251) { if (routeId == 249) { return 0x982EE9Ffe23051A2ec945ed676D864fa8345222b; } else { return 0xe101899100785E74767d454FFF0131277BaD48d9; } } else { if (routeId == 251) { return 0x4F730C0c6b3B5B7d06ca511379f4Aa5BfB2E9525; } else { return 0x5499c36b365795e4e0Ef671aF6C2ce26D7c78265; } } } else { if (routeId < 255) { if (routeId == 253) { return 0x8AF51F7237Fc8fB2fc3E700488a94a0aC6Ad8b5a; } else { return 0xda8716df61213c0b143F2849785FB85928084857; } } else { if (routeId == 255) { return 0xF040Cf9b1ebD11Bf28e04e80740DF3DDe717e4f5; } else { return 0xB87ba32f759D14023C7520366B844dF7f0F036C2; } } } } } } } } } else { if (routeId < 321) { if (routeId < 289) { if (routeId < 273) { if (routeId < 265) { if (routeId < 261) { if (routeId < 259) { if (routeId == 257) { return 0x0Edde681b8478F0c3194f468EdD2dB5e75c65CDD; } else { return 0x59C70900Fca06eE2aCE1BDd5A8D0Af0cc3BBA720; } } else { if (routeId == 259) { return 0x8041F0f180D17dD07087199632c45E17AeB0BAd5; } else { return 0x4fB4727064BA595995DD516b63b5921Df9B93aC6; } } } else { if (routeId < 263) { if (routeId == 261) { return 0x86e98b594565857eD098864F560915C0dAfd6Ea1; } else { return 0x70f8818E8B698EFfeCd86A513a4c87c0c380Bef6; } } else { if (routeId == 263) { return 0x78Ed227c8A897A21Da2875a752142dd80d865158; } else { return 0xd02A30BB5C3a8C51d2751A029a6fcfDE2Af9fbc6; } } } } else { if (routeId < 269) { if (routeId < 267) { if (routeId == 265) { return 0x0F00d5c5acb24e975e2a56730609f7F40aa763b8; } else { return 0xC3e2091edc2D3D9D98ba09269138b617B536834A; } } else { if (routeId == 267) { return 0xa6FbaF7F30867C9633908998ea8C3da28920E75C; } else { return 0xE6dDdcD41E2bBe8122AE32Ac29B8fbAB79CD21d9; } } } else { if (routeId < 271) { if (routeId == 269) { return 0x537aa8c1Ef6a8Eaf039dd6e1Eb67694a48195cE4; } else { return 0x96ABAC485fd2D0B03CF4a10df8BD58b8dED28300; } } else { if (routeId == 271) { return 0xda8e7D46d04Bd4F62705Cd80355BDB6d441DafFD; } else { return 0xbE50018E7a5c67E2e5f5414393e971CC96F293f2; } } } } } else { if (routeId < 281) { if (routeId < 277) { if (routeId < 275) { if (routeId == 273) { return 0xa1b3907D6CB542a4cbe2eE441EfFAA909FAb62C3; } else { return 0x6d08ee8511C0237a515013aC389e7B3968Cb1753; } } else { if (routeId == 275) { return 0x22faa5B5Fe43eAdbB52745e35a5cdA8bD5F96bbA; } else { return 0x7a673eB74D79e4868D689E7852abB5f93Ec2fD4b; } } } else { if (routeId < 279) { if (routeId == 277) { return 0x0b8531F8AFD4190b76F3e10deCaDb84c98b4d419; } else { return 0x78eABC743A93583DeE403D6b84795490e652216B; } } else { if (routeId == 279) { return 0x3A95D907b2a7a8604B59BccA08585F58Afe0Aa64; } else { return 0xf4271f0C8c9Af0F06A80b8832fa820ccE64FAda8; } } } } else { if (routeId < 285) { if (routeId < 283) { if (routeId == 281) { return 0x74b2DF841245C3748c0d31542e1335659a25C33b; } else { return 0xdFC99Fd0Ad7D16f30f295a5EEFcE029E04d0fa65; } } else { if (routeId == 283) { return 0xE992416b6aC1144eD8148a9632973257839027F6; } else { return 0x54ce55ba954E981BB1fd9399054B35Ce1f2C0816; } } } else { if (routeId < 287) { if (routeId == 285) { return 0xD4AB52f9e7E5B315Bd7471920baD04F405Ab1c38; } else { return 0x3670C990994d12837e95eE127fE2f06FD3E2104B; } } else { if (routeId == 287) { return 0xDcf190B09C47E4f551E30BBb79969c3FdEA1e992; } else { return 0xa65057B967B59677237e57Ab815B209744b9bc40; } } } } } } else { if (routeId < 305) { if (routeId < 297) { if (routeId < 293) { if (routeId < 291) { if (routeId == 289) { return 0x6Efc86B40573e4C7F28659B13327D55ae955C483; } else { return 0x06BcC25CF8e0E72316F53631b3aA7134E9f73Ae0; } } else { if (routeId == 291) { return 0x710b6414E1D53882b1FCD3A168aD5Ccd435fc6D0; } else { return 0x5Ebb2C3d78c4e9818074559e7BaE7FCc99781DC1; } } } else { if (routeId < 295) { if (routeId == 293) { return 0xAf0a409c3AEe0bD08015cfb29D89E90b6e89A88F; } else { return 0x522559d8b99773C693B80cE06DF559036295Ce44; } } else { if (routeId == 295) { return 0xB65290A5Bae838aaa7825c9ECEC68041841a1B64; } else { return 0x801b8F2068edd5Bcb659E6BDa0c425909043C420; } } } } else { if (routeId < 301) { if (routeId < 299) { if (routeId == 297) { return 0x29b5F00515d093627E0B7bd0b5c8E84F6b4cDb87; } else { return 0x652839Ae74683cbF9f1293F1019D938F87464D3E; } } else { if (routeId == 299) { return 0x5Bc95dCebDDE9B79F2b6DC76121BC7936eF8D666; } else { return 0x90db359CEA62E53051158Ab5F99811C0a07Fe686; } } } else { if (routeId < 303) { if (routeId == 301) { return 0x2c3625EedadbDcDbB5330eb0d17b3C39ff269807; } else { return 0xC3f0324471b5c9d415acD625b8d8694a4e48e001; } } else { if (routeId == 303) { return 0x8C60e7E05fa0FfB6F720233736f245134685799d; } else { return 0x98fAF2c09aa4EBb995ad0B56152993E7291a500e; } } } } } else { if (routeId < 313) { if (routeId < 309) { if (routeId < 307) { if (routeId == 305) { return 0x802c1063a861414dFAEc16bacb81429FC0d40D6e; } else { return 0x11C4AeFCC0dC156f64195f6513CB1Fb3Be0Ae056; } } else { if (routeId == 307) { return 0xEff1F3258214E31B6B4F640b4389d55715C3Be2B; } else { return 0x47e379Abe8DDFEA4289aBa01235EFF7E93758fd7; } } } else { if (routeId < 311) { if (routeId == 309) { return 0x3CC26384c3eA31dDc8D9789e8872CeA6F20cD3ff; } else { return 0xEdd9EFa6c69108FAA4611097d643E20Ba0Ed1634; } } else { if (routeId == 311) { return 0xCb93525CA5f3D371F74F3D112bC19526740717B8; } else { return 0x7071E0124EB4438137e60dF1b8DD8Af1BfB362cF; } } } } else { if (routeId < 317) { if (routeId < 315) { if (routeId == 313) { return 0x4691096EB0b78C8F4b4A8091E5B66b18e1835c10; } else { return 0x8d953c9b2d1C2137CF95992079f3A77fCd793272; } } else { if (routeId == 315) { return 0xbdCc2A3Bf6e3Ba49ff86595e6b2b8D70d8368c92; } else { return 0x95E6948aB38c61b2D294E8Bd896BCc4cCC0713cf; } } } else { if (routeId < 319) { if (routeId == 317) { return 0x607b27C881fFEE4Cb95B1c5862FaE7224ccd0b4A; } else { return 0x09D28aFA166e566A2Ee1cB834ea8e78C7E627eD2; } } else { if (routeId == 319) { return 0x9c01449b38bDF0B263818401044Fb1401B29fDfA; } else { return 0x1F7723599bbB658c051F8A39bE2688388d22ceD6; } } } } } } } else { if (routeId < 353) { if (routeId < 337) { if (routeId < 329) { if (routeId < 325) { if (routeId < 323) { if (routeId == 321) { return 0x52B71603f7b8A5d15B4482e965a0619aa3210194; } else { return 0x01c0f072CB210406653752FecFA70B42dA9173a2; } } else { if (routeId == 323) { return 0x3021142f021E943e57fc1886cAF58D06147D09A6; } else { return 0xe6f2AF38e76AB09Db59225d97d3E770942D3D842; } } } else { if (routeId < 327) { if (routeId == 325) { return 0x06a25554e5135F08b9e2eD1DEC1fc3CEd52e0B48; } else { return 0x71d75e670EE3511C8290C705E0620126B710BF8D; } } else { if (routeId == 327) { return 0x8b9cE142b80FeA7c932952EC533694b1DF9B3c54; } else { return 0xd7Be24f32f39231116B3fDc483C2A12E1521f73B; } } } } else { if (routeId < 333) { if (routeId < 331) { if (routeId == 329) { return 0xb40cafBC4797d4Ff64087E087F6D2e661f954CbE; } else { return 0xBdDCe7771EfEe81893e838f62204A4c76D72757e; } } else { if (routeId == 331) { return 0x5d3D299EA7Fd4F39AcDb336E26631Dfee41F9287; } else { return 0x6BfEE09E1Fc0684e0826A9A0dC1352a14B136FAC; } } } else { if (routeId < 335) { if (routeId == 333) { return 0xd0001bB8E2Cb661436093f96458a4358B5156E3c; } else { return 0x1867c6485CfD1eD448988368A22bfB17a7747293; } } else { if (routeId == 335) { return 0x8997EF9F95dF24aB67703AB6C262aABfeEBE33bD; } else { return 0x1e39E9E601922deD91BCFc8F78836302133465e2; } } } } } else { if (routeId < 345) { if (routeId < 341) { if (routeId < 339) { if (routeId == 337) { return 0x8A8ec6CeacFf502a782216774E5AF3421562C6ff; } else { return 0x3B8FC561df5415c8DC01e97Ee6E38435A8F9C40A; } } else { if (routeId == 339) { return 0xD5d5f5B37E67c43ceA663aEDADFFc3a93a2065B0; } else { return 0xCC8F55EC43B4f25013CE1946FBB740c43Be5B96D; } } } else { if (routeId < 343) { if (routeId == 341) { return 0x18f586E816eEeDbb57B8011239150367561B58Fb; } else { return 0xd0CD802B19c1a52501cb2f07d656e3Cd7B0Ce124; } } else { if (routeId == 343) { return 0xe0AeD899b39C6e4f2d83e4913a1e9e0cf6368abE; } else { return 0x0606e1b6c0f1A398C38825DCcc4678a7Cbc2737c; } } } } else { if (routeId < 349) { if (routeId < 347) { if (routeId == 345) { return 0x2d188e85b27d18EF80f16686EA1593ABF7Ed2A63; } else { return 0x64412292fA4A135a3300E24366E99ff59Db2eAc1; } } else { if (routeId == 347) { return 0x38b74c173f3733E8b90aAEf0e98B89791266149F; } else { return 0x36DAA49A79aaEF4E7a217A11530D3cCD84414124; } } } else { if (routeId < 351) { if (routeId == 349) { return 0x10f088FE2C88F90270E4449c46c8B1b232511d58; } else { return 0x4FeDbd25B58586838ABD17D10272697dF1dC3087; } } else { if (routeId == 351) { return 0x685278209248CB058E5cEe93e37f274A80Faf6eb; } else { return 0xDd9F8F1eeC3955f78168e2Fb2d1e808fa8A8f15b; } } } } } } else { if (routeId < 369) { if (routeId < 361) { if (routeId < 357) { if (routeId < 355) { if (routeId == 353) { return 0x7392aEeFD5825aaC28817031dEEBbFaAA20983D9; } else { return 0x0Cc182555E00767D6FB8AD161A10d0C04C476d91; } } else { if (routeId == 355) { return 0x90E52837d56715c79FD592E8D58bFD20365798b2; } else { return 0x6F4451DE14049B6770ad5BF4013118529e68A40C; } } } else { if (routeId < 359) { if (routeId == 357) { return 0x89B97ef2aFAb9ed9c7f0FDb095d02E6840b52d9c; } else { return 0x92A5cC5C42d94d3e23aeB1214fFf43Db2B97759E; } } else { if (routeId == 359) { return 0x63ddc52F135A1dcBA831EAaC11C63849F018b739; } else { return 0x692A691533B571C2c54C1D7F8043A204b3d8120E; } } } } else { if (routeId < 365) { if (routeId < 363) { if (routeId == 361) { return 0x97c7492CF083969F61C6f302d45c8270391b921c; } else { return 0xDeFD2B8643553dAd19548eB14fd94A57F4B9e543; } } else { if (routeId == 363) { return 0x30645C04205cA3f670B67b02F971B088930ACB8C; } else { return 0xA6f80ed2d607Cd67aEB4109B64A0BEcc4D7d03CF; } } } else { if (routeId < 367) { if (routeId == 365) { return 0xBbbbC6c276eB3F7E674f2D39301509236001c42f; } else { return 0xC20E77d349FB40CE88eB01824e2873ad9f681f3C; } } else { if (routeId == 367) { return 0x5fCfD9a962De19294467C358C1FA55082285960b; } else { return 0x4D87BD6a0E4E5cc6332923cb3E85fC71b287F58A; } } } } } else { if (routeId < 377) { if (routeId < 373) { if (routeId < 371) { if (routeId == 369) { return 0x3AA5B757cd6Dde98214E56D57Dde7fcF0F7aB04E; } else { return 0xe28eFCE7192e11a2297f44059113C1fD6967b2d4; } } else { if (routeId == 371) { return 0x3251cAE10a1Cf246e0808D76ACC26F7B5edA0eE5; } else { return 0xbA2091cc9357Cf4c4F25D64F30d1b4Ba3A5a174B; } } } else { if (routeId < 375) { if (routeId == 373) { return 0x49c8e1Da9693692096F63C82D11b52d738566d55; } else { return 0xA0731615aB5FFF451031E9551367A4F7dB27b39c; } } else { if (routeId == 375) { return 0xFb214541888671AE1403CecC1D59763a12fc1609; } else { return 0x1D6bCB17642E2336405df73dF22F07688cAec020; } } } } else { if (routeId < 381) { if (routeId < 379) { if (routeId == 377) { return 0xfC9c0C7bfe187120fF7f4E21446161794A617a9e; } else { return 0xBa5bF37678EeE2dAB17AEf9D898153258252250E; } } else { if (routeId == 379) { return 0x7c55690bd2C9961576A32c02f8EB29ed36415Ec7; } else { return 0xcA40073E868E8Bc611aEc8Fe741D17E68Fe422f6; } } } else { if (routeId < 383) { if (routeId == 381) { return 0x31641bAFb87E9A58f78835050a7BE56921986339; } else { return 0xA54766424f6dA74b45EbCc5Bf0Bd1D74D2CCcaAB; } } else { if (routeId == 383) { return 0xc7bBa57F8C179EDDBaa62117ddA360e28f3F8252; } else { return 0x5e663ED97ea77d393B8858C90d0683bF180E0ffd; } } } } } } } } } if (routes[routeId] == address(0)) revert ZeroAddressNotAllowed(); return routes[routeId]; } /// @notice fallback function to handle swap, bridge execution /// @dev ensure routeId is converted to bytes4 and sent as msg.sig in the transaction fallback() external payable { address routeAddress = addressAt(uint32(msg.sig)); bytes memory result; assembly { // copy function selector and any arguments calldatacopy(0, 4, sub(calldatasize(), 4)) // execute function call using the facet result := delegatecall( gas(), routeAddress, 0, sub(calldatasize(), 4), 0, 0 ) // get any return value returndatacopy(0, 0, returndatasize()) // return any return value or error back to the caller switch result case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.4; import {OnlyOwner, OnlyNominee} from "../errors/SocketErrors.sol"; abstract contract Ownable { address private _owner; address private _nominee; event OwnerNominated(address indexed nominee); event OwnerClaimed(address indexed claimer); constructor(address owner_) { _claimOwner(owner_); } modifier onlyOwner() { if (msg.sender != _owner) { revert OnlyOwner(); } _; } function owner() public view returns (address) { return _owner; } function nominee() public view returns (address) { return _nominee; } function nominateOwner(address nominee_) external { if (msg.sender != _owner) { revert OnlyOwner(); } _nominee = nominee_; emit OwnerNominated(_nominee); } function claimOwner() external { if (msg.sender != _nominee) { revert OnlyNominee(); } _claimOwner(msg.sender); } function _claimOwner(address claimer_) internal { _owner = claimer_; _nominee = address(0); emit OwnerClaimed(claimer_); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./LibBytes.sol"; /// @title LibUtil library /// @notice library with helper functions to operate on bytes-data and addresses /// @author socket dot tech library LibUtil { /// @notice LibBytes library to handle operations on bytes using LibBytes for bytes; /// @notice function to extract revertMessage from bytes data /// @dev use the revertMessage and then further revert with a custom revert and message /// @param _res bytes data received from the transaction call function getRevertMsg( bytes memory _res ) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_res.length < 68) { return "Transaction reverted silently"; } bytes memory revertData = _res.slice(4, _res.length - 4); // Remove the selector which is the first 4 bytes return abi.decode(revertData, (string)); // All that remains is the revert string } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; // Functions taken out from https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol library LibBytes { // solhint-disable no-inline-assembly // LibBytes specific errors error SliceOverflow(); error SliceOutOfBounds(); error AddressOutOfBounds(); error UintOutOfBounds(); // ------------------------- function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore( 0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. ) ) } return tempBytes; } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { if (_length + 31 < _length) { revert SliceOverflow(); } if (_bytes.length < _start + _length) { revert SliceOutOfBounds(); } bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add( add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)) ) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add( add( add(_bytes, lengthmod), mul(0x20, iszero(lengthmod)) ), _start ) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @title ISocketRoute * @notice Interface for routeManagement functions in SocketGateway. * @author Socket dot tech. */ interface ISocketRoute { /** * @notice Add route to the socketGateway This is a restricted function to be called by only socketGatewayOwner * @dev ensure routeAddress is a verified bridge or middleware implementation address * @param routeAddress The address of bridge or middleware implementation contract deployed * @return Id of the route added to the routes-mapping in socketGateway storage */ function addRoute(address routeAddress) external returns (uint256); /** * @notice disable a route by setting ZeroAddress to the entry in routes-mapping identified by routeId as key. This is a restricted function to be called by only socketGatewayOwner * @param routeId The Id of route-implementation in the routes mapping */ function disableRoute(uint32 routeId) external; /** * @notice Get routeImplementation address mapped to the routeId * @param routeId routeId is the key in the mapping for routes * @return route-implementation address */ function getRoute(uint32 routeId) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @title ISocketGateway * @notice Interface for SocketGateway functions. * @dev functions can be added here for invocation from external contracts or off-chain * @author Socket dot tech. */ interface ISocketGateway { /** * @notice Request-struct for controllerRequests * @dev ensure the value for data is generated using the function-selectors defined in the controllerImplementation contracts */ struct SocketControllerRequest { // controllerId is the id mapped to the controllerAddress uint32 controllerId; // transactionImplData generated off-chain or by caller using function-selector of the controllerContract bytes data; } // @notice view to get owner-address function owner() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @title ISocketRoute * @notice Interface with Request DataStructures to invoke controller functions. * @author Socket dot tech. */ interface ISocketRequest { struct SwapMultiBridgeRequest { uint32 swapRouteId; bytes swapImplData; uint32[] bridgeRouteIds; bytes[] bridgeImplDataItems; uint256[] bridgeRatios; bytes[] eventDataItems; } // Datastructure for Refuel-Swap-Bridge function struct RefuelSwapBridgeRequest { uint32 refuelRouteId; bytes refuelData; uint32 swapRouteId; bytes swapData; uint32 bridgeRouteId; bytes bridgeData; } // Datastructure for DeductFees-Swap function struct FeesTakerSwapRequest { address feesTakerAddress; address feesToken; uint256 feesAmount; uint32 routeId; bytes swapRequestData; } // Datastructure for DeductFees-Bridge function struct FeesTakerBridgeRequest { address feesTakerAddress; address feesToken; uint256 feesAmount; uint32 routeId; bytes bridgeRequestData; } // Datastructure for DeductFees-MultiBridge function struct FeesTakerMultiBridgeRequest { address feesTakerAddress; address feesToken; uint256 feesAmount; uint32[] bridgeRouteIds; bytes[] bridgeRequestDataItems; } // Datastructure for DeductFees-Swap-Bridge function struct FeesTakerSwapBridgeRequest { address feesTakerAddress; address feesToken; uint256 feesAmount; uint32 swapRouteId; bytes swapData; uint32 bridgeRouteId; bytes bridgeData; } // Datastructure for DeductFees-Refuel-Swap-Bridge function struct FeesTakerRefuelSwapBridgeRequest { address feesTakerAddress; address feesToken; uint256 feesAmount; uint32 refuelRouteId; bytes refuelData; uint32 swapRouteId; bytes swapData; uint32 bridgeRouteId; bytes bridgeData; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; error CelerRefundNotReady(); error OnlySocketDeployer(); error OnlySocketGatewayOwner(); error OnlySocketGateway(); error OnlyOwner(); error OnlyNominee(); error TransferIdExists(); error TransferIdDoesnotExist(); error Address0Provided(); error SwapFailed(); error UnsupportedInterfaceId(); error InvalidCelerRefund(); error CelerAlreadyRefunded(); error IncorrectBridgeRatios(); error ZeroAddressNotAllowed(); error ArrayLengthMismatch(); error PartialSwapsNotAllowed();
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {ERC20} from "../tokens/ERC20.sol"; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument. mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "TRANSFER_FAILED"); } function safeApprove( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "APPROVE_FAILED"); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_disabledRoute","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"IncorrectBridgeRatios","type":"error"},{"inputs":[],"name":"OnlyNominee","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"ZeroAddressNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"controllerId","type":"uint32"},{"indexed":true,"internalType":"address","name":"controllerAddress","type":"address"}],"name":"ControllerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"controllerId","type":"uint32"}],"name":"ControllerDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"routeId","type":"uint32"},{"indexed":true,"internalType":"address","name":"route","type":"address"}],"name":"NewRouteAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"}],"name":"OwnerClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nominee","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"routeId","type":"uint32"}],"name":"RouteDisabled","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BRIDGE_AFTER_SWAP_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CENT_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controllerAddress","type":"address"}],"name":"addController","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"routeAddress","type":"address"}],"name":"addRoute","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"routeId","type":"uint32"}],"name":"addressAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controllerCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"controllers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"controllerId","type":"uint32"}],"name":"disableController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"routeId","type":"uint32"}],"name":"disableRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disabledRouteAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"controllerId","type":"uint32"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ISocketGateway.SocketControllerRequest","name":"socketControllerRequest","type":"tuple"}],"name":"executeController","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"controllerId","type":"uint32"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ISocketGateway.SocketControllerRequest[]","name":"controllerRequests","type":"tuple[]"}],"name":"executeControllers","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"routeId","type":"uint32"},{"internalType":"bytes","name":"routeData","type":"bytes"}],"name":"executeRoute","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"routeIds","type":"uint32[]"},{"internalType":"bytes[]","name":"dataItems","type":"bytes[]"}],"name":"executeRoutes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"controllerId","type":"uint32"}],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"routeId","type":"uint32"}],"name":"getRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nominee_","type":"address"}],"name":"nominateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"routes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routesCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"routeAddresses","type":"address[]"},{"internalType":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"bool","name":"isMax","type":"bool"}],"name":"setApprovalForRouters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"swapRouteId","type":"uint32"},{"internalType":"bytes","name":"swapImplData","type":"bytes"},{"internalType":"uint32[]","name":"bridgeRouteIds","type":"uint32[]"},{"internalType":"bytes[]","name":"bridgeImplDataItems","type":"bytes[]"},{"internalType":"uint256[]","name":"bridgeRatios","type":"uint256[]"},{"internalType":"bytes[]","name":"eventDataItems","type":"bytes[]"}],"internalType":"struct ISocketRequest.SwapMultiBridgeRequest","name":"swapMultiBridgeRequest","type":"tuple"}],"name":"swapAndMultiBridge","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000641702b8f558ffc8176e4fd92da38041741fa50f3ad2baaade4167c26d600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000040000000000000000000000000b0bbff6311b7f245761a7846d3ce7b1b100c18360000000000000000000000008517d2b4a9df18034dd00ccb5940fa4dcfad7219
Deployed Bytecode
0x0004000000000002000b0000000000020000006004100270000004690340019700030000003103550002000000010355000004690040019d00000001002001900000079b0000c13d0000008002000039000000400020043f000000040030008c000007e70000413d000000000201043b000000e002200270000004740020009c000000930000c13d000000240030008c00000b250000413d0000000402100370000000000402043b000004970040009c00000b250000213d0000000002430049000006250020009c00000b250000213d000000c40020008c00000b250000413d000000040240003900000000052300490000004407400039000000000471034f000000000604043b0000001f0450008a0000061b054001970000061b08600197000000000958013f000000000058004b00000000080000190000061b08004041000000000046004b000000000a0000190000061b0a0080410000061b0090009c00000000080ac019000000000008004b00000b250000c13d0000000008260019000000000681034f000000000606043b000004970060009c00000b250000213d000000050960021000000000099300490000002008800039000000000098004b000000000a0000190000061b0a0020410000061b099001970000061b08800197000000000b98013f000000000098004b00000000080000190000061b080040410000061b00b0009c00000000080ac019000000000008004b00000b250000c13d0000002007700039000000000871034f000000000808043b0000061b09800197000000000a59013f000000000059004b00000000090000190000061b09004041000000000048004b000000000b0000190000061b0b0080410000061b00a0009c00000000090bc019000000000009004b00000b250000c13d0000000009280019000000000891034f000000000808043b000004970080009c00000b250000213d000000050a800210000000000aa3004900000020099000390000000000a9004b000000000b0000190000061b0b0020410000061b0aa001970000061b09900197000000000ca9013f0000000000a9004b00000000090000190000061b090040410000061b00c0009c00000000090bc019000000000009004b00000b250000c13d000000000086004b000007970000c13d000000000006004b00000b270000613d0000002006700039000000000661034f000000000606043b0000061b07600197000000000857013f000000000057004b00000000050000190000061b05004041000000000046004b00000000040000190000061b040080410000061b0080009c000000000504c019000000000005004b00000b250000c13d0000000002260019000000000121034f000000000101043b000004970010009c00000b250000213d000000200220003900000005041002100000000003430049000000000032004b00000000040000190000061b040020410000061b033001970000061b02200197000000000532013f000000000032004b00000000020000190000061b020040410000061b0050009c000000000204c019000000000002004b00000b250000c13d000000000001004b00000c490000613d000000920000013d000004750020009c000006b80000a13d000004760020009c000006c70000a13d000004770020009c000007330000a13d000004780020009c000007800000213d0000047b0020009c000007eb0000613d0000047c0020009c00000b2d0000c13d000000440030008c00000b250000413d0000000402100370000000000202043b000004970020009c00000b250000213d0000002304200039000000000034004b00000b250000813d0000000404200039000000000441034f000000000404043b000300000004001d000004970040009c00000b250000213d000100240020003d000000030200002900000005022002100000000102200029000000000032004b00000b250000213d0000002402100370000000000202043b000200000002001d000004970020009c00000b250000213d00000002020000290000002302200039000000000032004b00000b250000813d00000002020000290000000402200039000000000121034f000000000101043b000004970010009c00000b250000213d0000000202000029000500240020003d00000005021002100000000502200029000000000032004b00000b250000213d000000030010006b000007970000c13d000000030000006b000007e90000613d000600000000001d00000006010000290000000502100210000400000002001d00000001012000290000000201100367000000000101043b000700000001001d000004690010009c00000b250000213d0000000701000029000001800010008c000000f00000213d000001000010008c000001940000a13d000001410010008c000001ab0000413d0000000701000029000001610010008c000001d20000413d0000000701000029000001710010008c000002140000413d0000000701000029000001790010008c000002800000413d00000007010000290000017d0010008c000003280000413d00000007010000290000017f0010008c000004180000413d0000061a020000410000061902006041000001100000013d000000000010043f0000000201000039000000200010043f0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f000000010020019000000b250000613d000000000101043b000000000101041a0000046c0010019800000cae0000613d0000000701000029000000000010043f0000000201000039000000200010043f0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f000000010020019000000b250000613d000000000101043b000000000101041a0000046c02100197000000040300002900000005013000290000000203000367000000000113034f000000000101043b0000000004000031000000020540006a000000430550008a0000061b065001970000061b07100197000000000867013f000000000067004b00000000060000190000061b06004041000000000051004b00000000050000190000061b050080410000061b0080009c000000000605c019000000000006004b00000b250000c13d0000000505100029000000000153034f000000000101043b000004970010009c00000b250000213d000000000614004900000020045000390000061b056001970000061b07400197000000000857013f000000000057004b00000000050000190000061b05004041000000000064004b00000000060000190000061b060020410000061b0080009c000000000506c019000000000005004b00000b250000c13d000000000543034f0000063e06100198000000400300043d0000000004630019000001440000613d000000000705034f0000000008030019000000007907043c0000000008980436000000000048004b000001400000c13d0000001f07100190000001510000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500000000041300190000000000040435000004690010009c00000469010080410000006001100210000004690030009c00000469030080410000004003300210000000000113019f0000000003000414000004690030009c0000046903008041000000c003300210000000000113019f11a0119b0000040f00030000000103550000006003100270000104690030019d0000046905300198000000800400003900000060030000390000018c0000613d0000001f035000390000046a033001970000003f033000390000061c04300197000000400300043d0000000004430019000000000034004b00000000060000390000000106004039000004970040009c000008d60000213d0000000100600190000008d60000c13d000000400040043f00000000045304360000046b0750019800000000067400190000017f0000613d000000000801034f0000000009040019000000008a08043c0000000009a90436000000000069004b0000017b0000c13d0000001f055001900000018c0000613d000000000171034f0000000305500210000000000706043300000000075701cf000000000757022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000171019f0000000000160435000000010020019000000c7b0000613d00000006020000290000000102200039000600000002001d000000030020006c000000ce0000413d000007e90000013d000000810010008c000001bd0000413d0000000701000029000000c10010008c000001e10000413d0000000701000029000000e10010008c000002200000413d0000000701000029000000f10010008c000002890000413d0000000701000029000000f90010008c0000032e0000413d0000000701000029000000fd0010008c0000041d0000413d0000000701000029000000ff0010008c000005780000413d0000059a020000410000059902006041000001100000013d0000000701000029000001210010008c000001f30000413d0000000701000029000001310010008c0000022f0000413d0000000701000029000001390010008c000002950000413d00000007010000290000013d0010008c000003370000413d00000007010000290000013f0010008c000004230000413d000005da02000041000005d902006041000001100000013d0000000701000029000000410010008c000002020000413d0000000701000029000000610010008c0000023b0000413d0000000701000029000000710010008c0000029e0000413d0000000701000029000000790010008c0000033d0000413d00000007010000290000007d0010008c000004280000413d00000007010000290000007f0010008c0000057d0000413d0000051a020000410000051902006041000001100000013d0000000701000029000001510010008c0000024a0000413d0000000701000029000001590010008c000002aa0000413d00000007010000290000015d0010008c000003460000413d00000007010000290000015f0010008c0000042e0000413d000005fa02000041000005f902006041000001100000013d0000000701000029000000a10010008c000002560000413d0000000701000029000000b10010008c000002b30000413d0000000701000029000000b90010008c0000034c0000413d0000000701000029000000bd0010008c000004330000413d0000000701000029000000bf0010008c000005820000413d0000055a020000410000055902006041000001100000013d0000000701000029000001110010008c000002650000413d0000000701000029000001190010008c000002bf0000413d00000007010000290000011d0010008c000003550000413d00000007010000290000011f0010008c000004390000413d000005ba02000041000005b902006041000001100000013d0000000701000029000000210010008c000002710000413d0000000701000029000000310010008c000002c80000413d0000000701000029000000390010008c0000035b0000413d00000007010000290000003d0010008c0000043e0000413d00000007010000290000003f0010008c000005870000413d000004da02000041000004d902006041000001100000013d0000000701000029000001690010008c000002d40000413d00000007010000290000016d0010008c000003640000413d00000007010000290000016f0010008c000004440000413d0000060a020000410000060902006041000001100000013d0000000701000029000000d10010008c000002dd0000413d0000000701000029000000d90010008c0000036a0000413d0000000701000029000000dd0010008c000004490000413d0000000701000029000000df0010008c0000058c0000413d0000057a020000410000057902006041000001100000013d0000000701000029000001290010008c000002e90000413d00000007010000290000012d0010008c000003730000413d00000007010000290000012f0010008c0000044f0000413d000005ca02000041000005c902006041000001100000013d0000000701000029000000510010008c000002f20000413d0000000701000029000000590010008c000003790000413d00000007010000290000005d0010008c000004540000413d00000007010000290000005f0010008c000005910000413d000004fa02000041000004f902006041000001100000013d0000000701000029000001490010008c000002fe0000413d00000007010000290000014d0010008c000003820000413d00000007010000290000014f0010008c0000045a0000413d000005ea02000041000005e902006041000001100000013d0000000701000029000000910010008c000003070000413d0000000701000029000000990010008c000003880000413d00000007010000290000009d0010008c0000045f0000413d00000007010000290000009f0010008c000005960000413d0000053a020000410000053902006041000001100000013d0000000701000029000001090010008c000003130000413d00000007010000290000010d0010008c000003910000413d00000007010000290000010f0010008c000004650000413d000005aa02000041000005a902006041000001100000013d0000000701000029000000110010008c0000031c0000413d0000000701000029000000190010008c000003970000413d00000007010000290000001d0010008c0000046a0000413d00000007010000290000001f0010008c0000059b0000413d000004ba02000041000004b902006041000001100000013d0000000701000029000001750010008c000003a00000413d0000000701000029000001770010008c000004700000413d00000612020000410000061102006041000001100000013d0000000701000029000000e90010008c000003a60000413d0000000701000029000000ed0010008c000004750000413d0000000701000029000000ef0010008c000005a00000413d0000058a020000410000058902006041000001100000013d0000000701000029000001350010008c000003af0000413d0000000701000029000001370010008c0000047b0000413d000005d202000041000005d102006041000001100000013d0000000701000029000000690010008c000003b50000413d00000007010000290000006d0010008c000004800000413d00000007010000290000006f0010008c000005a50000413d0000050a020000410000050902006041000001100000013d0000000701000029000001550010008c000003be0000413d0000000701000029000001570010008c000004860000413d000005f202000041000005f102006041000001100000013d0000000701000029000000a90010008c000003c40000413d0000000701000029000000ad0010008c0000048b0000413d0000000701000029000000af0010008c000005aa0000413d0000054a020000410000054902006041000001100000013d0000000701000029000001150010008c000003cd0000413d0000000701000029000001170010008c000004910000413d000005b202000041000005b102006041000001100000013d0000000701000029000000290010008c000003d30000413d00000007010000290000002d0010008c000004960000413d00000007010000290000002f0010008c000005af0000413d000004ca02000041000004c902006041000001100000013d0000000701000029000001650010008c000003dc0000413d0000000701000029000001670010008c0000049c0000413d00000602020000410000060102006041000001100000013d0000000701000029000000c90010008c000003e20000413d0000000701000029000000cd0010008c000004a10000413d0000000701000029000000cf0010008c000005b40000413d0000056a020000410000056902006041000001100000013d0000000701000029000001250010008c000003eb0000413d0000000701000029000001270010008c000004a70000413d000005c202000041000005c102006041000001100000013d0000000701000029000000490010008c000003f10000413d00000007010000290000004d0010008c000004ac0000413d00000007010000290000004f0010008c000005b90000413d000004ea02000041000004e902006041000001100000013d0000000701000029000001450010008c000003fa0000413d0000000701000029000001470010008c000004b20000413d000005e202000041000005e102006041000001100000013d0000000701000029000000890010008c000004000000413d00000007010000290000008d0010008c000004b70000413d00000007010000290000008f0010008c000005be0000413d0000052a020000410000052902006041000001100000013d0000000701000029000001050010008c000004090000413d0000000701000029000001070010008c000004bd0000413d000005a202000041000005a102006041000001100000013d0000000701000029000000090010008c0000040f0000413d00000007010000290000000d0010008c000004c20000413d00000007010000290000000f0010008c000005c30000413d000004aa02000041000004a902006041000001100000013d00000007010000290000017b0010008c000004c80000413d00000616020000410000061502006041000001100000013d0000000701000029000000f50010008c000004cd0000413d0000000701000029000000f70010008c000005c80000413d00000592020000410000059102006041000001100000013d00000007010000290000013b0010008c000004d30000413d000005d602000041000005d502006041000001100000013d0000000701000029000000750010008c000004d80000413d0000000701000029000000770010008c000005cd0000413d00000512020000410000051102006041000001100000013d00000007010000290000015b0010008c000004de0000413d000005f602000041000005f502006041000001100000013d0000000701000029000000b50010008c000004e30000413d0000000701000029000000b70010008c000005d20000413d00000552020000410000055102006041000001100000013d00000007010000290000011b0010008c000004e90000413d000005b602000041000005b502006041000001100000013d0000000701000029000000350010008c000004ee0000413d0000000701000029000000370010008c000005d70000413d000004d202000041000004d102006041000001100000013d00000007010000290000016b0010008c000004f40000413d00000606020000410000060502006041000001100000013d0000000701000029000000d50010008c000004f90000413d0000000701000029000000d70010008c000005dc0000413d00000572020000410000057102006041000001100000013d00000007010000290000012b0010008c000004ff0000413d000005c602000041000005c502006041000001100000013d0000000701000029000000550010008c000005040000413d0000000701000029000000570010008c000005e10000413d000004f202000041000004f102006041000001100000013d00000007010000290000014b0010008c0000050a0000413d000005e602000041000005e502006041000001100000013d0000000701000029000000950010008c0000050f0000413d0000000701000029000000970010008c000005e60000413d00000532020000410000053102006041000001100000013d00000007010000290000010b0010008c000005150000413d000005a602000041000005a502006041000001100000013d0000000701000029000000150010008c0000051a0000413d0000000701000029000000170010008c000005eb0000413d000004b202000041000004b102006041000001100000013d0000000701000029000001730010008c000005200000413d0000060e020000410000060d02006041000001100000013d0000000701000029000000e50010008c000005250000413d0000000701000029000000e70010008c000005f00000413d00000582020000410000058102006041000001100000013d0000000701000029000001330010008c0000052b0000413d000005ce02000041000005cd02006041000001100000013d0000000701000029000000650010008c000005300000413d0000000701000029000000670010008c000005f50000413d00000502020000410000050102006041000001100000013d0000000701000029000001530010008c000005360000413d000005ee02000041000005ed02006041000001100000013d0000000701000029000000a50010008c0000053b0000413d0000000701000029000000a70010008c000005fa0000413d00000542020000410000054102006041000001100000013d0000000701000029000001130010008c000005410000413d000005ae02000041000005ad02006041000001100000013d0000000701000029000000250010008c000005460000413d0000000701000029000000270010008c000005ff0000413d000004c202000041000004c102006041000001100000013d0000000701000029000001630010008c0000054c0000413d000005fe02000041000005fd02006041000001100000013d0000000701000029000000c50010008c000005510000413d0000000701000029000000c70010008c000006040000413d00000562020000410000056102006041000001100000013d0000000701000029000001230010008c000005570000413d000005be02000041000005bd02006041000001100000013d0000000701000029000000450010008c0000055c0000413d0000000701000029000000470010008c000006090000413d000004e202000041000004e102006041000001100000013d0000000701000029000001430010008c000005620000413d000005de02000041000005dd02006041000001100000013d0000000701000029000000850010008c000005670000413d0000000701000029000000870010008c0000060e0000413d00000522020000410000052102006041000001100000013d0000000701000029000001030010008c0000056d0000413d0000059e020000410000059d02006041000001100000013d0000000701000029000000050010008c000005720000413d0000000701000029000000070010008c000006130000413d000004a202000041000004a102006041000001100000013d00000007010000290000017d0010008c00000618020000410000061702006041000001100000013d0000000701000029000000fb0010008c000006180000413d00000596020000410000059502006041000001100000013d00000007010000290000013d0010008c000005d802000041000005d702006041000001100000013d00000007010000290000007b0010008c0000061d0000413d00000516020000410000051502006041000001100000013d00000007010000290000015d0010008c000005f802000041000005f702006041000001100000013d0000000701000029000000bb0010008c000006220000413d00000556020000410000055502006041000001100000013d00000007010000290000011d0010008c000005b802000041000005b702006041000001100000013d00000007010000290000003b0010008c000006270000413d000004d602000041000004d502006041000001100000013d00000007010000290000016d0010008c00000608020000410000060702006041000001100000013d0000000701000029000000db0010008c0000062c0000413d00000576020000410000057502006041000001100000013d00000007010000290000012d0010008c000005c802000041000005c702006041000001100000013d00000007010000290000005b0010008c000006310000413d000004f602000041000004f502006041000001100000013d00000007010000290000014d0010008c000005e802000041000005e702006041000001100000013d00000007010000290000009b0010008c000006360000413d00000536020000410000053502006041000001100000013d00000007010000290000010d0010008c000005a802000041000005a702006041000001100000013d00000007010000290000001b0010008c0000063b0000413d000004b602000041000004b502006041000001100000013d0000000701000029000001750010008c00000610020000410000060f02006041000001100000013d0000000701000029000000eb0010008c000006400000413d00000586020000410000058502006041000001100000013d0000000701000029000001350010008c000005d002000041000005cf02006041000001100000013d00000007010000290000006b0010008c000006450000413d00000506020000410000050502006041000001100000013d0000000701000029000001550010008c000005f002000041000005ef02006041000001100000013d0000000701000029000000ab0010008c0000064a0000413d00000546020000410000054502006041000001100000013d0000000701000029000001150010008c000005b002000041000005af02006041000001100000013d00000007010000290000002b0010008c0000064f0000413d000004c602000041000004c502006041000001100000013d0000000701000029000001650010008c0000060002000041000005ff02006041000001100000013d0000000701000029000000cb0010008c000006540000413d00000566020000410000056502006041000001100000013d0000000701000029000001250010008c000005c002000041000005bf02006041000001100000013d00000007010000290000004b0010008c000006590000413d000004e602000041000004e502006041000001100000013d0000000701000029000001450010008c000005e002000041000005df02006041000001100000013d00000007010000290000008b0010008c0000065e0000413d00000526020000410000052502006041000001100000013d0000000701000029000001050010008c000005a0020000410000059f02006041000001100000013d00000007010000290000000b0010008c000006630000413d000004a602000041000004a502006041000001100000013d0000000701000029000001790010008c00000614020000410000061302006041000001100000013d0000000701000029000000f30010008c000006680000413d0000058e020000410000058d02006041000001100000013d0000000701000029000001390010008c000005d402000041000005d302006041000001100000013d0000000701000029000000730010008c0000066d0000413d0000050e020000410000050d02006041000001100000013d0000000701000029000001590010008c000005f402000041000005f302006041000001100000013d0000000701000029000000b30010008c000006720000413d0000054e020000410000054d02006041000001100000013d0000000701000029000001190010008c000005b402000041000005b302006041000001100000013d0000000701000029000000330010008c000006770000413d000004ce02000041000004cd02006041000001100000013d0000000701000029000001690010008c00000604020000410000060302006041000001100000013d0000000701000029000000d30010008c0000067c0000413d0000056e020000410000056d02006041000001100000013d0000000701000029000001290010008c000005c402000041000005c302006041000001100000013d0000000701000029000000530010008c000006810000413d000004ee02000041000004ed02006041000001100000013d0000000701000029000001490010008c000005e402000041000005e302006041000001100000013d0000000701000029000000930010008c000006860000413d0000052e020000410000052d02006041000001100000013d0000000701000029000001090010008c000005a402000041000005a302006041000001100000013d0000000701000029000000130010008c0000068b0000413d000004ae02000041000004ad02006041000001100000013d0000000701000029000001710010008c0000060c020000410000060b02006041000001100000013d0000000701000029000000e30010008c000006900000413d0000057e020000410000057d02006041000001100000013d0000000701000029000001310010008c000005cc02000041000005cb02006041000001100000013d0000000701000029000000630010008c000006950000413d000004fe02000041000004fd02006041000001100000013d0000000701000029000001510010008c000005ec02000041000005eb02006041000001100000013d0000000701000029000000a30010008c0000069a0000413d0000053e020000410000053d02006041000001100000013d0000000701000029000001110010008c000005ac02000041000005ab02006041000001100000013d0000000701000029000000230010008c0000069f0000413d000004be02000041000004bd02006041000001100000013d0000000701000029000001610010008c000005fc02000041000005fb02006041000001100000013d0000000701000029000000c30010008c000006a40000413d0000055e020000410000055d02006041000001100000013d0000000701000029000001210010008c000005bc02000041000005bb02006041000001100000013d0000000701000029000000430010008c000006a90000413d000004de02000041000004dd02006041000001100000013d0000000701000029000001410010008c000005dc02000041000005db02006041000001100000013d0000000701000029000000830010008c000006ae0000413d0000051e020000410000051d02006041000001100000013d0000000701000029000001010010008c0000059c020000410000059b02006041000001100000013d0000000701000029000000030010008c000006b30000413d0000049e020000410000049d02006041000001100000013d0000000701000029000000fd0010008c00000598020000410000059702006041000001100000013d00000007010000290000007d0010008c00000518020000410000051702006041000001100000013d0000000701000029000000bd0010008c00000558020000410000055702006041000001100000013d00000007010000290000003d0010008c000004d802000041000004d702006041000001100000013d0000000701000029000000dd0010008c00000578020000410000057702006041000001100000013d00000007010000290000005d0010008c000004f802000041000004f702006041000001100000013d00000007010000290000009d0010008c00000538020000410000053702006041000001100000013d00000007010000290000001d0010008c000004b802000041000004b702006041000001100000013d0000000701000029000000ed0010008c00000588020000410000058702006041000001100000013d00000007010000290000006d0010008c00000508020000410000050702006041000001100000013d0000000701000029000000ad0010008c00000548020000410000054702006041000001100000013d00000007010000290000002d0010008c000004c802000041000004c702006041000001100000013d0000000701000029000000cd0010008c00000568020000410000056702006041000001100000013d00000007010000290000004d0010008c000004e802000041000004e702006041000001100000013d00000007010000290000008d0010008c00000528020000410000052702006041000001100000013d00000007010000290000000d0010008c000004a802000041000004a702006041000001100000013d0000000701000029000000f50010008c00000590020000410000058f02006041000001100000013d0000000701000029000000750010008c00000510020000410000050f02006041000001100000013d0000000701000029000000b50010008c00000550020000410000054f02006041000001100000013d0000000701000029000000350010008c000004d002000041000004cf02006041000001100000013d0000000701000029000000d50010008c00000570020000410000056f02006041000001100000013d0000000701000029000000550010008c000004f002000041000004ef02006041000001100000013d0000000701000029000000950010008c00000530020000410000052f02006041000001100000013d0000000701000029000000150010008c000004b002000041000004af02006041000001100000013d0000000701000029000000e50010008c00000580020000410000057f02006041000001100000013d0000000701000029000000650010008c0000050002000041000004ff02006041000001100000013d0000000701000029000000a50010008c00000540020000410000053f02006041000001100000013d0000000701000029000000250010008c000004c002000041000004bf02006041000001100000013d0000000701000029000000c50010008c00000560020000410000055f02006041000001100000013d0000000701000029000000450010008c000004e002000041000004df02006041000001100000013d0000000701000029000000850010008c00000520020000410000051f02006041000001100000013d0000000701000029000000050010008c000004a0020000410000049f02006041000001100000013d0000000701000029000000f90010008c00000594020000410000059302006041000001100000013d0000000701000029000000790010008c00000514020000410000051302006041000001100000013d0000000701000029000000b90010008c00000554020000410000055302006041000001100000013d0000000701000029000000390010008c000004d402000041000004d302006041000001100000013d0000000701000029000000d90010008c00000574020000410000057302006041000001100000013d0000000701000029000000590010008c000004f402000041000004f302006041000001100000013d0000000701000029000000990010008c00000534020000410000053302006041000001100000013d0000000701000029000000190010008c000004b402000041000004b302006041000001100000013d0000000701000029000000e90010008c00000584020000410000058302006041000001100000013d0000000701000029000000690010008c00000504020000410000050302006041000001100000013d0000000701000029000000a90010008c00000544020000410000054302006041000001100000013d0000000701000029000000290010008c000004c402000041000004c302006041000001100000013d0000000701000029000000c90010008c00000564020000410000056302006041000001100000013d0000000701000029000000490010008c000004e402000041000004e302006041000001100000013d0000000701000029000000890010008c00000524020000410000052302006041000001100000013d0000000701000029000000090010008c000004a402000041000004a302006041000001100000013d0000000701000029000000f10010008c0000058c020000410000058b02006041000001100000013d0000000701000029000000710010008c0000050c020000410000050b02006041000001100000013d0000000701000029000000b10010008c0000054c020000410000054b02006041000001100000013d0000000701000029000000310010008c000004cc02000041000004cb02006041000001100000013d0000000701000029000000d10010008c0000056c020000410000056b02006041000001100000013d0000000701000029000000510010008c000004ec02000041000004eb02006041000001100000013d0000000701000029000000910010008c0000052c020000410000052b02006041000001100000013d0000000701000029000000110010008c000004ac02000041000004ab02006041000001100000013d0000000701000029000000e10010008c0000057c020000410000057b02006041000001100000013d0000000701000029000000610010008c000004fc02000041000004fb02006041000001100000013d0000000701000029000000a10010008c0000053c020000410000053b02006041000001100000013d0000000701000029000000210010008c000004bc02000041000004bb02006041000001100000013d0000000701000029000000c10010008c0000055c020000410000055b02006041000001100000013d0000000701000029000000410010008c000004dc02000041000004db02006041000001100000013d0000000701000029000000810010008c0000051c020000410000051b02006041000001100000013d0000000701000029000000010010008c0000049c020000410000049b02006041000001100000013d000004870020009c0000070c0000213d0000048f0020009c000007400000213d000004930020009c0000081c0000613d000004940020009c000008790000613d000004950020009c00000b2d0000c13d0000000001000416000000000001004b00000b250000c13d00000001010000390000094a0000013d000004800020009c000007610000213d000004840020009c000008830000613d000004850020009c000008c00000613d000004860020009c00000b2d0000c13d000000240030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000401100370000000000101043b000700000001001d0000046c0010009c00000b250000213d000000000100041a0000046c011001970000000002000411000000000012004b00000b8d0000c13d0000000101000039000000000101041a000000a0011002700000046901100197000600000001001d000000000010043f0000000201000039000000200010043f0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f000000010020019000000b250000613d000000000101043b000000000201041a0000046d0220019700000007022001af000000000021041b0000000101000039000000000101041a000000a0021002700000046902200197000004690020009c000008160000613d0000062901100197000000a0022002100000046d0220009a0000062a02200197000000000112019f0000000102000039000000000012041b000000400100043d000500000001001d0000000001000414000004690010009c0000046901008041000000c0011002100000046e011001c70000800d0200003900000003030000390000062b0400004100000c600000013d000004880020009c000007680000213d0000048c0020009c000008dc0000613d0000048d0020009c000008ea0000613d0000048e0020009c00000b2d0000c13d000000240030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000401100370000000000501043b0000046c0050009c00000b250000213d000000000100041a0000046c011001970000000002000411000000000012004b00000b8d0000c13d0000000101000039000000000201041a0000046d02200197000000000252019f000000000021041b0000000001000414000004690010009c0000046901008041000000c0011002100000046e011001c70000800d0200003900000002030000390000063b0400004111a011910000040f0000000100200190000007e90000c13d00000b250000013d0000047d0020009c000008fb0000613d0000047e0020009c0000078b0000613d0000047f0020009c00000b2d0000c13d0000000001000416000000000001004b00000b250000c13d0000062101000041000000800010043f0000049601000041000011a10001042e000004900020009c0000093c0000613d000004910020009c0000094c0000613d000004920020009c00000b2d0000c13d0000000001000416000000000001004b00000b250000c13d0000000101000039000000000201041a0000046c032001970000000005000411000000000035004b00000b720000c13d000000000300041a0000046d03300197000000000353019f000000000030041b0000046d02200197000000000021041b0000000001000414000004690010009c0000046901008041000000c0011002100000046e011001c70000800d0200003900000002030000390000046f0400004111a011910000040f0000000100200190000007e90000c13d00000b250000013d000004810020009c000009dd0000613d000004820020009c0000078b0000613d000004830020009c0000076e0000613d00000b2d0000013d000004890020009c000009e50000613d0000048a0020009c00000ac10000613d0000048b0020009c00000b2d0000c13d000000240030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000401100370000000000101043b000004690010009c00000b250000213d11a00d180000040f0000046c01100197000000400200043d0000000000120435000004690020009c0000046902008041000000400120021000000620011001c7000011a10001042e000004790020009c00000b1c0000613d0000047a0020009c00000b2d0000c13d0000000001000416000000000001004b00000b250000c13d0000000101000039000000000101041a000000a0011002700000087f0000013d000000240030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000401100370000000000101043b000004690010009c00000b250000213d000000000010043f0000000301000039000009470000013d0000062601000041000000800010043f0000062701000041000011a2000104300000000002000416000000000002004b00000b250000c13d0000001f023000390000046a02200197000000c002200039000000400020043f0000001f0430018f0000046b05300198000000c002500039000007ac0000613d000000c006000039000000000701034f000000007807043c0000000006860436000000000026004b000007a80000c13d000000000004004b000007b90000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000400030008c00000b250000413d000000c00500043d0000046c0050009c00000b250000213d000000e00100043d000700000001001d0000046c0010009c00000b250000213d000000000100041a0000046d01100197000000000151019f000000000010041b0000000101000039000000000101041a000600000001001d0000000001000414000004690010009c0000046901008041000000c0011002100000046e011001c70000800d0200003900000002030000390000046f0400004111a011910000040f000000010020019000000b250000613d0000047001000041000000800010043f0000000602000029000004710220019700000472022001c70000000103000039000000000023041b0000000702000029000000a00020043f0000014000000443000001600010044300000020010000390000018000100443000001a0002004430000010000100443000000020100003900000120001004430000047301000041000011a10001042e000000000003004b00000b2b0000c13d0000000001000019000011a10001042e000000240030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000401100370000000000101043b000700000001001d0000046c0010009c00000b250000213d000000000100041a0000046c011001970000000002000411000000000012004b00000b8d0000c13d0000000101000039000000000101041a000000c0011002700000046901100197000600000001001d000000000010043f0000000301000039000000200010043f0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f000000010020019000000b250000613d000000000101043b000000000201041a0000046d0220019700000007022001af000000000021041b0000000101000039000000000101041a000000c0021002700000046902200197000004690020009c00000c4f0000c13d0000062c01000041000000000010043f0000001101000039000000040010043f0000062d01000041000011a200010430000000440030008c00000b250000413d0000000402100370000000000202043b000004690020009c00000b250000213d0000002404100370000000000404043b000004970040009c00000b250000213d0000002305400039000000000035004b00000b250000813d000600040040003d0000000601100360000000000101043b000700000001001d000004970010009c00000b250000213d00000007014000290000002401100039000000000031004b00000b250000213d000000000102001911a00d180000040f00000007030000290000063e043001980000001f0530018f0000000602000029000000200220003900000002062003670000000002010019000000400100043d0000000003410019000008450000613d000000000706034f0000000008010019000000007907043c0000000008980436000000000038004b000008410000c13d000000000005004b000008520000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000000070400002900000000034100190000000000030435000004690040009c00000469040080410000006003400210000004690010009c00000469010080410000004001100210000000000131019f0000000003000414000004690030009c0000046903008041000000c003300210000000000113019f11a0119b0000040f00030000000103550000006003100270000104690030019d000004690530019800000c840000c13d00000060030000390000008004000039000000010020019000000c7b0000613d000000400100043d000700000001001d000000000203001911a00cd40000040f00000007020000290000000001210049000004690010009c00000469010080410000006001100210000004690020009c00000469020080410000004002200210000000000121019f000011a10001042e0000000001000416000000000001004b00000b250000c13d0000000101000039000000000101041a000000c0011002700000046901100197000000800010043f0000049601000041000011a10001042e000000240030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000401100370000000000101043b000700000001001d000004690010009c00000b250000213d000000000100041a0000046c011001970000000002000411000000000012004b00000b8d0000c13d0000000701000029000000000010043f0000000301000039000000200010043f0000062201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000004690010009c0000046901008041000000c00110021000000623011001c7000080050200003911a011960000040f000000010020019000000b910000613d000000000101043b000600000001001d0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f000000010020019000000b250000613d00000006020000290000046c02200197000000000101043b000000000301041a0000046d03300197000000000223019f000000000021041b0000000001000414000004690010009c0000046901008041000000c0011002100000046e011001c70000800d0200003900000002030000390000063304000041000009370000013d000000640030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000402100370000000000202043b000004970020009c00000b250000213d0000002304200039000000000034004b00000b250000813d0000000404200039000000000441034f000000000504043b000004970050009c000008d60000213d00000005045002100000003f064000390000062e066001970000062f0060009c00000b920000a13d0000062c01000041000000000010043f0000004101000039000000040010043f0000062d01000041000011a2000104300000000001000416000000000001004b00000b250000c13d0000000001000412000b00000001001d000a00200000003d0000800501000039000000440300003900000000040004150000000b0440008a0000000504400210000006220200004111a011780000040f000009e10000013d0000000001000416000000000001004b00000b250000c13d0000000001000412000900000001001d000800000000003d000080050100003900000044030000390000000004000415000000090440008a0000000504400210000006220200004111a011780000040f0000063c01100197000000800010043f0000049601000041000011a10001042e000000240030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000401100370000000000101043b000700000001001d000004690010009c00000b250000213d000000000100041a0000046c011001970000000002000411000000000012004b00000b8d0000c13d0000000701000029000000000010043f0000000201000039000000200010043f0000062201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000004690010009c0000046901008041000000c00110021000000623011001c7000080050200003911a011960000040f000000010020019000000b910000613d000000000101043b000600000001001d0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f000000010020019000000b250000613d00000006020000290000046c02200197000000000101043b000000000301041a0000046d03300197000000000223019f000000000021041b0000000001000414000004690010009c0000046901008041000000c0011002100000046e011001c70000800d0200003900000002030000390000062404000041000000070500002911a011910000040f0000000100200190000007e90000c13d00000b250000013d000000240030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000401100370000000000101043b000004690010009c00000b250000213d000000000010043f0000000201000039000000200010043f000000000100001911a011670000040f000000000101041a000009e10000013d000000240030008c00000b250000413d0000000402100370000000000202043b000700000002001d000004970020009c00000b250000213d000000070230006a000006250020009c00000b250000213d000000440020008c00000b250000413d0000000702000029000600040020003d0000000601100360000000000101043b000004690010009c00000b250000213d000000000010043f0000000301000039000000200010043f0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f000000010020019000000b250000613d000000060200002900000020022000390000000203000367000000000223034f000000000502043b0000000004000031000000070240006a000000230220008a0000061b062001970000061b07500197000000000867013f000000000067004b00000000060000190000061b06004041000000000025004b00000000020000190000061b020080410000061b0080009c000000000602c019000000000101043b000000000006004b00000b250000c13d000000000201041a0000000605500029000000000153034f000000000101043b000004970010009c00000b250000213d000000000614004900000020045000390000061b056001970000061b07400197000000000857013f000000000057004b00000000050000190000061b05004041000000000064004b00000000060000190000061b060020410000061b0080009c000000000506c019000000000005004b00000b250000c13d000000000543034f0000063e061001980000001f0710018f000000400300043d0000000004630019000009a10000613d000000000805034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000099d0000c13d0000046c02200197000000000007004b000009af0000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500000000041300190000000000040435000004690010009c00000469010080410000006001100210000004690030009c00000469030080410000004003300210000000000113019f0000000003000414000004690030009c0000046903008041000000c003300210000000000113019f11a0119b0000040f00030000000103550000006003100270000104690030019d0000046905300198000008670000613d0000001f035000390000046a033001970000003f033000390000061c04300197000000400300043d0000000004430019000000000034004b00000000060000390000000106004039000004970040009c000008d60000213d0000000100600190000008d60000c13d000000400040043f0000001f0650018f00000000045304360000046b07500198000000000574001900000c9d0000613d000000000801034f0000000009040019000000008a08043c0000000009a90436000000000059004b000009d80000c13d00000c9d0000013d0000000001000416000000000001004b00000b250000c13d000000000100041a0000046c01100197000000800010043f0000049601000041000011a10001042e000000240030008c00000b250000413d0000000402100370000000000202043b000500000002001d000004970020009c00000b250000213d00000005020000290000002302200039000000000032004b00000b250000813d00000005020000290000000402200039000000000121034f000000000101043b000300000001001d000004970010009c00000b250000213d0000000501000029000700240010003d000000030100002900000005011002100000000701100029000000000031004b00000b250000213d000000030000006b000007e90000613d000600000000001d000000060100002900000005011002100000000701100029000400000001001d0000000201100367000000000101043b00000005020000290000000002200079000000630220008a0000061b031001970000061b04200197000000000543013f000000000043004b00000000030000190000061b03004041000000000021004b00000000020000190000061b020080410000061b0050009c000000000302c019000000000003004b00000b250000c13d00000007011000290000000201100367000000000101043b000004690010009c00000b250000213d000000000010043f0000000301000039000000200010043f0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f000000010020019000000b250000613d00000002020003670000000403200360000000000303043b0000000004000031000000050540006a000000630550008a0000061b065001970000061b07300197000000000867013f000000000067004b00000000060000190000061b06004041000000000053004b00000000050000190000061b050080410000061b0080009c000000000605c019000000000101043b000000000006004b00000b250000c13d000000000101041a00000007033000290000002005300039000000000552034f000000000505043b00000000063400490000001f0660008a0000061b076001970000061b08500197000000000978013f000000000078004b00000000070000190000061b07004041000000000065004b00000000060000190000061b060080410000061b0090009c000000000706c019000000000007004b00000b250000c13d0000000005350019000000000352034f000000000303043b000004970030009c00000b250000213d000000000634004900000020045000390000061b056001970000061b07400197000000000857013f000000000057004b00000000050000190000061b05004041000000000064004b00000000060000190000061b060020410000061b0080009c000000000506c019000000000005004b00000b250000c13d000000000642034f0000063e07300198000000400400043d000000000574001900000a6f0000613d000000000206034f0000000008040019000000002902043c0000000008980436000000000058004b00000a6b0000c13d0000046c021001970000001f0130019000000a7d0000613d000000000676034f0000000301100210000000000705043300000000071701cf000000000717022f000000000606043b0000010001100089000000000616022f00000000011601cf000000000171019f000000000015043500000000013400190000000000010435000004690030009c00000469030080410000006001300210000004690040009c00000469040080410000004003400210000000000113019f0000000003000414000004690030009c0000046903008041000000c003300210000000000113019f11a0119b0000040f00030000000103550000006003100270000104690030019d00000469053001980000008004000039000000600300003900000ab80000613d0000001f035000390000046a033001970000003f033000390000061c04300197000000400300043d0000000004430019000000000034004b00000000060000390000000106004039000004970040009c000008d60000213d0000000100600190000008d60000c13d000000400040043f00000000045304360000046b07500198000000000674001900000aab0000613d000000000801034f0000000009040019000000008a08043c0000000009a90436000000000069004b00000aa70000c13d0000001f0550019000000ab80000613d000000000171034f0000000305500210000000000706043300000000075701cf000000000757022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000171019f0000000000160435000000010020019000000c7b0000613d000000060100002900000001011000390000046902100197000600000002001d000000030020006c00000a010000413d000007e90000013d000000640030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000402100370000000000202043b000700000002001d0000046c0020009c00000b250000213d0000002402100370000000000202043b0000046c0020009c00000b250000213d000000000300041a0000046c033001970000000004000411000000000034004b00000b8d0000c13d0000063403000041000000800030043f000000840020043f0000004401100370000000000101043b000000a40010043f0000000001000414000004690010009c0000046901008041000000c00110021000000635011001c7000000070200002911a011910000040f00000060031002700000046903300197000000200030008c000600000003001d00000020030080390000001f0430018f000000200330019000000aef0000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b00000aeb0000c13d000000000004004b00000afc0000613d000000000531034f0000000304400210000000000603043300000000064601cf000000000646022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000464019f000000000043043500030000000103550000000601000029000100000001001f000000200010008c00000000010000390000000101004039000000000300043d000000010030008c000000010110c1bf000000000112016f000000010010008c00000c680000c13d00000636010000410000000000100443000000070100002900000004001004430000000001000414000004690010009c0000046901008041000000c00110021000000637011001c7000080020200003911a011960000040f000000010020019000000b910000613d000000000101043b000000000001004b0000000001000039000000010100603900000006001001b0000007e90000613d00000c6a0000013d000000440030008c00000b250000413d0000000002000416000000000002004b00000b250000c13d0000000402100370000000000402043b0000046c0040009c00000b760000a13d0000000001000019000011a2000104300000062801000041000000800010043f0000062701000041000011a200010430000000000101043b000000e002100270000000000102001911a00d180000040f000000040200003900000002042003670000000002010019000000040100008a00000000011000310000063e031001980000001f0510018f00000b3d0000613d000000000604034f0000000007000019000000006806043c0000000007870436000000000037004b00000b390000c13d000000000005004b00000b4a0000613d000000000434034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000004690010009c000004690100804100000060011002100000000003000414000004690030009c0000046903008041000000c003300210000000000113019f11a0119b0000040f000300000001035500000060051002700000001f0450018f000104690050019d0000046b0350019800000b5f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000037004b00000b5b0000c13d0000046905500197000000000004004b00000b6d0000613d000000000131034f0000000304400210000000000603043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001304350000006001500210000000010020019000000b710000613d000011a10001042e000011a2000104300000063d01000041000000800010043f0000062701000041000011a200010430000000000200041a0000046c022001970000000003000411000000000023004b00000b8d0000c13d0000002401100370000000000301043b0000000001000414000004690010009c0000046901008041000000c001100210000000000003004b0000046e0110c1c700008009020000390000000002046019000000000500001911a011910000040f0000006002100270000104690020019d000300000001035511a00ce90000040f0000000001000019000011a10001042e0000063001000041000000800010043f0000062701000041000011a200010430000000000001042f0000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b00000b250000213d000000000005004b00000ba50000613d0000008005000039000000000621034f000000000606043b0000046c0060009c00000b250000213d000000200550003900000000006504350000002002200039000000000042004b00000b9c0000413d0000002402100370000000000202043b000004970020009c00000b250000213d0000002304200039000000000034004b00000000050000190000061b050080410000061b04400197000000000004004b00000000060000190000061b060040410000061b0040009c000000000605c019000000000006004b00000b250000c13d0000000404200039000000000441034f000000000404043b000004970040009c000008d60000213d00000005054002100000003f065000390000062e06600197000000400700043d0000000006670019000500000007001d000000000076004b00000000070000390000000107004039000004970060009c000008d60000213d0000000100700190000008d60000c13d000000400060043f00000005060000290000000006460436000400000006001d00000024022000390000000005250019000000000035004b00000b250000213d000000000004004b00000bdb0000613d0000000503000029000000000421034f000000000404043b0000046c0040009c00000b250000213d000000200330003900000000004304350000002002200039000000000052004b00000bd20000413d0000004401100370000000000101043b000000000001004b0000000002000039000000010200c039000000000021004b00000b250000c13d000000000200041a0000046c022001970000000003000411000000000023004b00000cab0000c13d000000800200043d000000000002004b000007e90000613d000000010200008a000000000001004b0000000002006019000300000002001d000700000000001d00000005010000290000000001010433000000070010006c00000c490000a13d0000000701000029000000050110021000000004021000290000000002020433000000a0011000390000000001010433000000400500043d000600000005001d000000240350003900000003040000290000000000430435000006310300004100000000003504350000046c0110019700000004035000390000000000130435000004690050009c0000046901000041000000000105401900000040011002100000000003000414000004690030009c0000046903008041000000c003300210000000000113019f0000046c0220019700000632011001c711a011910000040f00000060031002700000046903300197000000200030008c000000200400003900000000040340190000002006400190000000060a000029000000060560002900000c1e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000c1a0000c13d0000001f0740019000000c2b0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000000cb60000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000004970010009c000008d60000213d0000000100200190000008d60000c13d000000400010043f000000200030008c00000b250000413d00000000010a0433000000000001004b0000000002000039000000010200c039000000000021004b00000b250000c13d00000007010000290000000101100039000704690010019b000000800100043d000000070010006b00000bef0000413d000007e90000013d0000062c01000041000000000010043f0000003201000039000000040010043f0000062d01000041000011a2000104300000061d01100197000000c002200210000004710220009a0000061e02200197000000000112019f0000000102000039000000000012041b000000400100043d000500000001001d0000000001000414000004690010009c0000046901008041000000c0011002100000046e011001c70000800d0200003900000003030000390000061f040000410000000605000029000000070600002911a011910000040f000000010020019000000b250000613d000000060100002900000005020000290000077a0000013d0000000100200190000007e90000c13d000000400100043d00000044021000390000063803000041000000000032043500000024021000390000000f03000039000000000032043500000639020000410000000000210435000000040210003900000020030000390000000000320435000004690010009c000004690100804100000040011002100000063a011001c7000011a200010430000004690040009c000004690400804100000040014002100000000002030433000004690020009c00000469020080410000006002200210000000000112019f000011a2000104300000001f035000390000046a033001970000003f033000390000061c04300197000000400300043d0000000004430019000000000034004b00000000060000390000000106004039000004970040009c000008d60000213d0000000100600190000008d60000c13d000000400040043f0000001f0650018f00000000045304360000046b07500198000000000574001900000c9d0000613d000000000801034f0000000009040019000000008a08043c0000000009a90436000000000059004b00000c990000c13d000000000006004b000008690000613d000000000171034f0000000306600210000000000705043300000000076701cf000000000767022f000000000101043b0000010006600089000000000161022f00000000016101cf000000000171019f0000000000150435000008690000013d000000400100043d000006300200004100000cb00000013d000000400100043d00000499020000410000000000210435000004690010009c000004690100804100000040011002100000049a011001c7000011a2000104300000001f0530018f0000046b06300198000000400200043d000000000462001900000cc10000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000cbd0000c13d000000000005004b00000cce0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000004690020009c00000469020080410000004002200210000000000112019f000011a20001043000000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b00000ce30000613d000000000400001900000000054100190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000cdc0000413d000000000321001900000000000304350000001f022000390000063e022001970000000001210019000000000001042d000000010100003200000d110000613d0000001f031000390000063e033001970000003f033000390000063e04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000004970040009c00000d120000213d000000010050019000000d120000c13d000000400040043f00000000051304360000063e021001980000001f0310018f0000000001250019000000030400036700000d040000613d000000000604034f000000006706043c0000000005750436000000000015004b00000d000000c13d000000000003004b00000d110000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f0000000000210435000000000001042d0000062c01000041000000000010043f0000004101000039000000040010043f0000062d01000041000011a20001043000010000000000020000046901100197000001810010008c00000d2d0000813d000001000010008c00000d4f0000a13d000001410010008c00000d600000413d000001610010008c00000d7c0000413d000001710010008c00000dac0000413d000001790010008c00000dfc0000413d0000017d0010008c00000e7c0000413d0000017f0010008c00000f3c0000413d0000061a010000410000061901006041000000000001042d000100000001001d000000000010043f0000000201000039000000200010043f0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f00000001002001900000115c0000613d000000000101043b000000000101041a0000046c001001980000115e0000613d0000000101000029000000000010043f0000000201000039000000200010043f0000000001000414000004690010009c0000046901008041000000c00110021000000498011001c7000080100200003911a011960000040f00000001002001900000115c0000613d000000000101043b000000000101041a0000046c01100197000000000001042d000000810010008c00000d6d0000413d000000c10010008c00000d870000413d000000e10010008c00000db50000413d000000f10010008c00000e030000413d000000f90010008c00000e810000413d000000fd0010008c00000f400000413d000000ff0010008c0000105c0000413d0000059a010000410000059901006041000000000001042d000001210010008c00000d940000413d000001310010008c00000dc00000413d000001390010008c00000e0c0000413d0000013d0010008c00000e880000413d0000013f0010008c00000f450000413d000005da01000041000005d901006041000000000001042d000000410010008c00000d9f0000413d000000610010008c00000dc90000413d000000710010008c00000e130000413d000000790010008c00000e8d0000413d0000007d0010008c00000f490000413d0000007f0010008c000010600000413d0000051a010000410000051901006041000000000001042d000001510010008c00000dd40000413d000001590010008c00000e1c0000413d0000015d0010008c00000e940000413d0000015f0010008c00000f4e0000413d000005fa01000041000005f901006041000000000001042d000000a10010008c00000ddd0000413d000000b10010008c00000e230000413d000000b90010008c00000e990000413d000000bd0010008c00000f520000413d000000bf0010008c000010640000413d0000055a010000410000055901006041000000000001042d000001110010008c00000de80000413d000001190010008c00000e2c0000413d0000011d0010008c00000ea00000413d0000011f0010008c00000f570000413d000005ba01000041000005b901006041000000000001042d000000210010008c00000df10000413d000000310010008c00000e330000413d000000390010008c00000ea50000413d0000003d0010008c00000f5b0000413d0000003f0010008c000010680000413d000004da01000041000004d901006041000000000001042d000001690010008c00000e3c0000413d0000016d0010008c00000eac0000413d0000016f0010008c00000f600000413d0000060a010000410000060901006041000000000001042d000000d10010008c00000e430000413d000000d90010008c00000eb10000413d000000dd0010008c00000f640000413d000000df0010008c0000106c0000413d0000057a010000410000057901006041000000000001042d000001290010008c00000e4c0000413d0000012d0010008c00000eb80000413d0000012f0010008c00000f690000413d000005ca01000041000005c901006041000000000001042d000000510010008c00000e530000413d000000590010008c00000ebd0000413d0000005d0010008c00000f6d0000413d0000005f0010008c000010700000413d000004fa01000041000004f901006041000000000001042d000001490010008c00000e5c0000413d0000014d0010008c00000ec40000413d0000014f0010008c00000f720000413d000005ea01000041000005e901006041000000000001042d000000910010008c00000e630000413d000000990010008c00000ec90000413d0000009d0010008c00000f760000413d0000009f0010008c000010740000413d0000053a010000410000053901006041000000000001042d000001090010008c00000e6c0000413d0000010d0010008c00000ed00000413d0000010f0010008c00000f7b0000413d000005aa01000041000005a901006041000000000001042d000000110010008c00000e730000413d000000190010008c00000ed50000413d0000001d0010008c00000f7f0000413d0000001f0010008c000010780000413d000004ba01000041000004b901006041000000000001042d000001750010008c00000edc0000413d000001770010008c00000f840000413d00000612010000410000061101006041000000000001042d000000e90010008c00000ee10000413d000000ed0010008c00000f880000413d000000ef0010008c0000107c0000413d0000058a010000410000058901006041000000000001042d000001350010008c00000ee80000413d000001370010008c00000f8d0000413d000005d201000041000005d101006041000000000001042d000000690010008c00000eed0000413d0000006d0010008c00000f910000413d0000006f0010008c000010800000413d0000050a010000410000050901006041000000000001042d000001550010008c00000ef40000413d000001570010008c00000f960000413d000005f201000041000005f101006041000000000001042d000000a90010008c00000ef90000413d000000ad0010008c00000f9a0000413d000000af0010008c000010840000413d0000054a010000410000054901006041000000000001042d000001150010008c00000f000000413d000001170010008c00000f9f0000413d000005b201000041000005b101006041000000000001042d000000290010008c00000f050000413d0000002d0010008c00000fa30000413d0000002f0010008c000010880000413d000004ca01000041000004c901006041000000000001042d000001650010008c00000f0c0000413d000001670010008c00000fa80000413d00000602010000410000060101006041000000000001042d000000c90010008c00000f110000413d000000cd0010008c00000fac0000413d000000cf0010008c0000108c0000413d0000056a010000410000056901006041000000000001042d000001250010008c00000f180000413d000001270010008c00000fb10000413d000005c201000041000005c101006041000000000001042d000000490010008c00000f1d0000413d0000004d0010008c00000fb50000413d0000004f0010008c000010900000413d000004ea01000041000004e901006041000000000001042d000001450010008c00000f240000413d000001470010008c00000fba0000413d000005e201000041000005e101006041000000000001042d000000890010008c00000f290000413d0000008d0010008c00000fbe0000413d0000008f0010008c000010940000413d0000052a010000410000052901006041000000000001042d000001050010008c00000f300000413d000001070010008c00000fc30000413d000005a201000041000005a101006041000000000001042d000000090010008c00000f350000413d0000000d0010008c00000fc70000413d0000000f0010008c000010980000413d000004aa01000041000004a901006041000000000001042d0000017b0010008c00000fcc0000413d00000616010000410000061501006041000000000001042d000000f50010008c00000fd00000413d000000f70010008c0000109c0000413d00000592010000410000059101006041000000000001042d0000013b0010008c00000fd50000413d000005d601000041000005d501006041000000000001042d000000750010008c00000fd90000413d000000770010008c000010a00000413d00000512010000410000051101006041000000000001042d0000015b0010008c00000fde0000413d000005f601000041000005f501006041000000000001042d000000b50010008c00000fe20000413d000000b70010008c000010a40000413d00000552010000410000055101006041000000000001042d0000011b0010008c00000fe70000413d000005b601000041000005b501006041000000000001042d000000350010008c00000feb0000413d000000370010008c000010a80000413d000004d201000041000004d101006041000000000001042d0000016b0010008c00000ff00000413d00000606010000410000060501006041000000000001042d000000d50010008c00000ff40000413d000000d70010008c000010ac0000413d00000572010000410000057101006041000000000001042d0000012b0010008c00000ff90000413d000005c601000041000005c501006041000000000001042d000000550010008c00000ffd0000413d000000570010008c000010b00000413d000004f201000041000004f101006041000000000001042d0000014b0010008c000010020000413d000005e601000041000005e501006041000000000001042d000000950010008c000010060000413d000000970010008c000010b40000413d00000532010000410000053101006041000000000001042d0000010b0010008c0000100b0000413d000005a601000041000005a501006041000000000001042d000000150010008c0000100f0000413d000000170010008c000010b80000413d000004b201000041000004b101006041000000000001042d000001730010008c000010140000413d0000060e010000410000060d01006041000000000001042d000000e50010008c000010180000413d000000e70010008c000010bc0000413d00000582010000410000058101006041000000000001042d000001330010008c0000101d0000413d000005ce01000041000005cd01006041000000000001042d000000650010008c000010210000413d000000670010008c000010c00000413d00000502010000410000050101006041000000000001042d000001530010008c000010260000413d000005ee01000041000005ed01006041000000000001042d000000a50010008c0000102a0000413d000000a70010008c000010c40000413d00000542010000410000054101006041000000000001042d000001130010008c0000102f0000413d000005ae01000041000005ad01006041000000000001042d000000250010008c000010330000413d000000270010008c000010c80000413d000004c201000041000004c101006041000000000001042d000001630010008c000010380000413d000005fe01000041000005fd01006041000000000001042d000000c50010008c0000103c0000413d000000c70010008c000010cc0000413d00000562010000410000056101006041000000000001042d000001230010008c000010410000413d000005be01000041000005bd01006041000000000001042d000000450010008c000010450000413d000000470010008c000010d00000413d000004e201000041000004e101006041000000000001042d000001430010008c0000104a0000413d000005de01000041000005dd01006041000000000001042d000000850010008c0000104e0000413d000000870010008c000010d40000413d00000522010000410000052101006041000000000001042d000001030010008c000010530000413d0000059e010000410000059d01006041000000000001042d000000050010008c000010570000413d000000070010008c000010d80000413d000004a201000041000004a101006041000000000001042d0000017d0010008c00000618010000410000061701006041000000000001042d000000fb0010008c000010dc0000413d00000596010000410000059501006041000000000001042d0000013d0010008c000005d801000041000005d701006041000000000001042d0000007b0010008c000010e00000413d00000516010000410000051501006041000000000001042d0000015d0010008c000005f801000041000005f701006041000000000001042d000000bb0010008c000010e40000413d00000556010000410000055501006041000000000001042d0000011d0010008c000005b801000041000005b701006041000000000001042d0000003b0010008c000010e80000413d000004d601000041000004d501006041000000000001042d0000016d0010008c00000608010000410000060701006041000000000001042d000000db0010008c000010ec0000413d00000576010000410000057501006041000000000001042d0000012d0010008c000005c801000041000005c701006041000000000001042d0000005b0010008c000010f00000413d000004f601000041000004f501006041000000000001042d0000014d0010008c000005e801000041000005e701006041000000000001042d0000009b0010008c000010f40000413d00000536010000410000053501006041000000000001042d0000010d0010008c000005a801000041000005a701006041000000000001042d0000001b0010008c000010f80000413d000004b601000041000004b501006041000000000001042d000001750010008c00000610010000410000060f01006041000000000001042d000000eb0010008c000010fc0000413d00000586010000410000058501006041000000000001042d000001350010008c000005d001000041000005cf01006041000000000001042d0000006b0010008c000011000000413d00000506010000410000050501006041000000000001042d000001550010008c000005f001000041000005ef01006041000000000001042d000000ab0010008c000011040000413d00000546010000410000054501006041000000000001042d000001150010008c000005b001000041000005af01006041000000000001042d0000002b0010008c000011080000413d000004c601000041000004c501006041000000000001042d000001650010008c0000060001000041000005ff01006041000000000001042d000000cb0010008c0000110c0000413d00000566010000410000056501006041000000000001042d000001250010008c000005c001000041000005bf01006041000000000001042d0000004b0010008c000011100000413d000004e601000041000004e501006041000000000001042d000001450010008c000005e001000041000005df01006041000000000001042d0000008b0010008c000011140000413d00000526010000410000052501006041000000000001042d000001050010008c000005a0010000410000059f01006041000000000001042d0000000b0010008c000011180000413d000004a601000041000004a501006041000000000001042d000001790010008c00000614010000410000061301006041000000000001042d000000f30010008c0000111c0000413d0000058e010000410000058d01006041000000000001042d000001390010008c000005d401000041000005d301006041000000000001042d000000730010008c000011200000413d0000050e010000410000050d01006041000000000001042d000001590010008c000005f401000041000005f301006041000000000001042d000000b30010008c000011240000413d0000054e010000410000054d01006041000000000001042d000001190010008c000005b401000041000005b301006041000000000001042d000000330010008c000011280000413d000004ce01000041000004cd01006041000000000001042d000001690010008c00000604010000410000060301006041000000000001042d000000d30010008c0000112c0000413d0000056e010000410000056d01006041000000000001042d000001290010008c000005c401000041000005c301006041000000000001042d000000530010008c000011300000413d000004ee01000041000004ed01006041000000000001042d000001490010008c000005e401000041000005e301006041000000000001042d000000930010008c000011340000413d0000052e010000410000052d01006041000000000001042d000001090010008c000005a401000041000005a301006041000000000001042d000000130010008c000011380000413d000004ae01000041000004ad01006041000000000001042d000001710010008c0000060c010000410000060b01006041000000000001042d000000e30010008c0000113c0000413d0000057e010000410000057d01006041000000000001042d000001310010008c000005cc01000041000005cb01006041000000000001042d000000630010008c000011400000413d000004fe01000041000004fd01006041000000000001042d000001510010008c000005ec01000041000005eb01006041000000000001042d000000a30010008c000011440000413d0000053e010000410000053d01006041000000000001042d000001110010008c000005ac01000041000005ab01006041000000000001042d000000230010008c000011480000413d000004be01000041000004bd01006041000000000001042d000001610010008c000005fc01000041000005fb01006041000000000001042d000000c30010008c0000114c0000413d0000055e010000410000055d01006041000000000001042d000001210010008c000005bc01000041000005bb01006041000000000001042d000000430010008c000011500000413d000004de01000041000004dd01006041000000000001042d000001410010008c000005dc01000041000005db01006041000000000001042d000000830010008c000011540000413d0000051e010000410000051d01006041000000000001042d000001010010008c0000059c010000410000059b01006041000000000001042d000000030010008c000011580000413d0000049e010000410000049d01006041000000000001042d000000fd0010008c00000598010000410000059701006041000000000001042d0000007d0010008c00000518010000410000051701006041000000000001042d000000bd0010008c00000558010000410000055701006041000000000001042d0000003d0010008c000004d801000041000004d701006041000000000001042d000000dd0010008c00000578010000410000057701006041000000000001042d0000005d0010008c000004f801000041000004f701006041000000000001042d0000009d0010008c00000538010000410000053701006041000000000001042d0000001d0010008c000004b801000041000004b701006041000000000001042d000000ed0010008c00000588010000410000058701006041000000000001042d0000006d0010008c00000508010000410000050701006041000000000001042d000000ad0010008c00000548010000410000054701006041000000000001042d0000002d0010008c000004c801000041000004c701006041000000000001042d000000cd0010008c00000568010000410000056701006041000000000001042d0000004d0010008c000004e801000041000004e701006041000000000001042d0000008d0010008c00000528010000410000052701006041000000000001042d0000000d0010008c000004a801000041000004a701006041000000000001042d000000f50010008c00000590010000410000058f01006041000000000001042d000000750010008c00000510010000410000050f01006041000000000001042d000000b50010008c00000550010000410000054f01006041000000000001042d000000350010008c000004d001000041000004cf01006041000000000001042d000000d50010008c00000570010000410000056f01006041000000000001042d000000550010008c000004f001000041000004ef01006041000000000001042d000000950010008c00000530010000410000052f01006041000000000001042d000000150010008c000004b001000041000004af01006041000000000001042d000000e50010008c00000580010000410000057f01006041000000000001042d000000650010008c0000050001000041000004ff01006041000000000001042d000000a50010008c00000540010000410000053f01006041000000000001042d000000250010008c000004c001000041000004bf01006041000000000001042d000000c50010008c00000560010000410000055f01006041000000000001042d000000450010008c000004e001000041000004df01006041000000000001042d000000850010008c00000520010000410000051f01006041000000000001042d000000050010008c000004a0010000410000049f01006041000000000001042d000000f90010008c00000594010000410000059301006041000000000001042d000000790010008c00000514010000410000051301006041000000000001042d000000b90010008c00000554010000410000055301006041000000000001042d000000390010008c000004d401000041000004d301006041000000000001042d000000d90010008c00000574010000410000057301006041000000000001042d000000590010008c000004f401000041000004f301006041000000000001042d000000990010008c00000534010000410000053301006041000000000001042d000000190010008c000004b401000041000004b301006041000000000001042d000000e90010008c00000584010000410000058301006041000000000001042d000000690010008c00000504010000410000050301006041000000000001042d000000a90010008c00000544010000410000054301006041000000000001042d000000290010008c000004c401000041000004c301006041000000000001042d000000c90010008c00000564010000410000056301006041000000000001042d000000490010008c000004e401000041000004e301006041000000000001042d000000890010008c00000524010000410000052301006041000000000001042d000000090010008c000004a401000041000004a301006041000000000001042d000000f10010008c0000058c010000410000058b01006041000000000001042d000000710010008c0000050c010000410000050b01006041000000000001042d000000b10010008c0000054c010000410000054b01006041000000000001042d000000310010008c000004cc01000041000004cb01006041000000000001042d000000d10010008c0000056c010000410000056b01006041000000000001042d000000510010008c000004ec01000041000004eb01006041000000000001042d000000910010008c0000052c010000410000052b01006041000000000001042d000000110010008c000004ac01000041000004ab01006041000000000001042d000000e10010008c0000057c010000410000057b01006041000000000001042d000000610010008c000004fc01000041000004fb01006041000000000001042d000000a10010008c0000053c010000410000053b01006041000000000001042d000000210010008c000004bc01000041000004bb01006041000000000001042d000000c10010008c0000055c010000410000055b01006041000000000001042d000000410010008c000004dc01000041000004db01006041000000000001042d000000810010008c0000051c010000410000051b01006041000000000001042d000000010010008c0000049c010000410000049b01006041000000000001042d0000000001000019000011a200010430000000400100043d00000499020000410000000000210435000004690010009c000004690100804100000040011002100000049a011001c7000011a200010430000000000001042f0000000002000414000004690020009c0000046902008041000000c002200210000004690010009c00000469010080410000004001100210000000000121019f00000498011001c7000080100200003911a011960000040f0000000100200190000011760000613d000000000101043b000000000001042d0000000001000019000011a20001043000000000050100190000000000200443000000040100003900000005024002700000000002020031000000000121043a0000002004400039000000000031004b0000117b0000413d000004690030009c000004690300804100000060013002100000000002000414000004690020009c0000046902008041000000c002200210000000000112019f0000063f011001c7000000000205001911a011960000040f0000000100200190000011900000613d000000000101043b000000000001042d000000000001042f00001194002104210000000102000039000000000001042d0000000002000019000000000001042d00001199002104230000000102000039000000000001042d0000000002000019000000000001042d0000119e002104250000000102000039000000000001042d0000000002000019000000000001042d000011a000000432000011a10001042e000011a200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000fbe19c9b601f5ee90b44c7390f3fa2319eba01762d34ee372aeafd59b25c7f87b3dc8da400000000000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000181000000000000000000000000000000000000000000000002000000000000000000000000000000c00000010000000000000000000000000000000000000000000000000000000000000000000000000096f4130c00000000000000000000000000000000000000000000000000000000734427c7000000000000000000000000000000000000000000000000000000009e0bbd9e00000000000000000000000000000000000000000000000000000000a7fc7a0600000000000000000000000000000000000000000000000000000000e42e0ea800000000000000000000000000000000000000000000000000000000e42e0ea900000000000000000000000000000000000000000000000000000000fd32692100000000000000000000000000000000000000000000000000000000a7fc7a0700000000000000000000000000000000000000000000000000000000c3540448000000000000000000000000000000000000000000000000000000009e0bbd9f00000000000000000000000000000000000000000000000000000000a67f534d00000000000000000000000000000000000000000000000000000000a69685b5000000000000000000000000000000000000000000000000000000008da5cb5a000000000000000000000000000000000000000000000000000000008da5cb5b0000000000000000000000000000000000000000000000000000000090ea741300000000000000000000000000000000000000000000000000000000915ad7e900000000000000000000000000000000000000000000000000000000734427c80000000000000000000000000000000000000000000000000000000082230446000000000000000000000000000000000000000000000000000000008c95ff1e0000000000000000000000000000000000000000000000000000000042cf3526000000000000000000000000000000000000000000000000000000005dbd8f6a000000000000000000000000000000000000000000000000000000005dbd8f6b000000000000000000000000000000000000000000000000000000006ccae054000000000000000000000000000000000000000000000000000000007095d4710000000000000000000000000000000000000000000000000000000042cf35270000000000000000000000000000000000000000000000000000000052283e35000000000000000000000000000000000000000000000000000000005b94db2700000000000000000000000000000000000000000000000000000000263af8e700000000000000000000000000000000000000000000000000000000263af8e80000000000000000000000000000000000000000000000000000000037c6145a000000000000000000000000000000000000000000000000000000003bd1adec000000000000000000000000000000000000000000000000000000001028c2bd0000000000000000000000000000000000000000000000000000000015b9a8b80000000000000000000000000000000000000000000000000000000020f99c0a0000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff02000000000000000000000000000000000000400000000000000000000000008579befe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000008cd6bacdae46b449e2e5b34e348a4ed459c84d5000000000000000000000000031524750cd865ff6a3540f232754fb974c18585c000000000000000000000000ed9b37342bec8f3a2d7b000732ec87498aa6ec6a000000000000000000000000e8704ef6211f8988ccbb11badc89841808d668900000000000000000000000009aff58c460a461578c433e11c4108d1c4cf777610000000000000000000000002d1733886cfd465b0b99f1492f40847495f334c5000000000000000000000000715497be4d130f04b8442f0a1f7a9312d4e54fc400000000000000000000000090c8a40c38e633b5b0e0d0585b9f7fa05462caaf000000000000000000000000a402b70fcff3f4a8422b93ef58e895021eade4f6000000000000000000000000c1b718522e15cd42c4ac385a929fc2b51f5b892e000000000000000000000000a97bf2f7c26c43c010c349f52f5ea5dc49b2dd38000000000000000000000000969423d71b62c81d2f28d707364c9dc4a0764c53000000000000000000000000f86729934c083fbec8c796068a1fc60701ea1207000000000000000000000000d7cc2571f5823caca26a42690d2be7803dd5393f0000000000000000000000007c8837a279bbbf7d8b93413763176de9f65d5bb900000000000000000000000013b81c27b588c07d04458ed7ddbdbd26d1e39bcc00000000000000000000000052560ac678afa1345d15474287d16dc1ea3f78ae0000000000000000000000001e31e376551459667cd7643440c1b21ce69065a0000000000000000000000000c57d822cb3288e7b97ef8f8af0ecdcd1b783529b0000000000000000000000002197a1d9af24b4d6a64bff95b4c29fcd3ff28c30000000000000000000000000e3700feaa5100041bf6b7adba1f72f647809fd00000000000000000000000000c02e8a0fdabf0eefcea025163d90b5621e2b9948000000000000000000000000f5144235e2926cab3c69b30113254fa632f72d62000000000000000000000000ba3f92313b00a1f7bc53b2c24eb195c8b2f5768200000000000000000000000077a6856fe1ffa5beb55a1d2ed86e27c7c482cb760000000000000000000000004826ff4e01e44b1fcefbfb38cd96687eb7786b4400000000000000000000000055ff3f5493cf5e80e76dea7e327b9cd8440af646000000000000000000000000f430db544be9770503be4aa51997aa19bbd5ba4f0000000000000000000000000f166446ce1484ee3b0663e7e67df10f5d2401150000000000000000000000006365095d92537f242db5edfdd572745e72ac33d90000000000000000000000005c7bc93f06ce3eae75adf55e10e23d2c1de5bc65000000000000000000000000e46383bad90d7a08197ccf08972e9dcdccce9ba4000000000000000000000000f0f21710c071e3b728bdc4654c3c0b873aaaa30800000000000000000000000063bc9ed3acaaeb0332531c9fb03b0a2352e9ff25000000000000000000000000d1ce808625cb4007a1708824ae82cdb0ece57de900000000000000000000000057bbb148112f4ba224841c3fe018884171004661000000000000000000000000037f7d6933036f34dfabd40ff8e4d789069f92e3000000000000000000000000ef978c280915cff3dca4edfa8932469e40ada1e100000000000000000000000092ee9e071b13f7ecfd62b7ded404a16cbc223cd300000000000000000000000094ae539c186e41ed762271338edf140414d1e44200000000000000000000000030a64bbe4ddbd43da2368efd1eb2d80c10d84dab0000000000000000000000003aeabf81c1dc4c1b73d5b2a95410f126426fb59600000000000000000000000025b08ab3d0c8ea4cc9d967b79688c6d98f3f563a000000000000000000000000ea40cb15c9a3bbd27af6474483886f7c0c9ae4060000000000000000000000009580113cc04e5a0a03359686304ef3a80b936dd3000000000000000000000000d211c826d568957f3b66a3f4d9c5f68ccc66e619000000000000000000000000cee24d0635c4c56315d133b031984d4a6f5094760000000000000000000000003922e6b987983229798e7a20095ec372744d4d4c0000000000000000000000002d92d03413d296e1f31450479349757187f2a2b70000000000000000000000000fe5308ee90fc78f45c89db6053ea859097860ca00000000000000000000000008ba68e067c0505baf0c1311e0cfb2b1b59b969c0000000000000000000000009bee5dddf75c24897374f92a534b7a6f24e97f4a0000000000000000000000001fc5a90b232208704b930c1edf82ffc6acc027340000000000000000000000005b1b0417cb44c761c2a23ee435d011f0214b3c850000000000000000000000009d70cdaca12a738c283020760f449d7816d592ec00000000000000000000000095a23b9cb830eccfddd5df56a4ec665e3381fa12000000000000000000000000483a957cf1251c20e096c35c8399721d1200a3fc000000000000000000000000b4ad39cb293b0ec7feda743442769a7ff04987cd0000000000000000000000004c543ad78c1590d81bae09fc5b6df4132a2461d0000000000000000000000000471d5e5195c563902781734cfe1ff3981f8b6c860000000000000000000000001b12a54b5e606d95b8b8d123c9cb09221ee37584000000000000000000000000e4127cc550bac433646a7d998775a84dac16c7f3000000000000000000000000ecb1b55ab12e7dd788d585c6c5cd61b5f87be836000000000000000000000000f91ef487c5a1579f70601b6d347e19756092eebf00000000000000000000000034a16a7e9badeefd4f056310cbe0b1423fa1b76000000000000000000000000060e10e80c7680f429dbbc232830becd3d623c4cf00000000000000000000000066465285b8d65362a1d86ce00fe2be949fd6debf0000000000000000000000005ab231b7e1a3a74a48f67ab7bde5cdd4267022e00000000000000000000000003a1c3633ee79d43366f5c67802a746afd6b162ba0000000000000000000000000c4bfcba8dc3c811437521a80e81e41daf4790390000000000000000000000006caf25d2e139c5431a1fa526eaf8d73ff2e6252c00000000000000000000000074ad21e09fda68638ce14a3009a79b6d16574257000000000000000000000000d4923a61008894b99cc1cd3407ef9524f02aa0ca0000000000000000000000006f159b5eb823bd415886b9271aa2a723a00a1987000000000000000000000000742a8aa42e7bfb4554de30f4fb07ffb6f20688630000000000000000000000004ae9702d3360400e47b446e76de063acab9301010000000000000000000000000e19a0a44dda7dad854ec5cc867d16869c4e80f4000000000000000000000000e021a51968f25148f726e326c88d2556c564755700000000000000000000000064287bdddaef4d94e4599a3d882bed29e6ada4b6000000000000000000000000cbb57fd2e19cc7e9d444d5b4325a2f1047d0c73f000000000000000000000000373de80df7d82cff6d76f29581b360c56331e9570000000000000000000000000466356e131ad61596a51f86bad1c03a328960d800000000000000000000000001726b960992f1b74311b248e2a922fc707d43a60000000000000000000000002e21bdf9a4509b89795bce7e132f248a75814cec000000000000000000000000769512b23aeff842379091d3b6e4b5456f631d42000000000000000000000000e7ed9be946a74ec19325d39c6eeb57887ccb2b0d000000000000000000000000c4d01ec357c2b511d10c15e6b6974380f0e62e670000000000000000000000005bc49cc9dd77becf2fd3a3c55611e84e69afa3ae00000000000000000000000048bcd879954fa14e7dbdaeb56f79c1e9ddcb69ec000000000000000000000000e929bdde21b462572fcaa4de6f49b9d3246688d000000000000000000000000085aae300438222f0e3a9bc870267a5633a9438bd00000000000000000000000051f72e1096a81c55cd142d66d39b688c657f9be80000000000000000000000003a8a05bf68ac54b01e6c0f492abf97465f3d15f9000000000000000000000000145aa67133f0c2c36b9771e92e0b7655f0d59040000000000000000000000000a030315d7db11f9892758c9e7092d841e0adc618000000000000000000000000df1f8d81a3734bdddefac6ca1596e081e57c3044000000000000000000000000ff2833123b58aa05d04d7fb99f5fb768b2b435f8000000000000000000000000c8f09c1fd751c570233765f71b0e280d74e6e7430000000000000000000000003026da6ceca2e5a57a05153653d9212ffaaa49d8000000000000000000000000de68ee703de0d11f67b0ce5891cb4a903de6d160000000000000000000000000e23a7730e81fb4e87a6d0bd9f63ee77ac86c3da40000000000000000000000008b1dbe04ad76a7d8bc079cacd3ed4d99b897f4a0000000000000000000000000bb227240fa459b69c6889b2b8cb1be76f118061f000000000000000000000000c062b9b3f0db28bb8afafcd4d075729344114ffe000000000000000000000000553188aa45f5fdb83ec4ca485982f8fc082480d10000000000000000000000000109d83d746eacb6d4014953d9e12d6ca85e330b00000000000000000000000045b1bed29812f5bf6711074acd180b2aeb783ad9000000000000000000000000da06ec8c19aea31d77f60299678cba40e743e1ad0000000000000000000000003cc5235c97d975a9b4fd4501b3446c981ea3d855000000000000000000000000a1827267d6bd989ff38580ae3d9deff6acf191630000000000000000000000003663caa0433a3d4171b3581cf2410702840a735a0000000000000000000000007575d0a7614f655ba77c74a72a43bbd4fa6246a30000000000000000000000002516defc18bc07089c5daff5eafd7b0ef64611e2000000000000000000000000fec5ff08e20fbc107a97af2d38bd0025b84ee2330000000000000000000000000fb5763a87242b25243e23d73f55945fe787523a000000000000000000000000e4c00db89678dbf8391f430c578ca857dd98ade10000000000000000000000008f2a22061f9f35e64f14523dc1a5f8159e6a21b700000000000000000000000018e4b838ae966917e20e9c9c5ad359cdd38303bb00000000000000000000000061acb1d3dcb3e3429832a164cc0fc9849fb75a4a0000000000000000000000007681e3c8e7a41dca55c257cc0d1ae757f5530e65000000000000000000000000806a2ab9748c3d1db976550890e3f528b7e8faec000000000000000000000000bdb8a5dd52c2c239fbc31e9d43b763b0197028ff000000000000000000000000474ec9203706010b9978d6bd0b105d36755e48480000000000000000000000008dfd0d829b303f2239212e591a0f92a32880f36e000000000000000000000000ad4bce9745860b1add6f1bd34a916f050e4c82c2000000000000000000000000bc701115b9fe14bc8cc5934cdc92517173e308c40000000000000000000000000d1918d786db8546a11aded475c98370e06f255e000000000000000000000000ee44f57cd6936db55b99163f3df367b01eda785a00000000000000000000000063044521fe5a1e488d7ed419cd0e35b7c24f2aa7000000000000000000000000410085e73bd85e90d97b84a68c125adb9f91f85b0000000000000000000000007913fe97e07c7a397ec274ab1d4e2622c88ec5d1000000000000000000000000977f9fe93c064dcf54157406daabc3a722e8184c000000000000000000000000cd2236468722057cfbbabad2db3dea9c20d5b01b00000000000000000000000017c7287a491cf5ff81e2678cf2bfae4333f6108c000000000000000000000000354d9a5dbf96c71b79a265f03b595c6fdc04dadd000000000000000000000000b4e409eb8e775eefeb0344f9eee884cc7ed21c69000000000000000000000000a1a3c4670ad69d9be4ab2d39d1231fec2a63b5190000000000000000000000004589a22199870729c1be5cd62ee93bed858113e60000000000000000000000008e7b864db26bd6c798c38d4ba36eba0d6602cf11000000000000000000000000a2d17c7260a4cb7b9854e89fc367e80e87872a2d000000000000000000000000c7f0edf0a1288627b0432304918a75e9084cbd46000000000000000000000000e4b4ef1f9a4abfedb371fa7a6143993b15d4df25000000000000000000000000fe3d84a2ef306febb5452441c9bdbb6521666f6a0000000000000000000000008a12b6c64121920110ae58f7cd67dfec21c6a4c300000000000000000000000076c4d9afc4717a2baac4e5f26cccf02351f7a3da000000000000000000000000d4719ba550e397aeacca1ad2201c1ba69024faaf0000000000000000000000009646126ce025224d1682c227d915a386efc0a1fb0000000000000000000000004dd8af2e3f2044842f0247920bc4babb636915ea0000000000000000000000008e8a327183af0cf8c2ece9f0ed547c42a160d4090000000000000000000000009d49614cae1c685c71678ca6d8cdf7584bfd07400000000000000000000000005a00ef257394cbc31828d48655e3d39e9c11c93d000000000000000000000000c9a2751b38d3ddd161a41ca0135c5c6c09ec1d560000000000000000000000007e1c261640a525c94ca4f8c25b48cf754dd83590000000000000000000000000409fe24ba6f6bd5af31c1aaf8059b986a3158233000000000000000000000000704cf5bfdadc0f55fdbb53b6ed8b582e018a72a20000000000000000000000003982bf65d7d6e77e3b6661cd6f6468c2475127370000000000000000000000003982b9f26ffd67a13ee371e2c0a9da338ba70e7f0000000000000000000000006d834ab385900c1f49055d098e90264077fbc4f200000000000000000000000011fe5f70779a094b7166b391e1fb73d422ef4e4d000000000000000000000000d347e4e47280d21f13b73d89c6d16f867d50dd13000000000000000000000000b6035edd53dda28d8b69b4ae9836e40c80306cd700000000000000000000000054c884e6f5c7ccfeca990396c520c858c922b6ca0000000000000000000000005ea93e240b083d686558ed607bc013d88057ce460000000000000000000000004c7131ee812de685cbe4e2ccb033d46ecd46612e000000000000000000000000c1a5be9f0c33d8483801d702111068669f81ff910000000000000000000000009e5fab91455be5e5b2c05967e73f456c8118b1fc0000000000000000000000003d9a05927223e0dc2f382831770405885e22f0d80000000000000000000000006303a011fb6063f5b1681cb5a9938ea278dc6128000000000000000000000000e9c60795c90c66797e4c8e97511ea07cdada32be000000000000000000000000d56cc98e69a1e13815818b466a8aa6163d84234a00000000000000000000000047ebb9d36a6e40895316cd894e4860d774e2c531000000000000000000000000a5eb293629410065d14a7b1663a67829b06182920000000000000000000000001b3b4c8146f939ce00899db8b3ddef0062b7e023000000000000000000000000257bbc11653625ebfb6a8587ef4f4fbe49828eb300000000000000000000000044cc979c01b5bb1eac21301e73c37200dfd06f590000000000000000000000002972fdf43352225d82754c0174ff853819d1ef2a0000000000000000000000003e54144f032648a04d62d79f7b4b93ff3ac2333b000000000000000000000000444016102db8adbe73c3b6703a1ea7f2f75a510d000000000000000000000000ac079143f98a6eb744fde34541ebf243df5b5ded000000000000000000000000ae9010767fb112d29d35cedfba2b372ad7a308d3000000000000000000000000fe0bccf9ccc2265d5fb3450743f17dfe57ae1e5600000000000000000000000004ed8c0545716119437a45386b1d691c63234c7d000000000000000000000000636c14013e531a286bc4c848da34585f0bb73d590000000000000000000000002fa67fc7ecc5caa01c653d3bfea98ecc5db9c42a00000000000000000000000023e9a0fc180818aa872d2079a985217017e97bd900000000000000000000000079a95c3ef81b3ae64ee03a9d5f73e570495f164e000000000000000000000000a7ea0e88f04a84ba0ad1e396cb07fa3fdad7df6d000000000000000000000000d23ca1278a2b01a3c0ca1a00d104b11c1ebe6f42000000000000000000000000707bc4a9fa2e349aed5df4e9f5440c15aa9d14bd0000000000000000000000007e290f2dd539ac6ce58d8b4c2b944931a1fd3612000000000000000000000000707aa5503088ce06ba450b6470a506122ea5c8ef000000000000000000000000fbb3f7bf680deeb149f4e7bc30ea3ddfa68f3c3f000000000000000000000000de74ad8ccc3dbf14992f49cf24f36855912f4934000000000000000000000000409ba83df7777f070b2b50a10a41de2468d2a3b30000000000000000000000005cb7be90a5dd7cfda54e87626e254fe8c18255b40000000000000000000000000a684fe12bc64fb72b59d0771a566f49bc090356000000000000000000000000df30048d91f8fa2bcfc54952b92bfa8e161d3360000000000000000000000000050825fff032a547c47061cf0696fdb0f65aea5d000000000000000000000000d55e671dac1f03d366d8535073ada5db2aab1ea20000000000000000000000009470c704a9616c8cd41c595fcd2181b6fe2183c20000000000000000000000002d9ffd275181f5865d5e11cbb4ced1521c4df9f1000000000000000000000000816d28dec10ec95df5334f884de85ca6215918d8000000000000000000000000d1f87267c4a43835e666dd69df077e578a3b629900000000000000000000000039e89bde9dacbe5468c025de371fbda12bdebab10000000000000000000000007b40a3207956ecad6686e61efcac48912fcd0658000000000000000000000000090cf10d793b1efba9c7d76115878814b663859a000000000000000000000000312a59c06e41327878f2063ed0e9c282c1da3afc0000000000000000000000004f1188f46236dd6b5de11ebf2a9ff08716e7deb60000000000000000000000000a6f9a3f4fa49909bbfb4339cbe12b42f53bbbed00000000000000000000000001d13d7acacbb955b81935c80fff31e14bdfa71f000000000000000000000000691a14fa6c7360422ec56df5876f84d4edd7f00a00000000000000000000000097aad18d886d181a9c726b3b6ae15a0a69f5af730000000000000000000000002917241371d2099049fa29432dc46735baec33b40000000000000000000000005f20f20f7890c2e383e29d4147c9695a371165f5000000000000000000000000ec0a60e639958335662c5219a320ccebb56c607700000000000000000000000096d63cf5062975c09845d17ec672e10255866053000000000000000000000000ff57429e57d383939cab50f09abbfb63c0e6c9ad00000000000000000000000018e393a7c8578fb1e235c242076e50013cddd0d7000000000000000000000000e7e5238af5d61f52e9b4acc025f713d1c0216507000000000000000000000000428401d4d0f25a2ee1da4d5366cb96ded425d9bd00000000000000000000000042e5733551ff1ee5b48aa9fc2b61af9b58c812e600000000000000000000000064df9c7a0551b056d860bc2419ca4c1ef75320be00000000000000000000000046006925506145611bbf0263243d8627daf26b0f0000000000000000000000008d64be884314662804eaab884531f5c50f4d500c000000000000000000000000157a62d92d07b5ce221a5429645a03bbace85373000000000000000000000000af037d33e1f1f2f87309b425fe8a9d895ef3722b000000000000000000000000921d1154e494a2f7218a37ad7b17701f94b4b40e000000000000000000000000f282b4555186d8dea51b8b3f947e1e0568d09bc4000000000000000000000000a794e2e1869765a4600b3dfd8a4ebcf16350f6b6000000000000000000000000fefb048e20c5652f7940a49b1980e0125ec4d358000000000000000000000000220104b641971e9b25612a8f001bf48abb23f1cf000000000000000000000000cb9d373bb54a501b35dd3be5bf4ba43ca31f703500000000000000000000000037d627f56e3ff36ac316372109ea82e03ac97dac0000000000000000000000004e81355ffb4a271b4ea59ff78da2b61c7833161f000000000000000000000000add8d65caf6cc9ad73127b49e16ea7ac29d91e87000000000000000000000000630f9b95626487dfeae3c97a44db6c59cf35d99600000000000000000000000078ce2bc8238b679680a67fcb98c5a60e4ec17b2d000000000000000000000000a38d776028ed1310b9a6b086f67f788201762e210000000000000000000000007bb5178827b76b86753ed62a0d662c72cecb1bd30000000000000000000000004fac26f61c76ec5c3d43b43edfaff0736ae0e3da000000000000000000000000791bb49bffa7129d6889fdb27744422ac4571a8500000000000000000000000026766ffebb5fa564777913a6f101df019ab32afa00000000000000000000000005e98e5e95b4ecbbbaf3258c3999cc81ed8048be000000000000000000000000c5c4621e52f1d6a1825a5ed4f95855401a3d9c6b000000000000000000000000fcb15f909ba7fc7ea083503fb4c1020203c107eb000000000000000000000000bd27603279d969c74f2486ad14e71080829dfd38000000000000000000000000ff2f756bcecc1a55bfc09a30cc5f64720458cfcb0000000000000000000000003bfb968febc12f4e8420b2d016efce1e615f7246000000000000000000000000982ee9ffe23051a2ec945ed676d864fa8345222b000000000000000000000000e101899100785e74767d454fff0131277bad48d90000000000000000000000004f730c0c6b3b5b7d06ca511379f4aa5bfb2e95250000000000000000000000005499c36b365795e4e0ef671af6c2ce26d7c782650000000000000000000000008af51f7237fc8fb2fc3e700488a94a0ac6ad8b5a000000000000000000000000da8716df61213c0b143f2849785fb85928084857000000000000000000000000f040cf9b1ebd11bf28e04e80740df3dde717e4f5000000000000000000000000b87ba32f759d14023c7520366b844df7f0f036c20000000000000000000000000edde681b8478f0c3194f468edd2db5e75c65cdd00000000000000000000000059c70900fca06ee2ace1bdd5a8d0af0cc3bba7200000000000000000000000008041f0f180d17dd07087199632c45e17aeb0bad50000000000000000000000004fb4727064ba595995dd516b63b5921df9b93ac600000000000000000000000086e98b594565857ed098864f560915c0dafd6ea100000000000000000000000070f8818e8b698effecd86a513a4c87c0c380bef600000000000000000000000078ed227c8a897a21da2875a752142dd80d865158000000000000000000000000d02a30bb5c3a8c51d2751a029a6fcfde2af9fbc60000000000000000000000000f00d5c5acb24e975e2a56730609f7f40aa763b8000000000000000000000000c3e2091edc2d3d9d98ba09269138b617b536834a000000000000000000000000a6fbaf7f30867c9633908998ea8c3da28920e75c000000000000000000000000e6dddcd41e2bbe8122ae32ac29b8fbab79cd21d9000000000000000000000000537aa8c1ef6a8eaf039dd6e1eb67694a48195ce400000000000000000000000096abac485fd2d0b03cf4a10df8bd58b8ded28300000000000000000000000000da8e7d46d04bd4f62705cd80355bdb6d441daffd000000000000000000000000be50018e7a5c67e2e5f5414393e971cc96f293f2000000000000000000000000a1b3907d6cb542a4cbe2ee441effaa909fab62c30000000000000000000000006d08ee8511c0237a515013ac389e7b3968cb175300000000000000000000000022faa5b5fe43eadbb52745e35a5cda8bd5f96bba0000000000000000000000007a673eb74d79e4868d689e7852abb5f93ec2fd4b0000000000000000000000000b8531f8afd4190b76f3e10decadb84c98b4d41900000000000000000000000078eabc743a93583dee403d6b84795490e652216b0000000000000000000000003a95d907b2a7a8604b59bcca08585f58afe0aa64000000000000000000000000f4271f0c8c9af0f06a80b8832fa820cce64fada800000000000000000000000074b2df841245c3748c0d31542e1335659a25c33b000000000000000000000000dfc99fd0ad7d16f30f295a5eefce029e04d0fa65000000000000000000000000e992416b6ac1144ed8148a9632973257839027f600000000000000000000000054ce55ba954e981bb1fd9399054b35ce1f2c0816000000000000000000000000d4ab52f9e7e5b315bd7471920bad04f405ab1c380000000000000000000000003670c990994d12837e95ee127fe2f06fd3e2104b000000000000000000000000dcf190b09c47e4f551e30bbb79969c3fdea1e992000000000000000000000000a65057b967b59677237e57ab815b209744b9bc400000000000000000000000006efc86b40573e4c7f28659b13327d55ae955c48300000000000000000000000006bcc25cf8e0e72316f53631b3aa7134e9f73ae0000000000000000000000000710b6414e1d53882b1fcd3a168ad5ccd435fc6d00000000000000000000000005ebb2c3d78c4e9818074559e7bae7fcc99781dc1000000000000000000000000af0a409c3aee0bd08015cfb29d89e90b6e89a88f000000000000000000000000522559d8b99773c693b80ce06df559036295ce44000000000000000000000000b65290a5bae838aaa7825c9ecec68041841a1b64000000000000000000000000801b8f2068edd5bcb659e6bda0c425909043c42000000000000000000000000029b5f00515d093627e0b7bd0b5c8e84f6b4cdb87000000000000000000000000652839ae74683cbf9f1293f1019d938f87464d3e0000000000000000000000005bc95dcebdde9b79f2b6dc76121bc7936ef8d66600000000000000000000000090db359cea62e53051158ab5f99811c0a07fe6860000000000000000000000002c3625eedadbdcdbb5330eb0d17b3c39ff269807000000000000000000000000c3f0324471b5c9d415acd625b8d8694a4e48e0010000000000000000000000008c60e7e05fa0ffb6f720233736f245134685799d00000000000000000000000098faf2c09aa4ebb995ad0b56152993e7291a500e000000000000000000000000802c1063a861414dfaec16bacb81429fc0d40d6e00000000000000000000000011c4aefcc0dc156f64195f6513cb1fb3be0ae056000000000000000000000000eff1f3258214e31b6b4f640b4389d55715c3be2b00000000000000000000000047e379abe8ddfea4289aba01235eff7e93758fd70000000000000000000000003cc26384c3ea31ddc8d9789e8872cea6f20cd3ff000000000000000000000000edd9efa6c69108faa4611097d643e20ba0ed1634000000000000000000000000cb93525ca5f3d371f74f3d112bc19526740717b80000000000000000000000007071e0124eb4438137e60df1b8dd8af1bfb362cf0000000000000000000000004691096eb0b78c8f4b4a8091e5b66b18e1835c100000000000000000000000008d953c9b2d1c2137cf95992079f3a77fcd793272000000000000000000000000bdcc2a3bf6e3ba49ff86595e6b2b8d70d8368c9200000000000000000000000095e6948ab38c61b2d294e8bd896bcc4ccc0713cf000000000000000000000000607b27c881ffee4cb95b1c5862fae7224ccd0b4a00000000000000000000000009d28afa166e566a2ee1cb834ea8e78c7e627ed20000000000000000000000009c01449b38bdf0b263818401044fb1401b29fdfa0000000000000000000000001f7723599bbb658c051f8a39be2688388d22ced600000000000000000000000052b71603f7b8a5d15b4482e965a0619aa321019400000000000000000000000001c0f072cb210406653752fecfa70b42da9173a20000000000000000000000003021142f021e943e57fc1886caf58d06147d09a6000000000000000000000000e6f2af38e76ab09db59225d97d3e770942d3d84200000000000000000000000006a25554e5135f08b9e2ed1dec1fc3ced52e0b4800000000000000000000000071d75e670ee3511c8290c705e0620126b710bf8d0000000000000000000000008b9ce142b80fea7c932952ec533694b1df9b3c54000000000000000000000000d7be24f32f39231116b3fdc483c2a12e1521f73b000000000000000000000000b40cafbc4797d4ff64087e087f6d2e661f954cbe000000000000000000000000bddce7771efee81893e838f62204a4c76d72757e0000000000000000000000005d3d299ea7fd4f39acdb336e26631dfee41f92870000000000000000000000006bfee09e1fc0684e0826a9a0dc1352a14b136fac000000000000000000000000d0001bb8e2cb661436093f96458a4358b5156e3c0000000000000000000000001867c6485cfd1ed448988368a22bfb17a77472930000000000000000000000008997ef9f95df24ab67703ab6c262aabfeebe33bd0000000000000000000000001e39e9e601922ded91bcfc8f78836302133465e20000000000000000000000008a8ec6ceacff502a782216774e5af3421562c6ff0000000000000000000000003b8fc561df5415c8dc01e97ee6e38435a8f9c40a000000000000000000000000d5d5f5b37e67c43cea663aedadffc3a93a2065b0000000000000000000000000cc8f55ec43b4f25013ce1946fbb740c43be5b96d00000000000000000000000018f586e816eeedbb57b8011239150367561b58fb000000000000000000000000d0cd802b19c1a52501cb2f07d656e3cd7b0ce124000000000000000000000000e0aed899b39c6e4f2d83e4913a1e9e0cf6368abe0000000000000000000000000606e1b6c0f1a398c38825dccc4678a7cbc2737c0000000000000000000000002d188e85b27d18ef80f16686ea1593abf7ed2a6300000000000000000000000064412292fa4a135a3300e24366e99ff59db2eac100000000000000000000000038b74c173f3733e8b90aaef0e98b89791266149f00000000000000000000000036daa49a79aaef4e7a217a11530d3ccd8441412400000000000000000000000010f088fe2c88f90270e4449c46c8b1b232511d580000000000000000000000004fedbd25b58586838abd17d10272697df1dc3087000000000000000000000000685278209248cb058e5cee93e37f274a80faf6eb000000000000000000000000dd9f8f1eec3955f78168e2fb2d1e808fa8a8f15b0000000000000000000000007392aeefd5825aac28817031deebbfaaa20983d90000000000000000000000000cc182555e00767d6fb8ad161a10d0c04c476d9100000000000000000000000090e52837d56715c79fd592e8d58bfd20365798b20000000000000000000000006f4451de14049b6770ad5bf4013118529e68a40c00000000000000000000000089b97ef2afab9ed9c7f0fdb095d02e6840b52d9c00000000000000000000000092a5cc5c42d94d3e23aeb1214fff43db2b97759e00000000000000000000000063ddc52f135a1dcba831eaac11c63849f018b739000000000000000000000000692a691533b571c2c54c1d7f8043a204b3d8120e00000000000000000000000097c7492cf083969f61c6f302d45c8270391b921c000000000000000000000000defd2b8643553dad19548eb14fd94a57f4b9e54300000000000000000000000030645c04205ca3f670b67b02f971b088930acb8c000000000000000000000000a6f80ed2d607cd67aeb4109b64a0becc4d7d03cf000000000000000000000000bbbbc6c276eb3f7e674f2d39301509236001c42f000000000000000000000000c20e77d349fb40ce88eb01824e2873ad9f681f3c0000000000000000000000005fcfd9a962de19294467c358c1fa55082285960b0000000000000000000000004d87bd6a0e4e5cc6332923cb3e85fc71b287f58a0000000000000000000000003aa5b757cd6dde98214e56d57dde7fcf0f7ab04e000000000000000000000000e28efce7192e11a2297f44059113c1fd6967b2d40000000000000000000000003251cae10a1cf246e0808d76acc26f7b5eda0ee5000000000000000000000000ba2091cc9357cf4c4f25d64f30d1b4ba3a5a174b00000000000000000000000049c8e1da9693692096f63c82d11b52d738566d55000000000000000000000000a0731615ab5fff451031e9551367a4f7db27b39c000000000000000000000000fb214541888671ae1403cecc1d59763a12fc16090000000000000000000000001d6bcb17642e2336405df73df22f07688caec020000000000000000000000000fc9c0c7bfe187120ff7f4e21446161794a617a9e000000000000000000000000ba5bf37678eee2dab17aef9d898153258252250e0000000000000000000000007c55690bd2c9961576a32c02f8eb29ed36415ec7000000000000000000000000ca40073e868e8bc611aec8fe741d17e68fe422f600000000000000000000000031641bafb87e9a58f78835050a7be56921986339000000000000000000000000a54766424f6da74b45ebcc5bf0bd1d74d2cccaab000000000000000000000000c7bba57f8c179eddbaa62117dda360e28f3f82520000000000000000000000005e663ed97ea77d393b8858c90d0683bf180e0ffd800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffe0ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff0000000000000000000000000000000000000000000000007601ed90c4c6f485f9633a9355c473c63ec60dfb8e04d060dbda9a80cf48eb6800000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000056bc75e2d63100000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000c60cf0bdf6c913c2d080d151c29909503abb49cdd09b459a7a10a16a466d02da7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa24a13a6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000c963e34d00000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff00000000000000000000000000000000000000007977983873e5c968018b0deaedba28f6ce6253277670e94e627fbc08efc50cb14e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f5fc483c500000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000c203fc627a1b6dd6b6dad3f6b7a313417bb01b1b5ebcd77ed25aff6a0b160865a9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000008000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000005452414e534645525f4641494c4544000000000000000000000000000000000008c379a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22ffffffff000000000000000000000000000000000000000000000000000000007c91ccdd00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0020000020000000000000000000000000000000000000000000000000000000082d0f04333e8de1708a9d823b2642b94bbc57515f80f9ef5950c7411ea7f2f1d
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b0bbff6311b7f245761a7846d3ce7b1b100c18360000000000000000000000008517d2b4a9df18034dd00ccb5940fa4dcfad7219
-----Decoded View---------------
Arg [0] : _owner (address): 0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836
Arg [1] : _disabledRoute (address): 0x8517D2B4A9df18034dd00CCB5940fA4dCfaD7219
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b0bbff6311b7f245761a7846d3ce7b1b100c1836
Arg [1] : 0000000000000000000000008517d2b4a9df18034dd00ccb5940fa4dcfad7219
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.