Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
Coinflip
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-05-31 */ // Sources flattened with hardhat v2.9.5 https://hardhat.org // File contracts/lib/reentrancyguard.sol // SPDX-License-Identifier: MIT // An example of a consumer contract that relies on a subscription for funding. pragma solidity 0.8.9; abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/lib/context.sol /** *Submitted for verification at polygonscan.com on 2022-02-19 */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File contracts/lib/ownable.sol /** *Submitted for verification at polygonscan.com on 2022-02-19 */ abstract contract Ownable is Context { address private _owner; mapping(address => bool) public games; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } function gameRole(address _sender) public view returns (bool) { return games[_sender]; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } modifier onlyGame() { require(gameRole(_msgSender()), "GameRole: caller is not the game"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function addGameRole(address _game) public virtual onlyOwner { require(_game != address(0), "GameRole: gameRole is the zero address"); games[_game] = true; } function removeGameRole(address _game) public virtual onlyOwner { games[_game] = false; } } // File contracts/lib/link.sol interface LinkTokenInterface { function allowance(address owner, address spender) external view returns (uint256 remaining); function approve(address spender, uint256 value) external returns (bool success); function balanceOf(address owner) external view returns (uint256 balance); function decimals() external view returns (uint8 decimalPlaces); function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); function increaseApproval(address spender, uint256 subtractedValue) external; function name() external view returns (string memory tokenName); function symbol() external view returns (string memory tokenSymbol); function totalSupply() external view returns (uint256 totalTokensIssued); function transfer(address to, uint256 value) external returns (bool success); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns (bool success); function transferFrom( address from, address to, uint256 value ) external returns (bool success); } // File contracts/lib/vrf.sol contract VRFRequestIDBase { /** * @notice returns the seed which is actually input to the VRF coordinator * * @dev To prevent repetition of VRF output due to repetition of the * @dev user-supplied seed, that seed is combined in a hash with the * @dev user-specific nonce, and the address of the consuming contract. The * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in * @dev the final seed, but the nonce does protect against repetition in * @dev requests which are included in a single block. * * @param _userSeed VRF seed input provided by user * @param _requester Address of the requesting contract * @param _nonce User-specific nonce at the time of the request */ function makeVRFInputSeed( bytes32 _keyHash, uint256 _userSeed, address _requester, uint256 _nonce ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))); } /** * @notice Returns the id for this request * @param _keyHash The serviceAgreement ID to be used for this request * @param _vRFInputSeed The seed to be passed directly to the VRF * @return The id for this request * * @dev Note that _vRFInputSeed is not the seed passed by the consuming * @dev contract, but the one generated by makeVRFInputSeed */ function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed)); } } // File contracts/lib/vrfconsumer.sol abstract contract VRFConsumerBase is VRFRequestIDBase { /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBase expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomness the VRF output */ function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual; /** * @dev In order to keep backwards compatibility we have kept the user * seed field around. We remove the use of it because given that the blockhash * enters later, it overrides whatever randomness the used seed provides. * Given that it adds no security, and can easily lead to misunderstandings, * we have removed it from usage and can now provide a simpler API. */ uint256 private constant USER_SEED_PLACEHOLDER = 0; /** * @notice requestRandomness initiates a request for VRF output given _seed * * @dev The fulfillRandomness method receives the output, once it's provided * @dev by the Oracle, and verified by the vrfCoordinator. * * @dev The _keyHash must already be registered with the VRFCoordinator, and * @dev the _fee must exceed the fee specified during registration of the * @dev _keyHash. * * @dev The _seed parameter is vestigial, and is kept only for API * @dev compatibility with older versions. It can't *hurt* to mix in some of * @dev your own randomness, here, but it's not necessary because the VRF * @dev oracle will mix the hash of the block containing your request into the * @dev VRF seed it ultimately uses. * * @param _keyHash ID of public key against which randomness is generated * @param _fee The amount of LINK to send with the request * * @return requestId unique ID for this request * * @dev The returned requestId can be used to distinguish responses to * @dev concurrent requests. It is passed as the first argument to * @dev fulfillRandomness. */ function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) { LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); // This is the seed passed to VRFCoordinator. The oracle will mix this with // the hash of the block containing this request to obtain the seed/input // which is finally passed to the VRF cryptographic machinery. uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]); // nonces[_keyHash] must stay in sync with // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest). // This provides protection against the user repeating their input seed, // which would result in a predictable/duplicate output, if multiple such // requests appeared in the same block. nonces[_keyHash] = nonces[_keyHash] + 1; return makeRequestId(_keyHash, vRFSeed); } LinkTokenInterface internal immutable LINK; address private immutable vrfCoordinator; // Nonces for each VRF key from which randomness has been requested. // // Must stay in sync with VRFCoordinator[_keyHash][this] mapping(bytes32 => uint256) /* keyHash */ /* nonce */ private nonces; /** * @param _vrfCoordinator address of VRFCoordinator contract * @param _link address of LINK token contract * * @dev https://docs.chain.link/docs/link-token-contracts */ constructor(address _vrfCoordinator, address _link) { vrfCoordinator = _vrfCoordinator; LINK = LinkTokenInterface(_link); } // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external { require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill"); fulfillRandomness(requestId, randomness); } } // File contracts/lib/random.sol /** *Submitted for verification at polygonscan.com on 2022-02-19 */ abstract contract Random is Ownable, VRFConsumerBase { address public constant LINK_TOKEN = 0xb0897686c545045aFc77CF20eC7A532E3120E0F1; address public constant VRF_COORDINATOR = 0x3d2341ADb2D31f1c5530cDC622016af293177AE0; bytes32 public keyHash = 0xf86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da; uint public chainlinkFee = 0.0001 ether; constructor() VRFConsumerBase(VRF_COORDINATOR, LINK_TOKEN) {} function setKeyHash(bytes32 _keyHash) external onlyOwner { keyHash = _keyHash; } function setChainlinkFee(uint256 _chainlinkFee) external onlyOwner { chainlinkFee = _chainlinkFee; } function linkBalance() public view returns (uint256) { return LINK.balanceOf(address(this)); } function isEnoughLinkForBet() public view returns (bool) { return linkBalance() >= chainlinkFee; } } // File contracts/lib/address.sol /** *Submitted for verification at polygonscan.com on 2022-02-19 */ 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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev 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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/lib/ierc20.sol /** *Submitted for verification at polygonscan.com on 2022-02-19 */ 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @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); } // File contracts/lib/safeerc20.sol /** *Submitted for verification at polygonscan.com on 2022-02-19 */ 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' 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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/utils/[email protected] /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } contract Config { struct Token { string name; bool isLive; IERC20 tokenAddress; } struct TokenLTInfo { uint16 amount; uint16 unit; bool isExists; } mapping(string => Token) public tokenMap; mapping(string => uint128[]) public minBetAmounts; mapping(string => uint128[]) public maxBetAmounts; mapping(string => TokenLTInfo) public proportionLT; address private _owner; constructor() { _owner = msg.sender; } modifier onlyOwner() { require(_owner == msg.sender, "You are not an owner"); _; } // convert function convertKey(address _tokenAddress, string memory _game) internal pure returns (string memory) { string memory tokenString = Strings.toHexString( uint256(uint160(_tokenAddress)), 20 ); string memory key = string(abi.encodePacked(tokenString, _game)); return key; } function setProportion( IERC20 token, string memory game, uint16 amount, uint16 unit ) external onlyOwner { string memory key = convertKey(address(token), game); proportionLT[key] = TokenLTInfo({amount: amount, unit: unit, isExists: true}); } function setDefaultLimit( string memory game, string memory tokenString, IERC20 tokenAddress, uint128[] memory min, uint128[] memory max, uint8 unit ) external onlyOwner { for (uint8 i = 0; i < min.length; i++) { min[i] = uint128(min[i] * 10**unit); } for (uint8 i = 0; i < max.length; i++) { max[i] = uint128(max[i] * 10**unit); } string memory key = convertKey(address(tokenAddress), game); minBetAmounts[key] = min; maxBetAmounts[key] = max; if (!tokenMap[tokenString].isLive) { Token memory token = Token(tokenString, true, tokenAddress); tokenMap[tokenString] = token; } } function removeToken(string memory tokenString) external onlyOwner { if (tokenMap[tokenString].isLive) { tokenMap[tokenString].isLive = false; } } function getDefaultLimits( address tokenAddress, string memory game, uint8 index ) external view returns (uint128, uint128) { string memory key = convertKey(tokenAddress, game); return (minBetAmounts[key][index], maxBetAmounts[key][index]); } function getTokenAddress(string memory tokenString) external view returns (IERC20) { return tokenMap[tokenString].tokenAddress; } function getTokenIsLive(string memory tokenString) external view returns (bool) { return tokenMap[tokenString].isLive; } function calcLTCount( uint128 amount, string memory tokenString, string memory game ) external view returns (uint128) { if (tokenMap[tokenString].isLive) { IERC20 token = tokenMap[tokenString].tokenAddress; string memory key = convertKey(address(token), game); if (proportionLT[key].isExists) { return (amount * proportionLT[key].amount / proportionLT[key].unit); } else { return 0; } } else { return 0; } } } contract Agent is Ownable { Config public config; struct TokenLTInfo { uint16 amount; uint16 unit; bool isExists; } struct AgentInfo { uint32 agentID; address profitAddress; uint16 profitRate; bool isAlive; uint16 chargeRate; } mapping(string => uint256[]) public minBetAmounts; mapping(string => uint256[]) public maxBetAmounts; mapping(string => bool) public betLimits; mapping(uint32 => AgentInfo) public agents; mapping(string => TokenLTInfo) public proportionLT; mapping(address => bool) private addressAdmin; modifier admin() { addressAdmin[msg.sender] = true; require(addressAdmin[msg.sender] == true, "You are not an admin"); _; } event SetAgentInfoDone( uint32 agentID, address profitAddress, bool isAlive, uint16 chargeRate, uint16 profitRate ); event SetAgentGameLimitDone( uint32 agentID, address tokenAddress, uint256[] minBetAmount, uint256[] maxBetAmount ); function addAdmin(address _admin) public virtual onlyOwner { require(_admin != address(0), "Admin: admin is the zero address"); addressAdmin[_admin] = true; } function setConfig(address _address) external onlyOwner { config = Config(_address); } // convert function convertLimitKey( uint256 _agentID, address _tokenAddress, string memory _game ) internal pure returns (string memory) { string memory aid = Strings.toString(_agentID); string memory tokenString = Strings.toHexString( uint256(uint160(_tokenAddress)), 20 ); string memory key = string(abi.encodePacked(tokenString, aid, _game)); return key; } function getLimits( uint256 agentID, address tokenAddress, string memory game, uint8 index ) external view returns (uint256, uint256) { uint256 minBetAmount = 0; uint256 maxBetAmount = 0; string memory key = convertLimitKey(agentID, tokenAddress, game); if (betLimits[key]) { minBetAmount = minBetAmounts[key][index]; maxBetAmount = maxBetAmounts[key][index]; } else { (minBetAmount, maxBetAmount) = config.getDefaultLimits( tokenAddress, game, index ); } return (minBetAmount, maxBetAmount); } function setAgentInfo( uint32 _agentID, address _profitAddress, bool _isAlive, uint16 _chargeRate, uint16 _profitRate ) external admin { AgentInfo memory agent = AgentInfo({ agentID: _agentID, profitAddress: _profitAddress, isAlive: _isAlive, chargeRate: _chargeRate, profitRate: _profitRate }); agents[_agentID] = agent; emit SetAgentInfoDone( _agentID, _profitAddress, _isAlive, _chargeRate, _profitRate ); } function setAgentGameLimit( uint32 agentID, string memory game, address tokenAddress, uint256[] memory minBetAmount, uint256[] memory maxBetAmount ) external admin { string memory limitKey = convertLimitKey(agentID, tokenAddress, game); betLimits[limitKey] = true; minBetAmounts[limitKey] = minBetAmount; maxBetAmounts[limitKey] = maxBetAmount; emit SetAgentGameLimitDone( agentID, tokenAddress, minBetAmount, maxBetAmount ); } function chargeRate(uint32 agentID) external view returns (uint16) { AgentInfo memory agent = agents[agentID]; return agent.chargeRate; } function profitRate(uint32 agentID) external view returns (uint16) { AgentInfo memory agent = agents[agentID]; return agent.profitRate; } function profitAddress(uint32 agentID) external view returns (address) { AgentInfo memory agent = agents[agentID]; return agent.profitAddress; } function getTokenAddress(string memory tokenString) external view returns (IERC20) { return config.getTokenAddress(tokenString); } function calcLTCount( uint32 agentID, uint128 amount, string memory tokenString, string memory game ) external view returns (uint128) { bool isLive = config.getTokenIsLive(tokenString); if (isLive) { IERC20 token = config.getTokenAddress(tokenString); string memory key = convertLimitKey(agentID, address(token), game); if (proportionLT[key].isExists) { return proportionLT[key].amount * amount / proportionLT[key].unit; } else { return config.calcLTCount(amount, tokenString, game); } } else { return 0; } } function setProportion( IERC20 token, string memory game, uint32 agentID, uint16 amount, uint16 unit ) external onlyOwner { string memory key = convertLimitKey(agentID, address(token), game); proportionLT[key] = TokenLTInfo({amount: amount, unit: unit, isExists: true}); } } interface IHouse { function checkValidate( uint256 amount, IERC20 token ) external payable; function settleBet( address player, uint128 amount, uint128 charge, uint32 agentID, uint128 tokenLTReward, bool win, IERC20 token ) external; } abstract contract Manager is Ownable { using SafeERC20 for IERC20; IHouse house; Agent agent; // Variables bool public gameIsLive = false; address public houseAddress; mapping(bytes32 => uint256) public betMap; mapping(address => bool) public addressAdmin; constructor() { addressAdmin[owner()] = true; } modifier admin() { require(addressAdmin[msg.sender] == true, "You are not an admin"); _; } function toggleGameIsLive() external admin { gameIsLive = !gameIsLive; } // Methods function initializeHouse(address _address) external onlyOwner { houseAddress = _address; house = IHouse(_address); } function addAdmin(address _address) external onlyOwner { addressAdmin[_address] = true; } function removeAdmin(address _address) external onlyOwner { addressAdmin[_address] = false; } function withdrawCustomTokenFunds( address beneficiary, uint256 withdrawAmount, address token ) external onlyOwner { require( withdrawAmount <= IERC20(token).balanceOf(address(this)), "Withdrawal exceeds limit" ); IERC20(token).safeTransfer(beneficiary, withdrawAmount); } function setAgent(address _address) external onlyOwner { agent = Agent(_address); } } contract CoinflipBase is Manager { uint256 public maxCoinsBettable = 5; struct Bet { uint8 coins; uint40 choice; uint40 outcome; uint168 placeBlockNumber; uint128 amount; uint128 winAmount; address player; bool isSettled; string tokenString; uint32 agentID; uint256 randomNumber; uint128 tokenLTReward; } Bet[] public bets; function betsLength() external view returns (uint256) { return bets.length; } // Events event BetPlaced( uint256 indexed betId, address indexed player, uint256 amount, uint256 indexed coins, uint256 choice, string tokenString, uint32 agentID ); event BetSettled( uint256 indexed betId, address indexed player, uint256 amount, uint256 indexed coins, uint256 choice, uint256 outcome, uint256 winAmount, string tokenString, uint32 agentID, uint256 randomNumber, address houseAddress, uint128 tokenLTReward ); // Setter function setMaxCoinsBettable(uint256 _maxCoinsBettable) external admin { maxCoinsBettable = _maxCoinsBettable; } function calcWinAmountAndCharge( uint256 amount, uint8 coins, uint32 agentID ) internal view returns (uint128, uint128) { uint16 chargeRate = agent.chargeRate(agentID); uint128 totalWinAmount = uint128(amount * 2**coins - amount); uint128 charge = uint128((totalWinAmount * chargeRate) / 10000); return (uint128(amount + totalWinAmount - charge), uint128(charge)); } function placeBetBase( uint256 betChoice, uint8 coins, uint32 agentID, string memory tokenString, uint256 amount ) public payable returns (uint256) { require(gameIsLive, "Game is not live"); require( coins > 0 && coins <= maxCoinsBettable, "Coins not within range" ); require( betChoice >= 0 && betChoice < 2**coins, "Bet mask not in range" ); require(!Address.isContract(msg.sender), "Contract not allowed"); IERC20 tokenAddress = agent.getTokenAddress(tokenString); amount = address(tokenAddress) == address(0) ? msg.value : amount; (uint256 minBetAmount, uint256 maxBetAmount) = agent.getLimits( agentID, address(tokenAddress), "coinflip", coins - 1 ); require( amount >= minBetAmount && amount <= maxBetAmount, "Bet amount not within range" ); if (address(tokenAddress) == address(0)) { require( msg.sender.balance >= amount, "Your balance not enough" ); house.checkValidate{value: msg.value}( amount * 2**coins, tokenAddress ); } else { require( tokenAddress.balanceOf(msg.sender) >= amount, "Your token balance not enough" ); SafeERC20.safeTransferFrom(tokenAddress, msg.sender, houseAddress, amount); house.checkValidate(amount * 2**coins, tokenAddress); } uint256 betId = bets.length; emit BetPlaced( betId, msg.sender, amount, coins, betChoice, tokenString, agentID ); bets.push( Bet({ coins: uint8(coins), choice: uint40(betChoice), outcome: 0, placeBlockNumber: uint168(block.number), amount: uint128(amount), winAmount: 0, player: msg.sender, isSettled: false, tokenString: tokenString, agentID: agentID, randomNumber: 0, tokenLTReward: 0 }) ); return betId; } function settleBet(uint256 betId , uint256 randomNumber) internal virtual { Bet storage bet = bets[betId]; if (bet.amount == 0 || bet.isSettled == true) { return; } bet.outcome = uint40(randomNumber % (2**bet.coins)); uint128 charge = 0; if (bet.choice == bet.outcome) { (bet.winAmount, charge) = calcWinAmountAndCharge( bet.amount, bet.coins, bet.agentID ); } bet.isSettled = true; bet.randomNumber = randomNumber; bet.tokenLTReward = agent.calcLTCount(bet.agentID, bet.amount, bet.tokenString, "coinflip"); house.settleBet( bet.player, bet.winAmount, charge, bet.agentID, bet.tokenLTReward, bet.winAmount > 0, agent.getTokenAddress(bet.tokenString) ); emit BetSettled( betId, bet.player, bet.amount, bet.coins, bet.choice, bet.outcome, bet.winAmount, bet.tokenString, bet.agentID, bet.randomNumber, houseAddress, bet.tokenLTReward ); } } contract Coinflip is CoinflipBase, ReentrancyGuard, Random { function placeBet( uint256 betChoice, uint8 coins, uint32 agentID, string memory tokenString, uint256 amount ) external payable nonReentrant returns (uint256){ require(isEnoughLinkForBet(), "Insufficient LINK token"); uint256 betId = placeBetBase(betChoice, coins, agentID, tokenString, amount); bytes32 requestId = requestRandomness(keyHash, chainlinkFee); betMap[requestId] = betId; return betId; } // Callback function called by Chainlink VRF coordinator. function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override { settleBet(betMap[requestId], randomness); } // Function can only be called by fulfillRandomness function, which in turn can only be called by Chainlink VRF. function settleBet(uint256 betId, uint256 randomNumber) internal nonReentrant override { super.settleBet(betId, randomNumber); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"coins","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"choice","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenString","type":"string"},{"indexed":false,"internalType":"uint32","name":"agentID","type":"uint32"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"coins","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"choice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outcome","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winAmount","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenString","type":"string"},{"indexed":false,"internalType":"uint32","name":"agentID","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"randomNumber","type":"uint256"},{"indexed":false,"internalType":"address","name":"houseAddress","type":"address"},{"indexed":false,"internalType":"uint128","name":"tokenLTReward","type":"uint128"}],"name":"BetSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"LINK_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VRF_COORDINATOR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_game","type":"address"}],"name":"addGameRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"betMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bets","outputs":[{"internalType":"uint8","name":"coins","type":"uint8"},{"internalType":"uint40","name":"choice","type":"uint40"},{"internalType":"uint40","name":"outcome","type":"uint40"},{"internalType":"uint168","name":"placeBlockNumber","type":"uint168"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint128","name":"winAmount","type":"uint128"},{"internalType":"address","name":"player","type":"address"},{"internalType":"bool","name":"isSettled","type":"bool"},{"internalType":"string","name":"tokenString","type":"string"},{"internalType":"uint32","name":"agentID","type":"uint32"},{"internalType":"uint256","name":"randomNumber","type":"uint256"},{"internalType":"uint128","name":"tokenLTReward","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"betsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainlinkFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameIsLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"gameRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"games","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"initializeHouse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isEnoughLinkForBet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCoinsBettable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betChoice","type":"uint256"},{"internalType":"uint8","name":"coins","type":"uint8"},{"internalType":"uint32","name":"agentID","type":"uint32"},{"internalType":"string","name":"tokenString","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"placeBet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"betChoice","type":"uint256"},{"internalType":"uint8","name":"coins","type":"uint8"},{"internalType":"uint32","name":"agentID","type":"uint32"},{"internalType":"string","name":"tokenString","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"placeBetBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_game","type":"address"}],"name":"removeGameRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chainlinkFee","type":"uint256"}],"name":"setChainlinkFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"name":"setKeyHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxCoinsBettable","type":"uint256"}],"name":"setMaxCoinsBettable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleGameIsLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"withdrawCustomTokenFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000600360146101000a81548160ff02191690831515021790555060056007557ff86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da60001b600b55655af3107a4000600c553480156200006257600080fd5b50733d2341adb2d31f1c5530cdc622016af293177ae073b0897686c545045afc77cf20ec7a532e3120e0f1620000ad620000a16200018c60201b60201c565b6200019460201b60201c565b600160066000620000c36200025860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016009819055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000281565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60805160a051614c7e620002b560003960008181610f39015261240a015260008181611daf01526123ce0152614c7e6000f3fe6080604052600436106101e35760003560e01c8063a045a6fc11610102578063d414d0c211610095578063ed507d9811610064578063ed507d98146106ca578063eedac3a6146106f3578063f2fde38b1461071e578063fea8c7cd14610747576101e3565b8063d414d0c21461060c578063d7cee31e14610637578063e3db291414610662578063ed3b37231461068d576101e3565b8063bbd2e01e116100d1578063bbd2e01e14610550578063bcf685ed1461057b578063c26ecefa146105a4578063c2dc6591146105cf576101e3565b8063a045a6fc146104b7578063a284673f146104ce578063aa8f86a5146104f7578063b14c800914610527576101e3565b8063704802751161017a5780637ac98be1116101495780637ac98be11461040f5780638da5cb5b1461043a57806394985ddd14610465578063985447101461048e576101e3565b80637048027514610369578063715018a6146103925780637323b8fa146103a957806379131a19146103d2576101e3565b806319892b51116101b657806319892b511461029057806322af00fa146102b9578063265023061461030157806361728f391461033e576101e3565b806305f6a924146101e85780630b96c58d146102135780630e0284a41461023c5780631785f53c14610267575b600080fd5b3480156101f457600080fd5b506101fd610777565b60405161020a91906130dc565b60405180910390f35b34801561021f57600080fd5b5061023a60048036038101906102359190613137565b61078f565b005b34801561024857600080fd5b50610251610890565b60405161025e919061317d565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190613137565b610896565b005b34801561029c57600080fd5b506102b760048036038101906102b29190613137565b61096d565b005b3480156102c557600080fd5b506102e060048036038101906102db91906131c4565b610a44565b6040516102f89c9b9a9998979695949392919061335b565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613137565b610c1d565b604051610335919061341c565b60405180910390f35b34801561034a57600080fd5b50610353610c3d565b6040516103609190613450565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190613137565b610c43565b005b34801561039e57600080fd5b506103a7610d1a565b005b3480156103b557600080fd5b506103d060048036038101906103cb9190613137565b610da2565b005b3480156103de57600080fd5b506103f960048036038101906103f49190613137565b610ee8565b604051610406919061341c565b60405180910390f35b34801561041b57600080fd5b50610424610f08565b604051610431919061317d565b60405180910390f35b34801561044657600080fd5b5061044f610f0e565b60405161045c91906130dc565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190613497565b610f37565b005b34801561049a57600080fd5b506104b560048036038101906104b091906134d7565b610fd3565b005b3480156104c357600080fd5b506104cc611059565b005b3480156104da57600080fd5b506104f560048036038101906104f091906131c4565b611118565b005b610511600480360381019061050c9190613691565b61119e565b60405161051e919061317d565b60405180910390f35b34801561053357600080fd5b5061054e60048036038101906105499190613728565b611b67565b005b34801561055c57600080fd5b50610565611cde565b604051610572919061317d565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190613137565b611ceb565b005b3480156105b057600080fd5b506105b9611dab565b6040516105c6919061317d565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190613137565b611e5b565b604051610603919061341c565b60405180910390f35b34801561061857600080fd5b50610621611eb1565b60405161062e919061341c565b60405180910390f35b34801561064357600080fd5b5061064c611ec4565b60405161065991906130dc565b60405180910390f35b34801561066e57600080fd5b50610677611eea565b604051610684919061341c565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af91906134d7565b611efe565b6040516106c1919061317d565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec91906131c4565b611f16565b005b3480156106ff57600080fd5b50610708611fb3565b60405161071591906130dc565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190613137565b611fcb565b005b610761600480360381019061075c9190613691565b6120c3565b60405161076e919061317d565b60405180910390f35b733d2341adb2d31f1c5530cdc622016af293177ae081565b6107976121ab565b73ffffffffffffffffffffffffffffffffffffffff166107b5610f0e565b73ffffffffffffffffffffffffffffffffffffffff161461080b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610802906137c7565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b61089e6121ab565b73ffffffffffffffffffffffffffffffffffffffff166108bc610f0e565b73ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610909906137c7565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6109756121ab565b73ffffffffffffffffffffffffffffffffffffffff16610993610f0e565b73ffffffffffffffffffffffffffffffffffffffff16146109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e0906137c7565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60088181548110610a5457600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900460ff16908060000160019054906101000a900464ffffffffff16908060000160069054906101000a900464ffffffffff169080600001600b9054906101000a900474ffffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160149054906101000a900460ff1690806003018054610b5c90613816565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8890613816565b8015610bd55780601f10610baa57610100808354040283529160200191610bd5565b820191906000526020600020905b815481529060010190602001808311610bb857829003601f168201915b5050505050908060040160009054906101000a900463ffffffff16908060050154908060060160009054906101000a90046fffffffffffffffffffffffffffffffff1690508c565b60066020528060005260406000206000915054906101000a900460ff1681565b600b5481565b610c4b6121ab565b73ffffffffffffffffffffffffffffffffffffffff16610c69610f0e565b73ffffffffffffffffffffffffffffffffffffffff1614610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb6906137c7565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d226121ab565b73ffffffffffffffffffffffffffffffffffffffff16610d40610f0e565b73ffffffffffffffffffffffffffffffffffffffff1614610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d906137c7565b60405180910390fd5b610da060006121b3565b565b610daa6121ab565b73ffffffffffffffffffffffffffffffffffffffff16610dc8610f0e565b73ffffffffffffffffffffffffffffffffffffffff1614610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e15906137c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e85906138ba565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60016020528060005260406000206000915054906101000a900460ff1681565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90613926565b60405180910390fd5b610fcf8282612277565b5050565b610fdb6121ab565b73ffffffffffffffffffffffffffffffffffffffff16610ff9610f0e565b73ffffffffffffffffffffffffffffffffffffffff161461104f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611046906137c7565b60405180910390fd5b80600b8190555050565b60011515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390613992565b60405180910390fd5b600360149054906101000a900460ff1615600360146101000a81548160ff021916908315150217905550565b6111206121ab565b73ffffffffffffffffffffffffffffffffffffffff1661113e610f0e565b73ffffffffffffffffffffffffffffffffffffffff1614611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906137c7565b60405180910390fd5b80600c8190555050565b6000600360149054906101000a900460ff166111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e6906139fe565b60405180910390fd5b60008560ff1611801561120757506007548560ff1611155b611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d90613a6a565b60405180910390fd5b60008610158015611262575084600261125f9190613bec565b86105b6112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890613c83565b60405180910390fd5b6112aa33612298565b156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190613cef565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4091236856040518263ffffffff1660e01b81526004016113479190613d0f565b60206040518083038186803b15801561135f57600080fd5b505afa158015611373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113979190613d6f565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113d357826113d5565b345b9250600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166382e173f8888560018c6114279190613d9c565b6040518463ffffffff1660e01b815260040161144593929190613e57565b604080518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114949190613eb6565b915091508185101580156114a85750808511155b6114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613f42565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561162257843373ffffffffffffffffffffffffffffffffffffffff16311015611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90613fae565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d7dbccc348a60026115c29190613bec565b886115cd9190613fce565b866040518463ffffffff1660e01b81526004016115eb92919061407d565b6000604051808303818588803b15801561160457600080fd5b505af1158015611618573d6000803e3d6000fd5b50505050506117c2565b848373ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161165c91906130dc565b60206040518083038186803b15801561167457600080fd5b505afa158015611688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ac91906140a6565b10156116ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e49061411f565b60405180910390fd5b61171b8333600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886122bb565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636d7dbccc8960026117669190613bec565b876117719190613fce565b856040518363ffffffff1660e01b815260040161178f92919061407d565b600060405180830381600087803b1580156117a957600080fd5b505af11580156117bd573d6000803e3d6000fd5b505050505b600060088054905090508860ff163373ffffffffffffffffffffffffffffffffffffffff16827f927f67048335599eb1121d6d77e1fc544f0c2122408fa411a812583d1f023844898e8c8e60405161181d949392919061413f565b60405180910390a460086040518061018001604052808b60ff1681526020018c64ffffffffff168152602001600064ffffffffff1681526020014374ffffffffffffffffffffffffffffffffffffffffff168152602001886fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020018981526020018a63ffffffff1681526020016000815260200160006fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548164ffffffffff021916908364ffffffffff16021790555060408201518160000160066101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600001600b6101000a81548174ffffffffffffffffffffffffffffffffffffffffff021916908374ffffffffffffffffffffffffffffffffffffffffff16021790555060808201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060a08201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160020160146101000a81548160ff021916908315150217905550610100820151816003019080519060200190611ae1929190612ff8565b506101208201518160040160006101000a81548163ffffffff021916908363ffffffff16021790555061014082015181600501556101608201518160060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050508094505050505095945050505050565b611b6f6121ab565b73ffffffffffffffffffffffffffffffffffffffff16611b8d610f0e565b73ffffffffffffffffffffffffffffffffffffffff1614611be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bda906137c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c1c91906130dc565b60206040518083038186803b158015611c3457600080fd5b505afa158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c91906140a6565b821115611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca5906141d7565b60405180910390fd5b611cd983838373ffffffffffffffffffffffffffffffffffffffff166123449092919063ffffffff16565b505050565b6000600880549050905090565b611cf36121ab565b73ffffffffffffffffffffffffffffffffffffffff16611d11610f0e565b73ffffffffffffffffffffffffffffffffffffffff1614611d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5e906137c7565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e0691906130dc565b60206040518083038186803b158015611e1e57600080fd5b505afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5691906140a6565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600360149054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c54611ef7611dab565b1015905090565b60056020528060005260406000206000915090505481565b60011515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090613992565b60405180910390fd5b8060078190555050565b73b0897686c545045afc77cf20ec7a532e3120e0f181565b611fd36121ab565b73ffffffffffffffffffffffffffffffffffffffff16611ff1610f0e565b73ffffffffffffffffffffffffffffffffffffffff1614612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e906137c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90614269565b60405180910390fd5b6120c0816121b3565b50565b60006002600954141561210b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612102906142d5565b60405180910390fd5b600260098190555061211b611eea565b61215a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215190614341565b60405180910390fd5b6000612169878787878761119e565b9050600061217b600b54600c546123ca565b90508160056000838152602001908152602001600020819055508192505050600160098190555095945050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61229460056000848152602001908152602001600020548261252c565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61233e846323b872dd60e01b8585856040516024016122dc93929190614361565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612590565b50505050565b6123c58363a9059cbb60e01b8484604051602401612363929190614398565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612590565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f00000000000000000000000000000000000000000000000000000000000000008486600060405160200161243e9291906143c1565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161246b9392919061443f565b602060405180830381600087803b15801561248557600080fd5b505af1158015612499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bd91906144a9565b5060006124e084600030600a600089815260200190815260200160002054612657565b90506001600a60008681526020019081526020016000205461250291906144d6565b600a6000868152602001908152602001600020819055506125238482612693565b91505092915050565b60026009541415612572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612569906142d5565b60405180910390fd5b600260098190555061258482826126c6565b60016009819055505050565b60006125f2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d209092919063ffffffff16565b9050600081511115612652578080602001905181019061261291906144a9565b612651576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126489061459e565b60405180910390fd5b5b505050565b60008484848460405160200161267094939291906145be565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016126a8929190614645565b60405160208183030381529060405280519060200120905092915050565b6000600883815481106126dc576126db614671565b5b9060005260206000209060070201905060008160010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1614806127425750600115158160020160149054906101000a900460ff161515145b1561274d5750612d1c565b8060000160009054906101000a900460ff16600261276b9190613bec565b8261277691906146cf565b8160000160066101000a81548164ffffffffff021916908364ffffffffff16021790555060008160000160069054906101000a900464ffffffffff1664ffffffffff168260000160019054906101000a900464ffffffffff1664ffffffffff1614156128815761283e8260010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168360000160009054906101000a900460ff168460040160009054906101000a900463ffffffff16612d38565b8360010160108294508391906101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050505b60018260020160146101000a81548160ff021916908315150217905550828260050181905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166395de77758360040160009054906101000a900463ffffffff168460010160009054906101000a90046fffffffffffffffffffffffffffffffff16856003016040518463ffffffff1660e01b815260040161293d93929190614795565b60206040518083038186803b15801561295557600080fd5b505afa158015612969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298d9190614812565b8260060160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e8ed7778360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff16848660040160009054906101000a900463ffffffff168760060160009054906101000a90046fffffffffffffffffffffffffffffffff1660008960010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1611600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c40912368b6003016040518263ffffffff1660e01b8152600401612b16919061483f565b60206040518083038186803b158015612b2e57600080fd5b505afa158015612b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b669190613d6f565b6040518863ffffffff1660e01b8152600401612b889796959493929190614861565b600060405180830381600087803b158015612ba257600080fd5b505af1158015612bb6573d6000803e3d6000fd5b505050508160000160009054906101000a900460ff1660ff168260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16857fb46c69caf61fa858a83f8e7901a5b55811215e846a8aa9457da5e30db5c868658560010160009054906101000a90046fffffffffffffffffffffffffffffffff168660000160019054906101000a900464ffffffffff168760000160069054906101000a900464ffffffffff168860010160109054906101000a90046fffffffffffffffffffffffffffffffff16896003018a60040160009054906101000a900463ffffffff168b60050154600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d60060160009054906101000a90046fffffffffffffffffffffffffffffffff16604051612d1199989796959493929190614932565b60405180910390a450505b5050565b6060612d2f8484600085612e7d565b90509392505050565b6000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d7922d50856040518263ffffffff1660e01b8152600401612d9891906149c6565b60206040518083038186803b158015612db057600080fd5b505afa158015612dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de89190614a1b565b9050600086866002612dfa9190613bec565b88612e059190613fce565b612e0f9190614a48565b905060006127108361ffff1683612e269190614a7c565b612e309190614ac6565b9050806fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1689612e6391906144d6565b612e6d9190614a48565b8194509450505050935093915050565b606082471015612ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb990614b69565b60405180910390fd5b612ecb85612298565b612f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0190614bd5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f339190614c31565b60006040518083038185875af1925050503d8060008114612f70576040519150601f19603f3d011682016040523d82523d6000602084013e612f75565b606091505b5091509150612f85828286612f91565b92505050949350505050565b60608315612fa157829050612ff1565b600083511115612fb45782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe89190613d0f565b60405180910390fd5b9392505050565b82805461300490613816565b90600052602060002090601f016020900481019282613026576000855561306d565b82601f1061303f57805160ff191683800117855561306d565b8280016001018555821561306d579182015b8281111561306c578251825591602001919060010190613051565b5b50905061307a919061307e565b5090565b5b8082111561309757600081600090555060010161307f565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130c68261309b565b9050919050565b6130d6816130bb565b82525050565b60006020820190506130f160008301846130cd565b92915050565b6000604051905090565b600080fd5b600080fd5b613114816130bb565b811461311f57600080fd5b50565b6000813590506131318161310b565b92915050565b60006020828403121561314d5761314c613101565b5b600061315b84828501613122565b91505092915050565b6000819050919050565b61317781613164565b82525050565b6000602082019050613192600083018461316e565b92915050565b6131a181613164565b81146131ac57600080fd5b50565b6000813590506131be81613198565b92915050565b6000602082840312156131da576131d9613101565b5b60006131e8848285016131af565b91505092915050565b600060ff82169050919050565b613207816131f1565b82525050565b600064ffffffffff82169050919050565b6132278161320d565b82525050565b600074ffffffffffffffffffffffffffffffffffffffffff82169050919050565b6132578161322d565b82525050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6132828161325d565b82525050565b60008115159050919050565b61329d81613288565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132dd5780820151818401526020810190506132c2565b838111156132ec576000848401525b50505050565b6000601f19601f8301169050919050565b600061330e826132a3565b61331881856132ae565b93506133288185602086016132bf565b613331816132f2565b840191505092915050565b600063ffffffff82169050919050565b6133558161333c565b82525050565b600061018082019050613371600083018f6131fe565b61337e602083018e61321e565b61338b604083018d61321e565b613398606083018c61324e565b6133a5608083018b613279565b6133b260a083018a613279565b6133bf60c08301896130cd565b6133cc60e0830188613294565b8181036101008301526133df8187613303565b90506133ef61012083018661334c565b6133fd61014083018561316e565b61340b610160830184613279565b9d9c50505050505050505050505050565b60006020820190506134316000830184613294565b92915050565b6000819050919050565b61344a81613437565b82525050565b60006020820190506134656000830184613441565b92915050565b61347481613437565b811461347f57600080fd5b50565b6000813590506134918161346b565b92915050565b600080604083850312156134ae576134ad613101565b5b60006134bc85828601613482565b92505060206134cd858286016131af565b9150509250929050565b6000602082840312156134ed576134ec613101565b5b60006134fb84828501613482565b91505092915050565b61350d816131f1565b811461351857600080fd5b50565b60008135905061352a81613504565b92915050565b6135398161333c565b811461354457600080fd5b50565b60008135905061355681613530565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61359e826132f2565b810181811067ffffffffffffffff821117156135bd576135bc613566565b5b80604052505050565b60006135d06130f7565b90506135dc8282613595565b919050565b600067ffffffffffffffff8211156135fc576135fb613566565b5b613605826132f2565b9050602081019050919050565b82818337600083830152505050565b600061363461362f846135e1565b6135c6565b9050828152602081018484840111156136505761364f613561565b5b61365b848285613612565b509392505050565b600082601f8301126136785761367761355c565b5b8135613688848260208601613621565b91505092915050565b600080600080600060a086880312156136ad576136ac613101565b5b60006136bb888289016131af565b95505060206136cc8882890161351b565b94505060406136dd88828901613547565b935050606086013567ffffffffffffffff8111156136fe576136fd613106565b5b61370a88828901613663565b925050608061371b888289016131af565b9150509295509295909350565b60008060006060848603121561374157613740613101565b5b600061374f86828701613122565b9350506020613760868287016131af565b925050604061377186828701613122565b9150509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137b16020836132ae565b91506137bc8261377b565b602082019050919050565b600060208201905081810360008301526137e0816137a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061382e57607f821691505b60208210811415613842576138416137e7565b5b50919050565b7f47616d65526f6c653a2067616d65526f6c6520697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138a46026836132ae565b91506138af82613848565b604082019050919050565b600060208201905081810360008301526138d381613897565b9050919050565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b6000613910601f836132ae565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f596f7520617265206e6f7420616e2061646d696e000000000000000000000000600082015250565b600061397c6014836132ae565b915061398782613946565b602082019050919050565b600060208201905081810360008301526139ab8161396f565b9050919050565b7f47616d65206973206e6f74206c69766500000000000000000000000000000000600082015250565b60006139e86010836132ae565b91506139f3826139b2565b602082019050919050565b60006020820190508181036000830152613a17816139db565b9050919050565b7f436f696e73206e6f742077697468696e2072616e676500000000000000000000600082015250565b6000613a546016836132ae565b9150613a5f82613a1e565b602082019050919050565b60006020820190508181036000830152613a8381613a47565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115613b1057808604811115613aec57613aeb613a8a565b5b6001851615613afb5780820291505b8081029050613b0985613ab9565b9450613ad0565b94509492505050565b600082613b295760019050613be5565b81613b375760009050613be5565b8160018114613b4d5760028114613b5757613b86565b6001915050613be5565b60ff841115613b6957613b68613a8a565b5b8360020a915084821115613b8057613b7f613a8a565b5b50613be5565b5060208310610133831016604e8410600b8410161715613bbb5782820a905083811115613bb657613bb5613a8a565b5b613be5565b613bc88484846001613ac6565b92509050818404811115613bdf57613bde613a8a565b5b81810290505b9392505050565b6000613bf782613164565b9150613c02836131f1565b9250613c2f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b19565b905092915050565b7f426574206d61736b206e6f7420696e2072616e67650000000000000000000000600082015250565b6000613c6d6015836132ae565b9150613c7882613c37565b602082019050919050565b60006020820190508181036000830152613c9c81613c60565b9050919050565b7f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000600082015250565b6000613cd96014836132ae565b9150613ce482613ca3565b602082019050919050565b60006020820190508181036000830152613d0881613ccc565b9050919050565b60006020820190508181036000830152613d298184613303565b905092915050565b6000613d3c826130bb565b9050919050565b613d4c81613d31565b8114613d5757600080fd5b50565b600081519050613d6981613d43565b92915050565b600060208284031215613d8557613d84613101565b5b6000613d9384828501613d5a565b91505092915050565b6000613da7826131f1565b9150613db2836131f1565b925082821015613dc557613dc4613a8a565b5b828203905092915050565b6000819050919050565b6000613df5613df0613deb8461333c565b613dd0565b613164565b9050919050565b613e0581613dda565b82525050565b7f636f696e666c6970000000000000000000000000000000000000000000000000600082015250565b6000613e416008836132ae565b9150613e4c82613e0b565b602082019050919050565b6000608082019050613e6c6000830186613dfc565b613e7960208301856130cd565b8181036040830152613e8a81613e34565b9050613e9960608301846131fe565b949350505050565b600081519050613eb081613198565b92915050565b60008060408385031215613ecd57613ecc613101565b5b6000613edb85828601613ea1565b9250506020613eec85828601613ea1565b9150509250929050565b7f42657420616d6f756e74206e6f742077697468696e2072616e67650000000000600082015250565b6000613f2c601b836132ae565b9150613f3782613ef6565b602082019050919050565b60006020820190508181036000830152613f5b81613f1f565b9050919050565b7f596f75722062616c616e6365206e6f7420656e6f756768000000000000000000600082015250565b6000613f986017836132ae565b9150613fa382613f62565b602082019050919050565b60006020820190508181036000830152613fc781613f8b565b9050919050565b6000613fd982613164565b9150613fe483613164565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561401d5761401c613a8a565b5b828202905092915050565b600061404361403e6140398461309b565b613dd0565b61309b565b9050919050565b600061405582614028565b9050919050565b60006140678261404a565b9050919050565b6140778161405c565b82525050565b6000604082019050614092600083018561316e565b61409f602083018461406e565b9392505050565b6000602082840312156140bc576140bb613101565b5b60006140ca84828501613ea1565b91505092915050565b7f596f757220746f6b656e2062616c616e6365206e6f7420656e6f756768000000600082015250565b6000614109601d836132ae565b9150614114826140d3565b602082019050919050565b60006020820190508181036000830152614138816140fc565b9050919050565b6000608082019050614154600083018761316e565b614161602083018661316e565b81810360408301526141738185613303565b9050614182606083018461334c565b95945050505050565b7f5769746864726177616c2065786365656473206c696d69740000000000000000600082015250565b60006141c16018836132ae565b91506141cc8261418b565b602082019050919050565b600060208201905081810360008301526141f0816141b4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142536026836132ae565b915061425e826141f7565b604082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006142bf601f836132ae565b91506142ca82614289565b602082019050919050565b600060208201905081810360008301526142ee816142b2565b9050919050565b7f496e73756666696369656e74204c494e4b20746f6b656e000000000000000000600082015250565b600061432b6017836132ae565b9150614336826142f5565b602082019050919050565b6000602082019050818103600083015261435a8161431e565b9050919050565b600060608201905061437660008301866130cd565b61438360208301856130cd565b614390604083018461316e565b949350505050565b60006040820190506143ad60008301856130cd565b6143ba602083018461316e565b9392505050565b60006040820190506143d66000830185613441565b6143e3602083018461316e565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000614411826143ea565b61441b81856143f5565b935061442b8185602086016132bf565b614434816132f2565b840191505092915050565b600060608201905061445460008301866130cd565b614461602083018561316e565b81810360408301526144738184614406565b9050949350505050565b61448681613288565b811461449157600080fd5b50565b6000815190506144a38161447d565b92915050565b6000602082840312156144bf576144be613101565b5b60006144cd84828501614494565b91505092915050565b60006144e182613164565b91506144ec83613164565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561452157614520613a8a565b5b828201905092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614588602a836132ae565b91506145938261452c565b604082019050919050565b600060208201905081810360008301526145b78161457b565b9050919050565b60006080820190506145d36000830187613441565b6145e0602083018661316e565b6145ed60408301856130cd565b6145fa606083018461316e565b95945050505050565b6000819050919050565b61461e61461982613437565b614603565b82525050565b6000819050919050565b61463f61463a82613164565b614624565b82525050565b6000614651828561460d565b602082019150614661828461462e565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146da82613164565b91506146e583613164565b9250826146f5576146f46146a0565b5b828206905092915050565b60008190508160005260206000209050919050565b6000815461472281613816565b61472c81866132ae565b9450600182166000811461474757600181146147595761478c565b60ff198316865260208601935061478c565b61476285614700565b60005b8381101561478457815481890152600182019150602081019050614765565b808801955050505b50505092915050565b60006080820190506147aa600083018661334c565b6147b76020830185613279565b81810360408301526147c98184614715565b905081810360608301526147dc81613e34565b9050949350505050565b6147ef8161325d565b81146147fa57600080fd5b50565b60008151905061480c816147e6565b92915050565b60006020828403121561482857614827613101565b5b6000614836848285016147fd565b91505092915050565b600060208201905081810360008301526148598184614715565b905092915050565b600060e082019050614876600083018a6130cd565b6148836020830189613279565b6148906040830188613279565b61489d606083018761334c565b6148aa6080830186613279565b6148b760a0830185613294565b6148c460c083018461406e565b98975050505050505050565b60006148eb6148e66148e18461325d565b613dd0565b613164565b9050919050565b6148fb816148d0565b82525050565b600061491c6149176149128461320d565b613dd0565b613164565b9050919050565b61492c81614901565b82525050565b600061012082019050614948600083018c6148f2565b614955602083018b614923565b614962604083018a614923565b61496f60608301896148f2565b81810360808301526149818188614715565b905061499060a083018761334c565b61499d60c083018661316e565b6149aa60e08301856130cd565b6149b8610100830184613279565b9a9950505050505050505050565b60006020820190506149db600083018461334c565b92915050565b600061ffff82169050919050565b6149f8816149e1565b8114614a0357600080fd5b50565b600081519050614a15816149ef565b92915050565b600060208284031215614a3157614a30613101565b5b6000614a3f84828501614a06565b91505092915050565b6000614a5382613164565b9150614a5e83613164565b925082821015614a7157614a70613a8a565b5b828203905092915050565b6000614a878261325d565b9150614a928361325d565b9250816fffffffffffffffffffffffffffffffff0483118215151615614abb57614aba613a8a565b5b828202905092915050565b6000614ad18261325d565b9150614adc8361325d565b925082614aec57614aeb6146a0565b5b828204905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614b536026836132ae565b9150614b5e82614af7565b604082019050919050565b60006020820190508181036000830152614b8281614b46565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614bbf601d836132ae565b9150614bca82614b89565b602082019050919050565b60006020820190508181036000830152614bee81614bb2565b9050919050565b600081905092915050565b6000614c0b826143ea565b614c158185614bf5565b9350614c258185602086016132bf565b80840191505092915050565b6000614c3d8284614c00565b91508190509291505056fea2646970667358221220bd2325548b6629f5e2a71e86247dc17827eba3352f3f04ef18be6eb4da20a28864736f6c63430008090033
Deployed ByteCode Sourcemap
46681:1116:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12588:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40206:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41095:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40464:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4903:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41492:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;39851:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12679:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40353:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3896;;;;;;;;;;;;;:::i;:::-;;4714:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2626:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12777:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3009:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12113:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12894:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40096:86;;;;;;;;;;;;;:::i;:::-;;12996:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42841:2485;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40579:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41518:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40949:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13118:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3104:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39730:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39767:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13234:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39803:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42260:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12502:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4154:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46747:500;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12588:84;12630:42;12588:84;:::o;40206:139::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40294:8:::1;40279:12;;:23;;;;;;;;;;;;;;;;;;40328:8;40313:5;;:24;;;;;;;;;;;;;;;;;;40206:139:::0;:::o;41095:35::-;;;;:::o;40464:107::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40558:5:::1;40533:12;:22;40546:8;40533:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;40464:107:::0;:::o;4903:103::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4993:5:::1;4978;:12;4984:5;4978:12;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4903:103:::0;:::o;41492:17::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39851:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;12679:91::-;;;;:::o;40353:103::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40444:4:::1;40419:12;:22;40432:8;40419:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40353:103:::0;:::o;3896:::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3961:30:::1;3988:1;3961:18;:30::i;:::-;3896:103::o:0;4714:181::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4811:1:::1;4794:19;;:5;:19;;;;4786:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;4883:4;4867:5:::0;:12:::1;4873:5;4867:12;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4714:181:::0;:::o;2626:37::-;;;;;;;;;;;;;;;;;;;;;;:::o;12777:39::-;;;;:::o;3009:87::-;3055:7;3082:6;;;;;;;;;;;3075:13;;3009:87;:::o;12113:210::-;12220:14;12206:28;;:10;:28;;;12198:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12277:40;12295:9;12306:10;12277:17;:40::i;:::-;12113:210;;:::o;12894:94::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12972:8:::1;12962:7;:18;;;;12894:94:::0;:::o;40096:86::-;40039:4;40011:32;;:12;:24;40024:10;40011:24;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;40003:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40164:10:::1;;;;;;;;;;;40163:11;40150:10;;:24;;;;;;;;;;;;;;;;;;40096:86::o:0;12996:114::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13089:13:::1;13074:12;:28;;;;12996:114:::0;:::o;42841:2485::-;43030:7;43058:10;;;;;;;;;;;43050:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;43130:1;43122:5;:9;;;:38;;;;;43144:16;;43135:5;:25;;;;43122:38;43100:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;43256:1;43243:9;:14;;:38;;;;;43276:5;43273:1;:8;;;;:::i;:::-;43261:9;:20;43243:38;43221:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;43350:30;43369:10;43350:18;:30::i;:::-;43349:31;43341:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43418:19;43440:5;;;;;;;;;;;:21;;;43462:11;43440:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43418:56;;43527:1;43494:35;;43502:12;43494:35;;;:56;;43544:6;43494:56;;;43532:9;43494:56;43485:65;;43562:20;43584;43608:5;;;;;;;;;;;:15;;;43638:7;43668:12;43729:1;43721:5;:9;;;;:::i;:::-;43608:133;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43561:180;;;;43784:12;43774:6;:22;;:48;;;;;43810:12;43800:6;:22;;43774:48;43752:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;43927:1;43894:35;;43902:12;43894:35;;;43890:639;;;43994:6;43972:10;:18;;;:28;;43946:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;44074:5;;;;;;;;;;;:19;;;44101:9;44142:5;44139:1;:8;;;;:::i;:::-;44130:6;:17;;;;:::i;:::-;44166:12;44074:119;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43890:639;;;44290:6;44252:12;:22;;;44275:10;44252:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;44226:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;44376:74;44403:12;44417:10;44429:12;;;;;;;;;;;44443:6;44376:26;:74::i;:::-;44465:5;;;;;;;;;;;:19;;;44497:5;44494:1;:8;;;;:::i;:::-;44485:6;:17;;;;:::i;:::-;44504:12;44465:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43890:639;44539:13;44555:4;:11;;;;44539:27;;44674:5;44584:178;;44628:10;44584:178;;44608:5;44584:178;44653:6;44694:9;44718:11;44744:7;44584:178;;;;;;;;;:::i;:::-;;;;;;;;44775:4;44799:481;;;;;;;;44835:5;44799:481;;;;;;44875:9;44799:481;;;;;;44913:1;44799:481;;;;;;44959:12;44799:481;;;;;;45007:6;44799:481;;;;;;45044:1;44799:481;;;;;;45072:10;44799:481;;;;;;45112:5;44799:481;;;;;;45149:11;44799:481;;;;45188:7;44799:481;;;;;;45228:1;44799:481;;;;45263:1;44799:481;;;;;44775:516;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45311:5;45304:12;;;;;;42841:2485;;;;;;;:::o;40579:362::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40784:5:::1;40777:23;;;40809:4;40777:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40759:14;:56;;40737:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;40878:55;40905:11;40918:14;40885:5;40878:26;;;;:55;;;;;:::i;:::-;40579:362:::0;;;:::o;41518:91::-;41563:7;41590:4;:11;;;;41583:18;;41518:91;:::o;40949:97::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41028:8:::1;41014:5;;:23;;;;;;;;;;;;;;;;;;40949:97:::0;:::o;13118:108::-;13162:7;13189:4;:14;;;13212:4;13189:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13182:36;;13118:108;:::o;3104:102::-;3160:4;3184:5;:14;3190:7;3184:14;;;;;;;;;;;;;;;;;;;;;;;;;3177:21;;3104:102;;;:::o;39730:30::-;;;;;;;;;;;;;:::o;39767:27::-;;;;;;;;;;;;;:::o;13234:112::-;13285:4;13326:12;;13309:13;:11;:13::i;:::-;:29;;13302:36;;13234:112;:::o;39803:41::-;;;;;;;;;;;;;;;;;:::o;42260:126::-;40039:4;40011:32;;:12;:24;40024:10;40011:24;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;40003:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42361:17:::1;42342:16;:36;;;;42260:126:::0;:::o;12502:79::-;12539:42;12502:79;:::o;4154:201::-;3350:12;:10;:12::i;:::-;3339:23;;:7;:5;:7::i;:::-;:23;;;3331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4263:1:::1;4243:22;;:8;:22;;;;4235:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4319:28;4338:8;4319:18;:28::i;:::-;4154:201:::0;:::o;46747:500::-;46947:7;1133:1;1731:7;;:19;;1723:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1133:1;1864:7;:18;;;;46974:20:::1;:18;:20::i;:::-;46966:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;47033:13;47049:60;47062:9;47073:5;47080:7;47089:11;47102:6;47049:12;:60::i;:::-;47033:76;;47120:17;47140:40;47158:7;;47167:12;;47140:17;:40::i;:::-;47120:60;;47211:5;47191:6;:17;47198:9;47191:17;;;;;;;;;;;:25;;;;47234:5;47227:12;;;;1089:1:::0;2043:7;:22;;;;46747:500;;;;;;;:::o;2226:98::-;2279:7;2306:10;2299:17;;2226:98;:::o;4515:191::-;4589:16;4608:6;;;;;;;;;;;4589:25;;4634:8;4625:6;;:17;;;;;;;;;;;;;;;;;;4689:8;4658:40;;4679:8;4658:40;;;;;;;;;;;;4578:128;4515:191;:::o;47318:176::-;47446:40;47456:6;:17;47463:9;47456:17;;;;;;;;;;;;47475:10;47446:9;:40::i;:::-;47318:176;;:::o;14474:326::-;14534:4;14791:1;14769:7;:19;;;:23;14762:30;;14474:326;;;:::o;24890:248::-;25034:96;25054:5;25084:27;;;25113:4;25119:2;25123:5;25061:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25034:19;:96::i;:::-;24890:248;;;;:::o;24671:211::-;24788:86;24808:5;24838:23;;;24863:2;24867:5;24815:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24788:19;:86::i;:::-;24671:211;;;:::o;10230:1034::-;10307:17;10333:4;:20;;;10354:14;10370:4;10387:8;9060:1;10376:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10333:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10655:15;10673:82;10690:8;9060:1;10731:4;10738:6;:16;10745:8;10738:16;;;;;;;;;;;;10673;:82::i;:::-;10655:100;;11211:1;11192:6;:16;11199:8;11192:16;;;;;;;;;;;;:20;;;;:::i;:::-;11173:6;:16;11180:8;11173:16;;;;;;;;;;;:39;;;;11226:32;11240:8;11250:7;11226:13;:32::i;:::-;11219:39;;;10230:1034;;;;:::o;47620:174::-;1133:1;1731:7;;:19;;1723:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1133:1;1864:7;:18;;;;47750:36:::1;47766:5;47773:12;47750:15;:36::i;:::-;1089:1:::0;2043:7;:22;;;;47620:174;;:::o;27244:716::-;27668:23;27694:69;27722:4;27694:69;;;;;;;;;;;;;;;;;27702:5;27694:27;;;;:69;;;;;:::i;:::-;27668:95;;27798:1;27778:10;:17;:21;27774:179;;;27875:10;27864:30;;;;;;;;;;;;:::i;:::-;27856:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27774:179;27314:646;27244:716;;:::o;6951:247::-;7098:7;7150:8;7160:9;7171:10;7183:6;7139:51;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7129:62;;;;;;7121:71;;7114:78;;6951:247;;;;;;:::o;7589:168::-;7676:7;7726:8;7736:13;7709:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7699:52;;;;;;7692:59;;7589:168;;;;:::o;45334:1340::-;45442:15;45460:4;45465:5;45460:11;;;;;;;;:::i;:::-;;;;;;;;;;;;45442:29;;45502:1;45488:3;:10;;;;;;;;;;;;:15;;;:40;;;;45524:4;45507:21;;:3;:13;;;;;;;;;;;;:21;;;45488:40;45484:79;;;45545:7;;;45484:79;45615:3;:9;;;;;;;;;;;;45612:1;:12;;;;:::i;:::-;45596;:29;;;;:::i;:::-;45575:3;:11;;;:51;;;;;;;;;;;;;;;;;;45639:14;45686:3;:11;;;;;;;;;;;;45672:25;;:3;:10;;;;;;;;;;;;:25;;;45668:208;;;45740:124;45781:3;:10;;;;;;;;;;;;45740:124;;45810:3;:9;;;;;;;;;;;;45838:3;:11;;;;;;;;;;;;45740:22;:124::i;:::-;45715:3;:13;;;45714:150;;;;;;;;;;;;;;;;;;;;;;;;;;45668:208;45904:4;45888:3;:13;;;:20;;;;;;;;;;;;;;;;;;45938:12;45919:3;:16;;:31;;;;45983:5;;;;;;;;;;;:17;;;46001:3;:11;;;;;;;;;;;;46014:3;:10;;;;;;;;;;;;46026:3;:15;;45983:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45963:3;:17;;;:91;;;;;;;;;;;;;;;;;;46065:5;;;;;;;;;;;:15;;;46095:3;:10;;;;;;;;;;;;46120:3;:13;;;;;;;;;;;;46148:6;46169:3;:11;;;;;;;;;;;;46195:3;:17;;;;;;;;;;;;46243:1;46227:3;:13;;;;;;;;;;;;:17;;;46259:5;;;;;;;;;;;:21;;;46281:3;:15;;46259:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46065:243;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46421:3;:9;;;;;;;;;;;;46326:340;;46371:3;:10;;;;;;;;;;;;46326:340;;46351:5;46326:340;46396:3;:10;;;;;;;;;;;;46445:3;:10;;;;;;;;;;;;46470:3;:11;;;;;;;;;;;;46496:3;:13;;;;;;;;;;;;46524:3;:15;;46554:3;:11;;;;;;;;;;;;46580:3;:16;;;46611:12;;;;;;;;;;;46638:3;:17;;;;;;;;;;;;46326:340;;;;;;;;;;;;;;:::i;:::-;;;;;;;;45431:1243;;45334:1340;;;:::o;17219:229::-;17356:12;17388:52;17410:6;17418:4;17424:1;17427:12;17388:21;:52::i;:::-;17381:59;;17219:229;;;;;:::o;42394:439::-;42528:7;42537;42557:17;42577:5;;;;;;;;;;;:16;;;42594:7;42577:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42557:45;;42613:22;42666:6;42658:5;42655:1;:8;;;;:::i;:::-;42646:6;:17;;;;:::i;:::-;:26;;;;:::i;:::-;42613:60;;42684:14;42741:5;42727:10;42710:27;;:14;:27;;;;:::i;:::-;42709:37;;;;:::i;:::-;42684:63;;42800:6;42774:32;;42783:14;42774:23;;:6;:23;;;;:::i;:::-;:32;;;;:::i;:::-;42817:6;42758:67;;;;;;;42394:439;;;;;;:::o;18339:510::-;18509:12;18567:5;18542:21;:30;;18534:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;18634:18;18645:6;18634:10;:18::i;:::-;18626:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;18700:12;18714:23;18741:6;:11;;18760:5;18767:4;18741:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18699:73;;;;18790:51;18807:7;18816:10;18828:12;18790:16;:51::i;:::-;18783:58;;;;18339:510;;;;;;:::o;21025:712::-;21175:12;21204:7;21200:530;;;21235:10;21228:17;;;;21200:530;21369:1;21349:10;:17;:21;21345:374;;;21547:10;21541:17;21608:15;21595:10;21591:2;21587:19;21580:44;21345:374;21690:12;21683:20;;;;;;;;;;;:::i;:::-;;;;;;;;21025:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:75::-;626:6;659:2;653:9;643:19;;593:75;:::o;674:117::-;783:1;780;773:12;797:117;906:1;903;896:12;920:122;993:24;1011:5;993:24;:::i;:::-;986:5;983:35;973:63;;1032:1;1029;1022:12;973:63;920:122;:::o;1048:139::-;1094:5;1132:6;1119:20;1110:29;;1148:33;1175:5;1148:33;:::i;:::-;1048:139;;;;:::o;1193:329::-;1252:6;1301:2;1289:9;1280:7;1276:23;1272:32;1269:119;;;1307:79;;:::i;:::-;1269:119;1427:1;1452:53;1497:7;1488:6;1477:9;1473:22;1452:53;:::i;:::-;1442:63;;1398:117;1193:329;;;;:::o;1528:77::-;1565:7;1594:5;1583:16;;1528:77;;;:::o;1611:118::-;1698:24;1716:5;1698:24;:::i;:::-;1693:3;1686:37;1611:118;;:::o;1735:222::-;1828:4;1866:2;1855:9;1851:18;1843:26;;1879:71;1947:1;1936:9;1932:17;1923:6;1879:71;:::i;:::-;1735:222;;;;:::o;1963:122::-;2036:24;2054:5;2036:24;:::i;:::-;2029:5;2026:35;2016:63;;2075:1;2072;2065:12;2016:63;1963:122;:::o;2091:139::-;2137:5;2175:6;2162:20;2153:29;;2191:33;2218:5;2191:33;:::i;:::-;2091:139;;;;:::o;2236:329::-;2295:6;2344:2;2332:9;2323:7;2319:23;2315:32;2312:119;;;2350:79;;:::i;:::-;2312:119;2470:1;2495:53;2540:7;2531:6;2520:9;2516:22;2495:53;:::i;:::-;2485:63;;2441:117;2236:329;;;;:::o;2571:86::-;2606:7;2646:4;2639:5;2635:16;2624:27;;2571:86;;;:::o;2663:112::-;2746:22;2762:5;2746:22;:::i;:::-;2741:3;2734:35;2663:112;;:::o;2781:95::-;2817:7;2857:12;2850:5;2846:24;2835:35;;2781:95;;;:::o;2882:115::-;2967:23;2984:5;2967:23;:::i;:::-;2962:3;2955:36;2882:115;;:::o;3003:128::-;3040:7;3080:44;3073:5;3069:56;3058:67;;3003:128;;;:::o;3137:118::-;3224:24;3242:5;3224:24;:::i;:::-;3219:3;3212:37;3137:118;;:::o;3261:::-;3298:7;3338:34;3331:5;3327:46;3316:57;;3261:118;;;:::o;3385:::-;3472:24;3490:5;3472:24;:::i;:::-;3467:3;3460:37;3385:118;;:::o;3509:90::-;3543:7;3586:5;3579:13;3572:21;3561:32;;3509:90;;;:::o;3605:109::-;3686:21;3701:5;3686:21;:::i;:::-;3681:3;3674:34;3605:109;;:::o;3720:99::-;3772:6;3806:5;3800:12;3790:22;;3720:99;;;:::o;3825:169::-;3909:11;3943:6;3938:3;3931:19;3983:4;3978:3;3974:14;3959:29;;3825:169;;;;:::o;4000:307::-;4068:1;4078:113;4092:6;4089:1;4086:13;4078:113;;;4177:1;4172:3;4168:11;4162:18;4158:1;4153:3;4149:11;4142:39;4114:2;4111:1;4107:10;4102:15;;4078:113;;;4209:6;4206:1;4203:13;4200:101;;;4289:1;4280:6;4275:3;4271:16;4264:27;4200:101;4049:258;4000:307;;;:::o;4313:102::-;4354:6;4405:2;4401:7;4396:2;4389:5;4385:14;4381:28;4371:38;;4313:102;;;:::o;4421:364::-;4509:3;4537:39;4570:5;4537:39;:::i;:::-;4592:71;4656:6;4651:3;4592:71;:::i;:::-;4585:78;;4672:52;4717:6;4712:3;4705:4;4698:5;4694:16;4672:52;:::i;:::-;4749:29;4771:6;4749:29;:::i;:::-;4744:3;4740:39;4733:46;;4513:272;4421:364;;;;:::o;4791:93::-;4827:7;4867:10;4860:5;4856:22;4845:33;;4791:93;;;:::o;4890:115::-;4975:23;4992:5;4975:23;:::i;:::-;4970:3;4963:36;4890:115;;:::o;5011:1504::-;5418:4;5456:3;5445:9;5441:19;5433:27;;5470:67;5534:1;5523:9;5519:17;5510:6;5470:67;:::i;:::-;5547:70;5613:2;5602:9;5598:18;5589:6;5547:70;:::i;:::-;5627;5693:2;5682:9;5678:18;5669:6;5627:70;:::i;:::-;5707:72;5775:2;5764:9;5760:18;5751:6;5707:72;:::i;:::-;5789:73;5857:3;5846:9;5842:19;5833:6;5789:73;:::i;:::-;5872;5940:3;5929:9;5925:19;5916:6;5872:73;:::i;:::-;5955;6023:3;6012:9;6008:19;5999:6;5955:73;:::i;:::-;6038:67;6100:3;6089:9;6085:19;6076:6;6038:67;:::i;:::-;6153:9;6147:4;6143:20;6137:3;6126:9;6122:19;6115:49;6181:78;6254:4;6245:6;6181:78;:::i;:::-;6173:86;;6269:71;6335:3;6324:9;6320:19;6311:6;6269:71;:::i;:::-;6350:74;6419:3;6408:9;6404:19;6394:7;6350:74;:::i;:::-;6434;6503:3;6492:9;6488:19;6478:7;6434:74;:::i;:::-;5011:1504;;;;;;;;;;;;;;;:::o;6521:210::-;6608:4;6646:2;6635:9;6631:18;6623:26;;6659:65;6721:1;6710:9;6706:17;6697:6;6659:65;:::i;:::-;6521:210;;;;:::o;6737:77::-;6774:7;6803:5;6792:16;;6737:77;;;:::o;6820:118::-;6907:24;6925:5;6907:24;:::i;:::-;6902:3;6895:37;6820:118;;:::o;6944:222::-;7037:4;7075:2;7064:9;7060:18;7052:26;;7088:71;7156:1;7145:9;7141:17;7132:6;7088:71;:::i;:::-;6944:222;;;;:::o;7172:122::-;7245:24;7263:5;7245:24;:::i;:::-;7238:5;7235:35;7225:63;;7284:1;7281;7274:12;7225:63;7172:122;:::o;7300:139::-;7346:5;7384:6;7371:20;7362:29;;7400:33;7427:5;7400:33;:::i;:::-;7300:139;;;;:::o;7445:474::-;7513:6;7521;7570:2;7558:9;7549:7;7545:23;7541:32;7538:119;;;7576:79;;:::i;:::-;7538:119;7696:1;7721:53;7766:7;7757:6;7746:9;7742:22;7721:53;:::i;:::-;7711:63;;7667:117;7823:2;7849:53;7894:7;7885:6;7874:9;7870:22;7849:53;:::i;:::-;7839:63;;7794:118;7445:474;;;;;:::o;7925:329::-;7984:6;8033:2;8021:9;8012:7;8008:23;8004:32;8001:119;;;8039:79;;:::i;:::-;8001:119;8159:1;8184:53;8229:7;8220:6;8209:9;8205:22;8184:53;:::i;:::-;8174:63;;8130:117;7925:329;;;;:::o;8260:118::-;8331:22;8347:5;8331:22;:::i;:::-;8324:5;8321:33;8311:61;;8368:1;8365;8358:12;8311:61;8260:118;:::o;8384:135::-;8428:5;8466:6;8453:20;8444:29;;8482:31;8507:5;8482:31;:::i;:::-;8384:135;;;;:::o;8525:120::-;8597:23;8614:5;8597:23;:::i;:::-;8590:5;8587:34;8577:62;;8635:1;8632;8625:12;8577:62;8525:120;:::o;8651:137::-;8696:5;8734:6;8721:20;8712:29;;8750:32;8776:5;8750:32;:::i;:::-;8651:137;;;;:::o;8794:117::-;8903:1;8900;8893:12;8917:117;9026:1;9023;9016:12;9040:180;9088:77;9085:1;9078:88;9185:4;9182:1;9175:15;9209:4;9206:1;9199:15;9226:281;9309:27;9331:4;9309:27;:::i;:::-;9301:6;9297:40;9439:6;9427:10;9424:22;9403:18;9391:10;9388:34;9385:62;9382:88;;;9450:18;;:::i;:::-;9382:88;9490:10;9486:2;9479:22;9269:238;9226:281;;:::o;9513:129::-;9547:6;9574:20;;:::i;:::-;9564:30;;9603:33;9631:4;9623:6;9603:33;:::i;:::-;9513:129;;;:::o;9648:308::-;9710:4;9800:18;9792:6;9789:30;9786:56;;;9822:18;;:::i;:::-;9786:56;9860:29;9882:6;9860:29;:::i;:::-;9852:37;;9944:4;9938;9934:15;9926:23;;9648:308;;;:::o;9962:154::-;10046:6;10041:3;10036;10023:30;10108:1;10099:6;10094:3;10090:16;10083:27;9962:154;;;:::o;10122:412::-;10200:5;10225:66;10241:49;10283:6;10241:49;:::i;:::-;10225:66;:::i;:::-;10216:75;;10314:6;10307:5;10300:21;10352:4;10345:5;10341:16;10390:3;10381:6;10376:3;10372:16;10369:25;10366:112;;;10397:79;;:::i;:::-;10366:112;10487:41;10521:6;10516:3;10511;10487:41;:::i;:::-;10206:328;10122:412;;;;;:::o;10554:340::-;10610:5;10659:3;10652:4;10644:6;10640:17;10636:27;10626:122;;10667:79;;:::i;:::-;10626:122;10784:6;10771:20;10809:79;10884:3;10876:6;10869:4;10861:6;10857:17;10809:79;:::i;:::-;10800:88;;10616:278;10554:340;;;;:::o;10900:1085::-;11002:6;11010;11018;11026;11034;11083:3;11071:9;11062:7;11058:23;11054:33;11051:120;;;11090:79;;:::i;:::-;11051:120;11210:1;11235:53;11280:7;11271:6;11260:9;11256:22;11235:53;:::i;:::-;11225:63;;11181:117;11337:2;11363:51;11406:7;11397:6;11386:9;11382:22;11363:51;:::i;:::-;11353:61;;11308:116;11463:2;11489:52;11533:7;11524:6;11513:9;11509:22;11489:52;:::i;:::-;11479:62;;11434:117;11618:2;11607:9;11603:18;11590:32;11649:18;11641:6;11638:30;11635:117;;;11671:79;;:::i;:::-;11635:117;11776:63;11831:7;11822:6;11811:9;11807:22;11776:63;:::i;:::-;11766:73;;11561:288;11888:3;11915:53;11960:7;11951:6;11940:9;11936:22;11915:53;:::i;:::-;11905:63;;11859:119;10900:1085;;;;;;;;:::o;11991:619::-;12068:6;12076;12084;12133:2;12121:9;12112:7;12108:23;12104:32;12101:119;;;12139:79;;:::i;:::-;12101:119;12259:1;12284:53;12329:7;12320:6;12309:9;12305:22;12284:53;:::i;:::-;12274:63;;12230:117;12386:2;12412:53;12457:7;12448:6;12437:9;12433:22;12412:53;:::i;:::-;12402:63;;12357:118;12514:2;12540:53;12585:7;12576:6;12565:9;12561:22;12540:53;:::i;:::-;12530:63;;12485:118;11991:619;;;;;:::o;12616:182::-;12756:34;12752:1;12744:6;12740:14;12733:58;12616:182;:::o;12804:366::-;12946:3;12967:67;13031:2;13026:3;12967:67;:::i;:::-;12960:74;;13043:93;13132:3;13043:93;:::i;:::-;13161:2;13156:3;13152:12;13145:19;;12804:366;;;:::o;13176:419::-;13342:4;13380:2;13369:9;13365:18;13357:26;;13429:9;13423:4;13419:20;13415:1;13404:9;13400:17;13393:47;13457:131;13583:4;13457:131;:::i;:::-;13449:139;;13176:419;;;:::o;13601:180::-;13649:77;13646:1;13639:88;13746:4;13743:1;13736:15;13770:4;13767:1;13760:15;13787:320;13831:6;13868:1;13862:4;13858:12;13848:22;;13915:1;13909:4;13905:12;13936:18;13926:81;;13992:4;13984:6;13980:17;13970:27;;13926:81;14054:2;14046:6;14043:14;14023:18;14020:38;14017:84;;;14073:18;;:::i;:::-;14017:84;13838:269;13787:320;;;:::o;14113:225::-;14253:34;14249:1;14241:6;14237:14;14230:58;14322:8;14317:2;14309:6;14305:15;14298:33;14113:225;:::o;14344:366::-;14486:3;14507:67;14571:2;14566:3;14507:67;:::i;:::-;14500:74;;14583:93;14672:3;14583:93;:::i;:::-;14701:2;14696:3;14692:12;14685:19;;14344:366;;;:::o;14716:419::-;14882:4;14920:2;14909:9;14905:18;14897:26;;14969:9;14963:4;14959:20;14955:1;14944:9;14940:17;14933:47;14997:131;15123:4;14997:131;:::i;:::-;14989:139;;14716:419;;;:::o;15141:181::-;15281:33;15277:1;15269:6;15265:14;15258:57;15141:181;:::o;15328:366::-;15470:3;15491:67;15555:2;15550:3;15491:67;:::i;:::-;15484:74;;15567:93;15656:3;15567:93;:::i;:::-;15685:2;15680:3;15676:12;15669:19;;15328:366;;;:::o;15700:419::-;15866:4;15904:2;15893:9;15889:18;15881:26;;15953:9;15947:4;15943:20;15939:1;15928:9;15924:17;15917:47;15981:131;16107:4;15981:131;:::i;:::-;15973:139;;15700:419;;;:::o;16125:170::-;16265:22;16261:1;16253:6;16249:14;16242:46;16125:170;:::o;16301:366::-;16443:3;16464:67;16528:2;16523:3;16464:67;:::i;:::-;16457:74;;16540:93;16629:3;16540:93;:::i;:::-;16658:2;16653:3;16649:12;16642:19;;16301:366;;;:::o;16673:419::-;16839:4;16877:2;16866:9;16862:18;16854:26;;16926:9;16920:4;16916:20;16912:1;16901:9;16897:17;16890:47;16954:131;17080:4;16954:131;:::i;:::-;16946:139;;16673:419;;;:::o;17098:166::-;17238:18;17234:1;17226:6;17222:14;17215:42;17098:166;:::o;17270:366::-;17412:3;17433:67;17497:2;17492:3;17433:67;:::i;:::-;17426:74;;17509:93;17598:3;17509:93;:::i;:::-;17627:2;17622:3;17618:12;17611:19;;17270:366;;;:::o;17642:419::-;17808:4;17846:2;17835:9;17831:18;17823:26;;17895:9;17889:4;17885:20;17881:1;17870:9;17866:17;17859:47;17923:131;18049:4;17923:131;:::i;:::-;17915:139;;17642:419;;;:::o;18067:172::-;18207:24;18203:1;18195:6;18191:14;18184:48;18067:172;:::o;18245:366::-;18387:3;18408:67;18472:2;18467:3;18408:67;:::i;:::-;18401:74;;18484:93;18573:3;18484:93;:::i;:::-;18602:2;18597:3;18593:12;18586:19;;18245:366;;;:::o;18617:419::-;18783:4;18821:2;18810:9;18806:18;18798:26;;18870:9;18864:4;18860:20;18856:1;18845:9;18841:17;18834:47;18898:131;19024:4;18898:131;:::i;:::-;18890:139;;18617:419;;;:::o;19042:180::-;19090:77;19087:1;19080:88;19187:4;19184:1;19177:15;19211:4;19208:1;19201:15;19228:102;19270:8;19317:5;19314:1;19310:13;19289:34;;19228:102;;;:::o;19336:848::-;19397:5;19404:4;19428:6;19419:15;;19452:5;19443:14;;19466:712;19487:1;19477:8;19474:15;19466:712;;;19582:4;19577:3;19573:14;19567:4;19564:24;19561:50;;;19591:18;;:::i;:::-;19561:50;19641:1;19631:8;19627:16;19624:451;;;20056:4;20049:5;20045:16;20036:25;;19624:451;20106:4;20100;20096:15;20088:23;;20136:32;20159:8;20136:32;:::i;:::-;20124:44;;19466:712;;;19336:848;;;;;;;:::o;20190:1073::-;20244:5;20435:8;20425:40;;20456:1;20447:10;;20458:5;;20425:40;20484:4;20474:36;;20501:1;20492:10;;20503:5;;20474:36;20570:4;20618:1;20613:27;;;;20654:1;20649:191;;;;20563:277;;20613:27;20631:1;20622:10;;20633:5;;;20649:191;20694:3;20684:8;20681:17;20678:43;;;20701:18;;:::i;:::-;20678:43;20750:8;20747:1;20743:16;20734:25;;20785:3;20778:5;20775:14;20772:40;;;20792:18;;:::i;:::-;20772:40;20825:5;;;20563:277;;20949:2;20939:8;20936:16;20930:3;20924:4;20921:13;20917:36;20899:2;20889:8;20886:16;20881:2;20875:4;20872:12;20868:35;20852:111;20849:246;;;21005:8;20999:4;20995:19;20986:28;;21040:3;21033:5;21030:14;21027:40;;;21047:18;;:::i;:::-;21027:40;21080:5;;20849:246;21120:42;21158:3;21148:8;21142:4;21139:1;21120:42;:::i;:::-;21105:57;;;;21194:4;21189:3;21185:14;21178:5;21175:25;21172:51;;;21203:18;;:::i;:::-;21172:51;21252:4;21245:5;21241:16;21232:25;;20190:1073;;;;;;:::o;21269:281::-;21327:5;21351:23;21369:4;21351:23;:::i;:::-;21343:31;;21395:25;21411:8;21395:25;:::i;:::-;21383:37;;21439:104;21476:66;21466:8;21460:4;21439:104;:::i;:::-;21430:113;;21269:281;;;;:::o;21556:171::-;21696:23;21692:1;21684:6;21680:14;21673:47;21556:171;:::o;21733:366::-;21875:3;21896:67;21960:2;21955:3;21896:67;:::i;:::-;21889:74;;21972:93;22061:3;21972:93;:::i;:::-;22090:2;22085:3;22081:12;22074:19;;21733:366;;;:::o;22105:419::-;22271:4;22309:2;22298:9;22294:18;22286:26;;22358:9;22352:4;22348:20;22344:1;22333:9;22329:17;22322:47;22386:131;22512:4;22386:131;:::i;:::-;22378:139;;22105:419;;;:::o;22530:170::-;22670:22;22666:1;22658:6;22654:14;22647:46;22530:170;:::o;22706:366::-;22848:3;22869:67;22933:2;22928:3;22869:67;:::i;:::-;22862:74;;22945:93;23034:3;22945:93;:::i;:::-;23063:2;23058:3;23054:12;23047:19;;22706:366;;;:::o;23078:419::-;23244:4;23282:2;23271:9;23267:18;23259:26;;23331:9;23325:4;23321:20;23317:1;23306:9;23302:17;23295:47;23359:131;23485:4;23359:131;:::i;:::-;23351:139;;23078:419;;;:::o;23503:313::-;23616:4;23654:2;23643:9;23639:18;23631:26;;23703:9;23697:4;23693:20;23689:1;23678:9;23674:17;23667:47;23731:78;23804:4;23795:6;23731:78;:::i;:::-;23723:86;;23503:313;;;;:::o;23822:110::-;23873:7;23902:24;23920:5;23902:24;:::i;:::-;23891:35;;23822:110;;;:::o;23938:150::-;24025:38;24057:5;24025:38;:::i;:::-;24018:5;24015:49;24005:77;;24078:1;24075;24068:12;24005:77;23938:150;:::o;24094:171::-;24165:5;24196:6;24190:13;24181:22;;24212:47;24253:5;24212:47;:::i;:::-;24094:171;;;;:::o;24271:379::-;24355:6;24404:2;24392:9;24383:7;24379:23;24375:32;24372:119;;;24410:79;;:::i;:::-;24372:119;24530:1;24555:78;24625:7;24616:6;24605:9;24601:22;24555:78;:::i;:::-;24545:88;;24501:142;24271:379;;;;:::o;24656:185::-;24694:4;24714:18;24730:1;24714:18;:::i;:::-;24709:23;;24746:18;24762:1;24746:18;:::i;:::-;24741:23;;24783:1;24780;24777:8;24774:34;;;24788:18;;:::i;:::-;24774:34;24833:1;24830;24826:9;24818:17;;24656:185;;;;:::o;24847:60::-;24875:3;24896:5;24889:12;;24847:60;;;:::o;24913:140::-;24962:9;24995:52;25013:33;25022:23;25039:5;25022:23;:::i;:::-;25013:33;:::i;:::-;24995:52;:::i;:::-;24982:65;;24913:140;;;:::o;25059:129::-;25145:36;25175:5;25145:36;:::i;:::-;25140:3;25133:49;25059:129;;:::o;25194:158::-;25334:10;25330:1;25322:6;25318:14;25311:34;25194:158;:::o;25358:365::-;25500:3;25521:66;25585:1;25580:3;25521:66;:::i;:::-;25514:73;;25596:93;25685:3;25596:93;:::i;:::-;25714:2;25709:3;25705:12;25698:19;;25358:365;;;:::o;25729:740::-;25974:4;26012:3;26001:9;25997:19;25989:27;;26026:70;26093:1;26082:9;26078:17;26069:6;26026:70;:::i;:::-;26106:72;26174:2;26163:9;26159:18;26150:6;26106:72;:::i;:::-;26225:9;26219:4;26215:20;26210:2;26199:9;26195:18;26188:48;26253:131;26379:4;26253:131;:::i;:::-;26245:139;;26394:68;26458:2;26447:9;26443:18;26434:6;26394:68;:::i;:::-;25729:740;;;;;;:::o;26475:143::-;26532:5;26563:6;26557:13;26548:22;;26579:33;26606:5;26579:33;:::i;:::-;26475:143;;;;:::o;26624:507::-;26703:6;26711;26760:2;26748:9;26739:7;26735:23;26731:32;26728:119;;;26766:79;;:::i;:::-;26728:119;26886:1;26911:64;26967:7;26958:6;26947:9;26943:22;26911:64;:::i;:::-;26901:74;;26857:128;27024:2;27050:64;27106:7;27097:6;27086:9;27082:22;27050:64;:::i;:::-;27040:74;;26995:129;26624:507;;;;;:::o;27137:177::-;27277:29;27273:1;27265:6;27261:14;27254:53;27137:177;:::o;27320:366::-;27462:3;27483:67;27547:2;27542:3;27483:67;:::i;:::-;27476:74;;27559:93;27648:3;27559:93;:::i;:::-;27677:2;27672:3;27668:12;27661:19;;27320:366;;;:::o;27692:419::-;27858:4;27896:2;27885:9;27881:18;27873:26;;27945:9;27939:4;27935:20;27931:1;27920:9;27916:17;27909:47;27973:131;28099:4;27973:131;:::i;:::-;27965:139;;27692:419;;;:::o;28117:173::-;28257:25;28253:1;28245:6;28241:14;28234:49;28117:173;:::o;28296:366::-;28438:3;28459:67;28523:2;28518:3;28459:67;:::i;:::-;28452:74;;28535:93;28624:3;28535:93;:::i;:::-;28653:2;28648:3;28644:12;28637:19;;28296:366;;;:::o;28668:419::-;28834:4;28872:2;28861:9;28857:18;28849:26;;28921:9;28915:4;28911:20;28907:1;28896:9;28892:17;28885:47;28949:131;29075:4;28949:131;:::i;:::-;28941:139;;28668:419;;;:::o;29093:348::-;29133:7;29156:20;29174:1;29156:20;:::i;:::-;29151:25;;29190:20;29208:1;29190:20;:::i;:::-;29185:25;;29378:1;29310:66;29306:74;29303:1;29300:81;29295:1;29288:9;29281:17;29277:105;29274:131;;;29385:18;;:::i;:::-;29274:131;29433:1;29430;29426:9;29415:20;;29093:348;;;;:::o;29447:142::-;29497:9;29530:53;29548:34;29557:24;29575:5;29557:24;:::i;:::-;29548:34;:::i;:::-;29530:53;:::i;:::-;29517:66;;29447:142;;;:::o;29595:126::-;29645:9;29678:37;29709:5;29678:37;:::i;:::-;29665:50;;29595:126;;;:::o;29727:140::-;29791:9;29824:37;29855:5;29824:37;:::i;:::-;29811:50;;29727:140;;;:::o;29873:159::-;29974:51;30019:5;29974:51;:::i;:::-;29969:3;29962:64;29873:159;;:::o;30038:360::-;30173:4;30211:2;30200:9;30196:18;30188:26;;30224:71;30292:1;30281:9;30277:17;30268:6;30224:71;:::i;:::-;30305:86;30387:2;30376:9;30372:18;30363:6;30305:86;:::i;:::-;30038:360;;;;;:::o;30404:351::-;30474:6;30523:2;30511:9;30502:7;30498:23;30494:32;30491:119;;;30529:79;;:::i;:::-;30491:119;30649:1;30674:64;30730:7;30721:6;30710:9;30706:22;30674:64;:::i;:::-;30664:74;;30620:128;30404:351;;;;:::o;30761:179::-;30901:31;30897:1;30889:6;30885:14;30878:55;30761:179;:::o;30946:366::-;31088:3;31109:67;31173:2;31168:3;31109:67;:::i;:::-;31102:74;;31185:93;31274:3;31185:93;:::i;:::-;31303:2;31298:3;31294:12;31287:19;;30946:366;;;:::o;31318:419::-;31484:4;31522:2;31511:9;31507:18;31499:26;;31571:9;31565:4;31561:20;31557:1;31546:9;31542:17;31535:47;31599:131;31725:4;31599:131;:::i;:::-;31591:139;;31318:419;;;:::o;31743:640::-;31938:4;31976:3;31965:9;31961:19;31953:27;;31990:71;32058:1;32047:9;32043:17;32034:6;31990:71;:::i;:::-;32071:72;32139:2;32128:9;32124:18;32115:6;32071:72;:::i;:::-;32190:9;32184:4;32180:20;32175:2;32164:9;32160:18;32153:48;32218:78;32291:4;32282:6;32218:78;:::i;:::-;32210:86;;32306:70;32372:2;32361:9;32357:18;32348:6;32306:70;:::i;:::-;31743:640;;;;;;;:::o;32389:174::-;32529:26;32525:1;32517:6;32513:14;32506:50;32389:174;:::o;32569:366::-;32711:3;32732:67;32796:2;32791:3;32732:67;:::i;:::-;32725:74;;32808:93;32897:3;32808:93;:::i;:::-;32926:2;32921:3;32917:12;32910:19;;32569:366;;;:::o;32941:419::-;33107:4;33145:2;33134:9;33130:18;33122:26;;33194:9;33188:4;33184:20;33180:1;33169:9;33165:17;33158:47;33222:131;33348:4;33222:131;:::i;:::-;33214:139;;32941:419;;;:::o;33366:225::-;33506:34;33502:1;33494:6;33490:14;33483:58;33575:8;33570:2;33562:6;33558:15;33551:33;33366:225;:::o;33597:366::-;33739:3;33760:67;33824:2;33819:3;33760:67;:::i;:::-;33753:74;;33836:93;33925:3;33836:93;:::i;:::-;33954:2;33949:3;33945:12;33938:19;;33597:366;;;:::o;33969:419::-;34135:4;34173:2;34162:9;34158:18;34150:26;;34222:9;34216:4;34212:20;34208:1;34197:9;34193:17;34186:47;34250:131;34376:4;34250:131;:::i;:::-;34242:139;;33969:419;;;:::o;34394:181::-;34534:33;34530:1;34522:6;34518:14;34511:57;34394:181;:::o;34581:366::-;34723:3;34744:67;34808:2;34803:3;34744:67;:::i;:::-;34737:74;;34820:93;34909:3;34820:93;:::i;:::-;34938:2;34933:3;34929:12;34922:19;;34581:366;;;:::o;34953:419::-;35119:4;35157:2;35146:9;35142:18;35134:26;;35206:9;35200:4;35196:20;35192:1;35181:9;35177:17;35170:47;35234:131;35360:4;35234:131;:::i;:::-;35226:139;;34953:419;;;:::o;35378:173::-;35518:25;35514:1;35506:6;35502:14;35495:49;35378:173;:::o;35557:366::-;35699:3;35720:67;35784:2;35779:3;35720:67;:::i;:::-;35713:74;;35796:93;35885:3;35796:93;:::i;:::-;35914:2;35909:3;35905:12;35898:19;;35557:366;;;:::o;35929:419::-;36095:4;36133:2;36122:9;36118:18;36110:26;;36182:9;36176:4;36172:20;36168:1;36157:9;36153:17;36146:47;36210:131;36336:4;36210:131;:::i;:::-;36202:139;;35929:419;;;:::o;36354:442::-;36503:4;36541:2;36530:9;36526:18;36518:26;;36554:71;36622:1;36611:9;36607:17;36598:6;36554:71;:::i;:::-;36635:72;36703:2;36692:9;36688:18;36679:6;36635:72;:::i;:::-;36717;36785:2;36774:9;36770:18;36761:6;36717:72;:::i;:::-;36354:442;;;;;;:::o;36802:332::-;36923:4;36961:2;36950:9;36946:18;36938:26;;36974:71;37042:1;37031:9;37027:17;37018:6;36974:71;:::i;:::-;37055:72;37123:2;37112:9;37108:18;37099:6;37055:72;:::i;:::-;36802:332;;;;;:::o;37140:::-;37261:4;37299:2;37288:9;37284:18;37276:26;;37312:71;37380:1;37369:9;37365:17;37356:6;37312:71;:::i;:::-;37393:72;37461:2;37450:9;37446:18;37437:6;37393:72;:::i;:::-;37140:332;;;;;:::o;37478:98::-;37529:6;37563:5;37557:12;37547:22;;37478:98;;;:::o;37582:168::-;37665:11;37699:6;37694:3;37687:19;37739:4;37734:3;37730:14;37715:29;;37582:168;;;;:::o;37756:360::-;37842:3;37870:38;37902:5;37870:38;:::i;:::-;37924:70;37987:6;37982:3;37924:70;:::i;:::-;37917:77;;38003:52;38048:6;38043:3;38036:4;38029:5;38025:16;38003:52;:::i;:::-;38080:29;38102:6;38080:29;:::i;:::-;38075:3;38071:39;38064:46;;37846:270;37756:360;;;;:::o;38122:529::-;38289:4;38327:2;38316:9;38312:18;38304:26;;38340:71;38408:1;38397:9;38393:17;38384:6;38340:71;:::i;:::-;38421:72;38489:2;38478:9;38474:18;38465:6;38421:72;:::i;:::-;38540:9;38534:4;38530:20;38525:2;38514:9;38510:18;38503:48;38568:76;38639:4;38630:6;38568:76;:::i;:::-;38560:84;;38122:529;;;;;;:::o;38657:116::-;38727:21;38742:5;38727:21;:::i;:::-;38720:5;38717:32;38707:60;;38763:1;38760;38753:12;38707:60;38657:116;:::o;38779:137::-;38833:5;38864:6;38858:13;38849:22;;38880:30;38904:5;38880:30;:::i;:::-;38779:137;;;;:::o;38922:345::-;38989:6;39038:2;39026:9;39017:7;39013:23;39009:32;39006:119;;;39044:79;;:::i;:::-;39006:119;39164:1;39189:61;39242:7;39233:6;39222:9;39218:22;39189:61;:::i;:::-;39179:71;;39135:125;38922:345;;;;:::o;39273:305::-;39313:3;39332:20;39350:1;39332:20;:::i;:::-;39327:25;;39366:20;39384:1;39366:20;:::i;:::-;39361:25;;39520:1;39452:66;39448:74;39445:1;39442:81;39439:107;;;39526:18;;:::i;:::-;39439:107;39570:1;39567;39563:9;39556:16;;39273:305;;;;:::o;39584:229::-;39724:34;39720:1;39712:6;39708:14;39701:58;39793:12;39788:2;39780:6;39776:15;39769:37;39584:229;:::o;39819:366::-;39961:3;39982:67;40046:2;40041:3;39982:67;:::i;:::-;39975:74;;40058:93;40147:3;40058:93;:::i;:::-;40176:2;40171:3;40167:12;40160:19;;39819:366;;;:::o;40191:419::-;40357:4;40395:2;40384:9;40380:18;40372:26;;40444:9;40438:4;40434:20;40430:1;40419:9;40415:17;40408:47;40472:131;40598:4;40472:131;:::i;:::-;40464:139;;40191:419;;;:::o;40616:553::-;40793:4;40831:3;40820:9;40816:19;40808:27;;40845:71;40913:1;40902:9;40898:17;40889:6;40845:71;:::i;:::-;40926:72;40994:2;40983:9;40979:18;40970:6;40926:72;:::i;:::-;41008;41076:2;41065:9;41061:18;41052:6;41008:72;:::i;:::-;41090;41158:2;41147:9;41143:18;41134:6;41090:72;:::i;:::-;40616:553;;;;;;;:::o;41175:79::-;41214:7;41243:5;41232:16;;41175:79;;;:::o;41260:157::-;41365:45;41385:24;41403:5;41385:24;:::i;:::-;41365:45;:::i;:::-;41360:3;41353:58;41260:157;;:::o;41423:79::-;41462:7;41491:5;41480:16;;41423:79;;;:::o;41508:157::-;41613:45;41633:24;41651:5;41633:24;:::i;:::-;41613:45;:::i;:::-;41608:3;41601:58;41508:157;;:::o;41671:397::-;41811:3;41826:75;41897:3;41888:6;41826:75;:::i;:::-;41926:2;41921:3;41917:12;41910:19;;41939:75;42010:3;42001:6;41939:75;:::i;:::-;42039:2;42034:3;42030:12;42023:19;;42059:3;42052:10;;41671:397;;;;;:::o;42074:180::-;42122:77;42119:1;42112:88;42219:4;42216:1;42209:15;42243:4;42240:1;42233:15;42260:180;42308:77;42305:1;42298:88;42405:4;42402:1;42395:15;42429:4;42426:1;42419:15;42446:176;42478:1;42495:20;42513:1;42495:20;:::i;:::-;42490:25;;42529:20;42547:1;42529:20;:::i;:::-;42524:25;;42568:1;42558:35;;42573:18;;:::i;:::-;42558:35;42614:1;42611;42607:9;42602:14;;42446:176;;;;:::o;42628:141::-;42677:4;42700:3;42692:11;;42723:3;42720:1;42713:14;42757:4;42754:1;42744:18;42736:26;;42628:141;;;:::o;42799:802::-;42884:3;42921:5;42915:12;42950:36;42976:9;42950:36;:::i;:::-;43002:71;43066:6;43061:3;43002:71;:::i;:::-;42995:78;;43104:1;43093:9;43089:17;43120:1;43115:135;;;;43264:1;43259:336;;;;43082:513;;43115:135;43199:4;43195:9;43184;43180:25;43175:3;43168:38;43235:4;43230:3;43226:14;43219:21;;43115:135;;43259:336;43326:38;43358:5;43326:38;:::i;:::-;43386:1;43400:154;43414:6;43411:1;43408:13;43400:154;;;43488:7;43482:14;43478:1;43473:3;43469:11;43462:35;43538:1;43529:7;43525:15;43514:26;;43436:4;43433:1;43429:12;43424:17;;43400:154;;;43583:1;43578:3;43574:11;43567:18;;43266:329;;43082:513;;42888:713;;42799:802;;;;:::o;43607:831::-;43872:4;43910:3;43899:9;43895:19;43887:27;;43924:69;43990:1;43979:9;43975:17;43966:6;43924:69;:::i;:::-;44003:72;44071:2;44060:9;44056:18;44047:6;44003:72;:::i;:::-;44122:9;44116:4;44112:20;44107:2;44096:9;44092:18;44085:48;44150:75;44220:4;44211:6;44150:75;:::i;:::-;44142:83;;44272:9;44266:4;44262:20;44257:2;44246:9;44242:18;44235:48;44300:131;44426:4;44300:131;:::i;:::-;44292:139;;43607:831;;;;;;:::o;44444:122::-;44517:24;44535:5;44517:24;:::i;:::-;44510:5;44507:35;44497:63;;44556:1;44553;44546:12;44497:63;44444:122;:::o;44572:143::-;44629:5;44660:6;44654:13;44645:22;;44676:33;44703:5;44676:33;:::i;:::-;44572:143;;;;:::o;44721:351::-;44791:6;44840:2;44828:9;44819:7;44815:23;44811:32;44808:119;;;44846:79;;:::i;:::-;44808:119;44966:1;44991:64;45047:7;45038:6;45027:9;45023:22;44991:64;:::i;:::-;44981:74;;44937:128;44721:351;;;;:::o;45078:307::-;45188:4;45226:2;45215:9;45211:18;45203:26;;45275:9;45269:4;45265:20;45261:1;45250:9;45246:17;45239:47;45303:75;45373:4;45364:6;45303:75;:::i;:::-;45295:83;;45078:307;;;;:::o;45391:898::-;45658:4;45696:3;45685:9;45681:19;45673:27;;45710:71;45778:1;45767:9;45763:17;45754:6;45710:71;:::i;:::-;45791:72;45859:2;45848:9;45844:18;45835:6;45791:72;:::i;:::-;45873;45941:2;45930:9;45926:18;45917:6;45873:72;:::i;:::-;45955:70;46021:2;46010:9;46006:18;45997:6;45955:70;:::i;:::-;46035:73;46103:3;46092:9;46088:19;46079:6;46035:73;:::i;:::-;46118:67;46180:3;46169:9;46165:19;46156:6;46118:67;:::i;:::-;46195:87;46277:3;46266:9;46262:19;46253:6;46195:87;:::i;:::-;45391:898;;;;;;;;;;:::o;46295:142::-;46345:9;46378:53;46396:34;46405:24;46423:5;46405:24;:::i;:::-;46396:34;:::i;:::-;46378:53;:::i;:::-;46365:66;;46295:142;;;:::o;46443:131::-;46530:37;46561:5;46530:37;:::i;:::-;46525:3;46518:50;46443:131;;:::o;46580:140::-;46629:9;46662:52;46680:33;46689:23;46706:5;46689:23;:::i;:::-;46680:33;:::i;:::-;46662:52;:::i;:::-;46649:65;;46580:140;;;:::o;46726:129::-;46812:36;46842:5;46812:36;:::i;:::-;46807:3;46800:49;46726:129;;:::o;46861:1185::-;47191:4;47229:3;47218:9;47214:19;47206:27;;47243:71;47311:1;47300:9;47296:17;47287:6;47243:71;:::i;:::-;47324;47391:2;47380:9;47376:18;47367:6;47324:71;:::i;:::-;47405;47472:2;47461:9;47457:18;47448:6;47405:71;:::i;:::-;47486:72;47554:2;47543:9;47539:18;47530:6;47486:72;:::i;:::-;47606:9;47600:4;47596:20;47590:3;47579:9;47575:19;47568:49;47634:75;47704:4;47695:6;47634:75;:::i;:::-;47626:83;;47719:71;47785:3;47774:9;47770:19;47761:6;47719:71;:::i;:::-;47800:73;47868:3;47857:9;47853:19;47844:6;47800:73;:::i;:::-;47883;47951:3;47940:9;47936:19;47927:6;47883:73;:::i;:::-;47966;48034:3;48023:9;48019:19;48010:6;47966:73;:::i;:::-;46861:1185;;;;;;;;;;;;:::o;48052:218::-;48143:4;48181:2;48170:9;48166:18;48158:26;;48194:69;48260:1;48249:9;48245:17;48236:6;48194:69;:::i;:::-;48052:218;;;;:::o;48276:89::-;48312:7;48352:6;48345:5;48341:18;48330:29;;48276:89;;;:::o;48371:120::-;48443:23;48460:5;48443:23;:::i;:::-;48436:5;48433:34;48423:62;;48481:1;48478;48471:12;48423:62;48371:120;:::o;48497:141::-;48553:5;48584:6;48578:13;48569:22;;48600:32;48626:5;48600:32;:::i;:::-;48497:141;;;;:::o;48644:349::-;48713:6;48762:2;48750:9;48741:7;48737:23;48733:32;48730:119;;;48768:79;;:::i;:::-;48730:119;48888:1;48913:63;48968:7;48959:6;48948:9;48944:22;48913:63;:::i;:::-;48903:73;;48859:127;48644:349;;;;:::o;48999:191::-;49039:4;49059:20;49077:1;49059:20;:::i;:::-;49054:25;;49093:20;49111:1;49093:20;:::i;:::-;49088:25;;49132:1;49129;49126:8;49123:34;;;49137:18;;:::i;:::-;49123:34;49182:1;49179;49175:9;49167:17;;48999:191;;;;:::o;49196:316::-;49236:7;49259:20;49277:1;49259:20;:::i;:::-;49254:25;;49293:20;49311:1;49293:20;:::i;:::-;49288:25;;49449:1;49413:34;49409:42;49406:1;49403:49;49398:1;49391:9;49384:17;49380:73;49377:99;;;49456:18;;:::i;:::-;49377:99;49504:1;49501;49497:9;49486:20;;49196:316;;;;:::o;49518:185::-;49558:1;49575:20;49593:1;49575:20;:::i;:::-;49570:25;;49609:20;49627:1;49609:20;:::i;:::-;49604:25;;49648:1;49638:35;;49653:18;;:::i;:::-;49638:35;49695:1;49692;49688:9;49683:14;;49518:185;;;;:::o;49709:225::-;49849:34;49845:1;49837:6;49833:14;49826:58;49918:8;49913:2;49905:6;49901:15;49894:33;49709:225;:::o;49940:366::-;50082:3;50103:67;50167:2;50162:3;50103:67;:::i;:::-;50096:74;;50179:93;50268:3;50179:93;:::i;:::-;50297:2;50292:3;50288:12;50281:19;;49940:366;;;:::o;50312:419::-;50478:4;50516:2;50505:9;50501:18;50493:26;;50565:9;50559:4;50555:20;50551:1;50540:9;50536:17;50529:47;50593:131;50719:4;50593:131;:::i;:::-;50585:139;;50312:419;;;:::o;50737:179::-;50877:31;50873:1;50865:6;50861:14;50854:55;50737:179;:::o;50922:366::-;51064:3;51085:67;51149:2;51144:3;51085:67;:::i;:::-;51078:74;;51161:93;51250:3;51161:93;:::i;:::-;51279:2;51274:3;51270:12;51263:19;;50922:366;;;:::o;51294:419::-;51460:4;51498:2;51487:9;51483:18;51475:26;;51547:9;51541:4;51537:20;51533:1;51522:9;51518:17;51511:47;51575:131;51701:4;51575:131;:::i;:::-;51567:139;;51294:419;;;:::o;51719:147::-;51820:11;51857:3;51842:18;;51719:147;;;;:::o;51872:373::-;51976:3;52004:38;52036:5;52004:38;:::i;:::-;52058:88;52139:6;52134:3;52058:88;:::i;:::-;52051:95;;52155:52;52200:6;52195:3;52188:4;52181:5;52177:16;52155:52;:::i;:::-;52232:6;52227:3;52223:16;52216:23;;51980:265;51872:373;;;;:::o;52251:271::-;52381:3;52403:93;52492:3;52483:6;52403:93;:::i;:::-;52396:100;;52513:3;52506:10;;52251:271;;;;:::o
Swarm Source
ipfs://bd2325548b6629f5e2a71e86247dc17827eba3352f3f04ef18be6eb4da20a288
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.