More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,716 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 13455755 | 1165 days ago | IN | 0 ETH | 0.00489216 | ||||
Claim | 13455754 | 1165 days ago | IN | 0 ETH | 0.00984894 | ||||
Claim | 13257800 | 1196 days ago | IN | 0 ETH | 0.00366551 | ||||
Claim | 13257773 | 1196 days ago | IN | 0 ETH | 0.00181804 | ||||
Claim | 12830924 | 1262 days ago | IN | 0 ETH | 0.00117844 | ||||
Claim | 12787210 | 1269 days ago | IN | 0 ETH | 0.00178552 | ||||
Claim | 12767905 | 1272 days ago | IN | 0 ETH | 0.00089902 | ||||
Claim | 12754237 | 1274 days ago | IN | 0 ETH | 0.00089228 | ||||
Claim | 12728585 | 1278 days ago | IN | 0 ETH | 0.00062493 | ||||
Claim | 12727979 | 1278 days ago | IN | 0 ETH | 0.0007142 | ||||
Fill_pool | 12726818 | 1278 days ago | IN | 0 ETH | 0.00481722 | ||||
Claim | 12726566 | 1278 days ago | IN | 0 ETH | 0.00062493 | ||||
Claim | 12726556 | 1278 days ago | IN | 0 ETH | 0.00073652 | ||||
Claim | 12715791 | 1280 days ago | IN | 0 ETH | 0.00044638 | ||||
Claim | 12704415 | 1282 days ago | IN | 0 ETH | 0.0022319 | ||||
Claim | 12702141 | 1282 days ago | IN | 0 ETH | 0.00042921 | ||||
Claim | 12696153 | 1283 days ago | IN | 0 ETH | 0.00051198 | ||||
Swap | 12695691 | 1283 days ago | IN | 0 ETH | 0.00208738 | ||||
Fill_pool | 12695689 | 1283 days ago | IN | 0 ETH | 0.0050718 | ||||
Destruct | 12695441 | 1283 days ago | IN | 0 ETH | 0.00096123 | ||||
Destruct | 12695441 | 1283 days ago | IN | 0 ETH | 0.00117013 | ||||
Destruct | 12695439 | 1283 days ago | IN | 0 ETH | 0.00096123 | ||||
Destruct | 12695434 | 1283 days ago | IN | 0 ETH | 0.00114572 | ||||
Swap | 12695383 | 1283 days ago | IN | 0 ETH | 0.00138011 | ||||
Fill_pool | 12695373 | 1283 days ago | IN | 0 ETH | 0.00283036 |
Latest 7 internal transactions
Advanced mode:
Loading...
Loading
Contract Name:
HappyTokenPool
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-28 */ // SPDX-License-Identifier: MIT /** * @author Yisi Liu * @contact [email protected] * @author_time 01/06/2021 * @maintainer Hancheng Zhou, Yisi Liu * @maintain_time 04/15/2021 **/ pragma solidity >= 0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } 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"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } abstract contract IQLF is IERC165 { /** * @dev Returns if the given address is qualified, implemented on demand. */ function ifQualified (address account) virtual external view returns (bool); /** * @dev Logs if the given address is qualified, implemented on demand. */ function logQualified (address account, uint256 ito_start_time) virtual external returns (bool); /** * @dev Ensure that custom contract implements `ifQualified` amd `logQualified` correctly. */ function supportsInterface(bytes4 interfaceId) virtual external override pure returns (bool) { return interfaceId == this.supportsInterface.selector || interfaceId == (this.ifQualified.selector ^ this.logQualified.selector); } /** * @dev Emit when `ifQualified` is called to decide if the given `address` * is `qualified` according to the preset rule by the contract creator and * the current block `number` and the current block `timestamp`. */ event Qualification(address account, bool qualified, uint256 blockNumber, uint256 timestamp); } contract HappyTokenPool { struct Pool { uint256 packed1; // qualification_address(160) the smart contract address to verify qualification // hash(40) start_time_delta(28) // expiration_time_delta(28) BIG ENDIAN uint256 packed2; // total_tokens(128) limit(128) uint48 unlock_time; // unlock_time + base_time = real_time address creator; address token_address; // the target token address address[] exchange_addrs; // a list of ERC20 addresses for swapping uint128[] exchanged_tokens; // a list of amounts of swapped tokens uint128[] ratios; // a list of swap ratios // length = 2 * exchange_addrs.length // [address1, target, address2, target, ...] // e.g. [1, 10] // represents 1 tokenA to swap 10 target token // note: each ratio pair needs to be coprime mapping(address => uint256) swapped_map; // swapped amount of an address } struct Packed { uint256 packed1; uint256 packed2; } // swap pool filling success event event FillSuccess ( uint256 total, bytes32 id, address creator, uint256 creation_time, address token_address, string message ); // swap success event event SwapSuccess ( bytes32 id, address swapper, address from_address, address to_address, uint256 from_value, uint256 to_value ); // claim success event event ClaimSuccess ( bytes32 id, address claimer, uint256 timestamp, uint256 to_value, address token_address ); // swap pool destruct success event event DestructSuccess ( bytes32 id, address token_address, uint256 remaining_balance, uint128[] exchanged_values ); // single token withdrawl from a swap pool success even event WithdrawSuccess ( bytes32 id, address token_address, uint256 withdraw_balance ); modifier creatorOnly { require(msg.sender == contract_creator, "Contract Creator Only"); _; } using SafeERC20 for IERC20; uint32 nonce; uint224 base_time; // timestamp = base_time + delta to save gas address public contract_creator; mapping(bytes32 => Pool) pool_by_id; // maps an id to a Pool instance string constant private magic = "Prince Philip, Queen Elizabeth II's husband, has died aged 99, \ Buckingham Palace has announced. A statement issued by the palace just after midday spoke of the \ Queen's deep sorrow following his death at Windsor Castle on Friday morning. The Duke of Edinbur"; bytes32 private seed; address DEFAULT_ADDRESS = 0x0000000000000000000000000000000000000000; // a universal address constructor() { contract_creator = msg.sender; seed = keccak256(abi.encodePacked(magic, block.timestamp, contract_creator)); base_time = 1616976000; // 00:00:00 03/30/2021 GMT(UTC+0) } /** * @dev * fill_pool() creates a swap pool with specific parameters from input * _hash sha3-256(password) * _start start time delta, real start time = base_time + _start * _end end time delta, real end time = base_time + _end * message swap pool creation message, only stored in FillSuccess event * _exchange_addrs swap token list (0x0 for ETH, only supports ETH and ERC20 now) * _ratios swap pair ratio list * _unlock_time unlock time delta real unlock time = base_time + _unlock_time * _token_addr swap target token address * _total_tokens target token total swap amount * _limit target token single swap limit * _qualification the qualification contract address based on IQLF to determine qualification * This function takes the above parameters and creates the pool. _total_tokens of the target token * will be successfully transferred to this contract securely on a successful run of this function. **/ function fill_pool (bytes32 _hash, uint256 _start, uint256 _end, string memory message, address[] memory _exchange_addrs, uint128[] memory _ratios, uint256 _unlock_time, address _token_addr, uint256 _total_tokens, uint256 _limit, address _qualification) public payable { nonce ++; require(_start < _end, "Start time should be earlier than end time."); require(_end < _unlock_time || _unlock_time == 0, "End time should be earlier than unlock time"); require(_limit <= _total_tokens, "Limit needs to be less than or equal to the total supply"); require(_total_tokens < 2 ** 128, "No more than 2^128 tokens(incluidng decimals) allowed"); require(IERC20(_token_addr).allowance(msg.sender, address(this)) >= _total_tokens, "Insuffcient allowance"); require(_exchange_addrs.length > 0, "Exchange token addresses need to be set"); require(_ratios.length == 2 * _exchange_addrs.length, "Size of ratios = 2 * size of exchange_addrs"); bytes32 _id = keccak256(abi.encodePacked(msg.sender, block.timestamp, nonce, seed)); Pool storage pool = pool_by_id[_id]; pool.packed1 = wrap1(_qualification, _hash, _start, _end); // 256 bytes detail in wrap1() pool.packed2 = wrap2(_total_tokens, _limit); // 256 bytes detail in wrap2() pool.unlock_time = uint48(_unlock_time); // 48 bytes unlock_time 0 -> unlocked pool.creator = msg.sender; // 160 bytes pool creator pool.exchange_addrs = _exchange_addrs; // 160 bytes target token pool.token_address = _token_addr; // 160 bytes target token address // Init each token swapped amount to 0 for (uint256 i = 0; i < _exchange_addrs.length; i++) { if (_exchange_addrs[i] != DEFAULT_ADDRESS) { // TODO: Is there a better way to validate an ERC20? require(IERC20(_exchange_addrs[i]).totalSupply() > 0, "Not a valid ERC20"); } pool.exchanged_tokens.push(0); } // Make sure each ratio is co-prime to prevent overflow for (uint256 i = 0; i < _ratios.length; i+= 2) { uint256 divA = SafeMath.div(_ratios[i], _ratios[i+1]); // Non-zero checked by SafteMath.div uint256 divB = SafeMath.div(_ratios[i+1], _ratios[i]); // Non-zero checked by SafteMath.div if (_ratios[i] == 1) { require(divB == _ratios[i+1]); } else if (_ratios[i+1] == 1) { require(divA == _ratios[i]); } else { // if a and b are co-prime, then a / b * b != a and b / a * a != b require(divA * _ratios[i+1] != _ratios[i]); require(divB * _ratios[i] != _ratios[i+1]); } } pool.ratios = _ratios; // 256 * k IERC20(_token_addr).safeTransferFrom(msg.sender, address(this), _total_tokens); emit FillSuccess(_total_tokens, _id, msg.sender, block.timestamp, _token_addr, message); } /** * @dev * swap() allows users to swap tokens in a swap pool * id swap pool id * verification sha3-256(sha3-256(password)[:40]+swapper_address) * validation sha3-256(swapper_address) * exchange_addr_i the index of the exchange address of the list * input_total the input amount of the specific token * This function is called by the swapper who approves the specific ERC20 or directly transfer the ETH * first and wants to swap the desired amount of the target token. The swapped amount is calculated * based on the pool ratio. After swap successfully, the same account can not swap the same pool again. **/ function swap (bytes32 id, bytes32 verification, bytes32 validation, uint256 exchange_addr_i, uint128 input_total) public payable returns (uint256 swapped) { Pool storage pool = pool_by_id[id]; Packed memory packed = Packed(pool.packed1, pool.packed2); require ( IQLF( address( uint160(unbox(packed.packed1, 0, 160))) ).logQualified(msg.sender, uint256(unbox(packed.packed1, 200, 28) + base_time) ) == true, "Not Qualified" ); require (unbox(packed.packed1, 200, 28) + base_time < block.timestamp, "Not started."); require (unbox(packed.packed1, 228, 28) + base_time > block.timestamp, "Expired."); // sha3(sha3(passowrd)[:40] + msg.sender) so that the raw password will never appear in the contract require (verification == keccak256(abi.encodePacked(unbox(packed.packed1, 160, 40), msg.sender)), 'Wrong Password'); // sha3(msg.sender) to protect from front runs (but this is kinda naive since the contract is open sourced) require (validation == keccak256(abi.encodePacked(msg.sender)), "Validation Failed"); uint256 total_tokens = unbox(packed.packed2, 0, 128); // revert if the pool is empty require (total_tokens > 0, "Out of Stock"); address exchange_addr = pool.exchange_addrs[exchange_addr_i]; uint256 ratioA = pool.ratios[exchange_addr_i*2]; uint256 ratioB = pool.ratios[exchange_addr_i*2 + 1]; // check if the input is enough for the desired transfer if (exchange_addr == DEFAULT_ADDRESS) { require(msg.value == input_total, 'No enough ether.'); } else { uint256 allowance = IERC20(exchange_addr).allowance(msg.sender, address(this)); require(allowance >= input_total, 'No enough allowance.'); } uint256 swapped_tokens; // this calculation won't be overflow thanks to the SafeMath and the co-prime test swapped_tokens = SafeMath.div(SafeMath.mul(input_total, ratioB), ratioA); // 2^256=10e77 >> 10e18 * 10e18 require(swapped_tokens > 0, "Better not draw water with a sieve"); uint256 limit = unbox(packed.packed2, 128, 128); if (swapped_tokens > limit) { // don't be greedy - you can only get at most limit tokens swapped_tokens = limit; input_total = uint128(SafeMath.div(SafeMath.mul(limit, ratioA), ratioB)); // Update input_total } else if (swapped_tokens > total_tokens) { // if the left tokens are not enough swapped_tokens = total_tokens; input_total = uint128(SafeMath.div(SafeMath.mul(total_tokens, ratioA), ratioB)); // Update input_total // return the eth if (exchange_addr == DEFAULT_ADDRESS) payable(msg.sender).transfer(msg.value - input_total); } require(swapped_tokens <= limit); // make sure again pool.exchanged_tokens[exchange_addr_i] = uint128(SafeMath.add(pool.exchanged_tokens[exchange_addr_i], input_total)); // update exchanged // penalize greedy attackers by placing duplication check at the very last require (pool.swapped_map[msg.sender] == 0, "Already swapped"); // update the remaining tokens and swapped token mapping pool.packed2 = rewriteBox(packed.packed2, 0, 128, SafeMath.sub(total_tokens, swapped_tokens)); pool.swapped_map[msg.sender] = swapped_tokens; // transfer the token after state changing // ETH comes with the tx, but ERC20 does not - INPUT if (exchange_addr != DEFAULT_ADDRESS) { IERC20(exchange_addr).safeTransferFrom(msg.sender, address(this), input_total); } // Swap success event emit SwapSuccess(id, msg.sender, exchange_addr, pool.token_address, input_total, swapped_tokens); // if unlock_time == 0, transfer the swapped tokens to the recipient address (msg.sender) - OUTPUT // if not, claim() needs to be called to get the token if (pool.unlock_time == 0) { transfer_token(pool.token_address, address(this), msg.sender, swapped_tokens); emit ClaimSuccess(id, msg.sender, block.timestamp, swapped_tokens, pool.token_address); } return swapped_tokens; } /** * check_availability() returns a bunch of pool info given a pool id * id swap pool id * this function returns 1. exchange_addrs that can be used to determine the index * 2. remaining target tokens * 3. if started * 4. if ended * 5. swapped amount of the query address * 5. exchanged amount of each token **/ function check_availability (bytes32 id) external view returns (address[] memory exchange_addrs, uint256 remaining, bool started, bool expired, bool unlocked, uint256 unlock_time, uint256 swapped, uint128[] memory exchanged_tokens) { Pool storage pool = pool_by_id[id]; return ( pool.exchange_addrs, // exchange_addrs 0x0 means destructed unbox(pool.packed2, 0, 128), // remaining block.timestamp > unbox(pool.packed1, 200, 28) + base_time, // started block.timestamp > unbox(pool.packed1, 228, 28) + base_time, // expired block.timestamp > pool.unlock_time + base_time, // unlocked pool.unlock_time + base_time, // unlock_time pool.swapped_map[msg.sender], // swapped number pool.exchanged_tokens // exchanged tokens ); } function claim(bytes32[] memory ito_ids) public { uint256 claimed_amount; for (uint256 i = 0; i < ito_ids.length; i++) { Pool storage pool = pool_by_id[ito_ids[i]]; if (pool.unlock_time == 0) continue; if (pool.unlock_time + base_time > block.timestamp) continue; claimed_amount = pool.swapped_map[msg.sender]; if (claimed_amount == 0) continue; pool.swapped_map[msg.sender] = 0; transfer_token(pool.token_address, address(this), msg.sender, claimed_amount); emit ClaimSuccess(ito_ids[i], msg.sender, block.timestamp, claimed_amount, pool.token_address); } } function setUnlockTime(bytes32 id, uint256 _unlock_time) public { Pool storage pool = pool_by_id[id]; require(pool.creator == msg.sender, "Pool Creator Only"); require(block.timestamp < pool.unlock_time, "Too Late"); require(pool.unlock_time != 0, "Not eligible when unlock_time is 0"); require(_unlock_time != 0, "Cannot set to 0"); pool.unlock_time = uint48(_unlock_time); } /** * destruct() destructs the given pool given the pool id * id swap pool id * this function can only be called by the pool creator. after validation, it transfers all the remaining token * (if any) and all the swapped tokens to the pool creator. it will then destruct the pool by reseting almost * all the variables to zero to get the gas refund. * note that this function may not work if a pool needs to transfer over ~200 tokens back to the address due to * the block gas limit. we have another function withdraw() to help the pool creator to withdraw a single token **/ function destruct (bytes32 id) public { Pool storage pool = pool_by_id[id]; require(msg.sender == pool.creator, "Only the pool creator can destruct."); uint256 expiration = unbox(pool.packed1, 228, 28) + base_time; uint256 remaining_tokens = unbox(pool.packed2, 0, 128); // only after expiration or the pool is empty require(expiration <= block.timestamp || remaining_tokens == 0, "Not expired yet"); // if any left in the pool if (remaining_tokens != 0) { transfer_token(pool.token_address, address(this), msg.sender, remaining_tokens); } // transfer the swapped tokens accordingly // note this loop may exceed the block gas limit so if >200 exchange_addrs this may not work for (uint256 i = 0; i < pool.exchange_addrs.length; i++) { if (pool.exchanged_tokens[i] > 0) { // ERC20 if (pool.exchange_addrs[i] != DEFAULT_ADDRESS) transfer_token(pool.exchange_addrs[i], address(this), msg.sender, pool.exchanged_tokens[i]); // ETH else payable(msg.sender).transfer(pool.exchanged_tokens[i]); } } emit DestructSuccess(id, pool.token_address, remaining_tokens, pool.exchanged_tokens); // Gas Refund pool.packed1 = 0; pool.packed2 = 0; for (uint256 i = 0; i < pool.exchange_addrs.length; i++) { pool.exchange_addrs[i] = DEFAULT_ADDRESS; pool.exchanged_tokens[i] = 0; pool.ratios[i*2] = 0; pool.ratios[i*2+1] = 0; } } /** * withdraw() transfers out a single token after a pool is expired or empty * id swap pool id * addr_i withdraw token index * this function can only be called by the pool creator. after validation, it transfers the addr_i th token * out to the pool creator address. **/ function withdraw (bytes32 id, uint256 addr_i) public { Pool storage pool = pool_by_id[id]; require(msg.sender == pool.creator, "Only the pool creator can withdraw."); uint256 withdraw_balance = pool.exchanged_tokens[addr_i]; require(withdraw_balance > 0, "None of this token left"); uint256 expiration = unbox(pool.packed1, 228, 28) + base_time; uint256 remaining_tokens = unbox(pool.packed2, 0, 128); // only after expiration or the pool is empty require(expiration <= block.timestamp || remaining_tokens == 0, "Not expired yet"); address token_address = pool.exchange_addrs[addr_i]; // ERC20 if (token_address != DEFAULT_ADDRESS) transfer_token(token_address, address(this), msg.sender, withdraw_balance); // ETH else payable(msg.sender).transfer(withdraw_balance); // clear the record pool.exchanged_tokens[addr_i] = 0; emit WithdrawSuccess(id, token_address, withdraw_balance); } // helper functions TODO: migrate this to a helper file /** * _qualification the smart contract address to verify qualification 160 * _hash sha3-256(password) 40 * _start start time delta 28 * _end end time delta 28 * wrap1() inserts the above variables into a 32-word block **/ function wrap1 (address _qualification, bytes32 _hash, uint256 _start, uint256 _end) internal pure returns (uint256 packed1) { uint256 _packed1 = 0; _packed1 |= box(0, 160, uint256(uint160(_qualification))); // _qualification = 160 bits _packed1 |= box(160, 40, uint256(_hash) >> 216); // hash = 40 bits (safe?) _packed1 |= box(200, 28, _start); // start_time = 28 bits _packed1 |= box(228, 28, _end); // expiration_time = 28 bits return _packed1; } /** * _total_tokens target remaining 128 * _limit single swap limit 128 * wrap2() inserts the above variables into a 32-word block **/ function wrap2 (uint256 _total_tokens, uint256 _limit) internal pure returns (uint256 packed2) { uint256 _packed2 = 0; _packed2 |= box(0, 128, _total_tokens); // total_tokens = 128 bits ~= 3.4e38 _packed2 |= box(128, 128, _limit); // limit = 128 bits return _packed2; } /** * position position in a memory block * size data size * data data * box() inserts the data in a 256bit word with the given position and returns it * data is checked by validRange() to make sure it is not over size **/ function box (uint16 position, uint16 size, uint256 data) internal pure returns (uint256 boxed) { require(validRange(size, data), "Value out of range BOX"); assembly { // data << position boxed := shl(position, data) } } /** * position position in a memory block * size data size * base base data * unbox() extracts the data out of a 256bit word with the given position and returns it * base is checked by validRange() to make sure it is not over size **/ function unbox (uint256 base, uint16 position, uint16 size) internal pure returns (uint256 unboxed) { require(validRange(256, base), "Value out of range UNBOX"); assembly { // (((1 << size) - 1) & base >> position) unboxed := and(sub(shl(size, 1), 1), shr(position, base)) } } /** * size data size * data data * validRange() checks if the given data is over the specified data size **/ function validRange (uint16 size, uint256 data) internal pure returns(bool ifValid) { assembly { // 2^size > data or size ==256 ifValid := or(eq(size, 256), gt(shl(size, 1), data)) } } /** * _box 32byte data to be modified * position position in a memory block * size data size * data data to be inserted * rewriteBox() updates a 32byte word with a data at the given position with the specified size **/ function rewriteBox (uint256 _box, uint16 position, uint16 size, uint256 data) internal pure returns (uint256 boxed) { assembly { // mask = ~((1 << size - 1) << position) // _box = (mask & _box) | ()data << position) boxed := or( and(_box, not(shl(position, sub(shl(size, 1), 1)))), shl(position, data)) } } /** * token_address ERC20 address * sender_address sender address * recipient_address recipient address * amount transfer amount * transfer_token() transfers a given amount of ERC20 from the sender address to the recipient address **/ function transfer_token (address token_address, address sender_address, address recipient_address, uint256 amount) internal { require(IERC20(token_address).balanceOf(sender_address) >= amount, "Balance not enough"); IERC20(token_address).safeTransfer(recipient_address, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to_value","type":"uint256"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"}],"name":"ClaimSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"remaining_balance","type":"uint256"},{"indexed":false,"internalType":"uint128[]","name":"exchanged_values","type":"uint128[]"}],"name":"DestructSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"creation_time","type":"uint256"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"FillSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"swapper","type":"address"},{"indexed":false,"internalType":"address","name":"from_address","type":"address"},{"indexed":false,"internalType":"address","name":"to_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"from_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to_value","type":"uint256"}],"name":"SwapSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdraw_balance","type":"uint256"}],"name":"WithdrawSuccess","type":"event"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"check_availability","outputs":[{"internalType":"address[]","name":"exchange_addrs","type":"address[]"},{"internalType":"uint256","name":"remaining","type":"uint256"},{"internalType":"bool","name":"started","type":"bool"},{"internalType":"bool","name":"expired","type":"bool"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"unlock_time","type":"uint256"},{"internalType":"uint256","name":"swapped","type":"uint256"},{"internalType":"uint128[]","name":"exchanged_tokens","type":"uint128[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"ito_ids","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contract_creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"destruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"string","name":"message","type":"string"},{"internalType":"address[]","name":"_exchange_addrs","type":"address[]"},{"internalType":"uint128[]","name":"_ratios","type":"uint128[]"},{"internalType":"uint256","name":"_unlock_time","type":"uint256"},{"internalType":"address","name":"_token_addr","type":"address"},{"internalType":"uint256","name":"_total_tokens","type":"uint256"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"address","name":"_qualification","type":"address"}],"name":"fill_pool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"_unlock_time","type":"uint256"}],"name":"setUnlockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bytes32","name":"verification","type":"bytes32"},{"internalType":"bytes32","name":"validation","type":"bytes32"},{"internalType":"uint256","name":"exchange_addr_i","type":"uint256"},{"internalType":"uint128","name":"input_total","type":"uint128"}],"name":"swap","outputs":[{"internalType":"uint256","name":"swapped","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"addr_i","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806101400160405280610108815260200162005aca610108913942600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051602001620000ea93929190620001ce565b604051602081830303815290604052805190602001206003819055506360611880600060046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620002d6565b62000176620001708262000223565b62000297565b82525050565b600062000189826200020d565b62000195818562000218565b9350620001a781856020860162000261565b80840191505092915050565b620001c8620001c28262000257565b620002bf565b82525050565b6000620001dc82866200017c565b9150620001ea8285620001b3565b602082019150620001fc828462000161565b601482019150819050949350505050565b600081519050919050565b600081905092915050565b6000620002308262000237565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200028157808201518184015260208101905062000264565b8381111562000291576000848401525b50505050565b6000620002a482620002ab565b9050919050565b6000620002b882620002c9565b9050919050565b6000819050919050565b60008160601b9050919050565b6157e480620002e66000396000f3fe60806040526004361061007b5760003560e01c8063c6d898341161004e578063c6d8983414610141578063cc0cab4c14610171578063ec0e3d9a1461019a578063ef65dc7e146101c35761007b565b8063040cf020146100805780636bfdaece146100a9578063b391c508146100ed578063bf5c292014610116575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a2919061398d565b6101df565b005b3480156100b557600080fd5b506100d060048036038101906100cb91906138ed565b6105ff565b6040516100e49897969594939291906143d9565b60405180910390f35b3480156100f957600080fd5b50610114600480360381019061010f9190613883565b61096d565b005b34801561012257600080fd5b5061012b610c08565b6040516101389190614335565b60405180910390f35b61015b60048036038101906101569190613916565b610c2e565b60405161016891906149be565b60405180910390f35b34801561017d57600080fd5b50610198600480360381019061019391906138ed565b6118c4565b005b3480156101a657600080fd5b506101c160048036038101906101bc919061398d565b6120a1565b005b6101dd60048036038101906101d891906139c9565b61227c565b005b60006002600084815260200190815260200160002090508060020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027f906148fe565b60405180910390fd5b60008160050183815481106102c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000811161034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906146fe565b60405180910390fd5b60008060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166103aa846000015460e4601c612e02565b6103b49190614c31565b905060006103c9846001015460006080612e02565b905042821115806103da5750600081145b610419576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104109061469e565b60405180910390fd5b6000846004018681548110610457577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146104ea576104e581303387612e62565b610532565b3373ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015610530573d6000803e3d6000fd5b505b6000856005018781548110610570577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507fab5315d16ef405a1f4e8c34017af486f59f27097e003d2a1981ae682c2f367318782866040516105ee939291906144c6565b60405180910390a150505050505050565b606060008060008060008060606000600260008b8152602001908152602001600020905080600401610638826001015460006080612e02565b600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610692846000015460c8601c612e02565b61069c9190614c31565b4211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166106f8856000015460e4601c612e02565b6107029190614c31565b4211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168560020160009054906101000a900465ffffffffffff1665ffffffffffff166107589190614bdf565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff164211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168660020160009054906101000a900465ffffffffffff1665ffffffffffff166107cc9190614bdf565b8660070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054876005018780548060200260200160405190810160405280929190818152602001828054801561089357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610849575b50505050509750827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692508080548060200260200160405190810160405280929190818152602001828054801561094a57602002820191906000526020600020906000905b82829054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019060100190602082600f010492830192600103820291508084116108f55790505b505050505090509850985098509850985098509850985050919395975091939597565b600080600090505b8251811015610c03576000600260008584815181106109bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020905060008160020160009054906101000a900465ffffffffffff1665ffffffffffff161415610a025750610bf0565b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168260020160009054906101000a900465ffffffffffff1665ffffffffffff16610a579190614bdf565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161115610a815750610bf0565b8060070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506000831415610ad45750610bf0565b60008160070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b4b8160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303386612e62565b7f0b8bdb11ddec1f8dd879bd98afac7c33c30ce590fcbc26ed559df98f9a381119848381518110610ba5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101513342868560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051610be6959493929190614549565b60405180910390a1505b8080610bfb90614ec1565b915050610975565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060026000888152602001908152602001600020905060006040518060400160405280836000015481526020018360010154815250905060011515610c7c8260000151600060a0612e02565b73ffffffffffffffffffffffffffffffffffffffff16637938037233600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610cf2866000015160c8601c612e02565b610cfc9190614c31565b6040518363ffffffff1660e01b8152600401610d199291906143b0565b602060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b91906138c4565b151514610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da49061493e565b60405180910390fd5b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610e08836000015160c8601c612e02565b610e129190614c31565b10610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061489e565b60405180910390fd5b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610ead836000015160e4601c612e02565b610eb79190614c31565b11610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee9061485e565b60405180910390fd5b610f08816000015160a06028612e02565b33604051602001610f1a929190614309565b604051602081830303815290604052805190602001208714610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f689061471e565b60405180910390fd5b33604051602001610f829190614289565b604051602081830303815290604052805190602001208614610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd09061497e565b60405180910390fd5b6000610fec826020015160006080612e02565b905060008111611031576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110289061477e565b60405180910390fd5b600083600401878154811061106f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000846006016002896110af9190614cb8565b815481106110e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600085600601600160028b6111419190614cb8565b61114b9190614c31565b81548110611182577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561127757876fffffffffffffffffffffffffffffffff163414611272576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112699061491e565b60405180910390fd5b61135d565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016112b4929190614350565b60206040518083038186803b1580156112cc57600080fd5b505afa1580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190613b01565b9050886fffffffffffffffffffffffffffffffff1681101561135b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611352906147be565b60405180910390fd5b505b600061138461137e8a6fffffffffffffffffffffffffffffffff1684612f5e565b84612f74565b9050600081116113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c0906145de565b60405180910390fd5b60006113db8760200151608080612e02565b905080821115611402578091506113fb6113f58286612f5e565b84612f74565b99506114df565b858211156114de5785915061142061141a8786612f5e565b84612f74565b9950600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114dd573373ffffffffffffffffffffffffffffffffffffffff166108fc8b6fffffffffffffffffffffffffffffffff16346114b09190614d12565b9081150290604051600060405180830381858888f193505050501580156114db573d6000803e3d6000fd5b505b5b5b808211156114ec57600080fd5b611587886005018c8154811061152b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168b6fffffffffffffffffffffffffffffffff16612f8a565b886005018c815481106115c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060008860070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116899061467e565b60405180910390fd5b6116ad8760200151600060806116a88a87612fa0565b612fb6565b8860010181905550818860070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146117905761178f33308c6fffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16612fd1909392919063ffffffff16565b5b7fa6a9350e3cb78ab6117ff3f716716cb2a1c40e92008df3c4f60e976ee6d56edc8e33878b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168e876040516117ed96959493929190614465565b60405180910390a160008860020160009054906101000a900465ffffffffffff1665ffffffffffff1614156118b05761184c8860030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303385612e62565b7f0b8bdb11ddec1f8dd879bd98afac7c33c30ce590fcbc26ed559df98f9a3811198e3342858c60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516118a7959493929190614549565b60405180910390a15b819850505050505050505095945050505050565b60006002600083815260200190815260200160002090508060020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461196d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611964906145fe565b60405180910390fd5b60008060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166119c8836000015460e4601c612e02565b6119d29190614c31565b905060006119e7836001015460006080612e02565b905042821115806119f85750600081145b611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e9061469e565b60405180910390fd5b60008114611a7057611a6f8360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303384612e62565b5b60005b8360040180549050811015611d96576000846005018281548110611ac0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff161115611d8357600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846004018281548110611b7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cbb57611cb6846004018281548110611c04577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163033876005018581548110611c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16612e62565b611d82565b3373ffffffffffffffffffffffffffffffffffffffff166108fc856005018381548110611d11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169081150290604051600060405180830381858888f19350505050158015611d80573d6000803e3d6000fd5b505b5b8080611d8e90614ec1565b915050611a73565b507f01a1fd9d8a4231d7bd8926ce16b753ba03e0310e0a776f13eba8e0c3cba7ea89848460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168386600501604051611df394939291906144fd565b60405180910390a1600083600001819055506000836001018190555060005b836004018054905081101561209a57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018281548110611e80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000846005018281548110611f06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600084600601600283611f649190614cb8565b81548110611f9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506000846006016001600284611ffb9190614cb8565b6120059190614c31565b8154811061203c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550808061209290614ec1565b915050611e12565b5050505050565b60006002600084815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461214a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121419061483e565b60405180910390fd5b8060020160009054906101000a900465ffffffffffff1665ffffffffffff1642106121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a1906147de565b60405180910390fd5b60008160020160009054906101000a900465ffffffffffff1665ffffffffffff16141561220c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122039061475e565b60405180910390fd5b6000821415612250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612247906146be565b60405180910390fd5b818160020160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550505050565b60008081819054906101000a900463ffffffff168092919061229d90614f0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555050888a106122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906146de565b60405180910390fd5b8489108061230c5750600085145b61234b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123429061499e565b60405180910390fd5b8282111561238e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612385906148de565b60405180910390fd5b70010000000000000000000000000000000083106123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d89061463e565b60405180910390fd5b828473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161241d929190614350565b60206040518083038186803b15801561243557600080fd5b505afa158015612449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246d9190613b01565b10156124ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a59061479e565b60405180910390fd5b60008751116124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e99061461e565b60405180910390fd5b865160026125009190614cb8565b865114612542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612539906147fe565b60405180910390fd5b6000334260008054906101000a900463ffffffff1660035460405160200161256d94939291906142a4565b60405160208183030381529060405280519060200120905060006002600083815260200190815260200160002090506125a8838e8e8e61305a565b81600001819055506125ba85856130ce565b8160010181905550868160020160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550338160020160066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088816004019080519060200190612644929190613460565b50858160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b89518110156128a657600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a8281518110612706577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161461282a5760008a8281518110612764577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127b157600080fd5b505afa1580156127c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e99190613b01565b11612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061481e565b60405180910390fd5b5b81600501600090806001815401808255809150506001900390600052602060002090600291828204019190066010029091909190916101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550808061289e90614ec1565b91505061268b565b5060005b8851811015612d6b57600061296f8a83815181106128f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b6001856129199190614c31565b81518110612950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff16612f74565b90506000612a2d8b6001856129849190614c31565b815181106129bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168c8581518110612a0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff16612f74565b905060018b8481518110612a6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff161415612af9578a600184612a989190614c31565b81518110612acf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168114612af457600080fd5b612d55565b60018b600185612b099190614c31565b81518110612b40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff161415612bc3578a8381518110612b99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168214612bbe57600080fd5b612d54565b8a8381518110612bfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b600185612c249190614c31565b81518110612c5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff1683612c809190614cb8565b1415612c8b57600080fd5b8a600184612c999190614c31565b81518110612cd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b8481518110612d23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff1682612d489190614cb8565b1415612d5357600080fd5b5b5b5050600281612d649190614c31565b90506128aa565b5087816006019080519060200190612d849291906134ea565b50612db23330878973ffffffffffffffffffffffffffffffffffffffff16612fd1909392919063ffffffff16565b7f67851705247ee2eaa9bf5ce64c064ee80704743e80b401abb46b36318f7be5cf858333428a8f604051612deb969594939291906149d9565b60405180910390a150505050505050505050505050565b6000612e1061010085613100565b612e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e46906145be565b60405180910390fd5b83831c600180841b031690509392505050565b808473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612e9c9190614335565b60206040518083038186803b158015612eb457600080fd5b505afa158015612ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eec9190613b01565b1015612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f249061465e565b60405180910390fd5b612f5882828673ffffffffffffffffffffffffffffffffffffffff166131169092919063ffffffff16565b50505050565b60008183612f6c9190614cb8565b905092915050565b60008183612f829190614c87565b905092915050565b60008183612f989190614c31565b905092915050565b60008183612fae9190614d12565b905092915050565b600081841b600180851b03851b198616179050949350505050565b613054846323b872dd60e01b858585604051602401612ff293929190614379565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061319c565b50505050565b60008060009050613084600060a08873ffffffffffffffffffffffffffffffffffffffff16613263565b8117905061309c60a0602860d88860001c901c613263565b811790506130ad60c8601c86613263565b811790506130be60e4601c85613263565b8117905080915050949350505050565b600080600090506130e26000608086613263565b811790506130f260808085613263565b811790508091505092915050565b6000816001841b11610100841417905092915050565b6131978363a9059cbb60e01b84846040516024016131359291906143b0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061319c565b505050565b60006131fe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132ba9092919063ffffffff16565b905060008151111561325e578080602001905181019061321e91906138c4565b61325d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132549061495e565b60405180910390fd5b5b505050565b600061326f8383613100565b6132ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a59061487e565b60405180910390fd5b81841b90509392505050565b60606132c984846000856132d2565b90509392505050565b606082471015613317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330e9061473e565b60405180910390fd5b613320856133e6565b61335f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613356906148be565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161338891906142f2565b60006040518083038185875af1925050503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b50915091506133da8282866133f9565b92505050949350505050565b600080823b905060008111915050919050565b6060831561340957829050613459565b60008351111561341c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613450919061459c565b60405180910390fd5b9392505050565b8280548282559060005260206000209081019282156134d9579160200282015b828111156134d85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613480565b5b5090506134e691906135be565b5090565b828054828255906000526020600020906001016002900481019282156135ad5791602002820160005b8382111561356f57835183826101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509260200192601001602081600f01049283019260010302613513565b80156135ab5782816101000a8154906fffffffffffffffffffffffffffffffff0219169055601001602081600f0104928301926001030261356f565b505b5090506135ba91906135be565b5090565b5b808211156135d75760008160009055506001016135bf565b5090565b60006135ee6135e984614a66565b614a41565b9050808382526020820190508285602086028201111561360d57600080fd5b60005b8581101561363d5781613623888261375d565b845260208401935060208301925050600181019050613610565b5050509392505050565b600061365a61365584614a92565b614a41565b9050808382526020820190508285602086028201111561367957600080fd5b60005b858110156136a9578161368f8882613805565b84526020840193506020830192505060018101905061367c565b5050509392505050565b60006136c66136c184614abe565b614a41565b905080838252602082019050828560208602820111156136e557600080fd5b60005b8581101561371557816136fb8882613844565b8452602084019350602083019250506001810190506136e8565b5050509392505050565b600061373261372d84614aea565b614a41565b90508281526020810184848401111561374a57600080fd5b613755848285614e1a565b509392505050565b60008135905061376c8161573b565b92915050565b600082601f83011261378357600080fd5b81356137938482602086016135db565b91505092915050565b600082601f8301126137ad57600080fd5b81356137bd848260208601613647565b91505092915050565b600082601f8301126137d757600080fd5b81356137e78482602086016136b3565b91505092915050565b6000815190506137ff81615752565b92915050565b60008135905061381481615769565b92915050565b600082601f83011261382b57600080fd5b813561383b84826020860161371f565b91505092915050565b60008135905061385381615780565b92915050565b60008135905061386881615797565b92915050565b60008151905061387d81615797565b92915050565b60006020828403121561389557600080fd5b600082013567ffffffffffffffff8111156138af57600080fd5b6138bb8482850161379c565b91505092915050565b6000602082840312156138d657600080fd5b60006138e4848285016137f0565b91505092915050565b6000602082840312156138ff57600080fd5b600061390d84828501613805565b91505092915050565b600080600080600060a0868803121561392e57600080fd5b600061393c88828901613805565b955050602061394d88828901613805565b945050604061395e88828901613805565b935050606061396f88828901613859565b925050608061398088828901613844565b9150509295509295909350565b600080604083850312156139a057600080fd5b60006139ae85828601613805565b92505060206139bf85828601613859565b9150509250929050565b60008060008060008060008060008060006101608c8e0312156139eb57600080fd5b60006139f98e828f01613805565b9b50506020613a0a8e828f01613859565b9a50506040613a1b8e828f01613859565b99505060608c013567ffffffffffffffff811115613a3857600080fd5b613a448e828f0161381a565b98505060808c013567ffffffffffffffff811115613a6157600080fd5b613a6d8e828f01613772565b97505060a08c013567ffffffffffffffff811115613a8a57600080fd5b613a968e828f016137c6565b96505060c0613aa78e828f01613859565b95505060e0613ab88e828f0161375d565b945050610100613aca8e828f01613859565b935050610120613adc8e828f01613859565b925050610140613aee8e828f0161375d565b9150509295989b509295989b9093969950565b600060208284031215613b1357600080fd5b6000613b218482850161386e565b91505092915050565b6000613b368383613b5a565b60208301905092915050565b6000613b4e838361422e565b60208301905092915050565b613b6381614d62565b82525050565b613b7281614d62565b82525050565b613b89613b8482614d62565b614f37565b82525050565b6000613b9a82614b50565b613ba48185614ba1565b9350613baf83614b1b565b8060005b83811015613be0578151613bc78882613b2a565b9750613bd283614b87565b925050600181019050613bb3565b5085935050505092915050565b6000613bf882614b5b565b613c028185614bb2565b9350613c0d83614b2b565b8060005b83811015613c3e578151613c258882613b42565b9750613c3083614b94565b925050600181019050613c11565b5085935050505092915050565b6000613c5682614b66565b613c608185614bb2565b935083613c6c84614b3b565b6000600115613cc9575b83600160020382011015613cc8578154613c9888613c9383614e5c565b61422e565b602088019750613cb088613cab83614e76565b61422e565b60208801975060018301925050600281019050613c76565b5b600115613d2257815484821015613cf957613cec88613ce783614e5c565b61422e565b6020880197506001820191505b84821015613d2057613d1388613d0e83614e76565b61422e565b6020880197506001820191505b505b8694505050505092915050565b613d3881614d74565b82525050565b613d4781614d80565b82525050565b613d5e613d5982614d80565b614f49565b82525050565b6000613d6f82614b71565b613d798185614bc3565b9350613d89818560208601614e29565b80840191505092915050565b6000613da082614b7c565b613daa8185614bce565b9350613dba818560208601614e29565b613dc38161500e565b840191505092915050565b6000613ddb601883614bce565b9150613de682615053565b602082019050919050565b6000613dfe602283614bce565b9150613e098261507c565b604082019050919050565b6000613e21602383614bce565b9150613e2c826150cb565b604082019050919050565b6000613e44602783614bce565b9150613e4f8261511a565b604082019050919050565b6000613e67603583614bce565b9150613e7282615169565b604082019050919050565b6000613e8a601283614bce565b9150613e95826151b8565b602082019050919050565b6000613ead600f83614bce565b9150613eb8826151e1565b602082019050919050565b6000613ed0600f83614bce565b9150613edb8261520a565b602082019050919050565b6000613ef3600f83614bce565b9150613efe82615233565b602082019050919050565b6000613f16602b83614bce565b9150613f218261525c565b604082019050919050565b6000613f39601783614bce565b9150613f44826152ab565b602082019050919050565b6000613f5c600e83614bce565b9150613f67826152d4565b602082019050919050565b6000613f7f602683614bce565b9150613f8a826152fd565b604082019050919050565b6000613fa2602283614bce565b9150613fad8261534c565b604082019050919050565b6000613fc5600c83614bce565b9150613fd08261539b565b602082019050919050565b6000613fe8601583614bce565b9150613ff3826153c4565b602082019050919050565b600061400b601483614bce565b9150614016826153ed565b602082019050919050565b600061402e600883614bce565b915061403982615416565b602082019050919050565b6000614051602b83614bce565b915061405c8261543f565b604082019050919050565b6000614074601183614bce565b915061407f8261548e565b602082019050919050565b6000614097601183614bce565b91506140a2826154b7565b602082019050919050565b60006140ba600883614bce565b91506140c5826154e0565b602082019050919050565b60006140dd601683614bce565b91506140e882615509565b602082019050919050565b6000614100600c83614bce565b915061410b82615532565b602082019050919050565b6000614123601d83614bce565b915061412e8261555b565b602082019050919050565b6000614146603883614bce565b915061415182615584565b604082019050919050565b6000614169602383614bce565b9150614174826155d3565b604082019050919050565b600061418c601083614bce565b915061419782615622565b602082019050919050565b60006141af600d83614bce565b91506141ba8261564b565b602082019050919050565b60006141d2602a83614bce565b91506141dd82615674565b604082019050919050565b60006141f5601183614bce565b9150614200826156c3565b602082019050919050565b6000614218602b83614bce565b9150614223826156ec565b604082019050919050565b61423781614d8a565b82525050565b61424681614e08565b82525050565b61425581614dee565b82525050565b61426c61426782614dee565b614f65565b82525050565b61428361427e82614df8565b614f6f565b82525050565b60006142958284613b78565b60148201915081905092915050565b60006142b08287613b78565b6014820191506142c0828661425b565b6020820191506142d08285614272565b6004820191506142e08284613d4d565b60208201915081905095945050505050565b60006142fe8284613d64565b915081905092915050565b6000614315828561425b565b6020820191506143258284613b78565b6014820191508190509392505050565b600060208201905061434a6000830184613b69565b92915050565b60006040820190506143656000830185613b69565b6143726020830184613b69565b9392505050565b600060608201905061438e6000830186613b69565b61439b6020830185613b69565b6143a8604083018461424c565b949350505050565b60006040820190506143c56000830185613b69565b6143d2602083018461424c565b9392505050565b60006101008201905081810360008301526143f4818b613b8f565b9050614403602083018a61424c565b6144106040830189613d2f565b61441d6060830188613d2f565b61442a6080830187613d2f565b61443760a083018661424c565b61444460c083018561424c565b81810360e08301526144568184613bed565b90509998505050505050505050565b600060c08201905061447a6000830189613d3e565b6144876020830188613b69565b6144946040830187613b69565b6144a16060830186613b69565b6144ae608083018561423d565b6144bb60a083018461424c565b979650505050505050565b60006060820190506144db6000830186613d3e565b6144e86020830185613b69565b6144f5604083018461424c565b949350505050565b60006080820190506145126000830187613d3e565b61451f6020830186613b69565b61452c604083018561424c565b818103606083015261453e8184613c4b565b905095945050505050565b600060a08201905061455e6000830188613d3e565b61456b6020830187613b69565b614578604083018661424c565b614585606083018561424c565b6145926080830184613b69565b9695505050505050565b600060208201905081810360008301526145b68184613d95565b905092915050565b600060208201905081810360008301526145d781613dce565b9050919050565b600060208201905081810360008301526145f781613df1565b9050919050565b6000602082019050818103600083015261461781613e14565b9050919050565b6000602082019050818103600083015261463781613e37565b9050919050565b6000602082019050818103600083015261465781613e5a565b9050919050565b6000602082019050818103600083015261467781613e7d565b9050919050565b6000602082019050818103600083015261469781613ea0565b9050919050565b600060208201905081810360008301526146b781613ec3565b9050919050565b600060208201905081810360008301526146d781613ee6565b9050919050565b600060208201905081810360008301526146f781613f09565b9050919050565b6000602082019050818103600083015261471781613f2c565b9050919050565b6000602082019050818103600083015261473781613f4f565b9050919050565b6000602082019050818103600083015261475781613f72565b9050919050565b6000602082019050818103600083015261477781613f95565b9050919050565b6000602082019050818103600083015261479781613fb8565b9050919050565b600060208201905081810360008301526147b781613fdb565b9050919050565b600060208201905081810360008301526147d781613ffe565b9050919050565b600060208201905081810360008301526147f781614021565b9050919050565b6000602082019050818103600083015261481781614044565b9050919050565b6000602082019050818103600083015261483781614067565b9050919050565b600060208201905081810360008301526148578161408a565b9050919050565b60006020820190508181036000830152614877816140ad565b9050919050565b60006020820190508181036000830152614897816140d0565b9050919050565b600060208201905081810360008301526148b7816140f3565b9050919050565b600060208201905081810360008301526148d781614116565b9050919050565b600060208201905081810360008301526148f781614139565b9050919050565b600060208201905081810360008301526149178161415c565b9050919050565b600060208201905081810360008301526149378161417f565b9050919050565b60006020820190508181036000830152614957816141a2565b9050919050565b60006020820190508181036000830152614977816141c5565b9050919050565b60006020820190508181036000830152614997816141e8565b9050919050565b600060208201905081810360008301526149b78161420b565b9050919050565b60006020820190506149d3600083018461424c565b92915050565b600060c0820190506149ee600083018961424c565b6149fb6020830188613d3e565b614a086040830187613b69565b614a15606083018661424c565b614a226080830185613b69565b81810360a0830152614a348184613d95565b9050979650505050505050565b6000614a4b614a5c565b9050614a578282614e90565b919050565b6000604051905090565b600067ffffffffffffffff821115614a8157614a80614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aad57614aac614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ad957614ad8614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b0557614b04614fdf565b5b614b0e8261500e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614bea82614dc6565b9150614bf583614dc6565b9250827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c2657614c25614f81565b5b828201905092915050565b6000614c3c82614dee565b9150614c4783614dee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7c57614c7b614f81565b5b828201905092915050565b6000614c9282614dee565b9150614c9d83614dee565b925082614cad57614cac614fb0565b5b828204905092915050565b6000614cc382614dee565b9150614cce83614dee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0757614d06614f81565b5b828202905092915050565b6000614d1d82614dee565b9150614d2883614dee565b925082821015614d3b57614d3a614f81565b5b828203905092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000614d6d82614da6565b9050919050565b60008115159050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b6000614e1382614d8a565b9050919050565b82818337600083830152505050565b60005b83811015614e47578082015181840152602081019050614e2c565b83811115614e56576000848401525b50505050565b6000614e6f614e6a83615039565b614d46565b9050919050565b6000614e89614e8483615046565b614d46565b9050919050565b614e998261500e565b810181811067ffffffffffffffff82111715614eb857614eb7614fdf565b5b80604052505050565b6000614ecc82614dee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eff57614efe614f81565b5b600182019050919050565b6000614f1582614df8565b915063ffffffff821415614f2c57614f2b614f81565b5b600182019050919050565b6000614f4282614f53565b9050919050565b6000819050919050565b6000614f5e8261502c565b9050919050565b6000819050919050565b6000614f7a8261501f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160e01b9050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160801c9050919050565b7f56616c7565206f7574206f662072616e676520554e424f580000000000000000600082015250565b7f426574746572206e6f742064726177207761746572207769746820612073696560008201527f7665000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c792074686520706f6f6c2063726561746f722063616e2064657374727560008201527f63742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f45786368616e676520746f6b656e20616464726573736573206e65656420746f60008201527f2062652073657400000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f7265207468616e20325e31323820746f6b656e7328696e636c756960008201527f646e6720646563696d616c732920616c6c6f7765640000000000000000000000602082015250565b7f42616c616e6365206e6f7420656e6f7567680000000000000000000000000000600082015250565b7f416c726561647920737761707065640000000000000000000000000000000000600082015250565b7f4e6f742065787069726564207965740000000000000000000000000000000000600082015250565b7f43616e6e6f742073657420746f20300000000000000000000000000000000000600082015250565b7f53746172742074696d652073686f756c64206265206561726c6965722074686160008201527f6e20656e642074696d652e000000000000000000000000000000000000000000602082015250565b7f4e6f6e65206f66207468697320746f6b656e206c656674000000000000000000600082015250565b7f57726f6e672050617373776f7264000000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656c696769626c65207768656e20756e6c6f636b5f74696d6520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f7574206f662053746f636b0000000000000000000000000000000000000000600082015250565b7f496e737566666369656e7420616c6c6f77616e63650000000000000000000000600082015250565b7f4e6f20656e6f75676820616c6c6f77616e63652e000000000000000000000000600082015250565b7f546f6f204c617465000000000000000000000000000000000000000000000000600082015250565b7f53697a65206f6620726174696f73203d2032202a2073697a65206f662065786360008201527f68616e67655f6164647273000000000000000000000000000000000000000000602082015250565b7f4e6f7420612076616c6964204552433230000000000000000000000000000000600082015250565b7f506f6f6c2043726561746f72204f6e6c79000000000000000000000000000000600082015250565b7f457870697265642e000000000000000000000000000000000000000000000000600082015250565b7f56616c7565206f7574206f662072616e676520424f5800000000000000000000600082015250565b7f4e6f7420737461727465642e0000000000000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4c696d6974206e6565647320746f206265206c657373207468616e206f72206560008201527f7175616c20746f2074686520746f74616c20737570706c790000000000000000602082015250565b7f4f6e6c792074686520706f6f6c2063726561746f722063616e2077697468647260008201527f61772e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20656e6f7567682065746865722e00000000000000000000000000000000600082015250565b7f4e6f74205175616c696669656400000000000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f56616c69646174696f6e204661696c6564000000000000000000000000000000600082015250565b7f456e642074696d652073686f756c64206265206561726c696572207468616e2060008201527f756e6c6f636b2074696d65000000000000000000000000000000000000000000602082015250565b61574481614d62565b811461574f57600080fd5b50565b61575b81614d74565b811461576657600080fd5b50565b61577281614d80565b811461577d57600080fd5b50565b61578981614d8a565b811461579457600080fd5b50565b6157a081614dee565b81146157ab57600080fd5b5056fea2646970667358221220abec04e7d9691f60de44d91ac9eed4f21450b1a3ae2e6436074a0545fd556a5064736f6c634300080100335072696e6365205068696c69702c20517565656e20456c697a616265746820494927732068757362616e642c20686173206469656420616765642039392c20202020204275636b696e6768616d2050616c6163652068617320616e6e6f756e6365642e20412073746174656d656e7420697373756564206279207468652070616c616365206a757374206166746572206d69646461792073706f6b65206f66207468652020202020517565656e2773206465657020736f72726f7720666f6c6c6f77696e67206869732064656174682061742057696e64736f7220436173746c65206f6e20467269646179206d6f726e696e672e205468652044756b65206f66204564696e627572
Deployed Bytecode
0x60806040526004361061007b5760003560e01c8063c6d898341161004e578063c6d8983414610141578063cc0cab4c14610171578063ec0e3d9a1461019a578063ef65dc7e146101c35761007b565b8063040cf020146100805780636bfdaece146100a9578063b391c508146100ed578063bf5c292014610116575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a2919061398d565b6101df565b005b3480156100b557600080fd5b506100d060048036038101906100cb91906138ed565b6105ff565b6040516100e49897969594939291906143d9565b60405180910390f35b3480156100f957600080fd5b50610114600480360381019061010f9190613883565b61096d565b005b34801561012257600080fd5b5061012b610c08565b6040516101389190614335565b60405180910390f35b61015b60048036038101906101569190613916565b610c2e565b60405161016891906149be565b60405180910390f35b34801561017d57600080fd5b50610198600480360381019061019391906138ed565b6118c4565b005b3480156101a657600080fd5b506101c160048036038101906101bc919061398d565b6120a1565b005b6101dd60048036038101906101d891906139c9565b61227c565b005b60006002600084815260200190815260200160002090508060020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027f906148fe565b60405180910390fd5b60008160050183815481106102c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000811161034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906146fe565b60405180910390fd5b60008060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166103aa846000015460e4601c612e02565b6103b49190614c31565b905060006103c9846001015460006080612e02565b905042821115806103da5750600081145b610419576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104109061469e565b60405180910390fd5b6000846004018681548110610457577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146104ea576104e581303387612e62565b610532565b3373ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015610530573d6000803e3d6000fd5b505b6000856005018781548110610570577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507fab5315d16ef405a1f4e8c34017af486f59f27097e003d2a1981ae682c2f367318782866040516105ee939291906144c6565b60405180910390a150505050505050565b606060008060008060008060606000600260008b8152602001908152602001600020905080600401610638826001015460006080612e02565b600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610692846000015460c8601c612e02565b61069c9190614c31565b4211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166106f8856000015460e4601c612e02565b6107029190614c31565b4211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168560020160009054906101000a900465ffffffffffff1665ffffffffffff166107589190614bdf565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff164211600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168660020160009054906101000a900465ffffffffffff1665ffffffffffff166107cc9190614bdf565b8660070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054876005018780548060200260200160405190810160405280929190818152602001828054801561089357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610849575b50505050509750827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692508080548060200260200160405190810160405280929190818152602001828054801561094a57602002820191906000526020600020906000905b82829054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019060100190602082600f010492830192600103820291508084116108f55790505b505050505090509850985098509850985098509850985050919395975091939597565b600080600090505b8251811015610c03576000600260008584815181106109bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020905060008160020160009054906101000a900465ffffffffffff1665ffffffffffff161415610a025750610bf0565b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168260020160009054906101000a900465ffffffffffff1665ffffffffffff16610a579190614bdf565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161115610a815750610bf0565b8060070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506000831415610ad45750610bf0565b60008160070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b4b8160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303386612e62565b7f0b8bdb11ddec1f8dd879bd98afac7c33c30ce590fcbc26ed559df98f9a381119848381518110610ba5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101513342868560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051610be6959493929190614549565b60405180910390a1505b8080610bfb90614ec1565b915050610975565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060026000888152602001908152602001600020905060006040518060400160405280836000015481526020018360010154815250905060011515610c7c8260000151600060a0612e02565b73ffffffffffffffffffffffffffffffffffffffff16637938037233600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610cf2866000015160c8601c612e02565b610cfc9190614c31565b6040518363ffffffff1660e01b8152600401610d199291906143b0565b602060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b91906138c4565b151514610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da49061493e565b60405180910390fd5b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610e08836000015160c8601c612e02565b610e129190614c31565b10610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061489e565b60405180910390fd5b42600060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610ead836000015160e4601c612e02565b610eb79190614c31565b11610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee9061485e565b60405180910390fd5b610f08816000015160a06028612e02565b33604051602001610f1a929190614309565b604051602081830303815290604052805190602001208714610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f689061471e565b60405180910390fd5b33604051602001610f829190614289565b604051602081830303815290604052805190602001208614610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd09061497e565b60405180910390fd5b6000610fec826020015160006080612e02565b905060008111611031576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110289061477e565b60405180910390fd5b600083600401878154811061106f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000846006016002896110af9190614cb8565b815481106110e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600085600601600160028b6111419190614cb8565b61114b9190614c31565b81548110611182577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561127757876fffffffffffffffffffffffffffffffff163414611272576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112699061491e565b60405180910390fd5b61135d565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016112b4929190614350565b60206040518083038186803b1580156112cc57600080fd5b505afa1580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190613b01565b9050886fffffffffffffffffffffffffffffffff1681101561135b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611352906147be565b60405180910390fd5b505b600061138461137e8a6fffffffffffffffffffffffffffffffff1684612f5e565b84612f74565b9050600081116113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c0906145de565b60405180910390fd5b60006113db8760200151608080612e02565b905080821115611402578091506113fb6113f58286612f5e565b84612f74565b99506114df565b858211156114de5785915061142061141a8786612f5e565b84612f74565b9950600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114dd573373ffffffffffffffffffffffffffffffffffffffff166108fc8b6fffffffffffffffffffffffffffffffff16346114b09190614d12565b9081150290604051600060405180830381858888f193505050501580156114db573d6000803e3d6000fd5b505b5b5b808211156114ec57600080fd5b611587886005018c8154811061152b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168b6fffffffffffffffffffffffffffffffff16612f8a565b886005018c815481106115c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060008860070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611692576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116899061467e565b60405180910390fd5b6116ad8760200151600060806116a88a87612fa0565b612fb6565b8860010181905550818860070160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146117905761178f33308c6fffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16612fd1909392919063ffffffff16565b5b7fa6a9350e3cb78ab6117ff3f716716cb2a1c40e92008df3c4f60e976ee6d56edc8e33878b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168e876040516117ed96959493929190614465565b60405180910390a160008860020160009054906101000a900465ffffffffffff1665ffffffffffff1614156118b05761184c8860030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303385612e62565b7f0b8bdb11ddec1f8dd879bd98afac7c33c30ce590fcbc26ed559df98f9a3811198e3342858c60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516118a7959493929190614549565b60405180910390a15b819850505050505050505095945050505050565b60006002600083815260200190815260200160002090508060020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461196d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611964906145fe565b60405180910390fd5b60008060049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166119c8836000015460e4601c612e02565b6119d29190614c31565b905060006119e7836001015460006080612e02565b905042821115806119f85750600081145b611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e9061469e565b60405180910390fd5b60008114611a7057611a6f8360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303384612e62565b5b60005b8360040180549050811015611d96576000846005018281548110611ac0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff161115611d8357600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846004018281548110611b7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cbb57611cb6846004018281548110611c04577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163033876005018581548110611c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16612e62565b611d82565b3373ffffffffffffffffffffffffffffffffffffffff166108fc856005018381548110611d11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010029054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169081150290604051600060405180830381858888f19350505050158015611d80573d6000803e3d6000fd5b505b5b8080611d8e90614ec1565b915050611a73565b507f01a1fd9d8a4231d7bd8926ce16b753ba03e0310e0a776f13eba8e0c3cba7ea89848460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168386600501604051611df394939291906144fd565b60405180910390a1600083600001819055506000836001018190555060005b836004018054905081101561209a57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018281548110611e80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000846005018281548110611f06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600084600601600283611f649190614cb8565b81548110611f9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506000846006016001600284611ffb9190614cb8565b6120059190614c31565b8154811061203c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550808061209290614ec1565b915050611e12565b5050505050565b60006002600084815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160020160069054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461214a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121419061483e565b60405180910390fd5b8060020160009054906101000a900465ffffffffffff1665ffffffffffff1642106121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a1906147de565b60405180910390fd5b60008160020160009054906101000a900465ffffffffffff1665ffffffffffff16141561220c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122039061475e565b60405180910390fd5b6000821415612250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612247906146be565b60405180910390fd5b818160020160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550505050565b60008081819054906101000a900463ffffffff168092919061229d90614f0a565b91906101000a81548163ffffffff021916908363ffffffff16021790555050888a106122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906146de565b60405180910390fd5b8489108061230c5750600085145b61234b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123429061499e565b60405180910390fd5b8282111561238e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612385906148de565b60405180910390fd5b70010000000000000000000000000000000083106123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d89061463e565b60405180910390fd5b828473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161241d929190614350565b60206040518083038186803b15801561243557600080fd5b505afa158015612449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246d9190613b01565b10156124ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a59061479e565b60405180910390fd5b60008751116124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e99061461e565b60405180910390fd5b865160026125009190614cb8565b865114612542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612539906147fe565b60405180910390fd5b6000334260008054906101000a900463ffffffff1660035460405160200161256d94939291906142a4565b60405160208183030381529060405280519060200120905060006002600083815260200190815260200160002090506125a8838e8e8e61305a565b81600001819055506125ba85856130ce565b8160010181905550868160020160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550338160020160066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088816004019080519060200190612644929190613460565b50858160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b89518110156128a657600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a8281518110612706577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161461282a5760008a8281518110612764577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127b157600080fd5b505afa1580156127c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e99190613b01565b11612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061481e565b60405180910390fd5b5b81600501600090806001815401808255809150506001900390600052602060002090600291828204019190066010029091909190916101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550808061289e90614ec1565b91505061268b565b5060005b8851811015612d6b57600061296f8a83815181106128f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b6001856129199190614c31565b81518110612950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff16612f74565b90506000612a2d8b6001856129849190614c31565b815181106129bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168c8581518110612a0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff16612f74565b905060018b8481518110612a6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff161415612af9578a600184612a989190614c31565b81518110612acf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168114612af457600080fd5b612d55565b60018b600185612b099190614c31565b81518110612b40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff161415612bc3578a8381518110612b99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168214612bbe57600080fd5b612d54565b8a8381518110612bfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b600185612c249190614c31565b81518110612c5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff1683612c809190614cb8565b1415612c8b57600080fd5b8a600184612c999190614c31565b81518110612cd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff168b8481518110612d23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516fffffffffffffffffffffffffffffffff1682612d489190614cb8565b1415612d5357600080fd5b5b5b5050600281612d649190614c31565b90506128aa565b5087816006019080519060200190612d849291906134ea565b50612db23330878973ffffffffffffffffffffffffffffffffffffffff16612fd1909392919063ffffffff16565b7f67851705247ee2eaa9bf5ce64c064ee80704743e80b401abb46b36318f7be5cf858333428a8f604051612deb969594939291906149d9565b60405180910390a150505050505050505050505050565b6000612e1061010085613100565b612e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e46906145be565b60405180910390fd5b83831c600180841b031690509392505050565b808473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612e9c9190614335565b60206040518083038186803b158015612eb457600080fd5b505afa158015612ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eec9190613b01565b1015612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f249061465e565b60405180910390fd5b612f5882828673ffffffffffffffffffffffffffffffffffffffff166131169092919063ffffffff16565b50505050565b60008183612f6c9190614cb8565b905092915050565b60008183612f829190614c87565b905092915050565b60008183612f989190614c31565b905092915050565b60008183612fae9190614d12565b905092915050565b600081841b600180851b03851b198616179050949350505050565b613054846323b872dd60e01b858585604051602401612ff293929190614379565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061319c565b50505050565b60008060009050613084600060a08873ffffffffffffffffffffffffffffffffffffffff16613263565b8117905061309c60a0602860d88860001c901c613263565b811790506130ad60c8601c86613263565b811790506130be60e4601c85613263565b8117905080915050949350505050565b600080600090506130e26000608086613263565b811790506130f260808085613263565b811790508091505092915050565b6000816001841b11610100841417905092915050565b6131978363a9059cbb60e01b84846040516024016131359291906143b0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061319c565b505050565b60006131fe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132ba9092919063ffffffff16565b905060008151111561325e578080602001905181019061321e91906138c4565b61325d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132549061495e565b60405180910390fd5b5b505050565b600061326f8383613100565b6132ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a59061487e565b60405180910390fd5b81841b90509392505050565b60606132c984846000856132d2565b90509392505050565b606082471015613317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330e9061473e565b60405180910390fd5b613320856133e6565b61335f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613356906148be565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161338891906142f2565b60006040518083038185875af1925050503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b50915091506133da8282866133f9565b92505050949350505050565b600080823b905060008111915050919050565b6060831561340957829050613459565b60008351111561341c5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613450919061459c565b60405180910390fd5b9392505050565b8280548282559060005260206000209081019282156134d9579160200282015b828111156134d85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613480565b5b5090506134e691906135be565b5090565b828054828255906000526020600020906001016002900481019282156135ad5791602002820160005b8382111561356f57835183826101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509260200192601001602081600f01049283019260010302613513565b80156135ab5782816101000a8154906fffffffffffffffffffffffffffffffff0219169055601001602081600f0104928301926001030261356f565b505b5090506135ba91906135be565b5090565b5b808211156135d75760008160009055506001016135bf565b5090565b60006135ee6135e984614a66565b614a41565b9050808382526020820190508285602086028201111561360d57600080fd5b60005b8581101561363d5781613623888261375d565b845260208401935060208301925050600181019050613610565b5050509392505050565b600061365a61365584614a92565b614a41565b9050808382526020820190508285602086028201111561367957600080fd5b60005b858110156136a9578161368f8882613805565b84526020840193506020830192505060018101905061367c565b5050509392505050565b60006136c66136c184614abe565b614a41565b905080838252602082019050828560208602820111156136e557600080fd5b60005b8581101561371557816136fb8882613844565b8452602084019350602083019250506001810190506136e8565b5050509392505050565b600061373261372d84614aea565b614a41565b90508281526020810184848401111561374a57600080fd5b613755848285614e1a565b509392505050565b60008135905061376c8161573b565b92915050565b600082601f83011261378357600080fd5b81356137938482602086016135db565b91505092915050565b600082601f8301126137ad57600080fd5b81356137bd848260208601613647565b91505092915050565b600082601f8301126137d757600080fd5b81356137e78482602086016136b3565b91505092915050565b6000815190506137ff81615752565b92915050565b60008135905061381481615769565b92915050565b600082601f83011261382b57600080fd5b813561383b84826020860161371f565b91505092915050565b60008135905061385381615780565b92915050565b60008135905061386881615797565b92915050565b60008151905061387d81615797565b92915050565b60006020828403121561389557600080fd5b600082013567ffffffffffffffff8111156138af57600080fd5b6138bb8482850161379c565b91505092915050565b6000602082840312156138d657600080fd5b60006138e4848285016137f0565b91505092915050565b6000602082840312156138ff57600080fd5b600061390d84828501613805565b91505092915050565b600080600080600060a0868803121561392e57600080fd5b600061393c88828901613805565b955050602061394d88828901613805565b945050604061395e88828901613805565b935050606061396f88828901613859565b925050608061398088828901613844565b9150509295509295909350565b600080604083850312156139a057600080fd5b60006139ae85828601613805565b92505060206139bf85828601613859565b9150509250929050565b60008060008060008060008060008060006101608c8e0312156139eb57600080fd5b60006139f98e828f01613805565b9b50506020613a0a8e828f01613859565b9a50506040613a1b8e828f01613859565b99505060608c013567ffffffffffffffff811115613a3857600080fd5b613a448e828f0161381a565b98505060808c013567ffffffffffffffff811115613a6157600080fd5b613a6d8e828f01613772565b97505060a08c013567ffffffffffffffff811115613a8a57600080fd5b613a968e828f016137c6565b96505060c0613aa78e828f01613859565b95505060e0613ab88e828f0161375d565b945050610100613aca8e828f01613859565b935050610120613adc8e828f01613859565b925050610140613aee8e828f0161375d565b9150509295989b509295989b9093969950565b600060208284031215613b1357600080fd5b6000613b218482850161386e565b91505092915050565b6000613b368383613b5a565b60208301905092915050565b6000613b4e838361422e565b60208301905092915050565b613b6381614d62565b82525050565b613b7281614d62565b82525050565b613b89613b8482614d62565b614f37565b82525050565b6000613b9a82614b50565b613ba48185614ba1565b9350613baf83614b1b565b8060005b83811015613be0578151613bc78882613b2a565b9750613bd283614b87565b925050600181019050613bb3565b5085935050505092915050565b6000613bf882614b5b565b613c028185614bb2565b9350613c0d83614b2b565b8060005b83811015613c3e578151613c258882613b42565b9750613c3083614b94565b925050600181019050613c11565b5085935050505092915050565b6000613c5682614b66565b613c608185614bb2565b935083613c6c84614b3b565b6000600115613cc9575b83600160020382011015613cc8578154613c9888613c9383614e5c565b61422e565b602088019750613cb088613cab83614e76565b61422e565b60208801975060018301925050600281019050613c76565b5b600115613d2257815484821015613cf957613cec88613ce783614e5c565b61422e565b6020880197506001820191505b84821015613d2057613d1388613d0e83614e76565b61422e565b6020880197506001820191505b505b8694505050505092915050565b613d3881614d74565b82525050565b613d4781614d80565b82525050565b613d5e613d5982614d80565b614f49565b82525050565b6000613d6f82614b71565b613d798185614bc3565b9350613d89818560208601614e29565b80840191505092915050565b6000613da082614b7c565b613daa8185614bce565b9350613dba818560208601614e29565b613dc38161500e565b840191505092915050565b6000613ddb601883614bce565b9150613de682615053565b602082019050919050565b6000613dfe602283614bce565b9150613e098261507c565b604082019050919050565b6000613e21602383614bce565b9150613e2c826150cb565b604082019050919050565b6000613e44602783614bce565b9150613e4f8261511a565b604082019050919050565b6000613e67603583614bce565b9150613e7282615169565b604082019050919050565b6000613e8a601283614bce565b9150613e95826151b8565b602082019050919050565b6000613ead600f83614bce565b9150613eb8826151e1565b602082019050919050565b6000613ed0600f83614bce565b9150613edb8261520a565b602082019050919050565b6000613ef3600f83614bce565b9150613efe82615233565b602082019050919050565b6000613f16602b83614bce565b9150613f218261525c565b604082019050919050565b6000613f39601783614bce565b9150613f44826152ab565b602082019050919050565b6000613f5c600e83614bce565b9150613f67826152d4565b602082019050919050565b6000613f7f602683614bce565b9150613f8a826152fd565b604082019050919050565b6000613fa2602283614bce565b9150613fad8261534c565b604082019050919050565b6000613fc5600c83614bce565b9150613fd08261539b565b602082019050919050565b6000613fe8601583614bce565b9150613ff3826153c4565b602082019050919050565b600061400b601483614bce565b9150614016826153ed565b602082019050919050565b600061402e600883614bce565b915061403982615416565b602082019050919050565b6000614051602b83614bce565b915061405c8261543f565b604082019050919050565b6000614074601183614bce565b915061407f8261548e565b602082019050919050565b6000614097601183614bce565b91506140a2826154b7565b602082019050919050565b60006140ba600883614bce565b91506140c5826154e0565b602082019050919050565b60006140dd601683614bce565b91506140e882615509565b602082019050919050565b6000614100600c83614bce565b915061410b82615532565b602082019050919050565b6000614123601d83614bce565b915061412e8261555b565b602082019050919050565b6000614146603883614bce565b915061415182615584565b604082019050919050565b6000614169602383614bce565b9150614174826155d3565b604082019050919050565b600061418c601083614bce565b915061419782615622565b602082019050919050565b60006141af600d83614bce565b91506141ba8261564b565b602082019050919050565b60006141d2602a83614bce565b91506141dd82615674565b604082019050919050565b60006141f5601183614bce565b9150614200826156c3565b602082019050919050565b6000614218602b83614bce565b9150614223826156ec565b604082019050919050565b61423781614d8a565b82525050565b61424681614e08565b82525050565b61425581614dee565b82525050565b61426c61426782614dee565b614f65565b82525050565b61428361427e82614df8565b614f6f565b82525050565b60006142958284613b78565b60148201915081905092915050565b60006142b08287613b78565b6014820191506142c0828661425b565b6020820191506142d08285614272565b6004820191506142e08284613d4d565b60208201915081905095945050505050565b60006142fe8284613d64565b915081905092915050565b6000614315828561425b565b6020820191506143258284613b78565b6014820191508190509392505050565b600060208201905061434a6000830184613b69565b92915050565b60006040820190506143656000830185613b69565b6143726020830184613b69565b9392505050565b600060608201905061438e6000830186613b69565b61439b6020830185613b69565b6143a8604083018461424c565b949350505050565b60006040820190506143c56000830185613b69565b6143d2602083018461424c565b9392505050565b60006101008201905081810360008301526143f4818b613b8f565b9050614403602083018a61424c565b6144106040830189613d2f565b61441d6060830188613d2f565b61442a6080830187613d2f565b61443760a083018661424c565b61444460c083018561424c565b81810360e08301526144568184613bed565b90509998505050505050505050565b600060c08201905061447a6000830189613d3e565b6144876020830188613b69565b6144946040830187613b69565b6144a16060830186613b69565b6144ae608083018561423d565b6144bb60a083018461424c565b979650505050505050565b60006060820190506144db6000830186613d3e565b6144e86020830185613b69565b6144f5604083018461424c565b949350505050565b60006080820190506145126000830187613d3e565b61451f6020830186613b69565b61452c604083018561424c565b818103606083015261453e8184613c4b565b905095945050505050565b600060a08201905061455e6000830188613d3e565b61456b6020830187613b69565b614578604083018661424c565b614585606083018561424c565b6145926080830184613b69565b9695505050505050565b600060208201905081810360008301526145b68184613d95565b905092915050565b600060208201905081810360008301526145d781613dce565b9050919050565b600060208201905081810360008301526145f781613df1565b9050919050565b6000602082019050818103600083015261461781613e14565b9050919050565b6000602082019050818103600083015261463781613e37565b9050919050565b6000602082019050818103600083015261465781613e5a565b9050919050565b6000602082019050818103600083015261467781613e7d565b9050919050565b6000602082019050818103600083015261469781613ea0565b9050919050565b600060208201905081810360008301526146b781613ec3565b9050919050565b600060208201905081810360008301526146d781613ee6565b9050919050565b600060208201905081810360008301526146f781613f09565b9050919050565b6000602082019050818103600083015261471781613f2c565b9050919050565b6000602082019050818103600083015261473781613f4f565b9050919050565b6000602082019050818103600083015261475781613f72565b9050919050565b6000602082019050818103600083015261477781613f95565b9050919050565b6000602082019050818103600083015261479781613fb8565b9050919050565b600060208201905081810360008301526147b781613fdb565b9050919050565b600060208201905081810360008301526147d781613ffe565b9050919050565b600060208201905081810360008301526147f781614021565b9050919050565b6000602082019050818103600083015261481781614044565b9050919050565b6000602082019050818103600083015261483781614067565b9050919050565b600060208201905081810360008301526148578161408a565b9050919050565b60006020820190508181036000830152614877816140ad565b9050919050565b60006020820190508181036000830152614897816140d0565b9050919050565b600060208201905081810360008301526148b7816140f3565b9050919050565b600060208201905081810360008301526148d781614116565b9050919050565b600060208201905081810360008301526148f781614139565b9050919050565b600060208201905081810360008301526149178161415c565b9050919050565b600060208201905081810360008301526149378161417f565b9050919050565b60006020820190508181036000830152614957816141a2565b9050919050565b60006020820190508181036000830152614977816141c5565b9050919050565b60006020820190508181036000830152614997816141e8565b9050919050565b600060208201905081810360008301526149b78161420b565b9050919050565b60006020820190506149d3600083018461424c565b92915050565b600060c0820190506149ee600083018961424c565b6149fb6020830188613d3e565b614a086040830187613b69565b614a15606083018661424c565b614a226080830185613b69565b81810360a0830152614a348184613d95565b9050979650505050505050565b6000614a4b614a5c565b9050614a578282614e90565b919050565b6000604051905090565b600067ffffffffffffffff821115614a8157614a80614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aad57614aac614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ad957614ad8614fdf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b0557614b04614fdf565b5b614b0e8261500e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614bea82614dc6565b9150614bf583614dc6565b9250827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c2657614c25614f81565b5b828201905092915050565b6000614c3c82614dee565b9150614c4783614dee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7c57614c7b614f81565b5b828201905092915050565b6000614c9282614dee565b9150614c9d83614dee565b925082614cad57614cac614fb0565b5b828204905092915050565b6000614cc382614dee565b9150614cce83614dee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0757614d06614f81565b5b828202905092915050565b6000614d1d82614dee565b9150614d2883614dee565b925082821015614d3b57614d3a614f81565b5b828203905092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000614d6d82614da6565b9050919050565b60008115159050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b6000614e1382614d8a565b9050919050565b82818337600083830152505050565b60005b83811015614e47578082015181840152602081019050614e2c565b83811115614e56576000848401525b50505050565b6000614e6f614e6a83615039565b614d46565b9050919050565b6000614e89614e8483615046565b614d46565b9050919050565b614e998261500e565b810181811067ffffffffffffffff82111715614eb857614eb7614fdf565b5b80604052505050565b6000614ecc82614dee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eff57614efe614f81565b5b600182019050919050565b6000614f1582614df8565b915063ffffffff821415614f2c57614f2b614f81565b5b600182019050919050565b6000614f4282614f53565b9050919050565b6000819050919050565b6000614f5e8261502c565b9050919050565b6000819050919050565b6000614f7a8261501f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160e01b9050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160801c9050919050565b7f56616c7565206f7574206f662072616e676520554e424f580000000000000000600082015250565b7f426574746572206e6f742064726177207761746572207769746820612073696560008201527f7665000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c792074686520706f6f6c2063726561746f722063616e2064657374727560008201527f63742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f45786368616e676520746f6b656e20616464726573736573206e65656420746f60008201527f2062652073657400000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f7265207468616e20325e31323820746f6b656e7328696e636c756960008201527f646e6720646563696d616c732920616c6c6f7765640000000000000000000000602082015250565b7f42616c616e6365206e6f7420656e6f7567680000000000000000000000000000600082015250565b7f416c726561647920737761707065640000000000000000000000000000000000600082015250565b7f4e6f742065787069726564207965740000000000000000000000000000000000600082015250565b7f43616e6e6f742073657420746f20300000000000000000000000000000000000600082015250565b7f53746172742074696d652073686f756c64206265206561726c6965722074686160008201527f6e20656e642074696d652e000000000000000000000000000000000000000000602082015250565b7f4e6f6e65206f66207468697320746f6b656e206c656674000000000000000000600082015250565b7f57726f6e672050617373776f7264000000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656c696769626c65207768656e20756e6c6f636b5f74696d6520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f7574206f662053746f636b0000000000000000000000000000000000000000600082015250565b7f496e737566666369656e7420616c6c6f77616e63650000000000000000000000600082015250565b7f4e6f20656e6f75676820616c6c6f77616e63652e000000000000000000000000600082015250565b7f546f6f204c617465000000000000000000000000000000000000000000000000600082015250565b7f53697a65206f6620726174696f73203d2032202a2073697a65206f662065786360008201527f68616e67655f6164647273000000000000000000000000000000000000000000602082015250565b7f4e6f7420612076616c6964204552433230000000000000000000000000000000600082015250565b7f506f6f6c2043726561746f72204f6e6c79000000000000000000000000000000600082015250565b7f457870697265642e000000000000000000000000000000000000000000000000600082015250565b7f56616c7565206f7574206f662072616e676520424f5800000000000000000000600082015250565b7f4e6f7420737461727465642e0000000000000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4c696d6974206e6565647320746f206265206c657373207468616e206f72206560008201527f7175616c20746f2074686520746f74616c20737570706c790000000000000000602082015250565b7f4f6e6c792074686520706f6f6c2063726561746f722063616e2077697468647260008201527f61772e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20656e6f7567682065746865722e00000000000000000000000000000000600082015250565b7f4e6f74205175616c696669656400000000000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f56616c69646174696f6e204661696c6564000000000000000000000000000000600082015250565b7f456e642074696d652073686f756c64206265206561726c696572207468616e2060008201527f756e6c6f636b2074696d65000000000000000000000000000000000000000000602082015250565b61574481614d62565b811461574f57600080fd5b50565b61575b81614d74565b811461576657600080fd5b50565b61577281614d80565b811461577d57600080fd5b50565b61578981614d8a565b811461579457600080fd5b50565b6157a081614dee565b81146157ab57600080fd5b5056fea2646970667358221220abec04e7d9691f60de44d91ac9eed4f21450b1a3ae2e6436074a0545fd556a5064736f6c63430008010033
Deployed Bytecode Sourcemap
23294:24542:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42169:1063;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37100:1150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;38258:747;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25927:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31928:4663;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40108:1702;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39013:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27877:3312;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42169:1063;42234:17;42254:10;:14;42265:2;42254:14;;;;;;;;;;;42234:34;;42301:4;:12;;;;;;;;;;;;42287:26;;:10;:26;;;42279:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42366:24;42393:4;:21;;42415:6;42393:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42366:56;;;;42460:1;42441:16;:20;42433:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42500:18;42552:9;;;;;;;;;;;42521:40;;:28;42527:4;:12;;;42541:3;42546:2;42521:5;:28::i;:::-;:40;;;;:::i;:::-;42500:61;;42572:24;42599:27;42605:4;:12;;;42619:1;42622:3;42599:5;:27::i;:::-;42572:54;;42714:15;42700:10;:29;;:54;;;;42753:1;42733:16;:21;42700:54;42692:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;42785:21;42809:4;:19;;42829:6;42809:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42785:51;;42888:15;;;;;;;;;;;42871:32;;:13;:32;;;42867:216;;42918:74;42933:13;42956:4;42963:10;42975:16;42918:14;:74::i;:::-;42867:216;;;43045:10;43037:28;;:46;43066:16;43037:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42867:216;43155:1;43123:4;:21;;43145:6;43123:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;43172:52;43188:2;43192:13;43207:16;43172:52;;;;;;;;:::i;:::-;;;;;;;;42169:1063;;;;;;;:::o;37100:1150::-;37174:31;37207:17;37245:12;37259;37273:13;37288:19;37327:15;37344:33;37390:17;37410:10;:14;37421:2;37410:14;;;;;;;;;;;37390:34;;37457:4;:19;;37577:27;37583:4;:12;;;37597:1;37600:3;37577:5;:27::i;:::-;37720:9;;;;;;;;;;;37689:40;;:28;37695:4;:12;;;37709:3;37714:2;37689:5;:28::i;:::-;:40;;;;:::i;:::-;37671:15;:58;37812:9;;;;;;;;;;;37781:40;;:28;37787:4;:12;;;37801:3;37806:2;37781:5;:28::i;:::-;:40;;;;:::i;:::-;37763:15;:58;37892:9;;;;;;;;;;;37873:4;:16;;;;;;;;;;;;:28;;;;;;:::i;:::-;37855:46;;:15;:46;37967:9;;;;;;;;;;;37948:4;:16;;;;;;;;;;;;:28;;;;;;:::i;:::-;38044:4;:16;;:28;38061:10;38044:28;;;;;;;;;;;;;;;;38144:4;:21;;37435:807;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37100:1150;;;;;;;;;:::o;38258:747::-;38317:22;38355:9;38367:1;38355:13;;38350:648;38374:7;:14;38370:1;:18;38350:648;;;38410:17;38430:10;:22;38441:7;38449:1;38441:10;;;;;;;;;;;;;;;;;;;;;;38430:22;;;;;;;;;;;38410:42;;38491:1;38471:4;:16;;;;;;;;;;;;:21;;;38467:52;;;38511:8;;;38467:52;38569:15;38557:9;;;;;;;;;;;38538:4;:16;;;;;;;;;;;;:28;;;;;;:::i;:::-;:46;;;38534:77;;;38603:8;;;38534:77;38643:4;:16;;:28;38660:10;38643:28;;;;;;;;;;;;;;;;38626:45;;38708:1;38690:14;:19;38686:50;;;38728:8;;;38686:50;38782:1;38751:4;:16;;:28;38768:10;38751:28;;;;;;;;;;;;;;;:32;;;;38798:77;38813:4;:18;;;;;;;;;;;;38841:4;38848:10;38860:14;38798;:77::i;:::-;38897:89;38910:7;38918:1;38910:10;;;;;;;;;;;;;;;;;;;;;;38922;38934:15;38951:14;38967:4;:18;;;;;;;;;;;;38897:89;;;;;;;;;;:::i;:::-;;;;;;;;38350:648;;38390:3;;;;;:::i;:::-;;;;38350:648;;;;38258:747;;:::o;25927:31::-;;;;;;;;;;;;;:::o;31928:4663::-;32094:15;32124:17;32144:10;:14;32155:2;32144:14;;;;;;;;;;;32124:34;;32169:20;32192:34;;;;;;;;32199:4;:12;;;32192:34;;;;32213:4;:12;;;32192:34;;;32169:57;;32467:4;32260:211;;32321:29;32327:6;:14;;;32343:1;32346:3;32321:5;:29::i;:::-;32260:124;;;32385:10;32438:9;;;;;;;;;;;32405:42;;:30;32411:6;:14;;;32427:3;32432:2;32405:5;:30::i;:::-;:42;;;;:::i;:::-;32260:203;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:211;;;32237:276;;;;;;;;;;;;:::i;:::-;;;;;;;;;32578:15;32566:9;;;;;;;;;;;32533:42;;:30;32539:6;:14;;;32555:3;32560:2;32533:5;:30::i;:::-;:42;;;;:::i;:::-;:60;32524:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;32675:15;32663:9;;;;;;;;;;;32630:42;;:30;32636:6;:14;;;32652:3;32657:2;32630:5;:30::i;:::-;:42;;;;:::i;:::-;:60;32621:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;32876:30;32882:6;:14;;;32898:3;32903:2;32876:5;:30::i;:::-;32908:10;32859:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32849:71;;;;;;32833:12;:87;32824:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;33136:10;33119:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;33109:39;;;;;;33095:10;:53;33086:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;33183:20;33206:29;33212:6;:14;;;33228:1;33231:3;33206:5;:29::i;:::-;33183:52;;33310:1;33295:12;:16;33286:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;33341:21;33365:4;:19;;33385:15;33365:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33341:60;;33412:14;33429:4;:11;;33457:1;33441:15;:17;;;;:::i;:::-;33429:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33412:47;;;;33470:14;33487:4;:11;;33519:1;33515;33499:15;:17;;;;:::i;:::-;:21;;;;:::i;:::-;33487:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33470:51;;;;33619:15;;;;;;;;;;;33602:32;;:13;:32;;;33598:301;;;33672:11;33659:24;;:9;:24;33651:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;33598:301;;;33737:17;33764:13;33757:31;;;33789:10;33809:4;33757:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33737:78;;33851:11;33838:24;;:9;:24;;33830:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33598:301;;33911:22;34053:55;34066:33;34079:11;34066:33;;34092:6;34066:12;:33::i;:::-;34101:6;34053:12;:55::i;:::-;34036:72;;34182:1;34165:14;:18;34157:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34235:13;34251:31;34257:6;:14;;;34273:3;34278;34251:5;:31::i;:::-;34235:47;;34314:5;34297:14;:22;34293:688;;;34425:5;34408:22;;34467:49;34480:27;34493:5;34500:6;34480:12;:27::i;:::-;34509:6;34467:12;:49::i;:::-;34445:72;;34293:688;;;34588:12;34571:14;:29;34567:414;;;34684:12;34667:29;;34733:56;34746:34;34759:12;34773:6;34746:12;:34::i;:::-;34782:6;34733:12;:56::i;:::-;34711:79;;34882:15;;;;;;;;;;;34865:32;;:13;:32;;;34861:108;;;34924:10;34916:28;;:53;34957:11;34945:23;;:9;:23;;;;:::i;:::-;34916:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34861:108;34567:414;34293:688;35017:5;34999:14;:23;;34991:32;;;;;;35156:137;35169:4;:21;;35191:15;35169:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35156:137;;35281:11;35156:137;;:12;:137::i;:::-;35107:4;:21;;35129:15;35107:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:187;;;;;;;;;;;;;;;;;;35463:1;35431:4;:16;;:28;35448:10;35431:28;;;;;;;;;;;;;;;;:33;35422:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35578:78;35589:6;:14;;;35605:1;35608:3;35613:42;35626:12;35640:14;35613:12;:42::i;:::-;35578:10;:78::i;:::-;35563:4;:12;;:93;;;;35698:14;35667:4;:16;;:28;35684:10;35667:28;;;;;;;;;;;;;;;:45;;;;35860:15;;;;;;;;;;;35843:32;;:13;:32;;;35839:143;;35892:78;35931:10;35951:4;35958:11;35892:78;;35899:13;35892:38;;;;:78;;;;;;:::i;:::-;35839:143;36030:91;36042:2;36046:10;36058:13;36073:4;:18;;;;;;;;;;;;36093:11;36106:14;36030:91;;;;;;;;;;;:::i;:::-;;;;;;;;36330:1;36310:4;:16;;;;;;;;;;;;:21;;;36306:232;;;36348:77;36363:4;:18;;;;;;;;;;;;36391:4;36398:10;36410:14;36348;:77::i;:::-;36445:81;36458:2;36462:10;36474:15;36491:14;36507:4;:18;;;;;;;;;;;;36445:81;;;;;;;;;;:::i;:::-;;;;;;;;36306:232;36569:14;36562:21;;;;;;;;;;31928:4663;;;;;;;:::o;40108:1702::-;40157:17;40177:10;:14;40188:2;40177:14;;;;;;;;;;;40157:34;;40224:4;:12;;;;;;;;;;;;40210:26;;:10;:26;;;40202:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40289:18;40341:9;;;;;;;;;;;40310:40;;:28;40316:4;:12;;;40330:3;40335:2;40310:5;:28::i;:::-;:40;;;;:::i;:::-;40289:61;;40361:24;40388:27;40394:4;:12;;;40408:1;40411:3;40388:5;:27::i;:::-;40361:54;;40503:15;40489:10;:29;;:54;;;;40542:1;40522:16;:21;40489:54;40481:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;40636:1;40616:16;:21;40612:133;;40654:79;40669:4;:18;;;;;;;;;;;;40697:4;40704:10;40716:16;40654:14;:79::i;:::-;40612:133;40924:9;40919:460;40943:4;:19;;:26;;;;40939:1;:30;40919:460;;;41022:1;40995:4;:21;;41017:1;40995:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;40991:377;;;41100:15;;;;;;;;;;;41074:41;;:4;:19;;41094:1;41074:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;41070:282;;41138:91;41153:4;:19;;41173:1;41153:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41185:4;41192:10;41204:4;:21;;41226:1;41204:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41138:91;;:14;:91::i;:::-;41070:282;;;41306:10;41298:28;;:54;41327:4;:21;;41349:1;41327:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41298:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41070:282;40991:377;40971:3;;;;;:::i;:::-;;;;40919:460;;;;41394:80;41410:2;41414:4;:18;;;;;;;;;;;;41434:16;41452:4;:21;;41394:80;;;;;;;;;:::i;:::-;;;;;;;;41525:1;41510:4;:12;;:16;;;;41552:1;41537:4;:12;;:16;;;;41569:9;41564:239;41588:4;:19;;:26;;;;41584:1;:30;41564:239;;;41661:15;;;;;;;;;;;41636:4;:19;;41656:1;41636:22;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;41718:1;41691:4;:21;;41713:1;41691:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;41753:1;41734:4;:11;;41748:1;41746;:3;;;;:::i;:::-;41734:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;41790:1;41769:4;:11;;41785:1;41783;41781;:3;;;;:::i;:::-;:5;;;;:::i;:::-;41769:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;41616:3;;;;;:::i;:::-;;;;41564:239;;;;40108:1702;;;;:::o;39013:435::-;39088:17;39108:10;:14;39119:2;39108:14;;;;;;;;;;;39088:34;;39157:10;39141:26;;:4;:12;;;;;;;;;;;;:26;;;39133:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;39226:4;:16;;;;;;;;;;;;39208:34;;:15;:34;39200:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39294:1;39274:4;:16;;;;;;;;;;;;:21;;;;39266:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39369:1;39353:12;:17;;39345:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;39427:12;39401:4;:16;;;:39;;;;;;;;;;;;;;;;;;39013:435;;;:::o;27877:3312::-;28212:5;;:8;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;28248:4;28239:6;:13;28231:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28326:12;28319:4;:19;:40;;;;28358:1;28342:12;:17;28319:40;28311:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;28436:13;28426:6;:23;;28418:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;28545:8;28529:13;:24;28521:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;28690:13;28637:11;28630:29;;;28660:10;28680:4;28630:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;28622:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;28773:1;28748:15;:22;:26;28740:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;28859:15;:22;28855:1;:26;;;;:::i;:::-;28837:7;:14;:44;28829:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;28942:11;28983:10;28995:15;29012:5;;;;;;;;;;29019:4;;28966:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28956:69;;;;;;28942:83;;29036:17;29056:10;:15;29067:3;29056:15;;;;;;;;;;;29036:35;;29097:42;29103:14;29119:5;29126:6;29134:4;29097:5;:42::i;:::-;29082:4;:12;;:57;;;;29204:28;29210:13;29225:6;29204:5;:28::i;:::-;29189:4;:12;;:43;;;;29322:12;29296:4;:16;;;:39;;;;;;;;;;;;;;;;;;29426:10;29411:4;:12;;;:25;;;;;;;;;;;;;;;;;;29535:15;29513:4;:19;;:37;;;;;;;;;;;;:::i;:::-;;29636:11;29615:4;:18;;;:32;;;;;;;;;;;;;;;;;;29780:9;29775:346;29799:15;:22;29795:1;:26;29775:346;;;29869:15;;;;;;;;;;;29847:37;;:15;29863:1;29847:18;;;;;;;;;;;;;;;;;;;;;;:37;;;29843:222;;30026:1;29990:15;30006:1;29990:18;;;;;;;;;;;;;;;;;;;;;;29983:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;29975:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29843:222;30079:4;:21;;30106:1;30079:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29823:3;;;;;:::i;:::-;;;;29775:346;;;;30203:9;30198:711;30222:7;:14;30218:1;:18;30198:711;;;30260:12;30275:38;30288:7;30296:1;30288:10;;;;;;;;;;;;;;;;;;;;;;30275:38;;30300:7;30310:1;30308;:3;;;;:::i;:::-;30300:12;;;;;;;;;;;;;;;;;;;;;;30275:38;;:12;:38::i;:::-;30260:53;;30370:12;30385:38;30398:7;30408:1;30406;:3;;;;:::i;:::-;30398:12;;;;;;;;;;;;;;;;;;;;;;30385:38;;30412:7;30420:1;30412:10;;;;;;;;;;;;;;;;;;;;;;30385:38;;:12;:38::i;:::-;30370:53;;30512:1;30498:7;30506:1;30498:10;;;;;;;;;;;;;;;;;;;;;;:15;;;30494:404;;;30550:7;30560:1;30558;:3;;;;:::i;:::-;30550:12;;;;;;;;;;;;;;;;;;;;;;30542:20;;:4;:20;30534:29;;;;;;30494:404;;;30605:1;30589:7;30599:1;30597;:3;;;;:::i;:::-;30589:12;;;;;;;;;;;;;;;;;;;;;;:17;;;30585:313;;;30643:7;30651:1;30643:10;;;;;;;;;;;;;;;;;;;;;;30635:18;;:4;:18;30627:27;;;;;;30585:313;;;30810:7;30818:1;30810:10;;;;;;;;;;;;;;;;;;;;;;30787:33;;30794:7;30804:1;30802;:3;;;;:::i;:::-;30794:12;;;;;;;;;;;;;;;;;;;;;;30787:19;;:4;:19;;;;:::i;:::-;:33;;30779:42;;;;;;30869:7;30879:1;30877;:3;;;;:::i;:::-;30869:12;;;;;;;;;;;;;;;;;;;;;;30848:33;;30855:7;30863:1;30855:10;;;;;;;;;;;;;;;;;;;;;;30848:17;;:4;:17;;;;:::i;:::-;:33;;30840:42;;;;;;30585:313;30494:404;30198:711;;30242:1;30238:5;;;;;:::i;:::-;;;30198:711;;;;30933:7;30919:4;:11;;:21;;;;;;;;;;;;:::i;:::-;;31003:78;31040:10;31060:4;31067:13;31010:11;31003:36;;;;:78;;;;;;:::i;:::-;31099:82;31111:13;31126:3;31131:10;31143:15;31160:11;31173:7;31099:82;;;;;;;;;;;:::i;:::-;;;;;;;;27877:3312;;;;;;;;;;;;;:::o;45752:336::-;45835:15;45871:21;45882:3;45887:4;45871:10;:21::i;:::-;45863:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46062:4;46052:8;46048:19;46044:1;46040;46034:4;46030:12;46026:20;46022:46;46011:57;;45941:140;;;;;:::o;47494:333::-;47718:6;47674:13;47667:31;;;47699:14;47667:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;47659:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;47758:61;47793:17;47812:6;47765:13;47758:34;;;;:61;;;;;:::i;:::-;47494:333;;;;:::o;18074:98::-;18132:7;18163:1;18159;:5;;;;:::i;:::-;18152:12;;18074:98;;;;:::o;18473:::-;18531:7;18562:1;18558;:5;;;;:::i;:::-;18551:12;;18473:98;;;;:::o;17336:::-;17394:7;17425:1;17421;:5;;;;:::i;:::-;17414:12;;17336:98;;;;:::o;17717:::-;17775:7;17806:1;17802;:5;;;;:::i;:::-;17795:12;;17717:98;;;;:::o;46789:395::-;46917:13;47160:4;47150:8;47146:19;47139:1;47135;47129:4;47125:12;47121:20;47111:8;47107:35;47103:40;47097:4;47093:51;47089:77;47080:86;;46952:225;;;;;;:::o;11618:205::-;11719:96;11739:5;11769:27;;;11798:4;11804:2;11808:5;11746:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11719:19;:96::i;:::-;11618:205;;;;:::o;43717:613::-;43847:15;43875:16;43894:1;43875:20;;43918:46;43922:1;43925:3;43947:14;43931:32;;43918:3;:46::i;:::-;43906:58;;;;44020:35;44024:3;44029:2;44051:3;44041:5;44033:14;;:21;;44020:3;:35::i;:::-;44008:47;;;;44119:20;44123:3;44128:2;44132:6;44119:3;:20::i;:::-;44107:32;;;;44217:18;44221:3;44226:2;44230:4;44217:3;:18::i;:::-;44205:30;;;;44314:8;44307:15;;;43717:613;;;;;;:::o;44529:339::-;44607:15;44635:16;44654:1;44635:20;;44678:26;44682:1;44685:3;44690:13;44678:3;:26::i;:::-;44666:38;;;;44776:21;44780:3;44785;44790:6;44776:3;:21::i;:::-;44764:33;;;;44852:8;44845:15;;;44529:339;;;;:::o;46254:234::-;46324:12;46464:4;46460:1;46454:4;46450:12;46447:22;46441:3;46435:4;46432:13;46429:41;46418:52;;46359:122;;;;:::o;11433:177::-;11516:86;11536:5;11566:23;;;11591:2;11595:5;11543:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11516:19;:86::i;:::-;11433:177;;;:::o;13867:761::-;14291:23;14317:69;14345:4;14317:69;;;;;;;;;;;;;;;;;14325:5;14317:27;;;;:69;;;;;:::i;:::-;14291:95;;14421:1;14401:10;:17;:21;14397:224;;;14543:10;14532:30;;;;;;;;;;;;:::i;:::-;14524:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14397:224;13867:761;;;:::o;45165:278::-;45246:13;45280:22;45291:4;45297;45280:10;:22::i;:::-;45272:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45420:4;45410:8;45406:19;45397:28;;45349:87;;;;;:::o;6566:195::-;6669:12;6701:52;6723:6;6731:4;6737:1;6740:12;6701:21;:52::i;:::-;6694:59;;6566:195;;;;;:::o;7618:530::-;7745:12;7803:5;7778:21;:30;;7770:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7870:18;7881:6;7870:10;:18::i;:::-;7862:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7996:12;8010:23;8037:6;:11;;8057:5;8065:4;8037:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7995:75;;;;8088:52;8106:7;8115:10;8127:12;8088:17;:52::i;:::-;8081:59;;;;7618:530;;;;;;:::o;3648:422::-;3708:4;3916:12;4027:7;4015:20;4007:28;;4061:1;4054:4;:8;4047:15;;;3648:422;;;:::o;10158:742::-;10273:12;10302:7;10298:595;;;10333:10;10326:17;;;;10298:595;10467:1;10447:10;:17;:21;10443:439;;;10710:10;10704:17;10771:15;10758:10;10754:2;10750:19;10743:44;10658:148;10853:12;10846:20;;;;;;;;;;;:::i;:::-;;;;;;;;10158:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;670:623::-;;791:81;807:64;864:6;807:64;:::i;:::-;791:81;:::i;:::-;782:90;;892:5;920:6;913:5;906:21;946:4;939:5;935:16;928:23;;971:6;1021:3;1013:4;1005:6;1001:17;996:3;992:27;989:36;986:2;;;1038:1;1035;1028:12;986:2;1066:1;1051:236;1076:6;1073:1;1070:13;1051:236;;;1143:3;1171:37;1204:3;1192:10;1171:37;:::i;:::-;1166:3;1159:50;1238:4;1233:3;1229:14;1222:21;;1272:4;1267:3;1263:14;1256:21;;1111:176;1098:1;1095;1091:9;1086:14;;1051:236;;;1055:14;772:521;;;;;;;:::o;1316:623::-;;1437:81;1453:64;1510:6;1453:64;:::i;:::-;1437:81;:::i;:::-;1428:90;;1538:5;1566:6;1559:5;1552:21;1592:4;1585:5;1581:16;1574:23;;1617:6;1667:3;1659:4;1651:6;1647:17;1642:3;1638:27;1635:36;1632:2;;;1684:1;1681;1674:12;1632:2;1712:1;1697:236;1722:6;1719:1;1716:13;1697:236;;;1789:3;1817:37;1850:3;1838:10;1817:37;:::i;:::-;1812:3;1805:50;1884:4;1879:3;1875:14;1868:21;;1918:4;1913:3;1909:14;1902:21;;1757:176;1744:1;1741;1737:9;1732:14;;1697:236;;;1701:14;1418:521;;;;;;;:::o;1945:345::-;;2048:66;2064:49;2106:6;2064:49;:::i;:::-;2048:66;:::i;:::-;2039:75;;2137:6;2130:5;2123:21;2175:4;2168:5;2164:16;2213:3;2204:6;2199:3;2195:16;2192:25;2189:2;;;2230:1;2227;2220:12;2189:2;2243:41;2277:6;2272:3;2267;2243:41;:::i;:::-;2029:261;;;;;;:::o;2296:139::-;;2380:6;2367:20;2358:29;;2396:33;2423:5;2396:33;:::i;:::-;2348:87;;;;:::o;2458:303::-;;2578:3;2571:4;2563:6;2559:17;2555:27;2545:2;;2596:1;2593;2586:12;2545:2;2636:6;2623:20;2661:94;2751:3;2743:6;2736:4;2728:6;2724:17;2661:94;:::i;:::-;2652:103;;2535:226;;;;;:::o;2784:303::-;;2904:3;2897:4;2889:6;2885:17;2881:27;2871:2;;2922:1;2919;2912:12;2871:2;2962:6;2949:20;2987:94;3077:3;3069:6;3062:4;3054:6;3050:17;2987:94;:::i;:::-;2978:103;;2861:226;;;;;:::o;3110:303::-;;3230:3;3223:4;3215:6;3211:17;3207:27;3197:2;;3248:1;3245;3238:12;3197:2;3288:6;3275:20;3313:94;3403:3;3395:6;3388:4;3380:6;3376:17;3313:94;:::i;:::-;3304:103;;3187:226;;;;;:::o;3419:137::-;;3504:6;3498:13;3489:22;;3520:30;3544:5;3520:30;:::i;:::-;3479:77;;;;:::o;3562:139::-;;3646:6;3633:20;3624:29;;3662:33;3689:5;3662:33;:::i;:::-;3614:87;;;;:::o;3721:273::-;;3826:3;3819:4;3811:6;3807:17;3803:27;3793:2;;3844:1;3841;3834:12;3793:2;3884:6;3871:20;3909:79;3984:3;3976:6;3969:4;3961:6;3957:17;3909:79;:::i;:::-;3900:88;;3783:211;;;;;:::o;4000:139::-;;4084:6;4071:20;4062:29;;4100:33;4127:5;4100:33;:::i;:::-;4052:87;;;;:::o;4145:139::-;;4229:6;4216:20;4207:29;;4245:33;4272:5;4245:33;:::i;:::-;4197:87;;;;:::o;4290:143::-;;4378:6;4372:13;4363:22;;4394:33;4421:5;4394:33;:::i;:::-;4353:80;;;;:::o;4439:405::-;;4572:2;4560:9;4551:7;4547:23;4543:32;4540:2;;;4588:1;4585;4578:12;4540:2;4659:1;4648:9;4644:17;4631:31;4689:18;4681:6;4678:30;4675:2;;;4721:1;4718;4711:12;4675:2;4749:78;4819:7;4810:6;4799:9;4795:22;4749:78;:::i;:::-;4739:88;;4602:235;4530:314;;;;:::o;4850:278::-;;4966:2;4954:9;4945:7;4941:23;4937:32;4934:2;;;4982:1;4979;4972:12;4934:2;5025:1;5050:61;5103:7;5094:6;5083:9;5079:22;5050:61;:::i;:::-;5040:71;;4996:125;4924:204;;;;:::o;5134:262::-;;5242:2;5230:9;5221:7;5217:23;5213:32;5210:2;;;5258:1;5255;5248:12;5210:2;5301:1;5326:53;5371:7;5362:6;5351:9;5347:22;5326:53;:::i;:::-;5316:63;;5272:117;5200:196;;;;:::o;5402:844::-;;;;;;5578:3;5566:9;5557:7;5553:23;5549:33;5546:2;;;5595:1;5592;5585:12;5546:2;5638:1;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5609:117;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5893:2;5919:53;5964:7;5955:6;5944:9;5940:22;5919:53;:::i;:::-;5909:63;;5864:118;6021:2;6047:53;6092:7;6083:6;6072:9;6068:22;6047:53;:::i;:::-;6037:63;;5992:118;6149:3;6176:53;6221:7;6212:6;6201:9;6197:22;6176:53;:::i;:::-;6166:63;;6120:119;5536:710;;;;;;;;:::o;6252:407::-;;;6377:2;6365:9;6356:7;6352:23;6348:32;6345:2;;;6393:1;6390;6383:12;6345:2;6436:1;6461:53;6506:7;6497:6;6486:9;6482:22;6461:53;:::i;:::-;6451:63;;6407:117;6563:2;6589:53;6634:7;6625:6;6614:9;6610:22;6589:53;:::i;:::-;6579:63;;6534:118;6335:324;;;;;:::o;6665:2121::-;;;;;;;;;;;;7004:3;6992:9;6983:7;6979:23;6975:33;6972:2;;;7021:1;7018;7011:12;6972:2;7064:1;7089:53;7134:7;7125:6;7114:9;7110:22;7089:53;:::i;:::-;7079:63;;7035:117;7191:2;7217:53;7262:7;7253:6;7242:9;7238:22;7217:53;:::i;:::-;7207:63;;7162:118;7319:2;7345:53;7390:7;7381:6;7370:9;7366:22;7345:53;:::i;:::-;7335:63;;7290:118;7475:2;7464:9;7460:18;7447:32;7506:18;7498:6;7495:30;7492:2;;;7538:1;7535;7528:12;7492:2;7566:63;7621:7;7612:6;7601:9;7597:22;7566:63;:::i;:::-;7556:73;;7418:221;7706:3;7695:9;7691:19;7678:33;7738:18;7730:6;7727:30;7724:2;;;7770:1;7767;7760:12;7724:2;7798:78;7868:7;7859:6;7848:9;7844:22;7798:78;:::i;:::-;7788:88;;7649:237;7953:3;7942:9;7938:19;7925:33;7985:18;7977:6;7974:30;7971:2;;;8017:1;8014;8007:12;7971:2;8045:78;8115:7;8106:6;8095:9;8091:22;8045:78;:::i;:::-;8035:88;;7896:237;8172:3;8199:53;8244:7;8235:6;8224:9;8220:22;8199:53;:::i;:::-;8189:63;;8143:119;8301:3;8328:53;8373:7;8364:6;8353:9;8349:22;8328:53;:::i;:::-;8318:63;;8272:119;8430:3;8457:53;8502:7;8493:6;8482:9;8478:22;8457:53;:::i;:::-;8447:63;;8401:119;8559:3;8586:53;8631:7;8622:6;8611:9;8607:22;8586:53;:::i;:::-;8576:63;;8530:119;8688:3;8716:53;8761:7;8752:6;8741:9;8737:22;8716:53;:::i;:::-;8705:64;;8659:120;6962:1824;;;;;;;;;;;;;;:::o;8792:284::-;;8911:2;8899:9;8890:7;8886:23;8882:32;8879:2;;;8927:1;8924;8917:12;8879:2;8970:1;8995:64;9051:7;9042:6;9031:9;9027:22;8995:64;:::i;:::-;8985:74;;8941:128;8869:207;;;;:::o;9082:179::-;;9172:46;9214:3;9206:6;9172:46;:::i;:::-;9250:4;9245:3;9241:14;9227:28;;9162:99;;;;:::o;9267:179::-;;9357:46;9399:3;9391:6;9357:46;:::i;:::-;9435:4;9430:3;9426:14;9412:28;;9347:99;;;;:::o;9452:108::-;9529:24;9547:5;9529:24;:::i;:::-;9524:3;9517:37;9507:53;;:::o;9566:118::-;9653:24;9671:5;9653:24;:::i;:::-;9648:3;9641:37;9631:53;;:::o;9690:157::-;9795:45;9815:24;9833:5;9815:24;:::i;:::-;9795:45;:::i;:::-;9790:3;9783:58;9773:74;;:::o;9883:732::-;;10031:54;10079:5;10031:54;:::i;:::-;10101:86;10180:6;10175:3;10101:86;:::i;:::-;10094:93;;10211:56;10261:5;10211:56;:::i;:::-;10290:7;10321:1;10306:284;10331:6;10328:1;10325:13;10306:284;;;10407:6;10401:13;10434:63;10493:3;10478:13;10434:63;:::i;:::-;10427:70;;10520:60;10573:6;10520:60;:::i;:::-;10510:70;;10366:224;10353:1;10350;10346:9;10341:14;;10306:284;;;10310:14;10606:3;10599:10;;10007:608;;;;;;;:::o;10651:732::-;;10799:54;10847:5;10799:54;:::i;:::-;10869:86;10948:6;10943:3;10869:86;:::i;:::-;10862:93;;10979:56;11029:5;10979:56;:::i;:::-;11058:7;11089:1;11074:284;11099:6;11096:1;11093:13;11074:284;;;11175:6;11169:13;11202:63;11261:3;11246:13;11202:63;:::i;:::-;11195:70;;11288:60;11341:6;11288:60;:::i;:::-;11278:70;;11134:224;11121:1;11118;11114:9;11109:14;;11074:284;;;11078:14;11374:3;11367:10;;10775:608;;;;;;;:::o;11419:1682::-;;11564:51;11609:5;11564:51;:::i;:::-;11631:86;11710:6;11705:3;11631:86;:::i;:::-;11624:93;;11745:3;11771:53;11818:5;11771:53;:::i;:::-;11852:1;11865;11862:2;;;11929:503;11969:6;11964:1;11961;11957:9;11944:11;11940:27;11937:39;11929:503;;;12076:6;12070:13;12101:90;12187:3;12135:50;12180:4;12135:50;:::i;:::-;12101:90;:::i;:::-;12224:4;12219:3;12215:14;12208:21;;12247:91;12334:3;12281:51;12327:4;12281:51;:::i;:::-;12247:91;:::i;:::-;12371:4;12366:3;12362:14;12355:21;;12416:1;12408:6;12404:14;12394:24;;12040:392;12023:1;12010:11;12006:19;11991:34;;11929:503;;;11862:2;12519:1;12516:2;;;12553:6;12547:13;12593:6;12580:11;12577:23;12574:2;;;12619:90;12705:3;12653:50;12698:4;12653:50;:::i;:::-;12619:90;:::i;:::-;12742:4;12737:3;12733:14;12726:21;;12796:1;12783:11;12779:19;12764:34;;12574:2;12845:6;12832:11;12829:23;12826:2;;;12871:91;12958:3;12905:51;12951:4;12905:51;:::i;:::-;12871:91;:::i;:::-;12995:4;12990:3;12986:14;12979:21;;13049:1;13036:11;13032:19;13017:34;;12826:2;12521:555;12516:2;13092:3;13085:10;;11540:1561;;;;;;;;:::o;13107:109::-;13188:21;13203:5;13188:21;:::i;:::-;13183:3;13176:34;13166:50;;:::o;13222:118::-;13309:24;13327:5;13309:24;:::i;:::-;13304:3;13297:37;13287:53;;:::o;13346:157::-;13451:45;13471:24;13489:5;13471:24;:::i;:::-;13451:45;:::i;:::-;13446:3;13439:58;13429:74;;:::o;13509:373::-;;13641:38;13673:5;13641:38;:::i;:::-;13695:88;13776:6;13771:3;13695:88;:::i;:::-;13688:95;;13792:52;13837:6;13832:3;13825:4;13818:5;13814:16;13792:52;:::i;:::-;13869:6;13864:3;13860:16;13853:23;;13617:265;;;;;:::o;13888:364::-;;14004:39;14037:5;14004:39;:::i;:::-;14059:71;14123:6;14118:3;14059:71;:::i;:::-;14052:78;;14139:52;14184:6;14179:3;14172:4;14165:5;14161:16;14139:52;:::i;:::-;14216:29;14238:6;14216:29;:::i;:::-;14211:3;14207:39;14200:46;;13980:272;;;;;:::o;14258:366::-;;14421:67;14485:2;14480:3;14421:67;:::i;:::-;14414:74;;14497:93;14586:3;14497:93;:::i;:::-;14615:2;14610:3;14606:12;14599:19;;14404:220;;;:::o;14630:366::-;;14793:67;14857:2;14852:3;14793:67;:::i;:::-;14786:74;;14869:93;14958:3;14869:93;:::i;:::-;14987:2;14982:3;14978:12;14971:19;;14776:220;;;:::o;15002:366::-;;15165:67;15229:2;15224:3;15165:67;:::i;:::-;15158:74;;15241:93;15330:3;15241:93;:::i;:::-;15359:2;15354:3;15350:12;15343:19;;15148:220;;;:::o;15374:366::-;;15537:67;15601:2;15596:3;15537:67;:::i;:::-;15530:74;;15613:93;15702:3;15613:93;:::i;:::-;15731:2;15726:3;15722:12;15715:19;;15520:220;;;:::o;15746:366::-;;15909:67;15973:2;15968:3;15909:67;:::i;:::-;15902:74;;15985:93;16074:3;15985:93;:::i;:::-;16103:2;16098:3;16094:12;16087:19;;15892:220;;;:::o;16118:366::-;;16281:67;16345:2;16340:3;16281:67;:::i;:::-;16274:74;;16357:93;16446:3;16357:93;:::i;:::-;16475:2;16470:3;16466:12;16459:19;;16264:220;;;:::o;16490:366::-;;16653:67;16717:2;16712:3;16653:67;:::i;:::-;16646:74;;16729:93;16818:3;16729:93;:::i;:::-;16847:2;16842:3;16838:12;16831:19;;16636:220;;;:::o;16862:366::-;;17025:67;17089:2;17084:3;17025:67;:::i;:::-;17018:74;;17101:93;17190:3;17101:93;:::i;:::-;17219:2;17214:3;17210:12;17203:19;;17008:220;;;:::o;17234:366::-;;17397:67;17461:2;17456:3;17397:67;:::i;:::-;17390:74;;17473:93;17562:3;17473:93;:::i;:::-;17591:2;17586:3;17582:12;17575:19;;17380:220;;;:::o;17606:366::-;;17769:67;17833:2;17828:3;17769:67;:::i;:::-;17762:74;;17845:93;17934:3;17845:93;:::i;:::-;17963:2;17958:3;17954:12;17947:19;;17752:220;;;:::o;17978:366::-;;18141:67;18205:2;18200:3;18141:67;:::i;:::-;18134:74;;18217:93;18306:3;18217:93;:::i;:::-;18335:2;18330:3;18326:12;18319:19;;18124:220;;;:::o;18350:366::-;;18513:67;18577:2;18572:3;18513:67;:::i;:::-;18506:74;;18589:93;18678:3;18589:93;:::i;:::-;18707:2;18702:3;18698:12;18691:19;;18496:220;;;:::o;18722:366::-;;18885:67;18949:2;18944:3;18885:67;:::i;:::-;18878:74;;18961:93;19050:3;18961:93;:::i;:::-;19079:2;19074:3;19070:12;19063:19;;18868:220;;;:::o;19094:366::-;;19257:67;19321:2;19316:3;19257:67;:::i;:::-;19250:74;;19333:93;19422:3;19333:93;:::i;:::-;19451:2;19446:3;19442:12;19435:19;;19240:220;;;:::o;19466:366::-;;19629:67;19693:2;19688:3;19629:67;:::i;:::-;19622:74;;19705:93;19794:3;19705:93;:::i;:::-;19823:2;19818:3;19814:12;19807:19;;19612:220;;;:::o;19838:366::-;;20001:67;20065:2;20060:3;20001:67;:::i;:::-;19994:74;;20077:93;20166:3;20077:93;:::i;:::-;20195:2;20190:3;20186:12;20179:19;;19984:220;;;:::o;20210:366::-;;20373:67;20437:2;20432:3;20373:67;:::i;:::-;20366:74;;20449:93;20538:3;20449:93;:::i;:::-;20567:2;20562:3;20558:12;20551:19;;20356:220;;;:::o;20582:365::-;;20745:66;20809:1;20804:3;20745:66;:::i;:::-;20738:73;;20820:93;20909:3;20820:93;:::i;:::-;20938:2;20933:3;20929:12;20922:19;;20728:219;;;:::o;20953:366::-;;21116:67;21180:2;21175:3;21116:67;:::i;:::-;21109:74;;21192:93;21281:3;21192:93;:::i;:::-;21310:2;21305:3;21301:12;21294:19;;21099:220;;;:::o;21325:366::-;;21488:67;21552:2;21547:3;21488:67;:::i;:::-;21481:74;;21564:93;21653:3;21564:93;:::i;:::-;21682:2;21677:3;21673:12;21666:19;;21471:220;;;:::o;21697:366::-;;21860:67;21924:2;21919:3;21860:67;:::i;:::-;21853:74;;21936:93;22025:3;21936:93;:::i;:::-;22054:2;22049:3;22045:12;22038:19;;21843:220;;;:::o;22069:365::-;;22232:66;22296:1;22291:3;22232:66;:::i;:::-;22225:73;;22307:93;22396:3;22307:93;:::i;:::-;22425:2;22420:3;22416:12;22409:19;;22215:219;;;:::o;22440:366::-;;22603:67;22667:2;22662:3;22603:67;:::i;:::-;22596:74;;22679:93;22768:3;22679:93;:::i;:::-;22797:2;22792:3;22788:12;22781:19;;22586:220;;;:::o;22812:366::-;;22975:67;23039:2;23034:3;22975:67;:::i;:::-;22968:74;;23051:93;23140:3;23051:93;:::i;:::-;23169:2;23164:3;23160:12;23153:19;;22958:220;;;:::o;23184:366::-;;23347:67;23411:2;23406:3;23347:67;:::i;:::-;23340:74;;23423:93;23512:3;23423:93;:::i;:::-;23541:2;23536:3;23532:12;23525:19;;23330:220;;;:::o;23556:366::-;;23719:67;23783:2;23778:3;23719:67;:::i;:::-;23712:74;;23795:93;23884:3;23795:93;:::i;:::-;23913:2;23908:3;23904:12;23897:19;;23702:220;;;:::o;23928:366::-;;24091:67;24155:2;24150:3;24091:67;:::i;:::-;24084:74;;24167:93;24256:3;24167:93;:::i;:::-;24285:2;24280:3;24276:12;24269:19;;24074:220;;;:::o;24300:366::-;;24463:67;24527:2;24522:3;24463:67;:::i;:::-;24456:74;;24539:93;24628:3;24539:93;:::i;:::-;24657:2;24652:3;24648:12;24641:19;;24446:220;;;:::o;24672:366::-;;24835:67;24899:2;24894:3;24835:67;:::i;:::-;24828:74;;24911:93;25000:3;24911:93;:::i;:::-;25029:2;25024:3;25020:12;25013:19;;24818:220;;;:::o;25044:366::-;;25207:67;25271:2;25266:3;25207:67;:::i;:::-;25200:74;;25283:93;25372:3;25283:93;:::i;:::-;25401:2;25396:3;25392:12;25385:19;;25190:220;;;:::o;25416:366::-;;25579:67;25643:2;25638:3;25579:67;:::i;:::-;25572:74;;25655:93;25744:3;25655:93;:::i;:::-;25773:2;25768:3;25764:12;25757:19;;25562:220;;;:::o;25788:366::-;;25951:67;26015:2;26010:3;25951:67;:::i;:::-;25944:74;;26027:93;26116:3;26027:93;:::i;:::-;26145:2;26140:3;26136:12;26129:19;;25934:220;;;:::o;26160:108::-;26237:24;26255:5;26237:24;:::i;:::-;26232:3;26225:37;26215:53;;:::o;26274:131::-;26361:37;26392:5;26361:37;:::i;:::-;26356:3;26349:50;26339:66;;:::o;26411:118::-;26498:24;26516:5;26498:24;:::i;:::-;26493:3;26486:37;26476:53;;:::o;26535:157::-;26640:45;26660:24;26678:5;26660:24;:::i;:::-;26640:45;:::i;:::-;26635:3;26628:58;26618:74;;:::o;26698:153::-;26801:43;26820:23;26837:5;26820:23;:::i;:::-;26801:43;:::i;:::-;26796:3;26789:56;26779:72;;:::o;26857:256::-;;26984:75;27055:3;27046:6;26984:75;:::i;:::-;27084:2;27079:3;27075:12;27068:19;;27104:3;27097:10;;26973:140;;;;:::o;27119:674::-;;27328:75;27399:3;27390:6;27328:75;:::i;:::-;27428:2;27423:3;27419:12;27412:19;;27441:75;27512:3;27503:6;27441:75;:::i;:::-;27541:2;27536:3;27532:12;27525:19;;27554:73;27623:3;27614:6;27554:73;:::i;:::-;27652:1;27647:3;27643:11;27636:18;;27664:75;27735:3;27726:6;27664:75;:::i;:::-;27764:2;27759:3;27755:12;27748:19;;27784:3;27777:10;;27317:476;;;;;;;:::o;27799:271::-;;27951:93;28040:3;28031:6;27951:93;:::i;:::-;27944:100;;28061:3;28054:10;;27933:137;;;;:::o;28076:397::-;;28231:75;28302:3;28293:6;28231:75;:::i;:::-;28331:2;28326:3;28322:12;28315:19;;28344:75;28415:3;28406:6;28344:75;:::i;:::-;28444:2;28439:3;28435:12;28428:19;;28464:3;28457:10;;28220:253;;;;;:::o;28479:222::-;;28610:2;28599:9;28595:18;28587:26;;28623:71;28691:1;28680:9;28676:17;28667:6;28623:71;:::i;:::-;28577:124;;;;:::o;28707:332::-;;28866:2;28855:9;28851:18;28843:26;;28879:71;28947:1;28936:9;28932:17;28923:6;28879:71;:::i;:::-;28960:72;29028:2;29017:9;29013:18;29004:6;28960:72;:::i;:::-;28833:206;;;;;:::o;29045:442::-;;29232:2;29221:9;29217:18;29209:26;;29245:71;29313:1;29302:9;29298:17;29289:6;29245:71;:::i;:::-;29326:72;29394:2;29383:9;29379:18;29370:6;29326:72;:::i;:::-;29408;29476:2;29465:9;29461:18;29452:6;29408:72;:::i;:::-;29199:288;;;;;;:::o;29493:332::-;;29652:2;29641:9;29637:18;29629:26;;29665:71;29733:1;29722:9;29718:17;29709:6;29665:71;:::i;:::-;29746:72;29814:2;29803:9;29799:18;29790:6;29746:72;:::i;:::-;29619:206;;;;;:::o;29831:1263::-;;30240:3;30229:9;30225:19;30217:27;;30290:9;30284:4;30280:20;30276:1;30265:9;30261:17;30254:47;30318:108;30421:4;30412:6;30318:108;:::i;:::-;30310:116;;30436:72;30504:2;30493:9;30489:18;30480:6;30436:72;:::i;:::-;30518:66;30580:2;30569:9;30565:18;30556:6;30518:66;:::i;:::-;30594;30656:2;30645:9;30641:18;30632:6;30594:66;:::i;:::-;30670:67;30732:3;30721:9;30717:19;30708:6;30670:67;:::i;:::-;30747:73;30815:3;30804:9;30800:19;30791:6;30747:73;:::i;:::-;30830;30898:3;30887:9;30883:19;30874:6;30830:73;:::i;:::-;30951:9;30945:4;30941:20;30935:3;30924:9;30920:19;30913:49;30979:108;31082:4;31073:6;30979:108;:::i;:::-;30971:116;;30207:887;;;;;;;;;;;:::o;31100:775::-;;31371:3;31360:9;31356:19;31348:27;;31385:71;31453:1;31442:9;31438:17;31429:6;31385:71;:::i;:::-;31466:72;31534:2;31523:9;31519:18;31510:6;31466:72;:::i;:::-;31548;31616:2;31605:9;31601:18;31592:6;31548:72;:::i;:::-;31630;31698:2;31687:9;31683:18;31674:6;31630:72;:::i;:::-;31712:73;31780:3;31769:9;31765:19;31756:6;31712:73;:::i;:::-;31795;31863:3;31852:9;31848:19;31839:6;31795:73;:::i;:::-;31338:537;;;;;;;;;:::o;31881:442::-;;32068:2;32057:9;32053:18;32045:26;;32081:71;32149:1;32138:9;32134:17;32125:6;32081:71;:::i;:::-;32162:72;32230:2;32219:9;32215:18;32206:6;32162:72;:::i;:::-;32244;32312:2;32301:9;32297:18;32288:6;32244:72;:::i;:::-;32035:288;;;;;;:::o;32329:698::-;;32591:3;32580:9;32576:19;32568:27;;32605:71;32673:1;32662:9;32658:17;32649:6;32605:71;:::i;:::-;32686:72;32754:2;32743:9;32739:18;32730:6;32686:72;:::i;:::-;32768;32836:2;32825:9;32821:18;32812:6;32768:72;:::i;:::-;32887:9;32881:4;32877:20;32872:2;32861:9;32857:18;32850:48;32915:105;33015:4;33006:6;32915:105;:::i;:::-;32907:113;;32558:469;;;;;;;:::o;33033:664::-;;33276:3;33265:9;33261:19;33253:27;;33290:71;33358:1;33347:9;33343:17;33334:6;33290:71;:::i;:::-;33371:72;33439:2;33428:9;33424:18;33415:6;33371:72;:::i;:::-;33453;33521:2;33510:9;33506:18;33497:6;33453:72;:::i;:::-;33535;33603:2;33592:9;33588:18;33579:6;33535:72;:::i;:::-;33617:73;33685:3;33674:9;33670:19;33661:6;33617:73;:::i;:::-;33243:454;;;;;;;;:::o;33703:313::-;;33854:2;33843:9;33839:18;33831:26;;33903:9;33897:4;33893:20;33889:1;33878:9;33874:17;33867:47;33931:78;34004:4;33995:6;33931:78;:::i;:::-;33923:86;;33821:195;;;;:::o;34022:419::-;;34226:2;34215:9;34211:18;34203:26;;34275:9;34269:4;34265:20;34261:1;34250:9;34246:17;34239:47;34303:131;34429:4;34303:131;:::i;:::-;34295:139;;34193:248;;;:::o;34447:419::-;;34651:2;34640:9;34636:18;34628:26;;34700:9;34694:4;34690:20;34686:1;34675:9;34671:17;34664:47;34728:131;34854:4;34728:131;:::i;:::-;34720:139;;34618:248;;;:::o;34872:419::-;;35076:2;35065:9;35061:18;35053:26;;35125:9;35119:4;35115:20;35111:1;35100:9;35096:17;35089:47;35153:131;35279:4;35153:131;:::i;:::-;35145:139;;35043:248;;;:::o;35297:419::-;;35501:2;35490:9;35486:18;35478:26;;35550:9;35544:4;35540:20;35536:1;35525:9;35521:17;35514:47;35578:131;35704:4;35578:131;:::i;:::-;35570:139;;35468:248;;;:::o;35722:419::-;;35926:2;35915:9;35911:18;35903:26;;35975:9;35969:4;35965:20;35961:1;35950:9;35946:17;35939:47;36003:131;36129:4;36003:131;:::i;:::-;35995:139;;35893:248;;;:::o;36147:419::-;;36351:2;36340:9;36336:18;36328:26;;36400:9;36394:4;36390:20;36386:1;36375:9;36371:17;36364:47;36428:131;36554:4;36428:131;:::i;:::-;36420:139;;36318:248;;;:::o;36572:419::-;;36776:2;36765:9;36761:18;36753:26;;36825:9;36819:4;36815:20;36811:1;36800:9;36796:17;36789:47;36853:131;36979:4;36853:131;:::i;:::-;36845:139;;36743:248;;;:::o;36997:419::-;;37201:2;37190:9;37186:18;37178:26;;37250:9;37244:4;37240:20;37236:1;37225:9;37221:17;37214:47;37278:131;37404:4;37278:131;:::i;:::-;37270:139;;37168:248;;;:::o;37422:419::-;;37626:2;37615:9;37611:18;37603:26;;37675:9;37669:4;37665:20;37661:1;37650:9;37646:17;37639:47;37703:131;37829:4;37703:131;:::i;:::-;37695:139;;37593:248;;;:::o;37847:419::-;;38051:2;38040:9;38036:18;38028:26;;38100:9;38094:4;38090:20;38086:1;38075:9;38071:17;38064:47;38128:131;38254:4;38128:131;:::i;:::-;38120:139;;38018:248;;;:::o;38272:419::-;;38476:2;38465:9;38461:18;38453:26;;38525:9;38519:4;38515:20;38511:1;38500:9;38496:17;38489:47;38553:131;38679:4;38553:131;:::i;:::-;38545:139;;38443:248;;;:::o;38697:419::-;;38901:2;38890:9;38886:18;38878:26;;38950:9;38944:4;38940:20;38936:1;38925:9;38921:17;38914:47;38978:131;39104:4;38978:131;:::i;:::-;38970:139;;38868:248;;;:::o;39122:419::-;;39326:2;39315:9;39311:18;39303:26;;39375:9;39369:4;39365:20;39361:1;39350:9;39346:17;39339:47;39403:131;39529:4;39403:131;:::i;:::-;39395:139;;39293:248;;;:::o;39547:419::-;;39751:2;39740:9;39736:18;39728:26;;39800:9;39794:4;39790:20;39786:1;39775:9;39771:17;39764:47;39828:131;39954:4;39828:131;:::i;:::-;39820:139;;39718:248;;;:::o;39972:419::-;;40176:2;40165:9;40161:18;40153:26;;40225:9;40219:4;40215:20;40211:1;40200:9;40196:17;40189:47;40253:131;40379:4;40253:131;:::i;:::-;40245:139;;40143:248;;;:::o;40397:419::-;;40601:2;40590:9;40586:18;40578:26;;40650:9;40644:4;40640:20;40636:1;40625:9;40621:17;40614:47;40678:131;40804:4;40678:131;:::i;:::-;40670:139;;40568:248;;;:::o;40822:419::-;;41026:2;41015:9;41011:18;41003:26;;41075:9;41069:4;41065:20;41061:1;41050:9;41046:17;41039:47;41103:131;41229:4;41103:131;:::i;:::-;41095:139;;40993:248;;;:::o;41247:419::-;;41451:2;41440:9;41436:18;41428:26;;41500:9;41494:4;41490:20;41486:1;41475:9;41471:17;41464:47;41528:131;41654:4;41528:131;:::i;:::-;41520:139;;41418:248;;;:::o;41672:419::-;;41876:2;41865:9;41861:18;41853:26;;41925:9;41919:4;41915:20;41911:1;41900:9;41896:17;41889:47;41953:131;42079:4;41953:131;:::i;:::-;41945:139;;41843:248;;;:::o;42097:419::-;;42301:2;42290:9;42286:18;42278:26;;42350:9;42344:4;42340:20;42336:1;42325:9;42321:17;42314:47;42378:131;42504:4;42378:131;:::i;:::-;42370:139;;42268:248;;;:::o;42522:419::-;;42726:2;42715:9;42711:18;42703:26;;42775:9;42769:4;42765:20;42761:1;42750:9;42746:17;42739:47;42803:131;42929:4;42803:131;:::i;:::-;42795:139;;42693:248;;;:::o;42947:419::-;;43151:2;43140:9;43136:18;43128:26;;43200:9;43194:4;43190:20;43186:1;43175:9;43171:17;43164:47;43228:131;43354:4;43228:131;:::i;:::-;43220:139;;43118:248;;;:::o;43372:419::-;;43576:2;43565:9;43561:18;43553:26;;43625:9;43619:4;43615:20;43611:1;43600:9;43596:17;43589:47;43653:131;43779:4;43653:131;:::i;:::-;43645:139;;43543:248;;;:::o;43797:419::-;;44001:2;43990:9;43986:18;43978:26;;44050:9;44044:4;44040:20;44036:1;44025:9;44021:17;44014:47;44078:131;44204:4;44078:131;:::i;:::-;44070:139;;43968:248;;;:::o;44222:419::-;;44426:2;44415:9;44411:18;44403:26;;44475:9;44469:4;44465:20;44461:1;44450:9;44446:17;44439:47;44503:131;44629:4;44503:131;:::i;:::-;44495:139;;44393:248;;;:::o;44647:419::-;;44851:2;44840:9;44836:18;44828:26;;44900:9;44894:4;44890:20;44886:1;44875:9;44871:17;44864:47;44928:131;45054:4;44928:131;:::i;:::-;44920:139;;44818:248;;;:::o;45072:419::-;;45276:2;45265:9;45261:18;45253:26;;45325:9;45319:4;45315:20;45311:1;45300:9;45296:17;45289:47;45353:131;45479:4;45353:131;:::i;:::-;45345:139;;45243:248;;;:::o;45497:419::-;;45701:2;45690:9;45686:18;45678:26;;45750:9;45744:4;45740:20;45736:1;45725:9;45721:17;45714:47;45778:131;45904:4;45778:131;:::i;:::-;45770:139;;45668:248;;;:::o;45922:419::-;;46126:2;46115:9;46111:18;46103:26;;46175:9;46169:4;46165:20;46161:1;46150:9;46146:17;46139:47;46203:131;46329:4;46203:131;:::i;:::-;46195:139;;46093:248;;;:::o;46347:419::-;;46551:2;46540:9;46536:18;46528:26;;46600:9;46594:4;46590:20;46586:1;46575:9;46571:17;46564:47;46628:131;46754:4;46628:131;:::i;:::-;46620:139;;46518:248;;;:::o;46772:419::-;;46976:2;46965:9;46961:18;46953:26;;47025:9;47019:4;47015:20;47011:1;47000:9;46996:17;46989:47;47053:131;47179:4;47053:131;:::i;:::-;47045:139;;46943:248;;;:::o;47197:419::-;;47401:2;47390:9;47386:18;47378:26;;47450:9;47444:4;47440:20;47436:1;47425:9;47421:17;47414:47;47478:131;47604:4;47478:131;:::i;:::-;47470:139;;47368:248;;;:::o;47622:222::-;;47753:2;47742:9;47738:18;47730:26;;47766:71;47834:1;47823:9;47819:17;47810:6;47766:71;:::i;:::-;47720:124;;;;:::o;47850:866::-;;48141:3;48130:9;48126:19;48118:27;;48155:71;48223:1;48212:9;48208:17;48199:6;48155:71;:::i;:::-;48236:72;48304:2;48293:9;48289:18;48280:6;48236:72;:::i;:::-;48318;48386:2;48375:9;48371:18;48362:6;48318:72;:::i;:::-;48400;48468:2;48457:9;48453:18;48444:6;48400:72;:::i;:::-;48482:73;48550:3;48539:9;48535:19;48526:6;48482:73;:::i;:::-;48603:9;48597:4;48593:20;48587:3;48576:9;48572:19;48565:49;48631:78;48704:4;48695:6;48631:78;:::i;:::-;48623:86;;48108:608;;;;;;;;;:::o;48722:129::-;;48783:20;;:::i;:::-;48773:30;;48812:33;48840:4;48832:6;48812:33;:::i;:::-;48763:88;;;:::o;48857:75::-;;48923:2;48917:9;48907:19;;48897:35;:::o;48938:311::-;;49105:18;49097:6;49094:30;49091:2;;;49127:18;;:::i;:::-;49091:2;49177:4;49169:6;49165:17;49157:25;;49237:4;49231;49227:15;49219:23;;49020:229;;;:::o;49255:311::-;;49422:18;49414:6;49411:30;49408:2;;;49444:18;;:::i;:::-;49408:2;49494:4;49486:6;49482:17;49474:25;;49554:4;49548;49544:15;49536:23;;49337:229;;;:::o;49572:311::-;;49739:18;49731:6;49728:30;49725:2;;;49761:18;;:::i;:::-;49725:2;49811:4;49803:6;49799:17;49791:25;;49871:4;49865;49861:15;49853:23;;49654:229;;;:::o;49889:308::-;;50041:18;50033:6;50030:30;50027:2;;;50063:18;;:::i;:::-;50027:2;50101:29;50123:6;50101:29;:::i;:::-;50093:37;;50185:4;50179;50175:15;50167:23;;49956:241;;;:::o;50203:132::-;;50293:3;50285:11;;50323:4;50318:3;50314:14;50306:22;;50275:60;;;:::o;50341:132::-;;50431:3;50423:11;;50461:4;50456:3;50452:14;50444:22;;50413:60;;;:::o;50479:156::-;;50566:3;50558:11;;50589:3;50586:1;50579:14;50623:4;50620:1;50610:18;50602:26;;50548:87;;;:::o;50641:114::-;;50742:5;50736:12;50726:22;;50715:40;;;:::o;50761:114::-;;50862:5;50856:12;50846:22;;50835:40;;;:::o;50881:111::-;;50979:5;50973:12;50963:22;;50952:40;;;:::o;50998:98::-;;51083:5;51077:12;51067:22;;51056:40;;;:::o;51102:99::-;;51188:5;51182:12;51172:22;;51161:40;;;:::o;51207:113::-;;51309:4;51304:3;51300:14;51292:22;;51282:38;;;:::o;51326:113::-;;51428:4;51423:3;51419:14;51411:22;;51401:38;;;:::o;51445:184::-;;51578:6;51573:3;51566:19;51618:4;51613:3;51609:14;51594:29;;51556:73;;;;:::o;51635:184::-;;51768:6;51763:3;51756:19;51808:4;51803:3;51799:14;51784:29;;51746:73;;;;:::o;51825:147::-;;51963:3;51948:18;;51938:34;;;;:::o;51978:169::-;;52096:6;52091:3;52084:19;52136:4;52131:3;52127:14;52112:29;;52074:73;;;;:::o;52153:297::-;;52212:20;52230:1;52212:20;:::i;:::-;52207:25;;52246:20;52264:1;52246:20;:::i;:::-;52241:25;;52392:1;52332:58;52328:66;52325:1;52322:73;52319:2;;;52398:18;;:::i;:::-;52319:2;52442:1;52439;52435:9;52428:16;;52197:253;;;;:::o;52456:305::-;;52515:20;52533:1;52515:20;:::i;:::-;52510:25;;52549:20;52567:1;52549:20;:::i;:::-;52544:25;;52703:1;52635:66;52631:74;52628:1;52625:81;52622:2;;;52709:18;;:::i;:::-;52622:2;52753:1;52750;52746:9;52739:16;;52500:261;;;;:::o;52767:185::-;;52824:20;52842:1;52824:20;:::i;:::-;52819:25;;52858:20;52876:1;52858:20;:::i;:::-;52853:25;;52897:1;52887:2;;52902:18;;:::i;:::-;52887:2;52944:1;52941;52937:9;52932:14;;52809:143;;;;:::o;52958:348::-;;53021:20;53039:1;53021:20;:::i;:::-;53016:25;;53055:20;53073:1;53055:20;:::i;:::-;53050:25;;53243:1;53175:66;53171:74;53168:1;53165:81;53160:1;53153:9;53146:17;53142:105;53139:2;;;53250:18;;:::i;:::-;53139:2;53298:1;53295;53291:9;53280:20;;53006:300;;;;:::o;53312:191::-;;53372:20;53390:1;53372:20;:::i;:::-;53367:25;;53406:20;53424:1;53406:20;:::i;:::-;53401:25;;53445:1;53442;53439:8;53436:2;;;53450:18;;:::i;:::-;53436:2;53495:1;53492;53488:9;53480:17;;53357:146;;;;:::o;53509:131::-;;53599:34;53592:5;53588:46;53577:57;;53567:73;;;:::o;53646:96::-;;53712:24;53730:5;53712:24;:::i;:::-;53701:35;;53691:51;;;:::o;53748:90::-;;53825:5;53818:13;53811:21;53800:32;;53790:48;;;:::o;53844:77::-;;53910:5;53899:16;;53889:32;;;:::o;53927:118::-;;54004:34;53997:5;53993:46;53982:57;;53972:73;;;:::o;54051:126::-;;54128:42;54121:5;54117:54;54106:65;;54096:81;;;:::o;54183:142::-;;54260:58;54253:5;54249:70;54238:81;;54228:97;;;:::o;54331:77::-;;54397:5;54386:16;;54376:32;;;:::o;54414:93::-;;54490:10;54483:5;54479:22;54468:33;;54458:49;;;:::o;54513:113::-;;54596:24;54614:5;54596:24;:::i;:::-;54583:37;;54573:53;;;:::o;54632:154::-;54716:6;54711:3;54706;54693:30;54778:1;54769:6;54764:3;54760:16;54753:27;54683:103;;;:::o;54792:307::-;54860:1;54870:113;54884:6;54881:1;54878:13;54870:113;;;54969:1;54964:3;54960:11;54954:18;54950:1;54945:3;54941:11;54934:39;54906:2;54903:1;54899:10;54894:15;;54870:113;;;55001:6;54998:1;54995:13;54992:2;;;55081:1;55072:6;55067:3;55063:16;55056:27;54992:2;54841:258;;;;:::o;55105:166::-;;55199:66;55230:34;55253:10;55230:34;:::i;:::-;55199:66;:::i;:::-;55190:75;;55180:91;;;:::o;55277:169::-;;55372:68;55403:36;55428:10;55403:36;:::i;:::-;55372:68;:::i;:::-;55363:77;;55353:93;;;:::o;55452:281::-;55535:27;55557:4;55535:27;:::i;:::-;55527:6;55523:40;55665:6;55653:10;55650:22;55629:18;55617:10;55614:34;55611:62;55608:2;;;55676:18;;:::i;:::-;55608:2;55716:10;55712:2;55705:22;55495:238;;;:::o;55739:233::-;;55801:24;55819:5;55801:24;:::i;:::-;55792:33;;55847:66;55840:5;55837:77;55834:2;;;55917:18;;:::i;:::-;55834:2;55964:1;55957:5;55953:13;55946:20;;55782:190;;;:::o;55978:175::-;;56039:23;56056:5;56039:23;:::i;:::-;56030:32;;56084:10;56077:5;56074:21;56071:2;;;56098:18;;:::i;:::-;56071:2;56145:1;56138:5;56134:13;56127:20;;56020:133;;;:::o;56159:100::-;;56227:26;56247:5;56227:26;:::i;:::-;56216:37;;56206:53;;;:::o;56265:79::-;;56333:5;56322:16;;56312:32;;;:::o;56350:94::-;;56418:20;56432:5;56418:20;:::i;:::-;56407:31;;56397:47;;;:::o;56450:79::-;;56518:5;56507:16;;56497:32;;;:::o;56535:94::-;;56602:21;56617:5;56602:21;:::i;:::-;56591:32;;56581:48;;;:::o;56635:180::-;56683:77;56680:1;56673:88;56780:4;56777:1;56770:15;56804:4;56801:1;56794:15;56821:180;56869:77;56866:1;56859:88;56966:4;56963:1;56956:15;56990:4;56987:1;56980:15;57007:180;57055:77;57052:1;57045:88;57152:4;57149:1;57142:15;57176:4;57173:1;57166:15;57193:102;;57285:2;57281:7;57276:2;57269:5;57265:14;57261:28;57251:38;;57241:54;;;:::o;57301:96::-;;57384:5;57379:3;57375:15;57354:36;;57344:53;;;:::o;57403:94::-;;57484:5;57480:2;57476:14;57455:35;;57445:52;;;:::o;57503:102::-;;57592:5;57589:1;57585:13;57564:34;;57554:51;;;:::o;57611:106::-;;57704:5;57699:3;57695:15;57674:36;;57664:53;;;:::o;57723:174::-;57863:26;57859:1;57851:6;57847:14;57840:50;57829:68;:::o;57903:221::-;58043:34;58039:1;58031:6;58027:14;58020:58;58112:4;58107:2;58099:6;58095:15;58088:29;58009:115;:::o;58130:222::-;58270:34;58266:1;58258:6;58254:14;58247:58;58339:5;58334:2;58326:6;58322:15;58315:30;58236:116;:::o;58358:226::-;58498:34;58494:1;58486:6;58482:14;58475:58;58567:9;58562:2;58554:6;58550:15;58543:34;58464:120;:::o;58590:240::-;58730:34;58726:1;58718:6;58714:14;58707:58;58799:23;58794:2;58786:6;58782:15;58775:48;58696:134;:::o;58836:168::-;58976:20;58972:1;58964:6;58960:14;58953:44;58942:62;:::o;59010:165::-;59150:17;59146:1;59138:6;59134:14;59127:41;59116:59;:::o;59181:165::-;59321:17;59317:1;59309:6;59305:14;59298:41;59287:59;:::o;59352:165::-;59492:17;59488:1;59480:6;59476:14;59469:41;59458:59;:::o;59523:230::-;59663:34;59659:1;59651:6;59647:14;59640:58;59732:13;59727:2;59719:6;59715:15;59708:38;59629:124;:::o;59759:173::-;59899:25;59895:1;59887:6;59883:14;59876:49;59865:67;:::o;59938:164::-;60078:16;60074:1;60066:6;60062:14;60055:40;60044:58;:::o;60108:225::-;60248:34;60244:1;60236:6;60232:14;60225:58;60317:8;60312:2;60304:6;60300:15;60293:33;60214:119;:::o;60339:221::-;60479:34;60475:1;60467:6;60463:14;60456:58;60548:4;60543:2;60535:6;60531:15;60524:29;60445:115;:::o;60566:162::-;60706:14;60702:1;60694:6;60690:14;60683:38;60672:56;:::o;60734:171::-;60874:23;60870:1;60862:6;60858:14;60851:47;60840:65;:::o;60911:170::-;61051:22;61047:1;61039:6;61035:14;61028:46;61017:64;:::o;61087:158::-;61227:10;61223:1;61215:6;61211:14;61204:34;61193:52;:::o;61251:230::-;61391:34;61387:1;61379:6;61375:14;61368:58;61460:13;61455:2;61447:6;61443:15;61436:38;61357:124;:::o;61487:167::-;61627:19;61623:1;61615:6;61611:14;61604:43;61593:61;:::o;61660:167::-;61800:19;61796:1;61788:6;61784:14;61777:43;61766:61;:::o;61833:158::-;61973:10;61969:1;61961:6;61957:14;61950:34;61939:52;:::o;61997:172::-;62137:24;62133:1;62125:6;62121:14;62114:48;62103:66;:::o;62175:162::-;62315:14;62311:1;62303:6;62299:14;62292:38;62281:56;:::o;62343:179::-;62483:31;62479:1;62471:6;62467:14;62460:55;62449:73;:::o;62528:243::-;62668:34;62664:1;62656:6;62652:14;62645:58;62737:26;62732:2;62724:6;62720:15;62713:51;62634:137;:::o;62777:222::-;62917:34;62913:1;62905:6;62901:14;62894:58;62986:5;62981:2;62973:6;62969:15;62962:30;62883:116;:::o;63005:166::-;63145:18;63141:1;63133:6;63129:14;63122:42;63111:60;:::o;63177:163::-;63317:15;63313:1;63305:6;63301:14;63294:39;63283:57;:::o;63346:229::-;63486:34;63482:1;63474:6;63470:14;63463:58;63555:12;63550:2;63542:6;63538:15;63531:37;63452:123;:::o;63581:167::-;63721:19;63717:1;63709:6;63705:14;63698:43;63687:61;:::o;63754:230::-;63894:34;63890:1;63882:6;63878:14;63871:58;63963:13;63958:2;63950:6;63946:15;63939:38;63860:124;:::o;63990:122::-;64063:24;64081:5;64063:24;:::i;:::-;64056:5;64053:35;64043:2;;64102:1;64099;64092:12;64043:2;64033:79;:::o;64118:116::-;64188:21;64203:5;64188:21;:::i;:::-;64181:5;64178:32;64168:2;;64224:1;64221;64214:12;64168:2;64158:76;:::o;64240:122::-;64313:24;64331:5;64313:24;:::i;:::-;64306:5;64303:35;64293:2;;64352:1;64349;64342:12;64293:2;64283:79;:::o;64368:122::-;64441:24;64459:5;64441:24;:::i;:::-;64434:5;64431:35;64421:2;;64480:1;64477;64470:12;64421:2;64411:79;:::o;64496:122::-;64569:24;64587:5;64569:24;:::i;:::-;64562:5;64559:35;64549:2;;64608:1;64605;64598:12;64549:2;64539:79;:::o
Swarm Source
ipfs://abec04e7d9691f60de44d91ac9eed4f21450b1a3ae2e6436074a0545fd556a50
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.