Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
517770 | 113 days ago | Contract Creation | 0 S |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
BeefyRevenueBridge
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-17 */ // Sources flattened with hardhat v2.17.0 https://hardhat.org // File @openzeppelin-4/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin-4/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin-4/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin-4/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File @openzeppelin-4/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin-4/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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-4/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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/[email protected] // OpenZeppelin Contracts (last updated v4.9.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] * ```solidity * 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. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ 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. * * 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. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * 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. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ 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. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File contracts/bridge/Errors.sol pragma solidity 0.8.19; contract Errors { /**@notice Errors */ error BridgeError(); error SwapError(); error NotAuthorized(); error IncorrectRoute(); error NotEnoughEth(); error FailedToSendEther(); } // File contracts/interfaces/swap/IBalancerVault.sol pragma solidity ^0.8.0; interface IBalancerVault { struct SingleSwap { bytes32 poolId; SwapKind kind; address assetIn; address assetOut; uint256 amount; bytes userData; } struct BatchSwapStep { bytes32 poolId; uint256 assetInIndex; uint256 assetOutIndex; uint256 amount; bytes userData; } struct FundManagement { address sender; bool fromInternalBalance; address payable recipient; bool toInternalBalance; } struct JoinPoolRequest { address[] assets; uint256[] maxAmountsIn; bytes userData; bool fromInternalBalance; } enum SwapKind { GIVEN_IN, GIVEN_OUT } function swap( SingleSwap memory singleSwap, FundManagement memory funds, uint256 limit, uint256 deadline ) external payable returns (uint256); function batchSwap( SwapKind kind, BatchSwapStep[] memory swaps, address[] memory assets, FundManagement memory funds, int256[] memory limits, uint256 deadline ) external returns (int256[] memory assetDeltas); function joinPool( bytes32 poolId, address sender, address recipient, JoinPoolRequest memory request ) external; function getPoolTokens(bytes32 poolId) external view returns ( address[] memory tokens, uint256[] memory balances, uint256 lastChangeBlock ); function getPool(bytes32 poolId) external view returns (address, uint8); function flashLoan( address recipient, address[] memory tokens, uint256[] memory amounts, bytes memory userData ) external; } // File contracts/bridge/Structs.sol pragma solidity 0.8.19; contract Structs { // Will be unused if we dont swap with balancer IBalancerVault.SwapKind public swapKind; IBalancerVault.FundManagement public funds; struct Cowllector { bool sendFunds; address cowllector; uint256 amountCowllectorNeeds; } struct BridgeParams { address bridge; bytes params; } struct SwapParams { address router; bytes params; } struct DestinationAddress { address destination; bytes destinationBytes; string destinationString; } struct Stargate { uint16 dstChainId; uint256 gasLimit; uint256 srcPoolId; uint256 dstPoolId; } struct Axelar { string destinationChain; string symbol; } struct Synapse { uint256 chainId; uint8 tokenIndexFrom; uint8 tokenIndexTo; address token; uint8 dstIndexFrom; uint8 dstIndexTo; } } // File contracts/bridge/Events.sol pragma solidity 0.8.19; contract Events is Structs { /**@notice Revenue Bridge Events **/ event SetBridge(bytes32 bridge, BridgeParams params); event SetSwap(bytes32 swap, SwapParams params); event SetMinBridgeAmount(uint256 amount); event SetDestinationAddress(DestinationAddress destinationAddress); event SetStable(address oldStable, address newStable); event Bridged(address indexed stable, uint256 stableBridged); event CowllectorRefill(uint256 amount); } // File contracts/interfaces/bridge/IAxelar.sol pragma solidity ^0.8.0; interface IAxelar { function sendToken( string memory destinationChain, string memory destinationAddress, string memory symbol, uint256 amount ) external; } // File contracts/interfaces/bridge/ICircle.sol pragma solidity ^0.8.0; interface ICircle { function depositForBurn( uint256 amount, uint32 destinationDomain, bytes32 mintRecipient, address burnToken ) external returns (uint64 _nonce); } // File contracts/interfaces/bridge/IStargate.sol pragma solidity ^0.8.0; interface IStargate { struct lzTxObj { uint256 dstGasForCall; uint256 dstNativeAmount; bytes dstNativeAddr; } function addLiquidity( uint256 _poolId, uint256 _amountLD, address _to ) external; function swap( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLD, uint256 _minAmountLD, lzTxObj memory _lzTxParams, bytes calldata _to, bytes calldata _payload ) external payable; function redeemRemote( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, uint256 _minAmountLD, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable; function instantRedeemLocal( uint16 _srcPoolId, uint256 _amountLP, address _to ) external returns (uint256); function redeemLocal( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable; function sendCredits( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress ) external payable; function quoteLayerZeroFee( uint16 _dstChainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, lzTxObj memory _lzTxParams ) external view returns (uint256, uint256); } // File contracts/interfaces/bridge/ISynapse.sol pragma solidity ^0.8.0; interface ISynapse { function swapAndRedeemAndSwap( address to, uint256 chainId, address token, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, uint256 deadline, uint8 swapIndexFrom, uint8 swapIndexTo, uint256 min, uint256 swapTime ) external; } // File contracts/interfaces/bridge/IzkEVM.sol pragma solidity ^0.8.0; interface IzkEVM { function bridgeAsset( uint32 dstChainId, address receiver, uint256 amount, address token, bool forceUpdate, bytes memory permitData ) external; } // File contracts/interfaces/bridge/IzkSync.sol pragma solidity ^0.8.0; interface IzkSync { function withdraw( address to, address token, uint256 amount ) external payable; } // File contracts/interfaces/IWrappedNative.sol pragma solidity ^0.8.0; interface IWrappedNative { function deposit() external payable; function withdraw(uint256 wad) external; } // File contracts/interfaces/swap/ISolidlyRouter.sol pragma solidity ^0.8.0; interface ISolidlyRouter { // Routes struct Routes { address from; address to; bool stable; } struct Route { address from; address to; bool stable; address factory; } function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, Routes[] memory route, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, Route[] memory route, address to, uint deadline ) external returns (uint[] memory amounts); function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable); function getAmountsOut(uint amountIn, Routes[] memory routes) external view returns (uint[] memory amounts); function getAmountsOut(uint amountIn, Route[] memory routes) external view returns (uint[] memory amounts); function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired ) external view returns (uint amountA, uint amountB, uint liquidity); function quoteAddLiquidity( address tokenA, address tokenB, bool stable, address _factory, uint amountADesired, uint amountBDesired ) external view returns (uint amountA, uint amountB, uint liquidity); function defaultFactory() external view returns (address); } // File contracts/interfaces/swap/IUniswapRouterETH.sol pragma solidity ^0.8.0; interface IUniswapRouterETH { function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); } // File contracts/utils/BeefyBalancerStructs.sol pragma solidity ^0.8.0; library BeefyBalancerStructs { enum RouterType { BALANCER, UNISWAP_V2, UNISWAP_V3 } struct BatchSwapStruct { bytes32 poolId; uint256 assetInIndex; uint256 assetOutIndex; } struct Reward { RouterType routerType; address router; mapping(uint => BatchSwapStruct) swapInfo; address[] assets; bytes routeToNative; // backup route in case there is no Balancer liquidity for reward uint minAmount; // minimum amount to be swapped to native } struct Input { address input; bool isComposable; bool isBeets; } } // File contracts/utils/BalancerActionsLib.sol pragma solidity ^0.8.0; library BalancerActionsLib { function balancerJoin(address _vault, bytes32 _poolId, address _tokenIn, uint256 _amountIn) internal { (address[] memory lpTokens,,) = IBalancerVault(_vault).getPoolTokens(_poolId); uint256[] memory amounts = new uint256[](lpTokens.length); for (uint256 i = 0; i < amounts.length;) { amounts[i] = lpTokens[i] == _tokenIn ? _amountIn : 0; unchecked { ++i; } } bytes memory userData = abi.encode(1, amounts, 1); IBalancerVault.JoinPoolRequest memory request = IBalancerVault.JoinPoolRequest(lpTokens, amounts, userData, false); IBalancerVault(_vault).joinPool(_poolId, address(this), address(this), request); } function buildSwapStructArray(BeefyBalancerStructs.BatchSwapStruct[] memory _route, uint256 _amountIn) internal pure returns (IBalancerVault.BatchSwapStep[] memory) { IBalancerVault.BatchSwapStep[] memory swaps = new IBalancerVault.BatchSwapStep[](_route.length); for (uint i; i < _route.length;) { if (i == 0) { swaps[0] = IBalancerVault.BatchSwapStep({ poolId: _route[0].poolId, assetInIndex: _route[0].assetInIndex, assetOutIndex: _route[0].assetOutIndex, amount: _amountIn, userData: "" }); } else { swaps[i] = IBalancerVault.BatchSwapStep({ poolId: _route[i].poolId, assetInIndex: _route[i].assetInIndex, assetOutIndex: _route[i].assetOutIndex, amount: 0, userData: "" }); } unchecked { ++i; } } return swaps; } function balancerSwap(address _vault, IBalancerVault.SwapKind _swapKind, IBalancerVault.BatchSwapStep[] memory _swaps, address[] memory _route, IBalancerVault.FundManagement memory _funds, int256 _amountIn) internal returns (int256[] memory) { int256[] memory limits = new int256[](_route.length); for (uint i; i < _route.length;) { if (i == 0) { limits[0] = _amountIn; } else if (i == _route.length - 1) { limits[i] = -1; } unchecked { ++i; } } return IBalancerVault(_vault).batchSwap(_swapKind, _swaps, _route, _funds, limits, block.timestamp); } } // File contracts/utils/BytesLib.sol /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.5.0 <0.9.0; library BytesLib { function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, 'slice_overflow'); require(_start + _length >= _start, 'slice_overflow'); require(_bytes.length >= _start + _length, 'slice_outOfBounds'); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_start + 20 >= _start, 'toAddress_overflow'); require(_bytes.length >= _start + 20, 'toAddress_outOfBounds'); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint24(bytes memory _bytes, uint256 _start) internal pure returns (uint24) { require(_start + 3 >= _start, 'toUint24_overflow'); require(_bytes.length >= _start + 3, 'toUint24_outOfBounds'); uint24 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x3), _start)) } return tempUint; } } // File contracts/utils/Path.sol pragma solidity ^0.8.0; /// @title Functions for manipulating path data for multihop swaps library Path { using BytesLib for bytes; /// @dev The length of the bytes encoded address uint256 private constant ADDR_SIZE = 20; /// @dev The length of the bytes encoded fee uint256 private constant FEE_SIZE = 3; /// @dev The offset of a single token address and pool fee uint256 private constant NEXT_OFFSET = ADDR_SIZE + FEE_SIZE; /// @dev The offset of an encoded pool key uint256 private constant POP_OFFSET = NEXT_OFFSET + ADDR_SIZE; /// @dev The minimum length of an encoding that contains 2 or more pools uint256 private constant MULTIPLE_POOLS_MIN_LENGTH = POP_OFFSET + NEXT_OFFSET; /// @notice Returns true iff the path contains two or more pools /// @param path The encoded swap path /// @return True if path contains two or more pools, otherwise false function hasMultiplePools(bytes memory path) internal pure returns (bool) { return path.length >= MULTIPLE_POOLS_MIN_LENGTH; } /// @notice Returns the number of pools in the path /// @param path The encoded swap path /// @return The number of pools in the path function numPools(bytes memory path) internal pure returns (uint256) { // Ignore the first token address. From then on every fee and token offset indicates a pool. return ((path.length - ADDR_SIZE) / NEXT_OFFSET); } /// @notice Decodes the first pool in path /// @param path The bytes encoded swap path /// @return tokenA The first token of the given pool /// @return tokenB The second token of the given pool /// @return fee The fee level of the pool function decodeFirstPool(bytes memory path) internal pure returns ( address tokenA, address tokenB, uint24 fee ) { tokenA = path.toAddress(0); fee = path.toUint24(ADDR_SIZE); tokenB = path.toAddress(NEXT_OFFSET); } /// @notice Gets the segment corresponding to the first pool in the path /// @param path The bytes encoded swap path /// @return The segment containing all data necessary to target the first pool in the path function getFirstPool(bytes memory path) internal pure returns (bytes memory) { return path.slice(0, POP_OFFSET); } /// @notice Skips a token + fee element from the buffer and returns the remainder /// @param path The swap path /// @return The remaining token + fee elements in the path function skipToken(bytes memory path) internal pure returns (bytes memory) { return path.slice(NEXT_OFFSET, path.length - NEXT_OFFSET); } } // File contracts/interfaces/swap/IKyberElastic.sol pragma solidity ^0.8.0; interface IKyberElastic { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 minAmountOut; uint160 limitSqrtP; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function swapExactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 minAmountOut; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function swapExactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 maxAmountIn; uint160 limitSqrtP; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function swapExactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 maxAmountIn; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function swapExactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); } // File contracts/interfaces/swap/IUniswapRouterV3.sol pragma solidity ^0.8.0; interface IUniswapRouterV3 { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); } // File contracts/interfaces/swap/IUniswapRouterWithDeadline.sol pragma solidity ^0.8.0; interface IUniswapRouterV3WithDeadline { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); } // File contracts/utils/UniV3Actions.sol pragma solidity ^0.8.0; library UniV3Actions { // kyber V3 swap function kyberSwap(address _router, bytes memory _path, uint256 _amount) internal returns (uint256 amountOut) { IKyberElastic.ExactInputParams memory swapParams = IKyberElastic.ExactInputParams({ path: _path, recipient: address(this), deadline: block.timestamp, amountIn: _amount, minAmountOut: 0 }); return IKyberElastic(_router).swapExactInput(swapParams); } // Uniswap V3 swap function swapV3(address _router, bytes memory _path, uint256 _amount) internal returns (uint256 amountOut) { IUniswapRouterV3.ExactInputParams memory swapParams = IUniswapRouterV3.ExactInputParams({ path: _path, recipient: address(this), amountIn: _amount, amountOutMinimum: 0 }); return IUniswapRouterV3(_router).exactInput(swapParams); } // Uniswap V3 swap with deadline function swapV3WithDeadline(address _router, bytes memory _path, uint256 _amount) internal returns (uint256 amountOut) { IUniswapRouterV3WithDeadline.ExactInputParams memory swapParams = IUniswapRouterV3WithDeadline.ExactInputParams({ path: _path, recipient: address(this), deadline: block.timestamp, amountIn: _amount, amountOutMinimum: 0 }); return IUniswapRouterV3WithDeadline(_router).exactInput(swapParams); } // Uniswap V3 swap with deadline function swapV3WithDeadline(address _router, bytes memory _path, uint256 _amount, address _to) internal returns (uint256 amountOut) { IUniswapRouterV3WithDeadline.ExactInputParams memory swapParams = IUniswapRouterV3WithDeadline.ExactInputParams({ path: _path, recipient: _to, deadline: block.timestamp, amountIn: _amount, amountOutMinimum: 0 }); return IUniswapRouterV3WithDeadline(_router).exactInput(swapParams); } } // File contracts/bridge/BeefyRevenueBridge.sol pragma solidity 0.8.19; // Essential Interfaces // Bridge Interfaces //Swap Interfaces and Utils // Additional Interfaces Needed // Beefy's revenue bridging system contract BeefyRevenueBridge is OwnableUpgradeable, UUPSUpgradeable, Events, Errors { using SafeERC20 for IERC20; using Address for address; using Path for bytes; IERC20 public stable; IERC20 public native; // Set our params bytes32 public activeBridge; bytes32 public activeSwap; Cowllector public cowllector; BridgeParams public bridgeParams; SwapParams public swapParams; DestinationAddress public destinationAddress; uint256 public minBridgeAmount; bool private init; // Mapping our enums to function string mapping(bytes32 => string) public bridgeToUse; mapping(bytes32 => string) public swapToUse; function initialize() external initializer { __Ownable_init(); _initBridgeMapping(); _initSwapMapping(); funds = IBalancerVault.FundManagement(address(this), false, payable(address(this)), false); swapKind = IBalancerVault.SwapKind.GIVEN_IN; } modifier onlyThis { _onlyThis(); _; } function _onlyThis() private view { if (msg.sender != address(this)) revert NotAuthorized(); } function _initBridgeMapping() private { bridgeToUse[keccak256(abi.encode("CIRCLE"))] = "bridgeCircle()"; bridgeToUse[keccak256(abi.encode("STARGATE"))] = "bridgeStargate()"; bridgeToUse[keccak256(abi.encode("AXELAR"))] = "bridgeAxelar()"; bridgeToUse[keccak256(abi.encode("SYNAPSE"))] = "bridgeSynapse()"; bridgeToUse[keccak256(abi.encode("zkEVM"))] = "bridgezkEVM()"; bridgeToUse[keccak256(abi.encode("zkSYNC"))] = "bridgezkSync()"; } function _initSwapMapping() private { swapToUse[keccak256(abi.encode("UNISWAP_V2"))] = "swapUniV2()"; swapToUse[keccak256(abi.encode("SOLIDLY"))] = "swapSolidly()"; swapToUse[keccak256(abi.encode("UNISWAP_V3"))] = "swapUniV3()"; swapToUse[keccak256(abi.encode("UNISWAP_V3_DEADLINE"))] = "swapUniV3Deadline()"; swapToUse[keccak256(abi.encode("ALGEBRA"))] = "swapAlgebra()"; swapToUse[keccak256(abi.encode("BALANCER"))] = "swapBalancer()"; } function harvest() external { // We just wrap the native we have at the start. _wrapNative(); _sendCowllectorFunds(); if (_balanceOfNative() > 0) _bridge(); } function _swap() private { address(this).functionCall( abi.encodeWithSignature(swapToUse[activeSwap]) ); } function _bridge() private { address(this).functionCall( abi.encodeWithSignature(bridgeToUse[activeBridge]) ); } /**@notice Bridge function called by this contract if it is the the activeBridge */ function bridgeCircle() external onlyThis { uint32 destinationDomain = abi.decode(bridgeParams.params, (uint32)); _swap(); uint256 bal = _balanceOfStable(); if (bal > minBridgeAmount) { ICircle(bridgeParams.bridge).depositForBurn( bal, destinationDomain, bytes32(uint256(uint160(destinationAddress.destination))), address(stable) ); } emit Bridged(address(stable), bal); } function bridgeStargate() external onlyThis { (Stargate memory _params) = abi.decode(bridgeParams.params, (Stargate)); IStargate.lzTxObj memory _lzTxObj = IStargate.lzTxObj({ dstGasForCall: _params.gasLimit, dstNativeAmount: 0, dstNativeAddr: "0x" }); uint256 gasAmount = _stargateGasCost(_params.dstChainId, destinationAddress.destinationBytes, _lzTxObj); _getGas(gasAmount); _swap(); uint256 bal = _balanceOfStable(); if (bal > minBridgeAmount) { IStargate(bridgeParams.bridge).swap{ value: gasAmount }( _params.dstChainId, _params.srcPoolId, _params.dstPoolId, payable(address(this)), bal, 0, _lzTxObj, destinationAddress.destinationBytes, "" ); } emit Bridged(address(stable), bal); } function _stargateGasCost(uint16 _dstChainId, bytes memory _dstAddress, IStargate.lzTxObj memory _lzTxObj) private view returns (uint256 gasAmount) { (gasAmount,) = IStargate(bridgeParams.bridge).quoteLayerZeroFee( _dstChainId, 1, // TYPE_SWAP_REMOTE _dstAddress, "", _lzTxObj ); } function bridgeAxelar() external onlyThis { Axelar memory params = abi.decode(bridgeParams.params, (Axelar)); _swap(); uint256 bal = _balanceOfStable(); if (bal > minBridgeAmount) { IAxelar(bridgeParams.bridge).sendToken( params.destinationChain, destinationAddress.destinationString, params.symbol, bal ); } emit Bridged(address(stable), bal); } function bridgeSynapse() external onlyThis { (Synapse memory params) = abi.decode(bridgeParams.params, (Synapse)); _swap(); uint256 bal = _balanceOfStable(); if (bal > minBridgeAmount) { ISynapse(bridgeParams.bridge).swapAndRedeemAndSwap( destinationAddress.destination, params.chainId, params.token, params.tokenIndexFrom, params.tokenIndexTo, bal, 0, block.timestamp, params.dstIndexFrom, params.dstIndexTo, 0, block.timestamp + 1 hours ); } emit Bridged(address(stable), bal); } function bridgezkEVM() external onlyThis { _swap(); uint256 bal = _balanceOfStable(); if (bal > minBridgeAmount) { IzkEVM(bridgeParams.bridge).bridgeAsset( 0, destinationAddress.destination, bal, address(stable), true, "" ); } emit Bridged(address(stable), bal); } function bridgezkSync() external onlyThis { _swap(); uint256 bal = _balanceOfStable(); if (bal > minBridgeAmount) { IzkSync(bridgeParams.bridge).withdraw( destinationAddress.destination, address(stable), bal ); } emit Bridged(address(stable), bal); } /**@notice Swap functions */ function swapUniV2() external onlyThis { address[] memory route = abi.decode(swapParams.params, (address[])); if (route[0] != address(native)) revert IncorrectRoute(); if (route[route.length - 1] != address(stable)) revert IncorrectRoute(); uint256 bal = _balanceOfNative(); IUniswapRouterETH(swapParams.router).swapExactTokensForTokens( bal, 0, route, address(this), block.timestamp ); } function swapSolidly() external onlyThis { ISolidlyRouter.Routes[] memory routes = abi.decode(swapParams.params, (ISolidlyRouter.Routes[])); address[] memory route = _solidlyToRoute(routes); if (route[0] != address(native)) revert IncorrectRoute(); if (route[route.length - 1] != address(stable)) revert IncorrectRoute(); uint256 bal = _balanceOfNative(); ISolidlyRouter(swapParams.router).swapExactTokensForTokens(bal, 0, routes, address(this), block.timestamp); } function swapUniV3() external onlyThis { bytes memory path = abi.decode(swapParams.params, (bytes)); address[] memory route = _pathToRoute(path); if (route[0] != address(native)) revert IncorrectRoute(); if (route[route.length - 1] != address(stable)) revert IncorrectRoute(); uint256 bal = _balanceOfNative(); UniV3Actions.swapV3(swapParams.router, path, bal); } function swapUniV3Deadline() external onlyThis { bytes memory path = abi.decode(swapParams.params, (bytes)); address[] memory route = _pathToRoute(path); if (route[0] != address(native)) revert IncorrectRoute(); if (route[route.length - 1] != address(stable)) revert IncorrectRoute(); uint256 bal = _balanceOfNative(); UniV3Actions.swapV3WithDeadline(swapParams.router, path, bal); } function swapAlgebra() external onlyThis { address[] memory route = abi.decode(swapParams.params, (address[])); if (route[0] != address(native)) revert IncorrectRoute(); if (route[route.length - 1] != address(stable)) revert IncorrectRoute(); bytes memory path = _routeToPath(route); uint256 bal = _balanceOfNative(); UniV3Actions.swapV3WithDeadline(swapParams.router, path, bal); } function swapBalancer() external onlyThis { (BeefyBalancerStructs.BatchSwapStruct[] memory route, address[] memory assets) = abi.decode(swapParams.params, (BeefyBalancerStructs.BatchSwapStruct[],address[])); if (assets[0] != address(native)) revert IncorrectRoute(); if (assets[assets.length - 1] != address(stable)) revert IncorrectRoute(); uint256 bal = _balanceOfNative(); IBalancerVault.BatchSwapStep[] memory _swaps = BalancerActionsLib.buildSwapStructArray(route, bal); BalancerActionsLib.balancerSwap(swapParams.router, swapKind, _swaps, assets, funds, int256(bal)); } /**@notice View functions */ function _balanceOfStable() private view returns (uint256) { return stable.balanceOf(address(this)); } function _balanceOfNative() private view returns (uint256) { return native.balanceOf(address(this)); } function findHash(string calldata _variable) external pure returns (bytes32) { return keccak256(abi.encode(_variable)); } // Convert encoded path to token route function _pathToRoute(bytes memory _path) private pure returns (address[] memory) { uint256 numPools = _path.numPools(); address[] memory route = new address[](numPools + 1); for (uint256 i; i < numPools; i++) { (address tokenA, address tokenB,) = _path.decodeFirstPool(); route[i] = tokenA; route[i + 1] = tokenB; _path = _path.skipToken(); } return route; } // Convert token route to encoded path // uint24 type for fees so path is packed tightly function _routeToPath(address[] memory _route) private pure returns (bytes memory path) { path = abi.encodePacked(_route[0]); for (uint256 i = 1; i < _route.length; i++) { path = abi.encodePacked(path, _route[i]); } } function _solidlyToRoute(ISolidlyRouter.Routes[] memory _route) private pure returns (address[] memory) { address[] memory route = new address[](_route.length + 1); route[0] = _route[0].from; for (uint i; i < _route.length; ++i) { route[i + 1] = _route[i].to; } return route; } function _sendCowllectorFunds() private { if (cowllector.sendFunds) { uint256 amountOnHand = address(cowllector.cowllector).balance + IERC20(native).balanceOf(cowllector.cowllector); if (amountOnHand < cowllector.amountCowllectorNeeds) { uint256 thisBal = _balanceOfNative(); uint256 amountToSend = cowllector.amountCowllectorNeeds - amountOnHand; amountToSend = amountToSend > thisBal ? thisBal : amountToSend; IERC20(native).safeTransfer(cowllector.cowllector, amountToSend); emit CowllectorRefill(amountToSend); } } } function _getGas(uint256 _gasAmount) private { uint256 nativeBal = _balanceOfNative(); if (nativeBal >= _gasAmount) { try IWrappedNative(address(native)).withdraw(_gasAmount) { // Do nothing. Chains like Metis will fail this. } catch { // Do nothing as well. } } } function _wrapNative() private { uint256 bal = address(this).balance; if (bal > 0) { try IWrappedNative(address(native)).deposit{value: address(this).balance}() { // Do nothing. Metis needs this try/catch. } catch { // Do nothing. } } } function _approveTokenIfNeeded(address token, address spender) private { if (IERC20(token).allowance(address(this), spender) == 0) { IERC20(token).safeApprove(spender, type(uint256).max); } } function _removeApprovalIfNeeded(address token, address spender) private { if (IERC20(token).allowance(address(this), spender) > 0) { IERC20(token).safeApprove(spender, 0); } } function _authorizeUpgrade(address) internal override onlyOwner {} // Setters function setActiveBridge(bytes32 _bridgeHash, BridgeParams calldata _params) external onlyOwner { emit SetBridge(_bridgeHash, _params); _removeApprovalIfNeeded(address(stable), bridgeParams.bridge); activeBridge = _bridgeHash; bridgeParams = _params; _approveTokenIfNeeded(address(stable), _params.bridge); } function setActiveSwap(bytes32 _swapHash, SwapParams calldata _params) external onlyOwner { emit SetSwap(_swapHash, _params); _removeApprovalIfNeeded(address(native), swapParams.router); activeSwap = _swapHash; swapParams = _params; _approveTokenIfNeeded(address(native), _params.router); } function setCowllector(Cowllector calldata _cowllector) external onlyOwner { cowllector = _cowllector; } function setDestinationAddress(DestinationAddress calldata _destination) external onlyOwner { emit SetDestinationAddress(_destination); destinationAddress = _destination; } function setMinBridgeAmount(uint256 _amount) external onlyOwner { emit SetMinBridgeAmount(_amount); minBridgeAmount = _amount; } function setStable(IERC20 _stable, IERC20 _native) external onlyOwner { if (!init) { stable = _stable; native = _native; init = true; return; } emit SetStable(address(stable), address(_stable)); _removeApprovalIfNeeded(address(stable), bridgeParams.bridge); stable = _stable; _approveTokenIfNeeded(address(stable), bridgeParams.bridge); } function inCaseTokensGetStuck(address _token, bool _native) external onlyOwner { if (_native) { uint256 _nativeAmount = address(this).balance; (bool sent,) = msg.sender.call{value: _nativeAmount}(""); if(!sent) revert FailedToSendEther(); } else { uint256 _amount = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(msg.sender, _amount); } } receive() external payable { assert(msg.sender == address(native)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"BridgeError","type":"error"},{"inputs":[],"name":"FailedToSendEther","type":"error"},{"inputs":[],"name":"IncorrectRoute","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"NotEnoughEth","type":"error"},{"inputs":[],"name":"SwapError","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stable","type":"address"},{"indexed":false,"internalType":"uint256","name":"stableBridged","type":"uint256"}],"name":"Bridged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CowllectorRefill","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"bridge","type":"bytes32"},{"components":[{"internalType":"address","name":"bridge","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"indexed":false,"internalType":"struct Structs.BridgeParams","name":"params","type":"tuple"}],"name":"SetBridge","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"destinationBytes","type":"bytes"},{"internalType":"string","name":"destinationString","type":"string"}],"indexed":false,"internalType":"struct Structs.DestinationAddress","name":"destinationAddress","type":"tuple"}],"name":"SetDestinationAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMinBridgeAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldStable","type":"address"},{"indexed":false,"internalType":"address","name":"newStable","type":"address"}],"name":"SetStable","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"swap","type":"bytes32"},{"components":[{"internalType":"address","name":"router","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"indexed":false,"internalType":"struct Structs.SwapParams","name":"params","type":"tuple"}],"name":"SetSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"activeBridge","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeSwap","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeAxelar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeCircle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeParams","outputs":[{"internalType":"address","name":"bridge","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeStargate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeSynapse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bridgeToUse","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgezkEVM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgezkSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cowllector","outputs":[{"internalType":"bool","name":"sendFunds","type":"bool"},{"internalType":"address","name":"cowllector","type":"address"},{"internalType":"uint256","name":"amountCowllectorNeeds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"destinationAddress","outputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"destinationBytes","type":"bytes"},{"internalType":"string","name":"destinationString","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_variable","type":"string"}],"name":"findHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"funds","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"fromInternalBalance","type":"bool"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"bool","name":"toInternalBalance","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_native","type":"bool"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBridgeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_bridgeHash","type":"bytes32"},{"components":[{"internalType":"address","name":"bridge","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"internalType":"struct Structs.BridgeParams","name":"_params","type":"tuple"}],"name":"setActiveBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapHash","type":"bytes32"},{"components":[{"internalType":"address","name":"router","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"internalType":"struct Structs.SwapParams","name":"_params","type":"tuple"}],"name":"setActiveSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"sendFunds","type":"bool"},{"internalType":"address","name":"cowllector","type":"address"},{"internalType":"uint256","name":"amountCowllectorNeeds","type":"uint256"}],"internalType":"struct Structs.Cowllector","name":"_cowllector","type":"tuple"}],"name":"setCowllector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"destinationBytes","type":"bytes"},{"internalType":"string","name":"destinationString","type":"string"}],"internalType":"struct Structs.DestinationAddress","name":"_destination","type":"tuple"}],"name":"setDestinationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMinBridgeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stable","type":"address"},{"internalType":"contract IERC20","name":"_native","type":"address"}],"name":"setStable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stable","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAlgebra","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapBalancer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapKind","outputs":[{"internalType":"enum IBalancerVault.SwapKind","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapParams","outputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapSolidly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"swapToUse","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapUniV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapUniV3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapUniV3Deadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523060805234801561001457600080fd5b50608051615aca6200004d60003960008181610daa01528181610df301528181610ebc01528181610efc01526112150152615aca6000f3fe60806040526004361061024a5760003560e01c80638129fc1c11610139578063c4b00c4f116100b6578063d7d66e711161007a578063d7d66e71146106c9578063ee63c1e5146106e9578063f2fde38b146106fe578063f3f1a71a1461071e578063fe8d1ab01461073e578063ff33d21f1461075357600080fd5b8063c4b00c4f146105ea578063c89f2ce41461060a578063ca3254691461067b578063cc5ea4ef1461069f578063d49b6408146106b457600080fd5b8063a5131aaa116100fd578063a5131aaa14610536578063b54653fb1461054b578063b9f391471461059f578063bac86af5146105b4578063c3c22475146105d457600080fd5b80638129fc1c146104b4578063873d80ec146104c95780638da5cb5b146104ec578063943f8e961461050a5780639c345b9f1461052057600080fd5b80635109d8b6116101c75780636ae407111161018b5780636ae40711146104285780636d0a68911461043d57806370c751071461046a578063715018a61461048a578063748b3c051461049f57600080fd5b80635109d8b61461039457806352d1902d146103a9578063530728d5146103cc57806364e510a1146103e1578063671f6a261461040157600080fd5b806322be3de11161020e57806322be3de11461030c5780633659cfe61461032c5780634641257d1461034c5780634f1ef286146103615780635066a7471461037457600080fd5b80630278fb8a14610270578063057d1ae3146102855780630d1f78331461029a57806311b0b42d146102af5780631610ee40146102ec57600080fd5b3661026b5760cd546001600160a01b0316331461026957610269614313565b005b600080fd5b34801561027c57600080fd5b50610269610773565b34801561029157600080fd5b50610269610905565b3480156102a657600080fd5b50610269610b6a565b3480156102bb57600080fd5b5060cd546102cf906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f857600080fd5b5061026961030736600461433b565b610d4f565b34801561031857600080fd5b5060cc546102cf906001600160a01b031681565b34801561033857600080fd5b50610269610347366004614384565b610da0565b34801561035857600080fd5b50610269610e88565b61026961036f366004614436565b610eb2565b34801561038057600080fd5b5061026961038f3660046144da565b610f82565b3480156103a057600080fd5b50610269611015565b3480156103b557600080fd5b506103be611208565b6040519081526020016102e3565b3480156103d857600080fd5b506102696112bb565b3480156103ed57600080fd5b506102696103fc3660046144da565b6113a8565b34801561040d57600080fd5b5060c95461041b9060ff1681565b6040516102e39190614542565b34801561043457600080fd5b50610269611436565b34801561044957600080fd5b5061045d610458366004614550565b61161c565b6040516102e391906145b9565b34801561047657600080fd5b506103be6104853660046145cc565b6116b6565b34801561049657600080fd5b506102696116ea565b3480156104ab57600080fd5b506102696116fc565b3480156104c057600080fd5b5061026961186c565b3480156104d557600080fd5b506104de6119e4565b6040516102e392919061463d565b3480156104f857600080fd5b506033546001600160a01b03166102cf565b34801561051657600080fd5b506103be60cf5481565b34801561052c57600080fd5b506103be60ce5481565b34801561054257600080fd5b50610269611a85565b34801561055757600080fd5b5060d05460d15461057a9160ff8116916101009091046001600160a01b03169083565b6040805193151584526001600160a01b039092166020840152908201526060016102e3565b3480156105ab57600080fd5b50610269611af1565b3480156105c057600080fd5b506102696105cf36600461466f565b611c7d565b3480156105e057600080fd5b506103be60d95481565b3480156105f657600080fd5b506102696106053660046146a8565b611d77565b34801561061657600080fd5b5060ca5460cb54610646916001600160a01b038082169260ff600160a01b93849004811693928216929091041684565b6040516102e394939291906001600160a01b039485168152921515602084015292166040820152901515606082015260800190565b34801561068757600080fd5b50610690611d8c565b6040516102e3939291906146c4565b3480156106ab57600080fd5b50610269611ebb565b3480156106c057600080fd5b506104de612056565b3480156106d557600080fd5b506102696106e4366004614550565b612074565b3480156106f557600080fd5b506102696120b4565b34801561070a57600080fd5b50610269610719366004614384565b612240565b34801561072a57600080fd5b5061045d610739366004614550565b6122b6565b34801561074a57600080fd5b506102696122cf565b34801561075f57600080fd5b5061026961076e3660046146fa565b612458565b61077b612534565b600060d4600101805461078d90614728565b80601f01602080910402602001604051908101604052809291908181526020018280546107b990614728565b80156108065780601f106107db57610100808354040283529160200191610806565b820191906000526020600020905b8154815290600101906020018083116107e957829003601f168201915b505050505080602001905181019061081e91906147ee565b60cd5481519192506001600160a01b031690829060009061084157610841614822565b60200260200101516001600160a01b031614610870576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b0390911690829061088f9060019061484e565b8151811061089f5761089f614822565b60200260200101516001600160a01b0316146108ce576040516376c252e160e11b815260040160405180910390fd5b60006108d982612554565b905060006108e561260d565b60d4549091506108ff906001600160a01b03168383612680565b50505050565b61090d612534565b600060d2600101805461091f90614728565b80601f016020809104026020016040519081016040528092919081815260200182805461094b90614728565b80156109985780601f1061096d57610100808354040283529160200191610998565b820191906000526020600020905b81548152906001019060200180831161097b57829003601f168201915b50505050508060200190518101906109b09190614861565b905060006040518060600160405280836020015181526020016000815260200160405180604001604052806002815260200161060f60f31b81525081525090506000610a8e836000015160d66001018054610a0a90614728565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3690614728565b8015610a835780601f10610a5857610100808354040283529160200191610a83565b820191906000526020600020905b815481529060010190602001808311610a6657829003601f168201915b505050505084612721565b9050610a99816127a2565b610aa1612815565b6000610aab612876565b905060d954811115610b345760d2548451604080870151606088015191516327efc43f60e21b81526001600160a01b0390941693639fbf10fc938793610b01939192309089906000908d9060d79060040161497c565b6000604051808303818588803b158015610b1a57600080fd5b505af1158015610b2e573d6000803e3d6000fd5b50505050505b60cc546040518281526001600160a01b0390911690600080516020615a2e8339815191529060200160405180910390a250505050565b610b72612534565b60008060d46001018054610b8590614728565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb190614728565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b5050505050806020019051810190610c1691906149f6565b60cd5481519294509092506001600160a01b0316908290600090610c3c57610c3c614822565b60200260200101516001600160a01b031614610c6b576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b03909116908290610c8a9060019061484e565b81518110610c9a57610c9a614822565b60200260200101516001600160a01b031614610cc9576040516376c252e160e11b815260040160405180910390fd5b6000610cd361260d565b90506000610ce184836128a7565b60d45460c9546040805160808101825260ca546001600160a01b03808216835260ff600160a01b9283900481161515602085015260cb548083169585019590955291909304811615156060830152949550610d489491909316929116908490879087612ab0565b5050505050565b610d57612bfa565b7f518f47fcfba5d9b707c3387a7fa4301136192d8091a43ea13ae8db7275ab5d3a81604051610d869190614b49565b60405180910390a18060d6610d9b8282614d36565b505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610df15760405162461bcd60e51b8152600401610de890614e2f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e3a600080516020615a4e833981519152546001600160a01b031690565b6001600160a01b031614610e605760405162461bcd60e51b8152600401610de890614e7b565b610e6981612c54565b60408051600080825260208201909252610e8591839190612c5c565b50565b610e90612dc7565b610e98612e38565b6000610ea261260d565b1115610eb057610eb0612f71565b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610efa5760405162461bcd60e51b8152600401610de890614e2f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f43600080516020615a4e833981519152546001600160a01b031690565b6001600160a01b031614610f695760405162461bcd60e51b8152600401610de890614e7b565b610f7282612c54565b610f7e82826001612c5c565b5050565b610f8a612bfa565b7f25f7dd6fc737add5174192a11292dfd270c1397f9c4f641fb6336a208b5efbed8282604051610fbb929190614f0a565b60405180910390a160cd5460d454610fdf916001600160a01b039081169116612fa1565b60cf8290558060d4610ff18282614fff565b505060cd54610f7e906001600160a01b03166110106020840184614384565b613030565b61101d612534565b600060d4600101805461102f90614728565b80601f016020809104026020016040519081016040528092919081815260200182805461105b90614728565b80156110a85780601f1061107d576101008083540402835291602001916110a8565b820191906000526020600020905b81548152906001019060200180831161108b57829003601f168201915b50505050508060200190518101906110c09190615009565b905060006110cd826130bd565b60cd5481519192506001600160a01b03169082906000906110f0576110f0614822565b60200260200101516001600160a01b03161461111f576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b0390911690829061113e9060019061484e565b8151811061114e5761114e614822565b60200260200101516001600160a01b03161461117d576040516376c252e160e11b815260040160405180910390fd5b600061118761260d565b60d454604051631e82ecdb60e31b81529192506001600160a01b03169063f41766d8906111c19084906000908890309042906004016150e1565b6000604051808303816000875af11580156111e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108ff9190810190615176565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a85760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610de8565b50600080516020615a4e83398151915290565b6112c3612534565b6112cb612815565b60006112d5612876565b905060d9548111156113755760d25460d65460cc5460405163cd58657960e01b81526000600482018190526001600160a01b0393841660248301526044820186905291831660648201526001608482015260c060a482015260c481019190915291169063cd5865799060e4015b600060405180830381600087803b15801561135c57600080fd5b505af1158015611370573d6000803e3d6000fd5b505050505b60cc546040518281526001600160a01b0390911690600080516020615a2e8339815191529060200160405180910390a250565b6113b0612bfa565b7f5e355369ceaccb04ff615500f99b96912ce9f237ed35ae521487c19064e2318d82826040516113e1929190614f0a565b60405180910390a160cc5460d254611405916001600160a01b039081169116612fa1565b60ce8290558060d26114178282614fff565b505060cc54610f7e906001600160a01b03166110106020840184614384565b61143e612534565b600060d4600101805461145090614728565b80601f016020809104026020016040519081016040528092919081815260200182805461147c90614728565b80156114c95780601f1061149e576101008083540402835291602001916114c9565b820191906000526020600020905b8154815290600101906020018083116114ac57829003601f168201915b50505050508060200190518101906114e191906147ee565b60cd5481519192506001600160a01b031690829060009061150457611504614822565b60200260200101516001600160a01b031614611533576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b039091169082906115529060019061484e565b8151811061156257611562614822565b60200260200101516001600160a01b031614611591576040516376c252e160e11b815260040160405180910390fd5b600061159b61260d565b60d4546040516338ed173960e01b81529192506001600160a01b0316906338ed1739906115d590849060009087903090429060040161524a565b6000604051808303816000875af11580156115f4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d9b9190810190615176565b60db602052600090815260409020805461163590614728565b80601f016020809104026020016040519081016040528092919081815260200182805461166190614728565b80156116ae5780601f10611683576101008083540402835291602001916116ae565b820191906000526020600020905b81548152906001019060200180831161169157829003601f168201915b505050505081565b600082826040516020016116cb929190615286565b6040516020818303038152906040528051906020012090505b92915050565b6116f2612bfa565b610eb060006131db565b611704612534565b600060d2600101805461171690614728565b80601f016020809104026020016040519081016040528092919081815260200182805461174290614728565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b50505050508060200190518101906117a791906152ea565b90506117b1612815565b60006117bb612876565b905060d9548111156118375760d254825160208401516040516326ef699d60e01b81526001600160a01b03909316926326ef699d9261180492909160d891908790600401615390565b600060405180830381600087803b15801561181e57600080fd5b505af1158015611832573d6000803e3d6000fd5b505050505b60cc546040518281526001600160a01b0390911690600080516020615a2e833981519152906020015b60405180910390a25050565b600054610100900460ff161580801561188c5750600054600160ff909116105b806118a65750303b1580156118a6575060005460ff166001145b6119095760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610de8565b6000805460ff19166001179055801561192c576000805461ff0019166101001790555b61193461322d565b61193c61325c565b611944613583565b604080516080810182523080825260006020830181905292820181905260609091019190915260ca805460ff60a01b199092166001600160a81b0319928316811790915560cb805490921617905560c9805460ff191690558015610e85576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60d4805460d580546001600160a01b039092169291611a0290614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2e90614728565b8015611a7b5780601f10611a5057610100808354040283529160200191611a7b565b820191906000526020600020905b815481529060010190602001808311611a5e57829003601f168201915b5050505050905082565b611a8d612534565b611a95612815565b6000611a9f612876565b905060d9548111156113755760d25460d65460cc54604051636ce5768960e11b81526001600160a01b03928316600482015290821660248201526044810184905291169063d9caed1290606401611342565b611af9612534565b600060d46001018054611b0b90614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3790614728565b8015611b845780601f10611b5957610100808354040283529160200191611b84565b820191906000526020600020905b815481529060010190602001808311611b6757829003601f168201915b5050505050806020019051810190611b9c91906153db565b90506000611ba98261388c565b60cd5481519192506001600160a01b0316908290600090611bcc57611bcc614822565b60200260200101516001600160a01b031614611bfb576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b03909116908290611c1a9060019061484e565b81518110611c2a57611c2a614822565b60200260200101516001600160a01b031614611c59576040516376c252e160e11b815260040160405180910390fd5b6000611c6361260d565b60d4549091506108ff906001600160a01b03168483612680565b611c85612bfa565b8015611cf6576040514790600090339083908381818185875af1925050503d8060008114611ccf576040519150601f19603f3d011682016040523d82523d6000602084013e611cd4565b606091505b50509050806108ff57604051630dcf35db60e41b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190615423565b9050610d9b6001600160a01b038416338361398f565b611d7f612bfa565b8060d0610d9b828261543c565b60d6805460d780546001600160a01b039092169291611daa90614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd690614728565b8015611e235780601f10611df857610100808354040283529160200191611e23565b820191906000526020600020905b815481529060010190602001808311611e0657829003601f168201915b505050505090806002018054611e3890614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6490614728565b8015611eb15780601f10611e8657610100808354040283529160200191611eb1565b820191906000526020600020905b815481529060010190602001808311611e9457829003601f168201915b5050505050905083565b611ec3612534565b600060d26001018054611ed590614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0190614728565b8015611f4e5780601f10611f2357610100808354040283529160200191611f4e565b820191906000526020600020905b815481529060010190602001808311611f3157829003601f168201915b5050505050806020019051810190611f6691906154b0565b9050611f70612815565b6000611f7a612876565b905060d9548111156118375760d25460d6548351606085015160208601516040870151608088015160a08901516001600160a01b0397881697639f330727971695949392918991600091429183611fd384610e10615549565b6040516001600160e01b031960e08f901b1681526001600160a01b039c8d166004820152602481019b909b529a90981660448a015260ff96871660648a0152948616608489015260a488019390935260c487019190915260e486015282166101048501521661012483015261014482015261016481019190915261018401611804565b60d2805460d380546001600160a01b039092169291611a0290614728565b61207c612bfa565b6040518181527ff4f47d85dc8207b9d9c6dfd289d4f5008b33df899eda3da90658d75c351e54759060200160405180910390a160d955565b6120bc612534565b600060d460010180546120ce90614728565b80601f01602080910402602001604051908101604052809291908181526020018280546120fa90614728565b80156121475780601f1061211c57610100808354040283529160200191612147565b820191906000526020600020905b81548152906001019060200180831161212a57829003601f168201915b505050505080602001905181019061215f91906153db565b9050600061216c8261388c565b60cd5481519192506001600160a01b031690829060009061218f5761218f614822565b60200260200101516001600160a01b0316146121be576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b039091169082906121dd9060019061484e565b815181106121ed576121ed614822565b60200260200101516001600160a01b03161461221c576040516376c252e160e11b815260040160405180910390fd5b600061222661260d565b60d4549091506108ff906001600160a01b031684836139f2565b612248612bfa565b6001600160a01b0381166122ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610de8565b610e85816131db565b60dc602052600090815260409020805461163590614728565b6122d7612534565b600060d260010180546122e990614728565b80601f016020809104026020016040519081016040528092919081815260200182805461231590614728565b80156123625780601f1061233757610100808354040283529160200191612362565b820191906000526020600020905b81548152906001019060200180831161234557829003601f168201915b505050505080602001905181019061237a919061555c565b9050612384612815565b600061238e612876565b905060d9548111156118375760d25460d65460cc546040516337e9a82760e11b81526004810185905263ffffffff861660248201526001600160a01b0392831660448201529082166064820152911690636fd3504e906084016020604051808303816000875af1158015612406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242a9190615582565b5060cc546040518281526001600160a01b0390911690600080516020615a2e83398151915290602001611860565b612460612bfa565b60da5460ff166124a55760cc80546001600160a01b039384166001600160a01b03199182161790915560cd805492909316911617905560da805460ff19166001179055565b60cc54604080516001600160a01b03928316815291841660208301527f4239efeca0761c0d170bd15a6e85542dbe0376ba0f5f1551b39c6045866ff735910160405180910390a160cc5460d254612508916001600160a01b039081169116612fa1565b60cc80546001600160a01b0319166001600160a01b0384811691821790925560d254610f7e9216613030565b333014610eb05760405163ea8e4eb560e01b815260040160405180910390fd5b60608160008151811061256957612569614822565b6020026020010151604051602001612599919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f19818403018152919052905060015b825181101561260757818382815181106125ca576125ca614822565b60200260200101516040516020016125e39291906155ab565b604051602081830303815290604052915080806125ff906155e2565b9150506125ae565b50919050565b60cd546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024015b602060405180830381865afa158015612657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267b9190615423565b905090565b6040805160a081018252838152306020820152428183015260608101839052600060808201819052915163c04b8d5960e01b81526001600160a01b0386169063c04b8d59906126d39084906004016155fb565b6020604051808303816000875af11580156126f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127169190615423565b9150505b9392505050565b60d254604051630a51236960e01b81526000916001600160a01b031690630a5123699061275990879060019088908890600401615653565b6040805180830381865afa158015612775573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612799919061569d565b50949350505050565b60006127ac61260d565b9050818110610f7e5760cd54604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b1580156127fb57600080fd5b505af192505050801561280c575060015b15610f7e575050565b60cf54600090815260dc6020526040908190208151600481526024810192839052610e85929091612845916156c1565b6040519081900390206020820180516001600160e01b03166001600160e01b03199092169190911790523090613a3f565b60cc546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240161263a565b6060600083516001600160401b038111156128c4576128c46143a1565b60405190808252806020026020018201604052801561292a57816020015b6129176040518060a0016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b8152602001906001900390816128e25790505b50905060005b8451811015612aa857806000036129f4576040518060a001604052808660008151811061295f5761295f614822565b60200260200101516000015181526020018660008151811061298357612983614822565b6020026020010151602001518152602001866000815181106129a7576129a7614822565b602002602001015160400151815260200185815260200160405180602001604052806000815250815250826000815181106129e4576129e4614822565b6020026020010181905250612aa0565b6040518060a00160405280868381518110612a1157612a11614822565b6020026020010151600001518152602001868381518110612a3457612a34614822565b6020026020010151602001518152602001868381518110612a5757612a57614822565b60200260200101516040015181526020016000815260200160405180602001604052806000815250815250828281518110612a9457612a94614822565b60200260200101819052505b600101612930565b509392505050565b6060600084516001600160401b03811115612acd57612acd6143a1565b604051908082528060200260200182016040528015612af6578160200160208202803683370190505b50905060005b8551811015612b705780600003612b32578382600081518110612b2157612b21614822565b602002602001018181525050612b68565b60018651612b40919061484e565b8103612b6857600019828281518110612b5b57612b5b614822565b6020026020010181815250505b600101612afc565b5060405163945bcec960e01b81526001600160a01b0389169063945bcec990612ba7908a908a908a908a9088904290600401615767565b6000604051808303816000875af1158015612bc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612bee9190810190615176565b98975050505050505050565b6033546001600160a01b03163314610eb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610de8565b610e85612bfa565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612c8f57610d9b83613a83565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612ce9575060408051601f3d908101601f19168201909252612ce691810190615423565b60015b612d4c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610de8565b600080516020615a4e8339815191528114612dbb5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610de8565b50610d9b838383613b1f565b478015610e855760cd60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e1e57600080fd5b505af193505050508015612e30575060015b15610e855750565b60d05460ff1615610eb05760cd5460d0546040516370a0823160e01b81526101009091046001600160a01b03908116600483015260009216906370a0823190602401602060405180830381865afa158015612e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebb9190615423565b60d054612ed7919061010090046001600160a01b031631615549565b60d154909150811015610e85576000612eee61260d565b905060008260d060010154612f03919061484e565b9050818111612f125780612f14565b815b60d05460cd54919250612f39916001600160a01b03908116916101009004168361398f565b6040518181527feb722ef3dbafc24e43f4627f9b306563a93d546865b49eb1e64fbaffdab73d5c9060200160405180910390a1505050565b60ce54600090815260db6020526040908190208151600481526024810192839052610e85929091612845916156c1565b604051636eb1769f60e11b81523060048201526001600160a01b0382811660248301526000919084169063dd62ed3e90604401602060405180830381865afa158015612ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130159190615423565b1115610f7e57610f7e6001600160a01b038316826000613b44565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e90604401602060405180830381865afa15801561307c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a09190615423565b600003610f7e57610f7e6001600160a01b03831682600019613b44565b60606000825160016130cf9190615549565b6001600160401b038111156130e6576130e66143a1565b60405190808252806020026020018201604052801561310f578160200160208202803683370190505b5090508260008151811061312557613125614822565b6020026020010151600001518160008151811061314457613144614822565b60200260200101906001600160a01b031690816001600160a01b03168152505060005b83518110156131d45783818151811061318257613182614822565b6020026020010151602001518282600161319c9190615549565b815181106131ac576131ac614822565b6001600160a01b03909216602092830291909101909101526131cd816155e2565b9050613167565b5092915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166132545760405162461bcd60e51b8152600401610de890615880565b610eb0613c59565b6040518060400160405280600e81526020016d627269646765436972636c65282960901b81525060db60006040516020016132b190602080825260069082015265434952434c4560d01b604082015260600190565b60405160208183030381529060405280519060200120815260200190815260200160002090816132e191906158cb565b506040518060400160405280601081526020016f6272696467655374617267617465282960801b81525060db600060405160200161333b90602080825260089082015267535441524741544560c01b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161336b91906158cb565b506040518060400160405280600e81526020016d6272696467654178656c6172282960901b81525060db60006040516020016133c19060208082526006908201526520ac22a620a960d11b604082015260600190565b60405160208183030381529060405280519060200120815260200190815260200160002090816133f191906158cb565b506040518060400160405280600f81526020016e62726964676553796e61707365282960881b81525060db60006040516020016134499060208082526007908201526653594e4150534560c81b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161347991906158cb565b506040518060400160405280600d81526020016c6272696467657a6b45564d282960981b81525060db60006040516020016134cd906020808252600590820152647a6b45564d60d81b604082015260600190565b60405160208183030381529060405280519060200120815260200190815260200160002090816134fd91906158cb565b506040518060400160405280600e81526020016d6272696467657a6b53796e63282960901b81525060db6000604051602001613553906020808252600690820152657a6b53594e4360d01b604082015260600190565b6040516020818303038152906040528051906020012081526020019081526020016000209081610e8591906158cb565b6040518060400160405280600b81526020016a73776170556e695632282960a81b81525060dc60006040516020016135d9906020808252600a90820152692aa724a9aba0a82fab1960b11b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161360991906158cb565b506040518060400160405280600d81526020016c73776170536f6c69646c79282960981b81525060dc600060405160200161365f90602080825260079082015266534f4c49444c5960c81b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161368f91906158cb565b506040518060400160405280600b81526020016a73776170556e695633282960a81b81525060dc60006040516020016136e6906020808252600a9082015269554e49535741505f563360b01b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161371691906158cb565b506040518060400160405280601381526020017273776170556e695633446561646c696e65282960681b81525060dc600060405160200161377e90602080825260139082015272554e49535741505f56335f444541444c494e4560681b604082015260600190565b60405160208183030381529060405280519060200120815260200190815260200160002090816137ae91906158cb565b506040518060400160405280600d81526020016c73776170416c6765627261282960981b81525060dc600060405160200161380490602080825260079082015266414c474542524160c81b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161383491906158cb565b506040518060400160405280600e81526020016d7377617042616c616e636572282960901b81525060dc6000604051602001613553906020808252600890820152672120a620a721a2a960c11b604082015260600190565b6060600061389983613c89565b905060006138a8826001615549565b6001600160401b038111156138bf576138bf6143a1565b6040519080825280602002602001820160405280156138e8578160200160208202803683370190505b50905060005b82811015612aa85760008061390287613caf565b50915091508184848151811061391a5761391a614822565b6001600160a01b0390921660209283029190910190910152808461393f856001615549565b8151811061394f5761394f614822565b60200260200101906001600160a01b031690816001600160a01b03168152505061397887613ceb565b965050508080613987906155e2565b9150506138ee565b6040516001600160a01b038316602482015260448101829052610d9b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613d1c565b60408051608081018252838152306020820152808201839052600060608201819052915163b858183f60e01b81526001600160a01b0386169063b858183f906126d3908490600401615984565b606061271a838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250613df1565b6001600160a01b0381163b613af05760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610de8565b600080516020615a4e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b613b2883613ece565b600082511180613b355750805b15610d9b576108ff8383613f0e565b801580613bbe5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbc9190615423565b155b613c295760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610de8565b6040516001600160a01b038316602482015260448101829052610d9b90849063095ea7b360e01b906064016139bb565b600054610100900460ff16613c805760405162461bcd60e51b8152600401610de890615880565b610eb0336131db565b6000613c9760036014615549565b60148351613ca5919061484e565b6116e491906159d2565b60008080613cbd8482613f33565b9250613cca846014613fe7565b9050613ce2613cdb60036014615549565b8590613f33565b91509193909250565b60606116e4613cfc60036014615549565b613d0860036014615549565b8451613d14919061484e565b849190614092565b6000613d71826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166141e99092919063ffffffff16565b9050805160001480613d92575080806020019051810190613d9291906159f4565b610d9b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610de8565b606082471015613e525760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610de8565b600080866001600160a01b03168587604051613e6e9190615a11565b60006040518083038185875af1925050503d8060008114613eab576040519150601f19603f3d011682016040523d82523d6000602084013e613eb0565b606091505b5091509150613ec1878383876141f8565b925050505b949350505050565b613ed781613a83565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061271a8383604051806060016040528060278152602001615a6e60279139614271565b600081613f41816014615549565b1015613f845760405162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b6044820152606401610de8565b613f8f826014615549565b83511015613fd75760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610de8565b500160200151600160601b900490565b600081613ff5816003615549565b10156140375760405162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b6044820152606401610de8565b614042826003615549565b835110156140895760405162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b6044820152606401610de8565b50016003015190565b6060816140a081601f615549565b10156140df5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610de8565b826140ea8382615549565b10156141295760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610de8565b6141338284615549565b845110156141775760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610de8565b6060821580156141965760405191506000825260208201604052612799565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141cf5780518352602092830192016141b7565b5050858452601f01601f1916604052505090509392505050565b6060613ec68484600085613df1565b60608315614267578251600003614260576001600160a01b0385163b6142605760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610de8565b5081613ec6565b613ec683836142e9565b6060600080856001600160a01b03168560405161428e9190615a11565b600060405180830381855af49150503d80600081146142c9576040519150601f19603f3d011682016040523d82523d6000602084013e6142ce565b606091505b50915091506142df868383876141f8565b9695505050505050565b8151156142f95781518083602001fd5b8060405162461bcd60e51b8152600401610de891906145b9565b634e487b7160e01b600052600160045260246000fd5b60006060828403121561260757600080fd5b60006020828403121561434d57600080fd5b81356001600160401b0381111561436357600080fd5b613ec684828501614329565b6001600160a01b0381168114610e8557600080fd5b60006020828403121561439657600080fd5b813561271a8161436f565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156143d9576143d96143a1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614407576144076143a1565b604052919050565b60006001600160401b03821115614428576144286143a1565b50601f01601f191660200190565b6000806040838503121561444957600080fd5b82356144548161436f565b915060208301356001600160401b0381111561446f57600080fd5b8301601f8101851361448057600080fd5b803561449361448e8261440f565b6143df565b8181528660208385010111156144a857600080fd5b816020840160208301376000602083830101528093505050509250929050565b60006040828403121561260757600080fd5b600080604083850312156144ed57600080fd5b8235915060208301356001600160401b0381111561450a57600080fd5b614516858286016144c8565b9150509250929050565b6002811061453e57634e487b7160e01b600052602160045260246000fd5b9052565b602081016116e48284614520565b60006020828403121561456257600080fd5b5035919050565b60005b8381101561458457818101518382015260200161456c565b50506000910152565b600081518084526145a5816020860160208601614569565b601f01601f19169290920160200192915050565b60208152600061271a602083018461458d565b600080602083850312156145df57600080fd5b82356001600160401b03808211156145f657600080fd5b818501915085601f83011261460a57600080fd5b81358181111561461957600080fd5b86602082850101111561462b57600080fd5b60209290920196919550909350505050565b6001600160a01b0383168152604060208201819052600090613ec69083018461458d565b8015158114610e8557600080fd5b6000806040838503121561468257600080fd5b823561468d8161436f565b9150602083013561469d81614661565b809150509250929050565b6000606082840312156146ba57600080fd5b61271a8383614329565b6001600160a01b03841681526060602082018190526000906146e89083018561458d565b82810360408401526142df818561458d565b6000806040838503121561470d57600080fd5b82356147188161436f565b9150602083013561469d8161436f565b600181811c9082168061473c57607f821691505b60208210810361260757634e487b7160e01b600052602260045260246000fd5b60006001600160401b03821115614775576147756143a1565b5060051b60200190565b600082601f83011261479057600080fd5b815160206147a061448e8361475c565b82815260059290921b840181019181810190868411156147bf57600080fd5b8286015b848110156147e35780516147d68161436f565b83529183019183016147c3565b509695505050505050565b60006020828403121561480057600080fd5b81516001600160401b0381111561481657600080fd5b613ec68482850161477f565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156116e4576116e4614838565b60006080828403121561487357600080fd5b604051608081018181106001600160401b0382111715614895576148956143a1565b604052825161ffff811681146148aa57600080fd5b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b80518252602081015160208301526000604082015160606040850152613ec6606085018261458d565b6000815461490c81614728565b808552602060018381168015614929576001811461494357614971565b60ff1985168884015283151560051b880183019550614971565b866000528260002060005b858110156149695781548a820186015290830190840161494e565b890184019650505b505050505092915050565b600061012061ffff8b16835289602084015288604084015260018060a01b03881660608401528660808401528560a08401528060c08401526149c0818401866148d6565b905082810360e08401526149d481856148ff565b8381036101009094019390935250506000815260200198975050505050505050565b6000806040808486031215614a0a57600080fd5b83516001600160401b0380821115614a2157600080fd5b818601915086601f830112614a3557600080fd5b81516020614a4561448e8361475c565b8281526060928302850182019282820191908b851115614a6457600080fd5b958301955b84871015614aac5780878d031215614a815760008081fd5b614a896143b7565b875181528488015185820152888801518982015283529586019591830191614a69565b5091890151919750909450505080831115614ac657600080fd5b50506145168582860161477f565b6000808335601e19843603018112614aeb57600080fd5b83016020810192503590506001600160401b03811115614b0a57600080fd5b803603821315614b1957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260008235614b5a8161436f565b6001600160a01b0316602083810191909152614b7890840184614ad4565b60606040850152614b8d608085018284614b20565b915050614b9d6040850185614ad4565b848303601f190160608601526142df838284614b20565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000808335601e19843603018112614beb57600080fd5b8301803591506001600160401b03821115614c0557600080fd5b602001915036819003821315614b1957600080fd5b601f821115610d9b57600081815260208120601f850160051c81016020861015614c415750805b601f850160051c820191505b81811015614c6057828155600101614c4d565b505050505050565b600019600383901b1c191660019190911b1790565b6001600160401b03831115614c9457614c946143a1565b614ca883614ca28354614728565b83614c1a565b6000601f841160018114614cd65760008515614cc45750838201355b614cce8682614c68565b845550610d48565b600083815260209020601f19861690835b82811015614d075786850135825560209485019460019092019101614ce7565b5086821015614d245760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8135614d418161436f565b614d4b8183614bb4565b5060018082016020614d5f81860186614bd4565b6001600160401b03811115614d7657614d766143a1565b614d8a81614d848654614728565b86614c1a565b6000601f821160018114614db85760008315614da65750838201355b614db08482614c68565b875550614e0d565b600086815260209020601f19841690835b82811015614de65786850135825593870193908901908701614dc9565b5084821015614e035760001960f88660031b161c19848701351681555b50508683881b0186555b50505050505050614e216040830183614bd4565b6108ff818360028601614c7d565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60008135614ed48161436f565b6001600160a01b03168352614eec6020830183614ad4565b60406020860152614f01604086018284614b20565b95945050505050565b828152604060208201526000613ec66040830184614ec7565b8135614f2e8161436f565b614f388183614bb4565b5060018082016020614f4c81860186614bd4565b6001600160401b03811115614f6357614f636143a1565b614f7181614d848654614728565b6000601f821160018114614f9f5760008315614f8d5750838201355b614f978482614c68565b875550614ff4565b600086815260209020601f19841690835b82811015614fcd5786850135825593870193908901908701614fb0565b5084821015614fea5760001960f88660031b161c19848701351681555b50508683881b0186555b505050505050505050565b610f7e8282614f23565b6000602080838503121561501c57600080fd5b82516001600160401b0381111561503257600080fd5b8301601f8101851361504357600080fd5b805161505161448e8261475c565b8181526060918202830184019184820191908884111561507057600080fd5b938501935b838510156150d55780858a03121561508d5760008081fd5b6150956143b7565b85516150a08161436f565b8152858701516150af8161436f565b818801526040868101516150c281614661565b9082015283529384019391850191615075565b50979650505050505050565b600060a0820187835260208781850152604060a08186015282885180855260c087019150838a01945060005b8181101561514a57855180516001600160a01b0390811685528682015116868501528401511515848401529484019460609092019160010161510d565b50506001600160a01b0388166060870152935061516692505050565b8260808301529695505050505050565b6000602080838503121561518957600080fd5b82516001600160401b0381111561519f57600080fd5b8301601f810185136151b057600080fd5b80516151be61448e8261475c565b81815260059190911b820183019083810190878311156151dd57600080fd5b928401925b828410156151fb578351825292840192908401906151e2565b979650505050505050565b600081518084526020808501945080840160005b8381101561523f5781516001600160a01b03168752958201959082019060010161521a565b509495945050505050565b85815284602082015260a06040820152600061526960a0830186615206565b6001600160a01b0394909416606083015250608001529392505050565b602081526000613ec6602083018486614b20565b60006152a861448e8461440f565b90508281528383830111156152bc57600080fd5b61271a836020830184614569565b600082601f8301126152db57600080fd5b61271a8383516020850161529a565b6000602082840312156152fc57600080fd5b81516001600160401b038082111561531357600080fd5b908301906040828603121561532757600080fd5b604051604081018181108382111715615342576153426143a1565b60405282518281111561535457600080fd5b615360878286016152ca565b82525060208301518281111561537557600080fd5b615381878286016152ca565b60208301525095945050505050565b6080815260006153a3608083018761458d565b82810360208401526153b581876148ff565b905082810360408401526153c9818661458d565b91505082606083015295945050505050565b6000602082840312156153ed57600080fd5b81516001600160401b0381111561540357600080fd5b8201601f8101841361541457600080fd5b613ec68482516020840161529a565b60006020828403121561543557600080fd5b5051919050565b813561544781614661565b815460ff19811691151560ff16918217835560208401356154678161436f565b6001600160a81b03199190911690911760089190911b610100600160a81b03161781556040919091013560019190910155565b805160ff811681146154ab57600080fd5b919050565b600060c082840312156154c257600080fd5b60405160c081018181106001600160401b03821117156154e4576154e46143a1565b604052825181526154f76020840161549a565b60208201526155086040840161549a565b6040820152606083015161551b8161436f565b606082015261552c6080840161549a565b608082015261553d60a0840161549a565b60a08201529392505050565b808201808211156116e4576116e4614838565b60006020828403121561556e57600080fd5b815163ffffffff8116811461271a57600080fd5b60006020828403121561559457600080fd5b81516001600160401b038116811461271a57600080fd5b600083516155bd818460208801614569565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6000600182016155f4576155f4614838565b5060010190565b602081526000825160a0602084015261561760c084018261458d565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b61ffff8516815260ff8416602082015260a06040820152600061567960a083018561458d565b82810380606085015260008252602081016080850152506151fb60208201856148d6565b600080604083850312156156b057600080fd5b505080516020909101519092909150565b60008083546156cf81614728565b600182811680156156e757600181146156fc5761572b565b60ff198416875282151583028701945061572b565b8760005260208060002060005b858110156157225781548a820152908401908201615709565b50505082870194505b50929695505050505050565b600081518084526020808501945080840160005b8381101561523f5781518752958201959082019060010161574b565b6000610120808301615779848b614520565b60208481019290925288519081905261014080850192600583901b8601909101918a820160005b828110156158035787850361013f190186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a0918701829052906157ef8188018361458d565b9786019796505050908301906001016157a0565b5050505083810360408501526158198189615206565b915050615859606084018780516001600160a01b039081168352602080830151151590840152604080830151909116908301526060908101511515910152565b82810360e084015261586b8186615737565b91505082610100830152979650505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81516001600160401b038111156158e4576158e46143a1565b6158f8816158f28454614728565b84614c1a565b602080601f83116001811461592757600084156159155750858301515b61591f8582614c68565b865550614c60565b600085815260208120601f198616915b8281101561595657888601518255948401946001909101908401615937565b50858210156159745787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020815260008251608060208401526159a060a084018261458d565b905060018060a01b03602085015116604084015260408401516060840152606084015160808401528091505092915050565b6000826159ef57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215615a0657600080fd5b815161271a81614661565b60008251615a23818460208701614569565b919091019291505056fe48b87fc02925b37a6aefac60c14fa9d8e9988d7dfadf262d4bd845872ca40730360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ca39fe7b044bc9eb90cd54bdf8de561c64a8b9e5c57eba34ce6e59b84f11e61864736f6c63430008130033
Deployed Bytecode
0x60806040526004361061024a5760003560e01c80638129fc1c11610139578063c4b00c4f116100b6578063d7d66e711161007a578063d7d66e71146106c9578063ee63c1e5146106e9578063f2fde38b146106fe578063f3f1a71a1461071e578063fe8d1ab01461073e578063ff33d21f1461075357600080fd5b8063c4b00c4f146105ea578063c89f2ce41461060a578063ca3254691461067b578063cc5ea4ef1461069f578063d49b6408146106b457600080fd5b8063a5131aaa116100fd578063a5131aaa14610536578063b54653fb1461054b578063b9f391471461059f578063bac86af5146105b4578063c3c22475146105d457600080fd5b80638129fc1c146104b4578063873d80ec146104c95780638da5cb5b146104ec578063943f8e961461050a5780639c345b9f1461052057600080fd5b80635109d8b6116101c75780636ae407111161018b5780636ae40711146104285780636d0a68911461043d57806370c751071461046a578063715018a61461048a578063748b3c051461049f57600080fd5b80635109d8b61461039457806352d1902d146103a9578063530728d5146103cc57806364e510a1146103e1578063671f6a261461040157600080fd5b806322be3de11161020e57806322be3de11461030c5780633659cfe61461032c5780634641257d1461034c5780634f1ef286146103615780635066a7471461037457600080fd5b80630278fb8a14610270578063057d1ae3146102855780630d1f78331461029a57806311b0b42d146102af5780631610ee40146102ec57600080fd5b3661026b5760cd546001600160a01b0316331461026957610269614313565b005b600080fd5b34801561027c57600080fd5b50610269610773565b34801561029157600080fd5b50610269610905565b3480156102a657600080fd5b50610269610b6a565b3480156102bb57600080fd5b5060cd546102cf906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f857600080fd5b5061026961030736600461433b565b610d4f565b34801561031857600080fd5b5060cc546102cf906001600160a01b031681565b34801561033857600080fd5b50610269610347366004614384565b610da0565b34801561035857600080fd5b50610269610e88565b61026961036f366004614436565b610eb2565b34801561038057600080fd5b5061026961038f3660046144da565b610f82565b3480156103a057600080fd5b50610269611015565b3480156103b557600080fd5b506103be611208565b6040519081526020016102e3565b3480156103d857600080fd5b506102696112bb565b3480156103ed57600080fd5b506102696103fc3660046144da565b6113a8565b34801561040d57600080fd5b5060c95461041b9060ff1681565b6040516102e39190614542565b34801561043457600080fd5b50610269611436565b34801561044957600080fd5b5061045d610458366004614550565b61161c565b6040516102e391906145b9565b34801561047657600080fd5b506103be6104853660046145cc565b6116b6565b34801561049657600080fd5b506102696116ea565b3480156104ab57600080fd5b506102696116fc565b3480156104c057600080fd5b5061026961186c565b3480156104d557600080fd5b506104de6119e4565b6040516102e392919061463d565b3480156104f857600080fd5b506033546001600160a01b03166102cf565b34801561051657600080fd5b506103be60cf5481565b34801561052c57600080fd5b506103be60ce5481565b34801561054257600080fd5b50610269611a85565b34801561055757600080fd5b5060d05460d15461057a9160ff8116916101009091046001600160a01b03169083565b6040805193151584526001600160a01b039092166020840152908201526060016102e3565b3480156105ab57600080fd5b50610269611af1565b3480156105c057600080fd5b506102696105cf36600461466f565b611c7d565b3480156105e057600080fd5b506103be60d95481565b3480156105f657600080fd5b506102696106053660046146a8565b611d77565b34801561061657600080fd5b5060ca5460cb54610646916001600160a01b038082169260ff600160a01b93849004811693928216929091041684565b6040516102e394939291906001600160a01b039485168152921515602084015292166040820152901515606082015260800190565b34801561068757600080fd5b50610690611d8c565b6040516102e3939291906146c4565b3480156106ab57600080fd5b50610269611ebb565b3480156106c057600080fd5b506104de612056565b3480156106d557600080fd5b506102696106e4366004614550565b612074565b3480156106f557600080fd5b506102696120b4565b34801561070a57600080fd5b50610269610719366004614384565b612240565b34801561072a57600080fd5b5061045d610739366004614550565b6122b6565b34801561074a57600080fd5b506102696122cf565b34801561075f57600080fd5b5061026961076e3660046146fa565b612458565b61077b612534565b600060d4600101805461078d90614728565b80601f01602080910402602001604051908101604052809291908181526020018280546107b990614728565b80156108065780601f106107db57610100808354040283529160200191610806565b820191906000526020600020905b8154815290600101906020018083116107e957829003601f168201915b505050505080602001905181019061081e91906147ee565b60cd5481519192506001600160a01b031690829060009061084157610841614822565b60200260200101516001600160a01b031614610870576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b0390911690829061088f9060019061484e565b8151811061089f5761089f614822565b60200260200101516001600160a01b0316146108ce576040516376c252e160e11b815260040160405180910390fd5b60006108d982612554565b905060006108e561260d565b60d4549091506108ff906001600160a01b03168383612680565b50505050565b61090d612534565b600060d2600101805461091f90614728565b80601f016020809104026020016040519081016040528092919081815260200182805461094b90614728565b80156109985780601f1061096d57610100808354040283529160200191610998565b820191906000526020600020905b81548152906001019060200180831161097b57829003601f168201915b50505050508060200190518101906109b09190614861565b905060006040518060600160405280836020015181526020016000815260200160405180604001604052806002815260200161060f60f31b81525081525090506000610a8e836000015160d66001018054610a0a90614728565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3690614728565b8015610a835780601f10610a5857610100808354040283529160200191610a83565b820191906000526020600020905b815481529060010190602001808311610a6657829003601f168201915b505050505084612721565b9050610a99816127a2565b610aa1612815565b6000610aab612876565b905060d954811115610b345760d2548451604080870151606088015191516327efc43f60e21b81526001600160a01b0390941693639fbf10fc938793610b01939192309089906000908d9060d79060040161497c565b6000604051808303818588803b158015610b1a57600080fd5b505af1158015610b2e573d6000803e3d6000fd5b50505050505b60cc546040518281526001600160a01b0390911690600080516020615a2e8339815191529060200160405180910390a250505050565b610b72612534565b60008060d46001018054610b8590614728565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb190614728565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b5050505050806020019051810190610c1691906149f6565b60cd5481519294509092506001600160a01b0316908290600090610c3c57610c3c614822565b60200260200101516001600160a01b031614610c6b576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b03909116908290610c8a9060019061484e565b81518110610c9a57610c9a614822565b60200260200101516001600160a01b031614610cc9576040516376c252e160e11b815260040160405180910390fd5b6000610cd361260d565b90506000610ce184836128a7565b60d45460c9546040805160808101825260ca546001600160a01b03808216835260ff600160a01b9283900481161515602085015260cb548083169585019590955291909304811615156060830152949550610d489491909316929116908490879087612ab0565b5050505050565b610d57612bfa565b7f518f47fcfba5d9b707c3387a7fa4301136192d8091a43ea13ae8db7275ab5d3a81604051610d869190614b49565b60405180910390a18060d6610d9b8282614d36565b505050565b6001600160a01b037f000000000000000000000000b3d11a5c97ff5d3e8c6b3b9df9358e27614778d9163003610df15760405162461bcd60e51b8152600401610de890614e2f565b60405180910390fd5b7f000000000000000000000000b3d11a5c97ff5d3e8c6b3b9df9358e27614778d96001600160a01b0316610e3a600080516020615a4e833981519152546001600160a01b031690565b6001600160a01b031614610e605760405162461bcd60e51b8152600401610de890614e7b565b610e6981612c54565b60408051600080825260208201909252610e8591839190612c5c565b50565b610e90612dc7565b610e98612e38565b6000610ea261260d565b1115610eb057610eb0612f71565b565b6001600160a01b037f000000000000000000000000b3d11a5c97ff5d3e8c6b3b9df9358e27614778d9163003610efa5760405162461bcd60e51b8152600401610de890614e2f565b7f000000000000000000000000b3d11a5c97ff5d3e8c6b3b9df9358e27614778d96001600160a01b0316610f43600080516020615a4e833981519152546001600160a01b031690565b6001600160a01b031614610f695760405162461bcd60e51b8152600401610de890614e7b565b610f7282612c54565b610f7e82826001612c5c565b5050565b610f8a612bfa565b7f25f7dd6fc737add5174192a11292dfd270c1397f9c4f641fb6336a208b5efbed8282604051610fbb929190614f0a565b60405180910390a160cd5460d454610fdf916001600160a01b039081169116612fa1565b60cf8290558060d4610ff18282614fff565b505060cd54610f7e906001600160a01b03166110106020840184614384565b613030565b61101d612534565b600060d4600101805461102f90614728565b80601f016020809104026020016040519081016040528092919081815260200182805461105b90614728565b80156110a85780601f1061107d576101008083540402835291602001916110a8565b820191906000526020600020905b81548152906001019060200180831161108b57829003601f168201915b50505050508060200190518101906110c09190615009565b905060006110cd826130bd565b60cd5481519192506001600160a01b03169082906000906110f0576110f0614822565b60200260200101516001600160a01b03161461111f576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b0390911690829061113e9060019061484e565b8151811061114e5761114e614822565b60200260200101516001600160a01b03161461117d576040516376c252e160e11b815260040160405180910390fd5b600061118761260d565b60d454604051631e82ecdb60e31b81529192506001600160a01b03169063f41766d8906111c19084906000908890309042906004016150e1565b6000604051808303816000875af11580156111e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108ff9190810190615176565b6000306001600160a01b037f000000000000000000000000b3d11a5c97ff5d3e8c6b3b9df9358e27614778d916146112a85760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610de8565b50600080516020615a4e83398151915290565b6112c3612534565b6112cb612815565b60006112d5612876565b905060d9548111156113755760d25460d65460cc5460405163cd58657960e01b81526000600482018190526001600160a01b0393841660248301526044820186905291831660648201526001608482015260c060a482015260c481019190915291169063cd5865799060e4015b600060405180830381600087803b15801561135c57600080fd5b505af1158015611370573d6000803e3d6000fd5b505050505b60cc546040518281526001600160a01b0390911690600080516020615a2e8339815191529060200160405180910390a250565b6113b0612bfa565b7f5e355369ceaccb04ff615500f99b96912ce9f237ed35ae521487c19064e2318d82826040516113e1929190614f0a565b60405180910390a160cc5460d254611405916001600160a01b039081169116612fa1565b60ce8290558060d26114178282614fff565b505060cc54610f7e906001600160a01b03166110106020840184614384565b61143e612534565b600060d4600101805461145090614728565b80601f016020809104026020016040519081016040528092919081815260200182805461147c90614728565b80156114c95780601f1061149e576101008083540402835291602001916114c9565b820191906000526020600020905b8154815290600101906020018083116114ac57829003601f168201915b50505050508060200190518101906114e191906147ee565b60cd5481519192506001600160a01b031690829060009061150457611504614822565b60200260200101516001600160a01b031614611533576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b039091169082906115529060019061484e565b8151811061156257611562614822565b60200260200101516001600160a01b031614611591576040516376c252e160e11b815260040160405180910390fd5b600061159b61260d565b60d4546040516338ed173960e01b81529192506001600160a01b0316906338ed1739906115d590849060009087903090429060040161524a565b6000604051808303816000875af11580156115f4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d9b9190810190615176565b60db602052600090815260409020805461163590614728565b80601f016020809104026020016040519081016040528092919081815260200182805461166190614728565b80156116ae5780601f10611683576101008083540402835291602001916116ae565b820191906000526020600020905b81548152906001019060200180831161169157829003601f168201915b505050505081565b600082826040516020016116cb929190615286565b6040516020818303038152906040528051906020012090505b92915050565b6116f2612bfa565b610eb060006131db565b611704612534565b600060d2600101805461171690614728565b80601f016020809104026020016040519081016040528092919081815260200182805461174290614728565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b50505050508060200190518101906117a791906152ea565b90506117b1612815565b60006117bb612876565b905060d9548111156118375760d254825160208401516040516326ef699d60e01b81526001600160a01b03909316926326ef699d9261180492909160d891908790600401615390565b600060405180830381600087803b15801561181e57600080fd5b505af1158015611832573d6000803e3d6000fd5b505050505b60cc546040518281526001600160a01b0390911690600080516020615a2e833981519152906020015b60405180910390a25050565b600054610100900460ff161580801561188c5750600054600160ff909116105b806118a65750303b1580156118a6575060005460ff166001145b6119095760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610de8565b6000805460ff19166001179055801561192c576000805461ff0019166101001790555b61193461322d565b61193c61325c565b611944613583565b604080516080810182523080825260006020830181905292820181905260609091019190915260ca805460ff60a01b199092166001600160a81b0319928316811790915560cb805490921617905560c9805460ff191690558015610e85576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60d4805460d580546001600160a01b039092169291611a0290614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2e90614728565b8015611a7b5780601f10611a5057610100808354040283529160200191611a7b565b820191906000526020600020905b815481529060010190602001808311611a5e57829003601f168201915b5050505050905082565b611a8d612534565b611a95612815565b6000611a9f612876565b905060d9548111156113755760d25460d65460cc54604051636ce5768960e11b81526001600160a01b03928316600482015290821660248201526044810184905291169063d9caed1290606401611342565b611af9612534565b600060d46001018054611b0b90614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3790614728565b8015611b845780601f10611b5957610100808354040283529160200191611b84565b820191906000526020600020905b815481529060010190602001808311611b6757829003601f168201915b5050505050806020019051810190611b9c91906153db565b90506000611ba98261388c565b60cd5481519192506001600160a01b0316908290600090611bcc57611bcc614822565b60200260200101516001600160a01b031614611bfb576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b03909116908290611c1a9060019061484e565b81518110611c2a57611c2a614822565b60200260200101516001600160a01b031614611c59576040516376c252e160e11b815260040160405180910390fd5b6000611c6361260d565b60d4549091506108ff906001600160a01b03168483612680565b611c85612bfa565b8015611cf6576040514790600090339083908381818185875af1925050503d8060008114611ccf576040519150601f19603f3d011682016040523d82523d6000602084013e611cd4565b606091505b50509050806108ff57604051630dcf35db60e41b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190615423565b9050610d9b6001600160a01b038416338361398f565b611d7f612bfa565b8060d0610d9b828261543c565b60d6805460d780546001600160a01b039092169291611daa90614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd690614728565b8015611e235780601f10611df857610100808354040283529160200191611e23565b820191906000526020600020905b815481529060010190602001808311611e0657829003601f168201915b505050505090806002018054611e3890614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6490614728565b8015611eb15780601f10611e8657610100808354040283529160200191611eb1565b820191906000526020600020905b815481529060010190602001808311611e9457829003601f168201915b5050505050905083565b611ec3612534565b600060d26001018054611ed590614728565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0190614728565b8015611f4e5780601f10611f2357610100808354040283529160200191611f4e565b820191906000526020600020905b815481529060010190602001808311611f3157829003601f168201915b5050505050806020019051810190611f6691906154b0565b9050611f70612815565b6000611f7a612876565b905060d9548111156118375760d25460d6548351606085015160208601516040870151608088015160a08901516001600160a01b0397881697639f330727971695949392918991600091429183611fd384610e10615549565b6040516001600160e01b031960e08f901b1681526001600160a01b039c8d166004820152602481019b909b529a90981660448a015260ff96871660648a0152948616608489015260a488019390935260c487019190915260e486015282166101048501521661012483015261014482015261016481019190915261018401611804565b60d2805460d380546001600160a01b039092169291611a0290614728565b61207c612bfa565b6040518181527ff4f47d85dc8207b9d9c6dfd289d4f5008b33df899eda3da90658d75c351e54759060200160405180910390a160d955565b6120bc612534565b600060d460010180546120ce90614728565b80601f01602080910402602001604051908101604052809291908181526020018280546120fa90614728565b80156121475780601f1061211c57610100808354040283529160200191612147565b820191906000526020600020905b81548152906001019060200180831161212a57829003601f168201915b505050505080602001905181019061215f91906153db565b9050600061216c8261388c565b60cd5481519192506001600160a01b031690829060009061218f5761218f614822565b60200260200101516001600160a01b0316146121be576040516376c252e160e11b815260040160405180910390fd5b60cc5481516001600160a01b039091169082906121dd9060019061484e565b815181106121ed576121ed614822565b60200260200101516001600160a01b03161461221c576040516376c252e160e11b815260040160405180910390fd5b600061222661260d565b60d4549091506108ff906001600160a01b031684836139f2565b612248612bfa565b6001600160a01b0381166122ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610de8565b610e85816131db565b60dc602052600090815260409020805461163590614728565b6122d7612534565b600060d260010180546122e990614728565b80601f016020809104026020016040519081016040528092919081815260200182805461231590614728565b80156123625780601f1061233757610100808354040283529160200191612362565b820191906000526020600020905b81548152906001019060200180831161234557829003601f168201915b505050505080602001905181019061237a919061555c565b9050612384612815565b600061238e612876565b905060d9548111156118375760d25460d65460cc546040516337e9a82760e11b81526004810185905263ffffffff861660248201526001600160a01b0392831660448201529082166064820152911690636fd3504e906084016020604051808303816000875af1158015612406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242a9190615582565b5060cc546040518281526001600160a01b0390911690600080516020615a2e83398151915290602001611860565b612460612bfa565b60da5460ff166124a55760cc80546001600160a01b039384166001600160a01b03199182161790915560cd805492909316911617905560da805460ff19166001179055565b60cc54604080516001600160a01b03928316815291841660208301527f4239efeca0761c0d170bd15a6e85542dbe0376ba0f5f1551b39c6045866ff735910160405180910390a160cc5460d254612508916001600160a01b039081169116612fa1565b60cc80546001600160a01b0319166001600160a01b0384811691821790925560d254610f7e9216613030565b333014610eb05760405163ea8e4eb560e01b815260040160405180910390fd5b60608160008151811061256957612569614822565b6020026020010151604051602001612599919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f19818403018152919052905060015b825181101561260757818382815181106125ca576125ca614822565b60200260200101516040516020016125e39291906155ab565b604051602081830303815290604052915080806125ff906155e2565b9150506125ae565b50919050565b60cd546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024015b602060405180830381865afa158015612657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267b9190615423565b905090565b6040805160a081018252838152306020820152428183015260608101839052600060808201819052915163c04b8d5960e01b81526001600160a01b0386169063c04b8d59906126d39084906004016155fb565b6020604051808303816000875af11580156126f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127169190615423565b9150505b9392505050565b60d254604051630a51236960e01b81526000916001600160a01b031690630a5123699061275990879060019088908890600401615653565b6040805180830381865afa158015612775573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612799919061569d565b50949350505050565b60006127ac61260d565b9050818110610f7e5760cd54604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b1580156127fb57600080fd5b505af192505050801561280c575060015b15610f7e575050565b60cf54600090815260dc6020526040908190208151600481526024810192839052610e85929091612845916156c1565b6040519081900390206020820180516001600160e01b03166001600160e01b03199092169190911790523090613a3f565b60cc546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240161263a565b6060600083516001600160401b038111156128c4576128c46143a1565b60405190808252806020026020018201604052801561292a57816020015b6129176040518060a0016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b8152602001906001900390816128e25790505b50905060005b8451811015612aa857806000036129f4576040518060a001604052808660008151811061295f5761295f614822565b60200260200101516000015181526020018660008151811061298357612983614822565b6020026020010151602001518152602001866000815181106129a7576129a7614822565b602002602001015160400151815260200185815260200160405180602001604052806000815250815250826000815181106129e4576129e4614822565b6020026020010181905250612aa0565b6040518060a00160405280868381518110612a1157612a11614822565b6020026020010151600001518152602001868381518110612a3457612a34614822565b6020026020010151602001518152602001868381518110612a5757612a57614822565b60200260200101516040015181526020016000815260200160405180602001604052806000815250815250828281518110612a9457612a94614822565b60200260200101819052505b600101612930565b509392505050565b6060600084516001600160401b03811115612acd57612acd6143a1565b604051908082528060200260200182016040528015612af6578160200160208202803683370190505b50905060005b8551811015612b705780600003612b32578382600081518110612b2157612b21614822565b602002602001018181525050612b68565b60018651612b40919061484e565b8103612b6857600019828281518110612b5b57612b5b614822565b6020026020010181815250505b600101612afc565b5060405163945bcec960e01b81526001600160a01b0389169063945bcec990612ba7908a908a908a908a9088904290600401615767565b6000604051808303816000875af1158015612bc6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612bee9190810190615176565b98975050505050505050565b6033546001600160a01b03163314610eb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610de8565b610e85612bfa565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612c8f57610d9b83613a83565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612ce9575060408051601f3d908101601f19168201909252612ce691810190615423565b60015b612d4c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610de8565b600080516020615a4e8339815191528114612dbb5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610de8565b50610d9b838383613b1f565b478015610e855760cd60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e1e57600080fd5b505af193505050508015612e30575060015b15610e855750565b60d05460ff1615610eb05760cd5460d0546040516370a0823160e01b81526101009091046001600160a01b03908116600483015260009216906370a0823190602401602060405180830381865afa158015612e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebb9190615423565b60d054612ed7919061010090046001600160a01b031631615549565b60d154909150811015610e85576000612eee61260d565b905060008260d060010154612f03919061484e565b9050818111612f125780612f14565b815b60d05460cd54919250612f39916001600160a01b03908116916101009004168361398f565b6040518181527feb722ef3dbafc24e43f4627f9b306563a93d546865b49eb1e64fbaffdab73d5c9060200160405180910390a1505050565b60ce54600090815260db6020526040908190208151600481526024810192839052610e85929091612845916156c1565b604051636eb1769f60e11b81523060048201526001600160a01b0382811660248301526000919084169063dd62ed3e90604401602060405180830381865afa158015612ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130159190615423565b1115610f7e57610f7e6001600160a01b038316826000613b44565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e90604401602060405180830381865afa15801561307c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a09190615423565b600003610f7e57610f7e6001600160a01b03831682600019613b44565b60606000825160016130cf9190615549565b6001600160401b038111156130e6576130e66143a1565b60405190808252806020026020018201604052801561310f578160200160208202803683370190505b5090508260008151811061312557613125614822565b6020026020010151600001518160008151811061314457613144614822565b60200260200101906001600160a01b031690816001600160a01b03168152505060005b83518110156131d45783818151811061318257613182614822565b6020026020010151602001518282600161319c9190615549565b815181106131ac576131ac614822565b6001600160a01b03909216602092830291909101909101526131cd816155e2565b9050613167565b5092915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166132545760405162461bcd60e51b8152600401610de890615880565b610eb0613c59565b6040518060400160405280600e81526020016d627269646765436972636c65282960901b81525060db60006040516020016132b190602080825260069082015265434952434c4560d01b604082015260600190565b60405160208183030381529060405280519060200120815260200190815260200160002090816132e191906158cb565b506040518060400160405280601081526020016f6272696467655374617267617465282960801b81525060db600060405160200161333b90602080825260089082015267535441524741544560c01b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161336b91906158cb565b506040518060400160405280600e81526020016d6272696467654178656c6172282960901b81525060db60006040516020016133c19060208082526006908201526520ac22a620a960d11b604082015260600190565b60405160208183030381529060405280519060200120815260200190815260200160002090816133f191906158cb565b506040518060400160405280600f81526020016e62726964676553796e61707365282960881b81525060db60006040516020016134499060208082526007908201526653594e4150534560c81b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161347991906158cb565b506040518060400160405280600d81526020016c6272696467657a6b45564d282960981b81525060db60006040516020016134cd906020808252600590820152647a6b45564d60d81b604082015260600190565b60405160208183030381529060405280519060200120815260200190815260200160002090816134fd91906158cb565b506040518060400160405280600e81526020016d6272696467657a6b53796e63282960901b81525060db6000604051602001613553906020808252600690820152657a6b53594e4360d01b604082015260600190565b6040516020818303038152906040528051906020012081526020019081526020016000209081610e8591906158cb565b6040518060400160405280600b81526020016a73776170556e695632282960a81b81525060dc60006040516020016135d9906020808252600a90820152692aa724a9aba0a82fab1960b11b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161360991906158cb565b506040518060400160405280600d81526020016c73776170536f6c69646c79282960981b81525060dc600060405160200161365f90602080825260079082015266534f4c49444c5960c81b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161368f91906158cb565b506040518060400160405280600b81526020016a73776170556e695633282960a81b81525060dc60006040516020016136e6906020808252600a9082015269554e49535741505f563360b01b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161371691906158cb565b506040518060400160405280601381526020017273776170556e695633446561646c696e65282960681b81525060dc600060405160200161377e90602080825260139082015272554e49535741505f56335f444541444c494e4560681b604082015260600190565b60405160208183030381529060405280519060200120815260200190815260200160002090816137ae91906158cb565b506040518060400160405280600d81526020016c73776170416c6765627261282960981b81525060dc600060405160200161380490602080825260079082015266414c474542524160c81b604082015260600190565b604051602081830303815290604052805190602001208152602001908152602001600020908161383491906158cb565b506040518060400160405280600e81526020016d7377617042616c616e636572282960901b81525060dc6000604051602001613553906020808252600890820152672120a620a721a2a960c11b604082015260600190565b6060600061389983613c89565b905060006138a8826001615549565b6001600160401b038111156138bf576138bf6143a1565b6040519080825280602002602001820160405280156138e8578160200160208202803683370190505b50905060005b82811015612aa85760008061390287613caf565b50915091508184848151811061391a5761391a614822565b6001600160a01b0390921660209283029190910190910152808461393f856001615549565b8151811061394f5761394f614822565b60200260200101906001600160a01b031690816001600160a01b03168152505061397887613ceb565b965050508080613987906155e2565b9150506138ee565b6040516001600160a01b038316602482015260448101829052610d9b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613d1c565b60408051608081018252838152306020820152808201839052600060608201819052915163b858183f60e01b81526001600160a01b0386169063b858183f906126d3908490600401615984565b606061271a838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250613df1565b6001600160a01b0381163b613af05760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610de8565b600080516020615a4e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b613b2883613ece565b600082511180613b355750805b15610d9b576108ff8383613f0e565b801580613bbe5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbc9190615423565b155b613c295760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610de8565b6040516001600160a01b038316602482015260448101829052610d9b90849063095ea7b360e01b906064016139bb565b600054610100900460ff16613c805760405162461bcd60e51b8152600401610de890615880565b610eb0336131db565b6000613c9760036014615549565b60148351613ca5919061484e565b6116e491906159d2565b60008080613cbd8482613f33565b9250613cca846014613fe7565b9050613ce2613cdb60036014615549565b8590613f33565b91509193909250565b60606116e4613cfc60036014615549565b613d0860036014615549565b8451613d14919061484e565b849190614092565b6000613d71826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166141e99092919063ffffffff16565b9050805160001480613d92575080806020019051810190613d9291906159f4565b610d9b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610de8565b606082471015613e525760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610de8565b600080866001600160a01b03168587604051613e6e9190615a11565b60006040518083038185875af1925050503d8060008114613eab576040519150601f19603f3d011682016040523d82523d6000602084013e613eb0565b606091505b5091509150613ec1878383876141f8565b925050505b949350505050565b613ed781613a83565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061271a8383604051806060016040528060278152602001615a6e60279139614271565b600081613f41816014615549565b1015613f845760405162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b6044820152606401610de8565b613f8f826014615549565b83511015613fd75760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610de8565b500160200151600160601b900490565b600081613ff5816003615549565b10156140375760405162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b6044820152606401610de8565b614042826003615549565b835110156140895760405162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b6044820152606401610de8565b50016003015190565b6060816140a081601f615549565b10156140df5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610de8565b826140ea8382615549565b10156141295760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610de8565b6141338284615549565b845110156141775760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610de8565b6060821580156141965760405191506000825260208201604052612799565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156141cf5780518352602092830192016141b7565b5050858452601f01601f1916604052505090509392505050565b6060613ec68484600085613df1565b60608315614267578251600003614260576001600160a01b0385163b6142605760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610de8565b5081613ec6565b613ec683836142e9565b6060600080856001600160a01b03168560405161428e9190615a11565b600060405180830381855af49150503d80600081146142c9576040519150601f19603f3d011682016040523d82523d6000602084013e6142ce565b606091505b50915091506142df868383876141f8565b9695505050505050565b8151156142f95781518083602001fd5b8060405162461bcd60e51b8152600401610de891906145b9565b634e487b7160e01b600052600160045260246000fd5b60006060828403121561260757600080fd5b60006020828403121561434d57600080fd5b81356001600160401b0381111561436357600080fd5b613ec684828501614329565b6001600160a01b0381168114610e8557600080fd5b60006020828403121561439657600080fd5b813561271a8161436f565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156143d9576143d96143a1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614407576144076143a1565b604052919050565b60006001600160401b03821115614428576144286143a1565b50601f01601f191660200190565b6000806040838503121561444957600080fd5b82356144548161436f565b915060208301356001600160401b0381111561446f57600080fd5b8301601f8101851361448057600080fd5b803561449361448e8261440f565b6143df565b8181528660208385010111156144a857600080fd5b816020840160208301376000602083830101528093505050509250929050565b60006040828403121561260757600080fd5b600080604083850312156144ed57600080fd5b8235915060208301356001600160401b0381111561450a57600080fd5b614516858286016144c8565b9150509250929050565b6002811061453e57634e487b7160e01b600052602160045260246000fd5b9052565b602081016116e48284614520565b60006020828403121561456257600080fd5b5035919050565b60005b8381101561458457818101518382015260200161456c565b50506000910152565b600081518084526145a5816020860160208601614569565b601f01601f19169290920160200192915050565b60208152600061271a602083018461458d565b600080602083850312156145df57600080fd5b82356001600160401b03808211156145f657600080fd5b818501915085601f83011261460a57600080fd5b81358181111561461957600080fd5b86602082850101111561462b57600080fd5b60209290920196919550909350505050565b6001600160a01b0383168152604060208201819052600090613ec69083018461458d565b8015158114610e8557600080fd5b6000806040838503121561468257600080fd5b823561468d8161436f565b9150602083013561469d81614661565b809150509250929050565b6000606082840312156146ba57600080fd5b61271a8383614329565b6001600160a01b03841681526060602082018190526000906146e89083018561458d565b82810360408401526142df818561458d565b6000806040838503121561470d57600080fd5b82356147188161436f565b9150602083013561469d8161436f565b600181811c9082168061473c57607f821691505b60208210810361260757634e487b7160e01b600052602260045260246000fd5b60006001600160401b03821115614775576147756143a1565b5060051b60200190565b600082601f83011261479057600080fd5b815160206147a061448e8361475c565b82815260059290921b840181019181810190868411156147bf57600080fd5b8286015b848110156147e35780516147d68161436f565b83529183019183016147c3565b509695505050505050565b60006020828403121561480057600080fd5b81516001600160401b0381111561481657600080fd5b613ec68482850161477f565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156116e4576116e4614838565b60006080828403121561487357600080fd5b604051608081018181106001600160401b0382111715614895576148956143a1565b604052825161ffff811681146148aa57600080fd5b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b80518252602081015160208301526000604082015160606040850152613ec6606085018261458d565b6000815461490c81614728565b808552602060018381168015614929576001811461494357614971565b60ff1985168884015283151560051b880183019550614971565b866000528260002060005b858110156149695781548a820186015290830190840161494e565b890184019650505b505050505092915050565b600061012061ffff8b16835289602084015288604084015260018060a01b03881660608401528660808401528560a08401528060c08401526149c0818401866148d6565b905082810360e08401526149d481856148ff565b8381036101009094019390935250506000815260200198975050505050505050565b6000806040808486031215614a0a57600080fd5b83516001600160401b0380821115614a2157600080fd5b818601915086601f830112614a3557600080fd5b81516020614a4561448e8361475c565b8281526060928302850182019282820191908b851115614a6457600080fd5b958301955b84871015614aac5780878d031215614a815760008081fd5b614a896143b7565b875181528488015185820152888801518982015283529586019591830191614a69565b5091890151919750909450505080831115614ac657600080fd5b50506145168582860161477f565b6000808335601e19843603018112614aeb57600080fd5b83016020810192503590506001600160401b03811115614b0a57600080fd5b803603821315614b1957600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260008235614b5a8161436f565b6001600160a01b0316602083810191909152614b7890840184614ad4565b60606040850152614b8d608085018284614b20565b915050614b9d6040850185614ad4565b848303601f190160608601526142df838284614b20565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000808335601e19843603018112614beb57600080fd5b8301803591506001600160401b03821115614c0557600080fd5b602001915036819003821315614b1957600080fd5b601f821115610d9b57600081815260208120601f850160051c81016020861015614c415750805b601f850160051c820191505b81811015614c6057828155600101614c4d565b505050505050565b600019600383901b1c191660019190911b1790565b6001600160401b03831115614c9457614c946143a1565b614ca883614ca28354614728565b83614c1a565b6000601f841160018114614cd65760008515614cc45750838201355b614cce8682614c68565b845550610d48565b600083815260209020601f19861690835b82811015614d075786850135825560209485019460019092019101614ce7565b5086821015614d245760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8135614d418161436f565b614d4b8183614bb4565b5060018082016020614d5f81860186614bd4565b6001600160401b03811115614d7657614d766143a1565b614d8a81614d848654614728565b86614c1a565b6000601f821160018114614db85760008315614da65750838201355b614db08482614c68565b875550614e0d565b600086815260209020601f19841690835b82811015614de65786850135825593870193908901908701614dc9565b5084821015614e035760001960f88660031b161c19848701351681555b50508683881b0186555b50505050505050614e216040830183614bd4565b6108ff818360028601614c7d565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60008135614ed48161436f565b6001600160a01b03168352614eec6020830183614ad4565b60406020860152614f01604086018284614b20565b95945050505050565b828152604060208201526000613ec66040830184614ec7565b8135614f2e8161436f565b614f388183614bb4565b5060018082016020614f4c81860186614bd4565b6001600160401b03811115614f6357614f636143a1565b614f7181614d848654614728565b6000601f821160018114614f9f5760008315614f8d5750838201355b614f978482614c68565b875550614ff4565b600086815260209020601f19841690835b82811015614fcd5786850135825593870193908901908701614fb0565b5084821015614fea5760001960f88660031b161c19848701351681555b50508683881b0186555b505050505050505050565b610f7e8282614f23565b6000602080838503121561501c57600080fd5b82516001600160401b0381111561503257600080fd5b8301601f8101851361504357600080fd5b805161505161448e8261475c565b8181526060918202830184019184820191908884111561507057600080fd5b938501935b838510156150d55780858a03121561508d5760008081fd5b6150956143b7565b85516150a08161436f565b8152858701516150af8161436f565b818801526040868101516150c281614661565b9082015283529384019391850191615075565b50979650505050505050565b600060a0820187835260208781850152604060a08186015282885180855260c087019150838a01945060005b8181101561514a57855180516001600160a01b0390811685528682015116868501528401511515848401529484019460609092019160010161510d565b50506001600160a01b0388166060870152935061516692505050565b8260808301529695505050505050565b6000602080838503121561518957600080fd5b82516001600160401b0381111561519f57600080fd5b8301601f810185136151b057600080fd5b80516151be61448e8261475c565b81815260059190911b820183019083810190878311156151dd57600080fd5b928401925b828410156151fb578351825292840192908401906151e2565b979650505050505050565b600081518084526020808501945080840160005b8381101561523f5781516001600160a01b03168752958201959082019060010161521a565b509495945050505050565b85815284602082015260a06040820152600061526960a0830186615206565b6001600160a01b0394909416606083015250608001529392505050565b602081526000613ec6602083018486614b20565b60006152a861448e8461440f565b90508281528383830111156152bc57600080fd5b61271a836020830184614569565b600082601f8301126152db57600080fd5b61271a8383516020850161529a565b6000602082840312156152fc57600080fd5b81516001600160401b038082111561531357600080fd5b908301906040828603121561532757600080fd5b604051604081018181108382111715615342576153426143a1565b60405282518281111561535457600080fd5b615360878286016152ca565b82525060208301518281111561537557600080fd5b615381878286016152ca565b60208301525095945050505050565b6080815260006153a3608083018761458d565b82810360208401526153b581876148ff565b905082810360408401526153c9818661458d565b91505082606083015295945050505050565b6000602082840312156153ed57600080fd5b81516001600160401b0381111561540357600080fd5b8201601f8101841361541457600080fd5b613ec68482516020840161529a565b60006020828403121561543557600080fd5b5051919050565b813561544781614661565b815460ff19811691151560ff16918217835560208401356154678161436f565b6001600160a81b03199190911690911760089190911b610100600160a81b03161781556040919091013560019190910155565b805160ff811681146154ab57600080fd5b919050565b600060c082840312156154c257600080fd5b60405160c081018181106001600160401b03821117156154e4576154e46143a1565b604052825181526154f76020840161549a565b60208201526155086040840161549a565b6040820152606083015161551b8161436f565b606082015261552c6080840161549a565b608082015261553d60a0840161549a565b60a08201529392505050565b808201808211156116e4576116e4614838565b60006020828403121561556e57600080fd5b815163ffffffff8116811461271a57600080fd5b60006020828403121561559457600080fd5b81516001600160401b038116811461271a57600080fd5b600083516155bd818460208801614569565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6000600182016155f4576155f4614838565b5060010190565b602081526000825160a0602084015261561760c084018261458d565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b61ffff8516815260ff8416602082015260a06040820152600061567960a083018561458d565b82810380606085015260008252602081016080850152506151fb60208201856148d6565b600080604083850312156156b057600080fd5b505080516020909101519092909150565b60008083546156cf81614728565b600182811680156156e757600181146156fc5761572b565b60ff198416875282151583028701945061572b565b8760005260208060002060005b858110156157225781548a820152908401908201615709565b50505082870194505b50929695505050505050565b600081518084526020808501945080840160005b8381101561523f5781518752958201959082019060010161574b565b6000610120808301615779848b614520565b60208481019290925288519081905261014080850192600583901b8601909101918a820160005b828110156158035787850361013f190186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a0918701829052906157ef8188018361458d565b9786019796505050908301906001016157a0565b5050505083810360408501526158198189615206565b915050615859606084018780516001600160a01b039081168352602080830151151590840152604080830151909116908301526060908101511515910152565b82810360e084015261586b8186615737565b91505082610100830152979650505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81516001600160401b038111156158e4576158e46143a1565b6158f8816158f28454614728565b84614c1a565b602080601f83116001811461592757600084156159155750858301515b61591f8582614c68565b865550614c60565b600085815260208120601f198616915b8281101561595657888601518255948401946001909101908401615937565b50858210156159745787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020815260008251608060208401526159a060a084018261458d565b905060018060a01b03602085015116604084015260408401516060840152606084015160808401528091505092915050565b6000826159ef57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215615a0657600080fd5b815161271a81614661565b60008251615a23818460208701614569565b919091019291505056fe48b87fc02925b37a6aefac60c14fa9d8e9988d7dfadf262d4bd845872ca40730360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ca39fe7b044bc9eb90cd54bdf8de561c64a8b9e5c57eba34ce6e59b84f11e61864736f6c63430008130033
Deployed Bytecode Sourcemap
109360:15830:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125171:6;;-1:-1:-1;;;;;125171:6:0;125149:10;:29;125142:37;;;;:::i;:::-;109360:15830;;;;;118241:443;;;;;;;;;;;;;:::i;112738:1024::-;;;;;;;;;;;;;:::i;118692:636::-;;;;;;;;;;;;;:::i;109597:20::-;;;;;;;;;;-1:-1:-1;109597:20:0;;;;-1:-1:-1;;;;;109597:20:0;;;;;;-1:-1:-1;;;;;323:32:1;;;305:51;;293:2;278:18;109597:20:0;;;;;;;;123816:195;;;;;;;;;;-1:-1:-1;123816:195:0;;;;;:::i;:::-;;:::i;109570:20::-;;;;;;;;;;-1:-1:-1;109570:20:0;;;;-1:-1:-1;;;;;109570:20:0;;;74530:198;;;;;;;;;;-1:-1:-1;74530:198:0;;;;;:::i;:::-;;:::i;111587:202::-;;;;;;;;;;;;;:::i;75059:223::-;;;;;;:::i;:::-;;:::i;123329:352::-;;;;;;;;;;-1:-1:-1;123329:352:0;;;;;:::i;:::-;;:::i;116807:534::-;;;;;;;;;;;;;:::i;74136:133::-;;;;;;;;;;;;;:::i;:::-;;;3725:25:1;;;3713:2;3698:18;74136:133:0;3579:177:1;115444:446:0;;;;;;;;;;;;;:::i;122949:372::-;;;;;;;;;;-1:-1:-1;122949:372:0;;;;;:::i;:::-;;:::i;78491:39::-;;;;;;;;;;-1:-1:-1;78491:39:0;;;;;;;;;;;;;;;:::i;116321:478::-;;;;;;;;;;;;;:::i;109983:45::-;;;;;;;;;;-1:-1:-1;109983:45:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;119622:135::-;;;;;;;;;;-1:-1:-1;119622:135:0;;;;;:::i;:::-;;:::i;56719:103::-;;;;;;;;;;;;;:::i;114147:505::-;;;;;;;;;;;;;:::i;110090:297::-;;;;;;;;;;;;;:::i;109789:28::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;56078:87::-;;;;;;;;;;-1:-1:-1;56151:6:0;;-1:-1:-1;;;;;56151:6:0;56078:87;;109683:25;;;;;;;;;;;;;;;;109649:27;;;;;;;;;;;;;;;;115898:381;;;;;;;;;;;;;:::i;109715:28::-;;;;;;;;;;-1:-1:-1;109715:28:0;;;;;;;;;;;;;;-1:-1:-1;;;;;109715:28:0;;;;;;;;7178:14:1;;7171:22;7153:41;;-1:-1:-1;;;;;7230:32:1;;;7225:2;7210:18;;7203:60;7279:18;;;7272:34;7141:2;7126:18;109715:28:0;6957:355:1;117789:444:0;;;;;;;;;;;;;:::i;124639:457::-;;;;;;;;;;-1:-1:-1;124639:457:0;;;;;:::i;:::-;;:::i;109875:30::-;;;;;;;;;;;;;;;;123690:118;;;;;;;;;;-1:-1:-1;123690:118:0;;;;;:::i;:::-;;:::i;78537:42::-;;;;;;;;;;-1:-1:-1;78537:42:0;;;;;;-1:-1:-1;;;;;78537:42:0;;;;;-1:-1:-1;;;78537:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8557:15:1;;;8539:34;;8616:14;;8609:22;8604:2;8589:18;;8582:50;8668:15;;8663:2;8648:18;;8641:43;8727:14;;8720:22;8715:2;8700:18;;8693:50;8488:3;8473:19;;8266:483;109824:44:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;114660:776::-;;;;;;;;;;;;;:::i;109750:32::-;;;;;;;;;;;;;:::i;124023:149::-;;;;;;;;;;-1:-1:-1;124023:149:0;;;;;:::i;:::-;;:::i;117349:432::-;;;;;;;;;;;;;:::i;56977:201::-;;;;;;;;;;-1:-1:-1;56977:201:0;;;;;:::i;:::-;;:::i;110035:43::-;;;;;;;;;;-1:-1:-1;110035:43:0;;;;;:::i;:::-;;:::i;112201:529::-;;;;;;;;;;;;;:::i;124180:451::-;;;;;;;;;;-1:-1:-1;124180:451:0;;;;;:::i;:::-;;:::i;118241:443::-;110424:11;:9;:11::i;:::-;118293:22:::1;118329:10;:17;;118318:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;118395:6;::::0;118375:8;;118293:67;;-1:-1:-1;;;;;;118395:6:0::1;::::0;118293:67;;118395:6:::1;::::0;118375:8:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;118375:27:0::1;;118371:56;;118411:16;;-1:-1:-1::0;;;118411:16:0::1;;;;;;;;;;;118371:56;118477:6;::::0;118448:12;;-1:-1:-1;;;;;118477:6:0;;::::1;::::0;118442:5;;118448:16:::1;::::0;118477:6;;118448:16:::1;:::i;:::-;118442:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;118442:42:0::1;;118438:71;;118493:16;;-1:-1:-1::0;;;118493:16:0::1;;;;;;;;;;;118438:71;118522:17;118542:19;118555:5;118542:12;:19::i;:::-;118522:39;;118572:11;118586:18;:16;:18::i;:::-;118647:10;:17:::0;118572:32;;-1:-1:-1;118615:61:0::1;::::0;-1:-1:-1;;;;;118647:17:0::1;118666:4:::0;118572:32;118615:31:::1;:61::i;:::-;;118282:402;;;118241:443::o:0;112738:1024::-;110424:11;:9;:11::i;:::-;112794:23:::1;112832:12;:19;;112821:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;112793:71;;112884:33;112920:143;;;;;;;;112968:7;:16;;;112920:143;;;;113016:1;112920:143;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;112920:143:0::1;;::::0;::::1;;::::0;112884:179:::1;;113076:17;113096:83;113113:7;:18;;;113133;:35;;113096:83;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113170:8;113096:16;:83::i;:::-;113076:103;;113190:18;113198:9;113190:7;:18::i;:::-;113219:7;:5;:7::i;:::-;113247:11;113261:18;:16;:18::i;:::-;113247:32;;113300:15;;113294:3;:21;113290:418;;;113342:12;:19:::0;113406:18;;113443:17:::1;::::0;;::::1;::::0;113479::::1;::::0;::::1;::::0;113332:364;;-1:-1:-1;;;113332:364:0;;-1:-1:-1;;;;;113342:19:0;;::::1;::::0;113332:35:::1;::::0;113376:9;;113332:364:::1;::::0;113406:18;;113531:4:::1;::::0;113556:3;;113342:19:::1;::::0;113598:8;;113625:35;;113332:364:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;113290:418;113741:6;::::0;113725:29:::1;::::0;3725:25:1;;;-1:-1:-1;;;;;113741:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;113725:29:0;3713:2:1;3698:18;113725:29:0::1;;;;;;;112782:980;;;;112738:1024::o:0;118692:636::-;110424:11;:9;:11::i;:::-;118746:51:::1;118799:23:::0;118837:10:::1;:17;;118826:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;118943:6;::::0;118922:9;;118745:162;;-1:-1:-1;118745:162:0;;-1:-1:-1;;;;;;118943:6:0::1;::::0;118745:162;;118943:6:::1;::::0;118922:9:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;118922:28:0::1;;118918:57;;118959:16;;-1:-1:-1::0;;;118959:16:0::1;;;;;;;;;;;118918:57;119027:6;::::0;118997:13;;-1:-1:-1;;;;;119027:6:0;;::::1;::::0;118990;;118997:17:::1;::::0;119027:6;;118997:17:::1;:::i;:::-;118990:25;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;118990:44:0::1;;118986:73;;119043:16;;-1:-1:-1::0;;;119043:16:0::1;;;;;;;;;;;118986:73;119072:11;119086:18;:16;:18::i;:::-;119072:32;;119115:44;119162:51;119202:5;119209:3;119162:39;:51::i;:::-;119256:10;:17:::0;119275:8:::1;::::0;119224:96:::1;::::0;;::::1;::::0;::::1;::::0;;119301:5:::1;119224:96:::0;-1:-1:-1;;;;;119224:96:0;;::::1;::::0;;119275:8:::1;-1:-1:-1::0;;;119224:96:0;;;::::1;::::0;::::1;;;;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;;::::1;::::0;::::1;;;::::0;;;;119115:98;;-1:-1:-1;119224:96:0::1;::::0;119256:17;;;::::1;::::0;119275:8;::::1;::::0;119115:98;;119293:6;;119315:3;119224:31:::1;:96::i;:::-;;118734:594;;;;118692:636::o:0;123816:195::-;55964:13;:11;:13::i;:::-;123924:35:::1;123946:12;123924:35;;;;;;:::i;:::-;;;;;;;;123991:12:::0;123970:18:::1;:33;123991:12:::0;123970:18;:33:::1;:::i;:::-;-1:-1:-1::0;;;123816:195:0:o;74530:198::-;-1:-1:-1;;;;;73006:6:0;72989:23;72997:4;72989:23;72981:80;;;;-1:-1:-1;;;72981:80:0;;;;;;;:::i;:::-;;;;;;;;;73104:6;-1:-1:-1;;;;;73080:30:0;:20;-1:-1:-1;;;;;;;;;;;65776:65:0;-1:-1:-1;;;;;65776:65:0;;65696:153;73080:20;-1:-1:-1;;;;;73080:30:0;;73072:87;;;;-1:-1:-1;;;73072:87:0;;;;;;;:::i;:::-;74612:36:::1;74630:17;74612;:36::i;:::-;74700:12;::::0;;74710:1:::1;74700:12:::0;;;::::1;::::0;::::1;::::0;;;74659:61:::1;::::0;74681:17;;74700:12;74659:21:::1;:61::i;:::-;74530:198:::0;:::o;111587:202::-;111685:13;:11;:13::i;:::-;111709:22;:20;:22::i;:::-;111769:1;111748:18;:16;:18::i;:::-;:22;111744:37;;;111772:9;:7;:9::i;:::-;111587:202::o;75059:223::-;-1:-1:-1;;;;;73006:6:0;72989:23;72997:4;72989:23;72981:80;;;;-1:-1:-1;;;72981:80:0;;;;;;;:::i;:::-;73104:6;-1:-1:-1;;;;;73080:30:0;:20;-1:-1:-1;;;;;;;;;;;65776:65:0;-1:-1:-1;;;;;65776:65:0;;65696:153;73080:20;-1:-1:-1;;;;;73080:30:0;;73072:87;;;;-1:-1:-1;;;73072:87:0;;;;;;;:::i;:::-;75175:36:::1;75193:17;75175;:36::i;:::-;75222:52;75244:17;75263:4;75269;75222:21;:52::i;:::-;75059:223:::0;;:::o;123329:352::-;55964:13;:11;:13::i;:::-;123435:27:::1;123443:9;123454:7;123435:27;;;;;;;:::i;:::-;;;;;;;;123505:6;::::0;123514:10:::1;:17:::0;123473:59:::1;::::0;-1:-1:-1;;;;;123505:6:0;;::::1;::::0;123514:17:::1;123473:23;:59::i;:::-;123553:10;:22:::0;;;123599:7;123586:10:::1;:20;123599:7:::0;123586:10;:20:::1;:::i;:::-;-1:-1:-1::0;;123649:6:0::1;::::0;123619:54:::1;::::0;-1:-1:-1;;;;;123649:6:0::1;123658:14;;::::0;::::1;:7:::0;:14:::1;:::i;:::-;123619:21;:54::i;116807:534::-:0;110424:11;:9;:11::i;:::-;116859:37:::1;116910:10;:17;;116899:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;116859:96;;116966:22;116991:23;117007:6;116991:15;:23::i;:::-;117049:6;::::0;117029:8;;116966:48;;-1:-1:-1;;;;;;117049:6:0::1;::::0;116966:48;;117049:6:::1;::::0;117029:8:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;117029:27:0::1;;117025:56;;117065:16;;-1:-1:-1::0;;;117065:16:0::1;;;;;;;;;;;117025:56;117131:6;::::0;117102:12;;-1:-1:-1;;;;;117131:6:0;;::::1;::::0;117096:5;;117102:16:::1;::::0;117131:6;;117102:16:::1;:::i;:::-;117096:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;117096:42:0::1;;117092:71;;117147:16;;-1:-1:-1::0;;;117147:16:0::1;;;;;;;;;;;117092:71;117184:11;117198:18;:16;:18::i;:::-;117242:10;:17:::0;117227:106:::1;::::0;-1:-1:-1;;;117227:106:0;;117184:32;;-1:-1:-1;;;;;;117242:17:0::1;::::0;117227:58:::1;::::0;:106:::1;::::0;117184:32;;117242:17:::1;::::0;117294:6;;117310:4:::1;::::0;117317:15:::1;::::0;117227:106:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;117227:106:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;74136:133::-:0;74214:7;73442:4;-1:-1:-1;;;;;73451:6:0;73434:23;;73426:92;;;;-1:-1:-1;;;73426:92:0;;30181:2:1;73426:92:0;;;30163:21:1;30220:2;30200:18;;;30193:30;30259:34;30239:18;;;30232:62;30330:26;30310:18;;;30303:54;30374:19;;73426:92:0;29979:420:1;73426:92:0;-1:-1:-1;;;;;;;;;;;;74136:133:0;:::o;115444:446::-;110424:11;:9;:11::i;:::-;115496:7:::1;:5;:7::i;:::-;115514:11;115528:18;:16;:18::i;:::-;115514:32;;115569:15;;115563:3;:21;115559:277;;;115608:12;:19:::0;115679:18:::1;:30:::0;115758:6:::1;::::0;115601:223:::1;::::0;-1:-1:-1;;;115601:223:0;;115608:19:::1;115601:223;::::0;::::1;30728:42:1::0;;;-1:-1:-1;;;;;115679:30:0;;::::1;30824:18:1::0;;;30817:43;30876:18;;;30869:34;;;115758:6:0;;::::1;30919:18:1::0;;;30912:43;115608:19:0;30971::1;;;30964:51;31052:3;31031:19;;;31024:32;31072:19;;;31065:30;;;;115608:19:0;::::1;::::0;115601:39:::1;::::0;31112:19:1;;115601:223:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;115559:277;115869:6;::::0;115853:29:::1;::::0;3725:25:1;;;-1:-1:-1;;;;;115869:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;115853:29:0;3713:2:1;3698:18;115853:29:0::1;;;;;;;115485:405;115444:446::o:0;122949:372::-;55964:13;:11;:13::i;:::-;123061:31:::1;123071:11;123084:7;123061:31;;;;;;;:::i;:::-;;;;;;;;123137:6;::::0;123146:12:::1;:19:::0;123105:61:::1;::::0;-1:-1:-1;;;;;123137:6:0;;::::1;::::0;123146:19:::1;123105:23;:61::i;:::-;123187:12;:26:::0;;;123239:7;123224:12:::1;:22;123239:7:::0;123224:12;:22:::1;:::i;:::-;-1:-1:-1::0;;123289:6:0::1;::::0;123259:54:::1;::::0;-1:-1:-1;;;;;123289:6:0::1;123298:14;;::::0;::::1;:7:::0;:14:::1;:::i;116321:478::-:0;110424:11;:9;:11::i;:::-;116371:22:::1;116407:10;:17;;116396:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;116473:6;::::0;116453:8;;116371:67;;-1:-1:-1;;;;;;116473:6:0::1;::::0;116371:67;;116473:6:::1;::::0;116453:8:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;116453:27:0::1;;116449:56;;116489:16;;-1:-1:-1::0;;;116489:16:0::1;;;;;;;;;;;116449:56;116555:6;::::0;116526:12;;-1:-1:-1;;;;;116555:6:0;;::::1;::::0;116520:5;;116526:16:::1;::::0;116555:6;;116526:16:::1;:::i;:::-;116520:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;116520:42:0::1;;116516:71;;116571:16;;-1:-1:-1::0;;;116571:16:0::1;;;;;;;;;;;116516:71;116608:11;116622:18;:16;:18::i;:::-;116669:10;:17:::0;116651:140:::1;::::0;-1:-1:-1;;;116651:140:0;;116608:32;;-1:-1:-1;;;;;;116669:17:0::1;::::0;116651:61:::1;::::0;:140:::1;::::0;116608:32;;116669:17:::1;::::0;116739:5;;116754:4:::1;::::0;116761:15:::1;::::0;116651:140:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;116651:140:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;109983:45::-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;119622:135::-;119690:7;119738:9;;119727:21;;;;;;;;;:::i;:::-;;;;;;;;;;;;;119717:32;;;;;;119710:39;;119622:135;;;;;:::o;56719:103::-;55964:13;:11;:13::i;:::-;56784:30:::1;56811:1;56784:18;:30::i;114147:505::-:0;110424:11;:9;:11::i;:::-;114200:20:::1;114234:12;:19;;114223:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;114200:64;;114277:7;:5;:7::i;:::-;114295:11;114309:18;:16;:18::i;:::-;114295:32;;114350:15;;114344:3;:21;114340:258;;;114390:12;:19:::0;114439:23;;114536:13:::1;::::0;::::1;::::0;114382:204:::1;::::0;-1:-1:-1;;;114382:204:0;;-1:-1:-1;;;;;114390:19:0;;::::1;::::0;114382:38:::1;::::0;:204:::1;::::0;114439:23;;114481:36;;114536:13;114568:3;;114382:204:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;114340:258;114631:6;::::0;114615:29:::1;::::0;3725:25:1;;;-1:-1:-1;;;;;114631:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;114615:29:0;3713:2:1;3698:18;114615:29:0::1;;;;;;;;114189:463;;114147:505::o:0;110090:297::-;49790:19;49813:13;;;;;;49812:14;;49860:34;;;;-1:-1:-1;49878:12:0;;49893:1;49878:12;;;;:16;49860:34;49859:108;;;-1:-1:-1;49939:4:0;38560:19;:23;;;49900:66;;-1:-1:-1;49949:12:0;;;;;:17;49900:66;49837:204;;;;-1:-1:-1;;;49837:204:0;;35397:2:1;49837:204:0;;;35379:21:1;35436:2;35416:18;;;35409:30;35475:34;35455:18;;;35448:62;-1:-1:-1;;;35526:18:1;;;35519:44;35580:19;;49837:204:0;35195:410:1;49837:204:0;50052:12;:16;;-1:-1:-1;;50052:16:0;50067:1;50052:16;;;50079:67;;;;50114:13;:20;;-1:-1:-1;;50114:20:0;;;;;50079:67;110144:16:::1;:14;:16::i;:::-;110173:20;:18;:20::i;:::-;110204:18;:16;:18::i;:::-;110243:82;::::0;;::::1;::::0;::::1;::::0;;110281:4:::1;110243:82:::0;;;-1:-1:-1;110243:82:0::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;110235:5:::1;:90:::0;;-1:-1:-1;;;;110235:90:0;;;-1:-1:-1;;;;;;110235:90:0;;;;;;;;;;;;;;;;;110336:8:::1;:43:::0;;-1:-1:-1;;110336:43:0::1;::::0;;50168:102;;;;50219:5;50203:21;;-1:-1:-1;;50203:21:0;;;50244:14;;-1:-1:-1;35762:36:1;;50244:14:0;;35750:2:1;35735:18;50244:14:0;;;;;;;49779:498;110090:297::o;109789:28::-;;;;;;;-1:-1:-1;;;;;109789:28:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;115898:381::-;110424:11;:9;:11::i;:::-;115951:7:::1;:5;:7::i;:::-;115969:11;115983:18;:16;:18::i;:::-;115969:32;;116024:15;;116018:3;:21;116014:211;;;116064:12;:19:::0;116112:18:::1;:30:::0;116169:6:::1;::::0;116056:157:::1;::::0;-1:-1:-1;;;116056:157:0;;-1:-1:-1;;;;;116112:30:0;;::::1;116056:157;::::0;::::1;36049:34:1::0;116169:6:0;;::::1;36099:18:1::0;;;36092:43;36151:18;;;36144:34;;;116064:19:0;::::1;::::0;116056:37:::1;::::0;35984:18:1;;116056:157:0::1;35809:375:1::0;117789:444:0;110424:11;:9;:11::i;:::-;117847:17:::1;117878:10;:17;;117867:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;117847:58;;117916:22;117941:18;117954:4;117941:12;:18::i;:::-;117994:6;::::0;117974:8;;117916:43;;-1:-1:-1;;;;;;117994:6:0::1;::::0;117916:43;;117994:6:::1;::::0;117974:8:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;117974:27:0::1;;117970:56;;118010:16;;-1:-1:-1::0;;;118010:16:0::1;;;;;;;;;;;117970:56;118076:6;::::0;118047:12;;-1:-1:-1;;;;;118076:6:0;;::::1;::::0;118041:5;;118047:16:::1;::::0;118076:6;;118047:16:::1;:::i;:::-;118041:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;118041:42:0::1;;118037:71;;118092:16;;-1:-1:-1::0;;;118092:16:0::1;;;;;;;;;;;118037:71;118121:11;118135:18;:16;:18::i;:::-;118196:10;:17:::0;118121:32;;-1:-1:-1;118164:61:0::1;::::0;-1:-1:-1;;;;;118196:17:0::1;118215:4:::0;118121:32;118164:31:::1;:61::i;124639:457::-:0;55964:13;:11;:13::i;:::-;124733:7:::1;124729:360;;;124832:41;::::0;124781:21:::1;::::0;124757::::1;::::0;124832:10:::1;::::0;124781:21;;124757;124832:41;124757:21;124832:41;124781:21;124832:10;:41:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124817:56;;;124892:4;124888:36;;124905:19;;-1:-1:-1::0;;;124905:19:0::1;;;;;;;;;;;124729:360;124975:39;::::0;-1:-1:-1;;;124975:39:0;;125008:4:::1;124975:39;::::0;::::1;305:51:1::0;124957:15:0::1;::::0;-1:-1:-1;;;;;124975:24:0;::::1;::::0;::::1;::::0;278:18:1;;124975:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;124957:57:::0;-1:-1:-1;125029:48:0::1;-1:-1:-1::0;;;;;125029:27:0;::::1;125057:10;124957:57:::0;125029:27:::1;:48::i;123690:118::-:0;55964:13;:11;:13::i;:::-;123789:11;123776:10:::1;:24;123789:11:::0;123776:10;:24:::1;:::i;109824:44::-:0;;;;;;;-1:-1:-1;;;;;109824:44:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;114660:776::-;110424:11;:9;:11::i;:::-;114715:21:::1;114751:12;:19;;114740:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;114714:68;;114795:7;:5;:7::i;:::-;114813:11;114827:18;:16;:18::i;:::-;114813:32;;114868:15;;114862:3;:21;114858:524;;;114909:12;:19:::0;114969:18:::1;:30:::0;115018:14;;115051:12:::1;::::0;::::1;::::0;115082:21:::1;::::0;::::1;::::0;115122:19:::1;::::0;::::1;::::0;115236::::1;::::0;::::1;::::0;115274:17:::1;::::0;::::1;::::0;-1:-1:-1;;;;;114909:19:0;;::::1;::::0;114900:50:::1;::::0;114969:30:::1;::::0;115018:14;115051:12;115082:21;115122:19;115160:3;;114909:19:::1;::::0;115202:15:::1;::::0;114909:19;115330:25:::1;115202:15:::0;115348:7:::1;115330:25;:::i;:::-;114900:470;::::0;-1:-1:-1;;;;;;114900:470:0::1;::::0;;;;;;-1:-1:-1;;;;;39395:15:1;;;114900:470:0::1;::::0;::::1;39377:34:1::0;39427:18;;;39420:34;;;;39490:15;;;;39470:18;;;39463:43;39554:4;39542:17;;;39522:18;;;39515:45;39597:17;;;39576:19;;;39569:46;39631:19;;;39624:35;;;;39675:19;;;39668:35;;;;39719:19;;;39712:35;39784:17;;39763:19;;;39756:46;39839:17;39818:19;;;39811:46;39873:19;;;39866:36;39918:19;;;39911:36;;;;39311:19;;114900:470:0::1;38882:1071:1::0;109750:32:0;;;;;;;-1:-1:-1;;;;;109750:32:0;;;;;;;;:::i;124023:149::-;55964:13;:11;:13::i;:::-;124102:27:::1;::::0;3725:25:1;;;124102:27:0::1;::::0;3713:2:1;3698:18;124102:27:0::1;;;;;;;124139:15;:25:::0;124023:149::o;117349:432::-;110424:11;:9;:11::i;:::-;117399:17:::1;117430:10;:17;;117419:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;117399:58;;117468:22;117493:18;117506:4;117493:12;:18::i;:::-;117546:6;::::0;117526:8;;117468:43;;-1:-1:-1;;;;;;117546:6:0::1;::::0;117468:43;;117546:6:::1;::::0;117526:8:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;117526:27:0::1;;117522:56;;117562:16;;-1:-1:-1::0;;;117562:16:0::1;;;;;;;;;;;117522:56;117628:6;::::0;117599:12;;-1:-1:-1;;;;;117628:6:0;;::::1;::::0;117593:5;;117599:16:::1;::::0;117628:6;;117599:16:::1;:::i;:::-;117593:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;117593:42:0::1;;117589:71;;117644:16;;-1:-1:-1::0;;;117644:16:0::1;;;;;;;;;;;117589:71;117681:11;117695:18;:16;:18::i;:::-;117744:10;:17:::0;117681:32;;-1:-1:-1;117724:49:0::1;::::0;-1:-1:-1;;;;;117744:17:0::1;117763:4:::0;117681:32;117724:19:::1;:49::i;56977:201::-:0;55964:13;:11;:13::i;:::-;-1:-1:-1;;;;;57066:22:0;::::1;57058:73;;;::::0;-1:-1:-1;;;57058:73:0;;40160:2:1;57058:73:0::1;::::0;::::1;40142:21:1::0;40199:2;40179:18;;;40172:30;40238:34;40218:18;;;40211:62;-1:-1:-1;;;40289:18:1;;;40282:36;40335:19;;57058:73:0::1;39958:402:1::0;57058:73:0::1;57142:28;57161:8;57142:18;:28::i;110035:43::-:0;;;;;;;;;;;;;;;;:::i;112201:529::-;110424:11;:9;:11::i;:::-;112254:24:::1;112292:12;:19;;112281:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;112254:68;;112333:7;:5;:7::i;:::-;112353:11;112367:18;:16;:18::i;:::-;112353:32;;112406:15;;112400:3;:21;112396:280;;;112446:12;:19:::0;112582:18:::1;:30:::0;112642:6:::1;::::0;112438:226:::1;::::0;-1:-1:-1;;;112438:226:0;;::::1;::::0;::::1;40879:25:1::0;;;40952:10;40940:23;;40920:18;;;40913:51;-1:-1:-1;;;;;112582:30:0;;::::1;40980:18:1::0;;;40973:34;112642:6:0;;::::1;41023:18:1::0;;;41016:60;112446:19:0;::::1;::::0;112438:43:::1;::::0;40851:19:1;;112438:226:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;112709:6:0::1;::::0;112693:29:::1;::::0;3725:25:1;;;-1:-1:-1;;;;;112709:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;112693:29:0;3713:2:1;3698:18;112693:29:0::1;3579:177:1::0;124180:451:0;55964:13;:11;:13::i;:::-;124266:4:::1;::::0;::::1;;124261:132;;124287:6;:16:::0;;-1:-1:-1;;;;;124287:16:0;;::::1;-1:-1:-1::0;;;;;;124287:16:0;;::::1;;::::0;;;124318:6:::1;:16:::0;;;;;::::1;::::0;::::1;;::::0;;124349:4:::1;:11:::0;;-1:-1:-1;;124349:11:0::1;-1:-1:-1::0;124349:11:0::1;::::0;;75059:223::o;124261:132::-:1;124428:6;::::0;124410:44:::1;::::0;;-1:-1:-1;;;;;124428:6:0;;::::1;41592:34:1::0;;41662:15;;;41657:2;41642:18;;41635:43;124410:44:0::1;::::0;41527:18:1;124410:44:0::1;;;;;;;124497:6;::::0;124506:12:::1;:19:::0;124465:61:::1;::::0;-1:-1:-1;;;;;124497:6:0;;::::1;::::0;124506:19:::1;124465:23;:61::i;:::-;124537:6;:16:::0;;-1:-1:-1;;;;;;124537:16:0::1;-1:-1:-1::0;;;;;124537:16:0;;::::1;::::0;;::::1;::::0;;;124603:12:::1;:19:::0;124564:59:::1;::::0;124603:19:::1;124564:21;:59::i;110463:108::-:0;110512:10;110534:4;110512:27;110508:55;;110548:15;;-1:-1:-1;;;110548:15:0;;;;;;;;;;;120381:262;120450:17;120504:6;120511:1;120504:9;;;;;;;;:::i;:::-;;;;;;;120487:27;;;;;;;41838:2:1;41834:15;;;;-1:-1:-1;;41830:53:1;41818:66;;41909:2;41900:12;;41689:229;120487:27:0;;;;-1:-1:-1;;120487:27:0;;;;;;;;;;-1:-1:-1;120542:1:0;120525:111;120549:6;:13;120545:1;:17;120525:111;;;120608:4;120614:6;120621:1;120614:9;;;;;;;;:::i;:::-;;;;;;;120591:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;120584:40;;120564:3;;;;;:::i;:::-;;;;120525:111;;;;120381:262;;;:::o;119497:117::-;119574:6;;:31;;-1:-1:-1;;;119574:31:0;;119599:4;119574:31;;;305:51:1;119547:7:0;;-1:-1:-1;;;;;119574:6:0;;:16;;278:18:1;;119574:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119567:38;;119497:117;:::o;108014:511::-;108210:229;;;;;;;;;;;108316:4;108210:229;;;;108346:15;108210:229;;;;;;;;;;108114:17;108210:229;;;;;;108457:60;;-1:-1:-1;;;108457:60:0;;-1:-1:-1;;;;;108457:48:0;;;;;:60;;108210:229;;108457:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;108450:67;;;108014:511;;;;;;:::o;113770:369::-;113954:12;:19;113944:187;;-1:-1:-1;;;113944:187:0;;113899:17;;-1:-1:-1;;;;;113954:19:0;;113944:48;;:187;;114007:11;;113954:19;;114069:11;;114112:8;;113944:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;113929:202:0;113770:369;-1:-1:-1;;;;113770:369:0:o;121674:370::-;121730:17;121750:18;:16;:18::i;:::-;121730:38;;121796:10;121783:9;:23;121779:258;;121850:6;;121827:52;;-1:-1:-1;;;121827:52:0;;;;;3725:25:1;;;-1:-1:-1;;;;;121850:6:0;;;;121827:40;;3698:18:1;;121827:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;121823:203;;;121719:325;121674:370;:::o;111797:142::-;111908:10;;111898:21;;;;:9;:21;;;;;;;111874:46;;;;;;;;;;;;111833:98;;111874:46;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;111874:46:0;-1:-1:-1;;;;;;111874:46:0;;;;;;;;;111841:4;;111833:26;:98::i;119372:116::-;119449:6;;:31;;-1:-1:-1;;;119449:31:0;;119474:4;119449:31;;;305:51:1;119422:7:0;;-1:-1:-1;;;;;119449:6:0;;:16;;278:18:1;;119449:31:0;146:216:1;90358:1209:0;90484:37;90534:43;90615:6;:13;-1:-1:-1;;;;;90580:49:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90580:49:0;;;;;;;;;;;;;;;;;90534:95;;90645:6;90640:895;90657:6;:13;90653:1;:17;90640:895;;;90692:1;90697;90692:6;90688:774;;90751:315;;;;;;;;90815:6;90822:1;90815:9;;;;;;;;:::i;:::-;;;;;;;:16;;;90751:315;;;;90872:6;90879:1;90872:9;;;;;;;;:::i;:::-;;;;;;;:22;;;90751:315;;;;90936:6;90943:1;90936:9;;;;;;;;:::i;:::-;;;;;;;:23;;;90751:315;;;;90994:9;90751:315;;;;;;;;;;;;;;;;;;;90719:5;90725:1;90719:8;;;;;;;;:::i;:::-;;;;;;:347;;;;90688:774;;;91139:307;;;;;;;;91203:6;91210:1;91203:9;;;;;;;;:::i;:::-;;;;;;;:16;;;91139:307;;;;91260:6;91267:1;91260:9;;;;;;;;:::i;:::-;;;;;;;:22;;;91139:307;;;;91324:6;91331:1;91324:9;;;;;;;;:::i;:::-;;;;;;;:23;;;91139:307;;;;91382:1;91139:307;;;;;;;;;;;;;;;;;;;91107:5;91113:1;91107:8;;;;;;;;:::i;:::-;;;;;;:339;;;;90688:774;91505:3;;90640:895;;;-1:-1:-1;91554:5:0;90358:1209;-1:-1:-1;;;90358:1209:0:o;91575:675::-;91800:15;91828:22;91866:6;:13;-1:-1:-1;;;;;91853:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;91853:27:0;;91828:52;;91896:6;91891:242;91908:6;:13;91904:1;:17;91891:242;;;91943:1;91948;91943:6;91939:151;;91982:9;91970:6;91977:1;91970:9;;;;;;;;:::i;:::-;;;;;;:21;;;;;91939:151;;;92038:1;92022:6;:13;:17;;;;:::i;:::-;92017:1;:22;92013:77;;-1:-1:-1;;92060:6:0;92067:1;92060:9;;;;;;;;:::i;:::-;;;;;;:14;;;;;92013:77;92116:3;;91891:242;;;-1:-1:-1;92150:92:0;;-1:-1:-1;;;92150:92:0;;-1:-1:-1;;;;;92150:32:0;;;;;:92;;92183:9;;92194:6;;92202;;92210;;92218;;92226:15;;92150:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92150:92:0;;;;;;;;;;;;:::i;:::-;92143:99;91575:675;-1:-1:-1;;;;;;;;91575:675:0:o;56243:132::-;56151:6;;-1:-1:-1;;;;;56151:6:0;54194:10;56307:23;56299:68;;;;-1:-1:-1;;;56299:68:0;;48996:2:1;56299:68:0;;;48978:21:1;;;49015:18;;;49008:30;49074:34;49054:18;;;49047:62;49126:18;;56299:68:0;48794:356:1;122859:66:0;55964:13;:11;:13::i;67098:958::-;65198:66;67518:59;;;67514:535;;;67594:37;67613:17;67594:18;:37::i;67514:535::-;67697:17;-1:-1:-1;;;;;67668:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67668:63:0;;;;;;;;-1:-1:-1;;67668:63:0;;;;;;;;;;;;:::i;:::-;;;67664:306;;67898:56;;-1:-1:-1;;;67898:56:0;;49546:2:1;67898:56:0;;;49528:21:1;49585:2;49565:18;;;49558:30;49624:34;49604:18;;;49597:62;-1:-1:-1;;;49675:18:1;;;49668:44;49729:19;;67898:56:0;49344:410:1;67664:306:0;-1:-1:-1;;;;;;;;;;;67782:28:0;;67774:82;;;;-1:-1:-1;;;67774:82:0;;49961:2:1;67774:82:0;;;49943:21:1;50000:2;49980:18;;;49973:30;50039:34;50019:18;;;50012:62;-1:-1:-1;;;50090:18:1;;;50083:39;50139:19;;67774:82:0;49759:405:1;67774:82:0;67732:140;67984:53;68002:17;68021:4;68027:9;67984:17;:53::i;122052:344::-;122109:21;122146:7;;122142:247;;122197:6;;;;;;;;;-1:-1:-1;;;;;122197:6:0;-1:-1:-1;;;;;122174:39:0;;122221:21;122174:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122170:207;;;122083:313;122052:344::o;120999:667::-;121054:10;:20;;;121050:609;;;121162:6;;121180:10;:21;121155:47;;-1:-1:-1;;;121155:47:0;;121162:6;121180:21;;;-1:-1:-1;;;;;121180:21:0;;;121155:47;;;305:51:1;121091:20:0;;121162:6;;121155:24;;278:18:1;;121155:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121122:10;:21;121114:88;;;121122:21;;;-1:-1:-1;;;;;121122:21:0;121114:38;:88;:::i;:::-;121236:32;;121091:111;;-1:-1:-1;121221:47:0;;121217:431;;;121289:15;121307:18;:16;:18::i;:::-;121289:36;;121344:20;121402:12;121367:10;:32;;;:47;;;;:::i;:::-;121344:70;;121463:7;121448:12;:22;:47;;121483:12;121448:47;;;121473:7;121448:47;121542:10;:21;121521:6;;121433:62;;-1:-1:-1;121514:64:0;;-1:-1:-1;;;;;121521:6:0;;;;121542:21;;;;121433:62;121514:27;:64::i;:::-;121602:30;;3725:25:1;;;121602:30:0;;3713:2:1;3698:18;121602:30:0;;;;;;;121270:378;;121076:583;120999:667::o;111947:148::-;112062:12;;112050:25;;;;:11;:25;;;;;;;112026:50;;;;;;;;;;;;111985:102;;112026:50;;;;;:::i;122639:212::-;122727:47;;-1:-1:-1;;;122727:47:0;;122759:4;122727:47;;;41592:34:1;-1:-1:-1;;;;;41662:15:1;;;41642:18;;;41635:43;122777:1:0;;122727:23;;;;;;41527:18:1;;122727:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;122723:121;;;122795:37;-1:-1:-1;;;;;122795:25:0;;122821:7;122830:1;122795:25;:37::i;122404:227::-;122490:47;;-1:-1:-1;;;122490:47:0;;122522:4;122490:47;;;41592:34:1;-1:-1:-1;;;;;41662:15:1;;;41642:18;;;41635:43;122490:23:0;;;;;41527:18:1;;122490:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;122541:1;122490:52;122486:138;;122559:53;-1:-1:-1;;;;;122559:25:0;;122585:7;-1:-1:-1;;122559:25:0;:53::i;120651:340::-;120737:16;120766:22;120805:6;:13;120821:1;120805:17;;;;:::i;:::-;-1:-1:-1;;;;;120791:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;120791:32:0;;120766:57;;120845:6;120852:1;120845:9;;;;;;;;:::i;:::-;;;;;;;:14;;;120834:5;120840:1;120834:8;;;;;;;;:::i;:::-;;;;;;:25;-1:-1:-1;;;;;120834:25:0;;;-1:-1:-1;;;;;120834:25:0;;;;;120875:6;120870:91;120887:6;:13;120883:1;:17;120870:91;;;120937:6;120944:1;120937:9;;;;;;;;:::i;:::-;;;;;;;:12;;;120922:5;120928:1;120932;120928:5;;;;:::i;:::-;120922:12;;;;;;;;:::i;:::-;-1:-1:-1;;;;;120922:27:0;;;:12;;;;;;;;;;;:27;120902:3;;;:::i;:::-;;;120870:91;;;-1:-1:-1;120978:5:0;120651:340;-1:-1:-1;;120651:340:0:o;57338:191::-;57431:6;;;-1:-1:-1;;;;;57448:17:0;;;-1:-1:-1;;;;;;57448:17:0;;;;;;;57481:40;;57431:6;;;57448:17;57431:6;;57481:40;;57412:16;;57481:40;57401:128;57338:191;:::o;55621:97::-;51933:13;;;;;;;51925:69;;;;-1:-1:-1;;;51925:69:0;;;;;;;:::i;:::-;55684:26:::1;:24;:26::i;110579:494::-:0;110628:63;;;;;;;;;;;;;-1:-1:-1;;;110628:63:0;;;:11;:44;110650:20;;;;;;50783:2:1;50765:21;;;50822:1;50802:18;;;50795:29;-1:-1:-1;;;50855:2:1;50840:18;;50833:36;50901:2;50886:18;;50581:329;110650:20:0;;;;;;;;;;;;;110640:31;;;;;;110628:44;;;;;;;;;;;:63;;;;;;:::i;:::-;;110702:67;;;;;;;;;;;;;-1:-1:-1;;;110702:67:0;;;:11;:46;110724:22;;;;;;52472:2:1;52454:21;;;52511:1;52491:18;;;52484:29;-1:-1:-1;;;52544:2:1;52529:18;;52522:38;52592:2;52577:18;;52270:331;110724:22:0;;;;;;;;;;;;;110714:33;;;;;;110702:46;;;;;;;;;;;:67;;;;;;:::i;:::-;;110780:63;;;;;;;;;;;;;-1:-1:-1;;;110780:63:0;;;:11;:44;110802:20;;;;;;52808:2:1;52790:21;;;52847:1;52827:18;;;52820:29;-1:-1:-1;;;52880:2:1;52865:18;;52858:36;52926:2;52911:18;;52606:329;110802:20:0;;;;;;;;;;;;;110792:31;;;;;;110780:44;;;;;;;;;;;:63;;;;;;:::i;:::-;;110854:65;;;;;;;;;;;;;-1:-1:-1;;;110854:65:0;;;:11;:45;110876:21;;;;;;53142:2:1;53124:21;;;53181:1;53161:18;;;53154:29;-1:-1:-1;;;53214:2:1;53199:18;;53192:37;53261:2;53246:18;;52940:330;110876:21:0;;;;;;;;;;;;;110866:32;;;;;;110854:45;;;;;;;;;;;:65;;;;;;:::i;:::-;;110930:61;;;;;;;;;;;;;-1:-1:-1;;;110930:61:0;;;:11;:43;110952:19;;;;;;53477:2:1;53459:21;;;53516:1;53496:18;;;53489:29;-1:-1:-1;;;53549:2:1;53534:18;;53527:35;53594:2;53579:18;;53275:328;110952:19:0;;;;;;;;;;;;;110942:30;;;;;;110930:43;;;;;;;;;;;:61;;;;;;:::i;:::-;;111002:63;;;;;;;;;;;;;-1:-1:-1;;;111002:63:0;;;:11;:44;111024:20;;;;;;53810:2:1;53792:21;;;53849:1;53829:18;;;53822:29;-1:-1:-1;;;53882:2:1;53867:18;;53860:36;53928:2;53913:18;;53608:329;111024:20:0;;;;;;;;;;;;;111014:31;;;;;;111002:44;;;;;;;;;;;:63;;;;;;:::i;111081:498::-;111128:62;;;;;;;;;;;;;-1:-1:-1;;;111128:62:0;;;:9;:46;111148:24;;;;;;54144:2:1;54126:21;;;54183:2;54163:18;;;54156:30;-1:-1:-1;;;54217:2:1;54202:18;;54195:40;54267:2;54252:18;;53942:334;111148:24:0;;;;;;;;;;;;;111138:35;;;;;;111128:46;;;;;;;;;;;:62;;;;;;:::i;:::-;;111201:61;;;;;;;;;;;;;-1:-1:-1;;;111201:61:0;;;:9;:43;111221:21;;;;;;54483:2:1;54465:21;;;54522:1;54502:18;;;54495:29;-1:-1:-1;;;54555:2:1;54540:18;;54533:37;54602:2;54587:18;;54281:330;111221:21:0;;;;;;;;;;;;;111211:32;;;;;;111201:43;;;;;;;;;;;:61;;;;;;:::i;:::-;;111273:62;;;;;;;;;;;;;-1:-1:-1;;;111273:62:0;;;:9;:46;111293:24;;;;;;54818:2:1;54800:21;;;54857:2;54837:18;;;54830:30;-1:-1:-1;;;54891:2:1;54876:18;;54869:40;54941:2;54926:18;;54616:334;111293:24:0;;;;;;;;;;;;;111283:35;;;;;;111273:46;;;;;;;;;;;:62;;;;;;:::i;:::-;;111346:79;;;;;;;;;;;;;-1:-1:-1;;;111346:79:0;;;:9;:55;111366:33;;;;;;55157:2:1;55139:21;;;55196:2;55176:18;;;55169:30;-1:-1:-1;;;55230:2:1;55215:18;;55208:49;55289:2;55274:18;;54955:343;111366:33:0;;;;;;;;;;;;;111356:44;;;;;;111346:55;;;;;;;;;;;:79;;;;;;:::i;:::-;;111436:61;;;;;;;;;;;;;-1:-1:-1;;;111436:61:0;;;:9;:43;111456:21;;;;;;55505:2:1;55487:21;;;55544:1;55524:18;;;55517:29;-1:-1:-1;;;55577:2:1;55562:18;;55555:37;55624:2;55609:18;;55303:330;111456:21:0;;;;;;;;;;;;;111446:32;;;;;;111436:43;;;;;;;;;;;:61;;;;;;:::i;:::-;;111508:63;;;;;;;;;;;;;-1:-1:-1;;;111508:63:0;;;:9;:44;111528:22;;;;;;55840:2:1;55822:21;;;55879:1;55859:18;;;55852:29;-1:-1:-1;;;55912:2:1;55897:18;;55890:38;55960:2;55945:18;;55638:331;119809:461:0;119873:16;119902;119921;:5;:14;:16::i;:::-;119902:35;-1:-1:-1;119948:22:0;119987:12;119902:35;119998:1;119987:12;:::i;:::-;-1:-1:-1;;;;;119973:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;119973:27:0;;119948:52;;120016:9;120011:229;120031:8;120027:1;:12;120011:229;;;120062:14;120078;120097:23;:5;:21;:23::i;:::-;120061:59;;;;;120146:6;120135:5;120141:1;120135:8;;;;;;;;:::i;:::-;-1:-1:-1;;;;;120135:17:0;;;:8;;;;;;;;;;;:17;120182:6;120167:5;120173;:1;120177;120173:5;:::i;:::-;120167:12;;;;;;;;:::i;:::-;;;;;;:21;-1:-1:-1;;;;;120167:21:0;;;-1:-1:-1;;;;;120167:21:0;;;;;120211:17;:5;:15;:17::i;:::-;120203:25;;120046:194;;120041:3;;;;;:::i;:::-;;;;120011:229;;30661:177;30771:58;;-1:-1:-1;;;;;56166:32:1;;30771:58:0;;;56148:51:1;56215:18;;;56208:34;;;30744:86:0;;30764:5;;-1:-1:-1;;;30794:23:0;56121:18:1;;30771:58:0;;;;-1:-1:-1;;30771:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30771:58:0;-1:-1:-1;;;;;;30771:58:0;;;;;;;;;;30744:19;:86::i;107545:423::-;107717:177;;;;;;;;;;;107811:4;107717:177;;;;;;;;;;107633:17;107717:177;;;;;;107912:48;;-1:-1:-1;;;107912:48:0;;-1:-1:-1;;;;;107912:36:0;;;;;:48;;107717:177;;107912:48;;;:::i;23934:187::-;24009:12;24041:72;24063:6;24071:4;24077:1;24041:72;;;;;;;;;;;;;;;;;:21;:72::i;65945:284::-;-1:-1:-1;;;;;38560:19:0;;;66019:106;;;;-1:-1:-1;;;66019:106:0;;57052:2:1;66019:106:0;;;57034:21:1;57091:2;57071:18;;;57064:30;57130:34;57110:18;;;57103:62;-1:-1:-1;;;57181:18:1;;;57174:43;57234:19;;66019:106:0;56850:409:1;66019:106:0;-1:-1:-1;;;;;;;;;;;66136:85:0;;-1:-1:-1;;;;;;66136:85:0;-1:-1:-1;;;;;66136:85:0;;;;;;;;;;65945:284::o;66638:281::-;66747:29;66758:17;66747:10;:29::i;:::-;66805:1;66791:4;:11;:15;:28;;;;66810:9;66791:28;66787:125;;;66836:64;66876:17;66895:4;66836:39;:64::i;31557:582::-;31887:10;;;31886:62;;-1:-1:-1;31903:39:0;;-1:-1:-1;;;31903:39:0;;31927:4;31903:39;;;41592:34:1;-1:-1:-1;;;;;41662:15:1;;;41642:18;;;41635:43;31903:15:0;;;;;41527:18:1;;31903:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;31886:62;31864:166;;;;-1:-1:-1;;;31864:166:0;;57466:2:1;31864:166:0;;;57448:21:1;57505:2;57485:18;;;57478:30;57544:34;57524:18;;;57517:62;-1:-1:-1;;;57595:18:1;;;57588:52;57657:19;;31864:166:0;57264:418:1;31864:166:0;32068:62;;-1:-1:-1;;;;;56166:32:1;;32068:62:0;;;56148:51:1;56215:18;;;56208:34;;;32041:90:0;;32061:5;;-1:-1:-1;;;32091:22:0;56121:18:1;;32068:62:0;55974:274:1;55726:113:0;51933:13;;;;;;;51925:69;;;;-1:-1:-1;;;51925:69:0;;;;;;;:::i;:::-;55799:32:::1;54194:10:::0;55799:18:::1;:32::i;97830:238::-:0;97890:7;97039:20;96926:1;96831:2;97039:20;:::i;:::-;96831:2;98021:4;:11;:23;;;;:::i;:::-;98020:39;;;;:::i;98337:326::-;98445:14;;;98550:17;:4;98445:14;98550;:17::i;:::-;98541:26;-1:-1:-1;98584:24:0;:4;96831:2;98584:13;:24::i;:::-;98578:30;-1:-1:-1;98628:27:0;97039:20;96926:1;96831:2;97039:20;:::i;:::-;98628:4;;:14;:27::i;:::-;98619:36;;98337:326;;;;;:::o;99217:151::-;99278:12;99310:50;97039:20;96926:1;96831:2;97039:20;:::i;:::-;;96926:1;96831:2;97039:20;:::i;:::-;99334:4;:11;:25;;;;:::i;:::-;99310:4;;:50;:10;:50::i;34984:649::-;35408:23;35434:69;35462:4;35434:69;;;;;;;;;;;;;;;;;35442:5;-1:-1:-1;;;;;35434:27:0;;;:69;;;;;:::i;:::-;35408:95;;35522:10;:17;35543:1;35522:22;:56;;;;35559:10;35548:30;;;;;;;;;;;;:::i;:::-;35514:111;;;;-1:-1:-1;;;35514:111:0;;58361:2:1;35514:111:0;;;58343:21:1;58400:2;58380:18;;;58373:30;58439:34;58419:18;;;58412:62;-1:-1:-1;;;58490:18:1;;;58483:40;58540:19;;35514:111:0;58159:406:1;25437:455:0;25607:12;25665:5;25640:21;:30;;25632:81;;;;-1:-1:-1;;;25632:81:0;;58772:2:1;25632:81:0;;;58754:21:1;58811:2;58791:18;;;58784:30;58850:34;58830:18;;;58823:62;-1:-1:-1;;;58901:18:1;;;58894:36;58947:19;;25632:81:0;58570:402:1;25632:81:0;25725:12;25739:23;25766:6;-1:-1:-1;;;;;25766:11:0;25785:5;25792:4;25766:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25724:73;;;;25815:69;25842:6;25850:7;25859:10;25871:12;25815:26;:69::i;:::-;25808:76;;;;25437:455;;;;;;;:::o;66342:155::-;66409:37;66428:17;66409:18;:37::i;:::-;66462:27;;-1:-1:-1;;;;;66462:27:0;;;;;;;;66342:155;:::o;43657:200::-;43740:12;43772:77;43793:6;43801:4;43772:77;;;;;;;;;;;;;;;;;:20;:77::i;95740:426::-;95819:7;95862:6;95847:11;95862:6;95856:2;95847:11;:::i;:::-;:21;;95839:52;;;;-1:-1:-1;;;95839:52:0;;59471:2:1;95839:52:0;;;59453:21:1;59510:2;59490:18;;;59483:30;-1:-1:-1;;;59529:18:1;;;59522:48;59587:18;;95839:52:0;59269:342:1;95839:52:0;95927:11;:6;95936:2;95927:11;:::i;:::-;95910:6;:13;:28;;95902:62;;;;-1:-1:-1;;;95902:62:0;;59818:2:1;95902:62:0;;;59800:21:1;59857:2;59837:18;;;59830:30;-1:-1:-1;;;59876:18:1;;;59869:51;59937:18;;95902:62:0;59616:345:1;95902:62:0;-1:-1:-1;96056:30:0;96072:4;96056:30;96050:37;-1:-1:-1;;;96046:71:0;;;95740:426::o;96174:375::-;96252:6;96293;96279:10;96293:6;96288:1;96279:10;:::i;:::-;:20;;96271:50;;;;-1:-1:-1;;;96271:50:0;;60168:2:1;96271:50:0;;;60150:21:1;60207:2;60187:18;;;60180:30;-1:-1:-1;;;60226:18:1;;;60219:47;60283:18;;96271:50:0;59966:341:1;96271:50:0;96357:10;:6;96366:1;96357:10;:::i;:::-;96340:6;:13;:27;;96332:60;;;;-1:-1:-1;;;96332:60:0;;60514:2:1;96332:60:0;;;60496:21:1;60553:2;60533:18;;;60526:30;-1:-1:-1;;;60572:18:1;;;60565:50;60632:18;;96332:60:0;60312:344:1;96332:60:0;-1:-1:-1;96473:29:0;96489:3;96473:29;96467:36;;96174:375::o;92661:3071::-;92787:12;92836:7;92820:12;92836:7;92830:2;92820:12;:::i;:::-;:23;;92812:50;;;;-1:-1:-1;;;92812:50:0;;60863:2:1;92812:50:0;;;60845:21:1;60902:2;60882:18;;;60875:30;-1:-1:-1;;;60921:18:1;;;60914:44;60975:18;;92812:50:0;60661:338:1;92812:50:0;92901:6;92881:16;92890:7;92901:6;92881:16;:::i;:::-;:26;;92873:53;;;;-1:-1:-1;;;92873:53:0;;60863:2:1;92873:53:0;;;60845:21:1;60902:2;60882:18;;;60875:30;-1:-1:-1;;;60921:18:1;;;60914:44;60975:18;;92873:53:0;60661:338:1;92873:53:0;92962:16;92971:7;92962:6;:16;:::i;:::-;92945:6;:13;:33;;92937:63;;;;-1:-1:-1;;;92937:63:0;;61206:2:1;92937:63:0;;;61188:21:1;61245:2;61225:18;;;61218:30;-1:-1:-1;;;61264:18:1;;;61257:47;61321:18;;92937:63:0;61004:341:1;92937:63:0;93013:22;93079:15;;93112:2137;;;;95405:4;95399:11;95386:24;;95606:1;95595:9;95588:20;95660:4;95649:9;95645:20;95639:4;95632:34;93072:2613;;93112:2137;93309:4;93303:11;93290:24;;94014:2;94005:7;94001:16;94422:9;94415:17;94409:4;94405:28;94393:9;94382;94378:25;94374:60;94475:7;94471:2;94467:16;94748:6;94734:9;94727:17;94721:4;94717:28;94705:9;94697:6;94693:22;94689:57;94685:70;94507:470;94786:3;94782:2;94779:11;94507:470;;;94944:9;;94933:21;;94832:4;94824:13;;;;94869;94507:470;;;-1:-1:-1;;95001:26:0;;;95225:2;95208:11;-1:-1:-1;;95204:25:0;95198:4;95191:39;-1:-1:-1;;95715:9:0;-1:-1:-1;92661:3071:0;;;;;:::o;24351:229::-;24488:12;24520:52;24542:6;24550:4;24556:1;24559:12;24520:21;:52::i;28010:644::-;28195:12;28224:7;28220:427;;;28252:10;:17;28273:1;28252:22;28248:290;;-1:-1:-1;;;;;38560:19:0;;;28462:60;;;;-1:-1:-1;;;28462:60:0;;61552:2:1;28462:60:0;;;61534:21:1;61591:2;61571:18;;;61564:30;61630:31;61610:18;;;61603:59;61679:18;;28462:60:0;61350:353:1;28462:60:0;-1:-1:-1;28559:10:0;28552:17;;28220:427;28602:33;28610:10;28622:12;28602:7;:33::i;44051:332::-;44196:12;44222;44236:23;44263:6;-1:-1:-1;;;;;44263:19:0;44283:4;44263:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44221:67;;;;44306:69;44333:6;44341:7;44350:10;44362:12;44306:26;:69::i;:::-;44299:76;44051:332;-1:-1:-1;;;;;;44051:332:0:o;29196:552::-;29357:17;;:21;29353:388;;29589:10;29583:17;29646:15;29633:10;29629:2;29625:19;29618:44;29353:388;29716:12;29709:20;;-1:-1:-1;;;29709:20:0;;;;;;;;:::i;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;367:166;438:5;483:2;474:6;469:3;465:16;461:25;458:45;;;499:1;496;489:12;538:378;635:6;688:2;676:9;667:7;663:23;659:32;656:52;;;704:1;701;694:12;656:52;744:9;731:23;-1:-1:-1;;;;;769:6:1;766:30;763:50;;;809:1;806;799:12;763:50;832:78;902:7;893:6;882:9;878:22;832:78;:::i;921:131::-;-1:-1:-1;;;;;996:31:1;;986:42;;976:70;;1042:1;1039;1032:12;1057:247;1116:6;1169:2;1157:9;1148:7;1144:23;1140:32;1137:52;;;1185:1;1182;1175:12;1137:52;1224:9;1211:23;1243:31;1268:5;1243:31;:::i;1309:127::-;1370:10;1365:3;1361:20;1358:1;1351:31;1401:4;1398:1;1391:15;1425:4;1422:1;1415:15;1441:253;1513:2;1507:9;1555:4;1543:17;;-1:-1:-1;;;;;1575:34:1;;1611:22;;;1572:62;1569:88;;;1637:18;;:::i;:::-;1673:2;1666:22;1441:253;:::o;1699:275::-;1770:2;1764:9;1835:2;1816:13;;-1:-1:-1;;1812:27:1;1800:40;;-1:-1:-1;;;;;1855:34:1;;1891:22;;;1852:62;1849:88;;;1917:18;;:::i;:::-;1953:2;1946:22;1699:275;;-1:-1:-1;1699:275:1:o;1979:186::-;2027:4;-1:-1:-1;;;;;2052:6:1;2049:30;2046:56;;;2082:18;;:::i;:::-;-1:-1:-1;2148:2:1;2127:15;-1:-1:-1;;2123:29:1;2154:4;2119:40;;1979:186::o;2170:806::-;2247:6;2255;2308:2;2296:9;2287:7;2283:23;2279:32;2276:52;;;2324:1;2321;2314:12;2276:52;2363:9;2350:23;2382:31;2407:5;2382:31;:::i;:::-;2432:5;-1:-1:-1;2488:2:1;2473:18;;2460:32;-1:-1:-1;;;;;2504:30:1;;2501:50;;;2547:1;2544;2537:12;2501:50;2570:22;;2623:4;2615:13;;2611:27;-1:-1:-1;2601:55:1;;2652:1;2649;2642:12;2601:55;2688:2;2675:16;2713:48;2729:31;2757:2;2729:31;:::i;:::-;2713:48;:::i;:::-;2784:2;2777:5;2770:17;2824:7;2819:2;2814;2810;2806:11;2802:20;2799:33;2796:53;;;2845:1;2842;2835:12;2796:53;2900:2;2895;2891;2887:11;2882:2;2875:5;2871:14;2858:45;2944:1;2939:2;2934;2927:5;2923:14;2919:23;2912:34;2965:5;2955:15;;;;;2170:806;;;;;:::o;2981:158::-;3044:5;3089:2;3080:6;3075:3;3071:16;3067:25;3064:45;;;3105:1;3102;3095:12;3144:430;3242:6;3250;3303:2;3291:9;3282:7;3278:23;3274:32;3271:52;;;3319:1;3316;3309:12;3271:52;3355:9;3342:23;3332:33;;3416:2;3405:9;3401:18;3388:32;-1:-1:-1;;;;;3435:6:1;3432:30;3429:50;;;3475:1;3472;3465:12;3429:50;3498:70;3560:7;3551:6;3540:9;3536:22;3498:70;:::i;:::-;3488:80;;;3144:430;;;;;:::o;4330:236::-;4410:1;4403:5;4400:12;4390:143;;4455:10;4450:3;4446:20;4443:1;4436:31;4490:4;4487:1;4480:15;4518:4;4515:1;4508:15;4390:143;4542:18;;4330:236::o;4571:206::-;4716:2;4701:18;;4728:43;4705:9;4753:6;4728:43;:::i;4782:180::-;4841:6;4894:2;4882:9;4873:7;4869:23;4865:32;4862:52;;;4910:1;4907;4900:12;4862:52;-1:-1:-1;4933:23:1;;4782:180;-1:-1:-1;4782:180:1:o;4967:250::-;5052:1;5062:113;5076:6;5073:1;5070:13;5062:113;;;5152:11;;;5146:18;5133:11;;;5126:39;5098:2;5091:10;5062:113;;;-1:-1:-1;;5209:1:1;5191:16;;5184:27;4967:250::o;5222:271::-;5264:3;5302:5;5296:12;5329:6;5324:3;5317:19;5345:76;5414:6;5407:4;5402:3;5398:14;5391:4;5384:5;5380:16;5345:76;:::i;:::-;5475:2;5454:15;-1:-1:-1;;5450:29:1;5441:39;;;;5482:4;5437:50;;5222:271;-1:-1:-1;;5222:271:1:o;5498:220::-;5647:2;5636:9;5629:21;5610:4;5667:45;5708:2;5697:9;5693:18;5685:6;5667:45;:::i;5723:592::-;5794:6;5802;5855:2;5843:9;5834:7;5830:23;5826:32;5823:52;;;5871:1;5868;5861:12;5823:52;5911:9;5898:23;-1:-1:-1;;;;;5981:2:1;5973:6;5970:14;5967:34;;;5997:1;5994;5987:12;5967:34;6035:6;6024:9;6020:22;6010:32;;6080:7;6073:4;6069:2;6065:13;6061:27;6051:55;;6102:1;6099;6092:12;6051:55;6142:2;6129:16;6168:2;6160:6;6157:14;6154:34;;;6184:1;6181;6174:12;6154:34;6229:7;6224:2;6215:6;6211:2;6207:15;6203:24;6200:37;6197:57;;;6250:1;6247;6240:12;6197:57;6281:2;6273:11;;;;;6303:6;;-1:-1:-1;5723:592:1;;-1:-1:-1;;;;5723:592:1:o;6429:315::-;-1:-1:-1;;;;;6604:32:1;;6586:51;;6673:2;6668;6653:18;;6646:30;;;-1:-1:-1;;6693:45:1;;6719:18;;6711:6;6693:45;:::i;7317:118::-;7403:5;7396:13;7389:21;7382:5;7379:32;7369:60;;7425:1;7422;7415:12;7440:382;7505:6;7513;7566:2;7554:9;7545:7;7541:23;7537:32;7534:52;;;7582:1;7579;7572:12;7534:52;7621:9;7608:23;7640:31;7665:5;7640:31;:::i;:::-;7690:5;-1:-1:-1;7747:2:1;7732:18;;7719:32;7760:30;7719:32;7760:30;:::i;:::-;7809:7;7799:17;;;7440:382;;;;;:::o;8009:252::-;8098:6;8151:2;8139:9;8130:7;8126:23;8122:32;8119:52;;;8167:1;8164;8157:12;8119:52;8190:65;8247:7;8236:9;8190:65;:::i;8754:478::-;-1:-1:-1;;;;;8977:32:1;;8959:51;;9046:2;9041;9026:18;;9019:30;;;-1:-1:-1;;9072:45:1;;9098:18;;9090:6;9072:45;:::i;:::-;9165:9;9157:6;9153:22;9148:2;9137:9;9133:18;9126:50;9193:33;9219:6;9211;9193:33;:::i;9422:414::-;9516:6;9524;9577:2;9565:9;9556:7;9552:23;9548:32;9545:52;;;9593:1;9590;9583:12;9545:52;9632:9;9619:23;9651:31;9676:5;9651:31;:::i;:::-;9701:5;-1:-1:-1;9758:2:1;9743:18;;9730:32;9771:33;9730:32;9771:33;:::i;9841:380::-;9920:1;9916:12;;;;9963;;;9984:61;;10038:4;10030:6;10026:17;10016:27;;9984:61;10091:2;10083:6;10080:14;10060:18;10057:38;10054:161;;10137:10;10132:3;10128:20;10125:1;10118:31;10172:4;10169:1;10162:15;10200:4;10197:1;10190:15;10226:183;10286:4;-1:-1:-1;;;;;10311:6:1;10308:30;10305:56;;;10341:18;;:::i;:::-;-1:-1:-1;10386:1:1;10382:14;10398:4;10378:25;;10226:183::o;10414:734::-;10479:5;10532:3;10525:4;10517:6;10513:17;10509:27;10499:55;;10550:1;10547;10540:12;10499:55;10579:6;10573:13;10605:4;10629:60;10645:43;10685:2;10645:43;:::i;10629:60::-;10723:15;;;10809:1;10805:10;;;;10793:23;;10789:32;;;10754:12;;;;10833:15;;;10830:35;;;10861:1;10858;10851:12;10830:35;10897:2;10889:6;10885:15;10909:210;10925:6;10920:3;10917:15;10909:210;;;10998:3;10992:10;11015:31;11040:5;11015:31;:::i;:::-;11059:18;;11097:12;;;;10942;;10909:210;;;-1:-1:-1;11137:5:1;10414:734;-1:-1:-1;;;;;;10414:734:1:o;11153:363::-;11248:6;11301:2;11289:9;11280:7;11276:23;11272:32;11269:52;;;11317:1;11314;11307:12;11269:52;11350:9;11344:16;-1:-1:-1;;;;;11375:6:1;11372:30;11369:50;;;11415:1;11412;11405:12;11369:50;11438:72;11502:7;11493:6;11482:9;11478:22;11438:72;:::i;11521:127::-;11582:10;11577:3;11573:20;11570:1;11563:31;11613:4;11610:1;11603:15;11637:4;11634:1;11627:15;11653:127;11714:10;11709:3;11705:20;11702:1;11695:31;11745:4;11742:1;11735:15;11769:4;11766:1;11759:15;11785:128;11852:9;;;11873:11;;;11870:37;;;11887:18;;:::i;11918:715::-;12014:6;12067:3;12055:9;12046:7;12042:23;12038:33;12035:53;;;12084:1;12081;12074:12;12035:53;12117:2;12111:9;12159:3;12151:6;12147:16;12229:6;12217:10;12214:22;-1:-1:-1;;;;;12181:10:1;12178:34;12175:62;12172:88;;;12240:18;;:::i;:::-;12276:2;12269:22;12313:16;;12369:6;12358:18;;12348:29;;12338:57;;12391:1;12388;12381:12;12338:57;12419:5;12411:6;12404:21;;12479:2;12468:9;12464:18;12458:25;12453:2;12445:6;12441:15;12434:50;12538:2;12527:9;12523:18;12517:25;12512:2;12504:6;12500:15;12493:50;12597:2;12586:9;12582:18;12576:25;12571:2;12563:6;12559:15;12552:50;12621:6;12611:16;;;11918:715;;;;:::o;12638:307::-;12724:5;12718:12;12713:3;12706:25;12780:4;12773:5;12769:16;12763:23;12756:4;12751:3;12747:14;12740:47;12688:3;12833:4;12826:5;12822:16;12816:23;12871:4;12864;12859:3;12855:14;12848:28;12892:47;12933:4;12928:3;12924:14;12910:12;12892:47;:::i;13075:771::-;13124:3;13165:5;13159:12;13194:36;13220:9;13194:36;:::i;:::-;13239:19;;;13277:4;13300:1;13317:18;;;13344:146;;;;13504:1;13499:341;;;;13310:530;;13344:146;-1:-1:-1;;13386:24:1;;13372:12;;;13365:46;13458:14;;13451:22;13448:1;13444:30;13435:40;;13431:49;;;-1:-1:-1;13344:146:1;;13499:341;13530:5;13527:1;13520:16;13577:2;13574:1;13564:16;13602:1;13616:174;13630:6;13627:1;13624:13;13616:174;;;13717:14;;13699:11;;;13695:20;;13688:44;13760:16;;;;13645:10;;13616:174;;;13814:11;;13810:20;;;-1:-1:-1;;13310:530:1;;;;;;13075:771;;;;:::o;13851:1160::-;14326:4;14355:3;14397:6;14389;14385:19;14374:9;14367:38;14441:6;14436:2;14425:9;14421:18;14414:34;14484:6;14479:2;14468:9;14464:18;14457:34;14556:1;14552;14547:3;14543:11;14539:19;14531:6;14527:32;14522:2;14511:9;14507:18;14500:60;14597:6;14591:3;14580:9;14576:19;14569:35;14641:6;14635:3;14624:9;14620:19;14613:35;14685:2;14679:3;14668:9;14664:19;14657:31;14711:53;14760:2;14749:9;14745:18;14737:6;14711:53;:::i;:::-;14697:67;;14813:9;14805:6;14801:22;14795:3;14784:9;14780:19;14773:51;14847:40;14880:6;14872;14847:40;:::i;:::-;14924:22;;;14918:3;14903:19;;;14896:51;;;;-1:-1:-1;;14971:1:1;14956:17;;15002:2;14990:15;;13851:1160;-1:-1:-1;;;;;;;;13851:1160:1:o;15016:1534::-;15178:6;15186;15217:2;15260;15248:9;15239:7;15235:23;15231:32;15228:52;;;15276:1;15273;15266:12;15228:52;15309:9;15303:16;-1:-1:-1;;;;;15379:2:1;15371:6;15368:14;15365:34;;;15395:1;15392;15385:12;15365:34;15433:6;15422:9;15418:22;15408:32;;15478:7;15471:4;15467:2;15463:13;15459:27;15449:55;;15500:1;15497;15490:12;15449:55;15529:2;15523:9;15551:4;15575:60;15591:43;15631:2;15591:43;:::i;15575:60::-;15669:15;;;15731:4;15770:11;;;15762:20;;15758:29;;;15700:12;;;;15657:3;15799:19;;;15796:39;;;15831:1;15828;15821:12;15796:39;15855:11;;;;15875:457;15891:6;15886:3;15883:15;15875:457;;;15971:2;15965:3;15956:7;15952:17;15948:26;15945:116;;;16015:1;16044:2;16040;16033:14;15945:116;16087:22;;:::i;:::-;16136:10;;16122:25;;16189:12;;;16183:19;16167:14;;;16160:43;16245:12;;;16239:19;16223:14;;;16216:43;16272:18;;15908:12;;;;16310;;;;15875:457;;;-1:-1:-1;16387:18:1;;;16381:25;16351:5;;-1:-1:-1;16381:25:1;;-1:-1:-1;;;16418:16:1;;;16415:36;;;16447:1;16444;16437:12;16415:36;;;16470:74;16536:7;16525:8;16514:9;16510:24;16470:74;:::i;16555:500::-;16613:5;16620:6;16680:3;16667:17;16766:2;16762:7;16751:8;16735:14;16731:29;16727:43;16707:18;16703:68;16693:96;;16785:1;16782;16775:12;16693:96;16813:33;;16917:4;16904:18;;;-1:-1:-1;16865:21:1;;-1:-1:-1;;;;;;16934:30:1;;16931:50;;;16977:1;16974;16967:12;16931:50;17024:6;17008:14;17004:27;16997:5;16993:39;16990:59;;;17045:1;17042;17035:12;16990:59;16555:500;;;;;:::o;17060:266::-;17148:6;17143:3;17136:19;17200:6;17193:5;17186:4;17181:3;17177:14;17164:43;-1:-1:-1;17252:1:1;17227:16;;;17245:4;17223:27;;;17216:38;;;;17308:2;17287:15;;;-1:-1:-1;;17283:29:1;17274:39;;;17270:50;;17060:266::o;17331:857::-;17534:2;17523:9;17516:21;17497:4;17572:6;17559:20;17588:31;17613:5;17588:31;:::i;:::-;-1:-1:-1;;;;;17655:31:1;17650:2;17635:18;;;17628:59;;;;17730:55;;17769:15;;17773:6;17730:55;:::i;:::-;17821:4;17816:2;17805:9;17801:18;17794:32;17849:74;17918:3;17907:9;17903:19;17889:12;17875;17849:74;:::i;:::-;17835:88;;;17970:55;18021:2;18013:6;18009:15;18001:6;17970:55;:::i;:::-;18067:22;;;-1:-1:-1;;18063:36:1;18056:4;18041:20;;18034:66;18117:65;18071:6;18159:14;18143;18117:65;:::i;18193:195::-;18297:11;;-1:-1:-1;;;;;;18293:54:1;-1:-1:-1;;;;;18349:31:1;;;;18290:91;;;;18277:105;;18193:195::o;18393:515::-;18464:4;18470:6;18530:11;18517:25;18624:2;18620:7;18609:8;18593:14;18589:29;18585:43;18565:18;18561:68;18551:96;;18643:1;18640;18633:12;18551:96;18670:33;;18722:20;;;-1:-1:-1;;;;;;18754:30:1;;18751:50;;;18797:1;18794;18787:12;18751:50;18830:4;18818:17;;-1:-1:-1;18861:14:1;18857:27;;;18847:38;;18844:58;;;18898:1;18895;18888:12;18913:544;19014:2;19009:3;19006:11;19003:448;;;19050:1;19075:5;19071:2;19064:17;19120:4;19116:2;19106:19;19190:2;19178:10;19174:19;19171:1;19167:27;19161:4;19157:38;19226:4;19214:10;19211:20;19208:47;;;-1:-1:-1;19249:4:1;19208:47;19304:2;19299:3;19295:12;19292:1;19288:20;19282:4;19278:31;19268:41;;19359:82;19377:2;19370:5;19367:13;19359:82;;;19422:17;;;19403:1;19392:13;19359:82;;;19363:3;;;18913:544;;;:::o;19462:166::-;-1:-1:-1;;19590:1:1;19586:11;;;19582:24;19578:29;19568:40;19614:1;19610:11;;;;19565:57;;19462:166::o;19633:1188::-;-1:-1:-1;;;;;19736:3:1;19733:27;19730:53;;;19763:18;;:::i;:::-;19792:93;19881:3;19841:38;19873:4;19867:11;19841:38;:::i;:::-;19835:4;19792:93;:::i;:::-;19911:1;19936:2;19931:3;19928:11;19953:1;19948:615;;;;20607:1;20624:3;20621:93;;;-1:-1:-1;20680:19:1;;;20667:33;20621:93;20740:64;20800:3;20793:5;20740:64;:::i;:::-;20734:4;20727:78;;19921:894;;19948:615;13022:1;13015:14;;;13059:4;13046:18;;-1:-1:-1;;19984:17:1;;;20084:9;20106:229;20120:7;20117:1;20114:14;20106:229;;;20209:19;;;20196:33;20181:49;;20316:4;20301:20;;;;20269:1;20257:14;;;;20136:12;20106:229;;;20110:3;20363;20354:7;20351:16;20348:159;;;20487:1;20483:6;20477:3;20471;20468:1;20464:11;20460:21;20456:34;20452:39;20439:9;20434:3;20430:19;20417:33;20413:79;20405:6;20398:95;20348:159;;;20550:1;20544:3;20541:1;20537:11;20533:19;20527:4;20520:33;19921:894;;19633:1188;;;:::o;20826:1950::-;21013:5;21000:19;21028:33;21053:7;21028:33;:::i;:::-;21070:62;21124:7;21118:4;21070:62;:::i;:::-;;21151:1;21189:2;21183:4;21179:13;21211:2;21256:58;21310:2;21303:5;21299:14;21292:5;21256:58;:::i;:::-;-1:-1:-1;;;;;21329:13:1;21326:37;21323:63;;;21366:18;;:::i;:::-;21395:115;21496:13;21450:44;21482:10;21476:17;21450:44;:::i;:::-;21438:10;21395:115;:::i;:::-;21536:1;21571:2;21556:13;21553:21;21588:1;21583:682;;;;22311:1;22328:13;22325:113;;;-1:-1:-1;22396:27:1;;;22383:41;22325:113;22470:76;22532:13;22523:7;22470:76;:::i;:::-;22458:10;22451:96;;21546:1011;;21583:682;13022:1;13015:14;;;13059:4;13046:18;;-1:-1:-1;;21619:27:1;;;21735:9;21757:234;21771:7;21768:1;21765:14;21757:234;;;21858:27;;;21845:41;21830:57;;21959:18;;;;21914:15;;;;21787:10;;21757:234;;;21761:3;22019:13;22010:7;22007:26;22004:187;;;22171:1;22167:6;22161:3;22145:13;22142:1;22138:21;22134:31;22130:44;22126:49;22113:9;22100:11;22096:27;22083:41;22079:97;22071:6;22064:113;22004:187;;;22251:2;22235:13;22231:2;22227:22;22223:31;22211:10;22204:51;21546:1011;;;;;;;;22602:58;22656:2;22649:5;22645:14;22638:5;22602:58;:::i;:::-;22669:101;22756:13;22741;22737:1;22731:4;22727:12;22669:101;:::i;22781:408::-;22983:2;22965:21;;;23022:2;23002:18;;;22995:30;23061:34;23056:2;23041:18;;23034:62;-1:-1:-1;;;23127:2:1;23112:18;;23105:42;23179:3;23164:19;;22781:408::o;23194:::-;23396:2;23378:21;;;23435:2;23415:18;;;23408:30;23474:34;23469:2;23454:18;;23447:62;-1:-1:-1;;;23540:2:1;23525:18;;23518:42;23592:3;23577:19;;23194:408::o;23607:437::-;23669:3;23715:5;23702:19;23730:33;23755:7;23730:33;:::i;:::-;-1:-1:-1;;;;;23784:33:1;23772:46;;23861:55;23910:4;23899:16;;23903:5;23861:55;:::i;:::-;23948:4;23941;23936:3;23932:14;23925:28;23969:69;24032:4;24027:3;24023:14;24009:12;23995;23969:69;:::i;:::-;23962:76;23607:437;-1:-1:-1;;;;;23607:437:1:o;24049:349::-;24264:6;24253:9;24246:25;24307:2;24302;24291:9;24287:18;24280:30;24227:4;24327:65;24388:2;24377:9;24373:18;24365:6;24327:65;:::i;24403:1690::-;24543:5;24530:19;24558:33;24583:7;24558:33;:::i;:::-;24600:62;24654:7;24648:4;24600:62;:::i;:::-;;24681:1;24719:2;24713:4;24709:13;24741:2;24786:58;24840:2;24833:5;24829:14;24822:5;24786:58;:::i;:::-;-1:-1:-1;;;;;24859:13:1;24856:37;24853:63;;;24896:18;;:::i;:::-;24925:115;25026:13;24980:44;25012:10;25006:17;24980:44;:::i;24925:115::-;25066:1;25101:2;25086:13;25083:21;25118:1;25113:682;;;;25841:1;25858:13;25855:113;;;-1:-1:-1;25926:27:1;;;25913:41;25855:113;26000:76;26062:13;26053:7;26000:76;:::i;:::-;25988:10;25981:96;;25076:1011;;25113:682;13022:1;13015:14;;;13059:4;13046:18;;-1:-1:-1;;25149:27:1;;;25265:9;25287:234;25301:7;25298:1;25295:14;25287:234;;;25388:27;;;25375:41;25360:57;;25489:18;;;;25444:15;;;;25317:10;;25287:234;;;25291:3;25549:13;25540:7;25537:26;25534:187;;;25701:1;25697:6;25691:3;25675:13;25672:1;25668:21;25664:31;25660:44;25656:49;25643:9;25630:11;25626:27;25613:41;25609:97;25601:6;25594:113;25534:187;;;25781:2;25765:13;25761:2;25757:22;25753:31;25741:10;25734:51;25076:1011;;;;;;;;24403:1690;;:::o;26098:237::-;26241:88;26323:5;26317:4;26241:88;:::i;26340:1516::-;26459:6;26490:2;26533;26521:9;26512:7;26508:23;26504:32;26501:52;;;26549:1;26546;26539:12;26501:52;26582:9;26576:16;-1:-1:-1;;;;;26607:6:1;26604:30;26601:50;;;26647:1;26644;26637:12;26601:50;26670:22;;26723:4;26715:13;;26711:27;-1:-1:-1;26701:55:1;;26752:1;26749;26742:12;26701:55;26781:2;26775:9;26804:60;26820:43;26860:2;26820:43;:::i;26804:60::-;26898:15;;;26960:4;26999:11;;;26991:20;;26987:29;;;26929:12;;;;26886:3;27028:19;;;27025:39;;;27060:1;27057;27050:12;27025:39;27084:11;;;;27104:722;27120:6;27115:3;27112:15;27104:722;;;27200:2;27194:3;27185:7;27181:17;27177:26;27174:116;;;27244:1;27273:2;27269;27262:14;27174:116;27316:22;;:::i;:::-;27372:3;27366:10;27389:33;27414:7;27389:33;:::i;:::-;27435:22;;27491:12;;;27485:19;27517:33;27485:19;27517:33;:::i;:::-;27570:14;;;27563:31;27617:2;27653:12;;;27647:19;27679:30;27647:19;27679:30;:::i;:::-;27729:14;;;27722:31;27766:18;;27137:12;;;;27804;;;;27104:722;;;-1:-1:-1;27845:5:1;26340:1516;-1:-1:-1;;;;;;;26340:1516:1:o;27861:1227::-;28171:4;28219:3;28208:9;28204:19;28250:6;28239:9;28232:25;28276:2;28314:6;28309:2;28298:9;28294:18;28287:34;28340:2;28378:3;28373:2;28362:9;28358:18;28351:31;28402:6;28437;28431:13;28468:6;28460;28453:22;28506:3;28495:9;28491:19;28484:26;;28545:2;28537:6;28533:15;28519:29;;28566:1;28576:385;28590:6;28587:1;28584:13;28576:385;;;28649:13;;28733:9;;-1:-1:-1;;;;;28729:18:1;;;28717:31;;28792:11;;;28786:18;28782:27;28768:12;;;28761:49;28864:11;;28858:18;28851:26;28844:34;28830:12;;;28823:56;28936:15;;;;28908:4;28899:14;;;;28702:1;28605:9;28576:385;;;-1:-1:-1;;;;;;;6386:31:1;;29032:4;29017:20;;6374:44;28978:3;-1:-1:-1;28990:48:1;;-1:-1:-1;;;6320:104:1;28990:48;29075:6;29069:3;29058:9;29054:19;29047:35;27861:1227;;;;;;;;:::o;29093:881::-;29188:6;29219:2;29262;29250:9;29241:7;29237:23;29233:32;29230:52;;;29278:1;29275;29268:12;29230:52;29311:9;29305:16;-1:-1:-1;;;;;29336:6:1;29333:30;29330:50;;;29376:1;29373;29366:12;29330:50;29399:22;;29452:4;29444:13;;29440:27;-1:-1:-1;29430:55:1;;29481:1;29478;29471:12;29430:55;29510:2;29504:9;29533:60;29549:43;29589:2;29549:43;:::i;29533:60::-;29627:15;;;29709:1;29705:10;;;;29697:19;;29693:28;;;29658:12;;;;29733:19;;;29730:39;;;29765:1;29762;29755:12;29730:39;29789:11;;;;29809:135;29825:6;29820:3;29817:15;29809:135;;;29891:10;;29879:23;;29842:12;;;;29922;;;;29809:135;;;29963:5;29093:881;-1:-1:-1;;;;;;;29093:881:1:o;31746:461::-;31799:3;31837:5;31831:12;31864:6;31859:3;31852:19;31890:4;31919:2;31914:3;31910:12;31903:19;;31956:2;31949:5;31945:14;31977:1;31987:195;32001:6;31998:1;31995:13;31987:195;;;32066:13;;-1:-1:-1;;;;;32062:39:1;32050:52;;32122:12;;;;32157:15;;;;32098:1;32016:9;31987:195;;;-1:-1:-1;32198:3:1;;31746:461;-1:-1:-1;;;;;31746:461:1:o;32212:582::-;32511:6;32500:9;32493:25;32554:6;32549:2;32538:9;32534:18;32527:34;32597:3;32592:2;32581:9;32577:18;32570:31;32474:4;32618:57;32670:3;32659:9;32655:19;32647:6;32618:57;:::i;:::-;-1:-1:-1;;;;;32711:32:1;;;;32706:2;32691:18;;32684:60;-1:-1:-1;32775:3:1;32760:19;32753:35;32610:65;32212:582;-1:-1:-1;;;32212:582:1:o;32799:246::-;32958:2;32947:9;32940:21;32921:4;32978:61;33035:2;33024:9;33020:18;33012:6;33004;32978:61;:::i;33050:321::-;33126:5;33155:52;33171:35;33199:6;33171:35;:::i;33155:52::-;33146:61;;33230:6;33223:5;33216:21;33270:3;33261:6;33256:3;33252:16;33249:25;33246:45;;;33287:1;33284;33277:12;33246:45;33300:65;33358:6;33351:4;33344:5;33340:16;33335:3;33300:65;:::i;33376:237::-;33430:5;33483:3;33476:4;33468:6;33464:17;33460:27;33450:55;;33501:1;33498;33491:12;33450:55;33523:84;33603:3;33594:6;33588:13;33581:4;33573:6;33569:17;33523:84;:::i;33618:944::-;33712:6;33765:2;33753:9;33744:7;33740:23;33736:32;33733:52;;;33781:1;33778;33771:12;33733:52;33814:9;33808:16;-1:-1:-1;;;;;33884:2:1;33876:6;33873:14;33870:34;;;33900:1;33897;33890:12;33870:34;33923:22;;;;33979:4;33961:16;;;33957:27;33954:47;;;33997:1;33994;33987:12;33954:47;34030:4;34024:11;34074:4;34066:6;34062:17;34129:6;34117:10;34114:22;34109:2;34097:10;34094:18;34091:46;34088:72;;;34140:18;;:::i;:::-;34176:4;34169:24;34218:9;;34239:16;;;34236:36;;;34268:1;34265;34258:12;34236:36;34296:56;34344:7;34333:8;34329:2;34325:17;34296:56;:::i;:::-;34288:6;34281:72;;34392:2;34388;34384:11;34378:18;34421:2;34411:8;34408:16;34405:36;;;34437:1;34434;34427:12;34405:36;34474:56;34522:7;34511:8;34507:2;34503:17;34474:56;:::i;:::-;34469:2;34457:15;;34450:81;-1:-1:-1;34461:6:1;33618:944;-1:-1:-1;;;;;33618:944:1:o;34567:623::-;34837:3;34826:9;34819:22;34800:4;34864:46;34905:3;34894:9;34890:19;34882:6;34864:46;:::i;:::-;34958:9;34950:6;34946:22;34941:2;34930:9;34926:18;34919:50;34992:40;35025:6;35017;34992:40;:::i;:::-;34978:54;;35080:9;35072:6;35068:22;35063:2;35052:9;35048:18;35041:50;35108:33;35134:6;35126;35108:33;:::i;:::-;35100:41;;;35177:6;35172:2;35161:9;35157:18;35150:34;34567:623;;;;;;;:::o;36189:458::-;36268:6;36321:2;36309:9;36300:7;36296:23;36292:32;36289:52;;;36337:1;36334;36327:12;36289:52;36370:9;36364:16;-1:-1:-1;;;;;36395:6:1;36392:30;36389:50;;;36435:1;36432;36425:12;36389:50;36458:22;;36511:4;36503:13;;36499:27;-1:-1:-1;36489:55:1;;36540:1;36537;36530:12;36489:55;36563:78;36633:7;36628:2;36622:9;36617:2;36613;36609:11;36563:78;:::i;36862:184::-;36932:6;36985:2;36973:9;36964:7;36960:23;36956:32;36953:52;;;37001:1;36998;36991:12;36953:52;-1:-1:-1;37024:16:1;;36862:184;-1:-1:-1;36862:184:1:o;37051:628::-;37222:5;37209:19;37237:30;37259:7;37237:30;:::i;:::-;37286:11;;-1:-1:-1;;37374:17:1;;37327:15;;37320:23;37345:3;37316:33;37371:25;;;37358:39;;37445:2;37434:14;;37421:28;37458:33;37421:28;37458:33;:::i;:::-;-1:-1:-1;;;;;;37519:43:1;;;;37516:51;;;37577:1;37573:15;;;;-1:-1:-1;;;;;37569:43:1;37513:100;37500:114;;37668:2;37657:14;;;;37644:28;37603:1;37630:12;;;;37623:50;37051:628::o;37684:160::-;37761:13;;37814:4;37803:16;;37793:27;;37783:55;;37834:1;37831;37824:12;37783:55;37684:160;;;:::o;37849:898::-;37944:6;37997:3;37985:9;37976:7;37972:23;37968:33;37965:53;;;38014:1;38011;38004:12;37965:53;38047:2;38041:9;38089:3;38081:6;38077:16;38159:6;38147:10;38144:22;-1:-1:-1;;;;;38111:10:1;38108:34;38105:62;38102:88;;;38170:18;;:::i;:::-;38206:2;38199:22;38245:16;;38230:32;;38295:47;38338:2;38323:18;;38295:47;:::i;:::-;38290:2;38282:6;38278:15;38271:72;38376:47;38419:2;38408:9;38404:18;38376:47;:::i;:::-;38371:2;38363:6;38359:15;38352:72;38467:2;38456:9;38452:18;38446:25;38480:31;38505:5;38480:31;:::i;:::-;38539:2;38527:15;;38520:30;38584:48;38627:3;38612:19;;38584:48;:::i;:::-;38578:3;38570:6;38566:16;38559:74;38667:48;38710:3;38699:9;38695:19;38667:48;:::i;:::-;38661:3;38649:16;;38642:74;38653:6;37849:898;-1:-1:-1;;;37849:898:1:o;38752:125::-;38817:9;;;38838:10;;;38835:36;;;38851:18;;:::i;40365:280::-;40434:6;40487:2;40475:9;40466:7;40462:23;40458:32;40455:52;;;40503:1;40500;40493:12;40455:52;40535:9;40529:16;40585:10;40578:5;40574:22;40567:5;40564:33;40554:61;;40611:1;40608;40601:12;41087:288;41156:6;41209:2;41197:9;41188:7;41184:23;41180:32;41177:52;;;41225:1;41222;41215:12;41177:52;41257:9;41251:16;-1:-1:-1;;;;;41300:5:1;41296:30;41289:5;41286:41;41276:69;;41341:1;41338;41331:12;41923:428;42080:3;42118:6;42112:13;42134:66;42193:6;42188:3;42181:4;42173:6;42169:17;42134:66;:::i;:::-;42269:2;42265:15;;;;-1:-1:-1;;42261:53:1;42222:16;;;;42247:68;;;42342:2;42331:14;;41923:428;-1:-1:-1;;41923:428:1:o;42356:135::-;42395:3;42416:17;;;42413:43;;42436:18;;:::i;:::-;-1:-1:-1;42483:1:1;42472:13;;42356:135::o;42496:653::-;42693:2;42682:9;42675:21;42656:4;42731:6;42725:13;42774:4;42769:2;42758:9;42754:18;42747:32;42802:52;42849:3;42838:9;42834:19;42820:12;42802:52;:::i;:::-;42788:66;;42935:1;42931;42926:3;42922:11;42918:19;42912:2;42904:6;42900:15;42894:22;42890:48;42885:2;42874:9;42870:18;42863:76;42993:2;42985:6;42981:15;42975:22;42970:2;42959:9;42955:18;42948:50;43053:2;43045:6;43041:15;43035:22;43029:3;43018:9;43014:19;43007:51;43114:3;43106:6;43102:16;43096:23;43089:4;43078:9;43074:20;43067:53;43137:6;43129:14;;;42496:653;;;;:::o;43154:796::-;43551:6;43543;43539:19;43528:9;43521:38;43607:4;43599:6;43595:17;43590:2;43579:9;43575:18;43568:45;43649:3;43644:2;43633:9;43629:18;43622:31;43502:4;43676:46;43717:3;43706:9;43702:19;43694:6;43676:46;:::i;:::-;43753:9;43745:6;43741:22;43799:2;43794;43783:9;43779:18;43772:30;43826:1;43818:6;43811:17;43873:2;43869;43865:11;43859:3;43848:9;43844:19;43837:40;;43894:50;43940:2;43932:6;43928:15;43920:6;43894:50;:::i;43955:245::-;44034:6;44042;44095:2;44083:9;44074:7;44070:23;44066:32;44063:52;;;44111:1;44108;44101:12;44063:52;-1:-1:-1;;44134:16:1;;44190:2;44175:18;;;44169:25;44134:16;;44169:25;;-1:-1:-1;43955:245:1:o;44205:842::-;44333:3;44362:1;44395:6;44389:13;44425:36;44451:9;44425:36;:::i;:::-;44480:1;44497:18;;;44524:133;;;;44671:1;44666:356;;;;44490:532;;44524:133;-1:-1:-1;;44557:24:1;;44545:37;;44630:14;;44623:22;44611:35;;44602:45;;;-1:-1:-1;44524:133:1;;44666:356;44697:6;44694:1;44687:17;44727:4;44772:2;44769:1;44759:16;44797:1;44811:165;44825:6;44822:1;44819:13;44811:165;;;44903:14;;44890:11;;;44883:35;44946:16;;;;44840:10;;44811:165;;;44815:3;;;45005:6;45000:3;44996:16;44989:23;;44490:532;-1:-1:-1;45038:3:1;;44205:842;-1:-1:-1;;;;;;44205:842:1:o;45412:434::-;45464:3;45502:5;45496:12;45529:6;45524:3;45517:19;45555:4;45584:2;45579:3;45575:12;45568:19;;45621:2;45614:5;45610:14;45642:1;45652:169;45666:6;45663:1;45660:13;45652:169;;;45727:13;;45715:26;;45761:12;;;;45796:15;;;;45688:1;45681:9;45652:169;;45851:2053;46368:4;46397:3;46438:2;46427:9;46423:18;46450:43;46483:9;46475:6;46450:43;:::i;:::-;46512:2;46530:18;;;46523:30;;;;46602:13;;46624:22;;;;46665:3;46684:18;;;;46748:1;46744:14;;;46729:30;;46725:39;;;;46787:15;;;46820:1;46830:705;46844:6;46841:1;46838:13;46830:705;;;46909:22;;;-1:-1:-1;;46905:37:1;46893:50;;46966:13;;47034:9;;47019:25;;47087:11;;;47081:18;47064:15;;;47057:43;47123:4;47170:11;;;47164:18;47147:15;;;47140:43;47206:4;47253:11;;;47247:18;47230:15;;;47223:43;47289:4;47332:11;;;47326:18;47002:4;47364:15;;;47357:27;;;47326:18;47407:48;47439:15;;;47326:18;47407:48;:::i;:::-;47513:12;;;;47397:58;-1:-1:-1;;;47478:15:1;;;;46866:1;46859:9;46830:705;;;46834:3;;;;47585:9;47577:6;47573:22;47566:4;47555:9;47551:20;47544:52;47619:44;47656:6;47648;47619:44;:::i;:::-;47605:58;;;47672:62;47728:4;47717:9;47713:20;47705:6;45174:12;;-1:-1:-1;;;;;45170:21:1;;;45158:34;;45255:4;45244:16;;;45238:23;45231:31;45224:39;45208:14;;;45201:63;45317:4;45306:16;;;45300:23;45296:32;;;45280:14;;;45273:56;45392:4;45381:16;;;45375:23;45368:31;45361:39;45345:14;;45338:63;45052:355;47672:62;47783:9;47775:6;47771:22;47765:3;47754:9;47750:19;47743:51;47811:43;47847:6;47839;47811:43;:::i;:::-;47803:51;;;47891:6;47885:3;47874:9;47870:19;47863:35;45851:2053;;;;;;;;;:::o;50169:407::-;50371:2;50353:21;;;50410:2;50390:18;;;50383:30;50449:34;50444:2;50429:18;;50422:62;-1:-1:-1;;;50515:2:1;50500:18;;50493:41;50566:3;50551:19;;50169:407::o;50915:1350::-;51041:3;51035:10;-1:-1:-1;;;;;51060:6:1;51057:30;51054:56;;;51090:18;;:::i;:::-;51119:96;51208:6;51168:38;51200:4;51194:11;51168:38;:::i;:::-;51162:4;51119:96;:::i;:::-;51270:4;;51334:2;51323:14;;51351:1;51346:662;;;;52052:1;52069:6;52066:89;;;-1:-1:-1;52121:19:1;;;52115:26;52066:89;52181:67;52241:6;52234:5;52181:67;:::i;:::-;52175:4;52168:81;;51316:943;;51346:662;13022:1;13015:14;;;13059:4;13046:18;;-1:-1:-1;;51382:20:1;;;51499:236;51513:7;51510:1;51507:14;51499:236;;;51602:19;;;51596:26;51581:42;;51694:27;;;;51662:1;51650:14;;;;51529:19;;51499:236;;;51503:3;51763:6;51754:7;51751:19;51748:201;;;51824:19;;;51818:26;-1:-1:-1;;51907:1:1;51903:14;;;51919:3;51899:24;51895:37;51891:42;51876:58;51861:74;;51748:201;-1:-1:-1;;;;;51995:1:1;51979:14;;;51975:22;51962:36;;-1:-1:-1;50915:1350:1:o;56253:592::-;56450:2;56439:9;56432:21;56413:4;56488:6;56482:13;56531:4;56526:2;56515:9;56511:18;56504:32;56559:52;56606:3;56595:9;56591:19;56577:12;56559:52;:::i;:::-;56545:66;;56692:1;56688;56683:3;56679:11;56675:19;56669:2;56661:6;56657:15;56651:22;56647:48;56642:2;56631:9;56627:18;56620:76;56750:2;56742:6;56738:15;56732:22;56727:2;56716:9;56712:18;56705:50;56811:2;56803:6;56799:15;56793:22;56786:4;56775:9;56771:20;56764:52;56833:6;56825:14;;;56253:592;;;;:::o;57687:217::-;57727:1;57753;57743:132;;57797:10;57792:3;57788:20;57785:1;57778:31;57832:4;57829:1;57822:15;57860:4;57857:1;57850:15;57743:132;-1:-1:-1;57889:9:1;;57687:217::o;57909:245::-;57976:6;58029:2;58017:9;58008:7;58004:23;58000:32;57997:52;;;58045:1;58042;58035:12;57997:52;58077:9;58071:16;58096:28;58118:5;58096:28;:::i;58977:287::-;59106:3;59144:6;59138:13;59160:66;59219:6;59214:3;59207:4;59199:6;59195:17;59160:66;:::i;:::-;59242:16;;;;;58977:287;-1:-1:-1;;58977:287:1:o
Swarm Source
ipfs://ca39fe7b044bc9eb90cd54bdf8de561c64a8b9e5c57eba34ce6e59b84f11e618
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.