Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
Voter
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-26 */ /** *Submitted for verification at basescan.org on 2024-02-01 */ /**v3.0.4 *0xa8bc72582856b0d4939e30988773df882f849aa2 *Submitted for verification at basescan.org on 2023-10-04 */ /*v3.0.1 *0xf88005d839a2f14e6b4f14938bb3deb4521cff21 *Submitted for verification at basescan.org on 2023-09-23 */ /** *v2.0.2 *0x4556ad146b1e278d05b6fcd758e14a5e52949e32 *Submitted for verification at FtmScan.com on 2023-06-10 */ /** *v2.0.1 *0xbfbDE540AB95CD60C6a7A087ba48C68A57cf77c8 *Submitted for verification at FtmScan.com on 2023-05-17 */ /** *v2.0.0 *0x14a0b746803ec563be405942259969f9af985c20 *Submitted for verification at FtmScan.com on 2023-03-21 */ /** *v1.5.1 *0xEdFA7461bA8Eb8164E5625D75EE8Ea9839772F64 *Submitted for verification at FtmScan.com on 2023-03-18 */ /** *v1.5.0 *0x626ecdd835B508f1d9D156015490B6CcBC9E3e90 *Submitted for verification at FtmScan.com on 2023-03-17 */ /** *v1.4.4 *0xC45f2AFEb6E34488cf8987F0458Ab3f93C8D49BF *Submitted for verification at FtmScan.com on 2023-03-09 */ /** *v1.4.3 *0xDFf9bA0A6361EF588398aE5631B0055169e2F072 *Submitted for verification at FtmScan.com on 2023-03-09 */ /** *v1.4.2 *0xB99c82191Ee5Dc240bd2a77827413574075ed2F6 *Submitted for verification at FtmScan.com on 2023-03-06 */ /** *v1.4.1 *0xFE363d3DE8a0beA47cC7d7f5c096D3852AdbC396 *Submitted for verification at FtmScan.com on 2023-02-22 */ /** *v1.3.10 *0x2f2c3a2ee4f63640a044e8a7fd01102c7aaf5186 *Submitted for verification at FtmScan.com on 2023-02-12 */ /** *v1.3.9 *0x81377455214496CA22d9658eFAEFddd83775Aac3 *Submitted for verification at FtmScan.com on 2023-02-11 */ /** *v1.3.7 *0x0A6e8D4d8685F80374FD88f08AbbCA5F5DdE9D4F *Submitted for verification at FtmScan.com on 2023-01-29 */ /** *v1.3.5 *0xb333bb146b29d6caa078905f551679137aabd0c5 *Submitted for verification at FtmScan.com on 2023-01-18 */ /** *v1.3.1 *0x225d1e237b8089734fb15C1C206BbB98415d4B46 *Submitted for verification at FtmScan.com on 2023-01-03 */ /** *v1.3.0 *0x95797abf5988479138c783dbcc97db869b373bdb *Submitted for verification at FtmScan.com on 2022-12-26 */ /** *v1.2.0 *0x6bF6A6185afE3cc88707b0b6474F6AFceE59EFED *Submitted for verification at FtmScan.com on 2022-11-28 */ /**v1.1.0 *0xB171D9126d01E6DDb76Df8dd30e3A0C712f2cF5c *Submitted for verification at FtmScan.com on 2022-11-09 */ /** * EQUALIZER EXCHANGE * The New Liquidity Hub of Fantom chain! * https://equalizer.exchange (Dapp) * https://discord.gg/MaMhbgHMby (Community) * * * * Version: 3.0.0 * - _ensureOldDist(_gauge) * * Version: 1.5.0 * - Only `base` as initial `allowedRewards[]` * - Introduce concept of Gaugable * - Introduce concept of protocolFeesTaker * * Version: 1.4.4 * - createGaugeMulti * - LFG! * * * Contributors: * - Andre Cronje, Solidly.Exchange * - Velodrome.finance Team * - @smartcoding51 * - 543#3017 (Sam), ftm.guru & Equalizer.exchange * * * SPDX-License-Identifier: UNLICENSED */ // File: contracts/interfaces/IVotingEscrow.sol pragma solidity 0.8.9; interface IVotingEscrow { struct Point { int128 bias; int128 slope; // # -dweight / dt uint256 ts; uint256 blk; // block } function token() external view returns (address); function team() external returns (address); function epoch() external view returns (uint); function point_history(uint loc) external view returns (Point memory); function user_point_history(uint tokenId, uint loc) external view returns (Point memory); function user_point_epoch(uint tokenId) external view returns (uint); function ownerOf(uint) external view returns (address); function isApprovedOrOwner(address, uint) external view returns (bool); function transferFrom(address, address, uint) external; function voting(uint tokenId) external; function abstain(uint tokenId) external; function attach(uint tokenId) external; function detach(uint tokenId) external; function checkpoint() external; function deposit_for(uint tokenId, uint value) external; function create_lock_for(uint, uint, address) external returns (uint); function balanceOfNFT(uint) external view returns (uint); function totalSupply() external view returns (uint); } // File: contracts/interfaces/IPairFactory.sol pragma solidity 0.8.9; interface IPairFactory { function isPaused() external view returns (bool); function token0() external view returns (address); function token1() external view returns (address); 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/IPair.sol pragma solidity 0.8.9; interface IPair { function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1); function claimFees() external returns (uint, uint); function tokens() external returns (address, address); function transferFrom(address src, address dst, uint amount) external returns (bool); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); function stable() external view returns (bool s); } // File: contracts/interfaces/IMinter.sol pragma solidity 0.8.9; interface IMinter { function update_period() external returns (uint); } // 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/interfaces/IGaugeFactory.sol pragma solidity 0.8.9; interface IGaugeFactory { function createGauge(address _p, address _b, address _v, bool _n, address[] memory _r) external returns (address); } // File: contracts/interfaces/IGauge.sol pragma solidity 0.8.9; interface IGauge { function notifyRewardAmount(address token, uint amount) external; function getReward(address account, address[] memory tokens) external; function claimFees() external returns (uint claimed0, uint claimed1); function left(address token) external view returns (uint); function isForPair() external view returns (bool); function setBribe(address _newbribe) external; } // File: contracts/interfaces/IBribeFactory.sol pragma solidity 0.8.9; interface IBribeFactory { function createBribe(address[] memory) external returns (address); } // File: contracts/interfaces/IBribe.sol pragma solidity 0.8.9; interface IBribe { function _deposit(uint amount, uint tokenId, address _vtr, address _onr) external; function _withdraw(uint amount, uint tokenId, address _vtr, address _onr) external; function getRewardForOwner(uint tokenId, address[] memory tokens) external; function notifyRewardAmount(address token, uint amount) external; function left(address token) external view returns (uint); } // 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/Voter.sol pragma solidity 0.8.9; contract Voter is Initializable { /// @dev rewards are released over 7 days uint public constant DURATION = 7 days; /// @dev the ve token that governs these contracts address public _ve; address public factory; // the PairFactory address public base; address public gaugefactory; address public bribefactory; address public minter; address public ms; // team-governor-council-treasury multi-sig address public governor; // should be set to an IGovernor /// @dev credibly neutral party similar to Curve's Emergency DAO address public emergencyCouncil; address public protocolFeesTaker; uint public protocolFeesPerMillion; uint public totalWeight; // total voting weight address[] public pools; // all pools viable for incentives mapping(address => address) public gauges; // pool => gauge mapping(address => address) public poolForGauge; // gauge => pool mapping(address => address) public bribes; // gauge => unified bribes mapping(address => uint256) public weights; // pool => weight mapping(uint => mapping(address => uint256)) public votes; // nft => pool => votes mapping(uint => address[]) public poolVote; // nft => pools mapping(uint => uint) public usedWeights; // nft => total voting weight of user mapping(uint => uint) public lastVoted; // nft => timestamp of last vote, to ensure one vote per epoch mapping(address => bool) public isGauge; mapping(address => bool) public isWhitelisted; mapping(address => bool) public isAlive; // killed implies no emission allocation bool internal _locked; /// @dev simple re-entrancy check uint public index; mapping(address => uint) public supplyIndex; mapping(address => uint) public claimable; mapping(address => bool) public unvotable; // disable voting for certain pools mapping(address => bool) public gaugable; // enable creation for pools with one of these constituents bool public pokable; // toggle poking ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////// DO NOT DELETE ANYTHING. DO NOT MOVE ANYTHING. ONLY APPEND TO THE TAIL! //////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// mapping(address => bool) public pausedGauges; mapping(address => address) public customGauges; // pool => customGauges mapping(uint256 => uint256) public voterTurnouts; // epochStart -> votes mapping(uint256 => mapping(address => uint256)) public voteResults; // epochStart -> pool -> votes mapping(address => uint256) public lastDistribution; // gauges -> dist.time mapping(uint256 => mapping(address => uint256)) public distributions; // epoch -> gauges -> notified ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////// DO NOT DELETE ANYTHING. DO NOT MOVE ANYTHING. ONLY APPEND TO THE TAIL! //////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// mapping(address=>bool) public isListingsManager; /********************************************************************************************/ /*****************************************NON-STORAGE****************************************/ /********************************************************************************************/ /// NON-STORAGE: Events event GaugeAndBribeCreated(address indexed pool, address gauge, address bribe, address indexed creator, address[] gaugeRewards, address[] allowedRewards); event GaugeKilled(address indexed gauge); event GaugeRevived(address indexed gauge); event Voted(address indexed pooladdr, address voter, address indexed tokenOwner, uint indexed tokenId, uint256 weight, uint256 ts); event Abstained(uint indexed tokenId, uint256 weight); event Deposit(address indexed lp, address indexed gauge, uint indexed tokenId, uint amount); event Withdraw(address indexed lp, address indexed gauge, uint indexed tokenId, uint amount); event NotifyReward(address indexed sender, address indexed reward, uint amount); event DistributeReward(address indexed sender, address indexed gauge, uint amount); event Attach(address indexed owner, address indexed gauge, uint indexed tokenId); event Detach(address indexed owner, address indexed gauge, uint indexed tokenId); event Whitelisted(address indexed whitelister, address indexed token, bool indexed status); event ListingsManagerSet(address indexed lister, bool indexed status); /// NON-STORAGE: Modifiers modifier lock() { require(!_locked, "No re-entrancy"); _locked = true; _; _locked = false; } /// NON-STORAGE: Functions function initialize( address __ve, address _factory, address _gauges, address _bribes ) public initializer { _ve = __ve; factory = _factory; base = IVotingEscrow(__ve).token(); gaugefactory = _gauges; bribefactory = _bribes; minter = msg.sender; governor = msg.sender; emergencyCouncil = msg.sender; protocolFeesTaker = msg.sender; ms = msg.sender; gaugable[base] = true; } modifier onlyNewEpoch(uint _tokenId) { // ensure new epoch since last vote require((block.timestamp / DURATION) * DURATION > lastVoted[_tokenId], "TOKEN_ALREADY_VOTED_THIS_EPOCH"); _; } function initialSetup(address[] memory _tokens, address[] memory _gaugables, address _minter) external { require(msg.sender == minter, "Not minter!"); for (uint i = 0; i < _tokens.length; i++) { _whitelist(_tokens[i]); } for (uint i = 0; i < _gaugables.length; i++) { gaugable[_gaugables[i]] = true; } minter = _minter; } function setGovernor(address _governor) public { require(msg.sender == governor, "Not governor!"); governor = _governor; } function setEmergencyCouncil(address _council) public { require(msg.sender == emergencyCouncil, "Not emergency council!"); emergencyCouncil = _council; } function setProtocolFeesTaker(address _pft) public { require(msg.sender == governor, "Not Protocol Fees Taker!"); protocolFeesTaker = _pft; } function setProtocolFeesPerMillion(uint _pf) public { require(msg.sender == governor, "Not governor!"); protocolFeesPerMillion = _pf; } function reset(uint _tokenId) external onlyNewEpoch(_tokenId) { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId), "Neither approved nor owner"); lastVoted[_tokenId] = block.timestamp; _reset(_tokenId); IVotingEscrow(_ve).abstain(_tokenId); } function resetOverride(uint[] memory _ids) external { for(uint i=0;i<_ids.length;i++) { resetOverride(_ids[i]); } } function resetOverride(uint _tokenId) public { require(msg.sender == governor, "Not governor"); _reset(_tokenId); IVotingEscrow(_ve).abstain(_tokenId); } function _reset(uint _tokenId) internal { address[] storage _poolVote = poolVote[_tokenId]; uint _poolVoteCnt = _poolVote.length; uint256 _totalWeight = 0; address _tokenOwner = IVotingEscrow(_ve).ownerOf(_tokenId); for (uint i = 0; i < _poolVoteCnt; i ++) { address _pool = _poolVote[i]; uint256 _votes = votes[_tokenId][_pool]; if (_votes != 0) { address _gauge = gauges[_pool]; _ensureOldDist(_gauge); _updateFor(_gauge); weights[_pool] -= _votes; votes[_tokenId][_pool] -= _votes; IBribe(bribes[_gauge])._withdraw(uint256(_votes), _tokenId, msg.sender, _tokenOwner); _totalWeight += _votes; emit Abstained(_tokenId, _votes); } } totalWeight -= uint256(_totalWeight); usedWeights[_tokenId] = 0; delete poolVote[_tokenId]; } function poke(uint _tokenId) external { /// Poke function was depreciated in v1.3.0 due to security reasons. /// Its still callable for backwards compatibility, but does nothing. /// Usage allowed by ms (Official Equălizer Team Multi-Sig) or Public when pokable. if(pokable || msg.sender == ms) { address[] memory _poolVote = poolVote[_tokenId]; uint _poolCnt = _poolVote.length; uint256[] memory _weights = new uint256[](_poolCnt); for (uint i = 0; i < _poolCnt; i ++) { _weights[i] = votes[_tokenId][_poolVote[i]]; } _vote(_tokenId, _poolVote, _weights); } /// else return; } function _vote(uint _tokenId, address[] memory _poolVote, uint256[] memory _weights) internal { ///v1.3.1 Emergency Upgrade ///Prevent voting for specific "unvotable" pools for(uint lol=0;lol<_poolVote.length;lol++) { require( ! unvotable[ _poolVote[lol] ], "This pool is unvotable!" ); require( isAlive[ gauges[_poolVote[lol] ] ] , "Cant vote for Killed Gauges!" ); } _reset(_tokenId); uint _poolCnt = _poolVote.length; uint256 _weight = IVotingEscrow(_ve).balanceOfNFT(_tokenId); uint256 _totalVoteWeight = 0; uint256 _totalWeight = 0; uint256 _usedWeight = 0; address _tokenOwner = IVotingEscrow(_ve).ownerOf(_tokenId); for (uint i = 0; i < _poolCnt; i++) { _totalVoteWeight += _weights[i]; } for (uint i = 0; i < _poolCnt; i++) { address _pool = _poolVote[i]; address _gauge = gauges[_pool]; if (isGauge[_gauge]) { uint256 _poolWeight = _weights[i] * _weight / _totalVoteWeight; require(votes[_tokenId][_pool] == 0); require(_poolWeight != 0); _ensureOldDist(_gauge); _updateFor(_gauge); poolVote[_tokenId].push(_pool); weights[_pool] += _poolWeight; votes[_tokenId][_pool] += _poolWeight; IBribe(bribes[_gauge])._deposit(uint256(_poolWeight), _tokenId, msg.sender, _tokenOwner); _usedWeight += _poolWeight; _totalWeight += _poolWeight; emit Voted(_pool, msg.sender, _tokenOwner, _tokenId, _poolWeight, block.timestamp); voteResults[ (block.timestamp / DURATION) * DURATION ][ _poolVote[i] ] += _poolWeight; } } if (_usedWeight > 0) IVotingEscrow(_ve).voting(_tokenId); totalWeight += uint256(_totalWeight); usedWeights[_tokenId] = uint256(_usedWeight); voterTurnouts[ (block.timestamp / DURATION) * DURATION ] += uint256(_usedWeight); } function vote(uint tokenId, address[] calldata _poolVote, uint256[] calldata _weights) external onlyNewEpoch(tokenId) { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); require(_poolVote.length == _weights.length); lastVoted[tokenId] = block.timestamp; _vote(tokenId, _poolVote, _weights); } function createGauge(address _pool) public returns (address) { require(gauges[_pool] == address(0x0), "exists"); address[] memory allowedRewards = new address[](3); bool isPair = IPairFactory(factory).isPair(_pool); address tokenA; address tokenB; if (isPair) { (tokenA, tokenB) = IPair(_pool).tokens(); allowedRewards[0] = tokenA; allowedRewards[1] = tokenB; if (base != tokenA && base != tokenB) { allowedRewards[2] = base; } } else { allowedRewards[0] = base; } if ( (msg.sender != governor) && (isListingsManager[msg.sender] == false) ) { // gov can create for any pool, even non-Equalizer pairs require(isPair, "!_pool"); require(isWhitelisted[tokenA] && isWhitelisted[tokenB], "!whitelisted"); require(gaugable[tokenA] || gaugable[tokenB], "Pool not Gaugable!"); require(IPair(_pool).stable()==false, "Creation of Stable-pool Gauge not allowed!"); } address _bribe = IBribeFactory(bribefactory).createBribe(allowedRewards); address[] memory gaugeRewards = new address[](1); gaugeRewards[0] = base; address _gauge = IGaugeFactory(gaugefactory).createGauge(_pool, _bribe, _ve, isPair, gaugeRewards); IERC20(base).approve(_gauge, type(uint).max); bribes[_gauge] = _bribe; gauges[_pool] = _gauge; poolForGauge[_gauge] = _pool; isGauge[_gauge] = true; isAlive[_gauge] = true; _updateFor(_gauge); pools.push(_pool); emit GaugeAndBribeCreated(_pool, _gauge, _bribe, msg.sender, gaugeRewards, allowedRewards); return _gauge; } function createGaugeMultiple(address[] memory _pools) external returns (address[] memory) { address[] memory _g_c = new address[](_pools.length); for(uint _j; _j<_pools.length; _j++) { _g_c[_j] = createGauge(_pools[_j]); } return _g_c; } function killGauge(address _gauge) external { require(msg.sender == emergencyCouncil, "not emergency council"); require(isAlive[_gauge], "gauge already dead"); isAlive[_gauge] = false; claimable[_gauge] = 0; emit GaugeKilled(_gauge); } function reviveGauge(address _gauge) external { require(msg.sender == emergencyCouncil, "not emergency council"); require(!isAlive[_gauge], "gauge already alive"); isAlive[_gauge] = true; emit GaugeRevived(_gauge); } function attachTokenToGauge(uint tokenId, address account) external { require(isGauge[msg.sender], "not gauge"); require(isAlive[msg.sender], "killed gauge"); // killed gauges cannot attach tokens to themselves if (tokenId > 0) IVotingEscrow(_ve).attach(tokenId); emit Attach(account, msg.sender, tokenId); } function emitDeposit(uint tokenId, address account, uint amount) external { require(isGauge[msg.sender], "not gauge"); require(isAlive[msg.sender], "killed gauge"); emit Deposit(account, msg.sender, tokenId, amount); } function detachTokenFromGauge(uint tokenId, address account) external { require(isGauge[msg.sender], "not gauge"); if (tokenId > 0) IVotingEscrow(_ve).detach(tokenId); emit Detach(account, msg.sender, tokenId); } function emitWithdraw(uint tokenId, address account, uint amount) external { require(isGauge[msg.sender], "not gauge"); emit Withdraw(account, msg.sender, tokenId, amount); } function length() external view returns (uint) { return pools.length; } function notifyRewardAmount(uint amount) external { _safeTransferFrom(base, msg.sender, address(this), amount); // transfer the distro in uint256 _ratio = amount * 1e18 / totalWeight; // 1e18 adjustment is removed during claim if (_ratio > 0) { index += _ratio; } emit NotifyReward(msg.sender, base, amount); } function updateFor(address[] memory _gauges) external { for (uint i = 0; i < _gauges.length; i++) { _updateFor(_gauges[i]); } } function updateForRange(uint start, uint end) public { for (uint i = start; i < end; i++) { _updateFor(gauges[pools[i]]); } } function updateAll() external { updateForRange(0, pools.length); } function updateGauge(address _gauge) external { _updateFor(_gauge); } function _updateFor(address _gauge) internal { address _pool = poolForGauge[_gauge]; uint256 _supplied = weights[_pool]; if (_supplied > 0) { uint _supplyIndex = supplyIndex[_gauge]; uint _index = index; // get global index0 for accumulated distro supplyIndex[_gauge] = _index; // update _gauge current position to global position uint _delta = _index - _supplyIndex; // see if there is any difference that need to be accrued if (_delta > 0) { uint _share = uint(_supplied) * _delta / 1e18; // add accrued difference for each supplied token if (isAlive[_gauge]) { claimable[_gauge] += _share; } } } else { supplyIndex[_gauge] = index; // new users are set to the default global state } } function _ensureOldDist(address _gauge) internal view { uint _ld = lastDistribution[_gauge]; if(_ld != 0) { // check only on old uint _bt = block.timestamp; require(_ld > _bt - _bt % DURATION, "Distribute gauge first!"); } } function claimRewards(address[] memory _gauges, address[][] memory _tokens) public { for (uint i = 0; i < _gauges.length; i++) { IGauge(_gauges[i]).getReward(msg.sender, _tokens[i]); } } function claimBribes(address[] memory _bribes, address[][] memory _tokens, uint _tokenId) public { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId)); for (uint i = 0; i < _bribes.length; i++) { IBribe(_bribes[i]).getRewardForOwner(_tokenId, _tokens[i]); } } function claimEverything( address[] memory _gauges, address[][] memory _gtokens, address[] memory _bribes, address[][] memory _btokens, uint _tokenId ) external { claimRewards(_gauges, _gtokens); if(_tokenId > 0) { claimBribes(_bribes, _btokens, _tokenId); } } function distributeFees(address _gauge) external { IGauge(_gauge).claimFees(); } function distributeFees(address[] memory _gauges) external { for (uint i = 0; i < _gauges.length; i++) { IGauge(_gauges[i]).claimFees(); } } function distributeFees(uint start, uint finish) public { for (uint x = start; x < finish; x++) { IGauge(gauges[pools[x]]).claimFees(); } } function distributeFees() external { distributeFees(0, pools.length); } function distribute(address _gauge) public lock { IMinter(minter).update_period(); _updateFor(_gauge); // should set claimable to 0 if killed lastDistribution[_gauge] = block.timestamp; uint _claimable = claimable[_gauge]; if (_claimable > IGauge(_gauge).left(base) && _claimable / DURATION > 0) { { uint _now = block.timestamp; distributions[ _now - (_now % 7 days) ][ _gauge ] += _claimable; } claimable[_gauge] = 0; if(pausedGauges[_gauge] == true) { IERC20(base).transfer(ms, _claimable); emit DistributeReward(msg.sender, ms, _claimable); } else { if(customGauges[_gauge] != address(0)) { IGauge(customGauges[_gauge]).notifyRewardAmount(base, _claimable); emit DistributeReward(msg.sender, customGauges[_gauge], _claimable); } else { IGauge(_gauge).notifyRewardAmount(base, _claimable); emit DistributeReward(msg.sender, _gauge, _claimable); } } } } function distribute() external { distribute(0, pools.length); } function distribute(uint start, uint finish) public { for (uint x = start; x < finish; x++) { distribute(gauges[pools[x]]); } } function distribute(address[] memory _gauges) external { for (uint x = 0; x < _gauges.length; x++) { distribute(_gauges[x]); } } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0, "Voter: invalid token"); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _whitelist(address _token) internal { require(!isWhitelisted[_token], "Already whitelisted"); isWhitelisted[_token] = true; emit Whitelisted(msg.sender, _token, true); } function whitelist(address[] calldata _tokens) external { require(msg.sender == governor || isListingsManager[msg.sender], "Not governor"); for (uint i = 0; i < _tokens.length; i++) { _whitelist(_tokens[i]); } } function removeFromWhitelist(address[] calldata _tokens) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _tokens.length; i++) { delete isWhitelisted[_tokens[i]]; emit Whitelisted(msg.sender, _tokens[i], false); } } function setGov(address _ms) external { require(msg.sender == ms, "!ms"); governor = _ms; emergencyCouncil = _ms; protocolFeesTaker = _ms; ms = _ms; } function setUnvotablePools(address[] calldata _pools, bool[] calldata _b) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _pools.length; i++) { unvotable [ _pools[i] ] = _b[i]; } } function setGaugable(address[] calldata _pools, bool[] calldata _b) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _pools.length; i++) { gaugable[ _pools[i] ] = _b[i]; } } function setPausedGauge(address[] calldata _g, bool[] calldata _b) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _g.length; i++) { pausedGauges[ _g[i] ] = _b[i]; } } function setCustomGauge(address[] calldata _g, address[] calldata _cg) external { require(msg.sender == governor, "Not governor"); for (uint i = 0; i < _g.length; i++) { address _og = customGauges[ _g[i] ] ; if(_og != address(0)) { IERC20(base).approve(_og, 0); } customGauges[ _g[i] ] = _cg[i] ; if( _cg[i] != address(0) ) { IERC20(base).approve( _cg[i], type(uint).max); } } } function setPokable(bool _b) external { require(msg.sender == governor, "Not governor"); pokable = _b; } function setMinter(address _m) external { require(msg.sender == governor, "Not governor"); minter = _m; } ///must be called only after all user votes are reset or when nobody is voting! function setBribe(address _pool, address _nb) external { require(msg.sender == governor, "Not governor"); address _g = gauges[_pool]; address _ob = bribes [_g]; require( IERC20(_ob).totalSupply() == 0 , "Cannot switch bribes which have active deposits!" ); IGauge(_g).setBribe(_nb); bribes [_g] = _nb; } function setListingsManager(address _m, bool _b) external { require(msg.sender == governor, "Not governor"); isListingsManager[_m] = _b; emit ListingsManagerSet(_m, _b); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Abstained","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Attach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Detach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DistributeReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address[]","name":"gaugeRewards","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"allowedRewards","type":"address[]"}],"name":"GaugeAndBribeCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeKilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeRevived","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":"lister","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"ListingsManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pooladdr","type":"address"},{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelister","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"attachTokenToGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"base","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribefactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bribes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bribes","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimBribes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"address[][]","name":"_gtokens","type":"address[][]"},{"internalType":"address[]","name":"_bribes","type":"address[]"},{"internalType":"address[][]","name":"_btokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimEverything","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"createGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"}],"name":"createGaugeMultiple","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"customGauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"detachTokenFromGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"finish","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"finish","type":"uint256"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"distributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyCouncil","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gaugable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugefactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"address[]","name":"_gaugables","type":"address[]"},{"internalType":"address","name":"_minter","type":"address"}],"name":"initialSetup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_gauges","type":"address"},{"internalType":"address","name":"_bribes","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAlive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGauge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isListingsManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"killGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastVoted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ms","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausedGauges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pokable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"poke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolForGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeesPerMillion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeesTaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"resetOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"resetOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"reviveGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"address","name":"_nb","type":"address"}],"name":"setBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_g","type":"address[]"},{"internalType":"address[]","name":"_cg","type":"address[]"}],"name":"setCustomGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_council","type":"address"}],"name":"setEmergencyCouncil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"},{"internalType":"bool[]","name":"_b","type":"bool[]"}],"name":"setGaugable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ms","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governor","type":"address"}],"name":"setGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_m","type":"address"},{"internalType":"bool","name":"_b","type":"bool"}],"name":"setListingsManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_m","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_g","type":"address[]"},{"internalType":"bool[]","name":"_b","type":"bool[]"}],"name":"setPausedGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_b","type":"bool"}],"name":"setPokable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pf","type":"uint256"}],"name":"setProtocolFeesPerMillion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pft","type":"address"}],"name":"setProtocolFeesTaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"},{"internalType":"bool[]","name":"_b","type":"bool[]"}],"name":"setUnvotablePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unvotable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"updateFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"updateForRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"updateGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"_poolVote","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"voteResults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voterTurnouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615139806100206000396000f3fe608060405234801561001057600080fd5b50600436106104b75760003560e01c806381d9eac611610278578063bb57ad201161015c578063e1c59536116100ce578063eb4aa7bb11610092578063eb4aa7bb14610bf3578063eb56bc7d14610c06578063f3594be014610c19578063f8c8765e14610c39578063fa57faeb14610c4c578063fca3b5aa14610c5957600080fd5b8063e1c5953614610b92578063e380fcad14610ba5578063e4fc6b6d14610bc5578063e586875f14610bcd578063ea94ee4414610be057600080fd5b8063c88d70f011610120578063c88d70f014610adb578063cfad57a214610b06578063d23254b414610b19578063d560b0d714610b44578063e060492d14610b57578063e1ae259d14610b6a57600080fd5b8063bb57ad2014610a87578063bd8aa78014610a8f578063c42cf53514610aa2578063c45a015514610ab5578063c527ee1f14610ac857600080fd5b8063a61c713a116101f5578063ac4afa38116101b9578063ac4afa38146109e2578063ad425018146109f5578063b5e7c5f114610a15578063b65c6dc914610a38578063b6da5b2014610a4b578063b9a09fd514610a5e57600080fd5b8063a61c713a14610950578063a7cac84614610963578063a86a366d14610983578063a8c5d95a14610996578063aa79979b146109bf57600080fd5b8063992a79331161023c578063992a7933146108f15780639b6a9d72146109045780639f06247b14610917578063a0b2d57f1461092a578063a5f4301e1461093d57600080fd5b806381d9eac61461087657806389038298146108995780638dd598fb146108bc5780639413f25c146108d557806396c82e57146108e857600080fd5b806344b50bfc1161039f57806368c3acb31161031c5780637715ee75116102e05780637715ee75146107ea5780637778960e146107fd57806379e93824146108105780637ac09bf7146108305780637e0adc93146108435780637e69671a1461086357600080fd5b806368c3acb31461078b578063698473e31461079e5780636ecbe38a146107b15780637625391a146107c45780637682aa71146107d757600080fd5b80635752b93b116103635780635752b93b1461072c5780635b0c7cfc1461073f5780635ed0c288146107525780636138889b1461076557806363453ae11461077857600080fd5b806344b50bfc146106cb5780635001f3b5146106eb57806353d78693146106fe578063548db17414610706578063558c55a31461071957600080fd5b806323af4f4d1161043857806338752a9d116103fc57806338752a9d146106465780633af32abf146106595780633c6b16ab1461067c5780633f6678251461068f578063402914f514610698578063411b1f77146106b857600080fd5b806323af4f4d146105c95780632986c0e5146105f45780632d0e6a76146105fd578063310bd74b1461062057806332145f901461063357600080fd5b8063168215fa1161047f578063168215fa146105505780631703e5f9146105635780631be05289146105965780631f7b6d32146105ae57806320b1cb6f146105b657600080fd5b806306d6a1b2146104bc5780630754617214610502578063098c66e1146105155780630c340a241461052a57806313416d991461053d575b600080fd5b6104e56104ca3660046146bc565b600e602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6005546104e5906001600160a01b031681565b61052861052336600461472b565b610c6c565b005b6007546104e5906001600160a01b031681565b6009546104e5906001600160a01b031681565b61052861055e366004614796565b610d3d565b6105866105713660046146bc565b60176020526000908152604090205460ff1681565b60405190151581526020016104f9565b6105a062093a8081565b6040519081526020016104f9565b600c546105a0565b6105286105c436600461490b565b610d8c565b6105a06105d736600461496e565b602460209081526000928352604080842090915290825290205481565b6105a060195481565b61058661060b3660046146bc565b60256020526000908152604090205460ff1681565b61052861062e366004614796565b610e42565b610528610641366004614796565b61100c565b6004546104e5906001600160a01b031681565b6105866106673660046146bc565b60166020526000908152604090205460ff1681565b61052861068a366004614796565b61117c565b6105a0600a5481565b6105a06106a63660046146bc565b601b6020526000908152604090205481565b6105286106c636600461496e565b61121e565b6105a06106d93660046146bc565b60236020526000908152604090205481565b6002546104e5906001600160a01b031681565b6105286112f3565b61052861071436600461499e565b611304565b61052861072736600461472b565b6113ff565b61052861073a36600461472b565b6114c0565b61052861074d3660046149df565b611581565b610528610760366004614a7d565b6115c5565b610528610773366004614a9a565b611602565b6105286107863660046146bc565b611642565b6003546104e5906001600160a01b031681565b6105286107ac36600461496e565b611adb565b6105286107bf3660046146bc565b611bfe565b6105286107d2366004614ad6565b611c07565b6105286107e53660046146bc565b611c6d565b6105286107f8366004614af8565b611ce9565b6008546104e5906001600160a01b031681565b6105a061081e366004614796565b60136020526000908152604090205481565b61052861083e366004614b64565b611e2a565b6105a0610851366004614796565b60216020526000908152604090205481565b610528610871366004614ad6565b611fba565b6105866108843660046146bc565b601d6020526000908152604090205460ff1681565b6105866108a73660046146bc565b601c6020526000908152604090205460ff1681565b6000546104e5906201000090046001600160a01b031681565b6105286108e33660046146bc565b61208a565b6105a0600b5481565b6105286108ff3660046146bc565b6120fc565b610528610912366004614ad6565b612201565b6105286109253660046146bc565b612267565b6006546104e5906001600160a01b031681565b6104e561094b3660046146bc565b612364565b61052861095e366004614bdd565b612b43565b6105a06109713660046146bc565b60106020526000908152604090205481565b6104e5610991366004614ad6565b612c13565b6104e56109a43660046146bc565b600f602052600090815260409020546001600160a01b031681565b6105866109cd3660046146bc565b60156020526000908152604090205460ff1681565b6104e56109f0366004614796565b612c4b565b610a08610a03366004614a9a565b612c75565b6040516104f99190614c59565b610586610a233660046146bc565b601f6020526000908152604090205460ff1681565b610528610a46366004614796565b612d2f565b610528610a59366004614c6c565b612dc1565b6104e5610a6c3660046146bc565b600d602052600090815260409020546001600160a01b031681565b610528612f77565b610528610a9d36600461499e565b612f86565b610528610ab03660046146bc565b613016565b6001546104e5906001600160a01b031681565b610528610ad6366004614a9a565b613082565b6105a0610ae936600461496e565b602260209081526000928352604080842090915290825290205481565b610528610b143660046146bc565b61312e565b6105a0610b2736600461496e565b601160209081526000928352604080842090915290825290205481565b610528610b52366004614a9a565b6131ae565b610528610b6536600461472b565b6131ee565b6104e5610b783660046146bc565b60208052600090815260409020546001600160a01b031681565b610528610ba0366004614c9a565b613485565b6105a0610bb33660046146bc565b601a6020526000908152604090205481565b61052861359b565b610528610bdb3660046146bc565b6135aa565b610528610bee366004614bdd565b61361f565b610528610c01366004614d11565b613694565b610528610c14366004614dc5565b6136af565b6105a0610c27366004614796565b60146020526000908152604090205481565b610528610c47366004614df3565b61372d565b601e546105869060ff1681565b610528610c673660046146bc565b613973565b6007546001600160a01b03163314610c9f5760405162461bcd60e51b8152600401610c9690614e4f565b60405180910390fd5b60005b83811015610d3657828282818110610cbc57610cbc614e75565b9050602002016020810190610cd19190614a7d565b601c6000878785818110610ce757610ce7614e75565b9050602002016020810190610cfc91906146bc565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d2e81614ea1565b915050610ca2565b5050505050565b6007546001600160a01b03163314610d875760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420676f7665726e6f722160981b6044820152606401610c96565b600a55565b60005b8251811015610e3d57828181518110610daa57610daa614e75565b60200260200101516001600160a01b03166331279d3d33848481518110610dd357610dd3614e75565b60200260200101516040518363ffffffff1660e01b8152600401610df8929190614ebc565b600060405180830381600087803b158015610e1257600080fd5b505af1158015610e26573d6000803e3d6000fd5b505050508080610e3590614ea1565b915050610d8f565b505050565b600081815260146020526040902054819062093a80610e618142614ef6565b610e6b9190614f0a565b11610eb85760405162461bcd60e51b815260206004820152601e60248201527f544f4b454e5f414c52454144595f564f5445445f544849535f45504f434800006044820152606401610c96565b60005460405163430c208160e01b815233600482015260248101849052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b158015610f0757600080fd5b505afa158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190614f29565b610f8b5760405162461bcd60e51b815260206004820152601a60248201527f4e65697468657220617070726f766564206e6f72206f776e65720000000000006044820152606401610c96565b6000828152601460205260409020429055610fa5826139bf565b60005460405163c1f0fb9f60e01b815260048101849052620100009091046001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610ff057600080fd5b505af1158015611004573d6000803e3d6000fd5b505050505050565b601e5460ff168061102757506006546001600160a01b031633145b156111795760008181526012602090815260408083208054825181850281018501909352808352919290919083018282801561108c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161106e575b505050505090506000815190506000816001600160401b038111156110b3576110b36147af565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b828110156111695760116000868152602001908152602001600020600085838151811061111157611111614e75565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061114c5761114c614e75565b60209081029190910101528061116181614ea1565b9150506110e2565b50611175848483613c5d565b5050505b50565b600254611194906001600160a01b0316333084614311565b600b546000906111ac83670de0b6b3a7640000614f0a565b6111b69190614ef6565b905080156111d65780601960008282546111d09190614f46565b90915550505b6002546040518381526001600160a01b039091169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050565b3360009081526015602052604090205460ff1661124d5760405162461bcd60e51b8152600401610c9690614f5e565b81156112b757600054604051634c35bec560e11b815260048101849052620100009091046001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561129e57600080fd5b505af11580156112b2573d6000803e3d6000fd5b505050505b604051829033906001600160a01b038416907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290600090a45050565b600c5461130290600090612201565b565b6007546001600160a01b0316331461132e5760405162461bcd60e51b8152600401610c9690614e4f565b60005b81811015610e3d576016600084848481811061134f5761134f614e75565b905060200201602081019061136491906146bc565b6001600160a01b0316815260208101919091526040016000908120805460ff1916905583838381811061139957611399614e75565b90506020020160208101906113ae91906146bc565b6001600160a01b0316336001600160a01b03167fc8a125677224e7125b3579c5a10de1afe210f4c1c1d3c27be0f12b0c4a14c91560405160405180910390a4806113f781614ea1565b915050611331565b6007546001600160a01b031633146114295760405162461bcd60e51b8152600401610c9690614e4f565b60005b83811015610d365782828281811061144657611446614e75565b905060200201602081019061145b9190614a7d565b601d600087878581811061147157611471614e75565b905060200201602081019061148691906146bc565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806114b881614ea1565b91505061142c565b6007546001600160a01b031633146114ea5760405162461bcd60e51b8152600401610c9690614e4f565b60005b83811015610d365782828281811061150757611507614e75565b905060200201602081019061151c9190614a7d565b601f600087878581811061153257611532614e75565b905060200201602081019061154791906146bc565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061157981614ea1565b9150506114ed565b60005b81518110156115c1576115af8282815181106115a2576115a2614e75565b6020026020010151612d2f565b806115b981614ea1565b915050611584565b5050565b6007546001600160a01b031633146115ef5760405162461bcd60e51b8152600401610c9690614e4f565b601e805460ff1916911515919091179055565b60005b81518110156115c15761163082828151811061162357611623614e75565b6020026020010151611642565b8061163a81614ea1565b915050611605565b60185460ff16156116865760405162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b6044820152606401610c96565b6018805460ff191660011790556005546040805163ed29fc1160e01b815290516001600160a01b039092169163ed29fc11916004808201926020929091908290030181600087803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117129190614f81565b5061171c8161443b565b6001600160a01b038181166000818152602360209081526040808320429055601b90915290819020546002549151634cde602960e11b81529190931660048201526399bcc0529060240160206040518083038186803b15801561177e57600080fd5b505afa158015611792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b69190614f81565b811180156117d0575060006117ce62093a8083614ef6565b115b15611acd574281602460006117e862093a8085614f9a565b6117f29085614fae565b81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060008282546118329190614f46565b9091555050506001600160a01b0382166000908152601b60209081526040808320839055601f90915290205460ff1615156001141561193e5760025460065460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb90604401602060405180830381600087803b1580156118bb57600080fd5b505af11580156118cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f39190614f29565b506006546040518281526001600160a01b039091169033907f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b17906020015b60405180910390a3611acd565b6001600160a01b0382811660009081526020805260409020541615611a26576001600160a01b0382811660009081526020805260409081902054600254915163b66503cf60e01b81529183166004830152602482018490529091169063b66503cf90604401600060405180830381600087803b1580156119bd57600080fd5b505af11580156119d1573d6000803e3d6000fd5b5050506001600160a01b038084166000908152602080526040908190205490519116915033907f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b17906119319085815260200190565b60025460405163b66503cf60e01b81526001600160a01b039182166004820152602481018390529083169063b66503cf90604401600060405180830381600087803b158015611a7457600080fd5b505af1158015611a88573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506018805460ff19169055565b3360009081526015602052604090205460ff16611b0a5760405162461bcd60e51b8152600401610c9690614f5e565b3360009081526017602052604090205460ff16611b585760405162461bcd60e51b815260206004820152600c60248201526b6b696c6c656420676175676560a01b6044820152606401610c96565b8115611bc25760005460405163fbd3a29d60e01b815260048101849052620100009091046001600160a01b03169063fbd3a29d90602401600060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b505050505b604051829033906001600160a01b038416907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90600090a45050565b6111798161443b565b815b81811015610e3d57611c5b600d6000600c8481548110611c2b57611c2b614e75565b60009182526020808320909101546001600160a01b03908116845290830193909352604090910190205416611642565b80611c6581614ea1565b915050611c09565b6007546001600160a01b03163314611cc75760405162461bcd60e51b815260206004820152601860248201527f4e6f742050726f746f636f6c20466565732054616b65722100000000000000006044820152606401610c96565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60005460405163430c208160e01b815233600482015260248101839052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b158015611d3857600080fd5b505afa158015611d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d709190614f29565b611d7957600080fd5b60005b835181101561117557838181518110611d9757611d97614e75565b60200260200101516001600160a01b031663a7852afa83858481518110611dc057611dc0614e75565b60200260200101516040518363ffffffff1660e01b8152600401611de5929190614fc5565b600060405180830381600087803b158015611dff57600080fd5b505af1158015611e13573d6000803e3d6000fd5b505050508080611e2290614ea1565b915050611d7c565b600085815260146020526040902054859062093a80611e498142614ef6565b611e539190614f0a565b11611ea05760405162461bcd60e51b815260206004820152601e60248201527f544f4b454e5f414c52454144595f564f5445445f544849535f45504f434800006044820152606401610c96565b60005460405163430c208160e01b815233600482015260248101889052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b158015611eef57600080fd5b505afa158015611f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f279190614f29565b611f3057600080fd5b838214611f3c57600080fd5b600086815260146020908152604091829020429055815186820281810183019093528681526110049289928991899182919085019084908082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250613c5d92505050565b815b81811015610e3d57600d6000600c8381548110611fdb57611fdb614e75565b60009182526020808320909101546001600160a01b039081168452908301939093526040918201812054825163d294f09360e01b81528351919094169363d294f093936004808301949193928390030190829087803b15801561203d57600080fd5b505af1158015612051573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120759190614fde565b5050808061208290614ea1565b915050611fbc565b806001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b1580156120c457600080fd5b505af11580156120d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3d9190614fde565b6008546001600160a01b0316331461214e5760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b595c99d95b98de4818dbdd5b98da5b605a1b6044820152606401610c96565b6001600160a01b03811660009081526017602052604090205460ff166121ab5760405162461bcd60e51b815260206004820152601260248201527119d85d59d948185b1c9958591e481919585960721b6044820152606401610c96565b6001600160a01b0381166000818152601760209081526040808320805460ff19169055601b909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b815b81811015610e3d57612255600d6000600c848154811061222557612225614e75565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541661443b565b8061225f81614ea1565b915050612203565b6008546001600160a01b031633146122b95760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b595c99d95b98de4818dbdd5b98da5b605a1b6044820152606401610c96565b6001600160a01b03811660009081526017602052604090205460ff16156123185760405162461bcd60e51b8152602060048201526013602482015272676175676520616c726561647920616c69766560681b6044820152606401610c96565b6001600160a01b038116600081815260176020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b6001600160a01b038181166000908152600d6020526040812054909116156123b75760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b6044820152606401610c96565b60408051600380825260808201909252600091602082016060803683370190505060015460405163e5e31b1360e01b81526001600160a01b0386811660048301529293506000929091169063e5e31b139060240160206040518083038186803b15801561242357600080fd5b505afa158015612437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245b9190614f29565b905060008082156125af57856001600160a01b0316639d63848a6040518163ffffffff1660e01b81526004016040805180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d89190615002565b809250819350505081846000815181106124f4576124f4614e75565b60200260200101906001600160a01b031690816001600160a01b031681525050808460018151811061252857612528614e75565b6001600160a01b03928316602091820292909201015260025481169083161480159061256257506002546001600160a01b03828116911614155b156125aa576002805485516001600160a01b03909116918691811061258957612589614e75565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6125f2565b60025484516001600160a01b039091169085906000906125d1576125d1614e75565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6007546001600160a01b0316331480159061261d57503360009081526025602052604090205460ff16155b1561282457826126585760405162461bcd60e51b81526020600482015260066024820152650857dc1bdbdb60d21b6044820152606401610c96565b6001600160a01b03821660009081526016602052604090205460ff16801561269857506001600160a01b03811660009081526016602052604090205460ff165b6126d35760405162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b6044820152606401610c96565b6001600160a01b0382166000908152601d602052604090205460ff168061271257506001600160a01b0381166000908152601d602052604090205460ff165b6127535760405162461bcd60e51b8152602060048201526012602482015271506f6f6c206e6f74204761756761626c652160701b6044820152606401610c96565b856001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561278c57600080fd5b505afa1580156127a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c49190614f29565b156128245760405162461bcd60e51b815260206004820152602a60248201527f4372656174696f6e206f6620537461626c652d706f6f6c204761756765206e6f6044820152697420616c6c6f7765642160b01b6064820152608401610c96565b6004805460405163897cd6b360e01b81526000926001600160a01b039092169163897cd6b39161285691899101614c59565b602060405180830381600087803b15801561287057600080fd5b505af1158015612884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a89190615031565b6040805160018082528183019092529192506000919060208083019080368337505060025482519293506001600160a01b0316918391506000906128ee576128ee614e75565b6001600160a01b03928316602091820292909201015260035460008054604051630f6f2d4760e11b8152919392831692631ede5a8e92612941928e9289926201000090920416908c90899060040161504e565b602060405180830381600087803b15801561295b57600080fd5b505af115801561296f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129939190615031565b60025460405163095ea7b360e01b81526001600160a01b038084166004830152600019602483015292935091169063095ea7b390604401602060405180830381600087803b1580156129e457600080fd5b505af11580156129f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1c9190614f29565b506001600160a01b038082166000818152600f602090815260408083208054868a166001600160a01b031991821617909155948e16808452600d83528184208054871686179055938352600e8252808320805490951690931790935560158352818120805460ff19908116600190811790925560179094529190208054909216179055612aa88161443b565b600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b038b169081179091556040513391907f31cdbca65889efbb92669ea36448e0bc97faaaa16d8ac81502b85dad8f9c2e4890612b2f908590889088908e9061508a565b60405180910390a398975050505050505050565b3360009081526015602052604090205460ff16612b725760405162461bcd60e51b8152600401610c9690614f5e565b3360009081526017602052604090205460ff16612bc05760405162461bcd60e51b815260206004820152600c60248201526b6b696c6c656420676175676560a01b6044820152606401610c96565b82336001600160a01b0316836001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d784604051612c0691815260200190565b60405180910390a4505050565b60126020528160005260406000208181548110612c2f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600c8181548110612c5b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600082516001600160401b03811115612c9257612c926147af565b604051908082528060200260200182016040528015612cbb578160200160208202803683370190505b50905060005b8351811015612d2857612cec848281518110612cdf57612cdf614e75565b6020026020010151612364565b828281518110612cfe57612cfe614e75565b6001600160a01b039092166020928302919091019091015280612d2081614ea1565b915050612cc1565b5092915050565b6007546001600160a01b03163314612d595760405162461bcd60e51b8152600401610c9690614e4f565b612d62816139bf565b60005460405163c1f0fb9f60e01b815260048101839052620100009091046001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015612dad57600080fd5b505af1158015610d36573d6000803e3d6000fd5b6007546001600160a01b03163314612deb5760405162461bcd60e51b8152600401610c9690614e4f565b6001600160a01b038083166000908152600d60209081526040808320548416808452600f8352928190205481516318160ddd60e01b815291519394169283926318160ddd9260048082019391829003018186803b158015612e4b57600080fd5b505afa158015612e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e839190614f81565b15612ee95760405162461bcd60e51b815260206004820152603060248201527f43616e6e6f74207377697463682062726962657320776869636820686176652060448201526f616374697665206465706f736974732160801b6064820152608401610c96565b60405163740ef7e760e11b81526001600160a01b03848116600483015283169063e81defce90602401600060405180830381600087803b158015612f2c57600080fd5b505af1158015612f40573d6000803e3d6000fd5b505050506001600160a01b039182166000908152600f6020526040902080546001600160a01b031916939092169290921790555050565b600c5461130290600090611fba565b6007546001600160a01b0316331480612fae57503360009081526025602052604090205460ff165b612fca5760405162461bcd60e51b8152600401610c9690614e4f565b60005b81811015610e3d57613004838383818110612fea57612fea614e75565b9050602002016020810190612fff91906146bc565b61453c565b8061300e81614ea1565b915050612fcd565b6007546001600160a01b031633146130605760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420676f7665726e6f722160981b6044820152606401610c96565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60005b81518110156115c1578181815181106130a0576130a0614e75565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b1580156130e157600080fd5b505af11580156130f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131199190614fde565b5050808061312690614ea1565b915050613085565b6006546001600160a01b0316331461316e5760405162461bcd60e51b8152602060048201526003602482015262216d7360e81b6044820152606401610c96565b600780546001600160a01b039092166001600160a01b03199283168117909155600880548316821790556009805483168217905560068054909216179055565b60005b81518110156115c1576131dc8282815181106131cf576131cf614e75565b602002602001015161443b565b806131e681614ea1565b9150506131b1565b6007546001600160a01b031633146132185760405162461bcd60e51b8152600401610c9690614e4f565b60005b83811015610d365760006020600087878581811061323b5761323b614e75565b905060200201602081019061325091906146bc565b6001600160a01b03908116825260208201929092526040016000205416905080156132fd5760025460405163095ea7b360e01b81526001600160a01b038381166004830152600060248301529091169063095ea7b390604401602060405180830381600087803b1580156132c357600080fd5b505af11580156132d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132fb9190614f29565b505b83838381811061330f5761330f614e75565b905060200201602081019061332491906146bc565b6020600088888681811061333a5761333a614e75565b905060200201602081019061334f91906146bc565b6001600160a01b0390811682526020820192909252604001600090812080546001600160a01b0319169390921692909217905584848481811061339457613394614e75565b90506020020160208101906133a991906146bc565b6001600160a01b031614613472576002546001600160a01b031663095ea7b38585858181106133da576133da614e75565b90506020020160208101906133ef91906146bc565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526000196024820152604401602060405180830381600087803b15801561343857600080fd5b505af115801561344c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134709190614f29565b505b508061347d81614ea1565b91505061321b565b6005546001600160a01b031633146134cd5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74206d696e7465722160a81b6044820152606401610c96565b60005b835181101561350d576134fb8482815181106134ee576134ee614e75565b602002602001015161453c565b8061350581614ea1565b9150506134d0565b5060005b8251811015613576576001601d600085848151811061353257613532614e75565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061356e81614ea1565b915050613511565b50600580546001600160a01b0319166001600160a01b03929092169190911790555050565b600c5461130290600090611c07565b6008546001600160a01b031633146135fd5760405162461bcd60e51b81526020600482015260166024820152754e6f7420656d657267656e637920636f756e63696c2160501b6044820152606401610c96565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526015602052604090205460ff1661364e5760405162461bcd60e51b8152600401610c9690614f5e565b82336001600160a01b0316836001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb56784604051612c0691815260200190565b61369e8585610d8c565b8015610d3657610d36838383611ce9565b6007546001600160a01b031633146136d95760405162461bcd60e51b8152600401610c9690614e4f565b6001600160a01b038216600081815260256020526040808220805460ff191685151590811790915590519092917fe98ba766f842915dce367996787d5fdf9597d23b10098d489d93620442cfcbb991a35050565b600054610100900460ff161580801561374d5750600054600160ff909116105b806137675750303b158015613767575060005460ff166001145b6137ca5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610c96565b6000805460ff1916600117905580156137ed576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b0388811691820292909217909255600180546001600160a01b03191691871691909117905560408051637e062a3560e11b8152905163fc0c546a91600480820192602092909190829003018186803b15801561386357600080fd5b505afa158015613877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389b9190615031565b600280546001600160a01b03199081166001600160a01b03938416908117909255600380548216878516179055600480548216938616939093179092556005805433908416811790915560078054841682179055600880548416821790556009805484168217905560068054909316179091556000908152601d60205260409020805460ff191660011790558015610d36576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6007546001600160a01b0316331461399d5760405162461bcd60e51b8152600401610c9690614e4f565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152601260205260408082208054835492516331a9108f60e11b81526004810186905291939092909182916201000090046001600160a01b031690636352211e9060240160206040518083038186803b158015613a1e57600080fd5b505afa158015613a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a569190615031565b905060005b83811015613c21576000858281548110613a7757613a77614e75565b60009182526020808320909101548983526011825260408084206001600160a01b03909216808552919092529120549091508015613c0c576001600160a01b038083166000908152600d602052604090205416613ad3816145f0565b613adc8161443b565b6001600160a01b03831660009081526010602052604081208054849290613b04908490614fae565b909155505060008981526011602090815260408083206001600160a01b038716845290915281208054849290613b3b908490614fae565b90915550506001600160a01b038181166000908152600f602052604090819020549051630ced1b8360e31b815260048101859052602481018c90523360448201528783166064820152911690636768dc1890608401600060405180830381600087803b158015613baa57600080fd5b505af1158015613bbe573d6000803e3d6000fd5b505050508186613bce9190614f46565b9550887fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db83604051613c0291815260200190565b60405180910390a2505b50508080613c1990614ea1565b915050613a5b565b5081600b6000828254613c349190614fae565b9091555050600085815260136020908152604080832083905560129091528120610d3691614675565b60005b8251811015613da957601c6000848381518110613c7f57613c7f614e75565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615613cf35760405162461bcd60e51b815260206004820152601760248201527f5468697320706f6f6c20697320756e766f7461626c65210000000000000000006044820152606401610c96565b60176000600d6000868581518110613d0d57613d0d614e75565b6020908102919091018101516001600160a01b0390811683528282019390935260409182016000908120549093168452830193909352910190205460ff16613d975760405162461bcd60e51b815260206004820152601c60248201527f43616e7420766f746520666f72204b696c6c65642047617567657321000000006044820152606401610c96565b80613da181614ea1565b915050613c60565b50613db3836139bf565b8151600080546040516339f890b560e21b815260048101879052620100009091046001600160a01b03169063e7e242d49060240160206040518083038186803b158015613dff57600080fd5b505afa158015613e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e379190614f81565b600080546040516331a9108f60e11b81526004810189905292935090918291829182916201000090046001600160a01b031690636352211e9060240160206040518083038186803b158015613e8b57600080fd5b505afa158015613e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec39190615031565b905060005b86811015613f0957878181518110613ee257613ee2614e75565b602002602001015185613ef59190614f46565b945080613f0181614ea1565b915050613ec8565b5060005b86811015614234576000898281518110613f2957613f29614e75565b6020908102919091018101516001600160a01b038082166000908152600d84526040808220549092168082526015909452205490925060ff161561421f57600087898c8681518110613f7d57613f7d614e75565b6020026020010151613f8f9190614f0a565b613f999190614ef6565b60008e81526011602090815260408083206001600160a01b038816845290915290205490915015613fc957600080fd5b80613fd357600080fd5b613fdc826145f0565b613fe58261443b565b60008d815260126020908152604080832080546001810182559084528284200180546001600160a01b0319166001600160a01b038816908117909155835260109091528120805483929061403a908490614f46565b909155505060008d81526011602090815260408083206001600160a01b038716845290915281208054839290614071908490614f46565b92505081905550600f6000836001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03166335da504d828f33896040518563ffffffff1660e01b8152600401614104949392919093845260208401929092526001600160a01b03908116604084015216606082015260800190565b600060405180830381600087803b15801561411e57600080fd5b505af1158015614132573d6000803e3d6000fd5b5050505080866141429190614f46565b955061414e8188614f46565b6040805133815260208101849052428183015290519198508e916001600160a01b0388811692908716917f494cb07910d432267ab6b7ac8f82cbd3955d7fe28c693d83e0ebbfeafa8c7f899181900360600190a4806022600062093a806141b58142614ef6565b6141bf9190614f0a565b815260200190815260200160002060008e87815181106141e1576141e1614e75565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546142189190614f46565b9091555050505b5050808061422c90614ea1565b915050613f0d565b50811561429f5760005460405163fd4a77f160e01b8152600481018b9052620100009091046001600160a01b03169063fd4a77f190602401600060405180830381600087803b15801561428657600080fd5b505af115801561429a573d6000803e3d6000fd5b505050505b82600b60008282546142b19190614f46565b90915550506000898152601360205260408120839055829060219062093a806142da8142614ef6565b6142e49190614f0a565b815260200190815260200160002060008282546143019190614f46565b9091555050505050505050505050565b6000846001600160a01b03163b116143625760405162461bcd60e51b81526020600482015260146024820152732b37ba32b91d1034b73b30b634b2103a37b5b2b760611b6044820152606401610c96565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916143c691906150c8565b6000604051808303816000865af19150503d8060008114614403576040519150601f19603f3d011682016040523d82523d6000602084013e614408565b606091505b50915091508180156144325750805115806144325750808060200190518101906144329190614f29565b61100457600080fd5b6001600160a01b038082166000908152600e6020908152604080832054909316808352601090915291902054801561451b576001600160a01b0383166000908152601a60205260408120805460195491829055916144998383614fae565b90508015611004576000670de0b6b3a76400006144b68387614f0a565b6144c09190614ef6565b6001600160a01b03881660009081526017602052604090205490915060ff1615614512576001600160a01b0387166000908152601b60205260408120805483929061450c908490614f46565b90915550505b50505050505050565b6019546001600160a01b0384166000908152601a6020526040902055505050565b6001600160a01b03811660009081526016602052604090205460ff161561459b5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481dda1a5d195b1a5cdd1959606a1b6044820152606401610c96565b6001600160a01b038116600081815260166020526040808220805460ff19166001908117909155905190929133917fc8a125677224e7125b3579c5a10de1afe210f4c1c1d3c27be0f12b0c4a14c9159190a450565b6001600160a01b03811660009081526023602052604090205480156115c1574261461d62093a8082614f9a565b6146279082614fae565b8211610e3d5760405162461bcd60e51b815260206004820152601760248201527f44697374726962757465206761756765206669727374210000000000000000006044820152606401610c96565b508054600082559060005260206000209081019061117991905b808211156146a3576000815560010161468f565b5090565b6001600160a01b038116811461117957600080fd5b6000602082840312156146ce57600080fd5b81356146d9816146a7565b9392505050565b60008083601f8401126146f257600080fd5b5081356001600160401b0381111561470957600080fd5b6020830191508360208260051b850101111561472457600080fd5b9250929050565b6000806000806040858703121561474157600080fd5b84356001600160401b038082111561475857600080fd5b614764888389016146e0565b9096509450602087013591508082111561477d57600080fd5b5061478a878288016146e0565b95989497509550505050565b6000602082840312156147a857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156147ed576147ed6147af565b604052919050565b60006001600160401b0382111561480e5761480e6147af565b5060051b60200190565b600082601f83011261482957600080fd5b8135602061483e614839836147f5565b6147c5565b82815260059290921b8401810191818101908684111561485d57600080fd5b8286015b84811015614881578035614874816146a7565b8352918301918301614861565b509695505050505050565b600082601f83011261489d57600080fd5b813560206148ad614839836147f5565b82815260059290921b840181019181810190868411156148cc57600080fd5b8286015b848110156148815780356001600160401b038111156148ef5760008081fd5b6148fd8986838b0101614818565b8452509183019183016148d0565b6000806040838503121561491e57600080fd5b82356001600160401b038082111561493557600080fd5b61494186838701614818565b9350602085013591508082111561495757600080fd5b506149648582860161488c565b9150509250929050565b6000806040838503121561498157600080fd5b823591506020830135614993816146a7565b809150509250929050565b600080602083850312156149b157600080fd5b82356001600160401b038111156149c757600080fd5b6149d3858286016146e0565b90969095509350505050565b600060208083850312156149f257600080fd5b82356001600160401b03811115614a0857600080fd5b8301601f81018513614a1957600080fd5b8035614a27614839826147f5565b81815260059190911b82018301908381019087831115614a4657600080fd5b928401925b82841015614a6457833582529284019290840190614a4b565b979650505050505050565b801515811461117957600080fd5b600060208284031215614a8f57600080fd5b81356146d981614a6f565b600060208284031215614aac57600080fd5b81356001600160401b03811115614ac257600080fd5b614ace84828501614818565b949350505050565b60008060408385031215614ae957600080fd5b50508035926020909101359150565b600080600060608486031215614b0d57600080fd5b83356001600160401b0380821115614b2457600080fd5b614b3087838801614818565b94506020860135915080821115614b4657600080fd5b50614b538682870161488c565b925050604084013590509250925092565b600080600080600060608688031215614b7c57600080fd5b8535945060208601356001600160401b0380821115614b9a57600080fd5b614ba689838a016146e0565b90965094506040880135915080821115614bbf57600080fd5b50614bcc888289016146e0565b969995985093965092949392505050565b600080600060608486031215614bf257600080fd5b833592506020840135614c04816146a7565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015614c4e5781516001600160a01b031687529582019590820190600101614c29565b509495945050505050565b6020815260006146d96020830184614c15565b60008060408385031215614c7f57600080fd5b8235614c8a816146a7565b91506020830135614993816146a7565b600080600060608486031215614caf57600080fd5b83356001600160401b0380821115614cc657600080fd5b614cd287838801614818565b94506020860135915080821115614ce857600080fd5b50614cf586828701614818565b9250506040840135614d06816146a7565b809150509250925092565b600080600080600060a08688031215614d2957600080fd5b85356001600160401b0380821115614d4057600080fd5b614d4c89838a01614818565b96506020880135915080821115614d6257600080fd5b614d6e89838a0161488c565b95506040880135915080821115614d8457600080fd5b614d9089838a01614818565b94506060880135915080821115614da657600080fd5b50614db38882890161488c565b95989497509295608001359392505050565b60008060408385031215614dd857600080fd5b8235614de3816146a7565b9150602083013561499381614a6f565b60008060008060808587031215614e0957600080fd5b8435614e14816146a7565b93506020850135614e24816146a7565b92506040850135614e34816146a7565b91506060850135614e44816146a7565b939692955090935050565b6020808252600c908201526b2737ba1033b7bb32b93737b960a11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614eb557614eb5614e8b565b5060010190565b6001600160a01b0383168152604060208201819052600090614ace90830184614c15565b634e487b7160e01b600052601260045260246000fd5b600082614f0557614f05614ee0565b500490565b6000816000190483118215151615614f2457614f24614e8b565b500290565b600060208284031215614f3b57600080fd5b81516146d981614a6f565b60008219821115614f5957614f59614e8b565b500190565b6020808252600990820152686e6f7420676175676560b81b604082015260600190565b600060208284031215614f9357600080fd5b5051919050565b600082614fa957614fa9614ee0565b500690565b600082821015614fc057614fc0614e8b565b500390565b828152604060208201526000614ace6040830184614c15565b60008060408385031215614ff157600080fd5b505080516020909101519092909150565b6000806040838503121561501557600080fd5b8251615020816146a7565b6020840151909250614993816146a7565b60006020828403121561504357600080fd5b81516146d9816146a7565b6001600160a01b038681168252858116602083015284166040820152821515606082015260a060808201819052600090614a6490830184614c15565b6001600160a01b038581168252841660208201526080604082018190526000906150b690830185614c15565b8281036060840152614a648185614c15565b6000825160005b818110156150e957602081860181015185830152016150cf565b818111156150f8576000828501525b50919091019291505056fea26469706673582212206ff3930cb2e43c6d7591d450b74f3f07c626457877aedf425323ea6236b2cc0f64736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104b75760003560e01c806381d9eac611610278578063bb57ad201161015c578063e1c59536116100ce578063eb4aa7bb11610092578063eb4aa7bb14610bf3578063eb56bc7d14610c06578063f3594be014610c19578063f8c8765e14610c39578063fa57faeb14610c4c578063fca3b5aa14610c5957600080fd5b8063e1c5953614610b92578063e380fcad14610ba5578063e4fc6b6d14610bc5578063e586875f14610bcd578063ea94ee4414610be057600080fd5b8063c88d70f011610120578063c88d70f014610adb578063cfad57a214610b06578063d23254b414610b19578063d560b0d714610b44578063e060492d14610b57578063e1ae259d14610b6a57600080fd5b8063bb57ad2014610a87578063bd8aa78014610a8f578063c42cf53514610aa2578063c45a015514610ab5578063c527ee1f14610ac857600080fd5b8063a61c713a116101f5578063ac4afa38116101b9578063ac4afa38146109e2578063ad425018146109f5578063b5e7c5f114610a15578063b65c6dc914610a38578063b6da5b2014610a4b578063b9a09fd514610a5e57600080fd5b8063a61c713a14610950578063a7cac84614610963578063a86a366d14610983578063a8c5d95a14610996578063aa79979b146109bf57600080fd5b8063992a79331161023c578063992a7933146108f15780639b6a9d72146109045780639f06247b14610917578063a0b2d57f1461092a578063a5f4301e1461093d57600080fd5b806381d9eac61461087657806389038298146108995780638dd598fb146108bc5780639413f25c146108d557806396c82e57146108e857600080fd5b806344b50bfc1161039f57806368c3acb31161031c5780637715ee75116102e05780637715ee75146107ea5780637778960e146107fd57806379e93824146108105780637ac09bf7146108305780637e0adc93146108435780637e69671a1461086357600080fd5b806368c3acb31461078b578063698473e31461079e5780636ecbe38a146107b15780637625391a146107c45780637682aa71146107d757600080fd5b80635752b93b116103635780635752b93b1461072c5780635b0c7cfc1461073f5780635ed0c288146107525780636138889b1461076557806363453ae11461077857600080fd5b806344b50bfc146106cb5780635001f3b5146106eb57806353d78693146106fe578063548db17414610706578063558c55a31461071957600080fd5b806323af4f4d1161043857806338752a9d116103fc57806338752a9d146106465780633af32abf146106595780633c6b16ab1461067c5780633f6678251461068f578063402914f514610698578063411b1f77146106b857600080fd5b806323af4f4d146105c95780632986c0e5146105f45780632d0e6a76146105fd578063310bd74b1461062057806332145f901461063357600080fd5b8063168215fa1161047f578063168215fa146105505780631703e5f9146105635780631be05289146105965780631f7b6d32146105ae57806320b1cb6f146105b657600080fd5b806306d6a1b2146104bc5780630754617214610502578063098c66e1146105155780630c340a241461052a57806313416d991461053d575b600080fd5b6104e56104ca3660046146bc565b600e602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6005546104e5906001600160a01b031681565b61052861052336600461472b565b610c6c565b005b6007546104e5906001600160a01b031681565b6009546104e5906001600160a01b031681565b61052861055e366004614796565b610d3d565b6105866105713660046146bc565b60176020526000908152604090205460ff1681565b60405190151581526020016104f9565b6105a062093a8081565b6040519081526020016104f9565b600c546105a0565b6105286105c436600461490b565b610d8c565b6105a06105d736600461496e565b602460209081526000928352604080842090915290825290205481565b6105a060195481565b61058661060b3660046146bc565b60256020526000908152604090205460ff1681565b61052861062e366004614796565b610e42565b610528610641366004614796565b61100c565b6004546104e5906001600160a01b031681565b6105866106673660046146bc565b60166020526000908152604090205460ff1681565b61052861068a366004614796565b61117c565b6105a0600a5481565b6105a06106a63660046146bc565b601b6020526000908152604090205481565b6105286106c636600461496e565b61121e565b6105a06106d93660046146bc565b60236020526000908152604090205481565b6002546104e5906001600160a01b031681565b6105286112f3565b61052861071436600461499e565b611304565b61052861072736600461472b565b6113ff565b61052861073a36600461472b565b6114c0565b61052861074d3660046149df565b611581565b610528610760366004614a7d565b6115c5565b610528610773366004614a9a565b611602565b6105286107863660046146bc565b611642565b6003546104e5906001600160a01b031681565b6105286107ac36600461496e565b611adb565b6105286107bf3660046146bc565b611bfe565b6105286107d2366004614ad6565b611c07565b6105286107e53660046146bc565b611c6d565b6105286107f8366004614af8565b611ce9565b6008546104e5906001600160a01b031681565b6105a061081e366004614796565b60136020526000908152604090205481565b61052861083e366004614b64565b611e2a565b6105a0610851366004614796565b60216020526000908152604090205481565b610528610871366004614ad6565b611fba565b6105866108843660046146bc565b601d6020526000908152604090205460ff1681565b6105866108a73660046146bc565b601c6020526000908152604090205460ff1681565b6000546104e5906201000090046001600160a01b031681565b6105286108e33660046146bc565b61208a565b6105a0600b5481565b6105286108ff3660046146bc565b6120fc565b610528610912366004614ad6565b612201565b6105286109253660046146bc565b612267565b6006546104e5906001600160a01b031681565b6104e561094b3660046146bc565b612364565b61052861095e366004614bdd565b612b43565b6105a06109713660046146bc565b60106020526000908152604090205481565b6104e5610991366004614ad6565b612c13565b6104e56109a43660046146bc565b600f602052600090815260409020546001600160a01b031681565b6105866109cd3660046146bc565b60156020526000908152604090205460ff1681565b6104e56109f0366004614796565b612c4b565b610a08610a03366004614a9a565b612c75565b6040516104f99190614c59565b610586610a233660046146bc565b601f6020526000908152604090205460ff1681565b610528610a46366004614796565b612d2f565b610528610a59366004614c6c565b612dc1565b6104e5610a6c3660046146bc565b600d602052600090815260409020546001600160a01b031681565b610528612f77565b610528610a9d36600461499e565b612f86565b610528610ab03660046146bc565b613016565b6001546104e5906001600160a01b031681565b610528610ad6366004614a9a565b613082565b6105a0610ae936600461496e565b602260209081526000928352604080842090915290825290205481565b610528610b143660046146bc565b61312e565b6105a0610b2736600461496e565b601160209081526000928352604080842090915290825290205481565b610528610b52366004614a9a565b6131ae565b610528610b6536600461472b565b6131ee565b6104e5610b783660046146bc565b60208052600090815260409020546001600160a01b031681565b610528610ba0366004614c9a565b613485565b6105a0610bb33660046146bc565b601a6020526000908152604090205481565b61052861359b565b610528610bdb3660046146bc565b6135aa565b610528610bee366004614bdd565b61361f565b610528610c01366004614d11565b613694565b610528610c14366004614dc5565b6136af565b6105a0610c27366004614796565b60146020526000908152604090205481565b610528610c47366004614df3565b61372d565b601e546105869060ff1681565b610528610c673660046146bc565b613973565b6007546001600160a01b03163314610c9f5760405162461bcd60e51b8152600401610c9690614e4f565b60405180910390fd5b60005b83811015610d3657828282818110610cbc57610cbc614e75565b9050602002016020810190610cd19190614a7d565b601c6000878785818110610ce757610ce7614e75565b9050602002016020810190610cfc91906146bc565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d2e81614ea1565b915050610ca2565b5050505050565b6007546001600160a01b03163314610d875760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420676f7665726e6f722160981b6044820152606401610c96565b600a55565b60005b8251811015610e3d57828181518110610daa57610daa614e75565b60200260200101516001600160a01b03166331279d3d33848481518110610dd357610dd3614e75565b60200260200101516040518363ffffffff1660e01b8152600401610df8929190614ebc565b600060405180830381600087803b158015610e1257600080fd5b505af1158015610e26573d6000803e3d6000fd5b505050508080610e3590614ea1565b915050610d8f565b505050565b600081815260146020526040902054819062093a80610e618142614ef6565b610e6b9190614f0a565b11610eb85760405162461bcd60e51b815260206004820152601e60248201527f544f4b454e5f414c52454144595f564f5445445f544849535f45504f434800006044820152606401610c96565b60005460405163430c208160e01b815233600482015260248101849052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b158015610f0757600080fd5b505afa158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f9190614f29565b610f8b5760405162461bcd60e51b815260206004820152601a60248201527f4e65697468657220617070726f766564206e6f72206f776e65720000000000006044820152606401610c96565b6000828152601460205260409020429055610fa5826139bf565b60005460405163c1f0fb9f60e01b815260048101849052620100009091046001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610ff057600080fd5b505af1158015611004573d6000803e3d6000fd5b505050505050565b601e5460ff168061102757506006546001600160a01b031633145b156111795760008181526012602090815260408083208054825181850281018501909352808352919290919083018282801561108c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161106e575b505050505090506000815190506000816001600160401b038111156110b3576110b36147af565b6040519080825280602002602001820160405280156110dc578160200160208202803683370190505b50905060005b828110156111695760116000868152602001908152602001600020600085838151811061111157611111614e75565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061114c5761114c614e75565b60209081029190910101528061116181614ea1565b9150506110e2565b50611175848483613c5d565b5050505b50565b600254611194906001600160a01b0316333084614311565b600b546000906111ac83670de0b6b3a7640000614f0a565b6111b69190614ef6565b905080156111d65780601960008282546111d09190614f46565b90915550505b6002546040518381526001600160a01b039091169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050565b3360009081526015602052604090205460ff1661124d5760405162461bcd60e51b8152600401610c9690614f5e565b81156112b757600054604051634c35bec560e11b815260048101849052620100009091046001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561129e57600080fd5b505af11580156112b2573d6000803e3d6000fd5b505050505b604051829033906001600160a01b038416907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290600090a45050565b600c5461130290600090612201565b565b6007546001600160a01b0316331461132e5760405162461bcd60e51b8152600401610c9690614e4f565b60005b81811015610e3d576016600084848481811061134f5761134f614e75565b905060200201602081019061136491906146bc565b6001600160a01b0316815260208101919091526040016000908120805460ff1916905583838381811061139957611399614e75565b90506020020160208101906113ae91906146bc565b6001600160a01b0316336001600160a01b03167fc8a125677224e7125b3579c5a10de1afe210f4c1c1d3c27be0f12b0c4a14c91560405160405180910390a4806113f781614ea1565b915050611331565b6007546001600160a01b031633146114295760405162461bcd60e51b8152600401610c9690614e4f565b60005b83811015610d365782828281811061144657611446614e75565b905060200201602081019061145b9190614a7d565b601d600087878581811061147157611471614e75565b905060200201602081019061148691906146bc565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806114b881614ea1565b91505061142c565b6007546001600160a01b031633146114ea5760405162461bcd60e51b8152600401610c9690614e4f565b60005b83811015610d365782828281811061150757611507614e75565b905060200201602081019061151c9190614a7d565b601f600087878581811061153257611532614e75565b905060200201602081019061154791906146bc565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061157981614ea1565b9150506114ed565b60005b81518110156115c1576115af8282815181106115a2576115a2614e75565b6020026020010151612d2f565b806115b981614ea1565b915050611584565b5050565b6007546001600160a01b031633146115ef5760405162461bcd60e51b8152600401610c9690614e4f565b601e805460ff1916911515919091179055565b60005b81518110156115c15761163082828151811061162357611623614e75565b6020026020010151611642565b8061163a81614ea1565b915050611605565b60185460ff16156116865760405162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b6044820152606401610c96565b6018805460ff191660011790556005546040805163ed29fc1160e01b815290516001600160a01b039092169163ed29fc11916004808201926020929091908290030181600087803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117129190614f81565b5061171c8161443b565b6001600160a01b038181166000818152602360209081526040808320429055601b90915290819020546002549151634cde602960e11b81529190931660048201526399bcc0529060240160206040518083038186803b15801561177e57600080fd5b505afa158015611792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b69190614f81565b811180156117d0575060006117ce62093a8083614ef6565b115b15611acd574281602460006117e862093a8085614f9a565b6117f29085614fae565b81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060008282546118329190614f46565b9091555050506001600160a01b0382166000908152601b60209081526040808320839055601f90915290205460ff1615156001141561193e5760025460065460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb90604401602060405180830381600087803b1580156118bb57600080fd5b505af11580156118cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f39190614f29565b506006546040518281526001600160a01b039091169033907f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b17906020015b60405180910390a3611acd565b6001600160a01b0382811660009081526020805260409020541615611a26576001600160a01b0382811660009081526020805260409081902054600254915163b66503cf60e01b81529183166004830152602482018490529091169063b66503cf90604401600060405180830381600087803b1580156119bd57600080fd5b505af11580156119d1573d6000803e3d6000fd5b5050506001600160a01b038084166000908152602080526040908190205490519116915033907f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b17906119319085815260200190565b60025460405163b66503cf60e01b81526001600160a01b039182166004820152602481018390529083169063b66503cf90604401600060405180830381600087803b158015611a7457600080fd5b505af1158015611a88573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506018805460ff19169055565b3360009081526015602052604090205460ff16611b0a5760405162461bcd60e51b8152600401610c9690614f5e565b3360009081526017602052604090205460ff16611b585760405162461bcd60e51b815260206004820152600c60248201526b6b696c6c656420676175676560a01b6044820152606401610c96565b8115611bc25760005460405163fbd3a29d60e01b815260048101849052620100009091046001600160a01b03169063fbd3a29d90602401600060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b505050505b604051829033906001600160a01b038416907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90600090a45050565b6111798161443b565b815b81811015610e3d57611c5b600d6000600c8481548110611c2b57611c2b614e75565b60009182526020808320909101546001600160a01b03908116845290830193909352604090910190205416611642565b80611c6581614ea1565b915050611c09565b6007546001600160a01b03163314611cc75760405162461bcd60e51b815260206004820152601860248201527f4e6f742050726f746f636f6c20466565732054616b65722100000000000000006044820152606401610c96565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60005460405163430c208160e01b815233600482015260248101839052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b158015611d3857600080fd5b505afa158015611d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d709190614f29565b611d7957600080fd5b60005b835181101561117557838181518110611d9757611d97614e75565b60200260200101516001600160a01b031663a7852afa83858481518110611dc057611dc0614e75565b60200260200101516040518363ffffffff1660e01b8152600401611de5929190614fc5565b600060405180830381600087803b158015611dff57600080fd5b505af1158015611e13573d6000803e3d6000fd5b505050508080611e2290614ea1565b915050611d7c565b600085815260146020526040902054859062093a80611e498142614ef6565b611e539190614f0a565b11611ea05760405162461bcd60e51b815260206004820152601e60248201527f544f4b454e5f414c52454144595f564f5445445f544849535f45504f434800006044820152606401610c96565b60005460405163430c208160e01b815233600482015260248101889052620100009091046001600160a01b03169063430c20819060440160206040518083038186803b158015611eef57600080fd5b505afa158015611f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f279190614f29565b611f3057600080fd5b838214611f3c57600080fd5b600086815260146020908152604091829020429055815186820281810183019093528681526110049289928991899182919085019084908082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250613c5d92505050565b815b81811015610e3d57600d6000600c8381548110611fdb57611fdb614e75565b60009182526020808320909101546001600160a01b039081168452908301939093526040918201812054825163d294f09360e01b81528351919094169363d294f093936004808301949193928390030190829087803b15801561203d57600080fd5b505af1158015612051573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120759190614fde565b5050808061208290614ea1565b915050611fbc565b806001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b1580156120c457600080fd5b505af11580156120d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3d9190614fde565b6008546001600160a01b0316331461214e5760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b595c99d95b98de4818dbdd5b98da5b605a1b6044820152606401610c96565b6001600160a01b03811660009081526017602052604090205460ff166121ab5760405162461bcd60e51b815260206004820152601260248201527119d85d59d948185b1c9958591e481919585960721b6044820152606401610c96565b6001600160a01b0381166000818152601760209081526040808320805460ff19169055601b909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b815b81811015610e3d57612255600d6000600c848154811061222557612225614e75565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541661443b565b8061225f81614ea1565b915050612203565b6008546001600160a01b031633146122b95760405162461bcd60e51b81526020600482015260156024820152741b9bdd08195b595c99d95b98de4818dbdd5b98da5b605a1b6044820152606401610c96565b6001600160a01b03811660009081526017602052604090205460ff16156123185760405162461bcd60e51b8152602060048201526013602482015272676175676520616c726561647920616c69766560681b6044820152606401610c96565b6001600160a01b038116600081815260176020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b6001600160a01b038181166000908152600d6020526040812054909116156123b75760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b6044820152606401610c96565b60408051600380825260808201909252600091602082016060803683370190505060015460405163e5e31b1360e01b81526001600160a01b0386811660048301529293506000929091169063e5e31b139060240160206040518083038186803b15801561242357600080fd5b505afa158015612437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245b9190614f29565b905060008082156125af57856001600160a01b0316639d63848a6040518163ffffffff1660e01b81526004016040805180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d89190615002565b809250819350505081846000815181106124f4576124f4614e75565b60200260200101906001600160a01b031690816001600160a01b031681525050808460018151811061252857612528614e75565b6001600160a01b03928316602091820292909201015260025481169083161480159061256257506002546001600160a01b03828116911614155b156125aa576002805485516001600160a01b03909116918691811061258957612589614e75565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6125f2565b60025484516001600160a01b039091169085906000906125d1576125d1614e75565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6007546001600160a01b0316331480159061261d57503360009081526025602052604090205460ff16155b1561282457826126585760405162461bcd60e51b81526020600482015260066024820152650857dc1bdbdb60d21b6044820152606401610c96565b6001600160a01b03821660009081526016602052604090205460ff16801561269857506001600160a01b03811660009081526016602052604090205460ff165b6126d35760405162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b6044820152606401610c96565b6001600160a01b0382166000908152601d602052604090205460ff168061271257506001600160a01b0381166000908152601d602052604090205460ff165b6127535760405162461bcd60e51b8152602060048201526012602482015271506f6f6c206e6f74204761756761626c652160701b6044820152606401610c96565b856001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561278c57600080fd5b505afa1580156127a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c49190614f29565b156128245760405162461bcd60e51b815260206004820152602a60248201527f4372656174696f6e206f6620537461626c652d706f6f6c204761756765206e6f6044820152697420616c6c6f7765642160b01b6064820152608401610c96565b6004805460405163897cd6b360e01b81526000926001600160a01b039092169163897cd6b39161285691899101614c59565b602060405180830381600087803b15801561287057600080fd5b505af1158015612884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a89190615031565b6040805160018082528183019092529192506000919060208083019080368337505060025482519293506001600160a01b0316918391506000906128ee576128ee614e75565b6001600160a01b03928316602091820292909201015260035460008054604051630f6f2d4760e11b8152919392831692631ede5a8e92612941928e9289926201000090920416908c90899060040161504e565b602060405180830381600087803b15801561295b57600080fd5b505af115801561296f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129939190615031565b60025460405163095ea7b360e01b81526001600160a01b038084166004830152600019602483015292935091169063095ea7b390604401602060405180830381600087803b1580156129e457600080fd5b505af11580156129f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1c9190614f29565b506001600160a01b038082166000818152600f602090815260408083208054868a166001600160a01b031991821617909155948e16808452600d83528184208054871686179055938352600e8252808320805490951690931790935560158352818120805460ff19908116600190811790925560179094529190208054909216179055612aa88161443b565b600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b038b169081179091556040513391907f31cdbca65889efbb92669ea36448e0bc97faaaa16d8ac81502b85dad8f9c2e4890612b2f908590889088908e9061508a565b60405180910390a398975050505050505050565b3360009081526015602052604090205460ff16612b725760405162461bcd60e51b8152600401610c9690614f5e565b3360009081526017602052604090205460ff16612bc05760405162461bcd60e51b815260206004820152600c60248201526b6b696c6c656420676175676560a01b6044820152606401610c96565b82336001600160a01b0316836001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d784604051612c0691815260200190565b60405180910390a4505050565b60126020528160005260406000208181548110612c2f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600c8181548110612c5b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600082516001600160401b03811115612c9257612c926147af565b604051908082528060200260200182016040528015612cbb578160200160208202803683370190505b50905060005b8351811015612d2857612cec848281518110612cdf57612cdf614e75565b6020026020010151612364565b828281518110612cfe57612cfe614e75565b6001600160a01b039092166020928302919091019091015280612d2081614ea1565b915050612cc1565b5092915050565b6007546001600160a01b03163314612d595760405162461bcd60e51b8152600401610c9690614e4f565b612d62816139bf565b60005460405163c1f0fb9f60e01b815260048101839052620100009091046001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015612dad57600080fd5b505af1158015610d36573d6000803e3d6000fd5b6007546001600160a01b03163314612deb5760405162461bcd60e51b8152600401610c9690614e4f565b6001600160a01b038083166000908152600d60209081526040808320548416808452600f8352928190205481516318160ddd60e01b815291519394169283926318160ddd9260048082019391829003018186803b158015612e4b57600080fd5b505afa158015612e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e839190614f81565b15612ee95760405162461bcd60e51b815260206004820152603060248201527f43616e6e6f74207377697463682062726962657320776869636820686176652060448201526f616374697665206465706f736974732160801b6064820152608401610c96565b60405163740ef7e760e11b81526001600160a01b03848116600483015283169063e81defce90602401600060405180830381600087803b158015612f2c57600080fd5b505af1158015612f40573d6000803e3d6000fd5b505050506001600160a01b039182166000908152600f6020526040902080546001600160a01b031916939092169290921790555050565b600c5461130290600090611fba565b6007546001600160a01b0316331480612fae57503360009081526025602052604090205460ff165b612fca5760405162461bcd60e51b8152600401610c9690614e4f565b60005b81811015610e3d57613004838383818110612fea57612fea614e75565b9050602002016020810190612fff91906146bc565b61453c565b8061300e81614ea1565b915050612fcd565b6007546001600160a01b031633146130605760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420676f7665726e6f722160981b6044820152606401610c96565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60005b81518110156115c1578181815181106130a0576130a0614e75565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b81526004016040805180830381600087803b1580156130e157600080fd5b505af11580156130f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131199190614fde565b5050808061312690614ea1565b915050613085565b6006546001600160a01b0316331461316e5760405162461bcd60e51b8152602060048201526003602482015262216d7360e81b6044820152606401610c96565b600780546001600160a01b039092166001600160a01b03199283168117909155600880548316821790556009805483168217905560068054909216179055565b60005b81518110156115c1576131dc8282815181106131cf576131cf614e75565b602002602001015161443b565b806131e681614ea1565b9150506131b1565b6007546001600160a01b031633146132185760405162461bcd60e51b8152600401610c9690614e4f565b60005b83811015610d365760006020600087878581811061323b5761323b614e75565b905060200201602081019061325091906146bc565b6001600160a01b03908116825260208201929092526040016000205416905080156132fd5760025460405163095ea7b360e01b81526001600160a01b038381166004830152600060248301529091169063095ea7b390604401602060405180830381600087803b1580156132c357600080fd5b505af11580156132d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132fb9190614f29565b505b83838381811061330f5761330f614e75565b905060200201602081019061332491906146bc565b6020600088888681811061333a5761333a614e75565b905060200201602081019061334f91906146bc565b6001600160a01b0390811682526020820192909252604001600090812080546001600160a01b0319169390921692909217905584848481811061339457613394614e75565b90506020020160208101906133a991906146bc565b6001600160a01b031614613472576002546001600160a01b031663095ea7b38585858181106133da576133da614e75565b90506020020160208101906133ef91906146bc565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526000196024820152604401602060405180830381600087803b15801561343857600080fd5b505af115801561344c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134709190614f29565b505b508061347d81614ea1565b91505061321b565b6005546001600160a01b031633146134cd5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74206d696e7465722160a81b6044820152606401610c96565b60005b835181101561350d576134fb8482815181106134ee576134ee614e75565b602002602001015161453c565b8061350581614ea1565b9150506134d0565b5060005b8251811015613576576001601d600085848151811061353257613532614e75565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061356e81614ea1565b915050613511565b50600580546001600160a01b0319166001600160a01b03929092169190911790555050565b600c5461130290600090611c07565b6008546001600160a01b031633146135fd5760405162461bcd60e51b81526020600482015260166024820152754e6f7420656d657267656e637920636f756e63696c2160501b6044820152606401610c96565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526015602052604090205460ff1661364e5760405162461bcd60e51b8152600401610c9690614f5e565b82336001600160a01b0316836001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb56784604051612c0691815260200190565b61369e8585610d8c565b8015610d3657610d36838383611ce9565b6007546001600160a01b031633146136d95760405162461bcd60e51b8152600401610c9690614e4f565b6001600160a01b038216600081815260256020526040808220805460ff191685151590811790915590519092917fe98ba766f842915dce367996787d5fdf9597d23b10098d489d93620442cfcbb991a35050565b600054610100900460ff161580801561374d5750600054600160ff909116105b806137675750303b158015613767575060005460ff166001145b6137ca5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610c96565b6000805460ff1916600117905580156137ed576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b0388811691820292909217909255600180546001600160a01b03191691871691909117905560408051637e062a3560e11b8152905163fc0c546a91600480820192602092909190829003018186803b15801561386357600080fd5b505afa158015613877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389b9190615031565b600280546001600160a01b03199081166001600160a01b03938416908117909255600380548216878516179055600480548216938616939093179092556005805433908416811790915560078054841682179055600880548416821790556009805484168217905560068054909316179091556000908152601d60205260409020805460ff191660011790558015610d36576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6007546001600160a01b0316331461399d5760405162461bcd60e51b8152600401610c9690614e4f565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152601260205260408082208054835492516331a9108f60e11b81526004810186905291939092909182916201000090046001600160a01b031690636352211e9060240160206040518083038186803b158015613a1e57600080fd5b505afa158015613a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a569190615031565b905060005b83811015613c21576000858281548110613a7757613a77614e75565b60009182526020808320909101548983526011825260408084206001600160a01b03909216808552919092529120549091508015613c0c576001600160a01b038083166000908152600d602052604090205416613ad3816145f0565b613adc8161443b565b6001600160a01b03831660009081526010602052604081208054849290613b04908490614fae565b909155505060008981526011602090815260408083206001600160a01b038716845290915281208054849290613b3b908490614fae565b90915550506001600160a01b038181166000908152600f602052604090819020549051630ced1b8360e31b815260048101859052602481018c90523360448201528783166064820152911690636768dc1890608401600060405180830381600087803b158015613baa57600080fd5b505af1158015613bbe573d6000803e3d6000fd5b505050508186613bce9190614f46565b9550887fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db83604051613c0291815260200190565b60405180910390a2505b50508080613c1990614ea1565b915050613a5b565b5081600b6000828254613c349190614fae565b9091555050600085815260136020908152604080832083905560129091528120610d3691614675565b60005b8251811015613da957601c6000848381518110613c7f57613c7f614e75565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615613cf35760405162461bcd60e51b815260206004820152601760248201527f5468697320706f6f6c20697320756e766f7461626c65210000000000000000006044820152606401610c96565b60176000600d6000868581518110613d0d57613d0d614e75565b6020908102919091018101516001600160a01b0390811683528282019390935260409182016000908120549093168452830193909352910190205460ff16613d975760405162461bcd60e51b815260206004820152601c60248201527f43616e7420766f746520666f72204b696c6c65642047617567657321000000006044820152606401610c96565b80613da181614ea1565b915050613c60565b50613db3836139bf565b8151600080546040516339f890b560e21b815260048101879052620100009091046001600160a01b03169063e7e242d49060240160206040518083038186803b158015613dff57600080fd5b505afa158015613e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e379190614f81565b600080546040516331a9108f60e11b81526004810189905292935090918291829182916201000090046001600160a01b031690636352211e9060240160206040518083038186803b158015613e8b57600080fd5b505afa158015613e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec39190615031565b905060005b86811015613f0957878181518110613ee257613ee2614e75565b602002602001015185613ef59190614f46565b945080613f0181614ea1565b915050613ec8565b5060005b86811015614234576000898281518110613f2957613f29614e75565b6020908102919091018101516001600160a01b038082166000908152600d84526040808220549092168082526015909452205490925060ff161561421f57600087898c8681518110613f7d57613f7d614e75565b6020026020010151613f8f9190614f0a565b613f999190614ef6565b60008e81526011602090815260408083206001600160a01b038816845290915290205490915015613fc957600080fd5b80613fd357600080fd5b613fdc826145f0565b613fe58261443b565b60008d815260126020908152604080832080546001810182559084528284200180546001600160a01b0319166001600160a01b038816908117909155835260109091528120805483929061403a908490614f46565b909155505060008d81526011602090815260408083206001600160a01b038716845290915281208054839290614071908490614f46565b92505081905550600f6000836001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b03166335da504d828f33896040518563ffffffff1660e01b8152600401614104949392919093845260208401929092526001600160a01b03908116604084015216606082015260800190565b600060405180830381600087803b15801561411e57600080fd5b505af1158015614132573d6000803e3d6000fd5b5050505080866141429190614f46565b955061414e8188614f46565b6040805133815260208101849052428183015290519198508e916001600160a01b0388811692908716917f494cb07910d432267ab6b7ac8f82cbd3955d7fe28c693d83e0ebbfeafa8c7f899181900360600190a4806022600062093a806141b58142614ef6565b6141bf9190614f0a565b815260200190815260200160002060008e87815181106141e1576141e1614e75565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546142189190614f46565b9091555050505b5050808061422c90614ea1565b915050613f0d565b50811561429f5760005460405163fd4a77f160e01b8152600481018b9052620100009091046001600160a01b03169063fd4a77f190602401600060405180830381600087803b15801561428657600080fd5b505af115801561429a573d6000803e3d6000fd5b505050505b82600b60008282546142b19190614f46565b90915550506000898152601360205260408120839055829060219062093a806142da8142614ef6565b6142e49190614f0a565b815260200190815260200160002060008282546143019190614f46565b9091555050505050505050505050565b6000846001600160a01b03163b116143625760405162461bcd60e51b81526020600482015260146024820152732b37ba32b91d1034b73b30b634b2103a37b5b2b760611b6044820152606401610c96565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916143c691906150c8565b6000604051808303816000865af19150503d8060008114614403576040519150601f19603f3d011682016040523d82523d6000602084013e614408565b606091505b50915091508180156144325750805115806144325750808060200190518101906144329190614f29565b61100457600080fd5b6001600160a01b038082166000908152600e6020908152604080832054909316808352601090915291902054801561451b576001600160a01b0383166000908152601a60205260408120805460195491829055916144998383614fae565b90508015611004576000670de0b6b3a76400006144b68387614f0a565b6144c09190614ef6565b6001600160a01b03881660009081526017602052604090205490915060ff1615614512576001600160a01b0387166000908152601b60205260408120805483929061450c908490614f46565b90915550505b50505050505050565b6019546001600160a01b0384166000908152601a6020526040902055505050565b6001600160a01b03811660009081526016602052604090205460ff161561459b5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481dda1a5d195b1a5cdd1959606a1b6044820152606401610c96565b6001600160a01b038116600081815260166020526040808220805460ff19166001908117909155905190929133917fc8a125677224e7125b3579c5a10de1afe210f4c1c1d3c27be0f12b0c4a14c9159190a450565b6001600160a01b03811660009081526023602052604090205480156115c1574261461d62093a8082614f9a565b6146279082614fae565b8211610e3d5760405162461bcd60e51b815260206004820152601760248201527f44697374726962757465206761756765206669727374210000000000000000006044820152606401610c96565b508054600082559060005260206000209081019061117991905b808211156146a3576000815560010161468f565b5090565b6001600160a01b038116811461117957600080fd5b6000602082840312156146ce57600080fd5b81356146d9816146a7565b9392505050565b60008083601f8401126146f257600080fd5b5081356001600160401b0381111561470957600080fd5b6020830191508360208260051b850101111561472457600080fd5b9250929050565b6000806000806040858703121561474157600080fd5b84356001600160401b038082111561475857600080fd5b614764888389016146e0565b9096509450602087013591508082111561477d57600080fd5b5061478a878288016146e0565b95989497509550505050565b6000602082840312156147a857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156147ed576147ed6147af565b604052919050565b60006001600160401b0382111561480e5761480e6147af565b5060051b60200190565b600082601f83011261482957600080fd5b8135602061483e614839836147f5565b6147c5565b82815260059290921b8401810191818101908684111561485d57600080fd5b8286015b84811015614881578035614874816146a7565b8352918301918301614861565b509695505050505050565b600082601f83011261489d57600080fd5b813560206148ad614839836147f5565b82815260059290921b840181019181810190868411156148cc57600080fd5b8286015b848110156148815780356001600160401b038111156148ef5760008081fd5b6148fd8986838b0101614818565b8452509183019183016148d0565b6000806040838503121561491e57600080fd5b82356001600160401b038082111561493557600080fd5b61494186838701614818565b9350602085013591508082111561495757600080fd5b506149648582860161488c565b9150509250929050565b6000806040838503121561498157600080fd5b823591506020830135614993816146a7565b809150509250929050565b600080602083850312156149b157600080fd5b82356001600160401b038111156149c757600080fd5b6149d3858286016146e0565b90969095509350505050565b600060208083850312156149f257600080fd5b82356001600160401b03811115614a0857600080fd5b8301601f81018513614a1957600080fd5b8035614a27614839826147f5565b81815260059190911b82018301908381019087831115614a4657600080fd5b928401925b82841015614a6457833582529284019290840190614a4b565b979650505050505050565b801515811461117957600080fd5b600060208284031215614a8f57600080fd5b81356146d981614a6f565b600060208284031215614aac57600080fd5b81356001600160401b03811115614ac257600080fd5b614ace84828501614818565b949350505050565b60008060408385031215614ae957600080fd5b50508035926020909101359150565b600080600060608486031215614b0d57600080fd5b83356001600160401b0380821115614b2457600080fd5b614b3087838801614818565b94506020860135915080821115614b4657600080fd5b50614b538682870161488c565b925050604084013590509250925092565b600080600080600060608688031215614b7c57600080fd5b8535945060208601356001600160401b0380821115614b9a57600080fd5b614ba689838a016146e0565b90965094506040880135915080821115614bbf57600080fd5b50614bcc888289016146e0565b969995985093965092949392505050565b600080600060608486031215614bf257600080fd5b833592506020840135614c04816146a7565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015614c4e5781516001600160a01b031687529582019590820190600101614c29565b509495945050505050565b6020815260006146d96020830184614c15565b60008060408385031215614c7f57600080fd5b8235614c8a816146a7565b91506020830135614993816146a7565b600080600060608486031215614caf57600080fd5b83356001600160401b0380821115614cc657600080fd5b614cd287838801614818565b94506020860135915080821115614ce857600080fd5b50614cf586828701614818565b9250506040840135614d06816146a7565b809150509250925092565b600080600080600060a08688031215614d2957600080fd5b85356001600160401b0380821115614d4057600080fd5b614d4c89838a01614818565b96506020880135915080821115614d6257600080fd5b614d6e89838a0161488c565b95506040880135915080821115614d8457600080fd5b614d9089838a01614818565b94506060880135915080821115614da657600080fd5b50614db38882890161488c565b95989497509295608001359392505050565b60008060408385031215614dd857600080fd5b8235614de3816146a7565b9150602083013561499381614a6f565b60008060008060808587031215614e0957600080fd5b8435614e14816146a7565b93506020850135614e24816146a7565b92506040850135614e34816146a7565b91506060850135614e44816146a7565b939692955090935050565b6020808252600c908201526b2737ba1033b7bb32b93737b960a11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614eb557614eb5614e8b565b5060010190565b6001600160a01b0383168152604060208201819052600090614ace90830184614c15565b634e487b7160e01b600052601260045260246000fd5b600082614f0557614f05614ee0565b500490565b6000816000190483118215151615614f2457614f24614e8b565b500290565b600060208284031215614f3b57600080fd5b81516146d981614a6f565b60008219821115614f5957614f59614e8b565b500190565b6020808252600990820152686e6f7420676175676560b81b604082015260600190565b600060208284031215614f9357600080fd5b5051919050565b600082614fa957614fa9614ee0565b500690565b600082821015614fc057614fc0614e8b565b500390565b828152604060208201526000614ace6040830184614c15565b60008060408385031215614ff157600080fd5b505080516020909101519092909150565b6000806040838503121561501557600080fd5b8251615020816146a7565b6020840151909250614993816146a7565b60006020828403121561504357600080fd5b81516146d9816146a7565b6001600160a01b038681168252858116602083015284166040820152821515606082015260a060808201819052600090614a6490830184614c15565b6001600160a01b038581168252841660208201526080604082018190526000906150b690830185614c15565b8281036060840152614a648185614c15565b6000825160005b818110156150e957602081860181015185830152016150cf565b818111156150f8576000828501525b50919091019291505056fea26469706673582212206ff3930cb2e43c6d7591d450b74f3f07c626457877aedf425323ea6236b2cc0f64736f6c63430008090033
Deployed Bytecode Sourcemap
23143:24764:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24036:47;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;24036:47:0;;;;;;-1:-1:-1;;;;;566:32:1;;;548:51;;536:2;521:18;24036:47:0;;;;;;;;23499:21;;;;;-1:-1:-1;;;;;23499:21:0;;;45690:258;;;;;;:::i;:::-;;:::i;:::-;;23597:23;;;;;-1:-1:-1;;;;;23597:23:0;;;23770:32;;;;;-1:-1:-1;;;;;23770:32:0;;;30243:158;;;;;;:::i;:::-;;:::i;24694:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2107:14:1;;2100:22;2082:41;;2070:2;2055:18;24694:39:0;1942:187:1;23229:38:0;;23261:6;23229:38;;;;;2280:25:1;;;2268:2;2253:18;23229:38:0;2134:177:1;39103:85:0;39168:5;:12;39103:85;;41281:222;;;;;;:::i;:::-;;:::i;26163:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;24845:17;;;;;;26827:47;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30409:300;;;;;;:::i;:::-;;:::i;32063:736::-;;;;;;:::i;:::-;;:::i;23465:27::-;;;;;-1:-1:-1;;;;;23465:27:0;;;24642:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39196:373;;;;;;:::i;:::-;;:::i;23809:34::-;;;;;;24921:41;;;;;;:::i;:::-;;;;;;;;;;;;;;38646:244;;;;;;:::i;:::-;;:::i;26082:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;23405:19;;;;;-1:-1:-1;;;;;23405:19:0;;;39917:80;;;:::i;45173:307::-;;;;;;:::i;:::-;;:::i;45956:250::-;;;;;;:::i;:::-;;:::i;46214:245::-;;;;;;:::i;:::-;;:::i;30717:139::-;;;;;;:::i;:::-;;:::i;46973:127::-;;;;;;:::i;:::-;;:::i;44132:164::-;;;;;;:::i;:::-;;:::i;42731:1137::-;;;;;;:::i;:::-;;:::i;23431:27::-;;;;;-1:-1:-1;;;;;23431:27:0;;;38031:349;;;;;;:::i;:::-;;:::i;40005:83::-;;;;;;:::i;:::-;;:::i;43961:163::-;;;;;;:::i;:::-;;:::i;30071:164::-;;;;;;:::i;:::-;;:::i;41511:320::-;;;;;;:::i;:::-;;:::i;23730:31::-;;;;;-1:-1:-1;;;;;23730:31:0;;;24402:40;;;;;;:::i;:::-;;;;;;;;;;;;;;34979:351;;;;;;:::i;:::-;;:::i;25897:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;42455:175;;;;;;:::i;:::-;;:::i;25055:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24971:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23332:18;;;;;;;;-1:-1:-1;;;;;23332:18:0;;;42169:94;;;;;;:::i;:::-;;:::i;23852:23::-;;;;;;37473:285;;;;;;:::i;:::-;;:::i;39748:161::-;;;;;;:::i;:::-;;:::i;37766:257::-;;;;;;:::i;:::-;;:::i;23529:17::-;;;;;-1:-1:-1;;;;;23529:17:0;;;35338:1831;;;;;;:::i;:::-;;:::i;38388:250::-;;;;;;:::i;:::-;;:::i;24182:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;24337;;;;;;:::i;:::-;;:::i;24107:41::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;24107:41:0;;;24596:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23907:22;;;;;;:::i;:::-;;:::i;37177:288::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25766:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30864:185;;;;;;:::i;:::-;;:::i;47329:362::-;;;;;;:::i;:::-;;:::i;23971:41::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;23971:41:0;;;42638:85;;;:::i;44909:256::-;;;;;;:::i;:::-;;:::i;29734:145::-;;;;;;:::i;:::-;;:::i;23357:22::-;;;;;-1:-1:-1;;;;;23357:22:0;;;42271:176;;;;;;:::i;:::-;;:::i;25975:66::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;45488:194;;;;;;:::i;:::-;;:::i;24249:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;39577:163;;;;;;:::i;:::-;;:::i;46467:498::-;;;;;;:::i;:::-;;:::i;25817:47::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;25817:47:0;;;29320:406;;;;;;:::i;:::-;;:::i;24871:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;43876:77;;;:::i;29887:176::-;;;;;;:::i;:::-;;:::i;38898:197::-;;;;;;:::i;:::-;;:::i;41839:322::-;;;;;;:::i;:::-;;:::i;47699:203::-;;;;;;:::i;:::-;;:::i;24488:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28569:518;;;;;;:::i;:::-;;:::i;25162:19::-;;;;;;;;;47108:128;;;;;;:::i;:::-;;:::i;45690:258::-;45806:8;;-1:-1:-1;;;;;45806:8:0;45792:10;:22;45784:47;;;;-1:-1:-1;;;45784:47:0;;;;;;;:::i;:::-;;;;;;;;;45847:6;45842:99;45859:17;;;45842:99;;;45924:2;;45927:1;45924:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;45898:9;:23;45910:6;;45917:1;45910:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45898:23:0;;;;;;;;;;;;-1:-1:-1;45898:23:0;:31;;-1:-1:-1;;45898:31:0;;;;;;;;;;45878:3;;;;:::i;:::-;;;;45842:99;;;;45690:258;;;;:::o;30243:158::-;30328:8;;-1:-1:-1;;;;;30328:8:0;30314:10;:22;30306:48;;;;-1:-1:-1;;;30306:48:0;;15618:2:1;30306:48:0;;;15600:21:1;15657:2;15637:18;;;15630:30;-1:-1:-1;;;15676:18:1;;;15669:43;15729:18;;30306:48:0;15416:337:1;30306:48:0;30365:22;:28;30243:158::o;41281:222::-;41380:6;41375:121;41396:7;:14;41392:1;:18;41375:121;;;41439:7;41447:1;41439:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;41432:28:0;;41461:10;41473:7;41481:1;41473:10;;;;;;;;:::i;:::-;;;;;;;41432:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41412:3;;;;;:::i;:::-;;;;41375:121;;;;41281:222;;:::o;30409:300::-;29238:19;;;;:9;:19;;;;;;30461:8;;23261:6;29197:26;23261:6;29197:15;:26;:::i;:::-;29196:39;;;;:::i;:::-;:61;29188:104;;;;-1:-1:-1;;;29188:104:0;;16753:2:1;29188:104:0;;;16735:21:1;16792:2;16772:18;;;16765:30;16831:32;16811:18;;;16804:60;16881:18;;29188:104:0;16551:354:1;29188:104:0;30504:3:::1;::::0;30490:58:::1;::::0;-1:-1:-1;;;30490:58:0;;30527:10:::1;30490:58;::::0;::::1;17084:51:1::0;17151:18;;;17144:34;;;30504:3:0;;;::::1;-1:-1:-1::0;;;;;30504:3:0::1;::::0;30490:36:::1;::::0;17057:18:1;;30490:58:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30482:97;;;::::0;-1:-1:-1;;;30482:97:0;;17641:2:1;30482:97:0::1;::::0;::::1;17623:21:1::0;17680:2;17660:18;;;17653:30;17719:28;17699:18;;;17692:56;17765:18;;30482:97:0::1;17439:350:1::0;30482:97:0::1;30590:19;::::0;;;:9:::1;:19;::::0;;;;30612:15:::1;30590:37:::0;;30638:16:::1;30600:8:::0;30638:6:::1;:16::i;:::-;30679:3;::::0;30665:36:::1;::::0;-1:-1:-1;;;30665:36:0;;::::1;::::0;::::1;2280:25:1::0;;;30679:3:0;;;::::1;-1:-1:-1::0;;;;;30679:3:0::1;::::0;30665:26:::1;::::0;2253:18:1;;30665:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30409:300:::0;;:::o;32063:736::-;32366:7;;;;;:27;;-1:-1:-1;32391:2:0;;-1:-1:-1;;;;;32391:2:0;32377:10;:16;32366:27;32363:403;;;32410:26;32439:18;;;:8;:18;;;;;;;;32410:47;;;;;;;;;;;;;;;;;;;32439:18;;32410:47;;;32439:18;32410:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32410:47:0;;;;;;;;;;;;;;;;;;;;;;;32472:13;32488:9;:16;32472:32;;32519:25;32561:8;-1:-1:-1;;;;;32547:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32547:23:0;;32519:51;;32592:6;32587:115;32608:8;32604:1;:12;32587:115;;;32657:5;:15;32663:8;32657:15;;;;;;;;;;;:29;32673:9;32683:1;32673:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32657:29:0;-1:-1:-1;;;;;32657:29:0;;;;;;;;;;;;;32643:8;32652:1;32643:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;32618:4;;;;:::i;:::-;;;;32587:115;;;;32718:36;32724:8;32734:9;32745:8;32718:5;:36::i;:::-;32395:371;;;32363:403;32063:736;:::o;39196:373::-;39275:4;;39257:58;;-1:-1:-1;;;;;39275:4:0;39281:10;39301:4;39308:6;39257:17;:58::i;:::-;39385:11;;39352:14;;39369:13;:6;39378:4;39369:13;:::i;:::-;:27;;;;:::i;:::-;39352:44;-1:-1:-1;39454:10:0;;39450:58;;39490:6;39481:5;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;39450:58:0;39548:4;;39523:38;;2280:25:1;;;-1:-1:-1;;;;;39548:4:0;;;;39536:10;;39523:38;;2268:2:1;2253:18;39523:38:0;;;;;;;39246:323;39196:373;:::o;38646:244::-;38743:10;38735:19;;;;:7;:19;;;;;;;;38727:41;;;;-1:-1:-1;;;38727:41:0;;;;;;;:::i;:::-;38783:11;;38779:51;;38810:3;;38796:34;;-1:-1:-1;;;38796:34:0;;;;;2280:25:1;;;38810:3:0;;;;-1:-1:-1;;;;;38810:3:0;;38796:25;;2253:18:1;;38796:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38779:51;38846:36;;38874:7;;38862:10;;-1:-1:-1;;;;;38846:36:0;;;;;;;;38646:244;;:::o;39917:80::-;39976:5;:12;39958:31;;39973:1;;39958:14;:31::i;:::-;39917:80::o;45173:307::-;45272:8;;-1:-1:-1;;;;;45272:8:0;45258:10;:22;45250:47;;;;-1:-1:-1;;;45250:47:0;;;;;;;:::i;:::-;45313:6;45308:165;45325:18;;;45308:165;;;45372:13;:25;45386:7;;45394:1;45386:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45372:25:0;;;;;;;;;;;;-1:-1:-1;45372:25:0;;;45365:32;;-1:-1:-1;;45365:32:0;;;45441:7;;45449:1;45441:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45417:42:0;45429:10;-1:-1:-1;;;;;45417:42:0;;;;;;;;;;;45345:3;;;;:::i;:::-;;;;45308:165;;45956:250;46066:8;;-1:-1:-1;;;;;46066:8:0;46052:10;:22;46044:47;;;;-1:-1:-1;;;46044:47:0;;;;;;;:::i;:::-;46107:6;46102:97;46119:17;;;46102:97;;;46182:2;;46185:1;46182:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46158:8;:21;46168:6;;46175:1;46168:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46158:21:0;;;;;;;;;;;;-1:-1:-1;46158:21:0;:29;;-1:-1:-1;;46158:29:0;;;;;;;;;;46138:3;;;;:::i;:::-;;;;46102:97;;46214:245;46323:8;;-1:-1:-1;;;;;46323:8:0;46309:10;:22;46301:47;;;;-1:-1:-1;;;46301:47:0;;;;;;;:::i;:::-;46364:6;46359:93;46376:13;;;46359:93;;;46435:2;;46438:1;46435:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46411:12;:21;46425:2;;46428:1;46425:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46411:21:0;;;;;;;;;;;;-1:-1:-1;46411:21:0;:29;;-1:-1:-1;;46411:29:0;;;;;;;;;;46391:3;;;;:::i;:::-;;;;46359:93;;30717:139;30781:6;30777:72;30792:4;:11;30790:1;:13;30777:72;;;30818:22;30832:4;30837:1;30832:7;;;;;;;;:::i;:::-;;;;;;;30818:13;:22::i;:::-;30804:3;;;;:::i;:::-;;;;30777:72;;;;30717:139;:::o;46973:127::-;47044:8;;-1:-1:-1;;;;;47044:8:0;47030:10;:22;47022:47;;;;-1:-1:-1;;;47022:47:0;;;;;;;:::i;:::-;47080:7;:12;;-1:-1:-1;;47080:12:0;;;;;;;;;;46973:127::o;44132:164::-;44203:6;44198:91;44219:7;:14;44215:1;:18;44198:91;;;44255:22;44266:7;44274:1;44266:10;;;;;;;;:::i;:::-;;;;;;;44255;:22::i;:::-;44235:3;;;;:::i;:::-;;;;44198:91;;42731:1137;28435:7;;;;28434:8;28426:35;;;;-1:-1:-1;;;28426:35:0;;18466:2:1;28426:35:0;;;18448:21:1;18505:2;18485:18;;;18478:30;-1:-1:-1;;;18524:18:1;;;18517:44;18578:18;;28426:35:0;18264:338:1;28426:35:0;28472:7;:14;;-1:-1:-1;;28472:14:0;28482:4;28472:14;;;42798:6:::1;::::0;42790:31:::1;::::0;;-1:-1:-1;;;42790:31:0;;;;-1:-1:-1;;;;;42798:6:0;;::::1;::::0;42790:29:::1;::::0;:31:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;28472:7;42798:6;42790:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42832:18;42843:6;42832:10;:18::i;:::-;-1:-1:-1::0;;;;;42900:24:0;;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;42927:15:::1;42900:42:::0;;42971:9:::1;:17:::0;;;;;;;;43036:4:::1;::::0;43016:25;;-1:-1:-1;;;43016:25:0;;43036:4;;;::::1;43016:25;::::0;::::1;548:51:1::0;43016:19:0::1;::::0;521:18:1;;43016:25:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43003:10;:38;:67;;;;-1:-1:-1::0;43069:1:0::1;43045:21;23261:6;43045:10:::0;:21:::1;:::i;:::-;:25;43003:67;42999:862;;;43109:15;43190:10:::0;43137:13:::1;43097:9;43160:13;43167:6;43109:15:::0;43160:13:::1;:::i;:::-;43152:22;::::0;:4;:22:::1;:::i;:::-;43137:39;;;;;;;;;;;:49;43178:6;-1:-1:-1::0;;;;;43137:49:0::1;-1:-1:-1::0;;;;;43137:49:0::1;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;43227:17:0;::::1;43247:1;43227:17:::0;;;:9:::1;:17;::::0;;;;;;;:21;;;43266:12:::1;:20:::0;;;;;;::::1;;:28;;:20:::0;:28:::1;43263:587;;;43319:4;::::0;43334:2:::1;::::0;43312:37:::1;::::0;-1:-1:-1;;;43312:37:0;;-1:-1:-1;;;;;43334:2:0;;::::1;43312:37;::::0;::::1;17084:51:1::0;17151:18;;;17144:34;;;43319:4:0;::::1;::::0;43312:21:::1;::::0;17057:18:1;;43312:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;43396:2:0::1;::::0;43367:44:::1;::::0;2280:25:1;;;-1:-1:-1;;;;;43396:2:0;;::::1;::::0;43384:10:::1;::::0;43367:44:::1;::::0;2268:2:1;2253:18;43367:44:0::1;;;;;;;;43263:587;;;-1:-1:-1::0;;;;;43462:20:0;;::::1;43494:1;43462:20:::0;;;:12:::1;:20:::0;;;;;;::::1;:34:::0;43459:376:::1;;-1:-1:-1::0;;;;;43519:20:0;;::::1;;::::0;;;:12:::1;:20:::0;;;;;;;;43560:4:::1;::::0;43512:65;;-1:-1:-1;;;43512:65:0;;43560:4;;::::1;43512:65;::::0;::::1;17084:51:1::0;17151:18;;;17144:34;;;43519:20:0;;::::1;::::0;43512:47:::1;::::0;17057:18:1;;43512:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;43625:20:0;;::::1;;::::0;;;:12:::1;:20:::0;;;;;;;;43596:62;;43625:20;::::1;::::0;-1:-1:-1;43613:10:0::1;::::0;43596:62:::1;::::0;::::1;::::0;43647:10;2280:25:1;;2268:2;2253:18;;2134:177;43459:376:0::1;43737:4;::::0;43703:51:::1;::::0;-1:-1:-1;;;43703:51:0;;-1:-1:-1;;;;;43737:4:0;;::::1;43703:51;::::0;::::1;17084::1::0;17151:18;;;17144:34;;;43703:33:0;;::::1;::::0;::::1;::::0;17057:18:1;;43703:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43773:48:0::1;::::0;2280:25:1;;;-1:-1:-1;;;;;43773:48:0;::::1;::::0;-1:-1:-1;43790:10:0::1;::::0;-1:-1:-1;43773:48:0::1;::::0;2268:2:1;2253:18;43773:48:0::1;;;;;;;43459:376;-1:-1:-1::0;;28509:7:0;:15;;-1:-1:-1;;28509:15:0;;;42731:1137::o;38031:349::-;38126:10;38118:19;;;;:7;:19;;;;;;;;38110:41;;;;-1:-1:-1;;;38110:41:0;;;;;;;:::i;:::-;38178:10;38170:19;;;;:7;:19;;;;;;;;38162:44;;;;-1:-1:-1;;;38162:44:0;;19245:2:1;38162:44:0;;;19227:21:1;19284:2;19264:18;;;19257:30;-1:-1:-1;;;19303:18:1;;;19296:42;19355:18;;38162:44:0;19043:336:1;38162:44:0;38273:11;;38269:51;;38300:3;;38286:34;;-1:-1:-1;;;38286:34:0;;;;;2280:25:1;;;38300:3:0;;;;-1:-1:-1;;;;;38300:3:0;;38286:25;;2253:18:1;;38286:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38269:51;38336:36;;38364:7;;38352:10;;-1:-1:-1;;;;;38336:36:0;;;;;;;;38031:349;;:::o;40005:83::-;40062:18;40073:6;40062:10;:18::i;43961:163::-;44038:5;44024:93;44049:6;44045:1;:10;44024:93;;;44077:28;44088:6;:16;44095:5;44101:1;44095:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;44095:8:0;;;44088:16;;;;;;;;;;;;;;;;;44077:10;:28::i;:::-;44057:3;;;;:::i;:::-;;;;44024:93;;30071:164;30155:8;;-1:-1:-1;;;;;30155:8:0;30141:10;:22;30133:59;;;;-1:-1:-1;;;30133:59:0;;19586:2:1;30133:59:0;;;19568:21:1;19625:2;19605:18;;;19598:30;19664:26;19644:18;;;19637:54;19708:18;;30133:59:0;19384:348:1;30133:59:0;30203:17;:24;;-1:-1:-1;;;;;;30203:24:0;-1:-1:-1;;;;;30203:24:0;;;;;;;;;;30071:164::o;41511:320::-;41641:3;;41627:58;;-1:-1:-1;;;41627:58:0;;41664:10;41627:58;;;17084:51:1;17151:18;;;17144:34;;;41641:3:0;;;;-1:-1:-1;;;;;41641:3:0;;41627:36;;17057:18:1;;41627:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41619:67;;;;;;41702:6;41697:127;41718:7;:14;41714:1;:18;41697:127;;;41761:7;41769:1;41761:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;41754:36:0;;41791:8;41801:7;41809:1;41801:10;;;;;;;;:::i;:::-;;;;;;;41754:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41734:3;;;;;:::i;:::-;;;;41697:127;;34979:351;29238:19;;;;:9;:19;;;;;;35088:7;;23261:6;29197:26;23261:6;29197:15;:26;:::i;:::-;29196:39;;;;:::i;:::-;:61;29188:104;;;;-1:-1:-1;;;29188:104:0;;16753:2:1;29188:104:0;;;16735:21:1;16792:2;16772:18;;;16765:30;16831:32;16811:18;;;16804:60;16881:18;;29188:104:0;16551:354:1;29188:104:0;35130:3:::1;::::0;35116:57:::1;::::0;-1:-1:-1;;;35116:57:0;;35153:10:::1;35116:57;::::0;::::1;17084:51:1::0;17151:18;;;17144:34;;;35130:3:0;;;::::1;-1:-1:-1::0;;;;;35130:3:0::1;::::0;35116:36:::1;::::0;17057:18:1;;35116:57:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35108:66;;;::::0;::::1;;35193:35:::0;;::::1;35185:44;;;::::0;::::1;;35240:18;::::0;;;:9:::1;:18;::::0;;;;;;;;35261:15:::1;35240:36:::0;;35287:35;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;35250:7;;35302:9;;;;;;35287:35;;::::1;::::0;35302:9;;35287:35;35302:9;35287:35;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;35287:35:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;35313:8:0;;-1:-1:-1;35313:8:0;;;;35287:35;::::1;::::0;35313:8;;35287:35;35313:8;35287:35;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;35287:5:0::1;::::0;-1:-1:-1;;;35287:35:0:i:1;42455:175::-:0;42536:5;42522:101;42547:6;42543:1;:10;42522:101;;;42582:6;:16;42589:5;42595:1;42589:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42589:8:0;;;42582:16;;;;;;;;;;;;;;;;42575:36;;-1:-1:-1;;;42575:36:0;;;;42582:16;;;;;42575:34;;:36;;;;;42582:16;;42575:36;;;;;;;;42582:16;42575:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42555:3;;;;;:::i;:::-;;;;42522:101;;42169:94;42236:6;-1:-1:-1;;;;;42229:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37473:285::-;37550:16;;-1:-1:-1;;;;;37550:16:0;37536:10;:30;37528:64;;;;-1:-1:-1;;;37528:64:0;;20526:2:1;37528:64:0;;;20508:21:1;20565:2;20545:18;;;20538:30;-1:-1:-1;;;20584:18:1;;;20577:51;20645:18;;37528:64:0;20324:345:1;37528:64:0;-1:-1:-1;;;;;37611:15:0;;;;;;:7;:15;;;;;;;;37603:46;;;;-1:-1:-1;;;37603:46:0;;20876:2:1;37603:46:0;;;20858:21:1;20915:2;20895:18;;;20888:30;-1:-1:-1;;;20934:18:1;;;20927:48;20992:18;;37603:46:0;20674:342:1;37603:46:0;-1:-1:-1;;;;;37660:15:0;;37678:5;37660:15;;;:7;:15;;;;;;;;:23;;-1:-1:-1;;37660:23:0;;;37694:9;:17;;;;;;:21;;;37731:19;;;37678:5;37731:19;37473:285;:::o;39748:161::-;39826:5;39812:90;39837:3;39833:1;:7;39812:90;;;39862:28;39873:6;:16;39880:5;39886:1;39880:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39880:8:0;;;39873:16;;;;;;;;;;;;;;;;;39862:10;:28::i;:::-;39842:3;;;;:::i;:::-;;;;39812:90;;37766:257;37845:16;;-1:-1:-1;;;;;37845:16:0;37831:10;:30;37823:64;;;;-1:-1:-1;;;37823:64:0;;20526:2:1;37823:64:0;;;20508:21:1;20565:2;20545:18;;;20538:30;-1:-1:-1;;;20584:18:1;;;20577:51;20645:18;;37823:64:0;20324:345:1;37823:64:0;-1:-1:-1;;;;;37907:15:0;;;;;;:7;:15;;;;;;;;37906:16;37898:48;;;;-1:-1:-1;;;37898:48:0;;21223:2:1;37898:48:0;;;21205:21:1;21262:2;21242:18;;;21235:30;-1:-1:-1;;;21281:18:1;;;21274:49;21340:18;;37898:48:0;21021:343:1;37898:48:0;-1:-1:-1;;;;;37957:15:0;;;;;;:7;:15;;;;;;:22;;-1:-1:-1;;37957:22:0;37975:4;37957:22;;;37995:20;;;37957:15;37995:20;37766:257;:::o;35338:1831::-;-1:-1:-1;;;;;35418:13:0;;;35390:7;35418:13;;;:6;:13;;;;;;35390:7;;35418:13;:29;35410:48;;;;-1:-1:-1;;;35410:48:0;;21571:2:1;35410:48:0;;;21553:21:1;21610:1;21590:18;;;21583:29;-1:-1:-1;;;21628:18:1;;;21621:36;21674:18;;35410:48:0;21369:329:1;35410:48:0;35503:16;;;35517:1;35503:16;;;;;;;;;35469:31;;35503:16;;;;;;;;;;-1:-1:-1;;35557:7:0;;35544:35;;-1:-1:-1;;;35544:35:0;;-1:-1:-1;;;;;566:32:1;;;35544:35:0;;;548:51:1;35469:50:0;;-1:-1:-1;35530:11:0;;35557:7;;;;35544:28;;521:18:1;;35544:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35530:49;;35590:14;35615;35646:6;35642:333;;;35694:5;-1:-1:-1;;;;;35688:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35669:40;;;;;;;;35744:6;35724:14;35739:1;35724:17;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1;;;;;35724:26:0;;;-1:-1:-1;;;;;35724:26:0;;;;;35785:6;35765:14;35780:1;35765:17;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35765:26:0;;;:17;;;;;;;;;:26;35810:4;;;;:14;;;;;;;:32;;-1:-1:-1;35828:4:0;;-1:-1:-1;;;;;35828:14:0;;;:4;;:14;;35810:32;35806:95;;;35881:4;;;35861:17;;-1:-1:-1;;;;;35881:4:0;;;;35861:14;;:17;;;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;35861:24:0;;;-1:-1:-1;;;;;35861:24:0;;;;;35806:95;35642:333;;;35959:4;;35939:17;;-1:-1:-1;;;;;35959:4:0;;;;35939:14;;35959:4;;35939:17;;;;:::i;:::-;;;;;;:24;-1:-1:-1;;;;;35939:24:0;;;-1:-1:-1;;;;;35939:24:0;;;;;35642:333;36017:8;;-1:-1:-1;;;;;36017:8:0;36003:10;:22;;;;36002:78;;-1:-1:-1;36059:10:0;36041:29;;;;:17;:29;;;;;;;;:38;36002:78;35987:474;;;36172:6;36164:25;;;;-1:-1:-1;;;36164:25:0;;22295:2:1;36164:25:0;;;22277:21:1;22334:1;22314:18;;;22307:29;-1:-1:-1;;;22352:18:1;;;22345:36;22398:18;;36164:25:0;22093:329:1;36164:25:0;-1:-1:-1;;;;;36212:21:0;;;;;;:13;:21;;;;;;;;:46;;;;-1:-1:-1;;;;;;36237:21:0;;;;;;:13;:21;;;;;;;;36212:46;36204:71;;;;-1:-1:-1;;;36204:71:0;;22629:2:1;36204:71:0;;;22611:21:1;22668:2;22648:18;;;22641:30;-1:-1:-1;;;22687:18:1;;;22680:42;22739:18;;36204:71:0;22427:336:1;36204:71:0;-1:-1:-1;;;;;36295:16:0;;;;;;:8;:16;;;;;;;;;:36;;-1:-1:-1;;;;;;36315:16:0;;;;;;:8;:16;;;;;;;;36295:36;36287:67;;;;-1:-1:-1;;;36287:67:0;;22970:2:1;36287:67:0;;;22952:21:1;23009:2;22989:18;;;22982:30;-1:-1:-1;;;23028:18:1;;;23021:48;23086:18;;36287:67:0;22768:342:1;36287:67:0;36380:5;-1:-1:-1;;;;;36374:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;36366:83;;;;-1:-1:-1;;;36366:83:0;;23317:2:1;36366:83:0;;;23299:21:1;23356:2;23336:18;;;23329:30;23395:34;23375:18;;;23368:62;-1:-1:-1;;;23446:18:1;;;23439:40;23496:19;;36366:83:0;23115:406:1;36366:83:0;36504:12;;;36490:55;;-1:-1:-1;;;36490:55:0;;36473:14;;-1:-1:-1;;;;;36504:12:0;;;;36490:39;;:55;;36530:14;;36490:55;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36590:16;;;36604:1;36590:16;;;;;;;;;36473:72;;-1:-1:-1;36558:29:0;;36590:16;;;;;;;;;;-1:-1:-1;;36635:4:0;;36617:15;;;;-1:-1:-1;;;;;;36635:4:0;;36617:15;;-1:-1:-1;36635:4:0;;36617:15;;;;:::i;:::-;-1:-1:-1;;;;;36617:22:0;;;:15;;;;;;;;;:22;36681:12;;36650:14;36722:3;;36667:81;;-1:-1:-1;;;36667:81:0;;36650:14;;36681:12;;;;36667:39;;:81;;36707:5;;36714:6;;36722:3;;;;;;36727:6;;36735:12;;36667:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36770:4;;36763:44;;-1:-1:-1;;;36763:44:0;;-1:-1:-1;;;;;17102:32:1;;;36763:44:0;;;17084:51:1;-1:-1:-1;;17151:18:1;;;17144:34;36650:98:0;;-1:-1:-1;36770:4:0;;;36763:20;;17057:18:1;;36763:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;36818:14:0;;;;;;;:6;:14;;;;;;;;:23;;;;;-1:-1:-1;;;;;;36818:23:0;;;;;;;36852:13;;;;;;:6;:13;;;;;:22;;;;;;;;36885:20;;;:12;:20;;;;;:28;;;;;;;;;;;36924:7;:15;;;;;:22;;-1:-1:-1;;36924:22:0;;;36818:23;36924:22;;;;;;36957:7;:15;;;;;;:22;;;;;;;;36990:18;36825:6;36990:10;:18::i;:::-;37019:5;:17;;;;;;;-1:-1:-1;37019:17:0;;;;;;;;-1:-1:-1;;;;;;37019:17:0;-1:-1:-1;;;;;37019:17:0;;;;;;;;37052:85;;37096:10;;37019:17;37052:85;;;;37080:6;;37088;;37108:12;;37122:14;;37052:85;:::i;:::-;;;;;;;;37155:6;35338:1831;-1:-1:-1;;;;;;;;35338:1831:0:o;38388:250::-;38489:10;38481:19;;;;:7;:19;;;;;;;;38473:41;;;;-1:-1:-1;;;38473:41:0;;;;;;;:::i;:::-;38541:10;38533:19;;;;:7;:19;;;;;;;;38525:44;;;;-1:-1:-1;;;38525:44:0;;19245:2:1;38525:44:0;;;19227:21:1;19284:2;19264:18;;;19257:30;-1:-1:-1;;;19303:18:1;;;19296:42;19355:18;;38525:44:0;19043:336:1;38525:44:0;38614:7;38602:10;-1:-1:-1;;;;;38585:45:0;38593:7;-1:-1:-1;;;;;38585:45:0;;38623:6;38585:45;;;;2280:25:1;;2268:2;2253:18;;2134:177;38585:45:0;;;;;;;;38388:250;;;:::o;24337:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24337:42:0;;-1:-1:-1;24337:42:0;;-1:-1:-1;24337:42:0:o;23907:22::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23907:22:0;;-1:-1:-1;23907:22:0;:::o;37177:288::-;37249:16;37275:21;37313:6;:13;-1:-1:-1;;;;;37299:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37299:28:0;;37275:52;;37342:7;37338:98;37354:6;:13;37351:2;:16;37338:98;;;37401:23;37413:6;37420:2;37413:10;;;;;;;;:::i;:::-;;;;;;;37401:11;:23::i;:::-;37390:4;37395:2;37390:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37390:34:0;;;:8;;;;;;;;;;;:34;37369:4;;;;:::i;:::-;;;;37338:98;;;-1:-1:-1;37453:4:0;37177:288;-1:-1:-1;;37177:288:0:o;30864:185::-;30942:8;;-1:-1:-1;;;;;30942:8:0;30928:10;:22;30920:47;;;;-1:-1:-1;;;30920:47:0;;;;;;;:::i;:::-;30978:16;30985:8;30978:6;:16::i;:::-;31019:3;;31005:36;;-1:-1:-1;;;31005:36:0;;;;;2280:25:1;;;31019:3:0;;;;-1:-1:-1;;;;;31019:3:0;;31005:26;;2253:18:1;;31005:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47329:362;47417:8;;-1:-1:-1;;;;;47417:8:0;47403:10;:22;47395:47;;;;-1:-1:-1;;;47395:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47466:13:0;;;47453:10;47466:13;;;:6;:13;;;;;;;;;;;47504:11;;;:6;:11;;;;;;;47535:25;;-1:-1:-1;;;47535:25:0;;;;47466:13;;47504:11;;;;47535:23;;:25;;;;;;;;;;;47504:11;47535:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;47526:94;;;;-1:-1:-1;;;47526:94:0;;25282:2:1;47526:94:0;;;25264:21:1;25321:2;25301:18;;;25294:30;25360:34;25340:18;;;25333:62;-1:-1:-1;;;25411:18:1;;;25404:46;25467:19;;47526:94:0;25080:412:1;47526:94:0;47631:24;;-1:-1:-1;;;47631:24:0;;-1:-1:-1;;;;;566:32:1;;;47631:24:0;;;548:51:1;47631:19:0;;;;;521:18:1;;47631:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;47666:11:0;;;;;;;:6;:11;;;;;:17;;-1:-1:-1;;;;;;47666:17:0;;;;;;;;;;;-1:-1:-1;;47329:362:0:o;42638:85::-;42702:5;:12;42684:31;;42699:1;;42684:14;:31::i;44909:256::-;44998:8;;-1:-1:-1;;;;;44998:8:0;44984:10;:22;;:55;;-1:-1:-1;45028:10:0;45010:29;;;;:17;:29;;;;;;;;44984:55;44976:80;;;;-1:-1:-1;;;44976:80:0;;;;;;;:::i;:::-;45072:6;45067:91;45084:18;;;45067:91;;;45124:22;45135:7;;45143:1;45135:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;45124;:22::i;:::-;45104:3;;;;:::i;:::-;;;;45067:91;;29734:145;29814:8;;-1:-1:-1;;;;;29814:8:0;29800:10;:22;29792:48;;;;-1:-1:-1;;;29792:48:0;;15618:2:1;29792:48:0;;;15600:21:1;15657:2;15637:18;;;15630:30;-1:-1:-1;;;15676:18:1;;;15669:43;15729:18;;29792:48:0;15416:337:1;29792:48:0;29851:8;:20;;-1:-1:-1;;;;;;29851:20:0;-1:-1:-1;;;;;29851:20:0;;;;;;;;;;29734:145::o;42271:176::-;42346:6;42341:99;42362:7;:14;42358:1;:18;42341:99;;;42405:7;42413:1;42405:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;42398:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42378:3;;;;;:::i;:::-;;;;42341:99;;45488:194;45556:2;;-1:-1:-1;;;;;45556:2:0;45542:10;:16;45534:32;;;;-1:-1:-1;;;45534:32:0;;25699:2:1;45534:32:0;;;25681:21:1;25738:1;25718:18;;;25711:29;-1:-1:-1;;;25756:18:1;;;25749:33;25799:18;;45534:32:0;25497:326:1;45534:32:0;45574:8;:14;;-1:-1:-1;;;;;45574:14:0;;;-1:-1:-1;;;;;;45574:14:0;;;;;;;;45599:16;:22;;;;;;;;45632:17;:23;;;;;;;;45666:2;:8;;;;;;;;45488:194::o;39577:163::-;39647:6;39642:91;39663:7;:14;39659:1;:18;39642:91;;;39699:22;39710:7;39718:1;39710:10;;;;;;;;:::i;:::-;;;;;;;39699;:22::i;:::-;39679:3;;;;:::i;:::-;;;;39642:91;;46467:498;46580:8;;-1:-1:-1;;;;;46580:8:0;46566:10;:22;46558:47;;;;-1:-1:-1;;;46558:47:0;;;;;;;:::i;:::-;46621:6;46616:342;46633:13;;;46616:342;;;46668:11;46682:12;:21;46696:2;;46699:1;46696:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46682:21:0;;;;;;;;;;;;;;-1:-1:-1;46682:21:0;;;;-1:-1:-1;46722:17:0;;46719:73;;46755:4;;46748:28;;-1:-1:-1;;;46748:28:0;;-1:-1:-1;;;;;17102:32:1;;;46748:28:0;;;17084:51:1;46755:4:0;17151:18:1;;;17144:34;46755:4:0;;;;46748:20;;17057:18:1;;46748:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46719:73;46830:3;;46834:1;46830:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46806:12;:21;46820:2;;46823:1;46820:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46806:21:0;;;;;;;;;;;;;;-1:-1:-1;46806:21:0;;;:30;;-1:-1:-1;;;;;;46806:30:0;;;;;;;;;;;46856:3;;46860:1;46856:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46856:20:0;;46852:95;;46893:4;;-1:-1:-1;;;;;46893:4:0;46886:20;46908:3;;46912:1;46908:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46886:45;;-1:-1:-1;;;;;;46886:45:0;;;;;;;-1:-1:-1;;;;;17102:32:1;;;46886:45:0;;;17084:51:1;-1:-1:-1;;17151:18:1;;;17144:34;17057:18;;46886:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46852:95;-1:-1:-1;46648:3:0;;;;:::i;:::-;;;;46616:342;;29320:406;29456:6;;-1:-1:-1;;;;;29456:6:0;29442:10;:20;29434:44;;;;-1:-1:-1;;;29434:44:0;;26317:2:1;29434:44:0;;;26299:21:1;26356:2;26336:18;;;26329:30;-1:-1:-1;;;26375:18:1;;;26368:41;26426:18;;29434:44:0;26115:335:1;29434:44:0;29494:6;29489:91;29510:7;:14;29506:1;:18;29489:91;;;29546:22;29557:7;29565:1;29557:10;;;;;;;;:::i;:::-;;;;;;;29546;:22::i;:::-;29526:3;;;;:::i;:::-;;;;29489:91;;;;29595:6;29590:102;29611:10;:17;29607:1;:21;29590:102;;;29676:4;29650:8;:23;29659:10;29670:1;29659:13;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;29650:23:0;;;;;;;;;;;-1:-1:-1;29650:23:0;:30;;-1:-1:-1;;29650:30:0;;;;;;;;;;29630:3;;;;:::i;:::-;;;;29590:102;;;-1:-1:-1;29702:6:0;:16;;-1:-1:-1;;;;;;29702:16:0;-1:-1:-1;;;;;29702:16:0;;;;;;;;;;-1:-1:-1;;29320:406:0:o;43876:77::-;43932:5;:12;43918:27;;43929:1;;43918:10;:27::i;29887:176::-;29974:16;;-1:-1:-1;;;;;29974:16:0;29960:10;:30;29952:65;;;;-1:-1:-1;;;29952:65:0;;26657:2:1;29952:65:0;;;26639:21:1;26696:2;26676:18;;;26669:30;-1:-1:-1;;;26715:18:1;;;26708:52;26777:18;;29952:65:0;26455:346:1;29952:65:0;30028:16;:27;;-1:-1:-1;;;;;;30028:27:0;-1:-1:-1;;;;;30028:27:0;;;;;;;;;;29887:176::o;38898:197::-;39000:10;38992:19;;;;:7;:19;;;;;;;;38984:41;;;;-1:-1:-1;;;38984:41:0;;;;;;;:::i;:::-;39071:7;39059:10;-1:-1:-1;;;;;39041:46:0;39050:7;-1:-1:-1;;;;;39041:46:0;;39080:6;39041:46;;;;2280:25:1;;2268:2;2253:18;;2134:177;41839:322:0;42028:31;42041:7;42050:8;42028:12;:31::i;:::-;42073:12;;42070:84;;42102:40;42114:7;42123:8;42133;42102:11;:40::i;47699:203::-;47790:8;;-1:-1:-1;;;;;47790:8:0;47776:10;:22;47768:47;;;;-1:-1:-1;;;47768:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47826:21:0;;;;;;:17;:21;;;;;;:26;;-1:-1:-1;;47826:26:0;;;;;;;;;;47868;;47826;;:21;47868:26;;;47699:203;;:::o;28569:518::-;20440:19;20463:13;;;;;;20462:14;;20510:34;;;;-1:-1:-1;20528:12:0;;20543:1;20528:12;;;;:16;20510:34;20509:108;;;-1:-1:-1;20589:4:0;11202:19;:23;;;20550:66;;-1:-1:-1;20599:12:0;;;;;:17;20550:66;20487:204;;;;-1:-1:-1;;;20487:204:0;;27008:2:1;20487:204:0;;;26990:21:1;27047:2;27027:18;;;27020:30;27086:34;27066:18;;;27059:62;-1:-1:-1;;;27137:18:1;;;27130:44;27191:19;;20487:204:0;26806:410:1;20487:204:0;20702:12;:16;;-1:-1:-1;;20702:16:0;20717:1;20702:16;;;20729:67;;;;20764:13;:20;;-1:-1:-1;;20764:20:0;;;;;20729:67;28728:3:::1;:10:::0;;-1:-1:-1;;;;;;28728:10:0::1;::::0;-1:-1:-1;;;;;28728:10:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;28749:18:0;;-1:-1:-1;;;;;;28749:18:0::1;::::0;;::::1;::::0;;;::::1;::::0;;28785:27:::1;::::0;;-1:-1:-1;;;28785:27:0;;;;:25:::1;::::0;:27:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;28728:10;28785:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28778:4;:34:::0;;-1:-1:-1;;;;;;28778:34:0;;::::1;-1:-1:-1::0;;;;;28778:34:0;;::::1;::::0;;::::1;::::0;;;28823:12:::1;:22:::0;;;::::1;::::0;;::::1;;::::0;;28856:12:::1;:22:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;28889:6:::1;:19:::0;;28898:10:::1;28889:19:::0;;::::1;::::0;::::1;::::0;;;28919:8:::1;:21:::0;;;::::1;::::0;::::1;::::0;;28951:16:::1;:29:::0;;;::::1;::::0;::::1;::::0;;28991:17:::1;:30:::0;;;::::1;::::0;::::1;::::0;;29032:2:::1;:15:::0;;;;::::1;;::::0;;;-1:-1:-1;29058:14:0;;;:8:::1;:14;::::0;;;;:21;;-1:-1:-1;;29058:21:0::1;-1:-1:-1::0;29058:21:0::1;::::0;;20818:102;;;;20869:5;20853:21;;-1:-1:-1;;20853:21:0;;;20894:14;;-1:-1:-1;27373:36:1;;20894:14:0;;27361:2:1;27346:18;20894:14:0;;;;;;;20429:498;28569:518;;;;:::o;47108:128::-;47181:8;;-1:-1:-1;;;;;47181:8:0;47167:10;:22;47159:47;;;;-1:-1:-1;;;47159:47:0;;;;;;;:::i;:::-;47217:6;:11;;-1:-1:-1;;;;;;47217:11:0;-1:-1:-1;;;;;47217:11:0;;;;;;;;;;47108:128::o;31057:998::-;31108:27;31138:18;;;:8;:18;;;;;;31187:16;;31285:3;;31271:36;;-1:-1:-1;;;31271:36:0;;;;;2280:25:1;;;31138:18:0;;31187:16;;31108:27;;;;31285:3;;;-1:-1:-1;;;;;31285:3:0;;31271:26;;2253:18:1;;31271:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31249:58;;31325:6;31320:609;31341:12;31337:1;:16;31320:609;;;31376:13;31392:9;31402:1;31392:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;31436:15;;;:5;:15;;;;;;-1:-1:-1;;;;;31392:12:0;;;31436:22;;;;;;;;;;31392:12;;-1:-1:-1;31479:11:0;;31475:443;;-1:-1:-1;;;;;31525:13:0;;;31508:14;31525:13;;;:6;:13;;;;;;;31554:22;31525:13;31554:14;:22::i;:::-;31595:18;31606:6;31595:10;:18::i;:::-;-1:-1:-1;;;;;31632:14:0;;;;;;:7;:14;;;;;:24;;31650:6;;31632:14;:24;;31650:6;;31632:24;:::i;:::-;;;;-1:-1:-1;;31675:15:0;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;31675:22:0;;;;;;;;;:32;;31701:6;;31675:15;:32;;31701:6;;31675:32;:::i;:::-;;;;-1:-1:-1;;;;;;;31733:14:0;;;;;;;:6;:14;;;;;;;;31726:84;;-1:-1:-1;;;31726:84:0;;;;;27651:25:1;;;27692:18;;;27685:34;;;31786:10:0;27773:18:1;;;27766:43;27845:15;;;27825:18;;;27818:43;31733:14:0;;;31726:32;;27623:19:1;;31726:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31845:6;31829:22;;;;;:::i;:::-;;;31885:8;31875:27;31895:6;31875:27;;;;2280:25:1;;2268:2;2253:18;;2134:177;31875:27:0;;;;;;;;31492:426;31475:443;31361:568;;31355:4;;;;;:::i;:::-;;;;31320:609;;;;31962:12;31939:11;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;32010:1:0;31986:21;;;:11;:21;;;;;;;;:25;;;32029:8;:18;;;;;32022:25;;;:::i;32807:2164::-;33002:8;32998:267;33017:9;:16;33013:3;:20;32998:267;;;33069:9;:27;33080:9;33090:3;33080:14;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;33069:27:0;;;;;;;;;;;-1:-1:-1;33069:27:0;;;;33067:29;33050:90;;;;-1:-1:-1;;;33050:90:0;;28074:2:1;33050:90:0;;;28056:21:1;28113:2;28093:18;;;28086:30;28152:25;28132:18;;;28125:53;28195:18;;33050:90:0;27872:347:1;33050:90:0;33169:7;:34;33178:6;:23;33185:9;33195:3;33185:14;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;33178:23:0;;;;;;;;;;;;;;;;-1:-1:-1;33178:23:0;;;;;;;33169:34;;;;;;;;;;;;;;;33149:107;;;;-1:-1:-1;;;33149:107:0;;28426:2:1;33149:107:0;;;28408:21:1;28465:2;28445:18;;;28438:30;28504;28484:18;;;28477:58;28552:18;;33149:107:0;28224:352:1;33149:107:0;33034:5;;;;:::i;:::-;;;;32998:267;;;;33275:16;33282:8;33275:6;:16::i;:::-;33318;;33302:13;33377:3;;33363:41;;-1:-1:-1;;;33363:41:0;;;;;2280:25:1;;;33377:3:0;;;;-1:-1:-1;;;;;33377:3:0;;33363:31;;2253:18:1;;33363:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33415:24;33559:3;;33545:36;;-1:-1:-1;;;33545:36:0;;;;;2280:25:1;;;33345:59:0;;-1:-1:-1;33415:24:0;;;;;;;;33559:3;;;-1:-1:-1;;;;;33559:3:0;;33545:26;;2253:18:1;;33545:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33523:58;;33599:6;33594:94;33615:8;33611:1;:12;33594:94;;;33665:8;33674:1;33665:11;;;;;;;;:::i;:::-;;;;;;;33645:31;;;;;:::i;:::-;;-1:-1:-1;33625:3:0;;;;:::i;:::-;;;;33594:94;;;;33705:6;33700:1004;33721:8;33717:1;:12;33700:1004;;;33751:13;33767:9;33777:1;33767:12;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;33811:13:0;;;33794:14;33811:13;;;:6;:13;;;;;;;;;;33845:15;;;:7;:15;;;;;33767:12;;-1:-1:-1;33845:15:0;;33841:852;;;33881:19;33927:16;33917:7;33903:8;33912:1;33903:11;;;;;;;;:::i;:::-;;;;;;;:21;;;;:::i;:::-;:40;;;;:::i;:::-;33970:15;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;33970:22:0;;;;;;;;;;33881:62;;-1:-1:-1;33970:27:0;33962:36;;;;;;34025:16;34017:25;;;;;;34058:22;34073:6;34058:14;:22::i;:::-;34099:18;34110:6;34099:10;:18::i;:::-;34138;;;;:8;:18;;;;;;;;:30;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34138:30:0;-1:-1:-1;;;;;34138:30:0;;;;;;;;34189:14;;:7;:14;;;;;:29;;34207:11;;34138:18;34189:29;;34207:11;;34189:29;:::i;:::-;;;;-1:-1:-1;;34237:15:0;;;;:5;:15;;;;;;;;-1:-1:-1;;;;;34237:22:0;;;;;;;;;:37;;34263:11;;34237:15;:37;;34263:11;;34237:37;:::i;:::-;;;;;;;;34300:6;:14;34307:6;-1:-1:-1;;;;;34300:14:0;-1:-1:-1;;;;;34300:14:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34300:14:0;-1:-1:-1;;;;;34293:31:0;;34333:11;34347:8;34357:10;34369:11;34293:88;;;;;;;;;;;;;;;;;27651:25:1;;;27707:2;27692:18;;27685:34;;;;-1:-1:-1;;;;;27793:15:1;;;27788:2;27773:18;;27766:43;27845:15;27840:2;27825:18;;27818:43;27638:3;27623:19;;27420:447;34293:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34415:11;34400:26;;;;;:::i;:::-;;-1:-1:-1;34445:27:0;34461:11;34445:27;;:::i;:::-;34496:77;;;34509:10;28783:51:1;;28865:2;28850:18;;28843:34;;;34557:15:0;28893:18:1;;;28886:34;34496:77:0;;34445:27;;-1:-1:-1;34534:8:0;;-1:-1:-1;;;;;34496:77:0;;;;;;;;;;;;;28771:2:1;34496:77:0;;;34666:11;34592;:54;23261:6;34606:26;23261:6;34606:15;:26;:::i;:::-;34605:39;;;;:::i;:::-;34592:54;;;;;;;;;;;:70;34648:9;34658:1;34648:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34592:70:0;-1:-1:-1;;;;;34592:70:0;;;;;;;;;;;;;:85;;;;;;;:::i;:::-;;;;-1:-1:-1;;;33841:852:0;33736:968;;33731:3;;;;;:::i;:::-;;;;33700:1004;;;-1:-1:-1;34718:15:0;;34714:56;;34749:3;;34735:35;;-1:-1:-1;;;34735:35:0;;;;;2280:25:1;;;34749:3:0;;;;-1:-1:-1;;;;;34749:3:0;;34735:25;;2253:18:1;;34735:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34714:56;34804:12;34781:11;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;34828:21:0;;;;:11;:21;;;;;:44;;;34860:11;;34883:13;;23261:6;34899:26;23261:6;34899:15;:26;:::i;:::-;34898:39;;;;:::i;:::-;34883:56;;;;;;;;;;;;:80;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;32807:2164:0:o;44304:379::-;44435:1;44415:5;-1:-1:-1;;;;;44415:17:0;;:21;44407:54;;;;-1:-1:-1;;;44407:54:0;;29133:2:1;44407:54:0;;;29115:21:1;29172:2;29152:18;;;29145:30;-1:-1:-1;;;29191:18:1;;;29184:50;29251:18;;44407:54:0;28931:344:1;44407:54:0;44528:69;;;-1:-1:-1;;;;;29538:15:1;;;44528:69:0;;;29520:34:1;29590:15;;;29570:18;;;29563:43;29622:18;;;;29615:34;;;44528:69:0;;;;;;;;;;29455:18:1;;;;44528:69:0;;;;;;;-1:-1:-1;;;;;44528:69:0;-1:-1:-1;;;44528:69:0;;;44517:81;;-1:-1:-1;;;;44517:10:0;;;;:81;;44528:69;44517:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44472:126;;;;44617:7;:57;;;;-1:-1:-1;44629:11:0;;:16;;:44;;;44660:4;44649:24;;;;;;;;;;;;:::i;:::-;44609:66;;;;;40096:900;-1:-1:-1;;;;;40168:20:0;;;40152:13;40168:20;;;:12;:20;;;;;;;;;;;;40219:14;;;:7;:14;;;;;;;40248:13;;40244:745;;-1:-1:-1;;;;;40298:19:0;;40278:17;40298:19;;;:11;:19;;;;;;;40346:5;;40410:28;;;;40298:19;40520:21;40298:19;40346:5;40520:21;:::i;:::-;40506:35;-1:-1:-1;40618:10:0;;40614:255;;40649:11;40690:4;40663:24;40681:6;40668:9;40663:24;:::i;:::-;:31;;;;:::i;:::-;-1:-1:-1;;;;;40767:15:0;;;;;;:7;:15;;;;;;40649:45;;-1:-1:-1;40767:15:0;;40763:91;;;-1:-1:-1;;;;;40807:17:0;;;;;;:9;:17;;;;;:27;;40828:6;;40807:17;:27;;40828:6;;40807:27;:::i;:::-;;;;-1:-1:-1;;40763:91:0;40630:239;40263:617;;;41375:121;41281:222;;:::o;40244:745::-;40923:5;;-1:-1:-1;;;;;40901:19:0;;;;;;:11;:19;;;;;:27;40141:855;;40096:900;:::o;44691:210::-;-1:-1:-1;;;;;44756:21:0;;;;;;:13;:21;;;;;;;;44755:22;44747:54;;;;-1:-1:-1;;;44747:54:0;;30293:2:1;44747:54:0;;;30275:21:1;30332:2;30312:18;;;30305:30;-1:-1:-1;;;30351:18:1;;;30344:49;30410:18;;44747:54:0;30091:343:1;44747:54:0;-1:-1:-1;;;;;44812:21:0;;;;;;:13;:21;;;;;;:28;;-1:-1:-1;;44812:28:0;44836:4;44812:28;;;;;;44856:37;;44836:4;;44812:21;44868:10;;44856:37;;44812:21;44856:37;44691:210;:::o;41004:267::-;-1:-1:-1;;;;;41077:24:0;;41066:8;41077:24;;;:16;:24;;;;;;41112:8;;41109:155;;41163:15;41210:14;23261:6;41163:15;41210:14;:::i;:::-;41204:20;;:3;:20;:::i;:::-;41198:3;:26;41190:62;;;;-1:-1:-1;;;41190:62:0;;30641:2:1;41190:62:0;;;30623:21:1;30680:2;30660:18;;;30653:30;30719:25;30699:18;;;30692:53;30762:18;;41190:62:0;30439:347:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;610:367::-;673:8;683:6;737:3;730:4;722:6;718:17;714:27;704:55;;755:1;752;745:12;704:55;-1:-1:-1;778:20:1;;-1:-1:-1;;;;;810:30:1;;807:50;;;853:1;850;843:12;807:50;890:4;882:6;878:17;866:29;;950:3;943:4;933:6;930:1;926:14;918:6;914:27;910:38;907:47;904:67;;;967:1;964;957:12;904:67;610:367;;;;;:::o;982:770::-;1101:6;1109;1117;1125;1178:2;1166:9;1157:7;1153:23;1149:32;1146:52;;;1194:1;1191;1184:12;1146:52;1234:9;1221:23;-1:-1:-1;;;;;1304:2:1;1296:6;1293:14;1290:34;;;1320:1;1317;1310:12;1290:34;1359:70;1421:7;1412:6;1401:9;1397:22;1359:70;:::i;:::-;1448:8;;-1:-1:-1;1333:96:1;-1:-1:-1;1536:2:1;1521:18;;1508:32;;-1:-1:-1;1552:16:1;;;1549:36;;;1581:1;1578;1571:12;1549:36;;1620:72;1684:7;1673:8;1662:9;1658:24;1620:72;:::i;:::-;982:770;;;;-1:-1:-1;1711:8:1;-1:-1:-1;;;;982:770:1:o;1757:180::-;1816:6;1869:2;1857:9;1848:7;1844:23;1840:32;1837:52;;;1885:1;1882;1875:12;1837:52;-1:-1:-1;1908:23:1;;1757:180;-1:-1:-1;1757:180:1:o;2316:127::-;2377:10;2372:3;2368:20;2365:1;2358:31;2408:4;2405:1;2398:15;2432:4;2429:1;2422:15;2448:275;2519:2;2513:9;2584:2;2565:13;;-1:-1:-1;;2561:27:1;2549:40;;-1:-1:-1;;;;;2604:34:1;;2640:22;;;2601:62;2598:88;;;2666:18;;:::i;:::-;2702:2;2695:22;2448:275;;-1:-1:-1;2448:275:1:o;2728:183::-;2788:4;-1:-1:-1;;;;;2813:6:1;2810:30;2807:56;;;2843:18;;:::i;:::-;-1:-1:-1;2888:1:1;2884:14;2900:4;2880:25;;2728:183::o;2916:737::-;2970:5;3023:3;3016:4;3008:6;3004:17;3000:27;2990:55;;3041:1;3038;3031:12;2990:55;3077:6;3064:20;3103:4;3127:60;3143:43;3183:2;3143:43;:::i;:::-;3127:60;:::i;:::-;3221:15;;;3307:1;3303:10;;;;3291:23;;3287:32;;;3252:12;;;;3331:15;;;3328:35;;;3359:1;3356;3349:12;3328:35;3395:2;3387:6;3383:15;3407:217;3423:6;3418:3;3415:15;3407:217;;;3503:3;3490:17;3520:31;3545:5;3520:31;:::i;:::-;3564:18;;3602:12;;;;3440;;3407:217;;;-1:-1:-1;3642:5:1;2916:737;-1:-1:-1;;;;;;2916:737:1:o;3658:910::-;3722:5;3775:3;3768:4;3760:6;3756:17;3752:27;3742:55;;3793:1;3790;3783:12;3742:55;3829:6;3816:20;3855:4;3879:60;3895:43;3935:2;3895:43;:::i;3879:60::-;3973:15;;;4059:1;4055:10;;;;4043:23;;4039:32;;;4004:12;;;;4083:15;;;4080:35;;;4111:1;4108;4101:12;4080:35;4147:2;4139:6;4135:15;4159:380;4175:6;4170:3;4167:15;4159:380;;;4261:3;4248:17;-1:-1:-1;;;;;4284:11:1;4281:35;4278:125;;;4357:1;4386:2;4382;4375:14;4278:125;4428:68;4492:3;4487:2;4473:11;4465:6;4461:24;4457:33;4428:68;:::i;:::-;4416:81;;-1:-1:-1;4517:12:1;;;;4192;;4159:380;;4573:630;4716:6;4724;4777:2;4765:9;4756:7;4752:23;4748:32;4745:52;;;4793:1;4790;4783:12;4745:52;4833:9;4820:23;-1:-1:-1;;;;;4903:2:1;4895:6;4892:14;4889:34;;;4919:1;4916;4909:12;4889:34;4942:61;4995:7;4986:6;4975:9;4971:22;4942:61;:::i;:::-;4932:71;;5056:2;5045:9;5041:18;5028:32;5012:48;;5085:2;5075:8;5072:16;5069:36;;;5101:1;5098;5091:12;5069:36;;5124:73;5189:7;5178:8;5167:9;5163:24;5124:73;:::i;:::-;5114:83;;;4573:630;;;;;:::o;5208:315::-;5276:6;5284;5337:2;5325:9;5316:7;5312:23;5308:32;5305:52;;;5353:1;5350;5343:12;5305:52;5389:9;5376:23;5366:33;;5449:2;5438:9;5434:18;5421:32;5462:31;5487:5;5462:31;:::i;:::-;5512:5;5502:15;;;5208:315;;;;;:::o;5528:437::-;5614:6;5622;5675:2;5663:9;5654:7;5650:23;5646:32;5643:52;;;5691:1;5688;5681:12;5643:52;5731:9;5718:23;-1:-1:-1;;;;;5756:6:1;5753:30;5750:50;;;5796:1;5793;5786:12;5750:50;5835:70;5897:7;5888:6;5877:9;5873:22;5835:70;:::i;:::-;5924:8;;5809:96;;-1:-1:-1;5528:437:1;-1:-1:-1;;;;5528:437:1:o;5970:891::-;6054:6;6085:2;6128;6116:9;6107:7;6103:23;6099:32;6096:52;;;6144:1;6141;6134:12;6096:52;6184:9;6171:23;-1:-1:-1;;;;;6209:6:1;6206:30;6203:50;;;6249:1;6246;6239:12;6203:50;6272:22;;6325:4;6317:13;;6313:27;-1:-1:-1;6303:55:1;;6354:1;6351;6344:12;6303:55;6390:2;6377:16;6413:60;6429:43;6469:2;6429:43;:::i;6413:60::-;6507:15;;;6589:1;6585:10;;;;6577:19;;6573:28;;;6538:12;;;;6613:19;;;6610:39;;;6645:1;6642;6635:12;6610:39;6669:11;;;;6689:142;6705:6;6700:3;6697:15;6689:142;;;6771:17;;6759:30;;6722:12;;;;6809;;;;6689:142;;;6850:5;5970:891;-1:-1:-1;;;;;;;5970:891:1:o;6866:118::-;6952:5;6945:13;6938:21;6931:5;6928:32;6918:60;;6974:1;6971;6964:12;6989:241;7045:6;7098:2;7086:9;7077:7;7073:23;7069:32;7066:52;;;7114:1;7111;7104:12;7066:52;7153:9;7140:23;7172:28;7194:5;7172:28;:::i;7235:348::-;7319:6;7372:2;7360:9;7351:7;7347:23;7343:32;7340:52;;;7388:1;7385;7378:12;7340:52;7428:9;7415:23;-1:-1:-1;;;;;7453:6:1;7450:30;7447:50;;;7493:1;7490;7483:12;7447:50;7516:61;7569:7;7560:6;7549:9;7545:22;7516:61;:::i;:::-;7506:71;7235:348;-1:-1:-1;;;;7235:348:1:o;7588:248::-;7656:6;7664;7717:2;7705:9;7696:7;7692:23;7688:32;7685:52;;;7733:1;7730;7723:12;7685:52;-1:-1:-1;;7756:23:1;;;7826:2;7811:18;;;7798:32;;-1:-1:-1;7588:248:1:o;7841:698::-;7993:6;8001;8009;8062:2;8050:9;8041:7;8037:23;8033:32;8030:52;;;8078:1;8075;8068:12;8030:52;8118:9;8105:23;-1:-1:-1;;;;;8188:2:1;8180:6;8177:14;8174:34;;;8204:1;8201;8194:12;8174:34;8227:61;8280:7;8271:6;8260:9;8256:22;8227:61;:::i;:::-;8217:71;;8341:2;8330:9;8326:18;8313:32;8297:48;;8370:2;8360:8;8357:16;8354:36;;;8386:1;8383;8376:12;8354:36;;8409:73;8474:7;8463:8;8452:9;8448:24;8409:73;:::i;:::-;8399:83;;;8529:2;8518:9;8514:18;8501:32;8491:42;;7841:698;;;;;:::o;8544:841::-;8675:6;8683;8691;8699;8707;8760:2;8748:9;8739:7;8735:23;8731:32;8728:52;;;8776:1;8773;8766:12;8728:52;8812:9;8799:23;8789:33;;8873:2;8862:9;8858:18;8845:32;-1:-1:-1;;;;;8937:2:1;8929:6;8926:14;8923:34;;;8953:1;8950;8943:12;8923:34;8992:70;9054:7;9045:6;9034:9;9030:22;8992:70;:::i;:::-;9081:8;;-1:-1:-1;8966:96:1;-1:-1:-1;9169:2:1;9154:18;;9141:32;;-1:-1:-1;9185:16:1;;;9182:36;;;9214:1;9211;9204:12;9182:36;;9253:72;9317:7;9306:8;9295:9;9291:24;9253:72;:::i;:::-;8544:841;;;;-1:-1:-1;8544:841:1;;-1:-1:-1;9344:8:1;;9227:98;8544:841;-1:-1:-1;;;8544:841:1:o;9390:383::-;9467:6;9475;9483;9536:2;9524:9;9515:7;9511:23;9507:32;9504:52;;;9552:1;9549;9542:12;9504:52;9588:9;9575:23;9565:33;;9648:2;9637:9;9633:18;9620:32;9661:31;9686:5;9661:31;:::i;:::-;9390:383;;9711:5;;-1:-1:-1;;;9763:2:1;9748:18;;;;9735:32;;9390:383::o;9778:461::-;9831:3;9869:5;9863:12;9896:6;9891:3;9884:19;9922:4;9951:2;9946:3;9942:12;9935:19;;9988:2;9981:5;9977:14;10009:1;10019:195;10033:6;10030:1;10027:13;10019:195;;;10098:13;;-1:-1:-1;;;;;10094:39:1;10082:52;;10154:12;;;;10189:15;;;;10130:1;10048:9;10019:195;;;-1:-1:-1;10230:3:1;;9778:461;-1:-1:-1;;;;;9778:461:1:o;10244:261::-;10423:2;10412:9;10405:21;10386:4;10443:56;10495:2;10484:9;10480:18;10472:6;10443:56;:::i;10510:388::-;10578:6;10586;10639:2;10627:9;10618:7;10614:23;10610:32;10607:52;;;10655:1;10652;10645:12;10607:52;10694:9;10681:23;10713:31;10738:5;10713:31;:::i;:::-;10763:5;-1:-1:-1;10820:2:1;10805:18;;10792:32;10833:33;10792:32;10833:33;:::i;11681:730::-;11808:6;11816;11824;11877:2;11865:9;11856:7;11852:23;11848:32;11845:52;;;11893:1;11890;11883:12;11845:52;11933:9;11920:23;-1:-1:-1;;;;;12003:2:1;11995:6;11992:14;11989:34;;;12019:1;12016;12009:12;11989:34;12042:61;12095:7;12086:6;12075:9;12071:22;12042:61;:::i;:::-;12032:71;;12156:2;12145:9;12141:18;12128:32;12112:48;;12185:2;12175:8;12172:16;12169:36;;;12201:1;12198;12191:12;12169:36;;12224:63;12279:7;12268:8;12257:9;12253:24;12224:63;:::i;:::-;12214:73;;;12337:2;12326:9;12322:18;12309:32;12350:31;12375:5;12350:31;:::i;:::-;12400:5;12390:15;;;11681:730;;;;;:::o;12416:1187::-;12661:6;12669;12677;12685;12693;12746:3;12734:9;12725:7;12721:23;12717:33;12714:53;;;12763:1;12760;12753:12;12714:53;12803:9;12790:23;-1:-1:-1;;;;;12873:2:1;12865:6;12862:14;12859:34;;;12889:1;12886;12879:12;12859:34;12912:61;12965:7;12956:6;12945:9;12941:22;12912:61;:::i;:::-;12902:71;;13026:2;13015:9;13011:18;12998:32;12982:48;;13055:2;13045:8;13042:16;13039:36;;;13071:1;13068;13061:12;13039:36;13094:73;13159:7;13148:8;13137:9;13133:24;13094:73;:::i;:::-;13084:83;;13220:2;13209:9;13205:18;13192:32;13176:48;;13249:2;13239:8;13236:16;13233:36;;;13265:1;13262;13255:12;13233:36;13288:63;13343:7;13332:8;13321:9;13317:24;13288:63;:::i;:::-;13278:73;;13404:2;13393:9;13389:18;13376:32;13360:48;;13433:2;13423:8;13420:16;13417:36;;;13449:1;13446;13439:12;13417:36;;13472:73;13537:7;13526:8;13515:9;13511:24;13472:73;:::i;:::-;12416:1187;;;;-1:-1:-1;12416:1187:1;;13592:3;13577:19;13564:33;;12416:1187;-1:-1:-1;;;12416:1187:1:o;13608:382::-;13673:6;13681;13734:2;13722:9;13713:7;13709:23;13705:32;13702:52;;;13750:1;13747;13740:12;13702:52;13789:9;13776:23;13808:31;13833:5;13808:31;:::i;:::-;13858:5;-1:-1:-1;13915:2:1;13900:18;;13887:32;13928:30;13887:32;13928:30;:::i;13995:671::-;14081:6;14089;14097;14105;14158:3;14146:9;14137:7;14133:23;14129:33;14126:53;;;14175:1;14172;14165:12;14126:53;14214:9;14201:23;14233:31;14258:5;14233:31;:::i;:::-;14283:5;-1:-1:-1;14340:2:1;14325:18;;14312:32;14353:33;14312:32;14353:33;:::i;:::-;14405:7;-1:-1:-1;14464:2:1;14449:18;;14436:32;14477:33;14436:32;14477:33;:::i;:::-;14529:7;-1:-1:-1;14588:2:1;14573:18;;14560:32;14601:33;14560:32;14601:33;:::i;:::-;13995:671;;;;-1:-1:-1;13995:671:1;;-1:-1:-1;;13995:671:1:o;14671:336::-;14873:2;14855:21;;;14912:2;14892:18;;;14885:30;-1:-1:-1;;;14946:2:1;14931:18;;14924:42;14998:2;14983:18;;14671:336::o;15012:127::-;15073:10;15068:3;15064:20;15061:1;15054:31;15104:4;15101:1;15094:15;15128:4;15125:1;15118:15;15144:127;15205:10;15200:3;15196:20;15193:1;15186:31;15236:4;15233:1;15226:15;15260:4;15257:1;15250:15;15276:135;15315:3;-1:-1:-1;;15336:17:1;;15333:43;;;15356:18;;:::i;:::-;-1:-1:-1;15403:1:1;15392:13;;15276:135::o;15758:358::-;-1:-1:-1;;;;;15965:32:1;;15947:51;;16034:2;16029;16014:18;;16007:30;;;-1:-1:-1;;16054:56:1;;16091:18;;16083:6;16054:56;:::i;16121:127::-;16182:10;16177:3;16173:20;16170:1;16163:31;16213:4;16210:1;16203:15;16237:4;16234:1;16227:15;16253:120;16293:1;16319;16309:35;;16324:18;;:::i;:::-;-1:-1:-1;16358:9:1;;16253:120::o;16378:168::-;16418:7;16484:1;16480;16476:6;16472:14;16469:1;16466:21;16461:1;16454:9;16447:17;16443:45;16440:71;;;16491:18;;:::i;:::-;-1:-1:-1;16531:9:1;;16378:168::o;17189:245::-;17256:6;17309:2;17297:9;17288:7;17284:23;17280:32;17277:52;;;17325:1;17322;17315:12;17277:52;17357:9;17351:16;17376:28;17398:5;17376:28;:::i;17794:128::-;17834:3;17865:1;17861:6;17858:1;17855:13;17852:39;;;17871:18;;:::i;:::-;-1:-1:-1;17907:9:1;;17794:128::o;17927:332::-;18129:2;18111:21;;;18168:1;18148:18;;;18141:29;-1:-1:-1;;;18201:2:1;18186:18;;18179:39;18250:2;18235:18;;17927:332::o;18607:184::-;18677:6;18730:2;18718:9;18709:7;18705:23;18701:32;18698:52;;;18746:1;18743;18736:12;18698:52;-1:-1:-1;18769:16:1;;18607:184;-1:-1:-1;18607:184:1:o;18796:112::-;18828:1;18854;18844:35;;18859:18;;:::i;:::-;-1:-1:-1;18893:9:1;;18796:112::o;18913:125::-;18953:4;18981:1;18978;18975:8;18972:34;;;18986:18;;:::i;:::-;-1:-1:-1;19023:9:1;;18913:125::o;19737:332::-;19944:6;19933:9;19926:25;19987:2;19982;19971:9;19967:18;19960:30;19907:4;20007:56;20059:2;20048:9;20044:18;20036:6;20007:56;:::i;20074:245::-;20153:6;20161;20214:2;20202:9;20193:7;20189:23;20185:32;20182:52;;;20230:1;20227;20220:12;20182:52;-1:-1:-1;;20253:16:1;;20309:2;20294:18;;;20288:25;20253:16;;20288:25;;-1:-1:-1;20074:245:1:o;21703:385::-;21782:6;21790;21843:2;21831:9;21822:7;21818:23;21814:32;21811:52;;;21859:1;21856;21849:12;21811:52;21891:9;21885:16;21910:31;21935:5;21910:31;:::i;:::-;22010:2;21995:18;;21989:25;21960:5;;-1:-1:-1;22023:33:1;21989:25;22023:33;:::i;23526:251::-;23596:6;23649:2;23637:9;23628:7;23624:23;23620:32;23617:52;;;23665:1;23662;23655:12;23617:52;23697:9;23691:16;23716:31;23741:5;23716:31;:::i;23782:623::-;-1:-1:-1;;;;;24105:15:1;;;24087:34;;24157:15;;;24152:2;24137:18;;24130:43;24209:15;;24204:2;24189:18;;24182:43;24268:14;;24261:22;24256:2;24241:18;;24234:50;24067:3;24315;24300:19;;24293:32;;;24030:4;;24342:57;;24379:19;;24371:6;24342:57;:::i;24410:665::-;-1:-1:-1;;;;;24761:15:1;;;24743:34;;24813:15;;24808:2;24793:18;;24786:43;24865:3;24860:2;24845:18;;24838:31;;;24686:4;;24892:57;;24929:19;;24921:6;24892:57;:::i;:::-;24997:9;24989:6;24985:22;24980:2;24969:9;24965:18;24958:50;25025:44;25062:6;25054;25025:44;:::i;29660:426::-;29789:3;29827:6;29821:13;29852:1;29862:129;29876:6;29873:1;29870:13;29862:129;;;29974:4;29958:14;;;29954:25;;29948:32;29935:11;;;29928:53;29891:12;29862:129;;;30009:6;30006:1;30003:13;30000:48;;;30044:1;30035:6;30030:3;30026:16;30019:27;30000:48;-1:-1:-1;30064:16:1;;;;;29660:426;-1:-1:-1;;29660:426:1:o
Swarm Source
ipfs://6ff3930cb2e43c6d7591d450b74f3f07c626457877aedf425323ea6236b2cc0f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.