Contract
0xe3bd349bdb8203c15426b2d273f57568e658f843
2
Contract Overview
[ Download CSV Export ]
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x4b3ae7c5f4cab515382d7969b4f66fe6b4f44e35e2b46b6954672ff15a030d65 | 50805814 | 198 days 1 hr ago | 0xe3bd349bdb8203c15426b2d273f57568e658f843 | Contract Creation | 0 FTM | ||
0x4b3ae7c5f4cab515382d7969b4f66fe6b4f44e35e2b46b6954672ff15a030d65 | 50805814 | 198 days 1 hr ago | 0xc9ab1ab21358f4fc36cbbbe27f3b3ead423ec33b | Contract Creation | 0 FTM |
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x7547d05dff1da6b4a2ebb3f0833afe3c62abd9a1
Contract Name:
Pair
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2022-11-14 */ // File: contracts/interfaces/IPairFactory.sol pragma solidity 0.8.9; interface IPairFactory { function isPaused() external view returns (bool); function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function getFee(bool _stable) external view returns(uint256); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function getInitializable() external view returns (address, address, bool); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); } // File: contracts/interfaces/IPairCallee.sol pragma solidity 0.8.9; interface IPairCallee { function hook(address sender, uint amount0, uint amount1, bytes calldata data) external; } // File: contracts/interfaces/IERC20.sol pragma solidity 0.8.9; interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } // File: contracts/libraries/Math.sol pragma solidity 0.8.9; library Math { function max(uint a, uint b) internal pure returns (uint) { return a >= b ? a : b; } function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } function cbrt(uint256 n) internal pure returns (uint256) { unchecked { uint256 x = 0; for (uint256 y = 1 << 255; y > 0; y >>= 3) { x <<= 1; uint256 z = 3 * x * (x + 1) + 1; if (n / y >= z) { n -= y * z; x += 1; } } return x; }} } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // File: contracts/PairFees.sol pragma solidity 0.8.9; /** * @title Pair Fees * @notice used as a 1:1 pair relationship to split out fees, this ensures * that the curve does not need to be modified for LP shares */ contract PairFees is Initializable { address internal pair; // The pair it is bonded to address internal token0; // token0 of pair, saved localy and statically for gas optimization address internal token1; // Token1 of pair, saved localy and statically for gas optimization function initialize(address _token0, address _token1) public initializer { pair = msg.sender; token0 = _token0; token1 = _token1; } function _safeTransfer(address token,address to,uint256 value) internal { require(token.code.length > 0, "PairFees: invalid token"); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "PairFees: transfer failed"); } // Allow the pair to transfer fees to users function claimFeesFor(address recipient, uint amount0, uint amount1) external { require(msg.sender == pair, "Only pair contract can call"); if (amount0 > 0) _safeTransfer(token0, recipient, amount0); if (amount1 > 0) _safeTransfer(token1, recipient, amount1); } } // File: contracts/Pair.sol pragma solidity 0.8.9; contract Pair is Initializable { string public name; string public symbol; uint8 public constant decimals = 18; /// @notice Used to denote stable or volatile pair, not immutable since construction happens in the initialize method for CREATE2 deterministic addresses bool public stable; uint256 public totalSupply; mapping(address => mapping (address => uint)) public allowance; mapping(address => uint) public balanceOf; bytes32 internal DOMAIN_SEPARATOR; /// @dev keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public nonces; uint256 internal constant MINIMUM_LIQUIDITY = 10**3; address public token0; address public token1; address public fees; address public factory; // Structure to capture time period obervations every 30 minutes, used for local oracles struct Observation { uint timestamp; uint reserve0Cumulative; uint reserve1Cumulative; } // Capture oracle reading every 30 minutes uint constant periodSize = 1800; Observation[] public observations; uint internal decimals0; uint internal decimals1; uint public reserve0; uint public reserve1; uint public blockTimestampLast; uint public reserve0CumulativeLast; uint public reserve1CumulativeLast; // index0 and index1 are used to accumulate fees, this is split out from normal trades to keep the swap "clean" // this further allows LP holders to easily claim fees for tokens they have/staked uint public index0; uint public index1; // position assigned to each LP to track their current index0 & index1 vs the global position mapping(address => uint) public supplyIndex0; mapping(address => uint) public supplyIndex1; // tracks the amount of unclaimed, but claimable tokens off of fees for token0 and token1 mapping(address => uint) public claimable0; mapping(address => uint) public claimable1; /// @dev simple re-entrancy check bool internal _locked; event Fees(address indexed sender, uint amount0, uint amount1); event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint reserve0, uint reserve1); event Claim(address indexed sender, address indexed recipient, uint amount0, uint amount1); event Transfer(address indexed from, address indexed to, uint amount); event Approval(address indexed owner, address indexed spender, uint amount); modifier lock() { require(!_locked, "No re-entrancy"); _locked = true; _; _locked = false; } function initialize() public initializer { factory = msg.sender; (address _token0, address _token1, bool _stable) = IPairFactory(msg.sender).getInitializable(); (token0, token1, stable) = (_token0, _token1, _stable); PairFees pairFees = new PairFees(); pairFees.initialize(_token0, _token1); fees = address(pairFees); if (_stable) { name = string(abi.encodePacked("StableV1 AMM - ", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); symbol = string(abi.encodePacked("sAMM-", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); } else { name = string(abi.encodePacked("VolatileV1 AMM - ", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); symbol = string(abi.encodePacked("vAMM-", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); } decimals0 = 10**IERC20(_token0).decimals(); decimals1 = 10**IERC20(_token1).decimals(); observations.push(Observation(block.timestamp, 0, 0)); } function observationLength() external view returns (uint) { return observations.length; } function lastObservation() public view returns (Observation memory) { return observations[observations.length-1]; } function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1) { return (decimals0, decimals1, reserve0, reserve1, stable, token0, token1); } function tokens() external view returns (address, address) { return (token0, token1); } /// @dev claim accumulated but unclaimed fees (viewable via claimable0 and claimable1) function claimFees() external returns (uint claimed0, uint claimed1) { _updateFor(msg.sender); claimed0 = claimable0[msg.sender]; claimed1 = claimable1[msg.sender]; if (claimed0 > 0 || claimed1 > 0) { claimable0[msg.sender] = 0; claimable1[msg.sender] = 0; PairFees(fees).claimFeesFor(msg.sender, claimed0, claimed1); emit Claim(msg.sender, msg.sender, claimed0, claimed1); } } /// @dev Accrue fees on token0 function _update0(uint amount) internal { _safeTransfer(token0, fees, amount); // transfer the fees out to PairFees uint256 _ratio = amount * 1e18 / totalSupply; // 1e18 adjustment is removed during claim if (_ratio > 0) { index0 += _ratio; } emit Fees(msg.sender, amount, 0); } /// @dev Accrue fees on token1 function _update1(uint amount) internal { _safeTransfer(token1, fees, amount); uint256 _ratio = amount * 1e18 / totalSupply; if (_ratio > 0) { index1 += _ratio; } emit Fees(msg.sender, 0, amount); } /** * @notice This function must be called on any balance changes, otherwise can be used to infinitely claim fees * Fees are segregated from core funds, so fees can never put liquidity at risk */ function _updateFor(address recipient) internal { uint _supplied = balanceOf[recipient]; // get LP balance of `recipient` if (_supplied > 0) { uint _supplyIndex0 = supplyIndex0[recipient]; // get last adjusted index0 for recipient uint _supplyIndex1 = supplyIndex1[recipient]; uint _index0 = index0; // get global index0 for accumulated fees uint _index1 = index1; supplyIndex0[recipient] = _index0; // update user current position to global position supplyIndex1[recipient] = _index1; uint _delta0 = _index0 - _supplyIndex0; // see if there is any difference that need to be accrued uint _delta1 = _index1 - _supplyIndex1; if (_delta0 > 0) { uint _share = _supplied * _delta0 / 1e18; // add accrued difference for each supplied token claimable0[recipient] += _share; } if (_delta1 > 0) { uint _share = _supplied * _delta1 / 1e18; claimable1[recipient] += _share; } } else { supplyIndex0[recipient] = index0; // new users are set to the default global state supplyIndex1[recipient] = index1; } } function getReserves() public view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } /// @dev update reserves and, on the first call per block, price accumulators function _update(uint balance0, uint balance1, uint _reserve0, uint _reserve1) internal { uint blockTimestamp = block.timestamp; uint timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { reserve0CumulativeLast += _reserve0 * timeElapsed; reserve1CumulativeLast += _reserve1 * timeElapsed; } Observation memory _point = lastObservation(); timeElapsed = blockTimestamp - _point.timestamp; // compare the last observation with current timestamp, if greater than 30 minutes, record a new event if (timeElapsed > periodSize) { observations.push(Observation(blockTimestamp, reserve0CumulativeLast, reserve1CumulativeLast)); } reserve0 = balance0; reserve1 = balance1; blockTimestampLast = blockTimestamp; emit Sync(reserve0, reserve1); } /// @dev produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices() public view returns (uint reserve0Cumulative, uint reserve1Cumulative, uint blockTimestamp) { blockTimestamp = block.timestamp; reserve0Cumulative = reserve0CumulativeLast; reserve1Cumulative = reserve1CumulativeLast; // if time has elapsed since the last update on the pair, mock the accumulated price values (uint _reserve0, uint _reserve1, uint _blockTimestampLast) = getReserves(); if (_blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint timeElapsed = blockTimestamp - _blockTimestampLast; reserve0Cumulative += _reserve0 * timeElapsed; reserve1Cumulative += _reserve1 * timeElapsed; } } /// @dev gives the current twap price measured from amountIn * tokenIn gives amountOut function current(address tokenIn, uint amountIn) external view returns (uint amountOut) { Observation memory _observation = lastObservation(); (uint reserve0Cumulative, uint reserve1Cumulative,) = currentCumulativePrices(); if (block.timestamp == _observation.timestamp) { _observation = observations[observations.length-2]; } uint timeElapsed = block.timestamp - _observation.timestamp; uint _reserve0 = (reserve0Cumulative - _observation.reserve0Cumulative) / timeElapsed; uint _reserve1 = (reserve1Cumulative - _observation.reserve1Cumulative) / timeElapsed; amountOut = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } /// @dev as per `current`, however allows user configured granularity, up to the full window size function quote(address tokenIn, uint amountIn, uint granularity) external view returns (uint amountOut) { uint [] memory _prices = sample(tokenIn, amountIn, granularity, 1); uint priceAverageCumulative; for (uint i = 0; i < _prices.length; i++) { priceAverageCumulative += _prices[i]; } return priceAverageCumulative / granularity; } /// @dev returns a memory set of twap prices function prices(address tokenIn, uint amountIn, uint points) external view returns (uint[] memory) { return sample(tokenIn, amountIn, points, 1); } function sample(address tokenIn, uint amountIn, uint points, uint window) public view returns (uint[] memory) { uint[] memory _prices = new uint[](points); uint length = observations.length-1; uint i = length - (points * window); uint nextIndex = 0; uint index = 0; for (; i < length; i+=window) { nextIndex = i + window; uint timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp; uint _reserve0 = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed; uint _reserve1 = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed; _prices[index] = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); // index < length; length cannot overflow unchecked { index = index + 1; } } return _prices; } /** * @notice this low-level function should be called by addLiquidity functions in Router.sol, which performs important safety checks * standard uniswap v2 implementation */ function mint(address to) external lock returns (uint liquidity) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); uint _balance0 = IERC20(token0).balanceOf(address(this)); uint _balance1 = IERC20(token1).balanceOf(address(this)); uint _amount0 = _balance0 - _reserve0; uint _amount1 = _balance1 - _reserve1; uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(_amount0 * _amount1) - MINIMUM_LIQUIDITY; _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min(_amount0 * _totalSupply / _reserve0, _amount1 * _totalSupply / _reserve1); } require(liquidity > 0, "ILM"); // Pair: INSUFFICIENT_LIQUIDITY_MINTED _mint(to, liquidity); _update(_balance0, _balance1, _reserve0, _reserve1); emit Mint(msg.sender, _amount0, _amount1); } /** * @notice this low-level function should be called from a contract which performs important safety checks * standard uniswap v2 implementation */ function burn(address to) external lock returns (uint amount0, uint amount1) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); (address _token0, address _token1) = (token0, token1); uint _balance0 = IERC20(_token0).balanceOf(address(this)); uint _balance1 = IERC20(_token1).balanceOf(address(this)); uint _liquidity = balanceOf[address(this)]; uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee amount0 = _liquidity * _balance0 / _totalSupply; // using balances ensures pro-rata distribution amount1 = _liquidity * _balance1 / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, "ILB"); // Pair: INSUFFICIENT_LIQUIDITY_BURNED _burn(address(this), _liquidity); _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); _balance0 = IERC20(_token0).balanceOf(address(this)); _balance1 = IERC20(_token1).balanceOf(address(this)); _update(_balance0, _balance1, _reserve0, _reserve1); emit Burn(msg.sender, amount0, amount1, to); } /// @dev this low-level function should be called from a contract which performs important safety checks function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock { require(!IPairFactory(factory).isPaused()); require(amount0Out > 0 || amount1Out > 0, "IOA"); // Pair: INSUFFICIENT_OUTPUT_AMOUNT (uint _reserve0, uint _reserve1) = (reserve0, reserve1); require(amount0Out < _reserve0 && amount1Out < _reserve1, "IL"); // Pair: INSUFFICIENT_LIQUIDITY uint _balance0; uint _balance1; { // scope for _token{0,1}, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); require(to != _token0 && to != _token1, "IT"); // Pair: INVALID_TO if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens if (data.length > 0) IPairCallee(to).hook(msg.sender, amount0Out, amount1Out, data); // callback, used for flash loans _balance0 = IERC20(_token0).balanceOf(address(this)); _balance1 = IERC20(_token1).balanceOf(address(this)); } uint amount0In = _balance0 > _reserve0 - amount0Out ? _balance0 - (_reserve0 - amount0Out) : 0; uint amount1In = _balance1 > _reserve1 - amount1Out ? _balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, "IIA"); // Pair: INSUFFICIENT_INPUT_AMOUNT { // scope for reserve{0,1}Adjusted, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); if (amount0In > 0) _update0(amount0In * IPairFactory(factory).getFee(stable) / 10000); // accrue fees for token0 and move them out of pool if (amount1In > 0) _update1(amount1In * IPairFactory(factory).getFee(stable) / 10000); // accrue fees for token1 and move them out of pool _balance0 = IERC20(_token0).balanceOf(address(this)); // since we removed tokens, we need to reconfirm balances, can also simply use previous balance - amountIn/ 10000, but doing balanceOf again as safety check _balance1 = IERC20(_token1).balanceOf(address(this)); // The curve, either x3y+y3x for stable pools, or x*y for volatile pools require(_k(_balance0, _balance1) >= _k(_reserve0, _reserve1), "K"); // Pair: K } _update(_balance0, _balance1, _reserve0, _reserve1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } /// @dev force balances to match reserves function skim(address to) external lock { (address _token0, address _token1) = (token0, token1); _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)) - (reserve0)); _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)) - (reserve1)); } /// @dev force reserves to match balances function sync() external lock { _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1); } function _f(uint x0, uint y) internal pure returns (uint) { return x0*(y*y/1e18*y/1e18)/1e18+(x0*x0/1e18*x0/1e18)*y/1e18; } function _d(uint x0, uint y) internal pure returns (uint) { return 3*x0*(y*y/1e18)/1e18+(x0*x0/1e18*x0/1e18); } function _get_y(uint x0, uint xy, uint y) internal pure returns (uint) { for (uint i = 0; i < 255; i++) { uint y_prev = y; uint k = _f(x0, y); if (k < xy) { uint dy = (xy - k)*1e18/_d(x0, y); y = y + dy; } else { uint dy = (k - xy)*1e18/_d(x0, y); y = y - dy; } if (y > y_prev) { if (y - y_prev <= 1) { return y; } } else { if (y_prev - y <= 1) { return y; } } } return y; } function getAmountOut(uint amountIn, address tokenIn) external view returns (uint) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); amountIn -= amountIn * IPairFactory(factory).getFee(stable) / 10000; // remove fee from amount received return _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } function _getAmountOut(uint amountIn, address tokenIn, uint _reserve0, uint _reserve1) internal view returns (uint) { if (stable) { uint xy = _k(_reserve0, _reserve1); _reserve0 = _reserve0 * 1e18 / decimals0; _reserve1 = _reserve1 * 1e18 / decimals1; (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); amountIn = tokenIn == token0 ? amountIn * 1e18 / decimals0 : amountIn * 1e18 / decimals1; uint y = reserveB - _get_y(amountIn+reserveA, xy, reserveB); return y * (tokenIn == token0 ? decimals1 : decimals0) / 1e18; } else { (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); return amountIn * reserveB / (reserveA + amountIn); } } function _k(uint x, uint y) internal view returns (uint) { if (stable) { uint _x = x * 1e18 / decimals0; uint _y = y * 1e18 / decimals1; uint _a = (_x * _y) / 1e18; uint _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18); return _a * _b / 1e18; // x3y+y3x >= k } else { return x * y; // xy >= k } } function _mint(address dst, uint amount) internal { _updateFor(dst); // balances must be updated on mint/burn/transfer totalSupply += amount; balanceOf[dst] += amount; emit Transfer(address(0), dst, amount); } function _burn(address dst, uint amount) internal { _updateFor(dst); totalSupply -= amount; balanceOf[dst] -= amount; emit Transfer(dst, address(0), amount); } function approve(address spender, uint amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, "Pair: EXPIRED"); DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256(bytes("1")), block.chainid, address(this) ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "Pair: INVALID_SIGNATURE"); allowance[owner][spender] = value; emit Approval(owner, spender, value); } function transfer(address dst, uint amount) external returns (bool) { _transferTokens(msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint amount) external returns (bool) { address spender = msg.sender; uint spenderAllowance = allowance[src][spender]; if (spender != src && spenderAllowance != type(uint).max) { uint newAllowance = spenderAllowance - amount; allowance[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function _transferTokens(address src, address dst, uint amount) internal { _updateFor(src); // update fee position for src _updateFor(dst); // update fee position for dst balanceOf[src] -= amount; balanceOf[dst] += amount; emit Transfer(src, dst, amount); } function _safeTransfer(address token,address to,uint256 value) internal { require(token.code.length > 0, "Pair: invalid token"); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Pair: transfer failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reserve0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserve1","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockTimestampLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"current","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentCumulativePrices","outputs":[{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"_reserve0","type":"uint256"},{"internalType":"uint256","name":"_reserve1","type":"uint256"},{"internalType":"uint256","name":"_blockTimestampLast","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastObservation","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"internalType":"struct Pair.Observation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"uint256","name":"dec0","type":"uint256"},{"internalType":"uint256","name":"dec1","type":"uint256"},{"internalType":"uint256","name":"r0","type":"uint256"},{"internalType":"uint256","name":"r1","type":"uint256"},{"internalType":"bool","name":"st","type":"bool"},{"internalType":"address","name":"t0","type":"address"},{"internalType":"address","name":"t1","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"observationLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"observations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"}],"name":"prices","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"granularity","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"}],"name":"sample","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614502806100206000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c80638129fc1c1161015c578063bda39cad116100ce578063d294f09311610087578063d294f0931461064e578063d505accf14610656578063dd62ed3e14610669578063ebeb31db14610694578063f140a35a1461069c578063fff6cae9146106af57600080fd5b8063bda39cad14610604578063bf944dbc1461060d578063c245febc14610616578063c45a01551461061f578063c5700a0214610632578063d21220a71461063b57600080fd5b80639d63848a116101205780639d63848a146105655780639e8cc04b1461058b5780639f767c881461059e578063a1ac4d13146105be578063a9059cbb146105de578063bc25cf77146105f157600080fd5b80638129fc1c146104f057806389afcb44146104f85780638a7b8cf21461052057806395d89b411461054a5780639af1d35a1461055257600080fd5b8063252c09d711610200578063517b3f82116101b9578063517b3f821461046e5780635881c475146104815780635a76f25e146104945780636a6278421461049d57806370a08231146104b05780637ecebe00146104d057600080fd5b8063252c09d7146103b4578063313ce567146103c757806332c0defd146103e1578063392f37e9146103ea578063443cb4bc146104455780634d5a9f8a1461044e57600080fd5b806313345fe11161025257806313345fe11461033557806318160ddd146103555780631df8c7171461036c578063205aabf11461037457806322be3de11461039457806323b872dd146103a157600080fd5b8063022c0d9f1461028f57806306fdde03146102a45780630902f1ac146102c2578063095ea7b3146102e75780630dfe16811461030a575b600080fd5b6102a261029d366004613705565b6106b7565b005b6102ac610dad565b6040516102b991906137cb565b60405180910390f35b6010546011546012545b604080519384526020840192909252908201526060016102b9565b6102fa6102f53660046137fe565b610e3b565b60405190151581526020016102b9565b60095461031d906001600160a01b031681565b6040516001600160a01b0390911681526020016102b9565b61034861034336600461382a565b610ea8565b6040516102b99190613865565b61035e60045481565b6040519081526020016102b9565b6102cc6110a4565b61035e6103823660046138a9565b60186020526000908152604090205481565b6003546102fa9060ff1681565b6102fa6103af3660046138c6565b611113565b6102cc6103c2366004613907565b6111dc565b6103cf601281565b60405160ff90911681526020016102b9565b61035e60155481565b600e54600f54601054601154600354600954600a5460408051978852602088019690965294860193909352606085019190915260ff16151560808401526001600160a01b0390811660a08401521660c082015260e0016102b9565b61035e60105481565b61035e61045c3660046138a9565b60196020526000908152604090205481565b61035e61047c3660046137fe565b61120f565b61034861048f366004613920565b6112f8565b61035e60115481565b61035e6104ab3660046138a9565b611307565b61035e6104be3660046138a9565b60066020526000908152604090205481565b61035e6104de3660046138a9565b60086020526000908152604090205481565b6102a261156a565b61050b6105063660046138a9565b611e24565b604080519283526020830191909152016102b9565b61052861216a565b60408051825181526020808401519082015291810151908201526060016102b9565b6102ac6121ea565b600b5461031d906001600160a01b031681565b600954600a54604080516001600160a01b039384168152929091166020830152016102b9565b61035e610599366004613920565b6121f7565b61035e6105ac3660046138a9565b60176020526000908152604090205481565b61035e6105cc3660046138a9565b601a6020526000908152604090205481565b6102fa6105ec3660046137fe565b612264565b6102a26105ff3660046138a9565b61227a565b61035e60165481565b61035e60135481565b61035e60145481565b600c5461031d906001600160a01b031681565b61035e60125481565b600a5461031d906001600160a01b031681565b61050b612391565b6102a2610664366004613964565b61249b565b61035e6106773660046139d5565b600560209081526000928352604080842090915290825290205481565b600d5461035e565b61035e6106aa366004613a0e565b6127a3565b6102a261286b565b601b5460ff16156106e35760405162461bcd60e51b81526004016106da90613a33565b60405180910390fd5b601b805460ff19166001179055600c54604080516358c3de9360e11b815290516001600160a01b039092169163b187bd2691600480820192602092909190829003018186803b15801561073557600080fd5b505afa158015610749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076d9190613a6b565b1561077757600080fd5b60008511806107865750600084115b6107b85760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064016106da565b60105460115481871080156107cc57508086105b6107fd5760405162461bcd60e51b8152602060048201526002602482015261125360f21b60448201526064016106da565b600954600a5460009182916001600160a01b0391821691908116908916821480159061083b5750806001600160a01b0316896001600160a01b031614155b61086c5760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016106da565b8a1561087d5761087d828a8d6129aa565b891561088e5761088e818a8c6129aa565b86156108fb57604051639a7bff7960e01b81526001600160a01b038a1690639a7bff79906108c89033908f908f908e908e90600401613a86565b600060405180830381600087803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b15801561093a57600080fd5b505afa15801561094e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109729190613ad2565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a082319060240160206040518083038186803b1580156109b457600080fd5b505afa1580156109c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ec9190613ad2565b92505050600089856109fe9190613b01565b8311610a0b576000610a1f565b610a158a86613b01565b610a1f9084613b01565b90506000610a2d8a86613b01565b8311610a3a576000610a4e565b610a448a86613b01565b610a4e9084613b01565b90506000821180610a5f5750600081115b610a915760405162461bcd60e51b815260206004820152600360248201526249494160e81b60448201526064016106da565b600954600a546001600160a01b0391821691168315610b4f57600c54600354604051632895a2f560e11b815260ff90911615156004820152610b4f91612710916001600160a01b039091169063512b45ea9060240160206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190613ad2565b610b409087613b18565b610b4a9190613b37565b612b0d565b8215610bfa57600c54600354604051632895a2f560e11b815260ff90911615156004820152610bfa91612710916001600160a01b039091169063512b45ea9060240160206040518083038186803b158015610ba957600080fd5b505afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190613ad2565b610beb9086613b18565b610bf59190613b37565b612bac565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190613ad2565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a082319060240160206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb9190613ad2565b9450610cf78888612c44565b610d018787612c44565b1015610d335760405162461bcd60e51b81526020600482015260016024820152604b60f81b60448201526064016106da565b5050610d4184848888612d3d565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a35050601b805460ff19169055505050505050505050565b60018054610dba90613b59565b80601f0160208091040260200160405190810160405280929190818152602001828054610de690613b59565b8015610e335780601f10610e0857610100808354040283529160200191610e33565b820191906000526020600020905b815481529060010190602001808311610e1657829003601f168201915b505050505081565b3360008181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e969086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610ec557610ec5613b8e565b604051908082528060200260200182016040528015610eee578160200160208202803683370190505b50600d54909150600090610f0490600190613b01565b90506000610f128587613b18565b610f1c9083613b01565b90506000805b8383101561109457610f348784613ba4565b91506000600d8481548110610f4b57610f4b613bbc565b906000526020600020906003020160000154600d8481548110610f7057610f70613bbc565b906000526020600020906003020160000154610f8c9190613b01565b9050600081600d8681548110610fa457610fa4613bbc565b906000526020600020906003020160010154600d8681548110610fc957610fc9613bbc565b906000526020600020906003020160010154610fe59190613b01565b610fef9190613b37565b9050600082600d878154811061100757611007613bbc565b906000526020600020906003020160020154600d878154811061102c5761102c613bbc565b9060005260206000209060030201600201546110489190613b01565b6110529190613b37565b90506110608c8e8484612ed1565b88858151811061107257611072613bbc565b602090810291909101015250505060010161108d8784613ba4565b9250610f22565b509293505050505b949350505050565b60135460145442600080806110c26010546011546012549192909190565b92509250925083811461110b5760006110db8286613b01565b90506110e78185613b18565b6110f19088613ba4565b96506110fd8184613b18565b6111079087613ba4565b9550505b505050909192565b6001600160a01b03831660008181526005602090815260408083203380855292528220549192909190821480159061114d57506000198114155b156111c357600061115e8583613b01565b6001600160a01b038881166000818152600560209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b6111ce868686613072565b6001925050505b9392505050565b600d81815481106111ec57600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b60008061121a61216a565b90506000806112276110a4565b508451919350915042141561129057600d805461124690600290613b01565b8154811061125657611256613bbc565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b825160009061129f9042613b01565b90506000818560200151856112b49190613b01565b6112be9190613b37565b90506000828660400151856112d39190613b01565b6112dd9190613b37565b90506112eb888a8484612ed1565b9998505050505050505050565b606061109c8484846001610ea8565b601b5460009060ff161561132d5760405162461bcd60e51b81526004016106da90613a33565b601b805460ff191660011790556010546011546009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561138457600080fd5b505afa158015611398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bc9190613ad2565b600a546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561140557600080fd5b505afa158015611419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143d9190613ad2565b9050600061144b8584613b01565b905060006114598584613b01565b60045490915080611497576103e86114796114748486613b18565b613132565b6114839190613b01565b975061149260006103e86131a2565b6114cc565b6114c9876114a58386613b18565b6114af9190613b37565b876114ba8486613b18565b6114c49190613b37565b613235565b97505b600088116115025760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b60448201526064016106da565b61150c89896131a2565b61151885858989612d3d565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a25050601b805460ff19169055509395945050505050565b600054610100900460ff161580801561158a5750600054600160ff909116105b806115a45750303b1580156115a4575060005460ff166001145b6116075760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106da565b6000805460ff19166001179055801561162a576000805461ff0019166101001790555b600c80546001600160a01b031916339081179091556040805163eb13c4cf60e01b815290516000928392839263eb13c4cf91600480820192606092909190829003018186803b15801561167c57600080fd5b505afa158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b49190613bd2565b6003805482151560ff19909116179055600a80546001600160a01b038085166001600160a01b0319928316179092556009805492861692909116919091179055604051929550909350915060009061170b9061364a565b604051809103906000f080158015611727573d6000803e3d6000fd5b5060405163485cc95560e01b81526001600160a01b03868116600483015285811660248301529192509082169063485cc95590604401600060405180830381600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b5050600b80546001600160a01b0319166001600160a01b038516179055505081156119f557836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156117e957600080fd5b505afa1580156117fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118259190810190613c1a565b836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561185e57600080fd5b505afa158015611872573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261189a9190810190613c1a565b6040516020016118ab929190613cc7565b604051602081830303815290604052600190805190602001906118cf929190613657565b50836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561190957600080fd5b505afa15801561191d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119459190810190613c1a565b836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561197e57600080fd5b505afa158015611992573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119ba9190810190613c1a565b6040516020016119cb929190613d1e565b604051602081830303815290604052600290805190602001906119ef929190613657565b50611c36565b836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015611a2e57600080fd5b505afa158015611a42573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a6a9190810190613c1a565b836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015611aa357600080fd5b505afa158015611ab7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611adf9190810190613c1a565b604051602001611af0929190613d6b565b60405160208183030381529060405260019080519060200190611b14929190613657565b50836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015611b4e57600080fd5b505afa158015611b62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b8a9190810190613c1a565b836001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611bff9190810190613c1a565b604051602001611c10929190613dc4565b60405160208183030381529060405260029080519060200190611c34929190613657565b505b836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611c6f57600080fd5b505afa158015611c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca79190613de4565b611cb290600a613ee5565b600e81905550826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611cf157600080fd5b505afa158015611d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d299190613de4565b611d3490600a613ee5565b600f55505060408051606081018252428152600060208201818152928201818152600d8054600181018255925291517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb560039092029182015591517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb6830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb79091015550508015611e21576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b601b54600090819060ff1615611e4c5760405162461bcd60e51b81526004016106da90613a33565b601b805460ff19166001179055601054601154600954600a546040516370a0823160e01b81523060048201526001600160a01b03928316929091169060009083906370a082319060240160206040518083038186803b158015611eae57600080fd5b505afa158015611ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee69190613ad2565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b158015611f2b57600080fd5b505afa158015611f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f639190613ad2565b306000908152600660205260409020546004549192509080611f858584613b18565b611f8f9190613b37565b995080611f9c8484613b18565b611fa69190613b37565b985060008a118015611fb85750600089115b611fea5760405162461bcd60e51b815260206004820152600360248201526224a62160e91b60448201526064016106da565b611ff4308361324b565b611fff868c8c6129aa565b61200a858c8b6129aa565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a082319060240160206040518083038186803b15801561204957600080fd5b505afa15801561205d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120819190613ad2565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a082319060240160206040518083038186803b1580156120c357600080fd5b505afa1580156120d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120fb9190613ad2565b925061210984848a8a612d3d565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050601b805460ff1916905550959794965093945050505050565b61218e60405180606001604052806000815260200160008152602001600081525090565b600d805461219e90600190613b01565b815481106121ae576121ae613bbc565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60028054610dba90613b59565b6000806122078585856001610ea8565b90506000805b825181101561224f5782818151811061222857612228613bbc565b60200260200101518261223b9190613ba4565b91508061224781613ef4565b91505061220d565b5061225a8482613b37565b9695505050505050565b6000612271338484613072565b50600192915050565b601b5460ff161561229d5760405162461bcd60e51b81526004016106da90613a33565b601b805460ff19166001179055600954600a546010546040516370a0823160e01b81523060048201526001600160a01b03938416939092169161234a91849186919083906370a08231906024015b60206040518083038186803b15801561230357600080fd5b505afa158015612317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233b9190613ad2565b6123459190613b01565b6129aa565b6011546040516370a0823160e01b81523060048201526123829183918691906001600160a01b038416906370a08231906024016122eb565b5050601b805460ff1916905550565b60008061239d336132d6565b505033600090815260196020908152604080832054601a90925290912054811515806123c95750600081115b1561249757336000818152601960209081526040808320839055601a90915280822091909155600b54905163299e7ae760e11b8152600481019290925260248201849052604482018390526001600160a01b03169063533cf5ce90606401600060405180830381600087803b15801561244157600080fd5b505af1158015612455573d6000803e3d6000fd5b505060408051858152602081018590523393508392507f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645910160405180910390a35b9091565b428410156124db5760405162461bcd60e51b815260206004820152600d60248201526c14185a5c8e8811561412549151609a1b60448201526064016106da565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600160405161250b9190613f0f565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060078190556001600160a01b038a166000908152600890935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876125d683613ef4565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161264f92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156126ba573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906126f05750886001600160a01b0316816001600160a01b0316145b61273c5760405162461bcd60e51b815260206004820152601760248201527f506169723a20494e56414c49445f5349474e415455524500000000000000000060448201526064016106da565b6001600160a01b038981166000818152600560209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b601054601154600c54600354604051632895a2f560e11b815260ff909116151560048201526000939291612710916001600160a01b039091169063512b45ea9060240160206040518083038186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128369190613ad2565b6128409087613b18565b61284a9190613b37565b6128549086613b01565b945061286285858484612ed1565b95945050505050565b601b5460ff161561288e5760405162461bcd60e51b81526004016106da90613a33565b601b805460ff191660011790556009546040516370a0823160e01b815230600482015261299e916001600160a01b0316906370a082319060240160206040518083038186803b1580156128e057600080fd5b505afa1580156128f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129189190613ad2565b600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561295b57600080fd5b505afa15801561296f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129939190613ad2565b601054601154612d3d565b601b805460ff19169055565b6000836001600160a01b03163b116129fa5760405162461bcd60e51b81526020600482015260136024820152722830b4b91d1034b73b30b634b2103a37b5b2b760691b60448201526064016106da565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612a569190613fab565b6000604051808303816000865af19150503d8060008114612a93576040519150601f19603f3d011682016040523d82523d6000602084013e612a98565b606091505b5091509150818015612ac2575080511580612ac2575080806020019051810190612ac29190613a6b565b612b065760405162461bcd60e51b815260206004820152601560248201527414185a5c8e881d1c985b9cd9995c8819985a5b1959605a1b60448201526064016106da565b5050505050565b600954600b54612b2a916001600160a01b039081169116836129aa565b600454600090612b4283670de0b6b3a7640000613b18565b612b4c9190613b37565b90508015612b6c578060156000828254612b669190613ba4565b90915550505b604080518381526000602082015233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291015b60405180910390a25050565b600a54600b54612bc9916001600160a01b039081169116836129aa565b600454600090612be183670de0b6b3a7640000613b18565b612beb9190613b37565b90508015612c0b578060166000828254612c059190613ba4565b90915550505b60408051600081526020810184905233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a86029101612ba0565b60035460009060ff1615612d2c57600e54600090612c6a85670de0b6b3a7640000613b18565b612c749190613b37565b90506000600f5484670de0b6b3a7640000612c8f9190613b18565b612c999190613b37565b90506000670de0b6b3a7640000612cb08385613b18565b612cba9190613b37565b90506000670de0b6b3a7640000612cd18480613b18565b612cdb9190613b37565b670de0b6b3a7640000612cee8680613b18565b612cf89190613b37565b612d029190613ba4565b9050670de0b6b3a7640000612d178284613b18565b612d219190613b37565b945050505050610ea2565b612d368284613b18565b9050610ea2565b6012544290600090612d4f9083613b01565b9050600081118015612d6057508315155b8015612d6b57508215155b15612db257612d7a8185613b18565b60136000828254612d8b9190613ba4565b90915550612d9b90508184613b18565b60146000828254612dac9190613ba4565b90915550505b6000612dbc61216a565b8051909150612dcb9084613b01565b9150610708821115612e80576040805160608101825284815260135460208201908152601454928201928352600d805460018101825560009190915291517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5600390930292830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb682015590517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb7909101555b60108790556011869055601283905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60035460009060ff1615613022576000612eeb8484612c44565b600e54909150612f0385670de0b6b3a7640000613b18565b612f0d9190613b37565b600f54909450612f2584670de0b6b3a7640000613b18565b612f2f9190613b37565b60095490935060009081906001600160a01b03888116911614612f53578486612f56565b85855b60095491935091506001600160a01b03888116911614612f9457600f54612f8589670de0b6b3a7640000613b18565b612f8f9190613b37565b612fb3565b600e54612fa989670de0b6b3a7640000613b18565b612fb39190613b37565b97506000612fcb612fc4848b613ba4565b8584613436565b612fd59083613b01565b600954909150670de0b6b3a7640000906001600160a01b038a8116911614612fff57600e54613003565b600f545b61300d9083613b18565b6130179190613b37565b94505050505061109c565b60095460009081906001600160a01b03878116911614613043578385613046565b84845b90925090506130558783613ba4565b61305f8289613b18565b6130699190613b37565b9250505061109c565b61307b836132d6565b613084826132d6565b6001600160a01b038316600090815260066020526040812080548392906130ac908490613b01565b90915550506001600160a01b038216600090815260066020526040812080548392906130d9908490613ba4565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161312591815260200190565b60405180910390a3505050565b60006003821115613193575080600061314c600283613b37565b613157906001613ba4565b90505b8181101561318d579050806002816131728186613b37565b61317c9190613ba4565b6131869190613b37565b905061315a565b50919050565b811561319d575060015b919050565b6131ab826132d6565b80600460008282546131bd9190613ba4565b90915550506001600160a01b038216600090815260066020526040812080548392906131ea908490613ba4565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b600081831061324457816111d5565b5090919050565b613254826132d6565b80600460008282546132669190613b01565b90915550506001600160a01b03821660009081526006602052604081208054839290613293908490613b01565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613229565b6001600160a01b0381166000908152600660205260409020548015613404576001600160a01b03821660009081526017602090815260408083208054601880855292852080546015546016549481905594909552829055936133388584613b01565b905060006133468584613b01565b905081156133a1576000670de0b6b3a7640000613363848a613b18565b61336d9190613b37565b6001600160a01b038a1660009081526019602052604081208054929350839290919061339a908490613ba4565b9091555050505b80156133fa576000670de0b6b3a76400006133bc838a613b18565b6133c69190613b37565b6001600160a01b038a166000908152601a60205260408120805492935083929091906133f3908490613ba4565b9091555050505b5050505050505050565b6015546001600160a01b0383166000908152601760209081526040808320939093556016546018909152919020555050565b6000805b60ff81101561353c578260006134508783613545565b9050858110156134a057600061346688876135e2565b6134708389613b01565b61348290670de0b6b3a7640000613b18565b61348c9190613b37565b90506134988187613ba4565b9550506134e2565b60006134ac88876135e2565b6134b68884613b01565b6134c890670de0b6b3a7640000613b18565b6134d29190613b37565b90506134de8187613b01565b9550505b8185111561350b5760016134f68387613b01565b11613506578493505050506111d5565b613527565b60016135178684613b01565b11613527578493505050506111d5565b5050808061353490613ef4565b91505061343a565b50909392505050565b6000670de0b6b3a76400008281858161355e8280613b18565b6135689190613b37565b6135729190613b18565b61357c9190613b37565b6135869190613b18565b6135909190613b37565b670de0b6b3a76400008084816135a68280613b18565b6135b09190613b37565b6135ba9190613b18565b6135c49190613b37565b6135ce9086613b18565b6135d89190613b37565b6111d59190613ba4565b6000670de0b6b3a764000083816135f98280613b18565b6136039190613b37565b61360d9190613b18565b6136179190613b37565b670de0b6b3a76400008061362b8580613b18565b6136359190613b37565b613640866003613b18565b6135ce9190613b18565b61050580613fc883390190565b82805461366390613b59565b90600052602060002090601f01602090048101928261368557600085556136cb565b82601f1061369e57805160ff19168380011785556136cb565b828001600101855582156136cb579182015b828111156136cb5782518255916020019190600101906136b0565b506136d79291506136db565b5090565b5b808211156136d757600081556001016136dc565b6001600160a01b0381168114611e2157600080fd5b60008060008060006080868803121561371d57600080fd5b85359450602086013593506040860135613736816136f0565b9250606086013567ffffffffffffffff8082111561375357600080fd5b818801915088601f83011261376757600080fd5b81358181111561377657600080fd5b89602082850101111561378857600080fd5b9699959850939650602001949392505050565b60005b838110156137b657818101518382015260200161379e565b838111156137c5576000848401525b50505050565b60208152600082518060208401526137ea81604085016020870161379b565b601f01601f19169190910160400192915050565b6000806040838503121561381157600080fd5b823561381c816136f0565b946020939093013593505050565b6000806000806080858703121561384057600080fd5b843561384b816136f0565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b8181101561389d57835183529284019291840191600101613881565b50909695505050505050565b6000602082840312156138bb57600080fd5b81356111d5816136f0565b6000806000606084860312156138db57600080fd5b83356138e6816136f0565b925060208401356138f6816136f0565b929592945050506040919091013590565b60006020828403121561391957600080fd5b5035919050565b60008060006060848603121561393557600080fd5b8335613940816136f0565b95602085013595506040909401359392505050565b60ff81168114611e2157600080fd5b600080600080600080600060e0888a03121561397f57600080fd5b873561398a816136f0565b9650602088013561399a816136f0565b9550604088013594506060880135935060808801356139b881613955565b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156139e857600080fd5b82356139f3816136f0565b91506020830135613a03816136f0565b809150509250929050565b60008060408385031215613a2157600080fd5b823591506020830135613a03816136f0565b6020808252600e908201526d4e6f2072652d656e7472616e637960901b604082015260600190565b8051801515811461319d57600080fd5b600060208284031215613a7d57600080fd5b6111d582613a5b565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b600060208284031215613ae457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613b1357613b13613aeb565b500390565b6000816000190483118215151615613b3257613b32613aeb565b500290565b600082613b5457634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680613b6d57607f821691505b6020821081141561318d57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008219821115613bb757613bb7613aeb565b500190565b634e487b7160e01b600052603260045260246000fd5b600080600060608486031215613be757600080fd5b8351613bf2816136f0565b6020850151909350613c03816136f0565b9150613c1160408501613a5b565b90509250925092565b600060208284031215613c2c57600080fd5b815167ffffffffffffffff80821115613c4457600080fd5b818401915084601f830112613c5857600080fd5b815181811115613c6a57613c6a613b8e565b604051601f8201601f19908116603f01168101908382118183101715613c9257613c92613b8e565b81604052828152876020848701011115613cab57600080fd5b613cbc83602083016020880161379b565b979650505050505050565b6e029ba30b13632ab189020a6a690169608d1b815260008351613cf181600f85016020880161379b565b602f60f81b600f918401918201528351613d1281601084016020880161379b565b01601001949350505050565b6473414d4d2d60d81b815260008351613d3e81600585016020880161379b565b602f60f81b6005918401918201528351613d5f81600684016020880161379b565b01600601949350505050565b7002b37b630ba34b632ab189020a6a690169607d1b815260008351613d9781601185016020880161379b565b602f60f81b6011918401918201528351613db881601284016020880161379b565b01601201949350505050565b6476414d4d2d60d81b815260008351613d3e81600585016020880161379b565b600060208284031215613df657600080fd5b81516111d581613955565b600181815b80851115613e3c578160001904821115613e2257613e22613aeb565b80851615613e2f57918102915b93841c9390800290613e06565b509250929050565b600082613e5357506001610ea2565b81613e6057506000610ea2565b8160018114613e765760028114613e8057613e9c565b6001915050610ea2565b60ff841115613e9157613e91613aeb565b50506001821b610ea2565b5060208310610133831016604e8410600b8410161715613ebf575081810a610ea2565b613ec98383613e01565b8060001904821115613edd57613edd613aeb565b029392505050565b60006111d560ff841683613e44565b6000600019821415613f0857613f08613aeb565b5060010190565b600080835481600182811c915080831680613f2b57607f831692505b6020808410821415613f4b57634e487b7160e01b86526022600452602486fd5b818015613f5f5760018114613f7057613f9d565b60ff19861689528489019650613f9d565b60008a81526020902060005b86811015613f955781548b820152908501908301613f7c565b505084890196505b509498975050505050505050565b60008251613fbd81846020870161379b565b919091019291505056fe608060405234801561001057600080fd5b506104e5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063485cc9551461003b578063533cf5ce14610050575b600080fd5b61004e6100493660046103e5565b610063565b005b61004e61005e366004610418565b6101be565b600054610100900460ff16158080156100835750600054600160ff909116105b8061009d5750303b15801561009d575060005460ff166001145b6101055760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610128576000805461ff0019166101001790555b6000805462010000330262010000600160b01b0319909116179055600180546001600160a01b038581166001600160a01b031992831617909255600280549285169290911691909117905580156101b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000546201000090046001600160a01b0316331461021e5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79207061697220636f6e74726163742063616e2063616c6c000000000060448201526064016100fc565b811561023b5760015461023b906001600160a01b03168484610254565b80156101b9576002546101b9906001600160a01b031684835b6000836001600160a01b03163b116102ae5760405162461bcd60e51b815260206004820152601760248201527f50616972466565733a20696e76616c696420746f6b656e00000000000000000060448201526064016100fc565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161030a919061044b565b6000604051808303816000865af19150503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b50915091508180156103765750805115806103765750808060200190518101906103769190610486565b6103c25760405162461bcd60e51b815260206004820152601960248201527f50616972466565733a207472616e73666572206661696c65640000000000000060448201526064016100fc565b5050505050565b80356001600160a01b03811681146103e057600080fd5b919050565b600080604083850312156103f857600080fd5b610401836103c9565b915061040f602084016103c9565b90509250929050565b60008060006060848603121561042d57600080fd5b610436846103c9565b95602085013595506040909401359392505050565b6000825160005b8181101561046c5760208186018101518583015201610452565b8181111561047b576000828501525b509190910192915050565b60006020828403121561049857600080fd5b815180151581146104a857600080fd5b939250505056fea264697066735822122003f397f6a2f31eb926ca2aa1a062dc4b388e55e9bae2eeb7bf85ecf353ad778b64736f6c63430008090033a2646970667358221220300ad46cd9b0836e295ece4b3e2db09ecaddedc88e689d19694a8b21b628c7ea64736f6c63430008090033
Deployed ByteCode Sourcemap
17633:23916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32738:2500;;;;;;:::i;:::-;;:::i;:::-;;17673:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25226:223;25351:8;;25382;;25423:18;;25226:223;;;;1871:25:1;;;1927:2;1912:18;;1905:34;;;;1955:18;;;1948:34;1859:2;1844:18;25226:223:0;1669:319:1;38901:206:0;;;;;;:::i;:::-;;:::i;:::-;;;2478:14:1;;2471:22;2453:41;;2441:2;2426:18;38901:206:0;2313:187:1;18484:21:0;;;;;-1:-1:-1;;;;;18484:21:0;;;;;;-1:-1:-1;;;;;2669:32:1;;;2651:51;;2639:2;2624:18;18484:21:0;2505:203:1;28951:1001:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17955:26::-;;;;;;;;;3953:25:1;;;3941:2;3926:18;17955:26:0;3807:177:1;26617:777:0;;;:::i;19595:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;17928:18;;;;;;;;;40344:511;;;;;;:::i;:::-;;:::i;18907:33::-;;;;;;:::i;:::-;;:::i;17725:35::-;;17758:2;17725:35;;;;;5059:4:1;5047:17;;;5029:36;;5017:2;5002:18;17725:35:0;4887:184:1;19393:18:0;;;;;;22111:208;22246:9;;22257;;22268:8;;22278;;22288:6;;22296;;22304;;22111:208;;;5385:25:1;;;5441:2;5426:18;;5419:34;;;;5469:18;;;5462:34;;;;5527:2;5512:18;;5505:34;;;;22288:6:0;;5583:14:1;5576:22;5570:3;5555:19;;5548:51;-1:-1:-1;;;;;22296:6:0;;;5626:3:1;5653:19;;5646:44;22304:6:0;5721:3:1;5706:19;;5699:44;5372:3;5357:19;22111:208:0;5076:673:1;19011:20:0;;;;;;19743:42;;;;;;:::i;:::-;;;;;;;;;;;;;;27494:723;;;;;;:::i;:::-;;:::i;28782:161::-;;;;;;:::i;:::-;;:::i;19038:20::-;;;;;;30158:1072;;;;;;:::i;:::-;;:::i;18059:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;18377:38;;;;;;:::i;:::-;;;;;;;;;;;;;;20774:1081;;;:::i;31411:1209::-;;;;;;:::i;:::-;;:::i;:::-;;;;6316:25:1;;;6372:2;6357:18;;6350:34;;;;6289:18;31411:1209:0;6142:248:1;21974:129:0;;;:::i;:::-;;;;6615:13:1;;6597:32;;6685:4;6673:17;;;6667:24;6645:20;;;6638:54;6736:17;;;6730:24;6708:20;;;6701:54;6585:2;6570:18;21974:129:0;6395:366:1;17698:20:0;;;:::i;18540:19::-;;;;;-1:-1:-1;;;;;18540:19:0;;;22327:101;22405:6;;22413;;22327:101;;;-1:-1:-1;;;;;22405:6:0;;;6978:34:1;;22413:6:0;;;;7043:2:1;7028:18;;7021:43;6913:18;22327:101:0;6766:304:1;28328:396:0;;;;;;:::i;:::-;;:::i;19544:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;19792:42;;;;;;:::i;:::-;;;;;;;;;;;;;;40187:149;;;;;;:::i;:::-;;:::i;35293:296::-;;;;;;:::i;:::-;;:::i;19418:18::-;;;;;;19104:34;;;;;;19145;;;;;;18566:22;;;;;-1:-1:-1;;;;;18566:22:0;;;19065:30;;;;;;18512:21;;;;;-1:-1:-1;;;;;18512:21:0;;;22528:487;;;:::i;39115:1064::-;;;;;;:::i;:::-;;:::i;17990:62::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;21863:103;21939:12;:19;21863:103;;36784:342;;;;;;:::i;:::-;;:::i;35644:158::-;;;:::i;32738:2500::-;20669:7;;;;20668:8;20660:35;;;;-1:-1:-1;;;20660:35:0;;;;;;;:::i;:::-;;;;;;;;;20706:7;:14;;-1:-1:-1;;20706:14:0;20716:4;20706:14;;;32866:7:::1;::::0;32853:32:::1;::::0;;-1:-1:-1;;;32853:32:0;;;;-1:-1:-1;;;;;32866:7:0;;::::1;::::0;32853:30:::1;::::0;:32:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;32866:7;32853:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32852:33;32844:42;;;::::0;::::1;;32918:1;32905:10;:14;:32;;;;32936:1;32923:10;:14;32905:32;32897:48;;;::::0;-1:-1:-1;;;32897:48:0;;9634:2:1;32897:48:0::1;::::0;::::1;9616:21:1::0;9673:1;9653:18;;;9646:29;-1:-1:-1;;;9691:18:1;;;9684:33;9734:18;;32897:48:0::1;9432:326:1::0;32897:48:0::1;33029:8;::::0;33039::::1;::::0;33067:22;;::::1;:48:::0;::::1;;;;33106:9;33093:10;:22;33067:48;33059:63;;;::::0;-1:-1:-1;;;33059:63:0;;9965:2:1;33059:63:0::1;::::0;::::1;9947:21:1::0;10004:1;9984:18;;;9977:29;-1:-1:-1;;;10022:18:1;;;10015:32;10064:18;;33059:63:0::1;9763:325:1::0;33059:63:0::1;33321:6;::::0;33329::::1;::::0;33167:14:::1;::::0;;;-1:-1:-1;;;;;33321:6:0;;::::1;::::0;33329;;::::1;::::0;33355:13;::::1;::::0;::::1;::::0;::::1;::::0;:30:::1;;;33378:7;-1:-1:-1::0;;;;;33372:13:0::1;:2;-1:-1:-1::0;;;;;33372:13:0::1;;;33355:30;33347:45;;;::::0;-1:-1:-1;;;33347:45:0;;10295:2:1;33347:45:0::1;::::0;::::1;10277:21:1::0;10334:1;10314:18;;;10307:29;-1:-1:-1;;;10352:18:1;;;10345:32;10394:18;;33347:45:0::1;10093:325:1::0;33347:45:0::1;33427:14:::0;;33423:58:::1;;33443:38;33457:7;33466:2;33470:10;33443:13;:38::i;:::-;33530:14:::0;;33526:58:::1;;33546:38;33560:7;33569:2;33573:10;33546:13;:38::i;:::-;33633:15:::0;;33629:83:::1;;33650:62;::::0;-1:-1:-1;;;33650:62:0;;-1:-1:-1;;;;;33650:20:0;::::1;::::0;::::1;::::0;:62:::1;::::0;33671:10:::1;::::0;33683;;33695;;33707:4;;;;33650:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33629:83;33769:40;::::0;-1:-1:-1;;;33769:40:0;;33803:4:::1;33769:40;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;33769:25:0;::::1;::::0;::::1;::::0;2624:18:1;;33769:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33832;::::0;-1:-1:-1;;;33832:40:0;;33866:4:::1;33832:40;::::0;::::1;2651:51:1::0;33757:52:0;;-1:-1:-1;;;;;;33832:25:0;::::1;::::0;::::1;::::0;2624:18:1;;33832:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33820:52;;33217:667;;33894:14;33935:10;33923:9;:22;;;;:::i;:::-;33911:9;:34;:77;;33987:1;33911:77;;;33961:22;33973:10:::0;33961:9;:22:::1;:::i;:::-;33948:36;::::0;:9;:36:::1;:::i;:::-;33894:94:::0;-1:-1:-1;33999:14:0::1;34028:22;34040:10:::0;34028:9;:22:::1;:::i;:::-;34016:9;:34;:77;;34092:1;34016:77;;;34066:22;34078:10:::0;34066:9;:22:::1;:::i;:::-;34053:36;::::0;:9;:36:::1;:::i;:::-;33999:94;;34124:1;34112:9;:13;:30;;;;34141:1;34129:9;:13;34112:30;34104:46;;;::::0;-1:-1:-1;;;34104:46:0;;11713:2:1;34104:46:0::1;::::0;::::1;11695:21:1::0;11752:1;11732:18;;;11725:29;-1:-1:-1;;;11770:18:1;;;11763:33;11813:18;;34104:46:0::1;11511:326:1::0;34104:46:0::1;34309:6;::::0;34317::::1;::::0;-1:-1:-1;;;;;34309:6:0;;::::1;::::0;34317::::1;34339:13:::0;;34335:85:::1;;34388:7;::::0;34404:6:::1;::::0;34375:36:::1;::::0;-1:-1:-1;;;34375:36:0;;34404:6:::1;::::0;;::::1;2478:14:1::0;2471:22;34375:36:0::1;::::0;::::1;2453:41:1::0;34354:66:0::1;::::0;34414:5:::1;::::0;-1:-1:-1;;;;;34388:7:0;;::::1;::::0;34375:28:::1;::::0;2426:18:1;;34375:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34363:48;::::0;:9;:48:::1;:::i;:::-;:56;;;;:::i;:::-;34354:8;:66::i;:::-;34487:13:::0;;34483:85:::1;;34536:7;::::0;34552:6:::1;::::0;34523:36:::1;::::0;-1:-1:-1;;;34523:36:0;;34552:6:::1;::::0;;::::1;2478:14:1::0;2471:22;34523:36:0::1;::::0;::::1;2453:41:1::0;34502:66:0::1;::::0;34562:5:::1;::::0;-1:-1:-1;;;;;34536:7:0;;::::1;::::0;34523:28:::1;::::0;2426:18:1;;34523:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34511:48;::::0;:9;:48:::1;:::i;:::-;:56;;;;:::i;:::-;34502:8;:66::i;:::-;34643:40;::::0;-1:-1:-1;;;34643:40:0;;34677:4:::1;34643:40;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;34643:25:0;::::1;::::0;::::1;::::0;2624:18:1;;34643:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34863;::::0;-1:-1:-1;;;34863:40:0;;34897:4:::1;34863:40;::::0;::::1;2651:51:1::0;34631:52:0;;-1:-1:-1;;;;;;34863:25:0;::::1;::::0;::::1;::::0;2624:18:1;;34863:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34851:52;;35032:24;35035:9;35046;35032:2;:24::i;:::-;35004;35007:9;35018;35004:2;:24::i;:::-;:52;;34996:66;;;::::0;-1:-1:-1;;;34996:66:0;;12439:2:1;34996:66:0::1;::::0;::::1;12421:21:1::0;12478:1;12458:18;;;12451:29;-1:-1:-1;;;12496:18:1;;;12489:31;12537:18;;34996:66:0::1;12237:324:1::0;34996:66:0::1;34196:889;;35097:51;35105:9;35116;35127;35138;35097:7;:51::i;:::-;35164:66;::::0;;12797:25:1;;;12853:2;12838:18;;12831:34;;;12881:18;;;12874:34;;;12939:2;12924:18;;12917:34;;;-1:-1:-1;;;;;35164:66:0;::::1;::::0;35169:10:::1;::::0;35164:66:::1;::::0;12784:3:1;12769:19;35164:66:0::1;;;;;;;-1:-1:-1::0;;20743:7:0;:15;;-1:-1:-1;;20743:15:0;;;-1:-1:-1;;;;;;;;;32738:2500:0:o;17673:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38901:206::-;38993:10;38966:4;38983:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;38983:30:0;;;;;;;;;;:39;;;39040:37;38966:4;;38983:30;;39040:37;;;;39016:6;3953:25:1;;3941:2;3926:18;;3807:177;39040:37:0;;;;;;;;-1:-1:-1;39095:4:0;38901:206;;;;;:::o;28951:1001::-;29046:13;29072:21;29107:6;29096:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29096:18:0;-1:-1:-1;29141:12:0;:19;29072:42;;-1:-1:-1;29127:11:0;;29141:21;;29161:1;;29141:21;:::i;:::-;29127:35;-1:-1:-1;29173:6:0;29192:15;29201:6;29192;:15;:::i;:::-;29182:26;;:6;:26;:::i;:::-;29173:35;;29219:14;29248:10;29275:645;29286:6;29282:1;:10;29275:645;;;29332:10;29336:6;29332:1;:10;:::i;:::-;29320:22;;29357:16;29412:12;29425:1;29412:15;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;29376:12;29389:9;29376:23;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:61;;;;:::i;:::-;29357:80;;29452:14;29553:11;29515:12;29528:1;29515:15;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;29470:12;29483:9;29470:23;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:79;;;;:::i;:::-;29469:95;;;;:::i;:::-;29452:112;;29579:14;29680:11;29642:12;29655:1;29642:15;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;29597:12;29610:9;29597:23;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:79;;;;:::i;:::-;29596:95;;;;:::i;:::-;29579:112;;29723:54;29737:8;29747:7;29756:9;29767;29723:13;:54::i;:::-;29706:7;29714:5;29706:14;;;;;;;;:::i;:::-;;;;;;;;;;:71;-1:-1:-1;;;29892:1:0;29884:9;29294;29297:6;29294:9;;:::i;:::-;;;29275:645;;;-1:-1:-1;29937:7:0;;-1:-1:-1;;;;28951:1001:0;;;;;;;:::o;26617:777::-;26819:22;;26873;;26772:15;26673:23;;;27070:13;25351:8;;25382;;25423:18;;25351:8;;25382;;25423:18;25226:223;27070:13;27009:74;;;;;;27121:14;27098:19;:37;27094:293;;27200:16;27219:36;27236:19;27219:14;:36;:::i;:::-;27200:55;-1:-1:-1;27292:23:0;27200:55;27292:9;:23;:::i;:::-;27270:45;;;;:::i;:::-;;-1:-1:-1;27352:23:0;27364:11;27352:9;:23;:::i;:::-;27330:45;;;;:::i;:::-;;;27137:250;27094:293;26744:650;;;26617:777;;;:::o;40344:511::-;-1:-1:-1;;;;;40503:14:0;;40423:4;40503:14;;;:9;:14;;;;;;;;40458:10;40503:23;;;;;;;;40423:4;;40458:10;;40503:23;40543:14;;;;;:52;;;-1:-1:-1;;40561:16:0;:34;;40543:52;40539:241;;;40612:17;40632:25;40651:6;40632:16;:25;:::i;:::-;-1:-1:-1;;;;;40672:14:0;;;;;;;:9;:14;;;;;;;;:23;;;;;;;;;;;;;:38;;;40732:36;;3953:25:1;;;40672:38:0;;-1:-1:-1;40672:23:0;;:14;;40732:36;;3926:18:1;40732:36:0;;;;;;;40597:183;40539:241;40792:33;40808:3;40813;40818:6;40792:15;:33::i;:::-;40843:4;40836:11;;;;40344:511;;;;;;:::o;18907:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18907:33:0;:::o;27494:723::-;27566:14;27593:31;27627:17;:15;:17::i;:::-;27593:51;;27656:23;27681;27709:25;:23;:25::i;:::-;-1:-1:-1;27768:22:0;;27655:79;;-1:-1:-1;27655:79:0;-1:-1:-1;27749:15:0;:41;27745:124;;;27822:12;27835:19;;:21;;27855:1;;27835:21;:::i;:::-;27822:35;;;;;;;;:::i;:::-;;;;;;;;;;;27807:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27745:124;27918:22;;27881:16;;27900:40;;:15;:40;:::i;:::-;27881:59;;27951:14;28025:11;27990:12;:31;;;27969:18;:52;;;;:::i;:::-;27968:68;;;;:::i;:::-;27951:85;;28047:14;28121:11;28086:12;:31;;;28065:18;:52;;;;:::i;:::-;28064:68;;;;:::i;:::-;28047:85;;28155:54;28169:8;28179:7;28188:9;28199;28155:13;:54::i;:::-;28143:66;27494:723;-1:-1:-1;;;;;;;;;27494:723:0:o;28782:161::-;28866:13;28899:36;28906:7;28915:8;28925:6;28933:1;28899:6;:36::i;30158:1072::-;20669:7;;30207:14;;20669:7;;20668:8;20660:35;;;;-1:-1:-1;;;20660:35:0;;;;;;;:::i;:::-;20706:7;:14;;-1:-1:-1;;20706:14:0;20716:4;20706:14;;;30270:8:::1;::::0;30280::::1;::::0;30324:6:::1;::::0;30317:39:::1;::::0;-1:-1:-1;;;30317:39:0;;30350:4:::1;30317:39;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;;;30324:6:0::1;::::0;30317:24:::1;::::0;2624:18:1;;30317:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30391:6;::::0;30384:39:::1;::::0;-1:-1:-1;;;30384:39:0;;30417:4:::1;30384:39;::::0;::::1;2651:51:1::0;30300:56:0;;-1:-1:-1;30367:14:0::1;::::0;-1:-1:-1;;;;;30391:6:0;;::::1;::::0;30384:24:::1;::::0;2624:18:1;;30384:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30367:56:::0;-1:-1:-1;30434:13:0::1;30450:21;30462:9:::0;30450;:21:::1;:::i;:::-;30434:37:::0;-1:-1:-1;30482:13:0::1;30498:21;30510:9:::0;30498;:21:::1;:::i;:::-;30552:11;::::0;30482:37;;-1:-1:-1;30656:17:0;30652:345:::1;;18470:5;30702:30;30712:19;30723:8:::0;30712;:19:::1;:::i;:::-;30702:9;:30::i;:::-;:50;;;;:::i;:::-;30690:62;;30767:36;30781:1;18470:5;30767;:36::i;:::-;30652:345;;;30903:82;30938:9:::0;30912:23:::1;30923:12:::0;30912:8;:23:::1;:::i;:::-;:35;;;;:::i;:::-;30975:9:::0;30949:23:::1;30960:12:::0;30949:8;:23:::1;:::i;:::-;:35;;;;:::i;:::-;30903:8;:82::i;:::-;30891:94;;30652:345;31027:1;31015:9;:13;31007:29;;;::::0;-1:-1:-1;;;31007:29:0;;13946:2:1;31007:29:0::1;::::0;::::1;13928:21:1::0;13985:1;13965:18;;;13958:29;-1:-1:-1;;;14003:18:1;;;13996:33;14046:18;;31007:29:0::1;13744:326:1::0;31007:29:0::1;31086:20;31092:2;31096:9;31086:5;:20::i;:::-;31119:51;31127:9;31138;31149;31160;31119:7;:51::i;:::-;31186:36;::::0;;6316:25:1;;;6372:2;6357:18;;6350:34;;;31191:10:0::1;::::0;31186:36:::1;::::0;6289:18:1;31186:36:0::1;;;;;;;-1:-1:-1::0;;20743:7:0;:15;;-1:-1:-1;;20743:15:0;;;-1:-1:-1;30158:1072:0;;;-1:-1:-1;;;;;30158:1072:0:o;20774:1081::-;13508:19;13531:13;;;;;;13530:14;;13578:34;;;;-1:-1:-1;13596:12:0;;13611:1;13596:12;;;;:16;13578:34;13577:108;;;-1:-1:-1;13657:4:0;4270:19;:23;;;13618:66;;-1:-1:-1;13667:12:0;;;;;:17;13618:66;13555:204;;;;-1:-1:-1;;;13555:204:0;;14277:2:1;13555:204:0;;;14259:21:1;14316:2;14296:18;;;14289:30;14355:34;14335:18;;;14328:62;-1:-1:-1;;;14406:18:1;;;14399:44;14460:19;;13555:204:0;14075:410:1;13555:204:0;13770:12;:16;;-1:-1:-1;;13770:16:0;13785:1;13770:16;;;13797:67;;;;13832:13;:20;;-1:-1:-1;;13832:20:0;;;;;13797:67;20826:7:::1;:20:::0;;-1:-1:-1;;;;;;20826:20:0::1;20836:10;20826:20:::0;;::::1;::::0;;;20908:43:::1;::::0;;-1:-1:-1;;;20908:43:0;;;;20826:7:::1;::::0;;;;;20908:41:::1;::::0;:43:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;20836:10;20908:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20979:6;20962:54:::0;;;::::1;;-1:-1:-1::0;;20962:54:0;;::::1;;::::0;;20971:6:::1;20962:54:::0;;-1:-1:-1;;;;;20962:54:0;;::::1;-1:-1:-1::0;;;;;;20962:54:0;;::::1;;::::0;;;20963:6:::1;20962:54:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;21047:14:::1;::::0;20857:94;;-1:-1:-1;20857:94:0;;-1:-1:-1;20857:94:0;-1:-1:-1;20963:6:0::1;::::0;21047:14:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;21072:37:0::1;::::0;-1:-1:-1;;;21072:37:0;;-1:-1:-1;;;;;6996:15:1;;;21072:37:0::1;::::0;::::1;6978:34:1::0;7048:15;;;7028:18;;;7021:43;21027:34:0;;-1:-1:-1;21072:19:0;;::::1;::::0;::::1;::::0;6913:18:1;;21072:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;21120:4:0::1;:24:::0;;-1:-1:-1;;;;;;21120:24:0::1;-1:-1:-1::0;;;;;21120:24:0;::::1;;::::0;;-1:-1:-1;;21157:517:0;::::1;;;21242:7;-1:-1:-1::0;;;;;21235:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;21235:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;21273:7;-1:-1:-1::0;;;;;21266:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;21266:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;21199:92;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21185:4;:107;;;;;;;;;;;;:::i;:::-;;21356:7;-1:-1:-1::0;;;;;21349:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;21349:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;21387:7;-1:-1:-1::0;;;;;21380:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;21380:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;21323:82;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21307:6;:99;;;;;;;;;;;;:::i;:::-;;21157:517;;;21498:7;-1:-1:-1::0;;;;;21491:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;21491:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;21529:7;-1:-1:-1::0;;;;;21522:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;21522:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;21453:94;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21439:4;:109;;;;;;;;;;;;:::i;:::-;;21612:7;-1:-1:-1::0;;;;;21605:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;21605:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;21643:7;-1:-1:-1::0;;;;;21636:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;21636:24:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;21579:82;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21563:6;:99;;;;;;;;;;;;:::i;:::-;;21157:517;21709:7;-1:-1:-1::0;;;;;21702:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21698:30;::::0;:2:::1;:30;:::i;:::-;21686:9;:42;;;;21762:7;-1:-1:-1::0;;;;;21755:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21751:30;::::0;:2:::1;:30;:::i;:::-;21739:9;:42:::0;-1:-1:-1;;21812:34:0::1;::::0;;::::1;::::0;::::1;::::0;;21824:15:::1;21812:34:::0;;-1:-1:-1;21812:34:0::1;::::0;::::1;::::0;;;;;;;;;21794:12:::1;:53:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;;13886:102:0;;;;13937:5;13921:21;;-1:-1:-1;;13921:21:0;;;13962:14;;-1:-1:-1;5029:36:1;;13962:14:0;;5017:2:1;5002:18;13962:14:0;;;;;;;13886:102;13497:498;20774:1081::o;31411:1209::-;20669:7;;31460:12;;;;20669:7;;20668:8;20660:35;;;;-1:-1:-1;;;20660:35:0;;;;;;;:::i;:::-;20706:7;:14;;-1:-1:-1;;20706:14:0;20716:4;20706:14;;;31535:8:::1;::::0;31545::::1;::::0;31603:6:::1;::::0;31611::::1;::::0;31646:40:::1;::::0;-1:-1:-1;;;31646:40:0;;31680:4:::1;31646:40;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;31603:6:0;;::::1;::::0;31611;;::::1;::::0;-1:-1:-1;;31603:6:0;;31646:25:::1;::::0;2624:18:1;;31646:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31714;::::0;-1:-1:-1;;;31714:40:0;;31748:4:::1;31714:40;::::0;::::1;2651:51:1::0;31629:57:0;;-1:-1:-1;31697:14:0::1;::::0;-1:-1:-1;;;;;31714:25:0;::::1;::::0;::::1;::::0;2624:18:1;;31714:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31801:4;31765:15;31783:24:::0;;;:9:::1;:24;::::0;;;;;31840:11:::1;::::0;31697:57;;-1:-1:-1;31783:24:0;31840:11;31950:22:::1;31963:9:::0;31783:24;31950:22:::1;:::i;:::-;:37;;;;:::i;:::-;31940:47:::0;-1:-1:-1;32081:12:0;32056:22:::1;32069:9:::0;32056:10;:22:::1;:::i;:::-;:37;;;;:::i;:::-;32046:47;;32170:1;32160:7;:11;:26;;;;;32185:1;32175:7;:11;32160:26;32152:42;;;::::0;-1:-1:-1;;;32152:42:0;;20926:2:1;32152:42:0::1;::::0;::::1;20908:21:1::0;20965:1;20945:18;;;20938:29;-1:-1:-1;;;20983:18:1;;;20976:33;21026:18;;32152:42:0::1;20724:326:1::0;32152:42:0::1;32244:32;32258:4;32265:10;32244:5;:32::i;:::-;32287:35;32301:7;32310:2;32314:7;32287:13;:35::i;:::-;32333;32347:7;32356:2;32360:7;32333:13;:35::i;:::-;32391:40;::::0;-1:-1:-1;;;32391:40:0;;32425:4:::1;32391:40;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;32391:25:0;::::1;::::0;::::1;::::0;2624:18:1;;32391:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32454;::::0;-1:-1:-1;;;32454:40:0;;32488:4:::1;32454:40;::::0;::::1;2651:51:1::0;32379:52:0;;-1:-1:-1;;;;;;32454:25:0;::::1;::::0;::::1;::::0;2624:18:1;;32454:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32442:52;;32507:51;32515:9;32526;32537;32548;32507:7;:51::i;:::-;32574:38;::::0;;6316:25:1;;;6372:2;6357:18;;6350:34;;;-1:-1:-1;;;;;32574:38:0;::::1;::::0;32579:10:::1;::::0;32574:38:::1;::::0;6289:18:1;32574:38:0::1;;;;;;;-1:-1:-1::0;;20743:7:0;:15;;-1:-1:-1;;20743:15:0;;;-1:-1:-1;31411:1209:0;;;;-1:-1:-1;31411:1209:0;;-1:-1:-1;;;;;31411:1209:0:o;21974:129::-;22022:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;22022:18:0;22060:12;22073:19;;:21;;22093:1;;22073:21;:::i;:::-;22060:35;;;;;;;;:::i;:::-;;;;;;;;;;;22053:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21974:129;:::o;17698:20::-;;;;;;;:::i;28328:396::-;28416:14;28443:22;28468:41;28475:7;28484:8;28494:11;28507:1;28468:6;:41::i;:::-;28443:66;-1:-1:-1;28520:27:0;;28558:105;28579:7;:14;28575:1;:18;28558:105;;;28641:7;28649:1;28641:10;;;;;;;;:::i;:::-;;;;;;;28615:36;;;;;:::i;:::-;;-1:-1:-1;28595:3:0;;;;:::i;:::-;;;;28558:105;;;-1:-1:-1;28680:36:0;28705:11;28680:22;:36;:::i;:::-;28673:43;28328:396;-1:-1:-1;;;;;;28328:396:0:o;40187:149::-;40249:4;40266:40;40282:10;40294:3;40299:6;40266:15;:40::i;:::-;-1:-1:-1;40324:4:0;40187:149;;;;:::o;35293:296::-;20669:7;;;;20668:8;20660:35;;;;-1:-1:-1;;;20660:35:0;;;;;;;:::i;:::-;20706:7;:14;;-1:-1:-1;;20706:14:0;20716:4;20706:14;;;35382:6:::1;::::0;35390::::1;::::0;35479:8:::1;::::0;35435:40:::1;::::0;-1:-1:-1;;;35435:40:0;;35469:4:::1;35435:40;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;35382:6:0;;::::1;::::0;35390;;::::1;::::0;35408:81:::1;::::0;35382:6;;35431:2;;35479:8;35382:6;;35435:25:::1;::::0;2624:18:1;;35435:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;35408:13;:81::i;:::-;35571:8;::::0;35527:40:::1;::::0;-1:-1:-1;;;35527:40:0;;35561:4:::1;35527:40;::::0;::::1;2651:51:1::0;35500:81:0::1;::::0;35514:7;;35523:2;;35571:8;-1:-1:-1;;;;;35527:25:0;::::1;::::0;::::1;::::0;2624:18:1;;35527:40:0::1;2505:203:1::0;35500:81:0::1;-1:-1:-1::0;;20743:7:0;:15;;-1:-1:-1;;20743:15:0;;;-1:-1:-1;35293:296:0:o;22528:487::-;22567:13;22582;22608:22;22619:10;22608;:22::i;:::-;-1:-1:-1;;22665:10:0;22654:22;;;;:10;:22;;;;;;;;;22698:10;:22;;;;;;;22737:12;;;;:28;;;22764:1;22753:8;:12;22737:28;22733:275;;;22793:10;22807:1;22782:22;;;:10;:22;;;;;;;;:26;;;22823:10;:22;;;;;;:26;;;;22875:4;;22866:59;;-1:-1:-1;;;22866:59:0;;;;;21397:51:1;;;;21464:18;;;21457:34;;;21507:18;;;21500:34;;;-1:-1:-1;;;;;22875:4:0;;22866:27;;21370:18:1;;22866:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22947:49:0;;;6316:25:1;;;6372:2;6357:18;;6350:34;;;22965:10:0;;-1:-1:-1;22965:10:0;;-1:-1:-1;22947:49:0;;6289:18:1;22947:49:0;;;;;;;22733:275;22528:487;;:::o;39115:1064::-;39261:15;39249:8;:27;;39241:53;;;;-1:-1:-1;;;39241:53:0;;21747:2:1;39241:53:0;;;21729:21:1;21786:2;21766:18;;;21759:30;-1:-1:-1;;;21805:18:1;;;21798:43;21858:18;;39241:53:0;21545:337:1;39241:53:0;39377:95;39507:4;39491:22;;;;;;:::i;:::-;;;;;;;;;;39542:10;;;;;;;;-1:-1:-1;;;39542:10:0;;;;;39348:284;;;;;23384:25:1;;;;23425:18;;23418:34;;;;39532:21:0;23468:18:1;;;23461:34;39572:13:0;23511:18:1;;;23504:34;39612:4:0;23554:19:1;;;23547:61;23356:19;;39348:284:0;;;-1:-1:-1;;39348:284:0;;;;;;;;;39324:319;;39348:284;39324:319;;;;39305:16;:338;;;-1:-1:-1;;;;;39855:13:0;;39654:14;39855:13;;;:6;:13;;;;;;:15;;18304:66;;39832:5;;39839:7;;39848:5;;39855:15;39654:14;39855:15;;;:::i;:::-;;;;-1:-1:-1;39804:77:0;;;;;;23906:25:1;;;;-1:-1:-1;;;;;24005:15:1;;;23985:18;;;23978:43;24057:15;;;;24037:18;;;24030:43;24089:18;;;24082:34;24132:19;;;24125:35;24176:19;;;24169:35;;;23878:19;;39804:77:0;;;;;;;;;;;;39794:88;;;;;;39695:202;;;;;;;;-1:-1:-1;;;24473:27:1;;24525:1;24516:11;;24509:27;;;;24561:2;24552:12;;24545:28;24598:2;24589:12;;24215:392;39695:202:0;;;;-1:-1:-1;;39695:202:0;;;;;;;;;39671:237;;39695:202;39671:237;;;;39919:24;39946:26;;;;;;;;;24839:25:1;;;24912:4;24900:17;;24880:18;;;24873:45;;;;24934:18;;;24927:34;;;24977:18;;;24970:34;;;39671:237:0;;-1:-1:-1;39919:24:0;39946:26;;24811:19:1;;39946:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39946:26:0;;-1:-1:-1;;39946:26:0;;;-1:-1:-1;;;;;;;39991:30:0;;;;;;:59;;;40045:5;-1:-1:-1;;;;;40025:25:0;:16;-1:-1:-1;;;;;40025:25:0;;39991:59;39983:95;;;;-1:-1:-1;;;39983:95:0;;25217:2:1;39983:95:0;;;25199:21:1;25256:2;25236:18;;;25229:30;25295:25;25275:18;;;25268:53;25338:18;;39983:95:0;25015:347:1;39983:95:0;-1:-1:-1;;;;;40089:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;40140:31;;3953:25:1;;;40140:31:0;;3926:18:1;40140:31:0;;;;;;;39230:949;;39115:1064;;;;;;;:::o;36784:342::-;36914:8;;36924;;36980:7;;36996:6;;36967:36;;-1:-1:-1;;;36967:36:0;;36996:6;;;;2478:14:1;2471:22;36967:36:0;;;2453:41:1;36861:4:0;;36914:8;36924;37006:5;;-1:-1:-1;;;;;36980:7:0;;;;36967:28;;2426:18:1;;36967:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36956:47;;:8;:47;:::i;:::-;:55;;;;:::i;:::-;36944:67;;;;:::i;:::-;;;37064:54;37078:8;37088:7;37097:9;37108;37064:13;:54::i;:::-;37057:61;36784:342;-1:-1:-1;;;;;36784:342:0:o;35644:158::-;20669:7;;;;20668:8;20660:35;;;;-1:-1:-1;;;20660:35:0;;;;;;;:::i;:::-;20706:7;:14;;-1:-1:-1;;20706:14:0;20716:4;20706:14;;;35700:6:::1;::::0;35693:39:::1;::::0;-1:-1:-1;;;35693:39:0;;35726:4:::1;35693:39;::::0;::::1;2651:51:1::0;35685:109:0::1;::::0;-1:-1:-1;;;;;35700:6:0::1;::::0;35693:24:::1;::::0;2624:18:1;;35693:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35741:6;::::0;35734:39:::1;::::0;-1:-1:-1;;;35734:39:0;;35767:4:::1;35734:39;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;35741:6:0;;::::1;::::0;35734:24:::1;::::0;2624:18:1;;35734:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35775:8;;35785;;35685:7;:109::i;:::-;20743:7:::0;:15;;-1:-1:-1;;20743:15:0;;;35644:158::o;41182:364::-;41293:1;41273:5;-1:-1:-1;;;;;41273:17:0;;:21;41265:53;;;;-1:-1:-1;;;41265:53:0;;25569:2:1;41265:53:0;;;25551:21:1;25608:2;25588:18;;;25581:30;-1:-1:-1;;;25627:18:1;;;25620:49;25686:18;;41265:53:0;25367:343:1;41265:53:0;41376:59;;;-1:-1:-1;;;;;25907:32:1;;;41376:59:0;;;25889:51:1;25956:18;;;;25949:34;;;41376:59:0;;;;;;;;;;25862:18:1;;;;41376:59:0;;;;;;;-1:-1:-1;;;;;41376:59:0;-1:-1:-1;;;41376:59:0;;;41365:71;;-1:-1:-1;;;;41365:10:0;;;;:71;;41376:59;41365:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41329:107;;;;41455:7;:57;;;;-1:-1:-1;41467:11:0;;:16;;:44;;;41498:4;41487:24;;;;;;;;;;;;:::i;:::-;41447:91;;;;-1:-1:-1;;;41447:91:0;;26475:2:1;41447:91:0;;;26457:21:1;26514:2;26494:18;;;26487:30;-1:-1:-1;;;26533:18:1;;;26526:51;26594:18;;41447:91:0;26273:345:1;41447:91:0;41254:292;;41182:364;;;:::o;23059:341::-;23124:6;;23132:4;;23110:35;;-1:-1:-1;;;;;23124:6:0;;;;23132:4;23138:6;23110:13;:35::i;:::-;23226:11;;23193:14;;23210:13;:6;23219:4;23210:13;:::i;:::-;:27;;;;:::i;:::-;23193:44;-1:-1:-1;23295:10:0;;23291:59;;23332:6;23322;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;23291:59:0;23365:27;;;6316:25:1;;;23390:1:0;6372:2:1;6357:18;;6350:34;23370:10:0;;23365:27;;6289:18:1;23365:27:0;;;;;;;;23099:301;23059:341;:::o;23444:261::-;23509:6;;23517:4;;23495:35;;-1:-1:-1;;;;;23509:6:0;;;;23517:4;23523:6;23495:13;:35::i;:::-;23574:11;;23541:14;;23558:13;:6;23567:4;23558:13;:::i;:::-;:27;;;;:::i;:::-;23541:44;-1:-1:-1;23600:10:0;;23596:59;;23637:6;23627;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;23596:59:0;23670:27;;;23687:1;6316:25:1;;6372:2;6357:18;;6350:34;;;23675:10:0;;23670:27;;6289:18:1;23670:27:0;6142:248:1;38026:401:0;38098:6;;38077:4;;38098:6;;38094:326;;;38142:9;;38121:7;;38131:8;:1;38135:4;38131:8;:::i;:::-;:20;;;;:::i;:::-;38121:30;;38166:7;38187:9;;38176:1;38180:4;38176:8;;;;:::i;:::-;:20;;;;:::i;:::-;38166:30;-1:-1:-1;38211:7:0;38233:4;38222:7;38166:30;38222:2;:7;:::i;:::-;38221:16;;;;:::i;:::-;38211:26;-1:-1:-1;38252:7:0;38294:4;38283:7;38288:2;;38283:7;:::i;:::-;38282:16;;;;:::i;:::-;38275:4;38264:7;38269:2;;38264:7;:::i;:::-;38263:16;;;;:::i;:::-;:35;;;;:::i;:::-;38252:47;-1:-1:-1;38331:4:0;38321:7;38252:47;38321:2;:7;:::i;:::-;:14;;;;:::i;:::-;38314:21;;;;;;;;38094:326;38392:5;38396:1;38392;:5;:::i;:::-;38385:12;;;;25540:965;25723:18;;25661:15;;25639:19;;25706:35;;25661:15;25706:35;:::i;:::-;25687:54;;25793:1;25779:11;:15;:33;;;;-1:-1:-1;25798:14:0;;;25779:33;:51;;;;-1:-1:-1;25816:14:0;;;25779:51;25775:197;;;25873:23;25885:11;25873:9;:23;:::i;:::-;25847:22;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;25937:23:0;;-1:-1:-1;25949:11:0;25937:9;:23;:::i;:::-;25911:22;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;25775:197:0;25984:25;26012:17;:15;:17::i;:::-;26071:16;;25984:45;;-1:-1:-1;26054:33:0;;:14;:33;:::i;:::-;26040:47;;18894:4;26205:11;:24;26201:151;;;26264:75;;;;;;;;;;;26292:22;;26264:75;;;;;;26316:22;;26264:75;;;;;;26246:12;:94;;;;;;;-1:-1:-1;26246:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26201:151;26362:8;:19;;;26392:8;:19;;;26422:18;:35;;;26473:24;;;6316:25:1;;;6372:2;6357:18;;6350:34;;;26473:24:0;;6289:18:1;26473:24:0;;;;;;;25628:877;;;25540:965;;;;:::o;37134:884::-;37265:6;;37244:4;;37265:6;;37261:750;;;37288:7;37299:24;37302:9;37313;37299:2;:24::i;:::-;37369:9;;37288:35;;-1:-1:-1;37350:16:0;:9;37362:4;37350:16;:::i;:::-;:28;;;;:::i;:::-;37424:9;;37338:40;;-1:-1:-1;37405:16:0;:9;37417:4;37405:16;:::i;:::-;:28;;;;:::i;:::-;37492:6;;37393:40;;-1:-1:-1;37449:13:0;;;;-1:-1:-1;;;;;37481:17:0;;;37492:6;;37481:17;:67;;37527:9;37538;37481:67;;;37502:9;37513;37481:67;37585:6;;37448:100;;-1:-1:-1;37448:100:0;-1:-1:-1;;;;;;37574:17:0;;;37585:6;;37574:17;:77;;37642:9;;37624:15;:8;37635:4;37624:15;:::i;:::-;:27;;;;:::i;:::-;37574:77;;;37612:9;;37594:15;:8;37605:4;37594:15;:::i;:::-;:27;;;;:::i;:::-;37563:88;-1:-1:-1;37666:6:0;37686:39;37693:17;37702:8;37563:88;37693:17;:::i;:::-;37712:2;37716:8;37686:6;:39::i;:::-;37675:50;;:8;:50;:::i;:::-;37763:6;;37666:59;;-1:-1:-1;37797:4:0;;-1:-1:-1;;;;;37752:17:0;;;37763:6;;37752:17;:41;;37784:9;;37752:41;;;37772:9;;37752:41;37747:47;;:1;:47;:::i;:::-;:54;;;;:::i;:::-;37740:61;;;;;;;;37261:750;37878:6;;37835:13;;;;-1:-1:-1;;;;;37867:17:0;;;37878:6;;37867:17;:67;;37913:9;37924;37867:67;;;37888:9;37899;37867:67;37834:100;;-1:-1:-1;37834:100:0;-1:-1:-1;37979:19:0;37990:8;37834:100;37979:19;:::i;:::-;37956;37967:8;37956;:19;:::i;:::-;:43;;;;:::i;:::-;37949:50;;;;;;40863:311;40947:15;40958:3;40947:10;:15::i;:::-;41004;41015:3;41004:10;:15::i;:::-;-1:-1:-1;;;;;41063:14:0;;;;;;:9;:14;;;;;:24;;41081:6;;41063:14;:24;;41081:6;;41063:24;:::i;:::-;;;;-1:-1:-1;;;;;;;41098:14:0;;;;;;:9;:14;;;;;:24;;41116:6;;41098:14;:24;;41116:6;;41098:24;:::i;:::-;;;;;;;;41154:3;-1:-1:-1;;;;;41140:26:0;41149:3;-1:-1:-1;;;;;41140:26:0;;41159:6;41140:26;;;;3953:25:1;;3941:2;3926:18;;3807:177;41140:26:0;;;;;;;;40863:311;;;:::o;2038:303::-;2083:6;2110:1;2106;:5;2102:232;;;-1:-1:-1;2132:1:0;2148:6;2157:5;2161:1;2132;2157:5;:::i;:::-;:9;;2165:1;2157:9;:::i;:::-;2148:18;;2181:92;2192:1;2188;:5;2181:92;;;2218:1;-1:-1:-1;2218:1:0;2256;2218;2243:5;2218:1;2243;:5;:::i;:::-;:9;;;;:::i;:::-;2242:15;;;;:::i;:::-;2238:19;;2181:92;;;2113:171;2038:303;;;:::o;2102:232::-;2294:6;;2290:44;;-1:-1:-1;2321:1:0;2290:44;2038:303;;;:::o;38435:250::-;38496:15;38507:3;38496:10;:15::i;:::-;38587:6;38572:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;38604:14:0;;;;;;:9;:14;;;;;:24;;38622:6;;38604:14;:24;;38622:6;;38604:24;:::i;:::-;;;;-1:-1:-1;;38644:33:0;;3953:25:1;;;-1:-1:-1;;;;;38644:33:0;;;38661:1;;38644:33;;3941:2:1;3926:18;38644:33:0;;;;;;;;38435:250;;:::o;1935:97::-;1987:4;2015:1;2011;:5;:13;;2023:1;2011:13;;;-1:-1:-1;2019:1:0;;2004:20;-1:-1:-1;1935:97:0:o;38693:200::-;38754:15;38765:3;38754:10;:15::i;:::-;38795:6;38780:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;38812:14:0;;;;;;:9;:14;;;;;:24;;38830:6;;38812:14;:24;;38830:6;;38812:24;:::i;:::-;;;;-1:-1:-1;;38852:33:0;;3953:25:1;;;38874:1:0;;-1:-1:-1;;;;;38852:33:0;;;;;3941:2:1;3926:18;38852:33:0;3807:177:1;23932:1286:0;-1:-1:-1;;;;;24008:20:0;;23991:14;24008:20;;;:9;:20;;;;;;24076:13;;24072:1139;;-1:-1:-1;;;;;24127:23:0;;24106:18;24127:23;;;:12;:23;;;;;;;;;;24228:12;:23;;;;;;;;24281:6;;24359;;24380:33;;;;24479:23;;;;:33;;;24127:23;24542;24127;24281:6;24542:23;:::i;:::-;24527:38;-1:-1:-1;24638:12:0;24653:23;24663:13;24653:7;:23;:::i;:::-;24638:38;-1:-1:-1;24695:11:0;;24691:192;;24727:11;24763:4;24741:19;24753:7;24741:9;:19;:::i;:::-;:26;;;;:::i;:::-;-1:-1:-1;;;;;24836:21:0;;;;;;:10;:21;;;;;:31;;24727:40;;-1:-1:-1;24727:40:0;;24836:21;;;:31;;24727:40;;24836:31;:::i;:::-;;;;-1:-1:-1;;;24691:192:0;24901:11;;24897:142;;24933:11;24969:4;24947:19;24959:7;24947:9;:19;:::i;:::-;:26;;;;:::i;:::-;-1:-1:-1;;;;;24992:21:0;;;;;;:10;:21;;;;;:31;;24933:40;;-1:-1:-1;24933:40:0;;24992:21;;;:31;;24933:40;;24992:31;:::i;:::-;;;;-1:-1:-1;;;24897:142:0;24091:959;;;;;;23980:1238;23932:1286;:::o;24072:1139::-;25097:6;;-1:-1:-1;;;;;25071:23:0;;;;;;:12;:23;;;;;;;;:32;;;;25193:6;;25167:12;:23;;;;;;:32;23980:1238;23932:1286;:::o;36088:688::-;36153:4;;36170:580;36191:3;36187:1;:7;36170:580;;;36230:1;36216:11;36255:9;36258:2;36230:1;36255:2;:9::i;:::-;36246:18;;36287:2;36283:1;:6;36279:212;;;36310:7;36334:9;36337:2;36341:1;36334:2;:9::i;:::-;36321:6;36326:1;36321:2;:6;:::i;:::-;36320:13;;36329:4;36320:13;:::i;:::-;:23;;;;:::i;:::-;36310:33;-1:-1:-1;36366:6:0;36310:33;36366:1;:6;:::i;:::-;36362:10;;36291:97;36279:212;;;36413:7;36437:9;36440:2;36444:1;36437:2;:9::i;:::-;36424:6;36428:2;36424:1;:6;:::i;:::-;36423:13;;36432:4;36423:13;:::i;:::-;:23;;;;:::i;:::-;36413:33;-1:-1:-1;36469:6:0;36413:33;36469:1;:6;:::i;:::-;36465:10;;36394:97;36279:212;36513:6;36509:1;:10;36505:234;;;36558:1;36544:10;36548:6;36544:1;:10;:::i;:::-;:15;36540:72;;36591:1;36584:8;;;;;;;36540:72;36505:234;;;36670:1;36656:10;36665:1;36656:6;:10;:::i;:::-;:15;36652:72;;36703:1;36696:8;;;;;;;36652:72;36201:549;;36196:3;;;;;:::i;:::-;;;;36170:580;;;-1:-1:-1;36767:1:0;;36088:688;-1:-1:-1;;;36088:688:0:o;35810:137::-;35862:4;35935;35933:1;35935:4;35924:2;35935:4;35913:5;35924:2;;35913:5;:::i;:::-;:10;;;;:::i;:::-;:13;;;;:::i;:::-;:18;;;;:::i;:::-;35912:22;;;;:::i;:::-;:27;;;;:::i;:::-;35907:4;;35899:1;35907:4;35890:3;35899:1;;35890:3;:::i;:::-;:8;;;;:::i;:::-;:10;;;;:::i;:::-;:15;;;;:::i;:::-;35886:20;;:2;:20;:::i;:::-;:25;;;;:::i;:::-;:53;;;;:::i;35955:125::-;36007:4;36067;36064:2;36067:4;36053:5;36064:2;;36053:5;:::i;:::-;:10;;;;:::i;:::-;:13;;;;:::i;:::-;:18;;;;:::i;:::-;36047:4;;36037:3;36039:1;;36037:3;:::i;:::-;:8;;;;:::i;:::-;36031:4;36033:2;36031:1;:4;:::i;:::-;:15;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:863;247:6;255;263;271;279;332:3;320:9;311:7;307:23;303:33;300:53;;;349:1;346;339:12;300:53;385:9;372:23;362:33;;442:2;431:9;427:18;414:32;404:42;;496:2;485:9;481:18;468:32;509:31;534:5;509:31;:::i;:::-;559:5;-1:-1:-1;615:2:1;600:18;;587:32;638:18;668:14;;;665:34;;;695:1;692;685:12;665:34;733:6;722:9;718:22;708:32;;778:7;771:4;767:2;763:13;759:27;749:55;;800:1;797;790:12;749:55;840:2;827:16;866:2;858:6;855:14;852:34;;;882:1;879;872:12;852:34;927:7;922:2;913:6;909:2;905:15;901:24;898:37;895:57;;;948:1;945;938:12;895:57;150:863;;;;-1:-1:-1;150:863:1;;-1:-1:-1;979:2:1;971:11;;1001:6;150:863;-1:-1:-1;;;150:863:1:o;1018:258::-;1090:1;1100:113;1114:6;1111:1;1108:13;1100:113;;;1190:11;;;1184:18;1171:11;;;1164:39;1136:2;1129:10;1100:113;;;1231:6;1228:1;1225:13;1222:48;;;1266:1;1257:6;1252:3;1248:16;1241:27;1222:48;;1018:258;;;:::o;1281:383::-;1430:2;1419:9;1412:21;1393:4;1462:6;1456:13;1505:6;1500:2;1489:9;1485:18;1478:34;1521:66;1580:6;1575:2;1564:9;1560:18;1555:2;1547:6;1543:15;1521:66;:::i;:::-;1648:2;1627:15;-1:-1:-1;;1623:29:1;1608:45;;;;1655:2;1604:54;;1281:383;-1:-1:-1;;1281:383:1:o;1993:315::-;2061:6;2069;2122:2;2110:9;2101:7;2097:23;2093:32;2090:52;;;2138:1;2135;2128:12;2090:52;2177:9;2164:23;2196:31;2221:5;2196:31;:::i;:::-;2246:5;2298:2;2283:18;;;;2270:32;;-1:-1:-1;;;1993:315:1:o;2713:452::-;2799:6;2807;2815;2823;2876:3;2864:9;2855:7;2851:23;2847:33;2844:53;;;2893:1;2890;2883:12;2844:53;2932:9;2919:23;2951:31;2976:5;2951:31;:::i;:::-;3001:5;3053:2;3038:18;;3025:32;;-1:-1:-1;3104:2:1;3089:18;;3076:32;;3155:2;3140:18;3127:32;;-1:-1:-1;2713:452:1;-1:-1:-1;;;2713:452:1:o;3170:632::-;3341:2;3393:21;;;3463:13;;3366:18;;;3485:22;;;3312:4;;3341:2;3564:15;;;;3538:2;3523:18;;;3312:4;3607:169;3621:6;3618:1;3615:13;3607:169;;;3682:13;;3670:26;;3751:15;;;;3716:12;;;;3643:1;3636:9;3607:169;;;-1:-1:-1;3793:3:1;;3170:632;-1:-1:-1;;;;;;3170:632:1:o;3989:247::-;4048:6;4101:2;4089:9;4080:7;4076:23;4072:32;4069:52;;;4117:1;4114;4107:12;4069:52;4156:9;4143:23;4175:31;4200:5;4175:31;:::i;4241:456::-;4318:6;4326;4334;4387:2;4375:9;4366:7;4362:23;4358:32;4355:52;;;4403:1;4400;4393:12;4355:52;4442:9;4429:23;4461:31;4486:5;4461:31;:::i;:::-;4511:5;-1:-1:-1;4568:2:1;4553:18;;4540:32;4581:33;4540:32;4581:33;:::i;:::-;4241:456;;4633:7;;-1:-1:-1;;;4687:2:1;4672:18;;;;4659:32;;4241:456::o;4702:180::-;4761:6;4814:2;4802:9;4793:7;4789:23;4785:32;4782:52;;;4830:1;4827;4820:12;4782:52;-1:-1:-1;4853:23:1;;4702:180;-1:-1:-1;4702:180:1:o;5754:383::-;5831:6;5839;5847;5900:2;5888:9;5879:7;5875:23;5871:32;5868:52;;;5916:1;5913;5906:12;5868:52;5955:9;5942:23;5974:31;5999:5;5974:31;:::i;:::-;6024:5;6076:2;6061:18;;6048:32;;-1:-1:-1;6127:2:1;6112:18;;;6099:32;;5754:383;-1:-1:-1;;;5754:383:1:o;7075:114::-;7159:4;7152:5;7148:16;7141:5;7138:27;7128:55;;7179:1;7176;7169:12;7194:801;7305:6;7313;7321;7329;7337;7345;7353;7406:3;7394:9;7385:7;7381:23;7377:33;7374:53;;;7423:1;7420;7413:12;7374:53;7462:9;7449:23;7481:31;7506:5;7481:31;:::i;:::-;7531:5;-1:-1:-1;7588:2:1;7573:18;;7560:32;7601:33;7560:32;7601:33;:::i;:::-;7653:7;-1:-1:-1;7707:2:1;7692:18;;7679:32;;-1:-1:-1;7758:2:1;7743:18;;7730:32;;-1:-1:-1;7814:3:1;7799:19;;7786:33;7828:31;7786:33;7828:31;:::i;:::-;7194:801;;;;-1:-1:-1;7194:801:1;;;;7878:7;7932:3;7917:19;;7904:33;;-1:-1:-1;7984:3:1;7969:19;;;7956:33;;7194:801;-1:-1:-1;;7194:801:1:o;8000:388::-;8068:6;8076;8129:2;8117:9;8108:7;8104:23;8100:32;8097:52;;;8145:1;8142;8135:12;8097:52;8184:9;8171:23;8203:31;8228:5;8203:31;:::i;:::-;8253:5;-1:-1:-1;8310:2:1;8295:18;;8282:32;8323:33;8282:32;8323:33;:::i;:::-;8375:7;8365:17;;;8000:388;;;;;:::o;8393:315::-;8461:6;8469;8522:2;8510:9;8501:7;8497:23;8493:32;8490:52;;;8538:1;8535;8528:12;8490:52;8574:9;8561:23;8551:33;;8634:2;8623:9;8619:18;8606:32;8647:31;8672:5;8647:31;:::i;8713:338::-;8915:2;8897:21;;;8954:2;8934:18;;;8927:30;-1:-1:-1;;;8988:2:1;8973:18;;8966:44;9042:2;9027:18;;8713:338::o;9056:164::-;9132:13;;9181;;9174:21;9164:32;;9154:60;;9210:1;9207;9200:12;9225:202;9292:6;9345:2;9333:9;9324:7;9320:23;9316:32;9313:52;;;9361:1;9358;9351:12;9313:52;9384:37;9411:9;9384:37;:::i;10423:632::-;10693:1;10689;10684:3;10680:11;10676:19;10668:6;10664:32;10653:9;10646:51;10733:6;10728:2;10717:9;10713:18;10706:34;10776:6;10771:2;10760:9;10756:18;10749:34;10819:3;10814:2;10803:9;10799:18;10792:31;10860:6;10854:3;10843:9;10839:19;10832:35;10918:6;10910;10904:3;10893:9;10889:19;10876:49;10975:1;10945:22;;;10969:3;10941:32;;;10934:43;;;;11038:2;11017:15;;;-1:-1:-1;;11013:29:1;10998:45;10994:55;;10423:632;-1:-1:-1;;;;10423:632:1:o;11060:184::-;11130:6;11183:2;11171:9;11162:7;11158:23;11154:32;11151:52;;;11199:1;11196;11189:12;11151:52;-1:-1:-1;11222:16:1;;11060:184;-1:-1:-1;11060:184:1:o;11249:127::-;11310:10;11305:3;11301:20;11298:1;11291:31;11341:4;11338:1;11331:15;11365:4;11362:1;11355:15;11381:125;11421:4;11449:1;11446;11443:8;11440:34;;;11454:18;;:::i;:::-;-1:-1:-1;11491:9:1;;11381:125::o;11842:168::-;11882:7;11948:1;11944;11940:6;11936:14;11933:1;11930:21;11925:1;11918:9;11911:17;11907:45;11904:71;;;11955:18;;:::i;:::-;-1:-1:-1;11995:9:1;;11842:168::o;12015:217::-;12055:1;12081;12071:132;;12125:10;12120:3;12116:20;12113:1;12106:31;12160:4;12157:1;12150:15;12188:4;12185:1;12178:15;12071:132;-1:-1:-1;12217:9:1;;12015:217::o;12962:380::-;13041:1;13037:12;;;;13084;;;13105:61;;13159:4;13151:6;13147:17;13137:27;;13105:61;13212:2;13204:6;13201:14;13181:18;13178:38;13175:161;;;13258:10;13253:3;13249:20;13246:1;13239:31;13293:4;13290:1;13283:15;13321:4;13318:1;13311:15;13347:127;13408:10;13403:3;13399:20;13396:1;13389:31;13439:4;13436:1;13429:15;13463:4;13460:1;13453:15;13479:128;13519:3;13550:1;13546:6;13543:1;13540:13;13537:39;;;13556:18;;:::i;:::-;-1:-1:-1;13592:9:1;;13479:128::o;13612:127::-;13673:10;13668:3;13664:20;13661:1;13654:31;13704:4;13701:1;13694:15;13728:4;13725:1;13718:15;14490:464;14575:6;14583;14591;14644:2;14632:9;14623:7;14619:23;14615:32;14612:52;;;14660:1;14657;14650:12;14612:52;14692:9;14686:16;14711:31;14736:5;14711:31;:::i;:::-;14811:2;14796:18;;14790:25;14761:5;;-1:-1:-1;14824:33:1;14790:25;14824:33;:::i;:::-;14876:7;-1:-1:-1;14902:46:1;14944:2;14929:18;;14902:46;:::i;:::-;14892:56;;14490:464;;;;;:::o;14959:884::-;15039:6;15092:2;15080:9;15071:7;15067:23;15063:32;15060:52;;;15108:1;15105;15098:12;15060:52;15141:9;15135:16;15170:18;15211:2;15203:6;15200:14;15197:34;;;15227:1;15224;15217:12;15197:34;15265:6;15254:9;15250:22;15240:32;;15310:7;15303:4;15299:2;15295:13;15291:27;15281:55;;15332:1;15329;15322:12;15281:55;15361:2;15355:9;15383:2;15379;15376:10;15373:36;;;15389:18;;:::i;:::-;15464:2;15458:9;15432:2;15518:13;;-1:-1:-1;;15514:22:1;;;15538:2;15510:31;15506:40;15494:53;;;15562:18;;;15582:22;;;15559:46;15556:72;;;15608:18;;:::i;:::-;15648:10;15644:2;15637:22;15683:2;15675:6;15668:18;15723:7;15718:2;15713;15709;15705:11;15701:20;15698:33;15695:53;;;15744:1;15741;15734:12;15695:53;15757:55;15809:2;15804;15796:6;15792:15;15787:2;15783;15779:11;15757:55;:::i;:::-;15831:6;14959:884;-1:-1:-1;;;;;;;14959:884:1:o;15848:762::-;-1:-1:-1;;;16254:3:1;16247:30;16229:3;16306:6;16300:13;16322:62;16377:6;16372:2;16367:3;16363:12;16356:4;16348:6;16344:17;16322:62;:::i;:::-;-1:-1:-1;;;16443:2:1;16403:16;;;16435:11;;;16428:24;16477:13;;16499:63;16477:13;16548:2;16540:11;;16533:4;16521:17;;16499:63;:::i;:::-;16582:17;16601:2;16578:26;;15848:762;-1:-1:-1;;;;15848:762:1:o;16615:748::-;-1:-1:-1;;;17021:3:1;17014:20;16996:3;17063:6;17057:13;17079:61;17133:6;17129:1;17124:3;17120:11;17113:4;17105:6;17101:17;17079:61;:::i;:::-;-1:-1:-1;;;17199:1:1;17159:16;;;17191:10;;;17184:23;17232:13;;17254:62;17232:13;17303:1;17295:10;;17288:4;17276:17;;17254:62;:::i;:::-;17336:17;17355:1;17332:25;;16615:748;-1:-1:-1;;;;16615:748:1:o;17368:764::-;-1:-1:-1;;;17774:3:1;17767:32;17749:3;17828:6;17822:13;17844:62;17899:6;17894:2;17889:3;17885:12;17878:4;17870:6;17866:17;17844:62;:::i;:::-;-1:-1:-1;;;17965:2:1;17925:16;;;17957:11;;;17950:24;17999:13;;18021:63;17999:13;18070:2;18062:11;;18055:4;18043:17;;18021:63;:::i;:::-;18104:17;18123:2;18100:26;;17368:764;-1:-1:-1;;;;17368:764:1:o;18137:748::-;-1:-1:-1;;;18543:3:1;18536:20;18518:3;18585:6;18579:13;18601:61;18655:6;18651:1;18646:3;18642:11;18635:4;18627:6;18623:17;18601:61;:::i;18890:247::-;18958:6;19011:2;18999:9;18990:7;18986:23;18982:32;18979:52;;;19027:1;19024;19017:12;18979:52;19059:9;19053:16;19078:29;19101:5;19078:29;:::i;19142:422::-;19231:1;19274:5;19231:1;19288:270;19309:7;19299:8;19296:21;19288:270;;;19368:4;19364:1;19360:6;19356:17;19350:4;19347:27;19344:53;;;19377:18;;:::i;:::-;19427:7;19417:8;19413:22;19410:55;;;19447:16;;;;19410:55;19526:22;;;;19486:15;;;;19288:270;;;19292:3;19142:422;;;;;:::o;19569:806::-;19618:5;19648:8;19638:80;;-1:-1:-1;19689:1:1;19703:5;;19638:80;19737:4;19727:76;;-1:-1:-1;19774:1:1;19788:5;;19727:76;19819:4;19837:1;19832:59;;;;19905:1;19900:130;;;;19812:218;;19832:59;19862:1;19853:10;;19876:5;;;19900:130;19937:3;19927:8;19924:17;19921:43;;;19944:18;;:::i;:::-;-1:-1:-1;;20000:1:1;19986:16;;20015:5;;19812:218;;20114:2;20104:8;20101:16;20095:3;20089:4;20086:13;20082:36;20076:2;20066:8;20063:16;20058:2;20052:4;20049:12;20045:35;20042:77;20039:159;;;-1:-1:-1;20151:19:1;;;20183:5;;20039:159;20230:34;20255:8;20249:4;20230:34;:::i;:::-;20300:6;20296:1;20292:6;20288:19;20279:7;20276:32;20273:58;;;20311:18;;:::i;:::-;20349:20;;19569:806;-1:-1:-1;;;19569:806:1:o;20380:140::-;20438:5;20467:47;20508:4;20498:8;20494:19;20488:4;20467:47;:::i;21055:135::-;21094:3;-1:-1:-1;;21115:17:1;;21112:43;;;21135:18;;:::i;:::-;-1:-1:-1;21182:1:1;21171:13;;21055:135::o;22016:1104::-;22146:3;22175:1;22208:6;22202:13;22238:3;22260:1;22288:9;22284:2;22280:18;22270:28;;22348:2;22337:9;22333:18;22370;22360:61;;22414:4;22406:6;22402:17;22392:27;;22360:61;22440:2;22488;22480:6;22477:14;22457:18;22454:38;22451:165;;;-1:-1:-1;;;22515:33:1;;22571:4;22568:1;22561:15;22601:4;22522:3;22589:17;22451:165;22632:18;22659:104;;;;22777:1;22772:323;;;;22625:470;;22659:104;-1:-1:-1;;22692:24:1;;22680:37;;22737:16;;;;-1:-1:-1;22659:104:1;;22772:323;21963:1;21956:14;;;22000:4;21987:18;;22870:1;22884:165;22898:6;22895:1;22892:13;22884:165;;;22976:14;;22963:11;;;22956:35;23019:16;;;;22913:10;;22884:165;;;22888:3;;23078:6;23073:3;23069:16;23062:23;;22625:470;-1:-1:-1;23111:3:1;;22016:1104;-1:-1:-1;;;;;;;;22016:1104:1:o;25994:274::-;26123:3;26161:6;26155:13;26177:53;26223:6;26218:3;26211:4;26203:6;26199:17;26177:53;:::i;:::-;26246:16;;;;;25994:274;-1:-1:-1;;25994:274:1:o
Swarm Source
ipfs://300ad46cd9b0836e295ece4b3e2db09ecaddedc88e689d19694a8b21b628c7ea
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.