Overview
ETH Balance
0.0000872777790529 ETH
Eth Value
$0.29 (@ $3,276.00/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 44,558 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Joinswap Extern ... | 13286339 | 1224 days ago | IN | 0 ETH | 0.0115067 | ||||
Join Pool | 12744481 | 1308 days ago | IN | 0 ETH | 0.00409367 | ||||
Joinswap Extern ... | 12699292 | 1315 days ago | IN | 0 ETH | 0.00279417 | ||||
Joinswap Extern ... | 12698426 | 1315 days ago | IN | 0 ETH | 0.00268312 | ||||
Joinswap Extern ... | 12629467 | 1326 days ago | IN | 0 ETH | 0.00136412 | ||||
Joinswap Extern ... | 12611558 | 1329 days ago | IN | 0 ETH | 0.00162751 | ||||
Join Pool | 12514546 | 1344 days ago | IN | 0 ETH | 0.0088557 | ||||
Join Pool | 12477634 | 1350 days ago | IN | 0 ETH | 0.01273502 | ||||
Join Pool | 12470532 | 1351 days ago | IN | 0 ETH | 0.01618482 | ||||
Join Pool | 12452540 | 1354 days ago | IN | 0 ETH | 0.01663437 | ||||
Joinswap Extern ... | 12451874 | 1354 days ago | IN | 0 ETH | 0.00831426 | ||||
Join Pool | 12441342 | 1355 days ago | IN | 0 ETH | 0.01936697 | ||||
Join Pool | 12401342 | 1362 days ago | IN | 0 ETH | 0.03173292 | ||||
Join Pool | 12385116 | 1364 days ago | IN | 0 ETH | 0.01227792 | ||||
Joinswap Extern ... | 12384627 | 1364 days ago | IN | 0 ETH | 0.0062635 | ||||
Join Pool | 12377670 | 1365 days ago | IN | 0 ETH | 0.01595942 | ||||
Join Pool | 12376258 | 1365 days ago | IN | 0 ETH | 0.02424889 | ||||
Join Pool | 12373876 | 1366 days ago | IN | 0 ETH | 0.00898797 | ||||
Join Pool | 12373645 | 1366 days ago | IN | 0 ETH | 0.00141425 | ||||
Join Pool | 12373645 | 1366 days ago | IN | 0 ETH | 0.00703796 | ||||
Joinswap Extern ... | 12373604 | 1366 days ago | IN | 0 ETH | 0.00448393 | ||||
Joinswap Extern ... | 12366688 | 1367 days ago | IN | 0 ETH | 0.00524121 | ||||
Joinswap Extern ... | 12366677 | 1367 days ago | IN | 0 ETH | 0.00552675 | ||||
Joinswap Extern ... | 12363248 | 1367 days ago | IN | 0 ETH | 0.01123119 | ||||
Join Pool | 12361057 | 1368 days ago | IN | 0 ETH | 0.0075271 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
19180348 | 357 days ago | 0.09 ETH | ||||
19180348 | 357 days ago | 0.09 ETH | ||||
19180348 | 357 days ago | 0.045 ETH | ||||
19180348 | 357 days ago | 0.045 ETH | ||||
19180348 | 357 days ago | 0.045 ETH | ||||
11896902 | 1439 days ago | 0.05 ETH | ||||
11872926 | 1443 days ago | 3.95692 ETH | ||||
11872926 | 1443 days ago | 3.95692 ETH | ||||
11767626 | 1459 days ago | 0.075 ETH | ||||
11745195 | 1463 days ago | 1.69024108 ETH | ||||
11745195 | 1463 days ago | 1.69024108 ETH | ||||
11744504 | 1463 days ago | 1.20492715 ETH | ||||
11744504 | 1463 days ago | 1.20492715 ETH | ||||
11729161 | 1465 days ago | 0.52993268 ETH | ||||
11729161 | 1465 days ago | 0.52993268 ETH | ||||
11729152 | 1465 days ago | 0.20382968 ETH | ||||
11729152 | 1465 days ago | 0.20382968 ETH | ||||
11728997 | 1465 days ago | 0.11868561 ETH | ||||
11728997 | 1465 days ago | 0.11868561 ETH | ||||
11728918 | 1465 days ago | 0.1125027 ETH | ||||
11728918 | 1465 days ago | 0.1125027 ETH | ||||
11727596 | 1465 days ago | 0.4 ETH | ||||
11727579 | 1465 days ago | 0.45 ETH | ||||
11727579 | 1465 days ago | 0.45 ETH | ||||
11727345 | 1465 days ago | 0.12142858 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:
ExchangeProxy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-26 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; pragma experimental ABIEncoderV2; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IBPool is IERC20 { function version() external view returns(uint); function swapExactAmountIn(address, uint, address, uint, uint) external returns (uint, uint); function swapExactAmountOut(address, uint, address, uint, uint) external returns (uint, uint); function calcInGivenOut(uint, uint, uint, uint, uint, uint) external pure returns (uint); function calcOutGivenIn(uint, uint, uint, uint, uint, uint) external pure returns (uint); function getDenormalizedWeight(address) external view returns (uint); function swapFee() external view returns (uint); function setSwapFee(uint _swapFee) external; function bind(address token, uint balance, uint denorm) external; function rebind(address token, uint balance, uint denorm) external; function finalize( uint _swapFee, uint _initPoolSupply, address[] calldata _bindTokens, uint[] calldata _bindDenorms ) external; function setPublicSwap(bool _publicSwap) external; function setController(address _controller) external; function setExchangeProxy(address _exchangeProxy) external; function getFinalTokens() external view returns (address[] memory tokens); function getTotalDenormalizedWeight() external view returns (uint); function getBalance(address token) external view returns (uint); function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external; function joinPoolFor(address account, uint rewardAmountOut, uint[] calldata maxAmountsIn) external; function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn) external returns (uint tokenAmountIn); function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external; function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut) external returns (uint tokenAmountOut); function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn) external returns (uint poolAmountIn); function joinswapExternAmountIn( address tokenIn, uint tokenAmountIn, uint minPoolAmountOut ) external returns (uint poolAmountOut); } interface IFreeFromUpTo { function freeFromUpTo(address from, uint256 value) external returns (uint256 freed); } interface IBFactory { function newBPool() external returns (IBPool); } interface IValueLiquidRegistry { function getBestPoolsWithLimit(address, address, uint) external view returns (address[] memory); } interface IWETH { function deposit() external payable; function allowance(address owner, address spender) external view returns (uint256); function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; function balanceOf(address account) external view returns (uint256); } contract ExchangeProxy { using SafeMath for uint256; using SafeERC20 for IERC20; using Address for address; IFreeFromUpTo public constant chi = IFreeFromUpTo(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c); modifier discountCHI(uint8 flag) { if ((flag & 0x1) == 0) { _; } else { uint256 gasStart = gasleft(); _; uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length; chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41130); } } struct Pool { address pool; uint tokenBalanceIn; uint tokenWeightIn; uint tokenBalanceOut; uint tokenWeightOut; uint swapFee; uint effectiveLiquidity; } struct Swap { address pool; address tokenIn; address tokenOut; uint swapAmount; // tokenInAmount / tokenOutAmount uint limitReturnAmount; // minAmountOut / maxAmountIn uint maxPrice; } IWETH weth; IValueLiquidRegistry registry; address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); uint private constant BONE = 10 ** 18; address public governance; constructor(address _weth) public { weth = IWETH(_weth); governance = tx.origin; } function setGovernance(address _governance) external { require(msg.sender == governance, "!governance"); governance = _governance; } function setRegistry(address _registry) external { require(msg.sender == governance, "!governance"); registry = IValueLiquidRegistry(_registry); } function batchSwapExactIn( Swap[] memory swaps, IERC20 tokenIn, IERC20 tokenOut, uint totalAmountIn, uint minTotalAmountOut, uint8 flag ) public payable discountCHI(flag) returns (uint totalAmountOut) { transferFromAll(tokenIn, totalAmountIn); for (uint i = 0; i < swaps.length; i++) { Swap memory swap = swaps[i]; IERC20 SwapTokenIn = IERC20(swap.tokenIn); IBPool pool = IBPool(swap.pool); if (SwapTokenIn.allowance(address(this), swap.pool) > 0) { SwapTokenIn.safeApprove(swap.pool, 0); } SwapTokenIn.safeApprove(swap.pool, swap.swapAmount); (uint tokenAmountOut,) = pool.swapExactAmountIn( swap.tokenIn, swap.swapAmount, swap.tokenOut, swap.limitReturnAmount, swap.maxPrice ); totalAmountOut = tokenAmountOut.add(totalAmountOut); } require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT"); transferAll(tokenOut, totalAmountOut); transferAll(tokenIn, getBalance(tokenIn)); } function batchSwapExactOut( Swap[] memory swaps, IERC20 tokenIn, IERC20 tokenOut, uint maxTotalAmountIn, uint8 flag ) public payable discountCHI(flag) returns (uint totalAmountIn) { transferFromAll(tokenIn, maxTotalAmountIn); for (uint i = 0; i < swaps.length; i++) { Swap memory swap = swaps[i]; IERC20 SwapTokenIn = IERC20(swap.tokenIn); IBPool pool = IBPool(swap.pool); if (SwapTokenIn.allowance(address(this), swap.pool) > 0) { SwapTokenIn.safeApprove(swap.pool, 0); } SwapTokenIn.safeApprove(swap.pool, swap.limitReturnAmount); (uint tokenAmountIn,) = pool.swapExactAmountOut( swap.tokenIn, swap.limitReturnAmount, swap.tokenOut, swap.swapAmount, swap.maxPrice ); totalAmountIn = tokenAmountIn.add(totalAmountIn); } require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN"); transferAll(tokenOut, getBalance(tokenOut)); transferAll(tokenIn, getBalance(tokenIn)); } function multihopBatchSwapExactIn( Swap[][] memory swapSequences, IERC20 tokenIn, IERC20 tokenOut, uint totalAmountIn, uint minTotalAmountOut, uint8 flag ) public payable discountCHI(flag) returns (uint totalAmountOut) { transferFromAll(tokenIn, totalAmountIn); for (uint i = 0; i < swapSequences.length; i++) { uint tokenAmountOut; for (uint k = 0; k < swapSequences[i].length; k++) { Swap memory swap = swapSequences[i][k]; IERC20 SwapTokenIn = IERC20(swap.tokenIn); if (k == 1) { // Makes sure that on the second swap the output of the first was used // so there is not intermediate token leftover swap.swapAmount = tokenAmountOut; } IBPool pool = IBPool(swap.pool); if (SwapTokenIn.allowance(address(this), swap.pool) > 0) { SwapTokenIn.safeApprove(swap.pool, 0); } SwapTokenIn.safeApprove(swap.pool, swap.swapAmount); (tokenAmountOut,) = pool.swapExactAmountIn( swap.tokenIn, swap.swapAmount, swap.tokenOut, swap.limitReturnAmount, swap.maxPrice ); } // This takes the amountOut of the last swap totalAmountOut = tokenAmountOut.add(totalAmountOut); } require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT"); transferAll(tokenOut, totalAmountOut); transferAll(tokenIn, getBalance(tokenIn)); } function multihopBatchSwapExactOut( Swap[][] memory swapSequences, IERC20 tokenIn, IERC20 tokenOut, uint maxTotalAmountIn, uint8 flag ) public payable discountCHI(flag) returns (uint totalAmountIn) { transferFromAll(tokenIn, maxTotalAmountIn); for (uint i = 0; i < swapSequences.length; i++) { uint tokenAmountInFirstSwap; // Specific code for a simple swap and a multihop (2 swaps in sequence) if (swapSequences[i].length == 1) { Swap memory swap = swapSequences[i][0]; IERC20 SwapTokenIn = IERC20(swap.tokenIn); IBPool pool = IBPool(swap.pool); if (SwapTokenIn.allowance(address(this), swap.pool) > 0) { SwapTokenIn.safeApprove(swap.pool, 0); } SwapTokenIn.safeApprove(swap.pool, swap.limitReturnAmount); (tokenAmountInFirstSwap,) = pool.swapExactAmountOut( swap.tokenIn, swap.limitReturnAmount, swap.tokenOut, swap.swapAmount, swap.maxPrice ); } else { // Consider we are swapping A -> B and B -> C. The goal is to buy a given amount // of token C. But first we need to buy B with A so we can then buy C with B // To get the exact amount of C we then first need to calculate how much B we'll need: uint intermediateTokenAmount; // This would be token B as described above Swap memory secondSwap = swapSequences[i][1]; IBPool poolSecondSwap = IBPool(secondSwap.pool); intermediateTokenAmount = poolSecondSwap.calcInGivenOut( poolSecondSwap.getBalance(secondSwap.tokenIn), poolSecondSwap.getDenormalizedWeight(secondSwap.tokenIn), poolSecondSwap.getBalance(secondSwap.tokenOut), poolSecondSwap.getDenormalizedWeight(secondSwap.tokenOut), secondSwap.swapAmount, poolSecondSwap.swapFee() ); //// Buy intermediateTokenAmount of token B with A in the first pool Swap memory firstSwap = swapSequences[i][0]; IERC20 FirstSwapTokenIn = IERC20(firstSwap.tokenIn); IBPool poolFirstSwap = IBPool(firstSwap.pool); if (FirstSwapTokenIn.allowance(address(this), firstSwap.pool) < uint(- 1)) { FirstSwapTokenIn.safeApprove(firstSwap.pool, uint(- 1)); } (tokenAmountInFirstSwap,) = poolFirstSwap.swapExactAmountOut( firstSwap.tokenIn, firstSwap.limitReturnAmount, firstSwap.tokenOut, intermediateTokenAmount, // This is the amount of token B we need firstSwap.maxPrice ); //// Buy the final amount of token C desired IERC20 SecondSwapTokenIn = IERC20(secondSwap.tokenIn); if (SecondSwapTokenIn.allowance(address(this), secondSwap.pool) < uint(- 1)) { SecondSwapTokenIn.safeApprove(secondSwap.pool, uint(- 1)); } poolSecondSwap.swapExactAmountOut( secondSwap.tokenIn, secondSwap.limitReturnAmount, secondSwap.tokenOut, secondSwap.swapAmount, secondSwap.maxPrice ); } totalAmountIn = tokenAmountInFirstSwap.add(totalAmountIn); } require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN"); transferAll(tokenOut, getBalance(tokenOut)); transferAll(tokenIn, getBalance(tokenIn)); } function smartSwapExactIn( IERC20 tokenIn, IERC20 tokenOut, uint totalAmountIn, uint minTotalAmountOut, uint nPools, uint8 flag ) public payable discountCHI(flag) returns (uint totalAmountOut) { Swap[] memory swaps; if (isETH(tokenIn)) { (swaps,) = viewSplitExactIn(address(weth), address(tokenOut), totalAmountIn, nPools); } else if (isETH(tokenOut)) { (swaps,) = viewSplitExactIn(address(tokenIn), address(weth), totalAmountIn, nPools); } else { (swaps,) = viewSplitExactIn(address(tokenIn), address(tokenOut), totalAmountIn, nPools); } totalAmountOut = batchSwapExactIn(swaps, tokenIn, tokenOut, totalAmountIn, minTotalAmountOut, 0x0); } function smartSwapExactOut( IERC20 tokenIn, IERC20 tokenOut, uint totalAmountOut, uint maxTotalAmountIn, uint nPools, uint8 flag ) public payable discountCHI(flag) returns (uint totalAmountIn) { Swap[] memory swaps; if (isETH(tokenIn)) { (swaps,) = viewSplitExactOut(address(weth), address(tokenOut), totalAmountOut, nPools); } else if (isETH(tokenOut)) { (swaps,) = viewSplitExactOut(address(tokenIn), address(weth), totalAmountOut, nPools); } else { (swaps,) = viewSplitExactOut(address(tokenIn), address(tokenOut), totalAmountOut, nPools); } totalAmountIn = batchSwapExactOut(swaps, tokenIn, tokenOut, maxTotalAmountIn, 0x0); } function viewSplitExactIn( address tokenIn, address tokenOut, uint swapAmount, uint nPools ) public view returns (Swap[] memory swaps, uint totalOutput) { address[] memory poolAddresses = registry.getBestPoolsWithLimit(tokenIn, tokenOut, nPools); Pool[] memory pools = new Pool[](poolAddresses.length); uint sumEffectiveLiquidity; for (uint i = 0; i < poolAddresses.length; i++) { pools[i] = getPoolData(tokenIn, tokenOut, poolAddresses[i]); sumEffectiveLiquidity = sumEffectiveLiquidity.add(pools[i].effectiveLiquidity); } uint[] memory bestInputAmounts = new uint[](pools.length); uint totalInputAmount; for (uint i = 0; i < pools.length; i++) { bestInputAmounts[i] = swapAmount.mul(pools[i].effectiveLiquidity).div(sumEffectiveLiquidity); totalInputAmount = totalInputAmount.add(bestInputAmounts[i]); } if (totalInputAmount < swapAmount) { bestInputAmounts[0] = bestInputAmounts[0].add(swapAmount.sub(totalInputAmount)); } else { bestInputAmounts[0] = bestInputAmounts[0].sub(totalInputAmount.sub(swapAmount)); } swaps = new Swap[](pools.length); for (uint i = 0; i < pools.length; i++) { swaps[i] = Swap({ pool : pools[i].pool, tokenIn : tokenIn, tokenOut : tokenOut, swapAmount : bestInputAmounts[i], limitReturnAmount : 0, maxPrice : uint(- 1) }); } totalOutput = calcTotalOutExactIn(bestInputAmounts, pools); return (swaps, totalOutput); } function viewSplitExactOut( address tokenIn, address tokenOut, uint swapAmount, uint nPools ) public view returns (Swap[] memory swaps, uint totalOutput) { address[] memory poolAddresses = registry.getBestPoolsWithLimit(tokenIn, tokenOut, nPools); Pool[] memory pools = new Pool[](poolAddresses.length); uint sumEffectiveLiquidity; for (uint i = 0; i < poolAddresses.length; i++) { pools[i] = getPoolData(tokenIn, tokenOut, poolAddresses[i]); sumEffectiveLiquidity = sumEffectiveLiquidity.add(pools[i].effectiveLiquidity); } uint[] memory bestInputAmounts = new uint[](pools.length); uint totalInputAmount; for (uint i = 0; i < pools.length; i++) { bestInputAmounts[i] = swapAmount.mul(pools[i].effectiveLiquidity).div(sumEffectiveLiquidity); totalInputAmount = totalInputAmount.add(bestInputAmounts[i]); } if (totalInputAmount < swapAmount) { bestInputAmounts[0] = bestInputAmounts[0].add(swapAmount.sub(totalInputAmount)); } else { bestInputAmounts[0] = bestInputAmounts[0].sub(totalInputAmount.sub(swapAmount)); } swaps = new Swap[](pools.length); for (uint i = 0; i < pools.length; i++) { swaps[i] = Swap({ pool : pools[i].pool, tokenIn : tokenIn, tokenOut : tokenOut, swapAmount : bestInputAmounts[i], limitReturnAmount : uint(- 1), maxPrice : uint(- 1) }); } totalOutput = calcTotalOutExactOut(bestInputAmounts, pools); return (swaps, totalOutput); } function getPoolData( address tokenIn, address tokenOut, address poolAddress ) internal view returns (Pool memory) { IBPool pool = IBPool(poolAddress); uint tokenBalanceIn = pool.getBalance(tokenIn); uint tokenBalanceOut = pool.getBalance(tokenOut); uint tokenWeightIn = pool.getDenormalizedWeight(tokenIn); uint tokenWeightOut = pool.getDenormalizedWeight(tokenOut); uint swapFee = pool.swapFee(); uint effectiveLiquidity = calcEffectiveLiquidity( tokenWeightIn, tokenBalanceOut, tokenWeightOut ); Pool memory returnPool = Pool({ pool : poolAddress, tokenBalanceIn : tokenBalanceIn, tokenWeightIn : tokenWeightIn, tokenBalanceOut : tokenBalanceOut, tokenWeightOut : tokenWeightOut, swapFee : swapFee, effectiveLiquidity : effectiveLiquidity }); return returnPool; } function calcEffectiveLiquidity( uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut ) internal pure returns (uint effectiveLiquidity) { // Bo * wi/(wi+wo) effectiveLiquidity = tokenWeightIn.mul(BONE).div( tokenWeightOut.add(tokenWeightIn) ).mul(tokenBalanceOut).div(BONE); return effectiveLiquidity; } function calcTotalOutExactIn( uint[] memory bestInputAmounts, Pool[] memory bestPools ) internal pure returns (uint totalOutput) { totalOutput = 0; for (uint i = 0; i < bestInputAmounts.length; i++) { uint output = IBPool(bestPools[i].pool).calcOutGivenIn( bestPools[i].tokenBalanceIn, bestPools[i].tokenWeightIn, bestPools[i].tokenBalanceOut, bestPools[i].tokenWeightOut, bestInputAmounts[i], bestPools[i].swapFee ); totalOutput = totalOutput.add(output); } return totalOutput; } function calcTotalOutExactOut( uint[] memory bestInputAmounts, Pool[] memory bestPools ) internal pure returns (uint totalOutput) { totalOutput = 0; for (uint i = 0; i < bestInputAmounts.length; i++) { uint output = IBPool(bestPools[i].pool).calcInGivenOut( bestPools[i].tokenBalanceIn, bestPools[i].tokenWeightIn, bestPools[i].tokenBalanceOut, bestPools[i].tokenWeightOut, bestInputAmounts[i], bestPools[i].swapFee ); totalOutput = totalOutput.add(output); } return totalOutput; } function transferFromAll(IERC20 token, uint amount) internal returns (bool) { if (isETH(token)) { weth.deposit{value : msg.value}(); } else { token.safeTransferFrom(msg.sender, address(this), amount); } return true; } function getBalance(IERC20 token) internal view returns (uint) { if (isETH(token)) { return weth.balanceOf(address(this)); } else { return token.balanceOf(address(this)); } } function transferAll(IERC20 token, uint amount) internal returns (bool) { if (amount == 0) { return true; } if (isETH(token)) { weth.withdraw(amount); (bool xfer,) = msg.sender.call{value : amount}(""); require(xfer, "ERR_ETH_FAILED"); } else { token.safeTransfer(msg.sender, amount); } return true; } function isETH(IERC20 token) internal pure returns (bool) { return (address(token) == ETH_ADDRESS); } /** * This function allows governance to take unsupported tokens out of the contract. * This is in an effort to make someone whole, should they seriously mess up. * There is no guarantee governance will vote to return these. * It also allows for removal of airdropped tokens. */ function governanceRecoverUnsupported(IERC20 _token, uint _amount, address _to) external { require(msg.sender == governance, "!governance"); if (isETH(_token)) { (bool xfer,) = _to.call{value : _amount}(""); require(xfer, "ERR_ETH_FAILED"); } else { _token.safeTransfer(_to, _amount); } } receive() external payable {} function create( IBFactory factory, address[] memory tokens, uint[] calldata balances, uint[] calldata denorms, uint swapFee, uint initPoolSupply, uint8 flag ) payable external discountCHI(flag) returns (IBPool pool) { require(tokens.length == balances.length, "ERR_LENGTH_MISMATCH"); require(tokens.length == denorms.length, "ERR_LENGTH_MISMATCH"); pool = factory.newBPool(); bool containsETH = false; for (uint i = 0; i < tokens.length; i++) { if (transferFromAllTo(tokens[i], balances[i], address(pool))) { containsETH = true; tokens[i] = address(weth); } } require(msg.value == 0 || containsETH, "!invalid payable"); pool.finalize(swapFee, initPoolSupply, tokens, denorms); pool.setExchangeProxy(address(this)); pool.setController(msg.sender); uint lpAmount = pool.balanceOf(address(this)); if (lpAmount > 0) { IERC20(pool).safeTransfer(msg.sender, lpAmount); } } function joinPool( IBPool pool, uint poolAmountOut, uint[] calldata maxAmountsIn, uint8 flag ) payable external discountCHI(flag) { address[] memory tokens = pool.getFinalTokens(); require(maxAmountsIn.length == tokens.length, "ERR_LENGTH_MISMATCH"); bool containsETH = false; for (uint i = 0; i < tokens.length; i++) { if (transferFromAllAndApprove(tokens[i], maxAmountsIn[i], address(pool))) { containsETH = true; } } require(msg.value == 0 || containsETH, "!invalid payable"); if (pool.version() == 1001) { pool.joinPool(poolAmountOut, maxAmountsIn); } else { pool.joinPoolFor(msg.sender, poolAmountOut, maxAmountsIn); } for (uint i = 0; i < tokens.length; i++) { transferAll(IERC20(tokens[i]), getBalance(IERC20(tokens[i]))); } uint lpAmount = pool.balanceOf(address(this)); transferAll(pool, lpAmount); } function joinswapExternAmountIn( IBPool pool, address tokenIn, uint tokenAmountIn, uint minPoolAmountOut, uint8 flag ) payable external discountCHI(flag) { bool containsETH = false; if (transferFromAllAndApprove(tokenIn, tokenAmountIn, address(pool))) { containsETH = true; } require(msg.value == 0 || containsETH, "!invalid payable"); uint poolAmountOut = pool.joinswapExternAmountIn(tokenIn, tokenAmountIn, minPoolAmountOut); IERC20(pool).safeTransfer(msg.sender, poolAmountOut); } function transferFromAllTo(address token, uint amount, address to) internal returns (bool containsETH) { if (isETH(IERC20(token))) { require(amount == msg.value, "!invalid amount"); weth.deposit{value : amount}(); weth.transfer(to,amount); containsETH = true; } else { IERC20(token).safeTransferFrom(msg.sender, to, amount); } return containsETH; } function transferFromAllAndApprove(address token, uint amount, address spender) internal returns (bool containsETH) { if (isETH(IERC20(token))) { require(amount == msg.value, "!invalid amount"); weth.deposit{value : amount}(); if (weth.allowance(address(this), spender) > 0) { IERC20(address(weth)).safeApprove(address(spender), 0); } IERC20(address(weth)).safeApprove(spender, amount); containsETH = true; } else { IERC20(token).safeTransferFrom(msg.sender, address(this), amount); if (IERC20(token).allowance(address(this), spender) > 0) { IERC20(token).safeApprove(spender, 0); } IERC20(token).safeApprove(spender, amount); } return containsETH; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"batchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"batchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"chi","outputs":[{"internalType":"contract IFreeFromUpTo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBFactory","name":"factory","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256[]","name":"denorms","type":"uint256[]"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"initPoolSupply","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"create","outputs":[{"internalType":"contract IBPool","name":"pool","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IBPool","name":"pool","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"joinPool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IBPool","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"joinswapExternAmountIn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"multihopBatchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"multihopBatchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"smartSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"}],"name":"smartSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"}],"name":"viewSplitExactIn","outputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"uint256","name":"totalOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"nPools","type":"uint256"}],"name":"viewSplitExactOut","outputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct ExchangeProxy.Swap[]","name":"swaps","type":"tuple[]"},{"internalType":"uint256","name":"totalOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620058ef380380620058ef833981016040819052620000349162000063565b600080546001600160a01b039092166001600160a01b0319928316179055600280549091163217905562000093565b60006020828403121562000075578081fd5b81516001600160a01b03811681146200008c578182fd5b9392505050565b61584c80620000a36000396000f3fe6080604052600436106100f75760003560e01c8063995605901161008a578063b43ae48f11610059578063b43ae48f1461025d578063c92aecc414610270578063d0bd7ca014610285578063fd63afa414610298576100fe565b806399560590146101f7578063a91ee0dc1461020a578063ab033ea91461022a578063ac95ea741461024a576100fe565b80635aa6e675116100c65780635aa6e6751461018f578063606df88b146101b15780638b4a59f5146101c457806396e90390146101d7576100fe565b8063368bb1fc146101035780634b0f93fb1461013a57806354575af41461015a578063599fe7f01461017c576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004614cd1565b6102ab565b60405161013192919061539e565b60405180910390f35b34801561014657600080fd5b50610123610155366004614cd1565b610688565b34801561016657600080fd5b5061017a6101753660046151dd565b6109ae565b005b61017a61018a3660046150d4565b610a8a565b34801561019b57600080fd5b506101a4610d09565b60405161013191906152ac565b6101a46101bf366004614f88565b610d18565b61017a6101d2366004615123565b61143c565b6101ea6101e5366004615186565b611acb565b60405161013191906156c7565b6101ea610205366004614ee5565b611c8f565b34801561021657600080fd5b5061017a610225366004614cb5565b612145565b34801561023657600080fd5b5061017a610245366004614cb5565b612191565b6101ea610258366004614dae565b6121dd565b6101ea61026b366004614e31565b6126a1565b34801561027c57600080fd5b506101a4613661565b6101ea610293366004614eac565b613673565b6101ea6102a6366004615186565b6139ef565b60015460405163bfdbfc4360e01b815260609160009183916001600160a01b03169063bfdbfc43906102e5908a908a908990600401615325565b60006040518083038186803b1580156102fd57600080fd5b505afa158015610311573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103399190810190614d16565b9050606081516001600160401b038111801561035457600080fd5b5060405190808252806020026020018201604052801561038e57816020015b61037b614a83565b8152602001906001900390816103735790505b5090506000805b8351811015610407576103bc8a8a8684815181106103af57fe5b6020026020010151613ae9565b8382815181106103c857fe5b60200260200101819052506103fd8382815181106103e257fe5b602002602001015160c0015183613dca90919063ffffffff16565b9150600101610395565b50606082516001600160401b038111801561042157600080fd5b5060405190808252806020026020018201604052801561044b578160200160208202803683370190505b5090506000805b84518110156104d75761048f8461048987848151811061046e57fe5b602002602001015160c001518d613df890919063ffffffff16565b90613e32565b83828151811061049b57fe5b6020026020010181815250506104cd8382815181106104b657fe5b602002602001015183613dca90919063ffffffff16565b9150600101610452565b508881101561052e576105106104ed8a83613e74565b836000815181106104fa57fe5b6020026020010151613dca90919063ffffffff16565b8260008151811061051d57fe5b602002602001018181525050610578565b61055e61053b828b613e74565b8360008151811061054857fe5b6020026020010151613e7490919063ffffffff16565b8260008151811061056b57fe5b6020026020010181815250505b83516001600160401b038111801561058f57600080fd5b506040519080825280602002602001820160405280156105c957816020015b6105b6614ac9565b8152602001906001900390816105ae5790505b50965060005b845181101561066d576040518060c001604052808683815181106105ef57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b0316815260200184838151811061063357fe5b60200260200101518152602001600019815260200160001981525088828151811061065a57fe5b60209081029190910101526001016105cf565b506106788285613eb6565b9550505050505094509492505050565b60015460405163bfdbfc4360e01b815260609160009183916001600160a01b03169063bfdbfc43906106c2908a908a908990600401615325565b60006040518083038186803b1580156106da57600080fd5b505afa1580156106ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107169190810190614d16565b9050606081516001600160401b038111801561073157600080fd5b5060405190808252806020026020018201604052801561076b57816020015b610758614a83565b8152602001906001900390816107505790505b5090506000805b83518110156107bc5761078c8a8a8684815181106103af57fe5b83828151811061079857fe5b60200260200101819052506107b28382815181106103e257fe5b9150600101610772565b50606082516001600160401b03811180156107d657600080fd5b50604051908082528060200260200182016040528015610800578160200160208202803683370190505b5090506000805b8451811015610854576108238461048987848151811061046e57fe5b83828151811061082f57fe5b60200260200101818152505061084a8382815181106104b657fe5b9150600101610807565b50888110156108885761086a6104ed8a83613e74565b8260008151811061087757fe5b6020026020010181815250506108af565b61089561053b828b613e74565b826000815181106108a257fe5b6020026020010181815250505b83516001600160401b03811180156108c657600080fd5b5060405190808252806020026020018201604052801561090057816020015b6108ed614ac9565b8152602001906001900390816108e55790505b50965060005b84518110156109a3576040518060c0016040528086838151811061092657fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b0316815260200184838151811061096a57fe5b602002602001015181526020016000815260200160001981525088828151811061099057fe5b6020908102919091010152600101610906565b506106788285614006565b6002546001600160a01b031633146109e15760405162461bcd60e51b81526004016109d89061545e565b60405180910390fd5b6109ea8361414f565b15610a71576000816001600160a01b031683604051610a08906152a9565b60006040518083038185875af1925050503d8060008114610a45576040519150601f19603f3d011682016040523d82523d6000602084013e610a4a565b606091505b5050905080610a6b5760405162461bcd60e51b81526004016109d8906155c8565b50610a85565b610a856001600160a01b0384168284614175565b505050565b8060018116610b71576000610aa08686896141cb565b15610aa9575060015b341580610ab35750805b610acf5760405162461bcd60e51b81526004016109d8906154b0565b604051635db3427760e01b81526000906001600160a01b03891690635db3427790610b02908a908a908a9060040161537d565b602060405180830381600087803b158015610b1c57600080fd5b505af1158015610b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b54919061521e565b9050610b6a6001600160a01b0389163383614175565b5050610d01565b60005a90506000610b8387878a6141cb565b15610b8c575060015b341580610b965750805b610bb25760405162461bcd60e51b81526004016109d8906154b0565b604051635db3427760e01b81526000906001600160a01b038a1690635db3427790610be5908b908b908b9060040161537d565b602060405180830381600087803b158015610bff57600080fd5b505af1158015610c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c37919061521e565b9050610c4d6001600160a01b038a163383614175565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c8d57fe5b046040518363ffffffff1660e01b8152600401610cab9291906152da565b602060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfd919061521e565b5050505b505050505050565b6002546001600160a01b031681565b6000816001811661104f5789518814610d435760405162461bcd60e51b81526004016109d890615483565b89518614610d635760405162461bcd60e51b81526004016109d890615483565b8a6001600160a01b031663d556c5dc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d9e57600080fd5b505af1158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd691906150b8565b91506000805b8b51811015610e6457610e158c8281518110610df457fe5b60200260200101518c8c84818110610e0857fe5b90506020020135866143e9565b15610e5c576000548c51600193506001600160a01b03909116908d9083908110610e3b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101610ddc565b50341580610e6f5750805b610e8b5760405162461bcd60e51b81526004016109d8906154b0565b826001600160a01b031663650e872c87878e8c8c6040518663ffffffff1660e01b8152600401610ebf9594939291906156f3565b600060405180830381600087803b158015610ed957600080fd5b505af1158015610eed573d6000803e3d6000fd5b5050604051637329df9d60e11b81526001600160a01b038616925063e653bf3a9150610f1d9030906004016152ac565b600060405180830381600087803b158015610f3757600080fd5b505af1158015610f4b573d6000803e3d6000fd5b50506040516392eefe9b60e01b81526001600160a01b03861692506392eefe9b9150610f7b9033906004016152ac565b600060405180830381600087803b158015610f9557600080fd5b505af1158015610fa9573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a0823190610fdc9030906004016152ac565b60206040518083038186803b158015610ff457600080fd5b505afa158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c919061521e565b90508015611048576110486001600160a01b0385163383614175565b505061142e565b60005a8b5190915089146110755760405162461bcd60e51b81526004016109d890615483565b8a5187146110955760405162461bcd60e51b81526004016109d890615483565b8b6001600160a01b031663d556c5dc6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156110d057600080fd5b505af11580156110e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110891906150b8565b92506000805b8c51811015611196576111478d828151811061112657fe5b60200260200101518d8d8481811061113a57fe5b90506020020135876143e9565b1561118e576000548d51600193506001600160a01b03909116908e908390811061116d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161110e565b503415806111a15750805b6111bd5760405162461bcd60e51b81526004016109d8906154b0565b836001600160a01b031663650e872c88888f8d8d6040518663ffffffff1660e01b81526004016111f19594939291906156f3565b600060405180830381600087803b15801561120b57600080fd5b505af115801561121f573d6000803e3d6000fd5b5050604051637329df9d60e11b81526001600160a01b038716925063e653bf3a915061124f9030906004016152ac565b600060405180830381600087803b15801561126957600080fd5b505af115801561127d573d6000803e3d6000fd5b50506040516392eefe9b60e01b81526001600160a01b03871692506392eefe9b91506112ad9033906004016152ac565b600060405180830381600087803b1580156112c757600080fd5b505af11580156112db573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03871691506370a082319061130e9030906004016152ac565b60206040518083038186803b15801561132657600080fd5b505afa15801561133a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135e919061521e565b9050801561137a5761137a6001600160a01b0386163383614175565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816113ba57fe5b046040518363ffffffff1660e01b81526004016113d89291906152da565b602060405180830381600087803b1580156113f257600080fd5b505af1158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a919061521e565b5050505b509998505050505050505050565b806001811661177d576060866001600160a01b031663be3bbd2e6040518163ffffffff1660e01b815260040160006040518083038186803b15801561148057600080fd5b505afa158015611494573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114bc9190810190614d16565b805190915084146114df5760405162461bcd60e51b81526004016109d890615483565b6000805b825181101561152e5761151c8382815181106114fb57fe5b602002602001015188888481811061150f57fe5b905060200201358b6141cb565b1561152657600191505b6001016114e3565b503415806115395750805b6115555760405162461bcd60e51b81526004016109d8906154b0565b876001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561158e57600080fd5b505afa1580156115a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c6919061521e565b6103e91415611636576040516313da703560e21b81526001600160a01b03891690634f69c0d4906115ff908a908a908a906004016156d0565b600060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b5050505061169b565b604051631365431d60e21b81526001600160a01b03891690634d950c74906116689033908b908b908b906004016152f3565b600060405180830381600087803b15801561168257600080fd5b505af1158015611696573d6000803e3d6000fd5b505050505b60005b82518110156116e8576116df8382815181106116b657fe5b60200260200101516116da8584815181106116cd57fe5b6020026020010151614522565b6145e5565b5060010161169e565b506040516370a0823160e01b81526000906001600160a01b038a16906370a08231906117189030906004016152ac565b60206040518083038186803b15801561173057600080fd5b505afa158015611744573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611768919061521e565b905061177489826145e5565b50505050610d01565b60005a90506060876001600160a01b031663be3bbd2e6040518163ffffffff1660e01b815260040160006040518083038186803b1580156117bd57600080fd5b505afa1580156117d1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117f99190810190614d16565b8051909150851461181c5760405162461bcd60e51b81526004016109d890615483565b6000805b825181101561186b5761185983828151811061183857fe5b602002602001015189898481811061184c57fe5b905060200201358c6141cb565b1561186357600191505b600101611820565b503415806118765750805b6118925760405162461bcd60e51b81526004016109d8906154b0565b886001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b1580156118cb57600080fd5b505afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611903919061521e565b6103e91415611973576040516313da703560e21b81526001600160a01b038a1690634f69c0d49061193c908b908b908b906004016156d0565b600060405180830381600087803b15801561195657600080fd5b505af115801561196a573d6000803e3d6000fd5b505050506119d8565b604051631365431d60e21b81526001600160a01b038a1690634d950c74906119a59033908c908c908c906004016152f3565b600060405180830381600087803b1580156119bf57600080fd5b505af11580156119d3573d6000803e3d6000fd5b505050505b60005b82518110156119fc576119f38382815181106116b657fe5b506001016119db565b506040516370a0823160e01b81526000906001600160a01b038b16906370a0823190611a2c9030906004016152ac565b60206040518083038186803b158015611a4457600080fd5b505afa158015611a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7c919061521e565b9050611a888a826145e5565b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c8d57fe5b60008160018116611b54576060611ae18961414f565b15611b0657600054611afe906001600160a01b0316898988610688565b509050611b3d565b611b0f8861414f565b15611b2d57600054611afe908a906001600160a01b03168988610688565b611b3989898988610688565b5090505b611b4c818a8a8a8a6000613673565b925050611c84565b60005a90506060611b648a61414f565b15611b8957600054611b81906001600160a01b03168a8a89610688565b509050611bc0565b611b928961414f565b15611bb057600054611b81908b906001600160a01b03168a89610688565b611bbc8a8a8a89610688565b5090505b611bcf818b8b8b8b6000613673565b935060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611c1057fe5b046040518363ffffffff1660e01b8152600401611c2e9291906152da565b602060405180830381600087803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c80919061521e565b5050505b509695505050505050565b60008160018116611e9257611ca48685614703565b5060005b8751811015611e5057611cb9614ac9565b888281518110611cc557fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90611d0d90309086906004016152c0565b60206040518083038186803b158015611d2557600080fd5b505afa158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d919061521e565b1115611d7b578251611d7b906001600160a01b038416906000614794565b82516080840151611d96916001600160a01b03851691614794565b60208301516080840151604080860151606087015160a08801519251631f17a7a960e21b81526000956001600160a01b03881695637c5e9ea495611de09592949193600401615349565b6040805180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e319190615236565b509050611e3e8188613dca565b96505060019093019250611ca8915050565b5083821115611e715760405162461bcd60e51b81526004016109d890615538565b611e7e856116da87614522565b50611e8c866116da88614522565b5061213b565b60005a9050611ea18786614703565b5060005b885181101561204d57611eb6614ac9565b898281518110611ec257fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90611f0a90309086906004016152c0565b60206040518083038186803b158015611f2257600080fd5b505afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a919061521e565b1115611f78578251611f78906001600160a01b038416906000614794565b82516080840151611f93916001600160a01b03851691614794565b60208301516080840151604080860151606087015160a08801519251631f17a7a960e21b81526000956001600160a01b03881695637c5e9ea495611fdd9592949193600401615349565b6040805180830381600087803b158015611ff657600080fd5b505af115801561200a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202e9190615236565b50905061203b8189613dca565b97505060019093019250611ea5915050565b508483111561206e5760405162461bcd60e51b81526004016109d890615538565b61207b866116da88614522565b50612089876116da89614522565b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816120c757fe5b046040518363ffffffff1660e01b81526004016120e59291906152da565b602060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612137919061521e565b5050505b5095945050505050565b6002546001600160a01b0316331461216f5760405162461bcd60e51b81526004016109d89061545e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146121bb5760405162461bcd60e51b81526004016109d89061545e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008160018116612426576121f28786614703565b5060005b88518110156123e7576000805b8a838151811061220f57fe5b6020026020010151518110156123d157612227614ac9565b8b848151811061223357fe5b6020026020010151828151811061224657fe5b60200260200101519050600081602001519050826001141561226a57606082018490525b8151604051636eb1769f60e11b81526000906001600160a01b0384169063dd62ed3e9061229d90309086906004016152c0565b60206040518083038186803b1580156122b557600080fd5b505afa1580156122c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ed919061521e565b111561230b57825161230b906001600160a01b038416906000614794565b82516060840151612326916001600160a01b03851691614794565b806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b815260040161236e959493929190615349565b6040805180830381600087803b15801561238757600080fd5b505af115801561239b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bf9190615236565b50945050600190920191506122039050565b506123dc8185613dca565b9350506001016121f6565b50838210156124085760405162461bcd60e51b81526004016109d890615511565b61241286836145e5565b50612420876116da89614522565b50611c84565b60005a90506124358887614703565b5060005b895181101561262a576000805b8b838151811061245257fe5b6020026020010151518110156126145761246a614ac9565b8c848151811061247657fe5b6020026020010151828151811061248957fe5b6020026020010151905060008160200151905082600114156124ad57606082018490525b8151604051636eb1769f60e11b81526000906001600160a01b0384169063dd62ed3e906124e090309086906004016152c0565b60206040518083038186803b1580156124f857600080fd5b505afa15801561250c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612530919061521e565b111561254e57825161254e906001600160a01b038416906000614794565b82516060840151612569916001600160a01b03851691614794565b806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b81526004016125b1959493929190615349565b6040805180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126029190615236565b50945050600190920191506124469050565b5061261f8186613dca565b945050600101612439565b508483101561264b5760405162461bcd60e51b81526004016109d890615511565b61265587846145e5565b50612663886116da8a614522565b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611c1057fe5b60008160018116612e84576126b68685614703565b5060005b8751811015611e505760008882815181106126d157fe5b60200260200101515160011415612880576126ea614ac9565b8983815181106126f657fe5b602002602001015160008151811061270a57fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e9061275290309086906004016152c0565b60206040518083038186803b15801561276a57600080fd5b505afa15801561277e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a2919061521e565b11156127c05782516127c0906001600160a01b038416906000614794565b825160808401516127db916001600160a01b03851691614794565b806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b8152600401612823959493929190615349565b6040805180830381600087803b15801561283c57600080fd5b505af1158015612850573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128749190615236565b509350612e6f92505050565b600061288a614ac9565b8a848151811061289657fe5b60200260200101516001815181106128aa57fe5b60209081029190910181015180519181015160405163f8b2cb4f60e01b81529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f916128f1916004016152ac565b60206040518083038186803b15801561290957600080fd5b505afa15801561291d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612941919061521e565b6020850151604051634a46c67360e11b81526001600160a01b0386169163948d8ce69161297191906004016152ac565b60206040518083038186803b15801561298957600080fd5b505afa15801561299d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c1919061521e565b604080870151905163f8b2cb4f60e01b81526001600160a01b0387169163f8b2cb4f916129f191906004016152ac565b60206040518083038186803b158015612a0957600080fd5b505afa158015612a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a41919061521e565b6040808801519051634a46c67360e11b81526001600160a01b0388169163948d8ce691612a7191906004016152ac565b60206040518083038186803b158015612a8957600080fd5b505afa158015612a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac1919061521e565b8760600151876001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015612aff57600080fd5b505afa158015612b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b37919061521e565b6040518763ffffffff1660e01b8152600401612b5896959493929190615765565b60206040518083038186803b158015612b7057600080fd5b505afa158015612b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba8919061521e565b9250612bb2614ac9565b8c8681518110612bbe57fe5b6020026020010151600081518110612bd257fe5b602090810291909101810151908101518151604051636eb1769f60e11b81529293509091600019906001600160a01b0384169063dd62ed3e90612c1b90309086906004016152c0565b60206040518083038186803b158015612c3357600080fd5b505afa158015612c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6b919061521e565b1015612c8a578251612c8a906001600160a01b03841690600019614794565b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b8152600401612cce959493929190615349565b6040805180830381600087803b158015612ce757600080fd5b505af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190615236565b5060208601518651604051636eb1769f60e11b81529299509091600019916001600160a01b0384169163dd62ed3e91612d5d913091906004016152c0565b60206040518083038186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dad919061521e565b1015612dcc578551612dcc906001600160a01b03831690600019614794565b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b8152600401612e14959493929190615349565b6040805180830381600087803b158015612e2d57600080fd5b505af1158015612e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e659190615236565b5050505050505050505b612e798185613dca565b9350506001016126ba565b60005a9050612e938786614703565b5060005b885181101561204d576000898281518110612eae57fe5b6020026020010151516001141561305d57612ec7614ac9565b8a8381518110612ed357fe5b6020026020010151600081518110612ee757fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90612f2f90309086906004016152c0565b60206040518083038186803b158015612f4757600080fd5b505afa158015612f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7f919061521e565b1115612f9d578251612f9d906001600160a01b038416906000614794565b82516080840151612fb8916001600160a01b03851691614794565b806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b8152600401613000959493929190615349565b6040805180830381600087803b15801561301957600080fd5b505af115801561302d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130519190615236565b50935061364c92505050565b6000613067614ac9565b8b848151811061307357fe5b602002602001015160018151811061308757fe5b60209081029190910181015180519181015160405163f8b2cb4f60e01b81529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f916130ce916004016152ac565b60206040518083038186803b1580156130e657600080fd5b505afa1580156130fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311e919061521e565b6020850151604051634a46c67360e11b81526001600160a01b0386169163948d8ce69161314e91906004016152ac565b60206040518083038186803b15801561316657600080fd5b505afa15801561317a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319e919061521e565b604080870151905163f8b2cb4f60e01b81526001600160a01b0387169163f8b2cb4f916131ce91906004016152ac565b60206040518083038186803b1580156131e657600080fd5b505afa1580156131fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321e919061521e565b6040808801519051634a46c67360e11b81526001600160a01b0388169163948d8ce69161324e91906004016152ac565b60206040518083038186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329e919061521e565b8760600151876001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132dc57600080fd5b505afa1580156132f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613314919061521e565b6040518763ffffffff1660e01b815260040161333596959493929190615765565b60206040518083038186803b15801561334d57600080fd5b505afa158015613361573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613385919061521e565b925061338f614ac9565b8d868151811061339b57fe5b60200260200101516000815181106133af57fe5b602090810291909101810151908101518151604051636eb1769f60e11b81529293509091600019906001600160a01b0384169063dd62ed3e906133f890309086906004016152c0565b60206040518083038186803b15801561341057600080fd5b505afa158015613424573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613448919061521e565b1015613467578251613467906001600160a01b03841690600019614794565b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b81526004016134ab959493929190615349565b6040805180830381600087803b1580156134c457600080fd5b505af11580156134d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134fc9190615236565b5060208601518651604051636eb1769f60e11b81529299509091600019916001600160a01b0384169163dd62ed3e9161353a913091906004016152c0565b60206040518083038186803b15801561355257600080fd5b505afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a919061521e565b10156135a95785516135a9906001600160a01b03831690600019614794565b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b81526004016135f1959493929190615349565b6040805180830381600087803b15801561360a57600080fd5b505af115801561361e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136429190615236565b5050505050505050505b6136568186613dca565b945050600101612e97565b6d4946c0e9f43f4dee607b0ef1fa1c81565b60008160018116613834576136888786614703565b5060005b88518110156123e75761369d614ac9565b8982815181106136a957fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906136f190309086906004016152c0565b60206040518083038186803b15801561370957600080fd5b505afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613741919061521e565b111561375f57825161375f906001600160a01b038416906000614794565b8251606084015161377a916001600160a01b03851691614794565b60208301516060840151604080860151608087015160a08801519251638201aa3f60e01b81526000956001600160a01b03881695638201aa3f956137c49592949193600401615349565b6040805180830381600087803b1580156137dd57600080fd5b505af11580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138159190615236565b5090506138228188613dca565b9650506001909301925061368c915050565b60005a90506138438887614703565b5060005b895181101561262a57613858614ac9565b8a828151811061386457fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906138ac90309086906004016152c0565b60206040518083038186803b1580156138c457600080fd5b505afa1580156138d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138fc919061521e565b111561391a57825161391a906001600160a01b038416906000614794565b82516060840151613935916001600160a01b03851691614794565b60208301516060840151604080860151608087015160a08801519251638201aa3f60e01b81526000956001600160a01b03881695638201aa3f9561397f9592949193600401615349565b6040805180830381600087803b15801561399857600080fd5b505af11580156139ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d09190615236565b5090506139dd8189613dca565b97505060019093019250613847915050565b60008160018116613a6f576060613a058961414f565b15613a2a57600054613a22906001600160a01b03168989886102ab565b509050613a61565b613a338861414f565b15613a5157600054613a22908a906001600160a01b031689886102ab565b613a5d898989886102ab565b5090505b611b4c818a8a896000611c8f565b60005a90506060613a7f8a61414f565b15613aa457600054613a9c906001600160a01b03168a8a896102ab565b509050613adb565b613aad8961414f565b15613acb57600054613a9c908b906001600160a01b03168a896102ab565b613ad78a8a8a896102ab565b5090505b611bcf818b8b8a6000611c8f565b613af1614a83565b60405163f8b2cb4f60e01b815282906000906001600160a01b0383169063f8b2cb4f90613b229089906004016152ac565b60206040518083038186803b158015613b3a57600080fd5b505afa158015613b4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b72919061521e565b90506000826001600160a01b031663f8b2cb4f876040518263ffffffff1660e01b8152600401613ba291906152ac565b60206040518083038186803b158015613bba57600080fd5b505afa158015613bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf2919061521e565b90506000836001600160a01b031663948d8ce6896040518263ffffffff1660e01b8152600401613c2291906152ac565b60206040518083038186803b158015613c3a57600080fd5b505afa158015613c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c72919061521e565b90506000846001600160a01b031663948d8ce6896040518263ffffffff1660e01b8152600401613ca291906152ac565b60206040518083038186803b158015613cba57600080fd5b505afa158015613cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf2919061521e565b90506000856001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d2f57600080fd5b505afa158015613d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d67919061521e565b90506000613d76848685614857565b9050613d80614a83565b506040805160e0810182526001600160a01b038b16815260208101979097528601939093526060850193909352608084015260a083019190915260c08201529150505b9392505050565b600082820183811015613def5760405162461bcd60e51b81526004016109d8906154da565b90505b92915050565b600082613e0757506000613df2565b82820282848281613e1457fe5b0414613def5760405162461bcd60e51b81526004016109d89061555e565b6000613def83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614896565b6000613def83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506148cd565b6000805b8351811015613fff576000838281518110613ed157fe5b6020026020010151600001516001600160a01b031663f8d6aed4858481518110613ef757fe5b602002602001015160200151868581518110613f0f57fe5b602002602001015160400151878681518110613f2757fe5b602002602001015160600151888781518110613f3f57fe5b6020026020010151608001518a8881518110613f5757fe5b60200260200101518a8981518110613f6b57fe5b602002602001015160a001516040518763ffffffff1660e01b8152600401613f9896959493929190615765565b60206040518083038186803b158015613fb057600080fd5b505afa158015613fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe8919061521e565b9050613ff48382613dca565b925050600101613eba565b5092915050565b6000805b8351811015613fff57600083828151811061402157fe5b6020026020010151600001516001600160a01b031663ba9530a685848151811061404757fe5b60200260200101516020015186858151811061405f57fe5b60200260200101516040015187868151811061407757fe5b60200260200101516060015188878151811061408f57fe5b6020026020010151608001518a88815181106140a757fe5b60200260200101518a89815181106140bb57fe5b602002602001015160a001516040518763ffffffff1660e01b81526004016140e896959493929190615765565b60206040518083038186803b15801561410057600080fd5b505afa158015614114573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614138919061521e565b90506141448382613dca565b92505060010161400a565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b610a858363a9059cbb60e01b84846040516024016141949291906152da565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526148f9565b60006141d68461414f565b15614324573483146141fa5760405162461bcd60e51b81526004016109d89061559f565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561424857600080fd5b505af115801561425c573d6000803e3d6000fd5b505060008054604051636eb1769f60e11b81529194506001600160a01b0316925063dd62ed3e915061429490309087906004016152c0565b60206040518083038186803b1580156142ac57600080fd5b505afa1580156142c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142e4919061521e565b11156143055760008054614305916001600160a01b03909116908490614794565b60005461431c906001600160a01b03168385614794565b506001613dc3565b6143396001600160a01b038516333086614988565b604051636eb1769f60e11b81526000906001600160a01b0386169063dd62ed3e9061436a90309087906004016152c0565b60206040518083038186803b15801561438257600080fd5b505afa158015614396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143ba919061521e565b11156143d5576143d56001600160a01b038516836000614794565b613dc36001600160a01b0385168385614794565b60006143f48461414f565b1561450d573483146144185760405162461bcd60e51b81526004016109d89061559f565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561446657600080fd5b505af115801561447a573d6000803e3d6000fd5b505060005460405163a9059cbb60e01b81526001600160a01b03909116935063a9059cbb92506144b19150859087906004016152da565b602060405180830381600087803b1580156144cb57600080fd5b505af11580156144df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145039190614f68565b5060019050613dc3565b613dc36001600160a01b038516338486614988565b600061452d8261414f565b156145b9576000546040516370a0823160e01b81526001600160a01b03909116906370a08231906145629030906004016152ac565b60206040518083038186803b15801561457a57600080fd5b505afa15801561458e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145b2919061521e565b9050614170565b6040516370a0823160e01b81526001600160a01b038316906370a08231906145629030906004016152ac565b6000816145f457506001613df2565b6145fd8361414f565b156146e657600054604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d906146329085906004016156c7565b600060405180830381600087803b15801561464c57600080fd5b505af1158015614660573d6000803e3d6000fd5b505050506000336001600160a01b03168360405161467d906152a9565b60006040518083038185875af1925050503d80600081146146ba576040519150601f19603f3d011682016040523d82523d6000602084013e6146bf565b606091505b50509050806146e05760405162461bcd60e51b81526004016109d8906155c8565b506146fa565b6146fa6001600160a01b0384163384614175565b50600192915050565b600061470e8361414f565b1561477f5760008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561476157600080fd5b505af1158015614775573d6000803e3d6000fd5b50505050506146fa565b6146fa6001600160a01b038416333085614988565b80158061481c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906147ca90309086906004016152c0565b60206040518083038186803b1580156147e257600080fd5b505afa1580156147f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061481a919061521e565b155b6148385760405162461bcd60e51b81526004016109d890615671565b610a858363095ea7b360e01b84846040516024016141949291906152da565b600061488e670de0b6b3a764000061048985614888614876878a613dca565b6104898a670de0b6b3a7640000613df8565b90613df8565b949350505050565b600081836148b75760405162461bcd60e51b81526004016109d8919061542b565b5060008385816148c357fe5b0495945050505050565b600081848411156148f15760405162461bcd60e51b81526004016109d8919061542b565b505050900390565b606061494e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149af9092919063ffffffff16565b805190915015610a85578080602001905181019061496c9190614f68565b610a855760405162461bcd60e51b81526004016109d890615627565b6149a9846323b872dd60e01b85858560405160240161419493929190615325565b50505050565b606061488e848460008560606149c485614a7d565b6149e05760405162461bcd60e51b81526004016109d8906155f0565b60006060866001600160a01b031685876040516149fd919061528d565b60006040518083038185875af1925050503d8060008114614a3a576040519150601f19603f3d011682016040523d82523d6000602084013e614a3f565b606091505b50915091508115614a5357915061488e9050565b805115614a635780518082602001fd5b8360405162461bcd60e51b81526004016109d8919061542b565b3b151590565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b8035613df2816157fe565b600082601f830112614b35578081fd5b8135614b48614b43826157b3565b61578d565b818152915060208083019084810160005b84811015614b8257614b70888484358a0101614b8d565b84529282019290820190600101614b59565b505050505092915050565b600082601f830112614b9d578081fd5b8135614bab614b43826157b3565b818152915060208083019084810160c080850287018301881015614bce57600080fd5b6000805b86811015614c4f5782848b031215614be8578182fd5b614bf18361578d565b614bfb8b86614b1a565b8152614c098b878701614b1a565b868201526040614c1b8c828801614b1a565b90820152606085810135908201526080808601359082015260a0808601359082015286529484019492820192600101614bd2565b5050505050505092915050565b60008083601f840112614c6d578182fd5b5081356001600160401b03811115614c83578182fd5b6020830191508360208083028501011115614c9d57600080fd5b9250929050565b803560ff81168114613df257600080fd5b600060208284031215614cc6578081fd5b8135613def816157fe565b60008060008060808587031215614ce6578283fd5b8435614cf1816157fe565b93506020850135614d01816157fe565b93969395505050506040820135916060013590565b60006020808385031215614d28578182fd5b82516001600160401b03811115614d3d578283fd5b8301601f81018513614d4d578283fd5b8051614d5b614b43826157b3565b8181528381019083850185840285018601891015614d77578687fd5b8694505b83851015614da2578051614d8e816157fe565b835260019490940193918501918501614d7b565b50979650505050505050565b60008060008060008060c08789031215614dc6578182fd5b86356001600160401b03811115614ddb578283fd5b614de789828a01614b25565b9650506020870135614df8816157fe565b94506040870135614e08816157fe565b93506060870135925060808701359150614e258860a08901614ca4565b90509295509295509295565b600080600080600060a08688031215614e48578081fd5b85356001600160401b03811115614e5d578182fd5b614e6988828901614b25565b9550506020860135614e7a816157fe565b93506040860135614e8a816157fe565b925060608601359150614ea08760808801614ca4565b90509295509295909350565b60008060008060008060c08789031215614ec4578384fd5b86356001600160401b03811115614ed9578485fd5b614de789828a01614b8d565b600080600080600060a08688031215614efc578283fd5b85356001600160401b03811115614f11578384fd5b614f1d88828901614b8d565b9550506020860135614f2e816157fe565b93506040860135614f3e816157fe565b925060608601359150608086013560ff81168114614f5a578182fd5b809150509295509295909350565b600060208284031215614f79578081fd5b81518015158114613def578182fd5b600080600080600080600080600060e08a8c031215614fa5578687fd5b614faf8a356157fe565b893598506001600160401b038060208c01351115614fcb578788fd5b60208b01358b018c601f820112614fe0578889fd5b614fed614b4382356157b3565b8082358252602082019150602083018f6020808635028601011115615010578b8cfd5b8b5b843581101561503b5761502582356157fe565b8135845260209384019390910190600101615012565b5050809b505050508060408c01351115615053578788fd5b6150638c60408d01358d01614c5c565b909850965060608b0135811015615078578384fd5b506150898b60608c01358c01614c5c565b909550935060808a0135925060a08a013591506150a98b60c08c01614ca4565b90509295985092959850929598565b6000602082840312156150c9578081fd5b8151613def816157fe565b600080600080600060a086880312156150eb578283fd5b85356150f6816157fe565b94506020860135615106816157fe565b93506040860135925060608601359150614ea08760808801614ca4565b60008060008060006080868803121561513a578283fd5b8535615145816157fe565b94506020860135935060408601356001600160401b03811115615166578384fd5b61517288828901614c5c565b9094509250614ea090508760608801614ca4565b60008060008060008060c0878903121561519e578384fd5b86356151a9816157fe565b955060208701356151b9816157fe565b9450604087013593506060870135925060808701359150614e258860a08901614ca4565b6000806000606084860312156151f1578081fd5b83356151fc816157fe565b9250602084013591506040840135615213816157fe565b809150509250925092565b60006020828403121561522f578081fd5b5051919050565b60008060408385031215615248578182fd5b505080516020909101519092909150565b81835260006001600160fb1b03831115615271578081fd5b6020830280836020870137939093016020019283525090919050565b6000825161529f8184602087016157d2565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b03861682528460208301526060604083015261531b606083018486615259565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03958616815260208101949094529190931660408301526060820192909252608081019190915260a00190565b6001600160a01b039390931683526020830191909152604082015260600190565b6040808252835182820181905260009190606090818501906020808901865b8381101561541757815180516001600160a01b0390811687528482015181168588015288820151168887015286810151878701526080808201519087015260a0908101519086015260c090940193908201906001016153bd565b505095909501959095525092949350505050565b600060208252825180602084015261544a8160408501602087016157d2565b601f01601f19169190910160400192915050565b6020808252600b908201526a21676f7665726e616e636560a81b604082015260600190565b60208082526013908201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604082015260600190565b60208082526010908201526f21696e76616c69642070617961626c6560801b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600d908201526c11549497d31253525517d3d555609a1b604082015260600190565b6020808252600c908201526b22a9292fa624a6a4aa2fa4a760a11b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600f908201526e085a5b9d985b1a5908185b5bdd5b9d608a1b604082015260600190565b6020808252600e908201526d11549497d1551217d1905253115160921b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b6000848252604060208301526156ea604083018486615259565b95945050505050565b600060808201878352602087818501526080604085015281875180845260a0860191508289019350845b818110156157425784516001600160a01b03168352938301939183019160010161571d565b50508481036060860152615757818789615259565b9a9950505050505050505050565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b6040518181016001600160401b03811182821017156157ab57600080fd5b604052919050565b60006001600160401b038211156157c8578081fd5b5060209081020190565b60005b838110156157ed5781810151838201526020016157d5565b838111156149a95750506000910152565b6001600160a01b038116811461581357600080fd5b5056fea264697066735822122021e486a2851a3054e75483d2bc69ce79c6d5de46485d9d1f46cf1174b523188764736f6c634300060c0033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106100f75760003560e01c8063995605901161008a578063b43ae48f11610059578063b43ae48f1461025d578063c92aecc414610270578063d0bd7ca014610285578063fd63afa414610298576100fe565b806399560590146101f7578063a91ee0dc1461020a578063ab033ea91461022a578063ac95ea741461024a576100fe565b80635aa6e675116100c65780635aa6e6751461018f578063606df88b146101b15780638b4a59f5146101c457806396e90390146101d7576100fe565b8063368bb1fc146101035780634b0f93fb1461013a57806354575af41461015a578063599fe7f01461017c576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e366004614cd1565b6102ab565b60405161013192919061539e565b60405180910390f35b34801561014657600080fd5b50610123610155366004614cd1565b610688565b34801561016657600080fd5b5061017a6101753660046151dd565b6109ae565b005b61017a61018a3660046150d4565b610a8a565b34801561019b57600080fd5b506101a4610d09565b60405161013191906152ac565b6101a46101bf366004614f88565b610d18565b61017a6101d2366004615123565b61143c565b6101ea6101e5366004615186565b611acb565b60405161013191906156c7565b6101ea610205366004614ee5565b611c8f565b34801561021657600080fd5b5061017a610225366004614cb5565b612145565b34801561023657600080fd5b5061017a610245366004614cb5565b612191565b6101ea610258366004614dae565b6121dd565b6101ea61026b366004614e31565b6126a1565b34801561027c57600080fd5b506101a4613661565b6101ea610293366004614eac565b613673565b6101ea6102a6366004615186565b6139ef565b60015460405163bfdbfc4360e01b815260609160009183916001600160a01b03169063bfdbfc43906102e5908a908a908990600401615325565b60006040518083038186803b1580156102fd57600080fd5b505afa158015610311573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103399190810190614d16565b9050606081516001600160401b038111801561035457600080fd5b5060405190808252806020026020018201604052801561038e57816020015b61037b614a83565b8152602001906001900390816103735790505b5090506000805b8351811015610407576103bc8a8a8684815181106103af57fe5b6020026020010151613ae9565b8382815181106103c857fe5b60200260200101819052506103fd8382815181106103e257fe5b602002602001015160c0015183613dca90919063ffffffff16565b9150600101610395565b50606082516001600160401b038111801561042157600080fd5b5060405190808252806020026020018201604052801561044b578160200160208202803683370190505b5090506000805b84518110156104d75761048f8461048987848151811061046e57fe5b602002602001015160c001518d613df890919063ffffffff16565b90613e32565b83828151811061049b57fe5b6020026020010181815250506104cd8382815181106104b657fe5b602002602001015183613dca90919063ffffffff16565b9150600101610452565b508881101561052e576105106104ed8a83613e74565b836000815181106104fa57fe5b6020026020010151613dca90919063ffffffff16565b8260008151811061051d57fe5b602002602001018181525050610578565b61055e61053b828b613e74565b8360008151811061054857fe5b6020026020010151613e7490919063ffffffff16565b8260008151811061056b57fe5b6020026020010181815250505b83516001600160401b038111801561058f57600080fd5b506040519080825280602002602001820160405280156105c957816020015b6105b6614ac9565b8152602001906001900390816105ae5790505b50965060005b845181101561066d576040518060c001604052808683815181106105ef57fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b0316815260200184838151811061063357fe5b60200260200101518152602001600019815260200160001981525088828151811061065a57fe5b60209081029190910101526001016105cf565b506106788285613eb6565b9550505050505094509492505050565b60015460405163bfdbfc4360e01b815260609160009183916001600160a01b03169063bfdbfc43906106c2908a908a908990600401615325565b60006040518083038186803b1580156106da57600080fd5b505afa1580156106ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107169190810190614d16565b9050606081516001600160401b038111801561073157600080fd5b5060405190808252806020026020018201604052801561076b57816020015b610758614a83565b8152602001906001900390816107505790505b5090506000805b83518110156107bc5761078c8a8a8684815181106103af57fe5b83828151811061079857fe5b60200260200101819052506107b28382815181106103e257fe5b9150600101610772565b50606082516001600160401b03811180156107d657600080fd5b50604051908082528060200260200182016040528015610800578160200160208202803683370190505b5090506000805b8451811015610854576108238461048987848151811061046e57fe5b83828151811061082f57fe5b60200260200101818152505061084a8382815181106104b657fe5b9150600101610807565b50888110156108885761086a6104ed8a83613e74565b8260008151811061087757fe5b6020026020010181815250506108af565b61089561053b828b613e74565b826000815181106108a257fe5b6020026020010181815250505b83516001600160401b03811180156108c657600080fd5b5060405190808252806020026020018201604052801561090057816020015b6108ed614ac9565b8152602001906001900390816108e55790505b50965060005b84518110156109a3576040518060c0016040528086838151811061092657fe5b6020026020010151600001516001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b0316815260200184838151811061096a57fe5b602002602001015181526020016000815260200160001981525088828151811061099057fe5b6020908102919091010152600101610906565b506106788285614006565b6002546001600160a01b031633146109e15760405162461bcd60e51b81526004016109d89061545e565b60405180910390fd5b6109ea8361414f565b15610a71576000816001600160a01b031683604051610a08906152a9565b60006040518083038185875af1925050503d8060008114610a45576040519150601f19603f3d011682016040523d82523d6000602084013e610a4a565b606091505b5050905080610a6b5760405162461bcd60e51b81526004016109d8906155c8565b50610a85565b610a856001600160a01b0384168284614175565b505050565b8060018116610b71576000610aa08686896141cb565b15610aa9575060015b341580610ab35750805b610acf5760405162461bcd60e51b81526004016109d8906154b0565b604051635db3427760e01b81526000906001600160a01b03891690635db3427790610b02908a908a908a9060040161537d565b602060405180830381600087803b158015610b1c57600080fd5b505af1158015610b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b54919061521e565b9050610b6a6001600160a01b0389163383614175565b5050610d01565b60005a90506000610b8387878a6141cb565b15610b8c575060015b341580610b965750805b610bb25760405162461bcd60e51b81526004016109d8906154b0565b604051635db3427760e01b81526000906001600160a01b038a1690635db3427790610be5908b908b908b9060040161537d565b602060405180830381600087803b158015610bff57600080fd5b505af1158015610c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c37919061521e565b9050610c4d6001600160a01b038a163383614175565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c8d57fe5b046040518363ffffffff1660e01b8152600401610cab9291906152da565b602060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfd919061521e565b5050505b505050505050565b6002546001600160a01b031681565b6000816001811661104f5789518814610d435760405162461bcd60e51b81526004016109d890615483565b89518614610d635760405162461bcd60e51b81526004016109d890615483565b8a6001600160a01b031663d556c5dc6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d9e57600080fd5b505af1158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd691906150b8565b91506000805b8b51811015610e6457610e158c8281518110610df457fe5b60200260200101518c8c84818110610e0857fe5b90506020020135866143e9565b15610e5c576000548c51600193506001600160a01b03909116908d9083908110610e3b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101610ddc565b50341580610e6f5750805b610e8b5760405162461bcd60e51b81526004016109d8906154b0565b826001600160a01b031663650e872c87878e8c8c6040518663ffffffff1660e01b8152600401610ebf9594939291906156f3565b600060405180830381600087803b158015610ed957600080fd5b505af1158015610eed573d6000803e3d6000fd5b5050604051637329df9d60e11b81526001600160a01b038616925063e653bf3a9150610f1d9030906004016152ac565b600060405180830381600087803b158015610f3757600080fd5b505af1158015610f4b573d6000803e3d6000fd5b50506040516392eefe9b60e01b81526001600160a01b03861692506392eefe9b9150610f7b9033906004016152ac565b600060405180830381600087803b158015610f9557600080fd5b505af1158015610fa9573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a0823190610fdc9030906004016152ac565b60206040518083038186803b158015610ff457600080fd5b505afa158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c919061521e565b90508015611048576110486001600160a01b0385163383614175565b505061142e565b60005a8b5190915089146110755760405162461bcd60e51b81526004016109d890615483565b8a5187146110955760405162461bcd60e51b81526004016109d890615483565b8b6001600160a01b031663d556c5dc6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156110d057600080fd5b505af11580156110e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110891906150b8565b92506000805b8c51811015611196576111478d828151811061112657fe5b60200260200101518d8d8481811061113a57fe5b90506020020135876143e9565b1561118e576000548d51600193506001600160a01b03909116908e908390811061116d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161110e565b503415806111a15750805b6111bd5760405162461bcd60e51b81526004016109d8906154b0565b836001600160a01b031663650e872c88888f8d8d6040518663ffffffff1660e01b81526004016111f19594939291906156f3565b600060405180830381600087803b15801561120b57600080fd5b505af115801561121f573d6000803e3d6000fd5b5050604051637329df9d60e11b81526001600160a01b038716925063e653bf3a915061124f9030906004016152ac565b600060405180830381600087803b15801561126957600080fd5b505af115801561127d573d6000803e3d6000fd5b50506040516392eefe9b60e01b81526001600160a01b03871692506392eefe9b91506112ad9033906004016152ac565b600060405180830381600087803b1580156112c757600080fd5b505af11580156112db573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03871691506370a082319061130e9030906004016152ac565b60206040518083038186803b15801561132657600080fd5b505afa15801561133a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135e919061521e565b9050801561137a5761137a6001600160a01b0386163383614175565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816113ba57fe5b046040518363ffffffff1660e01b81526004016113d89291906152da565b602060405180830381600087803b1580156113f257600080fd5b505af1158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a919061521e565b5050505b509998505050505050505050565b806001811661177d576060866001600160a01b031663be3bbd2e6040518163ffffffff1660e01b815260040160006040518083038186803b15801561148057600080fd5b505afa158015611494573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114bc9190810190614d16565b805190915084146114df5760405162461bcd60e51b81526004016109d890615483565b6000805b825181101561152e5761151c8382815181106114fb57fe5b602002602001015188888481811061150f57fe5b905060200201358b6141cb565b1561152657600191505b6001016114e3565b503415806115395750805b6115555760405162461bcd60e51b81526004016109d8906154b0565b876001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561158e57600080fd5b505afa1580156115a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c6919061521e565b6103e91415611636576040516313da703560e21b81526001600160a01b03891690634f69c0d4906115ff908a908a908a906004016156d0565b600060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b5050505061169b565b604051631365431d60e21b81526001600160a01b03891690634d950c74906116689033908b908b908b906004016152f3565b600060405180830381600087803b15801561168257600080fd5b505af1158015611696573d6000803e3d6000fd5b505050505b60005b82518110156116e8576116df8382815181106116b657fe5b60200260200101516116da8584815181106116cd57fe5b6020026020010151614522565b6145e5565b5060010161169e565b506040516370a0823160e01b81526000906001600160a01b038a16906370a08231906117189030906004016152ac565b60206040518083038186803b15801561173057600080fd5b505afa158015611744573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611768919061521e565b905061177489826145e5565b50505050610d01565b60005a90506060876001600160a01b031663be3bbd2e6040518163ffffffff1660e01b815260040160006040518083038186803b1580156117bd57600080fd5b505afa1580156117d1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117f99190810190614d16565b8051909150851461181c5760405162461bcd60e51b81526004016109d890615483565b6000805b825181101561186b5761185983828151811061183857fe5b602002602001015189898481811061184c57fe5b905060200201358c6141cb565b1561186357600191505b600101611820565b503415806118765750805b6118925760405162461bcd60e51b81526004016109d8906154b0565b886001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b1580156118cb57600080fd5b505afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611903919061521e565b6103e91415611973576040516313da703560e21b81526001600160a01b038a1690634f69c0d49061193c908b908b908b906004016156d0565b600060405180830381600087803b15801561195657600080fd5b505af115801561196a573d6000803e3d6000fd5b505050506119d8565b604051631365431d60e21b81526001600160a01b038a1690634d950c74906119a59033908c908c908c906004016152f3565b600060405180830381600087803b1580156119bf57600080fd5b505af11580156119d3573d6000803e3d6000fd5b505050505b60005b82518110156119fc576119f38382815181106116b657fe5b506001016119db565b506040516370a0823160e01b81526000906001600160a01b038b16906370a0823190611a2c9030906004016152ac565b60206040518083038186803b158015611a4457600080fd5b505afa158015611a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7c919061521e565b9050611a888a826145e5565b5060009250506010360290505a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610c8d57fe5b60008160018116611b54576060611ae18961414f565b15611b0657600054611afe906001600160a01b0316898988610688565b509050611b3d565b611b0f8861414f565b15611b2d57600054611afe908a906001600160a01b03168988610688565b611b3989898988610688565b5090505b611b4c818a8a8a8a6000613673565b925050611c84565b60005a90506060611b648a61414f565b15611b8957600054611b81906001600160a01b03168a8a89610688565b509050611bc0565b611b928961414f565b15611bb057600054611b81908b906001600160a01b03168a89610688565b611bbc8a8a8a89610688565b5090505b611bcf818b8b8b8b6000613673565b935060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611c1057fe5b046040518363ffffffff1660e01b8152600401611c2e9291906152da565b602060405180830381600087803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c80919061521e565b5050505b509695505050505050565b60008160018116611e9257611ca48685614703565b5060005b8751811015611e5057611cb9614ac9565b888281518110611cc557fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90611d0d90309086906004016152c0565b60206040518083038186803b158015611d2557600080fd5b505afa158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d919061521e565b1115611d7b578251611d7b906001600160a01b038416906000614794565b82516080840151611d96916001600160a01b03851691614794565b60208301516080840151604080860151606087015160a08801519251631f17a7a960e21b81526000956001600160a01b03881695637c5e9ea495611de09592949193600401615349565b6040805180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e319190615236565b509050611e3e8188613dca565b96505060019093019250611ca8915050565b5083821115611e715760405162461bcd60e51b81526004016109d890615538565b611e7e856116da87614522565b50611e8c866116da88614522565b5061213b565b60005a9050611ea18786614703565b5060005b885181101561204d57611eb6614ac9565b898281518110611ec257fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90611f0a90309086906004016152c0565b60206040518083038186803b158015611f2257600080fd5b505afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a919061521e565b1115611f78578251611f78906001600160a01b038416906000614794565b82516080840151611f93916001600160a01b03851691614794565b60208301516080840151604080860151606087015160a08801519251631f17a7a960e21b81526000956001600160a01b03881695637c5e9ea495611fdd9592949193600401615349565b6040805180830381600087803b158015611ff657600080fd5b505af115801561200a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202e9190615236565b50905061203b8189613dca565b97505060019093019250611ea5915050565b508483111561206e5760405162461bcd60e51b81526004016109d890615538565b61207b866116da88614522565b50612089876116da89614522565b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816120c757fe5b046040518363ffffffff1660e01b81526004016120e59291906152da565b602060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612137919061521e565b5050505b5095945050505050565b6002546001600160a01b0316331461216f5760405162461bcd60e51b81526004016109d89061545e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146121bb5760405162461bcd60e51b81526004016109d89061545e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008160018116612426576121f28786614703565b5060005b88518110156123e7576000805b8a838151811061220f57fe5b6020026020010151518110156123d157612227614ac9565b8b848151811061223357fe5b6020026020010151828151811061224657fe5b60200260200101519050600081602001519050826001141561226a57606082018490525b8151604051636eb1769f60e11b81526000906001600160a01b0384169063dd62ed3e9061229d90309086906004016152c0565b60206040518083038186803b1580156122b557600080fd5b505afa1580156122c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ed919061521e565b111561230b57825161230b906001600160a01b038416906000614794565b82516060840151612326916001600160a01b03851691614794565b806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b815260040161236e959493929190615349565b6040805180830381600087803b15801561238757600080fd5b505af115801561239b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bf9190615236565b50945050600190920191506122039050565b506123dc8185613dca565b9350506001016121f6565b50838210156124085760405162461bcd60e51b81526004016109d890615511565b61241286836145e5565b50612420876116da89614522565b50611c84565b60005a90506124358887614703565b5060005b895181101561262a576000805b8b838151811061245257fe5b6020026020010151518110156126145761246a614ac9565b8c848151811061247657fe5b6020026020010151828151811061248957fe5b6020026020010151905060008160200151905082600114156124ad57606082018490525b8151604051636eb1769f60e11b81526000906001600160a01b0384169063dd62ed3e906124e090309086906004016152c0565b60206040518083038186803b1580156124f857600080fd5b505afa15801561250c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612530919061521e565b111561254e57825161254e906001600160a01b038416906000614794565b82516060840151612569916001600160a01b03851691614794565b806001600160a01b0316638201aa3f84602001518560600151866040015187608001518860a001516040518663ffffffff1660e01b81526004016125b1959493929190615349565b6040805180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126029190615236565b50945050600190920191506124469050565b5061261f8186613dca565b945050600101612439565b508483101561264b5760405162461bcd60e51b81526004016109d890615511565b61265587846145e5565b50612663886116da8a614522565b506000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181611c1057fe5b60008160018116612e84576126b68685614703565b5060005b8751811015611e505760008882815181106126d157fe5b60200260200101515160011415612880576126ea614ac9565b8983815181106126f657fe5b602002602001015160008151811061270a57fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e9061275290309086906004016152c0565b60206040518083038186803b15801561276a57600080fd5b505afa15801561277e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a2919061521e565b11156127c05782516127c0906001600160a01b038416906000614794565b825160808401516127db916001600160a01b03851691614794565b806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b8152600401612823959493929190615349565b6040805180830381600087803b15801561283c57600080fd5b505af1158015612850573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128749190615236565b509350612e6f92505050565b600061288a614ac9565b8a848151811061289657fe5b60200260200101516001815181106128aa57fe5b60209081029190910181015180519181015160405163f8b2cb4f60e01b81529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f916128f1916004016152ac565b60206040518083038186803b15801561290957600080fd5b505afa15801561291d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612941919061521e565b6020850151604051634a46c67360e11b81526001600160a01b0386169163948d8ce69161297191906004016152ac565b60206040518083038186803b15801561298957600080fd5b505afa15801561299d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c1919061521e565b604080870151905163f8b2cb4f60e01b81526001600160a01b0387169163f8b2cb4f916129f191906004016152ac565b60206040518083038186803b158015612a0957600080fd5b505afa158015612a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a41919061521e565b6040808801519051634a46c67360e11b81526001600160a01b0388169163948d8ce691612a7191906004016152ac565b60206040518083038186803b158015612a8957600080fd5b505afa158015612a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac1919061521e565b8760600151876001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015612aff57600080fd5b505afa158015612b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b37919061521e565b6040518763ffffffff1660e01b8152600401612b5896959493929190615765565b60206040518083038186803b158015612b7057600080fd5b505afa158015612b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba8919061521e565b9250612bb2614ac9565b8c8681518110612bbe57fe5b6020026020010151600081518110612bd257fe5b602090810291909101810151908101518151604051636eb1769f60e11b81529293509091600019906001600160a01b0384169063dd62ed3e90612c1b90309086906004016152c0565b60206040518083038186803b158015612c3357600080fd5b505afa158015612c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6b919061521e565b1015612c8a578251612c8a906001600160a01b03841690600019614794565b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b8152600401612cce959493929190615349565b6040805180830381600087803b158015612ce757600080fd5b505af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190615236565b5060208601518651604051636eb1769f60e11b81529299509091600019916001600160a01b0384169163dd62ed3e91612d5d913091906004016152c0565b60206040518083038186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dad919061521e565b1015612dcc578551612dcc906001600160a01b03831690600019614794565b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b8152600401612e14959493929190615349565b6040805180830381600087803b158015612e2d57600080fd5b505af1158015612e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e659190615236565b5050505050505050505b612e798185613dca565b9350506001016126ba565b60005a9050612e938786614703565b5060005b885181101561204d576000898281518110612eae57fe5b6020026020010151516001141561305d57612ec7614ac9565b8a8381518110612ed357fe5b6020026020010151600081518110612ee757fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e90612f2f90309086906004016152c0565b60206040518083038186803b158015612f4757600080fd5b505afa158015612f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7f919061521e565b1115612f9d578251612f9d906001600160a01b038416906000614794565b82516080840151612fb8916001600160a01b03851691614794565b806001600160a01b0316637c5e9ea484602001518560800151866040015187606001518860a001516040518663ffffffff1660e01b8152600401613000959493929190615349565b6040805180830381600087803b15801561301957600080fd5b505af115801561302d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130519190615236565b50935061364c92505050565b6000613067614ac9565b8b848151811061307357fe5b602002602001015160018151811061308757fe5b60209081029190910181015180519181015160405163f8b2cb4f60e01b81529193506001600160a01b0383169163f8d6aed491839163f8b2cb4f916130ce916004016152ac565b60206040518083038186803b1580156130e657600080fd5b505afa1580156130fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311e919061521e565b6020850151604051634a46c67360e11b81526001600160a01b0386169163948d8ce69161314e91906004016152ac565b60206040518083038186803b15801561316657600080fd5b505afa15801561317a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319e919061521e565b604080870151905163f8b2cb4f60e01b81526001600160a01b0387169163f8b2cb4f916131ce91906004016152ac565b60206040518083038186803b1580156131e657600080fd5b505afa1580156131fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321e919061521e565b6040808801519051634a46c67360e11b81526001600160a01b0388169163948d8ce69161324e91906004016152ac565b60206040518083038186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329e919061521e565b8760600151876001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132dc57600080fd5b505afa1580156132f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613314919061521e565b6040518763ffffffff1660e01b815260040161333596959493929190615765565b60206040518083038186803b15801561334d57600080fd5b505afa158015613361573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613385919061521e565b925061338f614ac9565b8d868151811061339b57fe5b60200260200101516000815181106133af57fe5b602090810291909101810151908101518151604051636eb1769f60e11b81529293509091600019906001600160a01b0384169063dd62ed3e906133f890309086906004016152c0565b60206040518083038186803b15801561341057600080fd5b505afa158015613424573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613448919061521e565b1015613467578251613467906001600160a01b03841690600019614794565b806001600160a01b0316637c5e9ea48460200151856080015186604001518a8860a001516040518663ffffffff1660e01b81526004016134ab959493929190615349565b6040805180830381600087803b1580156134c457600080fd5b505af11580156134d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134fc9190615236565b5060208601518651604051636eb1769f60e11b81529299509091600019916001600160a01b0384169163dd62ed3e9161353a913091906004016152c0565b60206040518083038186803b15801561355257600080fd5b505afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a919061521e565b10156135a95785516135a9906001600160a01b03831690600019614794565b846001600160a01b0316637c5e9ea48760200151886080015189604001518a606001518b60a001516040518663ffffffff1660e01b81526004016135f1959493929190615349565b6040805180830381600087803b15801561360a57600080fd5b505af115801561361e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136429190615236565b5050505050505050505b6136568186613dca565b945050600101612e97565b6d4946c0e9f43f4dee607b0ef1fa1c81565b60008160018116613834576136888786614703565b5060005b88518110156123e75761369d614ac9565b8982815181106136a957fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906136f190309086906004016152c0565b60206040518083038186803b15801561370957600080fd5b505afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613741919061521e565b111561375f57825161375f906001600160a01b038416906000614794565b8251606084015161377a916001600160a01b03851691614794565b60208301516060840151604080860151608087015160a08801519251638201aa3f60e01b81526000956001600160a01b03881695638201aa3f956137c49592949193600401615349565b6040805180830381600087803b1580156137dd57600080fd5b505af11580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138159190615236565b5090506138228188613dca565b9650506001909301925061368c915050565b60005a90506138438887614703565b5060005b895181101561262a57613858614ac9565b8a828151811061386457fe5b602090810291909101810151908101518151604051636eb1769f60e11b815292935090916000906001600160a01b0384169063dd62ed3e906138ac90309086906004016152c0565b60206040518083038186803b1580156138c457600080fd5b505afa1580156138d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138fc919061521e565b111561391a57825161391a906001600160a01b038416906000614794565b82516060840151613935916001600160a01b03851691614794565b60208301516060840151604080860151608087015160a08801519251638201aa3f60e01b81526000956001600160a01b03881695638201aa3f9561397f9592949193600401615349565b6040805180830381600087803b15801561399857600080fd5b505af11580156139ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d09190615236565b5090506139dd8189613dca565b97505060019093019250613847915050565b60008160018116613a6f576060613a058961414f565b15613a2a57600054613a22906001600160a01b03168989886102ab565b509050613a61565b613a338861414f565b15613a5157600054613a22908a906001600160a01b031689886102ab565b613a5d898989886102ab565b5090505b611b4c818a8a896000611c8f565b60005a90506060613a7f8a61414f565b15613aa457600054613a9c906001600160a01b03168a8a896102ab565b509050613adb565b613aad8961414f565b15613acb57600054613a9c908b906001600160a01b03168a896102ab565b613ad78a8a8a896102ab565b5090505b611bcf818b8b8a6000611c8f565b613af1614a83565b60405163f8b2cb4f60e01b815282906000906001600160a01b0383169063f8b2cb4f90613b229089906004016152ac565b60206040518083038186803b158015613b3a57600080fd5b505afa158015613b4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b72919061521e565b90506000826001600160a01b031663f8b2cb4f876040518263ffffffff1660e01b8152600401613ba291906152ac565b60206040518083038186803b158015613bba57600080fd5b505afa158015613bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bf2919061521e565b90506000836001600160a01b031663948d8ce6896040518263ffffffff1660e01b8152600401613c2291906152ac565b60206040518083038186803b158015613c3a57600080fd5b505afa158015613c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c72919061521e565b90506000846001600160a01b031663948d8ce6896040518263ffffffff1660e01b8152600401613ca291906152ac565b60206040518083038186803b158015613cba57600080fd5b505afa158015613cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf2919061521e565b90506000856001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d2f57600080fd5b505afa158015613d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d67919061521e565b90506000613d76848685614857565b9050613d80614a83565b506040805160e0810182526001600160a01b038b16815260208101979097528601939093526060850193909352608084015260a083019190915260c08201529150505b9392505050565b600082820183811015613def5760405162461bcd60e51b81526004016109d8906154da565b90505b92915050565b600082613e0757506000613df2565b82820282848281613e1457fe5b0414613def5760405162461bcd60e51b81526004016109d89061555e565b6000613def83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614896565b6000613def83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506148cd565b6000805b8351811015613fff576000838281518110613ed157fe5b6020026020010151600001516001600160a01b031663f8d6aed4858481518110613ef757fe5b602002602001015160200151868581518110613f0f57fe5b602002602001015160400151878681518110613f2757fe5b602002602001015160600151888781518110613f3f57fe5b6020026020010151608001518a8881518110613f5757fe5b60200260200101518a8981518110613f6b57fe5b602002602001015160a001516040518763ffffffff1660e01b8152600401613f9896959493929190615765565b60206040518083038186803b158015613fb057600080fd5b505afa158015613fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe8919061521e565b9050613ff48382613dca565b925050600101613eba565b5092915050565b6000805b8351811015613fff57600083828151811061402157fe5b6020026020010151600001516001600160a01b031663ba9530a685848151811061404757fe5b60200260200101516020015186858151811061405f57fe5b60200260200101516040015187868151811061407757fe5b60200260200101516060015188878151811061408f57fe5b6020026020010151608001518a88815181106140a757fe5b60200260200101518a89815181106140bb57fe5b602002602001015160a001516040518763ffffffff1660e01b81526004016140e896959493929190615765565b60206040518083038186803b15801561410057600080fd5b505afa158015614114573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614138919061521e565b90506141448382613dca565b92505060010161400a565b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b919050565b610a858363a9059cbb60e01b84846040516024016141949291906152da565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526148f9565b60006141d68461414f565b15614324573483146141fa5760405162461bcd60e51b81526004016109d89061559f565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561424857600080fd5b505af115801561425c573d6000803e3d6000fd5b505060008054604051636eb1769f60e11b81529194506001600160a01b0316925063dd62ed3e915061429490309087906004016152c0565b60206040518083038186803b1580156142ac57600080fd5b505afa1580156142c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142e4919061521e565b11156143055760008054614305916001600160a01b03909116908490614794565b60005461431c906001600160a01b03168385614794565b506001613dc3565b6143396001600160a01b038516333086614988565b604051636eb1769f60e11b81526000906001600160a01b0386169063dd62ed3e9061436a90309087906004016152c0565b60206040518083038186803b15801561438257600080fd5b505afa158015614396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143ba919061521e565b11156143d5576143d56001600160a01b038516836000614794565b613dc36001600160a01b0385168385614794565b60006143f48461414f565b1561450d573483146144185760405162461bcd60e51b81526004016109d89061559f565b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561446657600080fd5b505af115801561447a573d6000803e3d6000fd5b505060005460405163a9059cbb60e01b81526001600160a01b03909116935063a9059cbb92506144b19150859087906004016152da565b602060405180830381600087803b1580156144cb57600080fd5b505af11580156144df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145039190614f68565b5060019050613dc3565b613dc36001600160a01b038516338486614988565b600061452d8261414f565b156145b9576000546040516370a0823160e01b81526001600160a01b03909116906370a08231906145629030906004016152ac565b60206040518083038186803b15801561457a57600080fd5b505afa15801561458e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145b2919061521e565b9050614170565b6040516370a0823160e01b81526001600160a01b038316906370a08231906145629030906004016152ac565b6000816145f457506001613df2565b6145fd8361414f565b156146e657600054604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d906146329085906004016156c7565b600060405180830381600087803b15801561464c57600080fd5b505af1158015614660573d6000803e3d6000fd5b505050506000336001600160a01b03168360405161467d906152a9565b60006040518083038185875af1925050503d80600081146146ba576040519150601f19603f3d011682016040523d82523d6000602084013e6146bf565b606091505b50509050806146e05760405162461bcd60e51b81526004016109d8906155c8565b506146fa565b6146fa6001600160a01b0384163384614175565b50600192915050565b600061470e8361414f565b1561477f5760008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561476157600080fd5b505af1158015614775573d6000803e3d6000fd5b50505050506146fa565b6146fa6001600160a01b038416333085614988565b80158061481c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906147ca90309086906004016152c0565b60206040518083038186803b1580156147e257600080fd5b505afa1580156147f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061481a919061521e565b155b6148385760405162461bcd60e51b81526004016109d890615671565b610a858363095ea7b360e01b84846040516024016141949291906152da565b600061488e670de0b6b3a764000061048985614888614876878a613dca565b6104898a670de0b6b3a7640000613df8565b90613df8565b949350505050565b600081836148b75760405162461bcd60e51b81526004016109d8919061542b565b5060008385816148c357fe5b0495945050505050565b600081848411156148f15760405162461bcd60e51b81526004016109d8919061542b565b505050900390565b606061494e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149af9092919063ffffffff16565b805190915015610a85578080602001905181019061496c9190614f68565b610a855760405162461bcd60e51b81526004016109d890615627565b6149a9846323b872dd60e01b85858560405160240161419493929190615325565b50505050565b606061488e848460008560606149c485614a7d565b6149e05760405162461bcd60e51b81526004016109d8906155f0565b60006060866001600160a01b031685876040516149fd919061528d565b60006040518083038185875af1925050503d8060008114614a3a576040519150601f19603f3d011682016040523d82523d6000602084013e614a3f565b606091505b50915091508115614a5357915061488e9050565b805115614a635780518082602001fd5b8360405162461bcd60e51b81526004016109d8919061542b565b3b151590565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b8035613df2816157fe565b600082601f830112614b35578081fd5b8135614b48614b43826157b3565b61578d565b818152915060208083019084810160005b84811015614b8257614b70888484358a0101614b8d565b84529282019290820190600101614b59565b505050505092915050565b600082601f830112614b9d578081fd5b8135614bab614b43826157b3565b818152915060208083019084810160c080850287018301881015614bce57600080fd5b6000805b86811015614c4f5782848b031215614be8578182fd5b614bf18361578d565b614bfb8b86614b1a565b8152614c098b878701614b1a565b868201526040614c1b8c828801614b1a565b90820152606085810135908201526080808601359082015260a0808601359082015286529484019492820192600101614bd2565b5050505050505092915050565b60008083601f840112614c6d578182fd5b5081356001600160401b03811115614c83578182fd5b6020830191508360208083028501011115614c9d57600080fd5b9250929050565b803560ff81168114613df257600080fd5b600060208284031215614cc6578081fd5b8135613def816157fe565b60008060008060808587031215614ce6578283fd5b8435614cf1816157fe565b93506020850135614d01816157fe565b93969395505050506040820135916060013590565b60006020808385031215614d28578182fd5b82516001600160401b03811115614d3d578283fd5b8301601f81018513614d4d578283fd5b8051614d5b614b43826157b3565b8181528381019083850185840285018601891015614d77578687fd5b8694505b83851015614da2578051614d8e816157fe565b835260019490940193918501918501614d7b565b50979650505050505050565b60008060008060008060c08789031215614dc6578182fd5b86356001600160401b03811115614ddb578283fd5b614de789828a01614b25565b9650506020870135614df8816157fe565b94506040870135614e08816157fe565b93506060870135925060808701359150614e258860a08901614ca4565b90509295509295509295565b600080600080600060a08688031215614e48578081fd5b85356001600160401b03811115614e5d578182fd5b614e6988828901614b25565b9550506020860135614e7a816157fe565b93506040860135614e8a816157fe565b925060608601359150614ea08760808801614ca4565b90509295509295909350565b60008060008060008060c08789031215614ec4578384fd5b86356001600160401b03811115614ed9578485fd5b614de789828a01614b8d565b600080600080600060a08688031215614efc578283fd5b85356001600160401b03811115614f11578384fd5b614f1d88828901614b8d565b9550506020860135614f2e816157fe565b93506040860135614f3e816157fe565b925060608601359150608086013560ff81168114614f5a578182fd5b809150509295509295909350565b600060208284031215614f79578081fd5b81518015158114613def578182fd5b600080600080600080600080600060e08a8c031215614fa5578687fd5b614faf8a356157fe565b893598506001600160401b038060208c01351115614fcb578788fd5b60208b01358b018c601f820112614fe0578889fd5b614fed614b4382356157b3565b8082358252602082019150602083018f6020808635028601011115615010578b8cfd5b8b5b843581101561503b5761502582356157fe565b8135845260209384019390910190600101615012565b5050809b505050508060408c01351115615053578788fd5b6150638c60408d01358d01614c5c565b909850965060608b0135811015615078578384fd5b506150898b60608c01358c01614c5c565b909550935060808a0135925060a08a013591506150a98b60c08c01614ca4565b90509295985092959850929598565b6000602082840312156150c9578081fd5b8151613def816157fe565b600080600080600060a086880312156150eb578283fd5b85356150f6816157fe565b94506020860135615106816157fe565b93506040860135925060608601359150614ea08760808801614ca4565b60008060008060006080868803121561513a578283fd5b8535615145816157fe565b94506020860135935060408601356001600160401b03811115615166578384fd5b61517288828901614c5c565b9094509250614ea090508760608801614ca4565b60008060008060008060c0878903121561519e578384fd5b86356151a9816157fe565b955060208701356151b9816157fe565b9450604087013593506060870135925060808701359150614e258860a08901614ca4565b6000806000606084860312156151f1578081fd5b83356151fc816157fe565b9250602084013591506040840135615213816157fe565b809150509250925092565b60006020828403121561522f578081fd5b5051919050565b60008060408385031215615248578182fd5b505080516020909101519092909150565b81835260006001600160fb1b03831115615271578081fd5b6020830280836020870137939093016020019283525090919050565b6000825161529f8184602087016157d2565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b03861682528460208301526060604083015261531b606083018486615259565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03958616815260208101949094529190931660408301526060820192909252608081019190915260a00190565b6001600160a01b039390931683526020830191909152604082015260600190565b6040808252835182820181905260009190606090818501906020808901865b8381101561541757815180516001600160a01b0390811687528482015181168588015288820151168887015286810151878701526080808201519087015260a0908101519086015260c090940193908201906001016153bd565b505095909501959095525092949350505050565b600060208252825180602084015261544a8160408501602087016157d2565b601f01601f19169190910160400192915050565b6020808252600b908201526a21676f7665726e616e636560a81b604082015260600190565b60208082526013908201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604082015260600190565b60208082526010908201526f21696e76616c69642070617961626c6560801b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600d908201526c11549497d31253525517d3d555609a1b604082015260600190565b6020808252600c908201526b22a9292fa624a6a4aa2fa4a760a11b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600f908201526e085a5b9d985b1a5908185b5bdd5b9d608a1b604082015260600190565b6020808252600e908201526d11549497d1551217d1905253115160921b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b6000848252604060208301526156ea604083018486615259565b95945050505050565b600060808201878352602087818501526080604085015281875180845260a0860191508289019350845b818110156157425784516001600160a01b03168352938301939183019160010161571d565b50508481036060860152615757818789615259565b9a9950505050505050505050565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b6040518181016001600160401b03811182821017156157ab57600080fd5b604052919050565b60006001600160401b038211156157c8578081fd5b5060209081020190565b60005b838110156157ed5781810151838201526020016157d5565b838111156149a95750506000910152565b6001600160a01b038116811461581357600080fd5b5056fea264697066735822122021e486a2851a3054e75483d2bc69ce79c6d5de46485d9d1f46cf1174b523188764736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
20634:24033:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34055:1766;;;;;;;;;;-1:-1:-1;34055:1766:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;32291:1756;;;;;;;;;;-1:-1:-1;32291:1756:0;;;;;:::i;:::-;;:::i;40119:368::-;;;;;;;;;;-1:-1:-1;40119:368:0;;;;;:::i;:::-;;:::i;:::-;;42732:607;;;;;;:::i;:::-;;:::i;21884:25::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40532:1130::-;;;;;;:::i;:::-;;:::i;41670:1054::-;;;;;;:::i;:::-;;:::i;30657:814::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23622:1223::-;;;;;;:::i;:::-;;:::i;22194:169::-;;;;;;;;;;-1:-1:-1;22194:169:0;;;;;:::i;:::-;;:::i;22031:155::-;;;;;;;;;;-1:-1:-1;22031:155:0;;;;;:::i;:::-;;:::i;24853:1771::-;;;;;;:::i;:::-;;:::i;26632:4017::-;;;;;;:::i;:::-;;:::i;20764:93::-;;;;;;;;;;;;;:::i;22371:1243::-;;;;;;:::i;:::-;;:::i;31479:804::-;;;;;;:::i;:::-;;:::i;34055:1766::-;34309:8;;:57;;-1:-1:-1;;;34309:57:0;;34221:19;;34242:16;;34221:19;;-1:-1:-1;;;;;34309:8:0;;:30;;:57;;34340:7;;34349:8;;34359:6;;34309:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34309:57:0;;;;;;;;;;;;:::i;:::-;34276:90;;34379:19;34412:13;:20;-1:-1:-1;;;;;34401:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;34379:54:0;-1:-1:-1;34444:26:0;;34481:227;34502:13;:20;34498:1;:24;34481:227;;;34555:48;34567:7;34576:8;34586:13;34600:1;34586:16;;;;;;;;;;;;;;34555:11;:48::i;:::-;34544:5;34550:1;34544:8;;;;;;;;;;;;;:59;;;;34642:54;34668:5;34674:1;34668:8;;;;;;;;;;;;;;:27;;;34642:21;:25;;:54;;;;:::i;:::-;34618:78;-1:-1:-1;34524:3:0;;34481:227;;;;34720:30;34764:5;:12;-1:-1:-1;;;;;34753:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34753:24:0;-1:-1:-1;34720:57:0;-1:-1:-1;34788:21:0;;34820:234;34841:5;:12;34837:1;:16;34820:234;;;34897:70;34945:21;34897:43;34912:5;34918:1;34912:8;;;;;;;;;;;;;;:27;;;34897:10;:14;;:43;;;;:::i;:::-;:47;;:70::i;:::-;34875:16;34892:1;34875:19;;;;;;;;;;;;;:92;;;;;35001:41;35022:16;35039:1;35022:19;;;;;;;;;;;;;;35001:16;:20;;:41;;;;:::i;:::-;34982:60;-1:-1:-1;34855:3:0;;34820:234;;;;35089:10;35070:16;:29;35066:253;;;35138:57;35162:32;:10;35177:16;35162:14;:32::i;:::-;35138:16;35155:1;35138:19;;;;;;;;;;;;;;:23;;:57;;;;:::i;:::-;35116:16;35133:1;35116:19;;;;;;;;;;;;;:79;;;;;35066:253;;;35250:57;35274:32;:16;35295:10;35274:20;:32::i;:::-;35250:16;35267:1;35250:19;;;;;;;;;;;;;;:23;;:57;;;;:::i;:::-;35228:16;35245:1;35228:19;;;;;;;;;;;;;:79;;;;;35066:253;35350:5;:12;-1:-1:-1;;;;;35339:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;35331:32;;35381:6;35376:326;35397:5;:12;35393:1;:16;35376:326;;;35442:248;;;;;;;;35469:5;35475:1;35469:8;;;;;;;;;;;;;;:13;;;-1:-1:-1;;;;;35442:248:0;;;;;35507:7;-1:-1:-1;;;;;35442:248:0;;;;;35540:8;-1:-1:-1;;;;;35442:248:0;;;;;35576:16;35593:1;35576:19;;;;;;;;;;;;;;35442:248;;;;-1:-1:-1;;35442:248:0;;;;-1:-1:-1;;35442:248:0;;;35431:5;35437:1;35431:8;;;;;;;;;;;;;;;;;:259;35411:3;;35376:326;;;;35728:45;35749:16;35767:5;35728:20;:45::i;:::-;35714:59;;35786:27;;;;;34055:1766;;;;;;;:::o;32291:1756::-;32544:8;;:57;;-1:-1:-1;;;32544:57:0;;32456:19;;32477:16;;32456:19;;-1:-1:-1;;;;;32544:8:0;;:30;;:57;;32575:7;;32584:8;;32594:6;;32544:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32544:57:0;;;;;;;;;;;;:::i;:::-;32511:90;;32614:19;32647:13;:20;-1:-1:-1;;;;;32636:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;32614:54:0;-1:-1:-1;32679:26:0;;32716:227;32737:13;:20;32733:1;:24;32716:227;;;32790:48;32802:7;32811:8;32821:13;32835:1;32821:16;;;;;;;32790:48;32779:5;32785:1;32779:8;;;;;;;;;;;;;:59;;;;32877:54;32903:5;32909:1;32903:8;;;;;;;32877:54;32853:78;-1:-1:-1;32759:3:0;;32716:227;;;;32955:30;32999:5;:12;-1:-1:-1;;;;;32988:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32988:24:0;-1:-1:-1;32955:57:0;-1:-1:-1;33023:21:0;;33055:234;33076:5;:12;33072:1;:16;33055:234;;;33132:70;33180:21;33132:43;33147:5;33153:1;33147:8;;;;;;;33132:70;33110:16;33127:1;33110:19;;;;;;;;;;;;;:92;;;;;33236:41;33257:16;33274:1;33257:19;;;;;;;33236:41;33217:60;-1:-1:-1;33090:3:0;;33055:234;;;;33324:10;33305:16;:29;33301:253;;;33373:57;33397:32;:10;33412:16;33397:14;:32::i;33373:57::-;33351:16;33368:1;33351:19;;;;;;;;;;;;;:79;;;;;33301:253;;;33485:57;33509:32;:16;33530:10;33509:20;:32::i;33485:57::-;33463:16;33480:1;33463:19;;;;;;;;;;;;;:79;;;;;33301:253;33585:5;:12;-1:-1:-1;;;;;33574:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;33566:32;;33616:6;33611:318;33632:5;:12;33628:1;:16;33611:318;;;33677:240;;;;;;;;33704:5;33710:1;33704:8;;;;;;;;;;;;;;:13;;;-1:-1:-1;;;;;33677:240:0;;;;;33742:7;-1:-1:-1;;;;;33677:240:0;;;;;33775:8;-1:-1:-1;;;;;33677:240:0;;;;;33811:16;33828:1;33811:19;;;;;;;;;;;;;;33677:240;;;;33865:1;33677:240;;;;-1:-1:-1;;33677:240:0;;;33666:5;33672:1;33666:8;;;;;;;;;;;;;;;;;:251;33646:3;;33611:318;;;;33955:44;33975:16;33993:5;33955:19;:44::i;40119:368::-;40241:10;;-1:-1:-1;;;;;40241:10:0;40227;:24;40219:48;;;;-1:-1:-1;;;40219:48:0;;;;;;;:::i;:::-;;;;;;;;;40282:13;40288:6;40282:5;:13::i;:::-;40278:202;;;40313:9;40327:3;-1:-1:-1;;;;;40327:8:0;40344:7;40327:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40312:44;;;40379:4;40371:31;;;;-1:-1:-1;;;40371:31:0;;;;;;;:::i;:::-;40278:202;;;;40435:33;-1:-1:-1;;;;;40435:19:0;;40455:3;40460:7;40435:19;:33::i;:::-;40119:368;;;:::o;42732:607::-;42930:4;20922:3;20915:10;;20910:284;;42947:16:::1;42986:64;43012:7;43021:13;43044:4;42986:25;:64::i;:::-;42982:115;;;-1:-1:-1::0;43081:4:0::1;42982:115;43115:9;:14:::0;;:29:::1;;;43133:11;43115:29;43107:58;;;;-1:-1:-1::0;;;43107:58:0::1;;;;;;;:::i;:::-;43199:69;::::0;-1:-1:-1;;;43199:69:0;;43178:18:::1;::::0;-1:-1:-1;;;;;43199:27:0;::::1;::::0;::::1;::::0;:69:::1;::::0;43227:7;;43236:13;;43251:16;;43199:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43178:90:::0;-1:-1:-1;43279:52:0::1;-1:-1:-1::0;;;;;43279:25:0;::::1;43305:10;43178:90:::0;43279:25:::1;:52::i;:::-;20948:1;;20910:284:::0;;;20982:16;21001:9;20982:28;;42947:16:::1;42986:64;43012:7;43021:13;43044:4;42986:25;:64::i;:::-;42982:115;;;-1:-1:-1::0;43081:4:0::1;42982:115;43115:9;:14:::0;;:29:::1;;;43133:11;43115:29;43107:58;;;;-1:-1:-1::0;;;43107:58:0::1;;;;;;;:::i;:::-;43199:69;::::0;-1:-1:-1;;;43199:69:0;;43178:18:::1;::::0;-1:-1:-1;;;;;43199:27:0;::::1;::::0;::::1;::::0;:69:::1;::::0;43227:7;;43236:13;;43251:16;;43199:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43178:90:::0;-1:-1:-1;43279:52:0::1;-1:-1:-1::0;;;;;43279:25:0;::::1;43305:10;43178:90:::0;43279:25:::1;:52::i;:::-;-1:-1:-1::0;21041:16:0;;-1:-1:-1;21091:2:0;21096:8;21091:20;21079:9;21068:8;21060:5;:16;:28;:51;21041:70;;20814:42;-1:-1:-1;;;;;21126:16:0;;21143:10;21176:5;21156:8;21167:5;21156:16;21155:26;;;;;;21126:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20910:284;;;42732:607;;;;;;:::o;21884:25::-;;;-1:-1:-1;;;;;21884:25:0;;:::o;40532:1130::-;40804:11;40789:4;20922:3;20915:10;;20910:284;;40836:13;;:32;::::1;40828:64;;;;-1:-1:-1::0;;;40828:64:0::1;;;;;;;:::i;:::-;40911:13:::0;;:31;::::1;40903:63;;;;-1:-1:-1::0;;;40903:63:0::1;;;;;;;:::i;:::-;40984:7;-1:-1:-1::0;;;;;40984:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40977:25;;41013:16;41053:6:::0;41048:226:::1;41069:6;:13;41065:1;:17;41048:226;;;41108:56;41126:6;41133:1;41126:9;;;;;;;;;;;;;;41137:8;;41146:1;41137:11;;;;;;;;;;;;;41158:4;41108:17;:56::i;:::-;41104:159;;;41242:4;::::0;41222:9;;41199:4:::1;::::0;-1:-1:-1;;;;;;41242:4:0;;::::1;::::0;41222:6;;41229:1;;41222:9;::::1;;;;;;;;;;:25;-1:-1:-1::0;;;;;41222:25:0::1;;;-1:-1:-1::0;;;;;41222:25:0::1;;;::::0;::::1;41104:159;41084:3;;41048:226;;;-1:-1:-1::0;41292:9:0::1;:14:::0;;:29:::1;;;41310:11;41292:29;41284:58;;;;-1:-1:-1::0;;;41284:58:0::1;;;;;;;:::i;:::-;41353:4;-1:-1:-1::0;;;;;41353:13:0::1;;41367:7;41376:14;41392:6;41400:7;;41353:55;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41419:36:0::1;::::0;-1:-1:-1;;;41419:36:0;;-1:-1:-1;;;;;41419:21:0;::::1;::::0;-1:-1:-1;41419:21:0::1;::::0;-1:-1:-1;41419:36:0::1;::::0;41449:4:::1;::::0;41419:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41466:30:0::1;::::0;-1:-1:-1;;;41466:30:0;;-1:-1:-1;;;;;41466:18:0;::::1;::::0;-1:-1:-1;41466:18:0::1;::::0;-1:-1:-1;41466:30:0::1;::::0;41485:10:::1;::::0;41466:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41523:29:0::1;::::0;-1:-1:-1;;;41523:29:0;;41507:13:::1;::::0;-1:-1:-1;;;;;;41523:14:0;::::1;::::0;-1:-1:-1;41523:14:0::1;::::0;:29:::1;::::0;41546:4:::1;::::0;41523:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41507:45:::0;-1:-1:-1;41567:12:0;;41563:92:::1;;41596:47;-1:-1:-1::0;;;;;41596:25:0;::::1;41622:10;41634:8:::0;41596:25:::1;:47::i;:::-;20948:1;;20910:284:::0;;;20982:16;21001:9;40836:13;;20982:28;;-1:-1:-1;40836:32:0;::::1;40828:64;;;;-1:-1:-1::0;;;40828:64:0::1;;;;;;;:::i;:::-;40911:13:::0;;:31;::::1;40903:63;;;;-1:-1:-1::0;;;40903:63:0::1;;;;;;;:::i;:::-;40984:7;-1:-1:-1::0;;;;;40984:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40977:25;;41013:16;41053:6:::0;41048:226:::1;41069:6;:13;41065:1;:17;41048:226;;;41108:56;41126:6;41133:1;41126:9;;;;;;;;;;;;;;41137:8;;41146:1;41137:11;;;;;;;;;;;;;41158:4;41108:17;:56::i;:::-;41104:159;;;41242:4;::::0;41222:9;;41199:4:::1;::::0;-1:-1:-1;;;;;;41242:4:0;;::::1;::::0;41222:6;;41229:1;;41222:9;::::1;;;;;;;;;;:25;-1:-1:-1::0;;;;;41222:25:0::1;;;-1:-1:-1::0;;;;;41222:25:0::1;;;::::0;::::1;41104:159;41084:3;;41048:226;;;-1:-1:-1::0;41292:9:0::1;:14:::0;;:29:::1;;;41310:11;41292:29;41284:58;;;;-1:-1:-1::0;;;41284:58:0::1;;;;;;;:::i;:::-;41353:4;-1:-1:-1::0;;;;;41353:13:0::1;;41367:7;41376:14;41392:6;41400:7;;41353:55;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41419:36:0::1;::::0;-1:-1:-1;;;41419:36:0;;-1:-1:-1;;;;;41419:21:0;::::1;::::0;-1:-1:-1;41419:21:0::1;::::0;-1:-1:-1;41419:36:0::1;::::0;41449:4:::1;::::0;41419:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41466:30:0::1;::::0;-1:-1:-1;;;41466:30:0;;-1:-1:-1;;;;;41466:18:0;::::1;::::0;-1:-1:-1;41466:18:0::1;::::0;-1:-1:-1;41466:30:0::1;::::0;41485:10:::1;::::0;41466:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41523:29:0::1;::::0;-1:-1:-1;;;41523:29:0;;41507:13:::1;::::0;-1:-1:-1;;;;;;41523:14:0;::::1;::::0;-1:-1:-1;41523:14:0::1;::::0;:29:::1;::::0;41546:4:::1;::::0;41523:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41507:45:::0;-1:-1:-1;41567:12:0;;41563:92:::1;;41596:47;-1:-1:-1::0;;;;;41596:25:0;::::1;41622:10;41634:8:::0;41596:25:::1;:47::i;:::-;-1:-1:-1::0;21041:16:0;;-1:-1:-1;21091:2:0;21096:8;21091:20;21079:9;21068:8;21060:5;:16;:28;:51;21041:70;;20814:42;-1:-1:-1;;;;;21126:16:0;;21143:10;21176:5;21156:8;21167:5;21156:16;21155:26;;;;;;21126:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20910:284;;;40532:1130;;;;;;;;;;;;:::o;41670:1054::-;41835:4;20922:3;20915:10;;20910:284;;41852:23:::1;41878:4;-1:-1:-1::0;;;;;41878:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;41878:21:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;41941:13:::0;;41852:47;;-1:-1:-1;41918:36:0;::::1;41910:68;;;;-1:-1:-1::0;;;41910:68:0::1;;;;;;;:::i;:::-;41989:16;42029:6:::0;42024:194:::1;42045:6;:13;42041:1;:17;42024:194;;;42084:68;42110:6;42117:1;42110:9;;;;;;;;;;;;;;42121:12;;42134:1;42121:15;;;;;;;;;;;;;42146:4;42084:25;:68::i;:::-;42080:127;;;42187:4;42173:18;;42080:127;42060:3;;42024:194;;;-1:-1:-1::0;42236:9:0::1;:14:::0;;:29:::1;;;42254:11;42236:29;42228:58;;;;-1:-1:-1::0;;;42228:58:0::1;;;;;;;:::i;:::-;42301:4;-1:-1:-1::0;;;;;42301:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42319:4;42301:22;42297:187;;;42340:42;::::0;-1:-1:-1;;;42340:42:0;;-1:-1:-1;;;;;42340:13:0;::::1;::::0;::::1;::::0;:42:::1;::::0;42354:13;;42369:12;;;;42340:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42297:187;;;42415:57;::::0;-1:-1:-1;;;42415:57:0;;-1:-1:-1;;;;;42415:16:0;::::1;::::0;::::1;::::0;:57:::1;::::0;42432:10:::1;::::0;42444:13;;42459:12;;;;42415:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42297:187;42499:6;42494:129;42515:6;:13;42511:1;:17;42494:129;;;42550:61;42569:6;42576:1;42569:9;;;;;;;;;;;;;;42581:29;42599:6;42606:1;42599:9;;;;;;;;;;;;;;42581:10;:29::i;:::-;42550:11;:61::i;:::-;-1:-1:-1::0;42530:3:0::1;;42494:129;;;-1:-1:-1::0;42649:29:0::1;::::0;-1:-1:-1;;;42649:29:0;;42633:13:::1;::::0;-1:-1:-1;;;;;42649:14:0;::::1;::::0;::::1;::::0;:29:::1;::::0;42672:4:::1;::::0;42649:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42633:45;;42689:27;42701:4;42707:8;42689:11;:27::i;:::-;;20948:1;;;20910:284:::0;;;20982:16;21001:9;20982:28;;41852:23:::1;41878:4;-1:-1:-1::0;;;;;41878:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;41878:21:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;41941:13:::0;;41852:47;;-1:-1:-1;41918:36:0;::::1;41910:68;;;;-1:-1:-1::0;;;41910:68:0::1;;;;;;;:::i;:::-;41989:16;42029:6:::0;42024:194:::1;42045:6;:13;42041:1;:17;42024:194;;;42084:68;42110:6;42117:1;42110:9;;;;;;;;;;;;;;42121:12;;42134:1;42121:15;;;;;;;;;;;;;42146:4;42084:25;:68::i;:::-;42080:127;;;42187:4;42173:18;;42080:127;42060:3;;42024:194;;;-1:-1:-1::0;42236:9:0::1;:14:::0;;:29:::1;;;42254:11;42236:29;42228:58;;;;-1:-1:-1::0;;;42228:58:0::1;;;;;;;:::i;:::-;42301:4;-1:-1:-1::0;;;;;42301:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42319:4;42301:22;42297:187;;;42340:42;::::0;-1:-1:-1;;;42340:42:0;;-1:-1:-1;;;;;42340:13:0;::::1;::::0;::::1;::::0;:42:::1;::::0;42354:13;;42369:12;;;;42340:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42297:187;;;42415:57;::::0;-1:-1:-1;;;42415:57:0;;-1:-1:-1;;;;;42415:16:0;::::1;::::0;::::1;::::0;:57:::1;::::0;42432:10:::1;::::0;42444:13;;42459:12;;;;42415:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42297:187;42499:6;42494:129;42515:6;:13;42511:1;:17;42494:129;;;42550:61;42569:6;42576:1;42569:9;;;;;;;42550:61;-1:-1:-1::0;42530:3:0::1;;42494:129;;;-1:-1:-1::0;42649:29:0::1;::::0;-1:-1:-1;;;42649:29:0;;42633:13:::1;::::0;-1:-1:-1;;;;;42649:14:0;::::1;::::0;::::1;::::0;:29:::1;::::0;42672:4:::1;::::0;42649:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42633:45;;42689:27;42701:4;42707:8;42689:11;:27::i;:::-;-1:-1:-1::0;21041:16:0;;-1:-1:-1;;21091:2:0;21096:8;21091:20;;-1:-1:-1;21079:9:0;21068:8;21060:5;:16;:28;:51;21041:70;;20814:42;-1:-1:-1;;;;;21126:16:0;;21143:10;21176:5;21156:8;21167:5;21156:16;21155:26;;;;30657:814;30898:19;30878:4;20922:3;20915:10;;20910:284;;30935:19:::1;30969:14;30975:7;30969:5;:14::i;:::-;30965:388;;;31036:4;::::0;31011:73:::1;::::0;-1:-1:-1;;;;;31036:4:0::1;31051:8:::0;31062:13;31077:6;31011:16:::1;:73::i;:::-;-1:-1:-1::0;31000:84:0;-1:-1:-1;30965:388:0::1;;;31106:15;31112:8;31106:5;:15::i;:::-;31102:251;;;31192:4;::::0;31149:72:::1;::::0;31174:7;;-1:-1:-1;;;;;31192:4:0::1;31199:13:::0;31214:6;31149:16:::1;:72::i;31102:251::-;31265:76;31290:7;31308:8;31319:13;31334:6;31265:16;:76::i;:::-;-1:-1:-1::0;31254:87:0;-1:-1:-1;31102:251:0::1;31382:81;31399:5;31406:7;31415:8;31425:13;31440:17;31459:3;31382:16;:81::i;:::-;31365:98;;20948:1;20910:284:::0;;;20982:16;21001:9;20982:28;;30935:19:::1;30969:14;30975:7;30969:5;:14::i;:::-;30965:388;;;31036:4;::::0;31011:73:::1;::::0;-1:-1:-1;;;;;31036:4:0::1;31051:8:::0;31062:13;31077:6;31011:16:::1;:73::i;:::-;-1:-1:-1::0;31000:84:0;-1:-1:-1;30965:388:0::1;;;31106:15;31112:8;31106:5;:15::i;:::-;31102:251;;;31192:4;::::0;31149:72:::1;::::0;31174:7;;-1:-1:-1;;;;;31192:4:0::1;31199:13:::0;31214:6;31149:16:::1;:72::i;31102:251::-;31265:76;31290:7;31308:8;31319:13;31334:6;31265:16;:76::i;:::-;-1:-1:-1::0;31254:87:0;-1:-1:-1;31102:251:0::1;31382:81;31399:5;31406:7;31415:8;31425:13;31440:17;31459:3;31382:16;:81::i;:::-;31365:98:::0;-1:-1:-1;21041:16:0;;-1:-1:-1;21091:2:0;21096:8;21091:20;21079:9;21068:8;21060:5;:16;:28;:51;21041:70;;20814:42;-1:-1:-1;;;;;21126:16:0;;21143:10;21176:5;21156:8;21167:5;21156:16;21155:26;;;;;;21126:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20910:284;;;30657:814;;;;;;;;;:::o;23622:1223::-;23842:18;23822:4;20922:3;20915:10;;20910:284;;23878:42:::1;23894:7;23903:16;23878:15;:42::i;:::-;;23938:6;23933:726;23954:5;:12;23950:1;:16;23933:726;;;23988:16;;:::i;:::-;24007:5;24013:1;24007:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;24058:12;;::::1;::::0;24107:9;;24138:47:::1;::::0;-1:-1:-1;;;24138:47:0;;24007:8;;-1:-1:-1;24058:12:0;;24030:18:::1;::::0;-1:-1:-1;;;;;24138:21:0;::::1;::::0;::::1;::::0;:47:::1;::::0;24168:4:::1;::::0;24107:9;;24138:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;24134:129;;;24234:9:::0;;24210:37:::1;::::0;-1:-1:-1;;;;;24210:23:0;::::1;::::0;24234:9:::1;24210:23;:37::i;:::-;24301:9:::0;;24312:22:::1;::::0;::::1;::::0;24277:58:::1;::::0;-1:-1:-1;;;;;24277:23:0;::::1;::::0;::::1;:58::i;:::-;24418:12;::::0;::::1;::::0;24449:22:::1;::::0;::::1;::::0;24490:13:::1;::::0;;::::1;::::0;24522:15:::1;::::0;::::1;::::0;24556:13:::1;::::0;::::1;::::0;24376:208;;-1:-1:-1;;;24376:208:0;;24353:18:::1;::::0;-1:-1:-1;;;;;24376:23:0;::::1;::::0;::::1;::::0;:208:::1;::::0;24418:12;;24449:22;;24376:208:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;24352:232:0;-1:-1:-1;24615:32:0::1;24352:232:::0;24633:13;24615:17:::1;:32::i;:::-;24599:48:::0;-1:-1:-1;;23968:3:0::1;::::0;;::::1;::::0;-1:-1:-1;23933:726:0::1;::::0;-1:-1:-1;;23933:726:0::1;;;24694:16;24677:13;:33;;24669:58;;;;-1:-1:-1::0;;;24669:58:0::1;;;;;;;:::i;:::-;24740:43;24752:8;24762:20;24773:8;24762:10;:20::i;24740:43::-;;24794:41;24806:7;24815:19;24826:7;24815:10;:19::i;24794:41::-;;20910:284:::0;;;20982:16;21001:9;20982:28;;23878:42:::1;23894:7;23903:16;23878:15;:42::i;:::-;;23938:6;23933:726;23954:5;:12;23950:1;:16;23933:726;;;23988:16;;:::i;:::-;24007:5;24013:1;24007:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;24058:12;;::::1;::::0;24107:9;;24138:47:::1;::::0;-1:-1:-1;;;24138:47:0;;24007:8;;-1:-1:-1;24058:12:0;;24030:18:::1;::::0;-1:-1:-1;;;;;24138:21:0;::::1;::::0;::::1;::::0;:47:::1;::::0;24168:4:::1;::::0;24107:9;;24138:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;24134:129;;;24234:9:::0;;24210:37:::1;::::0;-1:-1:-1;;;;;24210:23:0;::::1;::::0;24234:9:::1;24210:23;:37::i;:::-;24301:9:::0;;24312:22:::1;::::0;::::1;::::0;24277:58:::1;::::0;-1:-1:-1;;;;;24277:23:0;::::1;::::0;::::1;:58::i;:::-;24418:12;::::0;::::1;::::0;24449:22:::1;::::0;::::1;::::0;24490:13:::1;::::0;;::::1;::::0;24522:15:::1;::::0;::::1;::::0;24556:13:::1;::::0;::::1;::::0;24376:208;;-1:-1:-1;;;24376:208:0;;24353:18:::1;::::0;-1:-1:-1;;;;;24376:23:0;::::1;::::0;::::1;::::0;:208:::1;::::0;24418:12;;24449:22;;24376:208:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;24352:232:0;-1:-1:-1;24615:32:0::1;24352:232:::0;24633:13;24615:17:::1;:32::i;:::-;24599:48:::0;-1:-1:-1;;23968:3:0::1;::::0;;::::1;::::0;-1:-1:-1;23933:726:0::1;::::0;-1:-1:-1;;23933:726:0::1;;;24694:16;24677:13;:33;;24669:58;;;;-1:-1:-1::0;;;24669:58:0::1;;;;;;;:::i;:::-;24740:43;24752:8;24762:20;24773:8;24762:10;:20::i;24740:43::-;;24794:41;24806:7;24815:19;24826:7;24815:10;:19::i;24794:41::-;-1:-1:-1::0;21041:16:0;21091:2;21096:8;21091:20;21079:9;21068:8;21060:5;:16;:28;:51;21041:70;;20814:42;-1:-1:-1;;;;;21126:16:0;;21143:10;21176:5;21156:8;21167:5;21156:16;21155:26;;;;;;21126:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20910:284;;;23622:1223;;;;;;;;:::o;22194:169::-;22276:10;;-1:-1:-1;;;;;22276:10:0;22262;:24;22254:48;;;;-1:-1:-1;;;22254:48:0;;;;;;;:::i;:::-;22313:8;:42;;-1:-1:-1;;;;;;22313:42:0;-1:-1:-1;;;;;22313:42:0;;;;;;;;;;22194:169::o;22031:155::-;22117:10;;-1:-1:-1;;;;;22117:10:0;22103;:24;22095:48;;;;-1:-1:-1;;;22095:48:0;;;;;;;:::i;:::-;22154:10;:24;;-1:-1:-1;;;;;;22154:24:0;-1:-1:-1;;;;;22154:24:0;;;;;;;;;;22031:155::o;24853:1771::-;25120:19;25100:4;20922:3;20915:10;;20910:284;;25159:39:::1;25175:7;25184:13;25159:15;:39::i;:::-;;25216:6;25211:1228;25232:13;:20;25228:1;:24;25211:1228;;;25274:19;::::0;25308:996:::1;25329:13;25343:1;25329:16;;;;;;;;;;;;;;:23;25325:1;:27;25308:996;;;25378:16;;:::i;:::-;25397:13;25411:1;25397:16;;;;;;;;;;;;;;25414:1;25397:19;;;;;;;;;;;;;;25378:38;;25435:18;25463:4;:12;;;25435:41;;25499:1;25504;25499:6;25495:247;;;25690:15;::::0;::::1;:32:::0;;;25495:247:::1;25783:9:::0;;25816:47:::1;::::0;-1:-1:-1;;;25816:47:0;;25762:11:::1;::::0;-1:-1:-1;;;;;25816:21:0;::::1;::::0;::::1;::::0;:47:::1;::::0;25846:4:::1;::::0;25783:9;;25816:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;25812:137;;;25916:9:::0;;25892:37:::1;::::0;-1:-1:-1;;;;;25892:23:0;::::1;::::0;25916:9:::1;25892:23;:37::i;:::-;25991:9:::0;;26002:15:::1;::::0;::::1;::::0;25967:51:::1;::::0;-1:-1:-1;;;;;25967:23:0;::::1;::::0;::::1;:51::i;:::-;26057:4;-1:-1:-1::0;;;;;26057:22:0::1;;26102:4;:12;;;26137:4;:15;;;26175:4;:13;;;26211:4;:22;;;26256:4;:13;;;26057:231;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;26037:251:0;-1:-1:-1;;25354:3:0::1;::::0;;::::1;::::0;-1:-1:-1;25308:996:0::1;::::0;-1:-1:-1;25308:996:0::1;;-1:-1:-1::0;26393:34:0::1;:14:::0;26412;26393:18:::1;:34::i;:::-;26376:51:::0;-1:-1:-1;;25254:3:0::1;;25211:1228;;;;26477:17;26459:14;:35;;26451:61;;;;-1:-1:-1::0;;;26451:61:0::1;;;;;;;:::i;:::-;26525:37;26537:8;26547:14;26525:11;:37::i;:::-;;26573:41;26585:7;26594:19;26605:7;26594:10;:19::i;26573:41::-;;20910:284:::0;;;20982:16;21001:9;20982:28;;25159:39:::1;25175:7;25184:13;25159:15;:39::i;:::-;;25216:6;25211:1228;25232:13;:20;25228:1;:24;25211:1228;;;25274:19;::::0;25308:996:::1;25329:13;25343:1;25329:16;;;;;;;;;;;;;;:23;25325:1;:27;25308:996;;;25378:16;;:::i;:::-;25397:13;25411:1;25397:16;;;;;;;;;;;;;;25414:1;25397:19;;;;;;;;;;;;;;25378:38;;25435:18;25463:4;:12;;;25435:41;;25499:1;25504;25499:6;25495:247;;;25690:15;::::0;::::1;:32:::0;;;25495:247:::1;25783:9:::0;;25816:47:::1;::::0;-1:-1:-1;;;25816:47:0;;25762:11:::1;::::0;-1:-1:-1;;;;;25816:21:0;::::1;::::0;::::1;::::0;:47:::1;::::0;25846:4:::1;::::0;25783:9;;25816:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;25812:137;;;25916:9:::0;;25892:37:::1;::::0;-1:-1:-1;;;;;25892:23:0;::::1;::::0;25916:9:::1;25892:23;:37::i;:::-;25991:9:::0;;26002:15:::1;::::0;::::1;::::0;25967:51:::1;::::0;-1:-1:-1;;;;;25967:23:0;::::1;::::0;::::1;:51::i;:::-;26057:4;-1:-1:-1::0;;;;;26057:22:0::1;;26102:4;:12;;;26137:4;:15;;;26175:4;:13;;;26211:4;:22;;;26256:4;:13;;;26057:231;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;26037:251:0;-1:-1:-1;;25354:3:0::1;::::0;;::::1;::::0;-1:-1:-1;25308:996:0::1;::::0;-1:-1:-1;25308:996:0::1;;-1:-1:-1::0;26393:34:0::1;:14:::0;26412;26393:18:::1;:34::i;:::-;26376:51:::0;-1:-1:-1;;25254:3:0::1;;25211:1228;;;;26477:17;26459:14;:35;;26451:61;;;;-1:-1:-1::0;;;26451:61:0::1;;;;;;;:::i;:::-;26525:37;26537:8;26547:14;26525:11;:37::i;:::-;;26573:41;26585:7;26594:19;26605:7;26594:10;:19::i;26573:41::-;-1:-1:-1::0;21041:16:0;21091:2;21096:8;21091:20;21079:9;21068:8;21060:5;:16;:28;:51;21041:70;;20814:42;-1:-1:-1;;;;;21126:16:0;;21143:10;21176:5;21156:8;21167:5;21156:16;21155:26;;;;26632:4017;26870:18;26850:4;20922:3;20915:10;;20910:284;;26908:42:::1;26924:7;26933:16;26908:15;:42::i;:::-;;26968:6;26963:3498;26984:13;:20;26980:1;:24;26963:3498;;;27026:27;27157:13;27171:1;27157:16;;;;;;;;;;;;;;:23;27184:1;27157:28;27153:3225;;;27206:16;;:::i;:::-;27225:13;27239:1;27225:16;;;;;;;;;;;;;;27242:1;27225:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;27291:12;;::::1;::::0;27346:9;;27379:47:::1;::::0;-1:-1:-1;;;27379:47:0;;27225:19;;-1:-1:-1;27291:12:0;;27263:18:::1;::::0;-1:-1:-1;;;;;27379:21:0;::::1;::::0;::::1;::::0;:47:::1;::::0;27409:4:::1;::::0;27346:9;;27379:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;27375:137;;;27479:9:::0;;27455:37:::1;::::0;-1:-1:-1;;;;;27455:23:0;::::1;::::0;27479:9:::1;27455:23;:37::i;:::-;27554:9:::0;;27565:22:::1;::::0;::::1;::::0;27530:58:::1;::::0;-1:-1:-1;;;;;27530:23:0;::::1;::::0;::::1;:58::i;:::-;27637:4;-1:-1:-1::0;;;;;27637:23:0::1;;27683:4;:12;;;27718:4;:22;;;27763:4;:13;;;27799:4;:15;;;27837:4;:13;;;27637:232;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27609:260:0;-1:-1:-1;27153:3225:0::1;::::0;-1:-1:-1;;;27153:3225:0::1;;28206:28;28314:22;;:::i;:::-;28339:13;28353:1;28339:16;;;;;;;;;;;;;;28356:1;28339:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;28408:15;;28547:18;;::::1;::::0;28521:45:::1;::::0;-1:-1:-1;;;28521:45:0;;28339:19;;-1:-1:-1;;;;;;28469:29:0;::::1;::::0;::::1;::::0;;;28521:25:::1;::::0;:45:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28626:18;::::0;::::1;::::0;28589:56:::1;::::0;-1:-1:-1;;;28589:56:0;;-1:-1:-1;;;;;28589:36:0;::::1;::::0;::::1;::::0;:56:::1;::::0;28626:18;28589:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28694:19;::::0;;::::1;::::0;28668:46;;-1:-1:-1;;;28668:46:0;;-1:-1:-1;;;;;28668:25:0;::::1;::::0;::::1;::::0;:46:::1;::::0;28694:19;28668:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28774:19;::::0;;::::1;::::0;28737:57;;-1:-1:-1;;;28737:57:0;;-1:-1:-1;;;;;28737:36:0;::::1;::::0;::::1;::::0;:57:::1;::::0;28774:19;28737:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28817:10;:21;;;28861:14;-1:-1:-1::0;;;;;28861:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28469:435;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28443:461;;29011:21;;:::i;:::-;29035:13;29049:1;29035:16;;;;;;;;;;;;;;29052:1;29035:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;29106:17;;::::1;::::0;29173:14;;29211:57:::1;::::0;-1:-1:-1;;;29211:57:0;;29035:19;;-1:-1:-1;29106:17:0;;-1:-1:-1;;29276:3:0;-1:-1:-1;;;;;29211:26:0;::::1;::::0;::::1;::::0;:57:::1;::::0;29246:4:::1;::::0;29173:14;;29211:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;29207:173;;;29334:14:::0;;29305:55:::1;::::0;-1:-1:-1;;;;;29305:28:0;::::1;::::0;-1:-1:-1;;29305:28:0::1;:55::i;:::-;29428:13;-1:-1:-1::0;;;;;29428:32:0::1;;29483:9;:17;;;29523:9;:27;;;29573:9;:18;;;29614:23;29701:9;:18;;;29428:310;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;29855:18:0::1;::::0;::::1;::::0;29940:15;;29897:59:::1;::::0;-1:-1:-1;;;29897:59:0;;29400:338;;-1:-1:-1;29855:18:0;;-1:-1:-1;;29964:3:0;-1:-1:-1;;;;;29897:27:0;::::1;::::0;::::1;::::0;:59:::1;::::0;29933:4:::1;::::0;29940:15;29897:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;29893:177;;;30023:15:::0;;29993:57:::1;::::0;-1:-1:-1;;;;;29993:29:0;::::1;::::0;-1:-1:-1;;29993:29:0::1;:57::i;:::-;30090:14;-1:-1:-1::0;;;;;30090:33:0::1;;30146:10;:18;;;30187:10;:28;;;30238:10;:19;;;30280:10;:21;;;30324:10;:19;;;30090:272;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27153:3225;;;;;;;;30408:41;:22:::0;30435:13;30408:26:::1;:41::i;:::-;30392:57:::0;-1:-1:-1;;27006:3:0::1;;26963:3498;;20910:284:::0;20982:16;21001:9;20982:28;;26908:42:::1;26924:7;26933:16;26908:15;:42::i;:::-;;26968:6;26963:3498;26984:13;:20;26980:1;:24;26963:3498;;;27026:27;27157:13;27171:1;27157:16;;;;;;;;;;;;;;:23;27184:1;27157:28;27153:3225;;;27206:16;;:::i;:::-;27225:13;27239:1;27225:16;;;;;;;;;;;;;;27242:1;27225:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;27291:12;;::::1;::::0;27346:9;;27379:47:::1;::::0;-1:-1:-1;;;27379:47:0;;27225:19;;-1:-1:-1;27291:12:0;;27263:18:::1;::::0;-1:-1:-1;;;;;27379:21:0;::::1;::::0;::::1;::::0;:47:::1;::::0;27409:4:::1;::::0;27346:9;;27379:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;27375:137;;;27479:9:::0;;27455:37:::1;::::0;-1:-1:-1;;;;;27455:23:0;::::1;::::0;27479:9:::1;27455:23;:37::i;:::-;27554:9:::0;;27565:22:::1;::::0;::::1;::::0;27530:58:::1;::::0;-1:-1:-1;;;;;27530:23:0;::::1;::::0;::::1;:58::i;:::-;27637:4;-1:-1:-1::0;;;;;27637:23:0::1;;27683:4;:12;;;27718:4;:22;;;27763:4;:13;;;27799:4;:15;;;27837:4;:13;;;27637:232;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27609:260:0;-1:-1:-1;27153:3225:0::1;::::0;-1:-1:-1;;;27153:3225:0::1;;28206:28;28314:22;;:::i;:::-;28339:13;28353:1;28339:16;;;;;;;;;;;;;;28356:1;28339:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;28408:15;;28547:18;;::::1;::::0;28521:45:::1;::::0;-1:-1:-1;;;28521:45:0;;28339:19;;-1:-1:-1;;;;;;28469:29:0;::::1;::::0;::::1;::::0;;;28521:25:::1;::::0;:45:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28626:18;::::0;::::1;::::0;28589:56:::1;::::0;-1:-1:-1;;;28589:56:0;;-1:-1:-1;;;;;28589:36:0;::::1;::::0;::::1;::::0;:56:::1;::::0;28626:18;28589:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28694:19;::::0;;::::1;::::0;28668:46;;-1:-1:-1;;;28668:46:0;;-1:-1:-1;;;;;28668:25:0;::::1;::::0;::::1;::::0;:46:::1;::::0;28694:19;28668:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28774:19;::::0;;::::1;::::0;28737:57;;-1:-1:-1;;;28737:57:0;;-1:-1:-1;;;;;28737:36:0;::::1;::::0;::::1;::::0;:57:::1;::::0;28774:19;28737:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28817:10;:21;;;28861:14;-1:-1:-1::0;;;;;28861:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28469:435;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28443:461;;29011:21;;:::i;:::-;29035:13;29049:1;29035:16;;;;;;;;;;;;;;29052:1;29035:19;;;;;;;;;::::0;;::::1;::::0;;;;;;;29106:17;;::::1;::::0;29173:14;;29211:57:::1;::::0;-1:-1:-1;;;29211:57:0;;29035:19;;-1:-1:-1;29106:17:0;;-1:-1:-1;;29276:3:0;-1:-1:-1;;;;;29211:26:0;::::1;::::0;::::1;::::0;:57:::1;::::0;29246:4:::1;::::0;29173:14;;29211:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;29207:173;;;29334:14:::0;;29305:55:::1;::::0;-1:-1:-1;;;;;29305:28:0;::::1;::::0;-1:-1:-1;;29305:28:0::1;:55::i;:::-;29428:13;-1:-1:-1::0;;;;;29428:32:0::1;;29483:9;:17;;;29523:9;:27;;;29573:9;:18;;;29614:23;29701:9;:18;;;29428:310;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;29855:18:0::1;::::0;::::1;::::0;29940:15;;29897:59:::1;::::0;-1:-1:-1;;;29897:59:0;;29400:338;;-1:-1:-1;29855:18:0;;-1:-1:-1;;29964:3:0;-1:-1:-1;;;;;29897:27:0;::::1;::::0;::::1;::::0;:59:::1;::::0;29933:4:::1;::::0;29940:15;29897:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;29893:177;;;30023:15:::0;;29993:57:::1;::::0;-1:-1:-1;;;;;29993:29:0;::::1;::::0;-1:-1:-1;;29993:29:0::1;:57::i;:::-;30090:14;-1:-1:-1::0;;;;;30090:33:0::1;;30146:10;:18;;;30187:10;:28;;;30238:10;:19;;;30280:10;:21;;;30324:10;:19;;;30090:272;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27153:3225;;;;;;;;30408:41;:22:::0;30435:13;30408:26:::1;:41::i;:::-;30392:57:::0;-1:-1:-1;;27006:3:0::1;;26963:3498;;20764:93:::0;20814:42;20764:93;:::o;22371:1243::-;22620:19;22600:4;20922:3;20915:10;;20910:284;;22657:39:::1;22673:7;22682:13;22657:15;:39::i;:::-;;22714:6;22709:722;22730:5;:12;22726:1;:16;22709:722;;;22764:16;;:::i;:::-;22783:5;22789:1;22783:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;22834:12;;::::1;::::0;22883:9;;22914:47:::1;::::0;-1:-1:-1;;;22914:47:0;;22783:8;;-1:-1:-1;22834:12:0;;22806:18:::1;::::0;-1:-1:-1;;;;;22914:21:0;::::1;::::0;::::1;::::0;:47:::1;::::0;22944:4:::1;::::0;22883:9;;22914:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;22910:129;;;23010:9:::0;;22986:37:::1;::::0;-1:-1:-1;;;;;22986:23:0;::::1;::::0;23010:9:::1;22986:23;:37::i;:::-;23077:9:::0;;23088:15:::1;::::0;::::1;::::0;23053:51:::1;::::0;-1:-1:-1;;;;;23053:23:0;::::1;::::0;::::1;:51::i;:::-;23187:12;::::0;::::1;::::0;23218:15:::1;::::0;::::1;::::0;23252:13:::1;::::0;;::::1;::::0;23284:22:::1;::::0;::::1;::::0;23325:13:::1;::::0;::::1;::::0;23146:207;;-1:-1:-1;;;23146:207:0;;23122:19:::1;::::0;-1:-1:-1;;;;;23146:22:0;::::1;::::0;::::1;::::0;:207:::1;::::0;23187:12;;23218:15;;23146:207:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;23121:232:0;-1:-1:-1;23385:34:0::1;23121:232:::0;23404:14;23385:18:::1;:34::i;:::-;23368:51:::0;-1:-1:-1;;22744:3:0::1;::::0;;::::1;::::0;-1:-1:-1;22709:722:0::1;::::0;-1:-1:-1;;22709:722:0::1;20910:284:::0;20982:16;21001:9;20982:28;;22657:39:::1;22673:7;22682:13;22657:15;:39::i;:::-;;22714:6;22709:722;22730:5;:12;22726:1;:16;22709:722;;;22764:16;;:::i;:::-;22783:5;22789:1;22783:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;22834:12;;::::1;::::0;22883:9;;22914:47:::1;::::0;-1:-1:-1;;;22914:47:0;;22783:8;;-1:-1:-1;22834:12:0;;22806:18:::1;::::0;-1:-1:-1;;;;;22914:21:0;::::1;::::0;::::1;::::0;:47:::1;::::0;22944:4:::1;::::0;22883:9;;22914:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;22910:129;;;23010:9:::0;;22986:37:::1;::::0;-1:-1:-1;;;;;22986:23:0;::::1;::::0;23010:9:::1;22986:23;:37::i;:::-;23077:9:::0;;23088:15:::1;::::0;::::1;::::0;23053:51:::1;::::0;-1:-1:-1;;;;;23053:23:0;::::1;::::0;::::1;:51::i;:::-;23187:12;::::0;::::1;::::0;23218:15:::1;::::0;::::1;::::0;23252:13:::1;::::0;;::::1;::::0;23284:22:::1;::::0;::::1;::::0;23325:13:::1;::::0;::::1;::::0;23146:207;;-1:-1:-1;;;23146:207:0;;23122:19:::1;::::0;-1:-1:-1;;;;;23146:22:0;::::1;::::0;::::1;::::0;:207:::1;::::0;23187:12;;23218:15;;23146:207:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;23121:232:0;-1:-1:-1;23385:34:0::1;23121:232:::0;23404:14;23385:18:::1;:34::i;:::-;23368:51:::0;-1:-1:-1;;22744:3:0::1;::::0;;::::1;::::0;-1:-1:-1;22709:722:0::1;::::0;-1:-1:-1;;22709:722:0::1;31479:804:::0;31721:18;31701:4;20922:3;20915:10;;20910:284;;31757:19:::1;31791:14;31797:7;31791:5;:14::i;:::-;31787:394;;;31859:4;::::0;31833:75:::1;::::0;-1:-1:-1;;;;;31859:4:0::1;31874:8:::0;31885:14;31901:6;31833:17:::1;:75::i;:::-;-1:-1:-1::0;31822:86:0;-1:-1:-1;31787:394:0::1;;;31930:15;31936:8;31930:5;:15::i;:::-;31926:255;;;32017:4;::::0;31973:74:::1;::::0;31999:7;;-1:-1:-1;;;;;32017:4:0::1;32024:14:::0;32040:6;31973:17:::1;:74::i;31926:255::-;32091:78;32117:7;32135:8;32146:14;32162:6;32091:17;:78::i;:::-;-1:-1:-1::0;32080:89:0;-1:-1:-1;31926:255:0::1;32209:66;32227:5;32234:7;32243:8;32253:16;32271:3;32209:17;:66::i;20910:284::-:0;20982:16;21001:9;20982:28;;31757:19:::1;31791:14;31797:7;31791:5;:14::i;:::-;31787:394;;;31859:4;::::0;31833:75:::1;::::0;-1:-1:-1;;;;;31859:4:0::1;31874:8:::0;31885:14;31901:6;31833:17:::1;:75::i;:::-;-1:-1:-1::0;31822:86:0;-1:-1:-1;31787:394:0::1;;;31930:15;31936:8;31930:5;:15::i;:::-;31926:255;;;32017:4;::::0;31973:74:::1;::::0;31999:7;;-1:-1:-1;;;;;32017:4:0::1;32024:14:::0;32040:6;31973:17:::1;:74::i;31926:255::-;32091:78;32117:7;32135:8;32146:14;32162:6;32091:17;:78::i;:::-;-1:-1:-1::0;32080:89:0;-1:-1:-1;31926:255:0::1;32209:66;32227:5;32234:7;32243:8;32253:16;32271:3;32209:17;:66::i;35829:1023::-:0;35973:11;;:::i;:::-;36068:24;;-1:-1:-1;;;36068:24:0;;36023:11;;36002;;-1:-1:-1;;;;;36068:15:0;;;;;:24;;36084:7;;36068:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36046:46;;36103:20;36126:4;-1:-1:-1;;;;;36126:15:0;;36142:8;36126:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36103:48;;36162:18;36183:4;-1:-1:-1;;;;;36183:26:0;;36210:7;36183:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36162:56;;36229:19;36251:4;-1:-1:-1;;;;;36251:26:0;;36278:8;36251:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36229:58;;36298:12;36313:4;-1:-1:-1;;;;;36313:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36298:29;;36340:23;36366:120;36403:13;36431:15;36461:14;36366:22;:120::i;:::-;36340:146;;36497:22;;:::i;:::-;-1:-1:-1;36522:292:0;;;;;;;;-1:-1:-1;;;;;36522:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35829:1023:0;;;;;;:::o;3650:181::-;3708:7;3740:5;;;3764:6;;;;3756:46;;;;-1:-1:-1;;;3756:46:0;;;;;;;:::i;:::-;3822:1;-1:-1:-1;3650:181:0;;;;;:::o;5004:471::-;5062:7;5307:6;5303:47;;-1:-1:-1;5337:1:0;5330:8;;5303:47;5374:5;;;5378:1;5374;:5;:1;5398:5;;;;;:10;5390:56;;;;-1:-1:-1;;;5390:56:0;;;;;;;:::i;5951:132::-;6009:7;6036:39;6040:1;6043;6036:39;;;;;;;;;;;;;;;;;:3;:39::i;4114:136::-;4172:7;4199:43;4203:1;4206;4199:43;;;;;;;;;;;;;;;;;:3;:43::i;38004:703::-;38149:16;38214:6;38209:462;38230:16;:23;38226:1;:27;38209:462;;;38275:11;38296:9;38306:1;38296:12;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;38289:40:0;;38348:9;38358:1;38348:12;;;;;;;;;;;;;;:27;;;38394:9;38404:1;38394:12;;;;;;;;;;;;;;:26;;;38439:9;38449:1;38439:12;;;;;;;;;;;;;;:28;;;38486:9;38496:1;38486:12;;;;;;;;;;;;;;:27;;;38532:16;38549:1;38532:19;;;;;;;;;;;;;;38570:9;38580:1;38570:12;;;;;;;;;;;;;;:20;;;38289:316;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38275:330;-1:-1:-1;38636:23:0;:11;38275:330;38636:15;:23::i;:::-;38622:37;-1:-1:-1;;38255:3:0;;38209:462;;;;38004:703;;;;:::o;37294:702::-;37438:16;37503:6;37498:462;37519:16;:23;37515:1;:27;37498:462;;;37564:11;37585:9;37595:1;37585:12;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;37578:40:0;;37637:9;37647:1;37637:12;;;;;;;;;;;;;;:27;;;37683:9;37693:1;37683:12;;;;;;;;;;;;;;:26;;;37728:9;37738:1;37728:12;;;;;;;;;;;;;;:28;;;37775:9;37785:1;37775:12;;;;;;;;;;;;;;:27;;;37821:16;37838:1;37821:19;;;;;;;;;;;;;;37859:9;37869:1;37859:12;;;;;;;;;;;;;;:20;;;37578:316;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37564:330;-1:-1:-1;37925:23:0;:11;37564:330;37925:15;:23::i;:::-;37911:37;-1:-1:-1;;37544:3:0;;37498:462;;39682:115;-1:-1:-1;;;;;39759:29:0;;21788:42;39759:29;39682:115;;;;:::o;14631:177::-;14714:86;14734:5;14764:23;;;14789:2;14793:5;14741:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14741:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;14741:58:0;-1:-1:-1;;;;;;14741:58:0;;;;;;;;;;14714:19;:86::i;43809:855::-;43907:16;43940:20;43953:5;43940;:20::i;:::-;43936:692;;;43995:9;43985:6;:19;43977:47;;;;-1:-1:-1;;;43977:47:0;;;;;;;:::i;:::-;44039:4;;;;;;;;-1:-1:-1;;;;;44039:4:0;-1:-1:-1;;;;;44039:12:0;;44060:6;44039:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44129:1:0;44088:4;;:38;;-1:-1:-1;;;44088:38:0;;44129:1;;-1:-1:-1;;;;;;44088:4:0;;-1:-1:-1;44088:14:0;;-1:-1:-1;44088:38:0;;44111:4;;44118:7;;44088:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;44084:137;;;44203:1;44166:4;;44151:54;;-1:-1:-1;;;;;44166:4:0;;;;44193:7;;44151:33;:54::i;:::-;44250:4;;44235:50;;-1:-1:-1;;;;;44250:4:0;44269:7;44278:6;44235:33;:50::i;:::-;-1:-1:-1;44314:4:0;43936:692;;;44351:65;-1:-1:-1;;;;;44351:30:0;;44382:10;44402:4;44409:6;44351:30;:65::i;:::-;44435:47;;-1:-1:-1;;;44435:47:0;;44485:1;;-1:-1:-1;;;;;44435:23:0;;;;;:47;;44467:4;;44474:7;;44435:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;44431:129;;;44507:37;-1:-1:-1;;;;;44507:25:0;;44533:7;44542:1;44507:25;:37::i;:::-;44574:42;-1:-1:-1;;;;;44574:25:0;;44600:7;44609:6;44574:25;:42::i;43347:454::-;43432:16;43465:20;43478:5;43465;:20::i;:::-;43461:304;;;43520:9;43510:6;:19;43502:47;;;;-1:-1:-1;;;43502:47:0;;;;;;;:::i;:::-;43564:4;;;;;;;;-1:-1:-1;;;;;43564:4:0;-1:-1:-1;;;;;43564:12:0;;43585:6;43564:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43609:4:0;;:24;;-1:-1:-1;;;43609:24:0;;-1:-1:-1;;;;;43609:4:0;;;;-1:-1:-1;43609:13:0;;-1:-1:-1;43609:24:0;;-1:-1:-1;43623:2:0;;43626:6;;43609:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43662:4;43648:18;;43461:304;;;43699:54;-1:-1:-1;;;;;43699:30:0;;43730:10;43742:2;43746:6;43699:30;:54::i;39007:232::-;39064:4;39085:12;39091:5;39085;:12::i;:::-;39081:151;;;39121:4;;:29;;-1:-1:-1;;;39121:29:0;;-1:-1:-1;;;;;39121:4:0;;;;:14;;:29;;39144:4;;39121:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39114:36;;;;39081:151;39190:30;;-1:-1:-1;;;39190:30:0;;-1:-1:-1;;;;;39190:15:0;;;;;:30;;39214:4;;39190:30;;;:::i;39247:427::-;39313:4;39334:11;39330:55;;-1:-1:-1;39369:4:0;39362:11;;39330:55;39401:12;39407:5;39401;:12::i;:::-;39397:248;;;39430:4;;:21;;-1:-1:-1;;;39430:21:0;;-1:-1:-1;;;;;39430:4:0;;;;:13;;:21;;39444:6;;39430:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39467:9;39481:10;-1:-1:-1;;;;;39481:15:0;39505:6;39481:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39466:50;;;39539:4;39531:31;;;;-1:-1:-1;;;39531:31:0;;;;;;;:::i;:::-;39397:248;;;;39595:38;-1:-1:-1;;;;;39595:18:0;;39614:10;39626:6;39595:18;:38::i;:::-;-1:-1:-1;39662:4:0;39247:427;;;;:::o;38715:284::-;38785:4;38806:12;38812:5;38806;:12::i;:::-;38802:168;;;38835:4;;;;;;;;-1:-1:-1;;;;;38835:4:0;-1:-1:-1;;;;;38835:12:0;;38856:9;38835:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38802:168;;;38901:57;-1:-1:-1;;;;;38901:22:0;;38924:10;38944:4;38951:6;38901:22;:57::i;15290:622::-;15660:10;;;15659:62;;-1:-1:-1;15676:39:0;;-1:-1:-1;;;15676:39:0;;-1:-1:-1;;;;;15676:15:0;;;;;:39;;15700:4;;15707:7;;15676:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;15659:62;15651:152;;;;-1:-1:-1;;;15651:152:0;;;;;;;:::i;:::-;15814:90;15834:5;15864:22;;;15888:7;15897:5;15841:62;;;;;;;;;:::i;36860:426::-;37022:23;37123:117;21867:8;37123:107;37214:15;37123:86;37165:33;:14;37184:13;37165:18;:33::i;:::-;37123:23;:13;21867:8;37123:17;:23::i;:86::-;:90;;:107::i;:117::-;37093:147;36860:426;-1:-1:-1;;;;36860:426:0:o;6579:278::-;6665:7;6700:12;6693:5;6685:28;;;;-1:-1:-1;;;6685:28:0;;;;;;;;:::i;:::-;;6724:9;6740:1;6736;:5;;;;;;;6579:278;-1:-1:-1;;;;;6579:278:0:o;4553:192::-;4639:7;4675:12;4667:6;;;;4659:29;;;;-1:-1:-1;;;4659:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;4711:5:0;;;4553:192::o;16936:761::-;17360:23;17386:69;17414:4;17386:69;;;;;;;;;;;;;;;;;17394:5;-1:-1:-1;;;;;17386:27:0;;;:69;;;;;:::i;:::-;17470:17;;17360:95;;-1:-1:-1;17470:21:0;17466:224;;17612:10;17601:30;;;;;;;;;;;;:::i;:::-;17593:85;;;;-1:-1:-1;;;17593:85:0;;;;;;;:::i;14816:205::-;14917:96;14937:5;14967:27;;;14996:4;15002:2;15006:5;14944:68;;;;;;;;;;:::i;14917:96::-;14816:205;;;;:::o;11709:196::-;11812:12;11844:53;11867:6;11875:4;11881:1;11884:12;13216;13249:18;13260:6;13249:10;:18::i;:::-;13241:60;;;;-1:-1:-1;;;13241:60:0;;;;;;;:::i;:::-;13375:12;13389:23;13416:6;-1:-1:-1;;;;;13416:11:0;13436:8;13447:4;13416:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13374:78;;;;13467:7;13463:595;;;13498:10;-1:-1:-1;13491:17:0;;-1:-1:-1;13491:17:0;13463:595;13612:17;;:21;13608:439;;13875:10;13869:17;13936:15;13923:10;13919:2;13915:19;13908:44;13823:148;14018:12;14011:20;;-1:-1:-1;;;14011:20:0;;;;;;;;:::i;8791:422::-;9158:20;9197:8;;;8791:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;1802:819::-;;1966:3;1959:4;1951:6;1947:17;1943:27;1933:2;;-1:-1;;1974:12;1933:2;2021:6;2008:20;2043:127;2058:111;2162:6;2058:111;:::i;:::-;2043:127;:::i;:::-;2198:21;;;2034:136;-1:-1;2242:4;2255:14;;;;2230:17;;;2350:1;2335:280;2360:6;2357:1;2354:13;2335:280;;;2467:84;2547:3;2242:4;2443:3;2430:17;2234:6;2418:30;;2467:84;:::i;:::-;2455:97;;2566:14;;;;2594;;;;2382:1;2375:9;2335:280;;;2339:14;;;;;1926:695;;;;:::o;2665:773::-;;2804:3;2797:4;2789:6;2785:17;2781:27;2771:2;;-1:-1;;2812:12;2771:2;2859:6;2846:20;2881:102;2896:86;2975:6;2896:86;:::i;2881:102::-;3011:21;;;2872:111;-1:-1;3055:4;3068:14;;;;3043:17;;;3169:4;3157:17;;;3148:27;;;;3145:36;-1:-1;3142:2;;;3194:1;;3184:12;3142:2;3219:1;;3204:228;3229:6;3226:1;3223:13;3204:228;;;3169:4;4758:9;4753:3;4749:19;4745:30;4742:2;;;3219:1;;4778:12;4742:2;4806:20;3169:4;4806:20;:::i;:::-;4908:49;4953:3;4929:22;4908:49;:::i;:::-;4890:16;4883:75;5055:49;5100:3;3055:4;5080:9;5076:22;5055:49;:::i;:::-;3055:4;5041:5;5037:16;5030:75;5170:2;5203:49;5248:3;5170:2;5228:9;5224:22;5203:49;:::i;:::-;5185:16;;;5178:75;5320:2;5374:22;;;5805:20;5335:16;;;5328:75;5477:3;5532:22;;;5805:20;5493:16;;;5486:75;5626:3;5681:22;;;5805:20;5642:16;;;5635:75;3297:72;;3383:14;;;;3411;;;;3251:1;3244:9;3204:228;;;3208:14;;;;;;;2764:674;;;;:::o;3464:352::-;;;3594:3;3587:4;3579:6;3575:17;3571:27;3561:2;;-1:-1;;3602:12;3561:2;-1:-1;3632:20;;-1:-1;;;;;3661:30;;3658:2;;;-1:-1;;3694:12;3658:2;3738:4;3730:6;3726:17;3714:29;;3789:3;3738:4;;3773:6;3769:17;3730:6;3755:32;;3752:41;3749:2;;;3806:1;;3796:12;3749:2;3554:262;;;;;:::o;6016:126::-;6081:20;;45079:4;45068:16;;47485:33;;47475:2;;47532:1;;47522:12;6149:241;;6253:2;6241:9;6232:7;6228:23;6224:32;6221:2;;;-1:-1;;6259:12;6221:2;85:6;72:20;97:33;124:5;97:33;:::i;6397:617::-;;;;;6552:3;6540:9;6531:7;6527:23;6523:33;6520:2;;;-1:-1;;6559:12;6520:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6611:63;-1:-1;6711:2;6750:22;;72:20;97:33;72:20;97:33;:::i;:::-;6514:500;;6719:63;;-1:-1;;;;6819:2;6858:22;;5805:20;;6927:2;6966:22;5805:20;;6514:500::o;7021:392::-;;7161:2;;7149:9;7140:7;7136:23;7132:32;7129:2;;;-1:-1;;7167:12;7129:2;7218:17;7212:24;-1:-1;;;;;7248:6;7245:30;7242:2;;;-1:-1;;7278:12;7242:2;7365:22;;1155:4;1143:17;;1139:27;-1:-1;1129:2;;-1:-1;;1170:12;1129:2;1210:6;1204:13;1232:80;1247:64;1304:6;1247:64;:::i;1232:80::-;1340:21;;;1397:14;;;;1372:17;;;1486;;;1477:27;;;;1474:36;-1:-1;1471:2;;;-1:-1;;1513:12;1471:2;-1:-1;1539:10;;1533:217;1558:6;1555:1;1552:13;1533:217;;;226:6;220:13;238:33;265:5;238:33;:::i;:::-;1626:61;;1580:1;1573:9;;;;;1701:14;;;;1729;;1533:217;;;-1:-1;7298:99;7123:290;-1:-1;;;;;;;7123:290::o;7420:1147::-;;;;;;;7705:3;7693:9;7684:7;7680:23;7676:33;7673:2;;;-1:-1;;7712:12;7673:2;7770:17;7757:31;-1:-1;;;;;7800:6;7797:30;7794:2;;;-1:-1;;7830:12;7794:2;7860:125;7977:7;7968:6;7957:9;7953:22;7860:125;:::i;:::-;7850:135;;;8022:2;8078:9;8074:22;4544:20;4569:46;4609:5;4569:46;:::i;:::-;8030:76;-1:-1;8143:2;8195:22;;4544:20;4569:46;4544:20;4569:46;:::i;:::-;8151:76;-1:-1;8264:2;8303:22;;5805:20;;-1:-1;8372:3;8412:22;;5805:20;;-1:-1;8500:51;8543:7;8481:3;8519:22;;8500:51;:::i;:::-;8490:61;;7667:900;;;;;;;;:::o;8574:1021::-;;;;;;8842:3;8830:9;8821:7;8817:23;8813:33;8810:2;;;-1:-1;;8849:12;8810:2;8907:17;8894:31;-1:-1;;;;;8937:6;8934:30;8931:2;;;-1:-1;;8967:12;8931:2;8997:125;9114:7;9105:6;9094:9;9090:22;8997:125;:::i;:::-;8987:135;;;9159:2;9215:9;9211:22;4544:20;4569:46;4609:5;4569:46;:::i;:::-;9167:76;-1:-1;9280:2;9332:22;;4544:20;4569:46;4544:20;4569:46;:::i;:::-;9288:76;-1:-1;9401:2;9440:22;;5805:20;;-1:-1;9528:51;9571:7;9509:3;9547:22;;9528:51;:::i;:::-;9518:61;;8804:791;;;;;;;;:::o;9602:1097::-;;;;;;;9862:3;9850:9;9841:7;9837:23;9833:33;9830:2;;;-1:-1;;9869:12;9830:2;9927:17;9914:31;-1:-1;;;;;9957:6;9954:30;9951:2;;;-1:-1;;9987:12;9951:2;10017:100;10109:7;10100:6;10089:9;10085:22;10017:100;:::i;10706:971::-;;;;;;10949:3;10937:9;10928:7;10924:23;10920:33;10917:2;;;-1:-1;;10956:12;10917:2;11014:17;11001:31;-1:-1;;;;;11044:6;11041:30;11038:2;;;-1:-1;;11074:12;11038:2;11104:100;11196:7;11187:6;11176:9;11172:22;11104:100;:::i;:::-;11094:110;;;11241:2;11297:9;11293:22;4544:20;4569:46;4609:5;4569:46;:::i;:::-;11249:76;-1:-1;11362:2;11414:22;;4544:20;4569:46;4544:20;4569:46;:::i;:::-;11370:76;-1:-1;11483:2;11522:22;;5805:20;;-1:-1;11591:3;11629:22;;6081:20;45079:4;45068:16;;47485:33;;47475:2;;-1:-1;;47522:12;47475:2;11600:61;;;;10911:766;;;;;;;;:::o;11684:257::-;;11796:2;11784:9;11775:7;11771:23;11767:32;11764:2;;;-1:-1;;11802:12;11764:2;3905:6;3899:13;46807:5;44437:13;44430:21;46785:5;46782:32;46772:2;;-1:-1;;46818:12;11948:1473;;;;;;;;;;12264:3;12252:9;12243:7;12239:23;12235:33;12232:2;;;-1:-1;;12271:12;12232:2;4068:50;4056:6;4043:20;4068:50;:::i;:::-;4056:6;4043:20;12323:80;;-1:-1;;;;;12492:18;12468:2;12457:9;12453:18;12440:32;12481:30;12478:2;;;-1:-1;;12514:12;12478:2;12468;12457:9;12453:18;12440:32;12594:9;12590:22;418:3;411:4;403:6;399:17;395:27;385:2;;-1:-1;;426:12;385:2;495:80;510:64;473:6;460:20;510:64;:::i;495:80::-;581:16;473:6;460:20;610:5;603:21;12468:2;664:3;660:14;653:21;;12468:2;639:6;635:17;769:3;12468:2;;473:6;460:20;749:17;639:6;740:27;;737:36;734:2;;;-1:-1;;776:12;734:2;-1:-1;796:206;473:6;460:20;818:1;815:13;796:206;;;97:33;85:6;72:20;97:33;:::i;:::-;72:20;;889:50;;12468:2;953:14;;;;981;;;;843:1;836:9;796:206;;;800:14;;12534:88;;;;;;12492:18;12687:2;12676:9;12672:18;12659:32;12700:30;12697:2;;;-1:-1;;12733:12;12697:2;12771:80;12843:7;12687:2;12676:9;12672:18;12659:32;12823:9;12819:22;12771:80;:::i;:::-;12753:98;;-1:-1;12753:98;-1:-1;12916:2;12901:18;;12888:32;12929:30;-1:-1;12926:2;;;-1:-1;;12962:12;12926:2;;13000:80;13072:7;12916:2;12905:9;12901:18;12888:32;13052:9;13048:22;13000:80;:::i;:::-;12982:98;;-1:-1;12982:98;-1:-1;13117:3;13157:22;;5805:20;;-1:-1;13226:3;13266:22;;5805:20;;-1:-1;13354:51;13397:7;13335:3;13373:22;;13354:51;:::i;:::-;13344:61;;12226:1195;;;;;;;;;;;:::o;13428:291::-;;13557:2;13545:9;13536:7;13532:23;13528:32;13525:2;;;-1:-1;;13563:12;13525:2;4393:6;4387:13;4405:47;4446:5;4405:47;:::i;13726:767::-;;;;;;13910:3;13898:9;13889:7;13885:23;13881:33;13878:2;;;-1:-1;;13917:12;13878:2;4224:6;4211:20;4236:47;4277:5;4236:47;:::i;:::-;13969:77;-1:-1;14083:2;14122:22;;72:20;97:33;72:20;97:33;:::i;:::-;14091:63;-1:-1;14191:2;14230:22;;5805:20;;-1:-1;14299:2;14338:22;;5805:20;;-1:-1;14426:51;14469:7;14407:3;14445:22;;14426:51;:::i;14500:797::-;;;;;;14702:3;14690:9;14681:7;14677:23;14673:33;14670:2;;;-1:-1;;14709:12;14670:2;4224:6;4211:20;4236:47;4277:5;4236:47;:::i;:::-;14761:77;-1:-1;14875:2;14914:22;;5805:20;;-1:-1;15011:2;14996:18;;14983:32;-1:-1;;;;;15024:30;;15021:2;;;-1:-1;;15057:12;15021:2;15095:80;15167:7;15158:6;15147:9;15143:22;15095:80;:::i;:::-;15077:98;;-1:-1;15077:98;-1:-1;15230:51;;-1:-1;15273:7;15212:2;15249:22;;15230:51;:::i;15304:917::-;;;;;;;15517:3;15505:9;15496:7;15492:23;15488:33;15485:2;;;-1:-1;;15524:12;15485:2;4557:6;4544:20;4569:46;4609:5;4569:46;:::i;:::-;15576:76;-1:-1;15689:2;15741:22;;4544:20;4569:46;4544:20;4569:46;:::i;:::-;15697:76;-1:-1;15810:2;15849:22;;5805:20;;-1:-1;15918:2;15957:22;;5805:20;;-1:-1;16026:3;16066:22;;5805:20;;-1:-1;16154:51;16197:7;16135:3;16173:22;;16154:51;:::i;16228:517::-;;;;16379:2;16367:9;16358:7;16354:23;16350:32;16347:2;;;-1:-1;;16385:12;16347:2;4557:6;4544:20;4569:46;4609:5;4569:46;:::i;:::-;16437:76;-1:-1;16550:2;16589:22;;5805:20;;-1:-1;16658:2;16697:22;;72:20;97:33;72:20;97:33;:::i;:::-;16666:63;;;;16341:404;;;;;:::o;16752:263::-;;16867:2;16855:9;16846:7;16842:23;16838:32;16835:2;;;-1:-1;;16873:12;16835:2;-1:-1;5953:13;;16829:186;-1:-1;16829:186::o;17022:399::-;;;17154:2;17142:9;17133:7;17129:23;17125:32;17122:2;;;-1:-1;;17160:12;17122:2;-1:-1;;5953:13;;17323:2;17373:22;;;5953:13;;;;;-1:-1;17116:305::o;19960:467::-;43484:19;;;19960:467;-1:-1;;;;;20208:78;;20205:2;;;-1:-1;;20289:12;20205:2;43533:4;20324:6;20320:17;46148:6;46143:3;43533:4;43528:3;43524:14;46125:30;46186:16;;;;43533:4;46186:16;46179:27;;;-1:-1;46186:16;;20092:335;-1:-1;20092:335::o;27301:271::-;;20595:5;42649:12;20706:52;20751:6;20746:3;20739:4;20732:5;20728:16;20706:52;:::i;:::-;20770:16;;;;;27435:137;-1:-1;;27435:137::o;27579:379::-;27943:10;27767:191::o;27965:222::-;-1:-1;;;;;44863:54;;;;18090:37;;28092:2;28077:18;;28063:124::o;28439:349::-;-1:-1;;;;;44863:54;;;17959:58;;44863:54;;28774:2;28759:18;;18090:37;28602:2;28587:18;;28573:215::o;28795:349::-;-1:-1;;;;;44863:54;;;;17959:58;;29130:2;29115:18;;27132:37;28958:2;28943:18;;28929:215::o;29151:628::-;;3672:18;;44874:42;;;44353:5;44863:54;17966:3;17959:58;27162:5;29574:2;29563:9;29559:18;27132:37;29402:2;29611;29600:9;29596:18;29589:48;29651:118;29402:2;29391:9;29387:18;29755:6;29747;29651:118;:::i;:::-;29643:126;29373:406;-1:-1;;;;;;29373:406::o;30126:444::-;-1:-1;;;;;44863:54;;;18090:37;;44863:54;;;;30473:2;30458:18;;18090:37;30556:2;30541:18;;27132:37;;;;30309:2;30294:18;;30280:290::o;30917:668::-;-1:-1;;;;;44863:54;;;18090:37;;31321:2;31306:18;;27132:37;;;;44863:54;;;;31404:2;31389:18;;18090:37;31487:2;31472:18;;27132:37;;;;31570:3;31555:19;;27132:37;;;;31156:3;31141:19;;31127:458::o;31592:444::-;-1:-1;;;;;44863:54;;;;18090:37;;31939:2;31924:18;;27132:37;;;;32022:2;32007:18;;27132:37;31775:2;31760:18;;31746:290::o;32043:569::-;32292:2;32306:47;;;42649:12;;32277:18;;;43484:19;;;32043:569;;32292:2;43524:14;;;;;;43533:4;42323:14;;;32043:569;19573:326;19598:6;19595:1;19592:13;19573:326;;;19659:13;;26151:23;;-1:-1;;;;;44863:54;;;18090:37;;26314:16;;;26308:23;44863:54;;26385:14;;;18090:37;26472:16;;;26466:23;44863:54;26543:14;;;18090:37;26632:16;;;26626:23;26703:14;;;27132:37;26810:4;26799:16;;;26793:23;26870:14;;;27132:37;44874:42;26957:16;;;26951:23;27028:14;;;27132:37;17861:4;17852:14;;;;43202;;;;3672:18;19613:9;19573:326;;;-1:-1;;32583:18;;;;27132:37;;;;-1:-1;32359:160;;32263:349;-1:-1;;;;32263:349::o;33147:310::-;;33294:2;33315:17;33308:47;21279:5;42649:12;43496:6;33294:2;33283:9;33279:18;43484:19;21373:52;21418:6;43524:14;33283:9;43524:14;33294:2;21399:5;21395:16;21373:52;:::i;:::-;46581:7;46565:14;-1:-1;;46561:28;21437:39;;;;43524:14;21437:39;;33265:192;-1:-1;;33265:192::o;33464:416::-;33664:2;33678:47;;;21713:2;33649:18;;;43484:19;-1:-1;;;43524:14;;;21729:34;21782:12;;;33635:245::o;33887:416::-;34087:2;34101:47;;;22033:2;34072:18;;;43484:19;-1:-1;;;43524:14;;;22049:42;22110:12;;;34058:245::o;34310:416::-;34510:2;34524:47;;;22361:2;34495:18;;;43484:19;-1:-1;;;43524:14;;;22377:39;22435:12;;;34481:245::o;34733:416::-;34933:2;34947:47;;;22686:2;34918:18;;;43484:19;22722:29;43524:14;;;22702:50;22771:12;;;34904:245::o;35156:416::-;35356:2;35370:47;;;23022:2;35341:18;;;43484:19;-1:-1;;;43524:14;;;23038:36;23093:12;;;35327:245::o;35579:416::-;35779:2;35793:47;;;23344:2;35764:18;;;43484:19;-1:-1;;;43524:14;;;23360:35;23414:12;;;35750:245::o;36002:416::-;36202:2;36216:47;;;23665:2;36187:18;;;43484:19;23701:34;43524:14;;;23681:55;-1:-1;;;23756:12;;;23749:25;23793:12;;;36173:245::o;36425:416::-;36625:2;36639:47;;;24044:2;36610:18;;;43484:19;-1:-1;;;43524:14;;;24060:38;24117:12;;;36596:245::o;36848:416::-;37048:2;37062:47;;;24368:2;37033:18;;;43484:19;-1:-1;;;43524:14;;;24384:37;24440:12;;;37019:245::o;37271:416::-;37471:2;37485:47;;;24996:2;37456:18;;;43484:19;25032:31;43524:14;;;25012:52;25083:12;;;37442:245::o;37694:416::-;37894:2;37908:47;;;25334:2;37879:18;;;43484:19;25370:34;43524:14;;;25350:55;-1:-1;;;25425:12;;;25418:34;25471:12;;;37865:245::o;38117:416::-;38317:2;38331:47;;;25722:2;38302:18;;;43484:19;25758:34;43524:14;;;25738:55;-1:-1;;;25813:12;;;25806:46;25871:12;;;38288:245::o;38540:222::-;27132:37;;;38667:2;38652:18;;38638:124::o;38769:501::-;;27162:5;27139:3;27132:37;38984:2;39102;39091:9;39087:18;39080:48;39142:118;38984:2;38973:9;38969:18;39246:6;39238;39142:118;:::i;:::-;39134:126;38955:315;-1:-1;;;;;38955:315::o;39277:872::-;;39598:3;39587:9;39583:19;27162:5;27139:3;27132:37;39763:2;27162:5;39763:2;39752:9;39748:18;27132:37;39598:3;39800:2;39789:9;39785:18;39778:48;39840:108;18483:5;42649:12;43496:6;43491:3;43484:19;43524:14;39587:9;43524:14;18495:93;;39763:2;18659:5;42323:14;18671:21;;-1:-1;18698:260;18723:6;18720:1;18717:13;18698:260;;;18784:13;;-1:-1;;;;;44863:54;18090:37;;43202:14;;;;17582;;;;3672:18;18738:9;18698:260;;;18702:14;;39996:9;39990:4;39986:20;39981:2;39970:9;39966:18;39959:48;40021:118;40134:4;40125:6;40117;40021:118;:::i;:::-;40013:126;39569:580;-1:-1;;;;;;;;;;39569:580::o;40156:780::-;27132:37;;;40588:2;40573:18;;27132:37;;;;40671:2;40656:18;;27132:37;;;;40754:2;40739:18;;27132:37;40837:3;40822:19;;27132:37;40921:3;40906:19;;27132:37;40423:3;40408:19;;40394:542::o;40943:256::-;41005:2;40999:9;41031:17;;;-1:-1;;;;;41091:34;;41127:22;;;41088:62;41085:2;;;41163:1;;41153:12;41085:2;41005;41172:22;40983:216;;-1:-1;40983:216::o;41206:304::-;;-1:-1;;;;;41357:6;41354:30;41351:2;;;-1:-1;;41387:12;41351:2;-1:-1;41432:4;41420:17;;;41485:15;;41288:222::o;46221:268::-;46286:1;46293:101;46307:6;46304:1;46301:13;46293:101;;;46374:11;;;46368:18;46355:11;;;46348:39;46329:2;46322:10;46293:101;;;46409:6;46406:1;46403:13;46400:2;;;-1:-1;;46286:1;46456:16;;46449:27;46270:219::o;46602:117::-;-1:-1;;;;;44863:54;;46661:35;;46651:2;;46710:1;;46700:12;46651:2;46645:74;:::o
Swarm Source
ipfs://21e486a2851a3054e75483d2bc69ce79c6d5de46485d9d1f46cf1174b5231887
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,274.68 | 0.00008728 | $0.285807 |
Loading...
Loading
[ 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.