Contract 0x014dea5dd7CE12Ce494b553F133739873247021f 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad8Claim54041022022-02-04 2:20:49185 days 2 hrs ago0xa8d4722b49d87bb6d136cc8dfbc85ced1c69a504 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000741397754 ETH
0x19e2219da9cf753913f9f63ccb5e3051932758330e536abe8e88be911602448dClaim54041012022-02-04 2:19:51185 days 2 hrs ago0xa8d4722b49d87bb6d136cc8dfbc85ced1c69a504 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.001043545737 ETH
0xe310db2886ef3c2e96d9f9a6aecf312a7eb00158f3657f432d5e4236f6605aa1Harvest54040972022-02-04 2:19:51185 days 2 hrs ago0xa8d4722b49d87bb6d136cc8dfbc85ced1c69a504 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.002281441187 ETH
0x9a73ab42582a432e1209dd77dff041cde1e71851bbd9227423f984cae71c97abHarvest54040952022-02-04 2:19:51185 days 2 hrs ago0xa8d4722b49d87bb6d136cc8dfbc85ced1c69a504 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.003448874083 ETH
0x949fbca62f6393a16c066514cb58966bbf528fce6f8e973c511ac57bc16c6e2eSet Final Apprai...54040882022-02-04 2:19:51185 days 2 hrs ago0xa8d4722b49d87bb6d136cc8dfbc85ced1c69a504 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.00109407674 ETH
0xcef7bf996166db0a00055f48800a6f958a30daeb581540eddf933e0e3eb64ccbWeight Vote54003552022-02-03 22:29:47185 days 6 hrs ago0x422c0348af9e58ce790fdce6ba9014f46cf533a1 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.00078690133 ETH
0x7845bf3a1679368b450da16348d4eff8949e133556ddaebc2c45c020306530fcWeight Vote53972922022-02-03 20:19:57185 days 8 hrs ago0xafc2abce0816f60d63967842980edcdc7ad20fd7 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000738229712 ETH
0xc276acabd6eb887116fce484f237c8ea7d5dbb1e0eabf755554099daa7470586Weight Vote53969602022-02-03 20:03:54185 days 9 hrs ago0x2221ceace30dbae7e209888452d29e711cb5741d IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.00073793253 ETH
0x91290251290885a36a6febf17aa88d8941824756be30a5bfe60cac33d3e0fad9Weight Vote53922192022-02-03 16:57:39185 days 12 hrs ago0xd8e37018265f307e3a4f9dbceaa64e94021e1e7c IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000716618782 ETH
0x6b9be9a8d36fdf8484606c3ce02267d72e32fcaf27f540fa4ca9279eba59a444Weight Vote53867162022-02-03 14:01:48185 days 15 hrs ago0x808af82545a721c06d1fccebea915a6f5128bef9 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000732942625 ETH
0xc6642781e254de37d5accab8e5e3f62146f53b91d1c09df6328807addddeb9dcWeight Vote53853952022-02-03 13:21:57185 days 15 hrs ago0xe90267c7e80da581ba81c3f6858399122b030a8d IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000705690196 ETH
0x9ded00db9777a53ce8856d8e392d542ffc85ecf790f25cc72a785b289aa34dd3Weight Vote53853502022-02-03 13:20:08185 days 15 hrs ago0x2cd61418c3d3d38da2313dab3ab64cd549d7b71e IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000734160076 ETH
0x9614520d39cf9cfa1dbd5268964c8169f9fa2cf860752df2586bf4900efa996fWeight Vote53853272022-02-03 13:19:08185 days 15 hrs ago0x2dc55c094ee20b08ea028e56c9dd628aa050ceb8 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000736671069 ETH
0x2b1788043c5235e199448709530180e31d91f95de877e86f57f764682aa8cfa4Weight Vote53819562022-02-03 11:22:15185 days 17 hrs ago0x8eb3e403fdeb0648152215bef3a2d95dee270ebb IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000755174298 ETH
0xce43fac9149a1343540dc2e8e340779a35f1c7b7a260a16852dce47af611b690Weight Vote53819262022-02-03 11:20:37185 days 17 hrs ago0x9ed40f89f2201af94d498b60d3420122c9962de4 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000724394102 ETH
0x871ba92f876689f338a763054f74658dec6d76ff253a6694e24d337e46c4e597Weight Vote53816562022-02-03 11:10:39185 days 17 hrs ago0xa52afaf49d03ac38cac95fc78ac00e35dee29e21 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000724343889 ETH
0x5af851b7d78c96248fde0373f7b738350d22708736c7045dc3b6d08dc4126f82Weight Vote53786252022-02-03 9:26:08185 days 19 hrs ago0xddee64b8d431ca99d107e8615943a65f206c231b IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000752655365 ETH
0x9a70db94b2665ed043f01ef4825dbcdabdba5413c8d6d951c3db8c8034c2210cWeight Vote53781122022-02-03 9:07:47185 days 19 hrs ago0x172b64e148ea2712eb4d3a649e7ec6371ae9ae5c IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000783018097 ETH
0xb8f13760c60b9439a06cc7d7b7a0f46d5520581395bb5a159975255615c08dd0Weight Vote53779162022-02-03 9:00:16185 days 20 hrs ago0xed46a40c088d11546eb4811e565e88a03ae8a07c IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000779801804 ETH
0x8cc3816d3ac7c082199d950c8fa6cf7f0878e6a2fa7dba82dd268f30845337ddWeight Vote53777302022-02-03 8:54:08185 days 20 hrs ago0xad63e4d4be2229b080d20311c1402a2e45cf7e75 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000787792788 ETH
0x87d087840d4d9a93ef2f4eb88f88f6ac907d07e071106ebc8cf2146c495d216eWeight Vote53775072022-02-03 8:46:03185 days 20 hrs ago0xf89897728d75ddcacd56deed19f75b504f312aa4 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000780637114 ETH
0x3b0c3e41e798548d4cb47ae1b6f1c0e971ff429059a63a93d3e451c389248bf0Weight Vote53737822022-02-03 7:17:25185 days 21 hrs ago0x4485b0e5be2eff9d5e06c765aeac74a6acddca5f IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000794495755 ETH
0xeb6e85801b761c3edb645b858399d7a9f22515a01932a50616a3fbf4c9a79454Weight Vote53728552022-02-03 6:22:43185 days 22 hrs ago0xd1bb2b2871730bc8ef4d86764148c8975b22ce1e IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.00081236071 ETH
0x65e765b332ce55e7a5df6664195e4a2463ee6aea821118b706620248e055eeaaWeight Vote53728522022-02-03 6:21:45185 days 22 hrs ago0xac516cfc8a5170b4d003312adbade589f4e93ece IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000812361912 ETH
0xaa001b27be81051c3f5ddef04add962a1337eb61f84293d3c78758d48f592ae2Weight Vote53709362022-02-03 4:24:04186 days 40 mins ago0x255be6d417d25d553414fb9608ef6303af9eb771 IN  0x014dea5dd7ce12ce494b553f133739873247021f0 ETH0.000808619015 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xcecd1f5a307c508d0f8c68486f0393b0d414161a567490b460353e1af9c3a3b157535722022-02-09 23:12:55179 days 5 hrs ago 0x396dd1f7e3c8044784937935f834c3f8d58eb497 0x014dea5dd7ce12ce494b553f133739873247021f0 ETH
0x7faf134dc3027796c94e9576f01a23e2a8fe8b380e45e34b95d6a2ac1b964f5b54559572022-02-05 17:54:22183 days 11 hrs ago 0x396dd1f7e3c8044784937935f834c3f8d58eb497 0x014dea5dd7ce12ce494b553f133739873247021f0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0x93dcf21284b78163ec218def37471c4b77ccc6e10 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0x93dcf21284b78163ec218def37471c4b77ccc6e10 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0x93dcf21284b78163ec218def37471c4b77ccc6e10 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0x93dcf21284b78163ec218def37471c4b77ccc6e10 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0x93dcf21284b78163ec218def37471c4b77ccc6e10 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0xb3f1069b04726c145197853db772483bd6b9650d0 ETH
0x6e5923271cd0d77bffe2e59c0484e75f9860d3f22dc170491805f0e802fffad854041022022-02-04 2:20:49185 days 2 hrs ago 0x014dea5dd7ce12ce494b553f133739873247021f 0x93dcf21284b78163ec218def37471c4b77ccc6e10 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PricingSession

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2022-01-12
*/

// Sources flattened with hardhat v2.8.2 https://hardhat.org

// File contracts/helpers/ReentrancyGuard.sol

pragma solidity ^0.8.0;

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <[email protected]π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {

  /// @dev counter to allow mutex lock with only one SSTORE operation
  uint256 private _guardCounter = 1;

  /**
   * @dev Prevents a contract from calling itself, directly or indirectly.
   * If you mark a function `nonReentrant`, you should also
   * mark it `external`. Calling one `nonReentrant` function from
   * another is not supported. Instead, you can implement a
   * `private` function doing the actual work, and an `external`
   * wrapper marked as `nonReentrant`.
   */
  modifier nonReentrant() {
    _guardCounter += 1;
    uint256 localCounter = _guardCounter;
    _;
    require(localCounter == _guardCounter);
  }

}


// File contracts/interfaces/IABCTreasury.sol

pragma solidity ^0.8.0;

interface IABCTreasury {
    function sendABCToken(address recipient, uint _amount) external;

    function getTokensClaimed() external view returns(uint);
    
    function updateNftPriced() external;
    
    function updateProfitGenerated(uint _amount) external;

}


// File contracts/libraries/SafeMath.sol

pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


// File contracts/libraries/sqrtLibrary.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

library sqrtLibrary {
    
    function sqrt(uint x) pure internal returns (uint y) {
        uint z = (x + 1) / 2;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}


// File hardhat/[email protected]

pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}


// File contracts/libraries/PostSessionLibrary.sol


pragma solidity ^0.8.0;


library PostSessionLibrary {

    using sqrtLibrary for *;


    function collusionCheck(uint correct, uint incorrect, uint spread) pure internal returns (bool) {
        if(correct * 100 / (correct + incorrect) >= (95-spread)) {
            return true;
        }
        else {
            return false;
        }
    }

    /////////////////////
    /// Session Bound ///
    /////////////////////

    function calculateTotalValue(
        uint values,
        uint[] memory appraisals, 
        uint finalAppraisal
    ) pure internal returns (uint totalValue) {
        for(uint j = 0; j < 30; j++) {
            if (j == values) { 
                break;
            }
            if(appraisals[j] > finalAppraisal) {
                totalValue += (appraisals[j] - finalAppraisal) ** 2;
            }
            else {
                totalValue += (finalAppraisal - appraisals[j]) ** 2;
            }
        }
    }

    function calculateBound(uint finalAppraisalValue, uint stdev, uint defender) pure internal returns (uint upperBound) {
        upperBound = finalAppraisalValue + (3 * (stdev + 20e18/finalAppraisalValue) / (defender + 1) * 2);
    }

    /////////////////////
    ///      Base     ///
    /////////////////////

    function calculateBase(uint finalAppraisalValue, uint userAppraisalValue, uint spread) pure internal returns(uint){
        uint base = 1;
        uint userVal = 100 * userAppraisalValue;
        for(uint i=spread; i >= 1; i--) {
            uint lowerOver = (100 + (i - 1)) * finalAppraisalValue;
            uint upperOver = (100 + i) * finalAppraisalValue;
            uint lowerUnder = (100 - i) * finalAppraisalValue;
            uint upperUnder = (100 - i + 1) * finalAppraisalValue;
            if (lowerOver < userVal && userVal <= upperOver) {
                return base; 
            }
            if (lowerUnder < userVal && userVal <= upperUnder) {
                return base;
            }
            base += 1;
        }
        if(userVal == 100*finalAppraisalValue) {
            return spread + 1;
        }
        return 0;
    }

    /////////////////////
    ///    Harvest    ///
    /////////////////////

    // function harvestUserOver(uint _stake, uint _userAppraisal, uint _finalAppraisal) pure internal returns(uint) {
    //     return _stake * (_userAppraisal*100 - 105*_finalAppraisal)/(_finalAppraisal*100);
    // }
    
    // function harvestUserUnder(uint _stake, uint _userAppraisal, uint _finalAppraisal) pure internal returns(uint) {
    //     return _stake * (95*_finalAppraisal - 100*_userAppraisal)/(_finalAppraisal*100);
    // }

    function harvest(uint _stake, uint _userAppraisal, uint _finalAppraisal, uint riskFactor, uint spread) pure internal returns(uint) {
        if(
            (_userAppraisal*100 > (100 + spread)*_finalAppraisal 
            && (_userAppraisal*100 - (100 + spread)*_finalAppraisal)/(_finalAppraisal) > (100 + spread))
            || _userAppraisal == 0
        ) {
            return _stake;
        }
        else if(_userAppraisal*100 > (100 + spread)*_finalAppraisal) {
            if (_stake * (_userAppraisal*100 - (100 + spread)*_finalAppraisal)/(_finalAppraisal*100) * riskFactor > _stake) {
                return _stake;
            }
            else {
                return _stake * (_userAppraisal*100 - (100 + spread)*_finalAppraisal)/(_finalAppraisal*100) * riskFactor;
            }
        }
        else if(_userAppraisal*100 < (100 - spread)*_finalAppraisal) {
            if (_stake * ((100 - spread)*_finalAppraisal - 100*_userAppraisal)/(_finalAppraisal*100) * riskFactor > _stake) {
                return _stake;
            }
            else {
                return _stake * ((100 - spread)*_finalAppraisal - 100*_userAppraisal)/(_finalAppraisal*100) * riskFactor;
            }
        }
        else {
            return 0;
        }
    }

    /////////////////////
    ///   Commission  ///
    /////////////////////   
    function setCommission(uint _treasurySize) pure internal returns(uint) {
        if (_treasurySize < 25000 ether) {
            return 500;
        }
        else if(_treasurySize >= 25000 ether && _treasurySize < 50000 ether) {
            return 400;
        }
        else if(_treasurySize >= 50000 ether && _treasurySize < 100000 ether) {
            return 300;
        }
        else if(_treasurySize >= 100000 ether && _treasurySize < 2000000 ether) {
            return 200;
        }
        else if(_treasurySize >= 200000 ether && _treasurySize < 400000 ether) {
            return 100;
        }
        else if(_treasurySize >= 400000 ether && _treasurySize < 700000 ether) {
            return 50;
        }
        else {
            return 25;
        }
    }


}


// File contracts/interfaces/IERC20.sol

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/ABCTreasury.sol

pragma solidity ^0.8.0;


/// @author Medici
/// @title Treasury contract for Abacus
contract ABCTreasury is  ReentrancyGuard {
    
    /* ======== UINT ======== */

    uint public nftsPriced;
    uint public profitGenerated;
    uint public tokensClaimed;
    uint public riskFactor;
    uint public spread;
    uint public defender;
    uint public commissionRate;
    uint public payoutMultiplier;

    /* ======== BOOL ======== */

    bool public tokenStatus;
    bool public auctionStatus;

    /* ======== ADDRESS ======== */

    address public auction;
    address public pricingSession;
    address public admin;
    address public ABCToken;
    address public multisig;
    address public creditStore;

    /* ======== EVENTS ======== */

    event ethClaimedByUser(address user_, uint ethClaimed);
    event ethToABCExchange(address user_, uint ethExchanged, uint ppSent);

    /* ======== CONSTRUCTOR ======== */

    constructor(address _creditStore) {
        admin = msg.sender;
        creditStore = _creditStore;
        auctionStatus = true;
        riskFactor = 2;
        spread = 10;
        defender = 2;
        commissionRate = 500;
        payoutMultiplier = 200;
    }

    /* ======== ADMIN FUNCTIONS ======== */

    /// @notice set the auction status based on the active/inactive status of the bounty auction
    /// @param status desired auction status to be stored and referenced in contract
    function setAuctionStatus(bool status) onlyAdmin external {
        auctionStatus = status;
    }

    /// @notice set the auction status based on the active/inactive status of the bounty auction
    /// @param _commissionRate desired commission percentage the protocol would like to take
    function setCommissionRate(uint _commissionRate) onlyAdmin external {
        commissionRate = _commissionRate;
    }

    function setPayoutMultiplier(uint _multiplier) onlyAdmin external {
        payoutMultiplier = _multiplier;
    }

    /// @notice set protocol risk factor
    /// @param _risk the protocol risk factor is a multiplier applied to any losses harvested
    function setRiskFactor(uint _risk) onlyAdmin external {
        riskFactor = _risk;
    }

    /// @notice set the protocol spread
    /// @param _spread the protocol spread is the margin of error that correctness is based on
    function setSpread(uint _spread) onlyAdmin external {
        spread = _spread;
    }

    /// @notice set the protocol defender level
    /** @dev the defender is used to determined the amount of
    recursive bound exclusions enforced per session. 
    
    For example, in times of a high volume of extreme value attacks,
    the community can set the defender to level 3 in which case every session
    will have the _boundCheck happen 3 times. What this means is there will be
    one bound check, the final appraisal will be adjusted, then a second check,
    final appraisal will be re-adjusted, then a third, and final appraisal will
    be adjusted one final time. 

    Any values that are removed result in removal from final appraisal affect 
    AND their stake is completely lost. 
    */
    /// @param _defender the defender is a value that determines the amount of recursive bound exclusions enforced per session
    function setDefender(uint _defender) onlyAdmin external {
        defender = _defender;
    }

    /// @notice set ABC token contract address 
    /// @param _ABCToken desired ABC token to be stored and referenced in contract
    function setABCTokenAddress(address _ABCToken) onlyAdmin external {
        ABCToken = _ABCToken;
    }

    function setMultisig(address _multisig) onlyAdmin external {
        multisig = _multisig;
    }

    /// @notice allow admin to withdraw funds to multisig in the case of emergency (ONLY USED IN THE CASE OF EMERGENCY)
    /// @param _amountEth value of ETH to be withdrawn from the treasury to multisig (ONLY USED IN THE CASE OF EMERGENCY)
    function withdrawEth(uint _amountEth) onlyAdmin external {
        (bool sent, ) = payable(multisig).call{value: _amountEth}("");
        require(sent, "Failed to send Ether");
    }

    /// @notice allow admin to withdraw funds to multisig in the case of emergency (ONLY USED IN THE CASE OF EMERGENCY)
    /// @param _amountAbc value of ABC to be withdrawn from the treasury to multisig (ONLY USED IN THE CASE OF EMERGENCY)
    function withdrawAbc(uint _amountAbc) onlyAdmin external {
        bool sent = IERC20(ABCToken).transfer(multisig, _amountAbc);
        require(sent);
    }

    /// @notice set newAdmin (or burn admin when the time comes)
    /// @param _newAdmin desired admin address to be stored and referenced in contract
    function setAdmin(address _newAdmin) onlyAdmin external {
        admin = _newAdmin;
    }

    /// @notice set pricing factory address to allow for updates
    /// @param _pricingFactory desired pricing session principle address to be stored and referenced in contract
    function setPricingSession(address _pricingFactory) onlyAdmin external {
        pricingSession = _pricingFactory;
    }

    /// @notice set auction contract for bounty auction period
    /// @param _auction desired auction address to be stored and referenced in contract
    function setAuction(address _auction) onlyAdmin external {
        auction = _auction;
    }

    function setCreditStore(address _creditStore) onlyAdmin external {
        creditStore = _creditStore;
    }

    /* ======== CHILD FUNCTIONS ======== */
    
    /// @notice send ABC to users that earn 
    /// @param recipient the user that will be receiving ABC 
    /// @param _amount the amount of ABC to be transferred to the recipient
    function sendABCToken(address recipient, uint _amount) public {
        require(msg.sender == creditStore || msg.sender == admin);
        if(msg.sender == creditStore) {
            IERC20(ABCToken).transfer(recipient, payoutMultiplier * _amount / 100);
        }
        else {
            IERC20(ABCToken).transfer(recipient, _amount);
        }
    }

    /// @notice track amount of nfts priced
    function updateNftPriced() isFactory external {
        nftsPriced++;
    }

    /// @notice track total profits generated by the protocol through fees
    function updateTotalProfitsGenerated(uint _amount) isFactory external {
        profitGenerated += _amount;
    }

    /* ======== FALLBACKS ======== */

    receive() external payable {}
    fallback() external payable {}

    /* ======== MODIFIERS ======== */

    ///@notice check that msg.sender is admin
    modifier onlyAdmin() {
        require(admin == msg.sender, "not admin");
        _;
    }
    
    ///@notice check that msg.sender is factory
    modifier isFactory() {
        require(msg.sender == pricingSession, "not session contract");
        _;
    }

    ///@notice check that msg.sender is factory
    modifier isCreditStore() {
        require(msg.sender == creditStore, "not credit store contract");
        _;
    }
}


// File contracts/CreditVault.sol

pragma solidity ^0.8.0;



/// @author Medici
/// @title Treasury contract for Abacus
contract CreditVault is  ReentrancyGuard {

    /* ======== UINT ======== */

    uint public tokensClaimed;

    /* ======== BOOL ======== */

    bool public tokenStatus;

    /* ======== ADDRESS ======== */

    address public auction;
    address public pricingSession;
    address public admin;
    address public token;
    address public multisig;
    address public treasury;

    /* ======== MAPPING ======== */

    /// @notice maps each user to their total profit earned
    mapping(address => uint) public profitStored;

    /// @notice maps each user to their principal stored
    mapping(address => uint) public principalStored;

    /// @notice maps each user to their history of profits earned 
    mapping(address => uint) public totalProfitEarned;

    /* ======== EVENTS ======== */

    event ethClaimedByUser(address user_, uint ethClaimed);
    event ethToABCExchange(address user_, uint ethExchanged, uint ppSent);

    /* ======== CONSTRUCTOR ======== */

    constructor() {
        admin = msg.sender;
    }

    /* ======== ADMIN FUNCTIONS ======== */

    function setTokenStatus(bool _status) onlyAdmin external {
        tokenStatus = _status;
    }

    /// @notice set ABC token contract address 
    /// @param _ABCToken desired ABC token to be stored and referenced in contract
    function setABCTokenAddress(address _ABCToken) onlyAdmin external {
        token = _ABCToken;
    }

    function setMultisig(address _multisig) onlyAdmin external {
        multisig = _multisig;
    }

    function setTreasury(address _treasury) onlyAdmin external {
        treasury = _treasury;
    }

    /// @notice set newAdmin (or burn admin when the time comes)
    /// @param _newAdmin desired admin address to be stored and referenced in contract
    function setAdmin(address _newAdmin) onlyAdmin external {
        admin = _newAdmin;
    }

    /// @notice set pricing factory address to allow for updates
    /// @param _pricingFactory desired pricing session principle address to be stored and referenced in contract
    function setPricingSession(address _pricingFactory) onlyAdmin external {
        pricingSession = _pricingFactory;
    }

    /// @notice set auction contract for bounty auction period
    /// @param _auction desired auction address to be stored and referenced in contract
    function setAuction(address _auction) onlyAdmin external {
        auction = _auction;
    }

    /* ======== USER FUNCTIONS ======== */

    /// @notice user deposits principal
    function depositPrincipal() nonReentrant payable external {
        principalStored[msg.sender] += msg.value;
    }

    /// @notice allows user to reclaim principalUsed in batches
    function claimPrincipalUsed(uint _amount) nonReentrant external {
        require(_amount <= principalStored[msg.sender]);
        principalStored[msg.sender] -= _amount;
        (bool sent, ) = msg.sender.call{value: _amount}("");
        require(sent, "Failed to send Ether");
    }

    /// @notice allows user to claim batched earnings
    /// @param trigger denotes whether the user desires it in ETH (1) or ABC (2)
    function claimProfitsEarned(uint trigger, uint _amount) nonReentrant external {
        require(trigger == 1 || trigger == 2);
        require(profitStored[msg.sender] >= _amount);
        if(trigger == 1) {
            (bool sent, ) = msg.sender.call{value: _amount}("");
            require(sent, "Failed to send Ether");
            profitStored[msg.sender] -= _amount;
            emit ethClaimedByUser(msg.sender, _amount);
        }
        else if(trigger == 2) {
            require(tokenStatus);
            uint abcAmount = _amount * ethToAbc();
            tokensClaimed += abcAmount;
            profitStored[msg.sender] -= _amount;
            ABCTreasury(payable(treasury)).sendABCToken(msg.sender, abcAmount);
            emit ethToABCExchange(msg.sender, _amount, abcAmount);
        }
    } 

    /* ======== CHILD FUNCTIONS ======== */

    /// @notice Allows Factory contract to update the profit generated value
    /// @param _amount the amount of profit to update profitGenerated count
    function increasePrincipalStored(address _user, uint _amount) isFactory external { 
        principalStored[_user] += _amount;
    }

    /// @notice decrease credit stored
    function decreasePrincipalStored(address _user, uint _amount) isFactory external {
        require(principalStored[_user] >= _amount);
        principalStored[_user] -= _amount;
    }
    
    /// @notice track profits earned by a user
    function updateProfitStored(address _user, uint _amount) isFactory external {
        profitStored[_user] += _amount;
        totalProfitEarned[_user] += _amount;
    }

    function sendToTreasury(uint _amount) isFactory external {
        payable(treasury).transfer(_amount);
    }

    /* ======== VIEW FUNCTIONS ======== */

    /// @notice returns the current spot exchange rate of ETH to ABC
    function ethToAbc() view public returns(uint) {
        return 1e18 / (0.00005 ether + 0.000015 ether * ((ABCTreasury(payable(treasury)).tokensClaimed()/2) / (1000000*1e18)));
    }

    /* ======== FALLBACKS ======== */

    receive() external payable {}
    fallback() external payable {}

    /* ======== MODIFIERS ======== */

    ///@notice check that msg.sender is admin
    modifier onlyAdmin() {
        require(admin == msg.sender, "not admin");
        _;
    }
    
    ///@notice check that msg.sender is factory
    modifier isFactory() {
        require(msg.sender == pricingSession, "not session contract");
        _;
    }
}


// File contracts/PricingSession.sol

pragma solidity ^0.8.0;








/// @author Medici
/// @title Pricing session contract for Abacus
contract PricingSession is ReentrancyGuard {

    using SafeMath for uint;

    /* ======== ADDRESS ======== */

    address ABCToken;
    ABCTreasury Treasury;
    address admin;
    address auction;
    address creditStore;
    
    /* ======== MAPPINGS ======== */

    /// @notice maps each NFT to its current nonce value
    mapping(address => mapping (uint => uint)) public nftNonce; 

    mapping(uint => mapping(address => mapping(uint => address[]))) NftSessionVoters;

    mapping(uint => mapping(address => mapping(uint => VotingSessionMapping))) NftSessionMap;

    /// @notice maps each NFT pricing session (nonce dependent) to its necessary session checks (i.e. checking session progression)
    /// @dev nonce => tokenAddress => tokenId => session metadata
    mapping(uint => mapping(address => mapping(uint => VotingSessionChecks))) public NftSessionCheck;

    /// @notice maps each NFT pricing session (nonce dependent) to its necessary session core values (i.e. total participants, total stake, etc...)
    mapping(uint => mapping(address => mapping(uint => VotingSessionCore))) public NftSessionCore;

    /// @notice maps each NFT pricing session (nonce dependent) to its final appraisal value output
    mapping(uint => mapping(address => mapping(uint => uint))) public finalAppraisalValue;
    
    /* ======== STRUCTS ======== */

    /// @notice tracks all of the mappings necessary to operate a session
    struct VotingSessionMapping {

        mapping (address => uint) voterCheck;
        mapping (address => uint) winnerPoints;
        mapping (address => uint) secondaryPoint;
        mapping (address => uint) amountHarvested;
        mapping (address => Voter) nftVotes;
    }

    /// @notice track necessary session checks (i.e. whether its time to weigh votes or harvest)
    struct VotingSessionChecks {

        uint revealedStake;
        uint sessionProgression;
        uint calls;
        uint correct;
        uint incorrect;
        uint defender;
        uint spread;
        uint riskFactor;
        uint finalStdev;
        uint secondaryPoints;
    }

    /// @notice track the core values of a session (max appraisal value, total session stake, etc...)
    struct VotingSessionCore {

        uint endTime;
        uint bounty;
        uint keeperReward;
        uint lowestStake;
        uint maxAppraisal;
        uint totalAppraisalValue;
        uint totalSessionStake;
        uint totalProfit;
        uint totalWinnerPoints;
        uint totalVotes;
        uint uniqueVoters;
        uint votingTime;
    }

    /// @notice track voter information
    struct Voter {

        bytes32 concealedAppraisal;
        uint base;
        uint appraisal;
        uint stake;
    }

    /* ======== EVENTS ======== */

    event PricingSessionCreated(address creator_, uint nonce, address nftAddress_, uint tokenid_, uint initialAppraisal_, uint bounty_);
    event newAppraisalAdded(address voter_, uint nonce, address nftAddress_, uint tokenid_, uint stake_, bytes32 userHash_);
    event voteWeighed(address user_, uint nonce, address nftAddress_, uint tokenid_, uint appraisal);
    event finalAppraisalDetermined(uint nonce, address nftAddress_, uint tokenid_, uint finalAppraisal, uint amountOfParticipants, uint totalStake);
    event sessionEnded(address nftAddress, uint tokenid, uint nonce);

    /* ======== CONSTRUCTOR ======== */

    constructor(address _treasury, address _auction, address _creditStore) {
        Treasury = ABCTreasury(payable(_treasury));
        auction = _auction;
        admin = msg.sender;
        creditStore = _creditStore;
    }

    /// @notice set the auction address to be referenced throughout the contract
    /// @param _auction desired auction address to be stored and referenced in contract
    function setAuction(address _auction) onlyAdmin external {
        auction = _auction;
    }

    /// @notice set the treasury address
    /// @param treasury desired treasury address to be stored and referenced in contract
    function setTreasury(address treasury) onlyAdmin external {
        Treasury = ABCTreasury(payable(treasury));
    }

    /// @notice set ABC token address
    function setABCToken(address _token) onlyAdmin external {
        ABCToken = _token;
    }

    /// @notice Allow user to create new session and attach initial bounty
    /**
    @dev NFT sessions are indexed using a nonce per specific nft.
    The mapping is done by mapping a nonce to an NFT address to the 
    NFT token id. 
    */ 
    /// @param nftAddress NFT contract address of desired NFT to be priced
    /// @param tokenid NFT token id of desired NFT to be priced 
    /// @param _initialAppraisal appraisal value for max value to be instantiated against
    /// @param _votingTime voting window duration
    function createNewSession(
        address nftAddress,
        uint tokenid,
        uint _initialAppraisal,
        uint _votingTime
    ) stopOverwrite(nftAddress, tokenid) external payable {
        require(_votingTime <= 1 days && (!Treasury.auctionStatus() || msg.sender == auction));
        VotingSessionCore storage sessionCore = NftSessionCore[nftNonce[nftAddress][tokenid]][nftAddress][tokenid];
        if(msg.sender == auction) {}
        else {
            uint abcCost = 0.005 ether *(CreditVault(payable(creditStore)).ethToAbc());
            (bool abcSent) = IERC20(ABCToken).transferFrom(msg.sender, address(Treasury), abcCost);
            require(abcSent);
        }
        if(nftNonce[nftAddress][tokenid] == 0 || getStatus(nftAddress, tokenid) == 5) {}
        else if(block.timestamp > sessionCore.endTime + sessionCore.votingTime * 3) {
            CreditVault(payable(creditStore)).sendToTreasury(sessionCore.totalSessionStake);
            sessionCore.totalSessionStake = 0;
            emit sessionEnded(nftAddress, tokenid, nftNonce[nftAddress][tokenid]);
        }
        nftNonce[nftAddress][tokenid]++;
        VotingSessionCore storage sessionCoreNew = NftSessionCore[nftNonce[nftAddress][tokenid]][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nftNonce[nftAddress][tokenid]][nftAddress][tokenid];
        sessionCoreNew.votingTime = _votingTime;
        sessionCoreNew.maxAppraisal = 69420 * _initialAppraisal / 1000;
        sessionCoreNew.lowestStake = 100000 ether;
        sessionCoreNew.endTime = block.timestamp + _votingTime;
        sessionCoreNew.bounty = msg.value;
        sessionCheck.defender = Treasury.defender();
        sessionCheck.spread = Treasury.spread();
        sessionCheck.riskFactor = Treasury.riskFactor();
        payable(creditStore).transfer(sessionCoreNew.bounty);
        emit PricingSessionCreated(msg.sender, nftNonce[nftAddress][tokenid], nftAddress, tokenid, _initialAppraisal, msg.value);
    }

    /* ======== USER VOTE FUNCTIONS ======== */
    
    /// @notice Allows user to set vote in party 
    /** 
    @dev Users appraisal is hashed so users can't track final appraisal and submit vote right before session ends.
    Therefore, users must remember their appraisal in order to reveal their appraisal in the next function.
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param concealedAppraisal concealed bid that is a hash of the appraisooooors appraisal value, wallet address, and seed number
    function setVote(
        address nftAddress,
        uint tokenid,
        uint stake,
        bytes32 concealedAppraisal
    ) properVote(nftAddress, tokenid, stake) external {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        require(sessionCore.endTime > block.timestamp && stake <= CreditVault(payable(creditStore)).principalStored(msg.sender));
        sessionMap.voterCheck[msg.sender] = 1;
        CreditVault(payable(creditStore)).decreasePrincipalStored(msg.sender, stake);
        stake -= 0.004 ether;
        sessionCore.keeperReward += 0.002 ether;
        sessionCore.bounty += 0.002 ether;
        if (stake < sessionCore.lowestStake) {
            sessionCore.lowestStake = stake;
        }
        sessionCore.uniqueVoters++;
        sessionCore.totalSessionStake = sessionCore.totalSessionStake.add(stake);
        sessionMap.nftVotes[msg.sender].concealedAppraisal = concealedAppraisal;
        sessionMap.nftVotes[msg.sender].stake = stake;
        emit newAppraisalAdded(msg.sender, nonce, nftAddress, tokenid, stake, concealedAppraisal);
    }

    /// @notice allow user to update value inputs of their vote while voting is still active
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param concealedAppraisal concealed bid that is a hash of the appraisooooors new appraisal value, wallet address, and seed number
    function updateVote(
        address nftAddress,
        uint tokenid,
        bytes32 concealedAppraisal
    ) external {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        require(sessionMap.voterCheck[msg.sender] == 1);
        require(sessionCore.endTime > block.timestamp);
        sessionMap.nftVotes[msg.sender].concealedAppraisal = concealedAppraisal;
    }

    /// @notice Reveals user vote and weights based on the sessions lowest stake
    /**
    @dev calculation can be found in the weightVoteLibrary.sol file. 
    Votes are weighted as sqrt(userStake/lowestStake). Depending on a votes weight
    it is then added as multiple votes of that appraisal (i.e. if someoneone has
    voting weight of 8, 8 votes are submitted using their appraisal).
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param appraisal appraisooooor appraisal value used to unlock concealed appraisal
    /// @param seedNum appraisooooor seed number used to unlock concealed appraisal
    function weightVote(address nftAddress, uint tokenid, uint appraisal, uint seedNum) checkParticipation(nftAddress, tokenid) nonReentrant external {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        address[] storage voters = NftSessionVoters[nonce][nftAddress][tokenid];
        require(sessionCheck.sessionProgression < 2
                && sessionCore.endTime < block.timestamp
                && sessionMap.voterCheck[msg.sender] == 1
                && sessionMap.nftVotes[msg.sender].concealedAppraisal == keccak256(abi.encodePacked(appraisal, msg.sender, seedNum))
                && sessionCore.maxAppraisal >= appraisal
        );
        sessionMap.voterCheck[msg.sender] = 2;
        if(sessionCheck.sessionProgression == 0) {
            sessionCheck.sessionProgression = 1;
        }
        sessionCheck.revealedStake += sessionMap.nftVotes[msg.sender].stake;
        voters.push(msg.sender);
        _weigh(nftAddress, tokenid, appraisal);
        emit voteWeighed(msg.sender, nonce, nftAddress, tokenid, appraisal);
        if(sessionCheck.calls == sessionCore.uniqueVoters || block.timestamp > sessionCore.endTime + sessionCore.votingTime) {
            sessionCheck.sessionProgression = 2;
            sessionCore.uniqueVoters = sessionCheck.calls;
            sessionCheck.calls = 0;
        }
    }
    
    /// @notice takes average of appraisals and outputs a final appraisal value.
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function setFinalAppraisal(address nftAddress, uint tokenid) public {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        require(
            (block.timestamp > sessionCore.endTime + sessionCore.votingTime || sessionCheck.sessionProgression == 2)
            && sessionCheck.sessionProgression <= 2
        );
        CreditVault(payable(creditStore)).updateProfitStored(msg.sender, sessionCore.keeperReward/2 ether);
        _boundCheck(nftAddress, tokenid);
        sessionCore.totalProfit += sessionCore.bounty + (sessionCore.totalSessionStake - sessionCheck.revealedStake);
        sessionCheck.calls = 0;
        finalAppraisalValue[nonce][nftAddress][tokenid] = (sessionCore.totalAppraisalValue)/(sessionCore.totalVotes);
        sessionCheck.sessionProgression = 3;
        emit finalAppraisalDetermined(nftNonce[nftAddress][tokenid], nftAddress, tokenid, finalAppraisalValue[nftNonce[nftAddress][tokenid]][nftAddress][tokenid], sessionCore.uniqueVoters, sessionCore.totalSessionStake);
    }

    /// @notice Calculates users base and harvests their loss before returning remaining stake
    /**
    @dev A couple notes:
    1. Base is calculated based on margin of error.
        > +/- 5% = 1
        > +/- 4% = 2
        > +/- 3% = 3
        > +/- 2% = 4
        > +/- 1% = 5
        > Exact = 6
    2. winnerPoints are calculated based on --> base * stake
    3. Losses are harvested based on --> (margin of error - 5%) * stake
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function harvest(address nftAddress, uint tokenid) checkParticipation(nftAddress, tokenid) nonReentrant external returns(uint256){
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        address[] storage voters = NftSessionVoters[nonce][nftAddress][tokenid];
        require(sessionCheck.sessionProgression == 3);
        address user;
        for(uint i = 0; i < 20; i++) {
            user = voters[sessionCheck.calls];
            CreditVault(payable(creditStore)).updateProfitStored(msg.sender, 0.0005 ether);
            sessionCheck.calls++;
            _harvest(user, nftAddress, tokenid);
            if(sessionCheck.calls == sessionCore.uniqueVoters) {
                sessionCheck.sessionProgression = 4;
                sessionCore.uniqueVoters = sessionCheck.calls;
                sessionCheck.calls = 0;
                return 1;
            }
        }
        return 1;
    }

    /// @notice User claims principal stake along with any earned profits in ETH or ABC form
    /**
    @dev 
    1. Calculates user principal return value
    2. Enacts sybil defense mechanism
    3. Edits totalProfits and totalSessionStake to reflect claim
    5. Pays out principal
    6. Adds profit credit to profitStored
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function claim(address nftAddress, uint tokenid) checkParticipation(nftAddress, tokenid) nonReentrant external returns(uint) {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        address[] storage voters = NftSessionVoters[nonce][nftAddress][tokenid];
        require(sessionCheck.sessionProgression == 4);
        address user;
        for(uint i = 0; i < 20; i++) {
            user = voters[sessionCheck.calls];
            CreditVault(payable(creditStore)).updateProfitStored(msg.sender, 0.0005 ether);
            sessionCheck.calls++;
            _claim(user, nftAddress, tokenid);
            if(sessionCheck.calls == sessionCore.uniqueVoters) {
                sessionCore.totalSessionStake = 0;
                sessionCheck.sessionProgression = 5;
                emit sessionEnded(nftAddress, tokenid, nonce);
                return 1;
            }
        }
        return 1;
    }

    /* ======== INTERNAL FUNCTIONS ======== */

    ///@notice user vote is weighed
    /**
    @dev a voters weight is determined by the following formula:
        sqrt(voterStake/lowestStake)
    this value is then used to
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param appraisal the voters appraisal value 
    function _weigh(address nftAddress, uint tokenid, uint appraisal) internal {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        sessionMap.nftVotes[msg.sender].appraisal = appraisal;
        uint weight = sqrtLibrary.sqrt(sessionMap.nftVotes[msg.sender].stake/sessionCore.lowestStake);
        sessionCore.totalVotes += weight;
        sessionCheck.calls++;
        
        sessionCore.totalAppraisalValue += weight * appraisal;
    }

    /// @notice user vote is checked against the post-determined lower and upper bound 
    /**
    @dev the upper bound for acceptable votes are set using the following equation:

    Calculate margin
        uint256 margin = 3 * stdev + 20e18 / final_appraisal;

    Calculate inclusion bound
        uint256 upper_bound = final_appraisal + margin;
    
    This function is used to root out extreme entries that may be malicious or accidental.
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function _boundCheck(address nftAddress, uint tokenid) internal {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        address[] storage voters = NftSessionVoters[nonce][nftAddress][tokenid];
        if(sessionCheck.calls != 0) {
            sessionCore.uniqueVoters = sessionCheck.calls;
        }
        uint rounds = sessionCore.uniqueVoters / 20 + 1;
        uint totalValue;
        uint voterCount;
        uint invalidCount; 
        for(uint a = 0; a <= sessionCheck.defender; a++) {
            uint finalAppraisal = (sessionCore.totalAppraisalValue)/(sessionCore.totalVotes);
            voterCount = 0;
            for(uint i = 0; i < rounds; i++) {
                for(uint j = 0; j < 20; j++) {
                    if (voterCount == sessionCore.uniqueVoters) { 
                        break; 
                    }
                    if(sessionMap.nftVotes[voters[voterCount]].appraisal == 0) {}
                    else if(sessionMap.nftVotes[voters[voterCount]].appraisal > finalAppraisal) { 
                        totalValue += (sessionMap.nftVotes[voters[voterCount]].appraisal - finalAppraisal) ** 2;
                    }
                    else { 
                        totalValue += (finalAppraisal - sessionMap.nftVotes[voters[voterCount]].appraisal) ** 2;
                    }
                    voterCount++;
                }
            }
            uint stdev = sqrtLibrary.sqrt(totalValue/(sessionCore.uniqueVoters - invalidCount));
            totalValue = 0;
            sessionCheck.finalStdev = stdev;
            if(a == sessionCheck.defender) {
                break;
            }
            voterCount = 0;
            uint upper = PostSessionLibrary.calculateBound(finalAppraisal, stdev, sessionCheck.defender);
            uint weight;
            for(uint i = 0; i < rounds; i++) {
                for(uint j = 0; j < 20; j++) {
                    if (voterCount == sessionCore.uniqueVoters) {
                        break;
                    }
                    weight = sqrtLibrary.sqrt(sessionMap.nftVotes[voters[voterCount]].stake/sessionCore.lowestStake);
                    if(sessionMap.nftVotes[voters[voterCount]].appraisal > upper) {
                        sessionCore.totalVotes -= weight * (sessionMap.nftVotes[voters[voterCount]].appraisal == 0? 0:1);
                        sessionCore.totalAppraisalValue -= weight * sessionMap.nftVotes[voters[voterCount]].appraisal;
                        sessionMap.nftVotes[voters[voterCount]].appraisal = 0;
                        invalidCount++;
                    }
                    voterCount++;
                }
            }
        }
    }

    /// @notice Calculates users base and harvests their loss before returning remaining stake
    /**
    @dev A couple notes:
    1. Base is calculated based on margin of error.
        > +/- 5% = 1
        > +/- 4% = 2
        > +/- 3% = 3
        > +/- 2% = 4
        > +/- 1% = 5
        > Exact = 6
    2. winnerPoints are calculated based on --> base * stake
    3. Losses are harvested based on --> (margin of error - 5%) * stake
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param _user the user that harvest is being called on
    function _harvest(address _user, address nftAddress, uint tokenid) internal {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        uint finalAppraisal = finalAppraisalValue[nftNonce[nftAddress][tokenid]][nftAddress][tokenid];
        sessionMap.nftVotes[_user].base = 
            PostSessionLibrary.calculateBase(
                finalAppraisal, 
                sessionMap.nftVotes[_user].appraisal,
                sessionCheck.spread
            );
        uint weight = sqrtLibrary.sqrt(sessionMap.nftVotes[_user].stake/sessionCore.lowestStake);
        if(sessionMap.nftVotes[_user].base > 0) {
            sessionCore.totalWinnerPoints += sessionMap.nftVotes[_user].base * weight;
            sessionMap.winnerPoints[_user] = sessionMap.nftVotes[_user].base * weight;
            sessionCheck.correct += weight;
        }
        else if(
            sessionMap.nftVotes[_user].appraisal < finalAppraisal + sessionCheck.finalStdev 
            && sessionMap.nftVotes[_user].appraisal > (finalAppraisal < sessionCheck.finalStdev ? 0 : finalAppraisal - sessionCheck.finalStdev)
        ) {
            sessionMap.secondaryPoint[_user] += sessionMap.nftVotes[_user].stake;
            sessionCheck.secondaryPoints += sessionMap.nftVotes[_user].stake;
            sessionCheck.incorrect += weight;
        }
        else {
            sessionCheck.incorrect += weight;
        }
        
        sessionMap.amountHarvested[_user] = PostSessionLibrary.harvest( 
            sessionMap.nftVotes[_user].stake, 
            sessionMap.nftVotes[_user].appraisal,
            finalAppraisalValue[nftNonce[nftAddress][tokenid]][nftAddress][tokenid],
            sessionCheck.riskFactor,
            sessionCheck.spread
        );

        sessionMap.nftVotes[_user].stake -= sessionMap.amountHarvested[_user];
        uint commission = sessionMap.amountHarvested[_user] * 500 / 10000;
        sessionCore.totalSessionStake -= commission;
        sessionMap.amountHarvested[_user] -= commission;
        sessionCore.totalProfit += sessionMap.amountHarvested[_user];
        CreditVault(payable(creditStore)).sendToTreasury(commission);
    }


    /// @notice User claims principal stake along with any earned profits in ETH or ABC form
    /**
    @dev 
    1. Calculates user principal return value
    2. Enacts sybil defense mechanism
    3. Edits totalProfits and totalSessionStake to reflect claim
    5. Pays out principal
    6. Adds profit credit to profitStored
    */
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    /// @param _user the user that harvest is being called on
    function _claim(address _user, address nftAddress, uint tokenid) internal {
        uint nonce = nftNonce[nftAddress][tokenid];
        VotingSessionCore storage sessionCore = NftSessionCore[nonce][nftAddress][tokenid];
        VotingSessionChecks storage sessionCheck = NftSessionCheck[nonce][nftAddress][tokenid];
        VotingSessionMapping storage sessionMap = NftSessionMap[nonce][nftAddress][tokenid];
        uint principalReturn;
        if(sessionCheck.correct * 100 / (sessionCheck.correct + sessionCheck.incorrect) >= (95-sessionCheck.spread)) {
            principalReturn += sessionMap.nftVotes[_user].stake + sessionMap.amountHarvested[_user];
        }
        else {
            principalReturn += sessionMap.nftVotes[_user].stake;
        }
        uint payout;
        if(sessionCheck.correct * 100 / (sessionCheck.correct + sessionCheck.incorrect) >= (95-sessionCheck.spread)) {
            payout = sessionCore.bounty/sessionCore.uniqueVoters;
        }
        else if(sessionCheck.secondaryPoints + sessionCore.totalWinnerPoints == 0) {
            payout = 0;
        }
        else if (sessionCore.totalWinnerPoints == 0) {
            payout = sessionCore.totalProfit * sessionMap.secondaryPoint[_user] / sessionCheck.secondaryPoints;
            sessionCheck.secondaryPoints -= sessionMap.secondaryPoint[_user];
            sessionMap.secondaryPoint[_user] = 0;
        }
        else {
            payout = sessionCore.totalProfit * sessionMap.winnerPoints[_user] / sessionCore.totalWinnerPoints;
            sessionCore.totalWinnerPoints -= sessionMap.winnerPoints[_user];
            sessionMap.winnerPoints[_user] = 0;
        }
        sessionCore.totalProfit -= payout;
        Treasury.updateTotalProfitsGenerated(payout);
        CreditVault(payable(creditStore)).increasePrincipalStored(_user, principalReturn);
        CreditVault(payable(creditStore)).updateProfitStored(_user, payout);
    }

    /* ======== VIEW FUNCTIONS ======== */

    /// @notice returns the status of the session in question
    /// @param nftAddress NFT contract address of NFT being appraised
    /// @param tokenid NFT tokenid of NFT being appraised
    function getStatus(address nftAddress, uint tokenid) view public returns(uint) {
        return NftSessionCheck[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].sessionProgression;
    }

    // /// @notice check the users status in terms of session interaction
    // /// @param nftAddress NFT contract address of NFT being appraised
    // /// @param tokenid NFT tokenid of NFT being appraised
    // /// @param _user appraisooooor who's session progress is of interest
    function getVoterCheck(address nftAddress, uint tokenid, address _user) view external returns(uint) {
        return NftSessionMap[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].voterCheck[_user];
    }

    /* ======== FALLBACK FUNCTIONS ======== */

    receive() external payable {}
    fallback() external payable {}

    /* ======== MODIFIERS ======== */

    /// @notice stop users from being able to create multiple sessions for the same NFT at the same time
    modifier stopOverwrite(
        address nftAddress, 
        uint tokenid
    ) {
        require(
            nftNonce[nftAddress][tokenid] == 0 
            || getStatus(nftAddress, tokenid) == 5
            || block.timestamp > NftSessionCore[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].endTime + 2 * NftSessionCore[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].votingTime
        );
        _;
    }
    
    /// @notice makes sure that a user that submits a vote satisfies the proper voting parameters
    modifier properVote(
        address nftAddress,
        uint tokenid,
        uint stake
    ) {
        require(
            NftSessionMap[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].voterCheck[msg.sender] == 0
            && stake >= 0.009 ether
        );
        _;
    }
    
    /// @notice checks the participation of the msg.sender 
    modifier checkParticipation(
        address nftAddress,
        uint tokenid
    ) {
        require(NftSessionMap[nftNonce[nftAddress][tokenid]][nftAddress][tokenid].voterCheck[msg.sender] > 0);
        _;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin);
        _;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_auction","type":"address"},{"internalType":"address","name":"_creditStore","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator_","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftAddress_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initialAppraisal_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bounty_","type":"uint256"}],"name":"PricingSessionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftAddress_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"finalAppraisal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfParticipants","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStake","type":"uint256"}],"name":"finalAppraisalDetermined","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter_","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftAddress_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stake_","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"userHash_","type":"bytes32"}],"name":"newAppraisalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"sessionEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user_","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftAddress_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenid_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"appraisal","type":"uint256"}],"name":"voteWeighed","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"NftSessionCheck","outputs":[{"internalType":"uint256","name":"revealedStake","type":"uint256"},{"internalType":"uint256","name":"sessionProgression","type":"uint256"},{"internalType":"uint256","name":"calls","type":"uint256"},{"internalType":"uint256","name":"correct","type":"uint256"},{"internalType":"uint256","name":"incorrect","type":"uint256"},{"internalType":"uint256","name":"defender","type":"uint256"},{"internalType":"uint256","name":"spread","type":"uint256"},{"internalType":"uint256","name":"riskFactor","type":"uint256"},{"internalType":"uint256","name":"finalStdev","type":"uint256"},{"internalType":"uint256","name":"secondaryPoints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"NftSessionCore","outputs":[{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"bounty","type":"uint256"},{"internalType":"uint256","name":"keeperReward","type":"uint256"},{"internalType":"uint256","name":"lowestStake","type":"uint256"},{"internalType":"uint256","name":"maxAppraisal","type":"uint256"},{"internalType":"uint256","name":"totalAppraisalValue","type":"uint256"},{"internalType":"uint256","name":"totalSessionStake","type":"uint256"},{"internalType":"uint256","name":"totalProfit","type":"uint256"},{"internalType":"uint256","name":"totalWinnerPoints","type":"uint256"},{"internalType":"uint256","name":"totalVotes","type":"uint256"},{"internalType":"uint256","name":"uniqueVoters","type":"uint256"},{"internalType":"uint256","name":"votingTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"_initialAppraisal","type":"uint256"},{"internalType":"uint256","name":"_votingTime","type":"uint256"}],"name":"createNewSession","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"finalAppraisalValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getVoterCheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setABCToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auction","type":"address"}],"name":"setAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"setFinalAppraisal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"bytes32","name":"concealedAppraisal","type":"bytes32"}],"name":"setVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"bytes32","name":"concealedAppraisal","type":"bytes32"}],"name":"updateVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"appraisal","type":"uint256"},{"internalType":"uint256","name":"seedNum","type":"uint256"}],"name":"weightVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260016000553480156200001657600080fd5b50604051620062053803806200620583398181016040528101906200003c919062000160565b82600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000204565b6000815190506200015a81620001ea565b92915050565b6000806000606084860312156200017657600080fd5b6000620001868682870162000149565b9350506020620001998682870162000149565b9250506040620001ac8682870162000149565b9150509250925092565b6000620001c382620001ca565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620001f581620001b6565b81146200020157600080fd5b50565b615ff180620002146000396000f3fe6080604052600436106100f75760003560e01c80638fec87611161008a578063c0fffaf011610059578063c0fffaf01461037f578063da7ea9fe146103bc578063f0f44260146103e5578063f3b6ddea1461040e576100fe565b80638fec8761146102b3578063a98302bf146102dc578063aad3ec9614610319578063b8c6f57914610356576100fe565b806341e115e4116100c657806341e115e4146101dc5780634ce0ef95146102055780638ab88529146102425780638c4ab3fc1461028a576100fe565b8063018ee9b7146101005780631ecb093b1461013d5780632171d26e1461018357806335d55930146101c0576100fe565b366100fe57005b005b34801561010c57600080fd5b5061012760048036038101906101229190615434565b610437565b604051610134919061596c565b60405180910390f35b34801561014957600080fd5b50610164600480360381019061015f9190615626565b610898565b60405161017a9a999897969594939291906159e8565b60405180910390f35b34801561018f57600080fd5b506101aa60048036038101906101a59190615434565b610906565b6040516101b7919061596c565b60405180910390f35b6101da60048036038101906101d59190615571565b61092b565b005b3480156101e857600080fd5b5061020360048036038101906101fe9190615434565b6115d1565b005b34801561021157600080fd5b5061022c60048036038101906102279190615434565b6119fa565b604051610239919061596c565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190615626565b611ab9565b6040516102819c9b9a99989796959493929190615a84565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac919061540b565b611b33565b005b3480156102bf57600080fd5b506102da60048036038101906102d59190615571565b611bd1565b005b3480156102e857600080fd5b5061030360048036038101906102fe9190615470565b6121a4565b604051610310919061596c565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190615434565b6122a1565b60405161034d919061596c565b60405180910390f35b34801561036257600080fd5b5061037d6004803603810190610378919061540b565b612730565b005b34801561038b57600080fd5b506103a660048036038101906103a19190615626565b6127ce565b6040516103b3919061596c565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de91906154bf565b612800565b005b3480156103f157600080fd5b5061040c6004803603810190610407919061540b565b6129ce565b005b34801561041a57600080fd5b506104356004803603810190610430919061550e565b612a6c565b005b60008282600060086000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161053957600080fd5b600160008082825461054b9190615b4f565b925050819055506000805490506000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205490506000600a600083815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020905060006009600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020905060006007600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a8152602001908152602001600020905060038260010154146106ed57600080fd5b600080600090505b6014811015610876578284600201548154811061073b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663955bbe9f336601c6bf526340006040518363ffffffff1660e01b81526004016107cc9291906157ae565b600060405180830381600087803b1580156107e657600080fd5b505af11580156107fa573d6000803e3d6000fd5b5050505083600201600081548092919061081390615e70565b9190505550610823828d8d612fc2565b84600a0154846002015414156108635760048460010181905550836002015485600a01819055506000846002018190555060019950505050505050610881565b808061086e90615e70565b9150506106f5565b506001985050505050505b600054811461088f57600080fd5b50505092915050565b60096020528260005260406000206020528160005260406000206020528060005260406000206000925092505050806000015490806001015490806002015490806003015490806004015490806005015490806006015490806007015490806008015490806009015490508a565b6006602052816000526040600020602052806000526040600020600091509150505481565b83836000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205414806109955750600561099383836119fa565b145b80610b1e5750600a6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828152602001908152602001600020600b01546002610a5c9190615d47565b600a6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000154610b1b9190615b4f565b42115b610b2757600080fd5b620151808311158015610c2f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d6a0f286040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9d57600080fd5b505afa158015610bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd591906155d4565b1580610c2e5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b5b610c3857600080fd5b6000600a6000600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000209050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610d4857610ee2565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d57decfe6040518163ffffffff1660e01b815260040160206040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea91906155fd565b6611c37937e08000610dfc9190615d47565b90506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b8152600401610e8193929190615777565b602060405180830381600087803b158015610e9b57600080fd5b505af1158015610eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed391906155d4565b905080610edf57600080fd5b50505b6000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020541480610f4a57506005610f4888886119fa565b145b15610f54576110a3565b600381600b0154610f659190615d47565b8160000154610f749190615b4f565b4211156110a257600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbcddeb582600601546040518263ffffffff1660e01b8152600401610fda919061596c565b600060405180830381600087803b158015610ff457600080fd5b505af1158015611008573d6000803e3d6000fd5b50505050600081600601819055507f924fae12512295cfa19a3652e038bf0451474177b5475e685c8e763fa5fc3a808787600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000205460405161109993929190615915565b60405180910390a15b5b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600081548092919061110490615e70565b91905055506000600a6000600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a815260200190815260200160002054815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000209050600060096000600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b815260200190815260200160002054815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002090508582600b01819055506103e88762010f2c61128e9190615d47565b6112989190615ba5565b826004018190555069152d02c7e14af6800000826003018190555085426112bf9190615b4f565b8260000181905550348260010181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4c91c56040518163ffffffff1660e01b815260040160206040518083038186803b15801561133857600080fd5b505afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137091906155fd565b8160050181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c25c76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113e057600080fd5b505afa1580156113f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141891906155fd565b8160060181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166304c46c136040518163ffffffff1660e01b815260040160206040518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c091906155fd565b8160070181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015611534573d6000803e3d6000fd5b507f477ad29eb622f3791efc4b67caa89e4a8300c9cd4c6e6fda01315c5699abdab833600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b8152602001908152602001600020548b8b8b346040516115be969594939291906158b4565b60405180910390a1505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205490506000600a600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060006009600084815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905081600b015482600001546117049190615b4f565b421180611715575060028160010154145b801561172657506002816001015411155b61172f57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663955bbe9f33671bc16d674ec8000085600201546117869190615ba5565b6040518363ffffffff1660e01b81526004016117a39291906157d7565b600060405180830381600087803b1580156117bd57600080fd5b505af11580156117d1573d6000803e3d6000fd5b505050506117df8585613a5e565b806000015482600601546117f39190615da1565b82600101546118029190615b4f565b8260070160008282546118159190615b4f565b92505081905550600081600201819055508160090154826005015461183a9190615ba5565b600b600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002081905550600381600101819055507f67453d0f9b986e49877629ed0fb8e1d26cc8b479bef035d5f433a1dcca7f9da7600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020548686600b6000600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b815260200190815260200160002054815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000205486600a015487600601546040516119eb96959493929190615987565b60405180910390a15050505050565b600060096000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010154905092915050565b600a602052826000526040600020602052816000526040600020602052806000526040600020600092509250505080600001549080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8d57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8383600060086000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611cd157600080fd5b6001600080828254611ce39190615b4f565b925050819055506000805490506000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000205490506000600a600083815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020905060006008600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a8152602001908152602001600020905060006009600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b8152602001908152602001600020905060006007600086815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c8152602001908152602001600020905060028260010154108015611ef05750428460000154105b8015611f3d575060018360000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b8015611fb6575089338a604051602001611f599392919061571f565b604051602081830303815290604052805190602001208360040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b8015611fc6575089846004015410155b611fcf57600080fd5b60028360000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008260010154141561202e57600182600101819055505b8260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548260000160008282546120869190615b4f565b9250508190555080339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120fa8c8c8c6144d5565b7f56499269f29291ec993c21cf722c8f3ff9e36667fa4fd8ce00cb0b937243265f33868e8e8e604051612131959493929190615800565b60405180910390a183600a015482600201541480612161575083600b0154846000015461215e9190615b4f565b42115b156121885760028260010181905550816002015484600a0181905550600082600201819055505b5050505050600054811461219b57600080fd5b50505050505050565b600060086000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002054815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b60008282600060086000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116123a357600080fd5b60016000808282546123b59190615b4f565b925050819055506000805490506000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205490506000600a600083815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020905060006009600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020905060006007600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000209050600482600101541461255757600080fd5b600080600090505b601481101561270e57828460020154815481106125a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663955bbe9f336601c6bf526340006040518363ffffffff1660e01b81526004016126369291906157ae565b600060405180830381600087803b15801561265057600080fd5b505af1158015612664573d6000803e3d6000fd5b5050505083600201600081548092919061267d90615e70565b919050555061268d828d8d614767565b84600a0154846002015414156126fb5760008560060181905550600584600101819055507f924fae12512295cfa19a3652e038bf0451474177b5475e685c8e763fa5fc3a808c8c886040516126e493929190615915565b60405180910390a160019950505050505050612719565b808061270690615e70565b91505061255f565b506001985050505050505b600054811461272757600080fd5b50505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461278a57600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60205282600052604060002060205281600052604060002060205280600052604060002060009250925050505481565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205490506000600a600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600084815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020905060018160000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461296d57600080fd5b4282600001541161297d57600080fd5b838160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a2857600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b838383600060086000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002054815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054148015612b775750661ff973cafa80008110155b612b8057600080fd5b6000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000205490506000600a600083815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000898152602001908152602001600020905060006008600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000209050428260000154118015612d5c5750600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663903aae40336040518263ffffffff1660e01b8152600401612d08919061575c565b60206040518083038186803b158015612d2057600080fd5b505afa158015612d34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5891906155fd565b8811155b612d6557600080fd5b60018160000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663832a5b0a338a6040518363ffffffff1660e01b8152600401612e099291906157d7565b600060405180830381600087803b158015612e2357600080fd5b505af1158015612e37573d6000803e3d6000fd5b50505050660e35fa931a000088612e4e9190615da1565b975066071afd498d0000826002016000828254612e6b9190615b4f565b9250508190555066071afd498d0000826001016000828254612e8d9190615b4f565b925050819055508160030154881015612eaa578782600301819055505b81600a016000815480929190612ebf90615e70565b9190505550612edb888360060154614e9f90919063ffffffff16565b8260060181905550868160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550878160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055507f3b5b5996d253333df335684c7d0c7ffb86f6bb889bf6d7bc7964b78a650a98d033848c8c8c8c604051612fae96959493929190615853565b60405180910390a150505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205490506000600a600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060006009600084815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002090506000600b6000600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002054905061324f818360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201548560060154614efd565b8260040160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555060006132f585600301548460040160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546132f09190615ba5565b615050565b905060008360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154111561346357808360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133949190615d47565b8560080160008282546133a79190615b4f565b92505081905550808360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133fe9190615d47565b8360010160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808460030160008282546134579190615b4f565b92505081905550613667565b8360080154826134739190615b4f565b8360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015410801561352a5750836008015482106134e0578360080154826134db9190615da1565b6134e3565b60005b8360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154115b1561364a578260040160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548360020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135c49190615b4f565b925050819055508260040160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548460090160008282546136239190615b4f565b925050819055508084600401600082825461363e9190615b4f565b92505081905550613666565b8084600401600082825461365e9190615b4f565b925050819055505b5b6137b58360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301548460040160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154600b6000600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b815260200190815260200160002054876007015488600601546150ad565b8360030160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508260030160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548360040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301600082825461388f9190615da1565b9250508190555060006127106101f48560030160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea9190615d47565b6138f49190615ba5565b90508086600601600082825461390a9190615da1565b92505081905550808460030160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139629190615da1565b925050819055508360030160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548660070160008282546139be9190615b4f565b92505081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbcddeb5826040518263ffffffff1660e01b8152600401613a20919061596c565b600060405180830381600087803b158015613a3a57600080fd5b505af1158015613a4e573d6000803e3d6000fd5b5050505050505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205490506000600a600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060006009600084815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020905060006007600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002090506000836002015414613c6157826002015484600a01819055505b60006001601486600a0154613c769190615ba5565b613c809190615b4f565b9050600080600080600090505b876005015481116144c757600089600901548a60050154613cae9190615ba5565b90506000935060005b868110156140145760005b6014811015614000578b600a0154861415613cdc57614000565b60008a60040160008b8981548110613d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541415613d9157613fdf565b828a60040160008b8981548110613dd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541115613f11576002838b60040160008c8a81548110613e82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154613ef59190615da1565b613eff9190615c29565b87613f0a9190615b4f565b9650613fde565b60028a60040160008b8981548110613f52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015484613fc69190615da1565b613fd09190615c29565b87613fdb9190615b4f565b96505b5b8580613fea90615e70565b9650508080613ff890615e70565b915050613cc2565b50808061400c90615e70565b915050613cb7565b50600061403a848c600a015461402a9190615da1565b876140359190615ba5565b615050565b905060009550808a60080181905550896005015483141561405c5750506144c7565b60009450600061407183838d6005015461533d565b9050600080600090505b898110156144af5760005b601481101561449b578e600a01548914156140a05761449b565b61415f8f600301548e60040160008f8d815481106140e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015461415a9190615ba5565b615050565b9250838d60040160008e8c815481106141a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154111561447a5760008d60040160008e8c81548110614251577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154146142c65760016142c9565b60005b60ff16836142d79190615d47565b8f60090160008282546142ea9190615da1565b925050819055508c60040160008d8b81548110614330577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154836143a49190615d47565b8f60050160008282546143b79190615da1565b9250508190555060008d60040160008e8c815481106143ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550878061447690615e70565b9850505b888061448590615e70565b995050808061449390615e70565b915050614086565b5080806144a790615e70565b91505061407b565b505050505080806144bf90615e70565b915050613c8d565b505050505050505050505050565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205490506000600a600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600084815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020905060006009600085815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000209050848260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600061470084600301548460040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546146fb9190615ba5565b615050565b9050808460090160008282546147169190615b4f565b9250508190555081600201600081548092919061473290615e70565b919050555085816147439190615d47565b8460050160008282546147569190615b4f565b925050819055505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205490506000600a600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020905060006009600084815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060006008600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020905060008260060154605f6148fe9190615da1565b836004015484600301546149129190615b4f565b606485600301546149239190615d47565b61492d9190615ba5565b106149d5578160030160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548260040160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546149c39190615b4f565b816149ce9190615b4f565b9050614a28565b8160040160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015481614a259190615b4f565b90505b60008360060154605f614a3b9190615da1565b84600401548560030154614a4f9190615b4f565b60648660030154614a609190615d47565b614a6a9190615ba5565b10614a8a5784600a01548560010154614a839190615ba5565b9050614cce565b600085600801548560090154614aa09190615b4f565b1415614aaf5760009050614ccd565b600085600801541415614bc65783600901548360020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548660070154614b129190615d47565b614b1c9190615ba5565b90508260020160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846009016000828254614b739190615da1565b9250508190555060008360020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ccc565b84600801548360010160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548660070154614c1c9190615d47565b614c269190615ba5565b90508260010160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856008016000828254614c7d9190615da1565b9250508190555060008360010160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b80856007016000828254614ce29190615da1565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633dce7dd3826040518263ffffffff1660e01b8152600401614d44919061596c565b600060405180830381600087803b158015614d5e57600080fd5b505af1158015614d72573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346d7e1fd8a846040518363ffffffff1660e01b8152600401614dd39291906157d7565b600060405180830381600087803b158015614ded57600080fd5b505af1158015614e01573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663955bbe9f8a836040518363ffffffff1660e01b8152600401614e629291906157d7565b600060405180830381600087803b158015614e7c57600080fd5b505af1158015614e90573d6000803e3d6000fd5b50505050505050505050505050565b6000808284614eae9190615b4f565b905083811015614ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614eea9061594c565b60405180910390fd5b8091505092915050565b600080600190506000846064614f139190615d47565b905060008490505b6001811061501757600087600183614f339190615da1565b6064614f3f9190615b4f565b614f499190615d47565b9050600088836064614f5b9190615b4f565b614f659190615d47565b9050600089846064614f779190615da1565b614f819190615d47565b905060008a6001866064614f959190615da1565b614f9f9190615b4f565b614fa99190615d47565b90508584108015614fba5750828611155b15614fce5786975050505050505050615049565b8582108015614fdd5750808611155b15614ff15786975050505050505050615049565b600187614ffe9190615b4f565b965050505050808061500f90615e46565b915050614f1b565b508560646150259190615d47565b811415615042576001846150399190615b4f565b92505050615049565b6000925050505b9392505050565b60008060026001846150629190615b4f565b61506c9190615ba5565b90508291505b818110156150a757809150600281828561508c9190615ba5565b6150969190615b4f565b6150a09190615ba5565b9050615072565b50919050565b6000838260646150bd9190615b4f565b6150c79190615d47565b6064866150d49190615d47565b11801561512557508160646150e99190615b4f565b84858460646150f89190615b4f565b6151029190615d47565b60648861510f9190615d47565b6151199190615da1565b6151239190615ba5565b115b806151305750600085145b1561513d57859050615334565b8382606461514b9190615b4f565b6151559190615d47565b6064866151629190615d47565b11156152365785836064866151779190615d47565b868560646151859190615b4f565b61518f9190615d47565b60648961519c9190615d47565b6151a69190615da1565b896151b19190615d47565b6151bb9190615ba5565b6151c59190615d47565b11156151d357859050615334565b826064856151e19190615d47565b858460646151ef9190615b4f565b6151f99190615d47565b6064886152069190615d47565b6152109190615da1565b8861521b9190615d47565b6152259190615ba5565b61522f9190615d47565b9050615334565b838260646152449190615da1565b61524e9190615d47565b60648661525b9190615d47565b101561532f5785836064866152709190615d47565b87606461527d9190615d47565b8786606461528b9190615da1565b6152959190615d47565b61529f9190615da1565b896152aa9190615d47565b6152b49190615ba5565b6152be9190615d47565b11156152cc57859050615334565b826064856152da9190615d47565b8660646152e79190615d47565b868560646152f59190615da1565b6152ff9190615d47565b6153099190615da1565b886153149190615d47565b61531e9190615ba5565b6153289190615d47565b9050615334565b600090505b95945050505050565b6000600260018361534e9190615b4f565b856801158e460913d000006153639190615ba5565b8561536e9190615b4f565b600361537a9190615d47565b6153849190615ba5565b61538e9190615d47565b846153999190615b4f565b90509392505050565b6000813590506153b181615f5f565b92915050565b6000815190506153c681615f76565b92915050565b6000813590506153db81615f8d565b92915050565b6000813590506153f081615fa4565b92915050565b60008151905061540581615fa4565b92915050565b60006020828403121561541d57600080fd5b600061542b848285016153a2565b91505092915050565b6000806040838503121561544757600080fd5b6000615455858286016153a2565b9250506020615466858286016153e1565b9150509250929050565b60008060006060848603121561548557600080fd5b6000615493868287016153a2565b93505060206154a4868287016153e1565b92505060406154b5868287016153a2565b9150509250925092565b6000806000606084860312156154d457600080fd5b60006154e2868287016153a2565b93505060206154f3868287016153e1565b9250506040615504868287016153cc565b9150509250925092565b6000806000806080858703121561552457600080fd5b6000615532878288016153a2565b9450506020615543878288016153e1565b9350506040615554878288016153e1565b9250506060615565878288016153cc565b91505092959194509250565b6000806000806080858703121561558757600080fd5b6000615595878288016153a2565b94505060206155a6878288016153e1565b93505060406155b7878288016153e1565b92505060606155c8878288016153e1565b91505092959194509250565b6000602082840312156155e657600080fd5b60006155f4848285016153b7565b91505092915050565b60006020828403121561560f57600080fd5b600061561d848285016153f6565b91505092915050565b60008060006060848603121561563b57600080fd5b6000615649868287016153e1565b935050602061565a868287016153a2565b925050604061566b868287016153e1565b9150509250925092565b61567e81615dd5565b82525050565b61569561569082615dd5565b615eb9565b82525050565b6156a481615df3565b82525050565b6156b381615e34565b82525050565b60006156c6601b83615b3e565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b61570281615e1d565b82525050565b61571961571482615e1d565b615edd565b82525050565b600061572b8286615708565b60208201915061573b8285615684565b60148201915061574b8284615708565b602082019150819050949350505050565b60006020820190506157716000830184615675565b92915050565b600060608201905061578c6000830186615675565b6157996020830185615675565b6157a660408301846156f9565b949350505050565b60006040820190506157c36000830185615675565b6157d060208301846156aa565b9392505050565b60006040820190506157ec6000830185615675565b6157f960208301846156f9565b9392505050565b600060a0820190506158156000830188615675565b61582260208301876156f9565b61582f6040830186615675565b61583c60608301856156f9565b61584960808301846156f9565b9695505050505050565b600060c0820190506158686000830189615675565b61587560208301886156f9565b6158826040830187615675565b61588f60608301866156f9565b61589c60808301856156f9565b6158a960a083018461569b565b979650505050505050565b600060c0820190506158c96000830189615675565b6158d660208301886156f9565b6158e36040830187615675565b6158f060608301866156f9565b6158fd60808301856156f9565b61590a60a08301846156f9565b979650505050505050565b600060608201905061592a6000830186615675565b61593760208301856156f9565b61594460408301846156f9565b949350505050565b60006020820190508181036000830152615965816156b9565b9050919050565b600060208201905061598160008301846156f9565b92915050565b600060c08201905061599c60008301896156f9565b6159a96020830188615675565b6159b660408301876156f9565b6159c360608301866156f9565b6159d060808301856156f9565b6159dd60a08301846156f9565b979650505050505050565b6000610140820190506159fe600083018d6156f9565b615a0b602083018c6156f9565b615a18604083018b6156f9565b615a25606083018a6156f9565b615a3260808301896156f9565b615a3f60a08301886156f9565b615a4c60c08301876156f9565b615a5960e08301866156f9565b615a676101008301856156f9565b615a756101208301846156f9565b9b9a5050505050505050505050565b600061018082019050615a9a600083018f6156f9565b615aa7602083018e6156f9565b615ab4604083018d6156f9565b615ac1606083018c6156f9565b615ace608083018b6156f9565b615adb60a083018a6156f9565b615ae860c08301896156f9565b615af560e08301886156f9565b615b036101008301876156f9565b615b116101208301866156f9565b615b1f6101408301856156f9565b615b2d6101608301846156f9565b9d9c50505050505050505050505050565b600082825260208201905092915050565b6000615b5a82615e1d565b9150615b6583615e1d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615b9a57615b99615ee7565b5b828201905092915050565b6000615bb082615e1d565b9150615bbb83615e1d565b925082615bcb57615bca615f16565b5b828204905092915050565b6000808291508390505b6001851115615c2057808604811115615bfc57615bfb615ee7565b5b6001851615615c0b5780820291505b8081029050615c1985615f52565b9450615be0565b94509492505050565b6000615c3482615e1d565b9150615c3f83615e27565b9250615c6c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615c74565b905092915050565b600082615c845760019050615d40565b81615c925760009050615d40565b8160018114615ca85760028114615cb257615ce1565b6001915050615d40565b60ff841115615cc457615cc3615ee7565b5b8360020a915084821115615cdb57615cda615ee7565b5b50615d40565b5060208310610133831016604e8410600b8410161715615d165782820a905083811115615d1157615d10615ee7565b5b615d40565b615d238484846001615bd6565b92509050818404811115615d3a57615d39615ee7565b5b81810290505b9392505050565b6000615d5282615e1d565b9150615d5d83615e1d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615d9657615d95615ee7565b5b828202905092915050565b6000615dac82615e1d565b9150615db783615e1d565b925082821015615dca57615dc9615ee7565b5b828203905092915050565b6000615de082615dfd565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615e3f82615e1d565b9050919050565b6000615e5182615e1d565b91506000821415615e6557615e64615ee7565b5b600182039050919050565b6000615e7b82615e1d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615eae57615ead615ee7565b5b600182019050919050565b6000615ec482615ecb565b9050919050565b6000615ed682615f45565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008160601b9050919050565b60008160011c9050919050565b615f6881615dd5565b8114615f7357600080fd5b50565b615f7f81615de7565b8114615f8a57600080fd5b50565b615f9681615df3565b8114615fa157600080fd5b50565b615fad81615e1d565b8114615fb857600080fd5b5056fea2646970667358221220e87ca8b583b4d404455cb14b767cc1dc92c021578ab694ea93e6ad74ca88959964736f6c6343000800003300000000000000000000000093dcf21284b78163ec218def37471c4b77ccc6e1000000000000000000000000396dd1f7e3c8044784937935f834c3f8d58eb497000000000000000000000000b3f1069b04726c145197853db772483bd6b9650d

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000093dcf21284b78163ec218def37471c4b77ccc6e1000000000000000000000000396dd1f7e3c8044784937935f834c3f8d58eb497000000000000000000000000b3f1069b04726c145197853db772483bd6b9650d

-----Decoded View---------------
Arg [0] : _treasury (address): 0x93dcf21284b78163ec218def37471c4b77ccc6e1
Arg [1] : _auction (address): 0x396dd1f7e3c8044784937935f834c3f8d58eb497
Arg [2] : _creditStore (address): 0xb3f1069b04726c145197853db772483bd6b9650d

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000093dcf21284b78163ec218def37471c4b77ccc6e1
Arg [1] : 000000000000000000000000396dd1f7e3c8044784937935f834c3f8d58eb497
Arg [2] : 000000000000000000000000b3f1069b04726c145197853db772483bd6b9650d


Deployed ByteCode Sourcemap

91809:29753:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106014:1104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92608:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;92154:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96740:2042;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104207:1211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119373:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92862:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;96105:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102350:1633;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119860:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107600:1109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95706:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93065:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101059:570;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95940:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99404:1284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106014:1104;106135:7;106084:10;106096:7;121449:1;121358:13;:44;121372:8;:20;121381:10;121372:20;;;;;;;;;;;;;;;:29;121393:7;121372:29;;;;;;;;;;;;121358:44;;;;;;;;;;;:56;121403:10;121358:56;;;;;;;;;;;;;;;:65;121415:7;121358:65;;;;;;;;;;;:76;;:88;121435:10;121358:88;;;;;;;;;;;;;;;;:92;121350:101;;;;;;945:1:::1;928:13;::::0;:18:::1;;;;;;;:::i;:::-;;;;;;;;953:20;976:13:::0;::::1;953:36;;106154:10:::2;106167:8;:20;106176:10;106167:20;;;;;;;;;;;;;;;:29;106188:7;106167:29;;;;;;;;;;;;106154:42;;106207:37;106247:14;:21;106262:5;106247:21;;;;;;;;;;;:33;106269:10;106247:33;;;;;;;;;;;;;;;:42;106281:7;106247:42;;;;;;;;;;;106207:82;;106300:40;106343:15;:22;106359:5;106343:22;;;;;;;;;;;:34;106366:10;106343:34;;;;;;;;;;;;;;;:43;106378:7;106343:43;;;;;;;;;;;106300:86;;106397:24;106424:16;:23;106441:5;106424:23;;;;;;;;;;;:35;106448:10;106424:35;;;;;;;;;;;;;;;:44;106460:7;106424:44;;;;;;;;;;;106397:71;;106522:1;106487:12;:31;;;:36;106479:45;;;::::0;::::2;;106535:12;106562:6:::0;106571:1:::2;106562:10;;106558:534;106578:2;106574:1;:6;106558:534;;;106609:6;106616:12;:18;;;106609:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106602:33;;106670:11;;;;;;;;;;;106650:52;;;106703:10;106715:12;106650:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;106743:12;:18;;;:20;;;;;;;;;:::i;:::-;;;;;;106778:35;106787:4;106793:10;106805:7;106778:8;:35::i;:::-;106853:11;:24;;;106831:12;:18;;;:46;106828:253;;;106932:1;106898:12;:31;;:35;;;;106979:12;:18;;;106952:11;:24;;:45;;;;107037:1;107016:12;:18;;:22;;;;107064:1;107057:8;;;;;;;;;;106828:253;106582:3;;;;;:::i;:::-;;;;106558:534;;;;107109:1;107102:8;;;;;;;996:1;1028:13:::1;;1012:12;:29;1004:38;;;::::0;::::1;;121462:1;106014:1104:::0;;;;;;:::o;92608:96::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;92154:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;96740:2042::-;96899:10;96911:7;120496:1;120463:8;:20;120472:10;120463:20;;;;;;;;;;;;;;;:29;120484:7;120463:29;;;;;;;;;;;;:34;:87;;;;120549:1;120515:30;120525:10;120537:7;120515:9;:30::i;:::-;:35;120463:87;:280;;;;120666:14;:45;120681:8;:20;120690:10;120681:20;;;;;;;;;;;;;;;:29;120702:7;120681:29;;;;;;;;;;;;120666:45;;;;;;;;;;;:57;120712:10;120666:57;;;;;;;;;;;;;;;:66;120724:7;120666:66;;;;;;;;;;;:77;;;120662:1;:81;;;;:::i;:::-;120585:14;:45;120600:8;:20;120609:10;120600:20;;;;;;;;;;;;;;;:29;120621:7;120600:29;;;;;;;;;;;;120585:45;;;;;;;;;;;:57;120631:10;120585:57;;;;;;;;;;;;;;;:66;120643:7;120585:66;;;;;;;;;;;:74;;;:158;;;;:::i;:::-;120567:15;:176;120463:280;120441:313;;;;;;96971:6:::1;96956:11;:21;;:77;;;;;96983:8;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;96982:25;:50;;;;97025:7;;;;;;;;;;;97011:21;;:10;:21;;;96982:50;96956:77;96948:86;;;::::0;::::1;;97045:37;97085:14;:45;97100:8;:20;97109:10;97100:20;;;;;;;;;;;;;;;:29;97121:7;97100:29;;;;;;;;;;;;97085:45;;;;;;;;;;;:57;97131:10;97085:57;;;;;;;;;;;;;;;:66;97143:7;97085:66;;;;;;;;;;;97045:106;;97179:7;;;;;;;;;;;97165:21;;:10;:21;;;97162:276;;;;;;97220:12;97269:11;;;;;;;;;;;97249:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97235:11;:59;;;;:::i;:::-;97220:74;;97310:12;97333:8;;;;;;;;;;;97326:29;;;97356:10;97376:8;;;;;;;;;;;97387:7;97326:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97309:86;;97418:7;97410:16;;;::::0;::::1;;97162:276;;;97484:1;97451:8;:20;97460:10;97451:20;;;;;;;;;;;;;;;:29;97472:7;97451:29;;;;;;;;;;;;:34;:73;;;;97523:1;97489:30;97499:10;97511:7;97489:9;:30::i;:::-;:35;97451:73;97448:404;;;;;;97611:1;97586:11;:22;;;:26;;;;:::i;:::-;97564:11;:19;;;:48;;;;:::i;:::-;97546:15;:66;97543:309;;;97649:11;;;;;;;;;;;97629:48;;;97678:11;:29;;;97629:79;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;97755:1;97723:11;:29;;:33;;;;97776:64;97789:10;97801:7;97810:8;:20;97819:10;97810:20;;;;;;;;;;;;;;;:29;97831:7;97810:29;;;;;;;;;;;;97776:64;;;;;;;;:::i;:::-;;;;;;;;97543:309;97448:404;97862:8;:20;97871:10;97862:20;;;;;;;;;;;;;;;:29;97883:7;97862:29;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;97904:40;97947:14;:45;97962:8;:20;97971:10;97962:20;;;;;;;;;;;;;;;:29;97983:7;97962:29;;;;;;;;;;;;97947:45;;;;;;;;;;;:57;97993:10;97947:57;;;;;;;;;;;;;;;:66;98005:7;97947:66;;;;;;;;;;;97904:109;;98024:40;98067:15;:46;98083:8;:20;98092:10;98083:20;;;;;;;;;;;;;;;:29;98104:7;98083:29;;;;;;;;;;;;98067:46;;;;;;;;;;;:58;98114:10;98067:58;;;;;;;;;;;;;;;:67;98126:7;98067:67;;;;;;;;;;;98024:110;;98173:11;98145:14;:25;;:39;;;;98253:4;98233:17;98225:5;:25;;;;:::i;:::-;:32;;;;:::i;:::-;98195:14;:27;;:62;;;;98297:12;98268:14;:26;;:41;;;;98363:11;98345:15;:29;;;;:::i;:::-;98320:14;:22;;:54;;;;98409:9;98385:14;:21;;:33;;;;98453:8;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98429:12;:21;;:43;;;;98505:8;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98483:12;:19;;:39;;;;98559:8;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98533:12;:23;;:47;;;;98599:11;;;;;;;;;;;98591:29;;:52;98621:14;:21;;;98591:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;98659:115;98681:10;98693:8;:20;98702:10;98693:20;;;;;;;;;;;;;;;:29;98714:7;98693:29;;;;;;;;;;;;98724:10;98736:7;98745:17;98764:9;98659:115;;;;;;;;;;;:::i;:::-;;;;;;;;120765:1;;;96740:2042:::0;;;;;;:::o;104207:1211::-;104286:10;104299:8;:20;104308:10;104299:20;;;;;;;;;;;;;;;:29;104320:7;104299:29;;;;;;;;;;;;104286:42;;104339:37;104379:14;:21;104394:5;104379:21;;;;;;;;;;;:33;104401:10;104379:33;;;;;;;;;;;;;;;:42;104413:7;104379:42;;;;;;;;;;;104339:82;;104432:40;104475:15;:22;104491:5;104475:22;;;;;;;;;;;:34;104498:10;104475:34;;;;;;;;;;;;;;;:43;104510:7;104475:43;;;;;;;;;;;104432:86;;104592:11;:22;;;104570:11;:19;;;:44;;;;:::i;:::-;104552:15;:62;:102;;;;104653:1;104618:12;:31;;;:36;104552:102;104551:157;;;;;104707:1;104672:12;:31;;;:36;;104551:157;104529:190;;;;;;104750:11;;;;;;;;;;;104730:52;;;104783:10;104820:7;104795:11;:24;;;:32;;;;:::i;:::-;104730:98;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104839:32;104851:10;104863:7;104839:11;:32::i;:::-;104963:12;:26;;;104931:11;:29;;;:58;;;;:::i;:::-;104909:11;:18;;;:81;;;;:::i;:::-;104882:11;:23;;;:108;;;;;;;:::i;:::-;;;;;;;;105022:1;105001:12;:18;;:22;;;;105119:11;:22;;;105085:11;:31;;;105084:58;;;;:::i;:::-;105034:19;:26;105054:5;105034:26;;;;;;;;;;;:38;105061:10;105034:38;;;;;;;;;;;;;;;:47;105073:7;105034:47;;;;;;;;;;;:108;;;;105187:1;105153:12;:31;;:35;;;;105204:206;105229:8;:20;105238:10;105229:20;;;;;;;;;;;;;;;:29;105250:7;105229:29;;;;;;;;;;;;105260:10;105272:7;105281:19;:50;105301:8;:20;105310:10;105301:20;;;;;;;;;;;;;;;:29;105322:7;105301:29;;;;;;;;;;;;105281:50;;;;;;;;;;;:62;105332:10;105281:62;;;;;;;;;;;;;;;:71;105344:7;105281:71;;;;;;;;;;;;105354:11;:24;;;105380:11;:29;;;105204:206;;;;;;;;;;;:::i;:::-;;;;;;;;104207:1211;;;;;:::o;119373:191::-;119446:4;119470:15;:46;119486:8;:20;119495:10;119486:20;;;;;;;;;;;;;;;:29;119507:7;119486:29;;;;;;;;;;;;119470:46;;;;;;;;;;;:58;119517:10;119470:58;;;;;;;;;;;;;;;:67;119529:7;119470:67;;;;;;;;;;;:86;;;119463:93;;119373:191;;;;:::o;92862:93::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;96105:92::-;121533:5;;;;;;;;;;;121519:19;;:10;:19;;;121511:28;;;;;;96183:6:::1;96172:8;;:17;;;;;;;;;;;;;;;;;;96105:92:::0;:::o;102350:1633::-;102453:10;102465:7;121449:1;121358:13;:44;121372:8;:20;121381:10;121372:20;;;;;;;;;;;;;;;:29;121393:7;121372:29;;;;;;;;;;;;121358:44;;;;;;;;;;;:56;121403:10;121358:56;;;;;;;;;;;;;;;:65;121415:7;121358:65;;;;;;;;;;;:76;;:88;121435:10;121358:88;;;;;;;;;;;;;;;;:92;121350:101;;;;;;945:1:::1;928:13;::::0;:18:::1;;;;;;;:::i;:::-;;;;;;;;953:20;976:13:::0;::::1;953:36;;102507:10:::2;102520:8;:20;102529:10;102520:20;;;;;;;;;;;;;;;:29;102541:7;102520:29;;;;;;;;;;;;102507:42;;102560:37;102600:14;:21;102615:5;102600:21;;;;;;;;;;;:33;102622:10;102600:33;;;;;;;;;;;;;;;:42;102634:7;102600:42;;;;;;;;;;;102560:82;;102653:39;102695:13;:20;102709:5;102695:20;;;;;;;;;;;:32;102716:10;102695:32;;;;;;;;;;;;;;;:41;102728:7;102695:41;;;;;;;;;;;102653:83;;102747:40;102790:15;:22;102806:5;102790:22;;;;;;;;;;;:34;102813:10;102790:34;;;;;;;;;;;;;;;:43;102825:7;102790:43;;;;;;;;;;;102747:86;;102844:24;102871:16;:23;102888:5;102871:23;;;;;;;;;;;:35;102895:10;102871:35;;;;;;;;;;;;;;;:44;102907:7;102871:44;;;;;;;;;;;102844:71;;102968:1;102934:12;:31;;;:35;:93;;;;;103012:15;102990:11;:19;;;:37;102934:93;:152;;;;;103085:1;103048:10;:21;;:33;103070:10;103048:33;;;;;;;;;;;;;;;;:38;102934:152;:286;;;;;103188:9;103199:10;103211:7;103171:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;103161:59;;;;;;103107:10;:19;;:31;103127:10;103107:31;;;;;;;;;;;;;;;:50;;;:113;102934:286;:344;;;;;103269:9;103241:11;:24;;;:37;;102934:344;102926:363;;;::::0;::::2;;103336:1;103300:10;:21;;:33;103322:10;103300:33;;;;;;;;;;;;;;;:37;;;;103386:1;103351:12;:31;;;:36;103348:103;;;103438:1;103404:12;:31;;:35;;;;103348:103;103491:10;:19;;:31;103511:10;103491:31;;;;;;;;;;;;;;;:37;;;103461:12;:26;;;:67;;;;;;;:::i;:::-;;;;;;;;103539:6;103551:10;103539:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103573:38;103580:10;103592:7;103601:9;103573:6;:38::i;:::-;103627:62;103639:10;103651:5;103658:10;103670:7;103679:9;103627:62;;;;;;;;;;:::i;:::-;;;;;;;;103725:11;:24;;;103703:12;:18;;;:46;:112;;;;103793:11;:22;;;103771:11;:19;;;:44;;;;:::i;:::-;103753:15;:62;103703:112;103700:276;;;103866:1;103832:12;:31;;:35;;;;103909:12;:18;;;103882:11;:24;;:45;;;;103963:1;103942:12;:18;;:22;;;;103700:276;996:1;;;;;1028:13:::1;;1012:12;:29;1004:38;;;::::0;::::1;;121462:1;102350:1633:::0;;;;;;:::o;119860:209::-;119954:4;119978:13;:44;119992:8;:20;120001:10;119992:20;;;;;;;;;;;;;;;:29;120013:7;119992:29;;;;;;;;;;;;119978:44;;;;;;;;;;;:56;120023:10;119978:56;;;;;;;;;;;;;;;:65;120035:7;119978:65;;;;;;;;;;;:76;;:83;120055:5;119978:83;;;;;;;;;;;;;;;;119971:90;;119860:209;;;;;:::o;107600:1109::-;107719:4;107668:10;107680:7;121449:1;121358:13;:44;121372:8;:20;121381:10;121372:20;;;;;;;;;;;;;;;:29;121393:7;121372:29;;;;;;;;;;;;121358:44;;;;;;;;;;;:56;121403:10;121358:56;;;;;;;;;;;;;;;:65;121415:7;121358:65;;;;;;;;;;;:76;;:88;121435:10;121358:88;;;;;;;;;;;;;;;;:92;121350:101;;;;;;945:1:::1;928:13;::::0;:18:::1;;;;;;;:::i;:::-;;;;;;;;953:20;976:13:::0;::::1;953:36;;107736:10:::2;107749:8;:20;107758:10;107749:20;;;;;;;;;;;;;;;:29;107770:7;107749:29;;;;;;;;;;;;107736:42;;107789:37;107829:14;:21;107844:5;107829:21;;;;;;;;;;;:33;107851:10;107829:33;;;;;;;;;;;;;;;:42;107863:7;107829:42;;;;;;;;;;;107789:82;;107882:40;107925:15;:22;107941:5;107925:22;;;;;;;;;;;:34;107948:10;107925:34;;;;;;;;;;;;;;;:43;107960:7;107925:43;;;;;;;;;;;107882:86;;107979:24;108006:16;:23;108023:5;108006:23;;;;;;;;;;;:35;108030:10;108006:35;;;;;;;;;;;;;;;:44;108042:7;108006:44;;;;;;;;;;;107979:71;;108104:1;108069:12;:31;;;:36;108061:45;;;::::0;::::2;;108117:12;108144:6:::0;108153:1:::2;108144:10;;108140:543;108160:2;108156:1;:6;108140:543;;;108191:6;108198:12;:18;;;108191:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108184:33;;108252:11;;;;;;;;;;;108232:52;;;108285:10;108297:12;108232:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;108325:12;:18;;;:20;;;;;;;;;:::i;:::-;;;;;;108360:33;108367:4;108373:10;108385:7;108360:6;:33::i;:::-;108433:11;:24;;;108411:12;:18;;;:46;108408:264;;;108510:1;108478:11;:29;;:33;;;;108564:1;108530:12;:31;;:35;;;;108589:40;108602:10;108614:7;108623:5;108589:40;;;;;;;;:::i;:::-;;;;;;;;108655:1;108648:8;;;;;;;;;;108408:264;108164:3;;;;;:::i;:::-;;;;108140:543;;;;108700:1;108693:8;;;;;;;996:1;1028:13:::1;;1012:12;:29;1004:38;;;::::0;::::1;;121462:1;107600:1109:::0;;;;;;:::o;95706:94::-;121533:5;;;;;;;;;;;121519:19;;:10;:19;;;121511:28;;;;;;95784:8:::1;95774:7;;:18;;;;;;;;;;;;;;;;;;95706:94:::0;:::o;93065:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;101059:570::-;101195:10;101208:8;:20;101217:10;101208:20;;;;;;;;;;;;;;;:29;101229:7;101208:29;;;;;;;;;;;;101195:42;;101248:37;101288:14;:21;101303:5;101288:21;;;;;;;;;;;:33;101310:10;101288:33;;;;;;;;;;;;;;;:42;101322:7;101288:42;;;;;;;;;;;101248:82;;101341:39;101383:13;:20;101397:5;101383:20;;;;;;;;;;;:32;101404:10;101383:32;;;;;;;;;;;;;;;:41;101416:7;101383:41;;;;;;;;;;;101341:83;;101480:1;101443:10;:21;;:33;101465:10;101443:33;;;;;;;;;;;;;;;;:38;101435:47;;;;;;101523:15;101501:11;:19;;;:37;101493:46;;;;;;101603:18;101550:10;:19;;:31;101570:10;101550:31;;;;;;;;;;;;;;;:50;;:71;;;;101059:570;;;;;;:::o;95940:118::-;121533:5;;;;;;;;;;;121519:19;;:10;:19;;;121511:28;;;;;;96040:8:::1;96009;;:41;;;;;;;;;;;;;;;;;;95940:118:::0;:::o;99404:1284::-;99549:10;99561:7;99570:5;121110:1;121018:13;:44;121032:8;:20;121041:10;121032:20;;;;;;;;;;;;;;;:29;121053:7;121032:29;;;;;;;;;;;;121018:44;;;;;;;;;;;:56;121063:10;121018:56;;;;;;;;;;;;;;;:65;121075:7;121018:65;;;;;;;;;;;:76;;:88;121095:10;121018:88;;;;;;;;;;;;;;;;:93;:130;;;;;121137:11;121128:5;:20;;121018:130;120996:163;;;;;;99597:10:::1;99610:8;:20;99619:10;99610:20;;;;;;;;;;;;;;;:29;99631:7;99610:29;;;;;;;;;;;;99597:42;;99650:37;99690:14;:21;99705:5;99690:21;;;;;;;;;;;:33;99712:10;99690:33;;;;;;;;;;;;;;;:42;99724:7;99690:42;;;;;;;;;;;99650:82;;99743:39;99785:13;:20;99799:5;99785:20;;;;;;;;;;;:32;99806:10;99785:32;;;;;;;;;;;;;;;:41;99818:7;99785:41;;;;;;;;;;;99743:83;;99867:15;99845:11;:19;;;:37;:111;;;;;99915:11;;;;;;;;;;;99895:49;;;99945:10;99895:61;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99886:5;:70;;99845:111;99837:120;;;::::0;::::1;;100004:1;99968:10;:21;;:33;99990:10;99968:33;;;;;;;;;;;;;;;:37;;;;100036:11;;;;;;;;;;;100016:57;;;100074:10;100086:5;100016:76;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;100112:11;100103:20;;;;;:::i;:::-;;;100162:11;100134;:24;;;:39;;;;;;;:::i;:::-;;;;;;;;100206:11;100184;:18;;;:33;;;;;;;:::i;:::-;;;;;;;;100240:11;:23;;;100232:5;:31;100228:95;;;100306:5;100280:11;:23;;:31;;;;100228:95;100333:11;:24;;;:26;;;;;;;;;:::i;:::-;;;;;;100402:40;100436:5;100402:11;:29;;;:33;;:40;;;;:::i;:::-;100370:11;:29;;:72;;;;100506:18;100453:10;:19;;:31;100473:10;100453:31;;;;;;;;;;;;;;;:50;;:71;;;;100575:5;100535:10;:19;;:31;100555:10;100535:31;;;;;;;;;;;;;;;:37;;:45;;;;100596:84;100614:10;100626:5;100633:10;100645:7;100654:5;100661:18;100596:84;;;;;;;;;;;:::i;:::-;;;;;;;;121170:1;;;99404:1284:::0;;;;;;;:::o;114148:2468::-;114235:10;114248:8;:20;114257:10;114248:20;;;;;;;;;;;;;;;:29;114269:7;114248:29;;;;;;;;;;;;114235:42;;114288:37;114328:14;:21;114343:5;114328:21;;;;;;;;;;;:33;114350:10;114328:33;;;;;;;;;;;;;;;:42;114362:7;114328:42;;;;;;;;;;;114288:82;;114381:40;114424:15;:22;114440:5;114424:22;;;;;;;;;;;:34;114447:10;114424:34;;;;;;;;;;;;;;;:43;114459:7;114424:43;;;;;;;;;;;114381:86;;114478:39;114520:13;:20;114534:5;114520:20;;;;;;;;;;;:32;114541:10;114520:32;;;;;;;;;;;;;;;:41;114553:7;114520:41;;;;;;;;;;;114478:83;;114572:19;114594;:50;114614:8;:20;114623:10;114614:20;;;;;;;;;;;;;;;:29;114635:7;114614:29;;;;;;;;;;;;114594:50;;;;;;;;;;;:62;114645:10;114594:62;;;;;;;;;;;;;;;:71;114657:7;114594:71;;;;;;;;;;;;114572:93;;114724:174;114775:14;114809:10;:19;;:26;114829:5;114809:26;;;;;;;;;;;;;;;:36;;;114864:12;:19;;;114724:32;:174::i;:::-;114676:10;:19;;:26;114696:5;114676:26;;;;;;;;;;;;;;;:31;;:222;;;;114909:11;114923:74;114973:11;:23;;;114940:10;:19;;:26;114960:5;114940:26;;;;;;;;;;;;;;;:32;;;:56;;;;:::i;:::-;114923:16;:74::i;:::-;114909:88;;115045:1;115011:10;:19;;:26;115031:5;115011:26;;;;;;;;;;;;;;;:31;;;:35;115008:837;;;115130:6;115096:10;:19;;:26;115116:5;115096:26;;;;;;;;;;;;;;;:31;;;:40;;;;:::i;:::-;115063:11;:29;;;:73;;;;;;;:::i;:::-;;;;;;;;115218:6;115184:10;:19;;:26;115204:5;115184:26;;;;;;;;;;;;;;;:31;;;:40;;;;:::i;:::-;115151:10;:23;;:30;115175:5;115151:30;;;;;;;;;;;;;;;:73;;;;115263:6;115239:12;:20;;;:30;;;;;;;:::i;:::-;;;;;;;;115008:837;;;115369:12;:23;;;115352:14;:40;;;;:::i;:::-;115313:10;:19;;:26;115333:5;115313:26;;;;;;;;;;;;;;;:36;;;:79;:225;;;;;115467:12;:23;;;115450:14;:40;:87;;115514:12;:23;;;115497:14;:40;;;;:::i;:::-;115450:87;;;115493:1;115450:87;115410:10;:19;;:26;115430:5;115410:26;;;;;;;;;;;;;;;:36;;;:128;115313:225;115296:549;;;115601:10;:19;;:26;115621:5;115601:26;;;;;;;;;;;;;;;:32;;;115565:10;:25;;:32;115591:5;115565:32;;;;;;;;;;;;;;;;:68;;;;;;;:::i;:::-;;;;;;;;115680:10;:19;;:26;115700:5;115680:26;;;;;;;;;;;;;;;:32;;;115648:12;:28;;;:64;;;;;;;:::i;:::-;;;;;;;;115753:6;115727:12;:22;;;:32;;;;;;;:::i;:::-;;;;;;;;115296:549;;;115827:6;115801:12;:22;;;:32;;;;;;;:::i;:::-;;;;;;;;115296:549;115008:837;115901:295;115943:10;:19;;:26;115963:5;115943:26;;;;;;;;;;;;;;;:32;;;115991:10;:19;;:26;116011:5;115991:26;;;;;;;;;;;;;;;:36;;;116042:19;:50;116062:8;:20;116071:10;116062:20;;;;;;;;;;;;;;;:29;116083:7;116062:29;;;;;;;;;;;;116042:50;;;;;;;;;;;:62;116093:10;116042:62;;;;;;;;;;;;;;;:71;116105:7;116042:71;;;;;;;;;;;;116128:12;:23;;;116166:12;:19;;;115901:26;:295::i;:::-;115865:10;:26;;:33;115892:5;115865:33;;;;;;;;;;;;;;;:331;;;;116245:10;:26;;:33;116272:5;116245:33;;;;;;;;;;;;;;;;116209:10;:19;;:26;116229:5;116209:26;;;;;;;;;;;;;;;:32;;;:69;;;;;;;:::i;:::-;;;;;;;;116289:15;116349:5;116343:3;116307:10;:26;;:33;116334:5;116307:33;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:47;;;;:::i;:::-;116289:65;;116398:10;116365:11;:29;;;:43;;;;;;;:::i;:::-;;;;;;;;116456:10;116419;:26;;:33;116446:5;116419:33;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;116504:10;:26;;:33;116531:5;116504:33;;;;;;;;;;;;;;;;116477:11;:23;;;:60;;;;;;;:::i;:::-;;;;;;;;116568:11;;;;;;;;;;;116548:48;;;116597:10;116548:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114148:2468;;;;;;;;;;:::o;110481:3008::-;110556:10;110569:8;:20;110578:10;110569:20;;;;;;;;;;;;;;;:29;110590:7;110569:29;;;;;;;;;;;;110556:42;;110609:37;110649:14;:21;110664:5;110649:21;;;;;;;;;;;:33;110671:10;110649:33;;;;;;;;;;;;;;;:42;110683:7;110649:42;;;;;;;;;;;110609:82;;110702:40;110745:15;:22;110761:5;110745:22;;;;;;;;;;;:34;110768:10;110745:34;;;;;;;;;;;;;;;:43;110780:7;110745:43;;;;;;;;;;;110702:86;;110799:39;110841:13;:20;110855:5;110841:20;;;;;;;;;;;:32;110862:10;110841:32;;;;;;;;;;;;;;;:41;110874:7;110841:41;;;;;;;;;;;110799:83;;110893:24;110920:16;:23;110937:5;110920:23;;;;;;;;;;;:35;110944:10;110920:35;;;;;;;;;;;;;;;:44;110956:7;110920:44;;;;;;;;;;;110893:71;;111000:1;110978:12;:18;;;:23;110975:100;;111045:12;:18;;;111018:11;:24;;:45;;;;110975:100;111085:11;111131:1;111126:2;111099:11;:24;;;:29;;;;:::i;:::-;:33;;;;:::i;:::-;111085:47;;111143:15;111169;111195:17;111228:6;111237:1;111228:10;;111224:2258;111245:12;:21;;;111240:1;:26;111224:2258;;111288:19;111345:11;:22;;;111311:11;:31;;;111310:58;;;;:::i;:::-;111288:80;;111396:1;111383:14;;111416:6;111412:761;111432:6;111428:1;:10;111412:761;;;111468:6;111464:694;111484:2;111480:1;:6;111464:694;;;111534:11;:24;;;111520:10;:38;111516:102;;;111588:5;;111516:102;111696:1;111643:10;:19;;:39;111663:6;111670:10;111663:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111643:39;;;;;;;;;;;;;;;:49;;;:54;111640:464;;;;;;111783:14;111731:10;:19;;:39;111751:6;111758:10;111751:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111731:39;;;;;;;;;;;;;;;:49;;;:66;111728:376;;;111913:1;111894:14;111842:10;:19;;:39;111862:6;111869:10;111862:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111842:39;;;;;;;;;;;;;;;:49;;;:66;;;;:::i;:::-;111841:73;;;;:::i;:::-;111827:87;;;;;:::i;:::-;;;111728:376;;;112079:1;112025:10;:19;;:39;112045:6;112052:10;112045:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112025:39;;;;;;;;;;;;;;;:49;;;112008:14;:66;;;;:::i;:::-;112007:73;;;;:::i;:::-;111993:87;;;;;:::i;:::-;;;111728:376;111640:464;112126:12;;;;;:::i;:::-;;;;111488:3;;;;;:::i;:::-;;;;111464:694;;;;111440:3;;;;;:::i;:::-;;;;111412:761;;;;112187:10;112200:70;112256:12;112229:11;:24;;;:39;;;;:::i;:::-;112217:10;:52;;;;:::i;:::-;112200:16;:70::i;:::-;112187:83;;112298:1;112285:14;;112340:5;112314:12;:23;;:31;;;;112368:12;:21;;;112363:1;:26;112360:71;;;112410:5;;;;112360:71;112458:1;112445:14;;112474:10;112487:79;112521:14;112537:5;112544:12;:21;;;112487:33;:79::i;:::-;112474:92;;112581:11;112611:6;112620:1;112611:10;;112607:864;112627:6;112623:1;:10;112607:864;;;112663:6;112659:797;112679:2;112675:1;:6;112659:797;;;112729:11;:24;;;112715:10;:38;112711:100;;;112782:5;;112711:100;112842:87;112905:11;:23;;;112859:10;:19;;:39;112879:6;112886:10;112879:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112859:39;;;;;;;;;;;;;;;:45;;;:69;;;;:::i;:::-;112842:16;:87::i;:::-;112833:96;;113007:5;112955:10;:19;;:39;112975:6;112982:10;112975:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112955:39;;;;;;;;;;;;;;;:49;;;:57;112952:450;;;113130:1;113077:10;:19;;:39;113097:6;113104:10;113097:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113077:39;;;;;;;;;;;;;;;:49;;;:54;:59;;113135:1;113077:59;;;113133:1;113077:59;113067:70;;:6;:70;;;;:::i;:::-;113041:11;:22;;;:96;;;;;;;:::i;:::-;;;;;;;;113208:10;:19;;:39;113228:6;113235:10;113228:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113208:39;;;;;;;;;;;;;;;:49;;;113199:6;:58;;;;:::i;:::-;113164:11;:31;;;:93;;;;;;;:::i;:::-;;;;;;;;113336:1;113284:10;:19;;:39;113304:6;113311:10;113304:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113284:39;;;;;;;;;;;;;;;:49;;:53;;;;113364:14;;;;;:::i;:::-;;;;112952:450;113424:12;;;;;:::i;:::-;;;;112683:3;;;;;:::i;:::-;;;;112659:797;;;;112635:3;;;;;:::i;:::-;;;;112607:864;;;;111224:2258;;;;111268:3;;;;;:::i;:::-;;;;111224:2258;;;;110481:3008;;;;;;;;;;;:::o;109141:736::-;109227:10;109240:8;:20;109249:10;109240:20;;;;;;;;;;;;;;;:29;109261:7;109240:29;;;;;;;;;;;;109227:42;;109280:37;109320:14;:21;109335:5;109320:21;;;;;;;;;;;:33;109342:10;109320:33;;;;;;;;;;;;;;;:42;109354:7;109320:42;;;;;;;;;;;109280:82;;109373:39;109415:13;:20;109429:5;109415:20;;;;;;;;;;;:32;109436:10;109415:32;;;;;;;;;;;;;;;:41;109448:7;109415:41;;;;;;;;;;;109373:83;;109467:40;109510:15;:22;109526:5;109510:22;;;;;;;;;;;:34;109533:10;109510:34;;;;;;;;;;;;;;;:43;109545:7;109510:43;;;;;;;;;;;109467:86;;109608:9;109564:10;:19;;:31;109584:10;109564:31;;;;;;;;;;;;;;;:41;;:53;;;;109628:11;109642:79;109697:11;:23;;;109659:10;:19;;:31;109679:10;109659:31;;;;;;;;;;;;;;;:37;;;:61;;;;:::i;:::-;109642:16;:79::i;:::-;109628:93;;109758:6;109732:11;:22;;;:32;;;;;;;:::i;:::-;;;;;;;;109775:12;:18;;;:20;;;;;;;;;:::i;:::-;;;;;;109860:9;109851:6;:18;;;;:::i;:::-;109816:11;:31;;;:53;;;;;;;:::i;:::-;;;;;;;;109141:736;;;;;;;;:::o;117163:1963::-;117248:10;117261:8;:20;117270:10;117261:20;;;;;;;;;;;;;;;:29;117282:7;117261:29;;;;;;;;;;;;117248:42;;117301:37;117341:14;:21;117356:5;117341:21;;;;;;;;;;;:33;117363:10;117341:33;;;;;;;;;;;;;;;:42;117375:7;117341:42;;;;;;;;;;;117301:82;;117394:40;117437:15;:22;117453:5;117437:22;;;;;;;;;;;:34;117460:10;117437:34;;;;;;;;;;;;;;;:43;117472:7;117437:43;;;;;;;;;;;117394:86;;117491:39;117533:13;:20;117547:5;117533:20;;;;;;;;;;;:32;117554:10;117533:32;;;;;;;;;;;;;;;:41;117566:7;117533:41;;;;;;;;;;;117491:83;;117585:20;117703:12;:19;;;117700:2;:22;;;;:::i;:::-;117672:12;:22;;;117649:12;:20;;;:45;;;;:::i;:::-;117642:3;117619:12;:20;;;:26;;;;:::i;:::-;:76;;;;:::i;:::-;:104;117616:316;;117794:10;:26;;:33;117821:5;117794:33;;;;;;;;;;;;;;;;117759:10;:19;;:26;117779:5;117759:26;;;;;;;;;;;;;;;:32;;;:68;;;;:::i;:::-;117740:87;;;;;:::i;:::-;;;117616:316;;;117888:10;:19;;:26;117908:5;117888:26;;;;;;;;;;;;;;;:32;;;117869:51;;;;;:::i;:::-;;;117616:316;117942:11;118051:12;:19;;;118048:2;:22;;;;:::i;:::-;118020:12;:22;;;117997:12;:20;;;:45;;;;:::i;:::-;117990:3;117967:12;:20;;;:26;;;;:::i;:::-;:76;;;;:::i;:::-;:104;117964:886;;118116:11;:24;;;118097:11;:18;;;:43;;;;:::i;:::-;118088:52;;117964:886;;;118234:1;118201:11;:29;;;118170:12;:28;;;:60;;;;:::i;:::-;:65;118167:683;;;118261:1;118252:10;;118167:683;;;118326:1;118293:11;:29;;;:34;118289:561;;;118414:12;:28;;;118379:10;:25;;:32;118405:5;118379:32;;;;;;;;;;;;;;;;118353:11;:23;;;:58;;;;:::i;:::-;:89;;;;:::i;:::-;118344:98;;118489:10;:25;;:32;118515:5;118489:32;;;;;;;;;;;;;;;;118457:12;:28;;;:64;;;;;;;:::i;:::-;;;;;;;;118571:1;118536:10;:25;;:32;118562:5;118536:32;;;;;;;;;;;;;;;:36;;;;118289:561;;;118682:11;:29;;;118649:10;:23;;:30;118673:5;118649:30;;;;;;;;;;;;;;;;118623:11;:23;;;:56;;;;:::i;:::-;:88;;;;:::i;:::-;118614:97;;118759:10;:23;;:30;118783:5;118759:30;;;;;;;;;;;;;;;;118726:11;:29;;;:63;;;;;;;:::i;:::-;;;;;;;;118837:1;118804:10;:23;;:30;118828:5;118804:30;;;;;;;;;;;;;;;:34;;;;118289:561;118167:683;117964:886;118887:6;118860:11;:23;;;:33;;;;;;;:::i;:::-;;;;;;;;118904:8;;;;;;;;;;;:36;;;118941:6;118904:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118979:11;;;;;;;;;;;118959:57;;;119017:5;119024:15;118959:81;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119071:11;;;;;;;;;;;119051:52;;;119104:5;119111:6;119051:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117163:1963;;;;;;;;;:::o;2321:181::-;2379:7;2399:9;2415:1;2411;:5;;;;:::i;:::-;2399:17;;2440:1;2435;:6;;2427:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2493:1;2486:8;;;2321:181;;;;:::o;72112:871::-;72221:4;72237:9;72249:1;72237:13;;72261:12;72282:18;72276:3;:24;;;;:::i;:::-;72261:39;;72315:6;72322;72315:13;;72311:553;72335:1;72330;:6;72311:553;;72358:14;72393:19;72387:1;72383;:5;;;;:::i;:::-;72376:3;:13;;;;:::i;:::-;72375:37;;;;:::i;:::-;72358:54;;72427:14;72456:19;72451:1;72445:3;:7;;;;:::i;:::-;72444:31;;;;:::i;:::-;72427:48;;72490:15;72520:19;72515:1;72509:3;:7;;;;:::i;:::-;72508:31;;;;:::i;:::-;72490:49;;72554:15;72588:19;72583:1;72579;72573:3;:7;;;;:::i;:::-;:11;;;;:::i;:::-;72572:35;;;;:::i;:::-;72554:53;;72638:7;72626:9;:19;:43;;;;;72660:9;72649:7;:20;;72626:43;72622:96;;;72697:4;72690:11;;;;;;;;;;;72622:96;72749:7;72736:10;:20;:45;;;;;72771:10;72760:7;:21;;72736:45;72732:97;;;72809:4;72802:11;;;;;;;;;;;72732:97;72851:1;72843:9;;;;;:::i;:::-;;;72311:553;;;;72338:3;;;;;:::i;:::-;;;;72311:553;;;;72892:19;72888:3;:23;;;;:::i;:::-;72877:7;:34;72874:83;;;72944:1;72935:6;:10;;;;:::i;:::-;72928:17;;;;;;72874:83;72974:1;72967:8;;;;72112:871;;;;;;:::o;6940:198::-;6985:6;7004;7023:1;7018;7014;:5;;;;:::i;:::-;7013:11;;;;:::i;:::-;7004:20;;7039:1;7035:5;;7051:80;7062:1;7058;:5;7051:80;;;7084:1;7080:5;;7118:1;7113;7109;7105;:5;;;;:::i;:::-;:9;;;;:::i;:::-;7104:15;;;;:::i;:::-;7100:19;;7051:80;;;6940:198;;;;:::o;73528:1293::-;73653:4;73724:15;73716:6;73710:3;:12;;;;:::i;:::-;73709:30;;;;:::i;:::-;73703:3;73688:14;:18;;;;:::i;:::-;:51;:157;;;;;73838:6;73832:3;:12;;;;:::i;:::-;73812:15;73794;73786:6;73780:3;:12;;;;:::i;:::-;73779:30;;;;:::i;:::-;73773:3;73758:14;:18;;;;:::i;:::-;:51;;;;:::i;:::-;73757:71;;;;:::i;:::-;:88;73688:157;73687:195;;;;73881:1;73863:14;:19;73687:195;73670:1144;;;73916:6;73909:13;;;;73670:1144;73988:15;73980:6;73974:3;:12;;;;:::i;:::-;73973:30;;;;:::i;:::-;73967:3;73952:14;:18;;;;:::i;:::-;:51;73949:865;;;74124:6;74111:10;74104:3;74088:15;:19;;;;:::i;:::-;74070:15;74062:6;74056:3;:12;;;;:::i;:::-;74055:30;;;;:::i;:::-;74049:3;74034:14;:18;;;;:::i;:::-;:51;;;;:::i;:::-;74024:6;:62;;;;:::i;:::-;:84;;;;:::i;:::-;:97;;;;:::i;:::-;:106;74020:318;;;74158:6;74151:13;;;;74020:318;74312:10;74305:3;74289:15;:19;;;;:::i;:::-;74271:15;74263:6;74257:3;:12;;;;:::i;:::-;74256:30;;;;:::i;:::-;74250:3;74235:14;:18;;;;:::i;:::-;:51;;;;:::i;:::-;74225:6;:62;;;;:::i;:::-;:84;;;;:::i;:::-;:97;;;;:::i;:::-;74218:104;;;;73949:865;74403:15;74395:6;74389:3;:12;;;;:::i;:::-;74388:30;;;;:::i;:::-;74382:3;74367:14;:18;;;;:::i;:::-;:51;74364:450;;;74539:6;74526:10;74519:3;74503:15;:19;;;;:::i;:::-;74486:14;74482:3;:18;;;;:::i;:::-;74464:15;74456:6;74450:3;:12;;;;:::i;:::-;74449:30;;;;:::i;:::-;:51;;;;:::i;:::-;74439:6;:62;;;;:::i;:::-;:84;;;;:::i;:::-;:97;;;;:::i;:::-;:106;74435:318;;;74573:6;74566:13;;;;74435:318;74727:10;74720:3;74704:15;:19;;;;:::i;:::-;74687:14;74683:3;:18;;;;:::i;:::-;74665:15;74657:6;74651:3;:12;;;;:::i;:::-;74650:30;;;;:::i;:::-;:51;;;;:::i;:::-;74640:6;:62;;;;:::i;:::-;:84;;;;:::i;:::-;:97;;;;:::i;:::-;74633:104;;;;74364:450;74801:1;74794:8;;73528:1293;;;;;;;;:::o;71788:233::-;71888:15;72011:1;72006;71995:8;:12;;;;:::i;:::-;71971:19;71965:5;:25;;;;:::i;:::-;71957:5;:33;;;;:::i;:::-;71952:1;:39;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;71929:19;:84;;;;:::i;:::-;71916:97;;71788:233;;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:139::-;;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;492:87;;;;:::o;585:143::-;;673:6;667:13;658:22;;689:33;716:5;689:33;:::i;:::-;648:80;;;;:::o;734:262::-;;842:2;830:9;821:7;817:23;813:32;810:2;;;858:1;855;848:12;810:2;901:1;926:53;971:7;962:6;951:9;947:22;926:53;:::i;:::-;916:63;;872:117;800:196;;;;:::o;1002:407::-;;;1127:2;1115:9;1106:7;1102:23;1098:32;1095:2;;;1143:1;1140;1133:12;1095:2;1186:1;1211:53;1256:7;1247:6;1236:9;1232:22;1211:53;:::i;:::-;1201:63;;1157:117;1313:2;1339:53;1384:7;1375:6;1364:9;1360:22;1339:53;:::i;:::-;1329:63;;1284:118;1085:324;;;;;:::o;1415:552::-;;;;1557:2;1545:9;1536:7;1532:23;1528:32;1525:2;;;1573:1;1570;1563:12;1525:2;1616:1;1641:53;1686:7;1677:6;1666:9;1662:22;1641:53;:::i;:::-;1631:63;;1587:117;1743:2;1769:53;1814:7;1805:6;1794:9;1790:22;1769:53;:::i;:::-;1759:63;;1714:118;1871:2;1897:53;1942:7;1933:6;1922:9;1918:22;1897:53;:::i;:::-;1887:63;;1842:118;1515:452;;;;;:::o;1973:552::-;;;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2301:2;2327:53;2372:7;2363:6;2352:9;2348:22;2327:53;:::i;:::-;2317:63;;2272:118;2429:2;2455:53;2500:7;2491:6;2480:9;2476:22;2455:53;:::i;:::-;2445:63;;2400:118;2073:452;;;;;:::o;2531:698::-;;;;;2690:3;2678:9;2669:7;2665:23;2661:33;2658:2;;;2707:1;2704;2697:12;2658:2;2750:1;2775:53;2820:7;2811:6;2800:9;2796:22;2775:53;:::i;:::-;2765:63;;2721:117;2877:2;2903:53;2948:7;2939:6;2928:9;2924:22;2903:53;:::i;:::-;2893:63;;2848:118;3005:2;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2976:118;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2648:581;;;;;;;:::o;3235:698::-;;;;;3394:3;3382:9;3373:7;3369:23;3365:33;3362:2;;;3411:1;3408;3401:12;3362:2;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3709:2;3735:53;3780:7;3771:6;3760:9;3756:22;3735:53;:::i;:::-;3725:63;;3680:118;3837:2;3863:53;3908:7;3899:6;3888:9;3884:22;3863:53;:::i;:::-;3853:63;;3808:118;3352:581;;;;;;;:::o;3939:278::-;;4055:2;4043:9;4034:7;4030:23;4026:32;4023:2;;;4071:1;4068;4061:12;4023:2;4114:1;4139:61;4192:7;4183:6;4172:9;4168:22;4139:61;:::i;:::-;4129:71;;4085:125;4013:204;;;;:::o;4223:284::-;;4342:2;4330:9;4321:7;4317:23;4313:32;4310:2;;;4358:1;4355;4348:12;4310:2;4401:1;4426:64;4482:7;4473:6;4462:9;4458:22;4426:64;:::i;:::-;4416:74;;4372:128;4300:207;;;;:::o;4513:552::-;;;;4655:2;4643:9;4634:7;4630:23;4626:32;4623:2;;;4671:1;4668;4661:12;4623:2;4714:1;4739:53;4784:7;4775:6;4764:9;4760:22;4739:53;:::i;:::-;4729:63;;4685:117;4841:2;4867:53;4912:7;4903:6;4892:9;4888:22;4867:53;:::i;:::-;4857:63;;4812:118;4969:2;4995:53;5040:7;5031:6;5020:9;5016:22;4995:53;:::i;:::-;4985:63;;4940:118;4613:452;;;;;:::o;5071:118::-;5158:24;5176:5;5158:24;:::i;:::-;5153:3;5146:37;5136:53;;:::o;5195:157::-;5300:45;5320:24;5338:5;5320:24;:::i;:::-;5300:45;:::i;:::-;5295:3;5288:58;5278:74;;:::o;5358:118::-;5445:24;5463:5;5445:24;:::i;:::-;5440:3;5433:37;5423:53;;:::o;5482:175::-;5591:59;5644:5;5591:59;:::i;:::-;5586:3;5579:72;5569:88;;:::o;5663:325::-;;5826:67;5890:2;5885:3;5826:67;:::i;:::-;5819:74;;5923:29;5919:1;5914:3;5910:11;5903:50;5979:2;5974:3;5970:12;5963:19;;5809:179;;;:::o;5994:118::-;6081:24;6099:5;6081:24;:::i;:::-;6076:3;6069:37;6059:53;;:::o;6118:157::-;6223:45;6243:24;6261:5;6243:24;:::i;:::-;6223:45;:::i;:::-;6218:3;6211:58;6201:74;;:::o;6281:538::-;;6464:75;6535:3;6526:6;6464:75;:::i;:::-;6564:2;6559:3;6555:12;6548:19;;6577:75;6648:3;6639:6;6577:75;:::i;:::-;6677:2;6672:3;6668:12;6661:19;;6690:75;6761:3;6752:6;6690:75;:::i;:::-;6790:2;6785:3;6781:12;6774:19;;6810:3;6803:10;;6453:366;;;;;;:::o;6825:222::-;;6956:2;6945:9;6941:18;6933:26;;6969:71;7037:1;7026:9;7022:17;7013:6;6969:71;:::i;:::-;6923:124;;;;:::o;7053:442::-;;7240:2;7229:9;7225:18;7217:26;;7253:71;7321:1;7310:9;7306:17;7297:6;7253:71;:::i;:::-;7334:72;7402:2;7391:9;7387:18;7378:6;7334:72;:::i;:::-;7416;7484:2;7473:9;7469:18;7460:6;7416:72;:::i;:::-;7207:288;;;;;;:::o;7501:376::-;;7682:2;7671:9;7667:18;7659:26;;7695:71;7763:1;7752:9;7748:17;7739:6;7695:71;:::i;:::-;7776:94;7866:2;7855:9;7851:18;7842:6;7776:94;:::i;:::-;7649:228;;;;;:::o;7883:332::-;;8042:2;8031:9;8027:18;8019:26;;8055:71;8123:1;8112:9;8108:17;8099:6;8055:71;:::i;:::-;8136:72;8204:2;8193:9;8189:18;8180:6;8136:72;:::i;:::-;8009:206;;;;;:::o;8221:664::-;;8464:3;8453:9;8449:19;8441:27;;8478:71;8546:1;8535:9;8531:17;8522:6;8478:71;:::i;:::-;8559:72;8627:2;8616:9;8612:18;8603:6;8559:72;:::i;:::-;8641;8709:2;8698:9;8694:18;8685:6;8641:72;:::i;:::-;8723;8791:2;8780:9;8776:18;8767:6;8723:72;:::i;:::-;8805:73;8873:3;8862:9;8858:19;8849:6;8805:73;:::i;:::-;8431:454;;;;;;;;:::o;8891:775::-;;9162:3;9151:9;9147:19;9139:27;;9176:71;9244:1;9233:9;9229:17;9220:6;9176:71;:::i;:::-;9257:72;9325:2;9314:9;9310:18;9301:6;9257:72;:::i;:::-;9339;9407:2;9396:9;9392:18;9383:6;9339:72;:::i;:::-;9421;9489:2;9478:9;9474:18;9465:6;9421:72;:::i;:::-;9503:73;9571:3;9560:9;9556:19;9547:6;9503:73;:::i;:::-;9586;9654:3;9643:9;9639:19;9630:6;9586:73;:::i;:::-;9129:537;;;;;;;;;:::o;9672:775::-;;9943:3;9932:9;9928:19;9920:27;;9957:71;10025:1;10014:9;10010:17;10001:6;9957:71;:::i;:::-;10038:72;10106:2;10095:9;10091:18;10082:6;10038:72;:::i;:::-;10120;10188:2;10177:9;10173:18;10164:6;10120:72;:::i;:::-;10202;10270:2;10259:9;10255:18;10246:6;10202:72;:::i;:::-;10284:73;10352:3;10341:9;10337:19;10328:6;10284:73;:::i;:::-;10367;10435:3;10424:9;10420:19;10411:6;10367:73;:::i;:::-;9910:537;;;;;;;;;:::o;10453:442::-;;10640:2;10629:9;10625:18;10617:26;;10653:71;10721:1;10710:9;10706:17;10697:6;10653:71;:::i;:::-;10734:72;10802:2;10791:9;10787:18;10778:6;10734:72;:::i;:::-;10816;10884:2;10873:9;10869:18;10860:6;10816:72;:::i;:::-;10607:288;;;;;;:::o;10901:419::-;;11105:2;11094:9;11090:18;11082:26;;11154:9;11148:4;11144:20;11140:1;11129:9;11125:17;11118:47;11182:131;11308:4;11182:131;:::i;:::-;11174:139;;11072:248;;;:::o;11326:222::-;;11457:2;11446:9;11442:18;11434:26;;11470:71;11538:1;11527:9;11523:17;11514:6;11470:71;:::i;:::-;11424:124;;;;:::o;11554:775::-;;11825:3;11814:9;11810:19;11802:27;;11839:71;11907:1;11896:9;11892:17;11883:6;11839:71;:::i;:::-;11920:72;11988:2;11977:9;11973:18;11964:6;11920:72;:::i;:::-;12002;12070:2;12059:9;12055:18;12046:6;12002:72;:::i;:::-;12084;12152:2;12141:9;12137:18;12128:6;12084:72;:::i;:::-;12166:73;12234:3;12223:9;12219:19;12210:6;12166:73;:::i;:::-;12249;12317:3;12306:9;12302:19;12293:6;12249:73;:::i;:::-;11792:537;;;;;;;;;:::o;12335:1219::-;;12718:3;12707:9;12703:19;12695:27;;12732:71;12800:1;12789:9;12785:17;12776:6;12732:71;:::i;:::-;12813:72;12881:2;12870:9;12866:18;12857:6;12813:72;:::i;:::-;12895;12963:2;12952:9;12948:18;12939:6;12895:72;:::i;:::-;12977;13045:2;13034:9;13030:18;13021:6;12977:72;:::i;:::-;13059:73;13127:3;13116:9;13112:19;13103:6;13059:73;:::i;:::-;13142;13210:3;13199:9;13195:19;13186:6;13142:73;:::i;:::-;13225;13293:3;13282:9;13278:19;13269:6;13225:73;:::i;:::-;13308;13376:3;13365:9;13361:19;13352:6;13308:73;:::i;:::-;13391;13459:3;13448:9;13444:19;13435:6;13391:73;:::i;:::-;13474;13542:3;13531:9;13527:19;13518:6;13474:73;:::i;:::-;12685:869;;;;;;;;;;;;;:::o;13560:1445::-;;14001:3;13990:9;13986:19;13978:27;;14015:71;14083:1;14072:9;14068:17;14059:6;14015:71;:::i;:::-;14096:72;14164:2;14153:9;14149:18;14140:6;14096:72;:::i;:::-;14178;14246:2;14235:9;14231:18;14222:6;14178:72;:::i;:::-;14260;14328:2;14317:9;14313:18;14304:6;14260:72;:::i;:::-;14342:73;14410:3;14399:9;14395:19;14386:6;14342:73;:::i;:::-;14425;14493:3;14482:9;14478:19;14469:6;14425:73;:::i;:::-;14508;14576:3;14565:9;14561:19;14552:6;14508:73;:::i;:::-;14591;14659:3;14648:9;14644:19;14635:6;14591:73;:::i;:::-;14674;14742:3;14731:9;14727:19;14718:6;14674:73;:::i;:::-;14757;14825:3;14814:9;14810:19;14801:6;14757:73;:::i;:::-;14840:74;14909:3;14898:9;14894:19;14884:7;14840:74;:::i;:::-;14924;14993:3;14982:9;14978:19;14968:7;14924:74;:::i;:::-;13968:1037;;;;;;;;;;;;;;;:::o;15011:169::-;;15129:6;15124:3;15117:19;15169:4;15164:3;15160:14;15145:29;;15107:73;;;;:::o;15186:305::-;;15245:20;15263:1;15245:20;:::i;:::-;15240:25;;15279:20;15297:1;15279:20;:::i;:::-;15274:25;;15433:1;15365:66;15361:74;15358:1;15355:81;15352:2;;;15439:18;;:::i;:::-;15352:2;15483:1;15480;15476:9;15469:16;;15230:261;;;;:::o;15497:185::-;;15554:20;15572:1;15554:20;:::i;:::-;15549:25;;15588:20;15606:1;15588:20;:::i;:::-;15583:25;;15627:1;15617:2;;15632:18;;:::i;:::-;15617:2;15674:1;15671;15667:9;15662:14;;15539:143;;;;:::o;15688:848::-;;;15780:6;15771:15;;15804:5;15795:14;;15818:712;15839:1;15829:8;15826:15;15818:712;;;15934:4;15929:3;15925:14;15919:4;15916:24;15913:2;;;15943:18;;:::i;:::-;15913:2;15993:1;15983:8;15979:16;15976:2;;;16408:4;16401:5;16397:16;16388:25;;15976:2;16458:4;16452;16448:15;16440:23;;16488:32;16511:8;16488:32;:::i;:::-;16476:44;;15818:712;;;15761:775;;;;;;;:::o;16542:281::-;;16624:23;16642:4;16624:23;:::i;:::-;16616:31;;16668:25;16684:8;16668:25;:::i;:::-;16656:37;;16712:104;16749:66;16739:8;16733:4;16712:104;:::i;:::-;16703:113;;16606:217;;;;:::o;16829:1073::-;;17074:8;17064:2;;17095:1;17086:10;;17097:5;;17064:2;17123:4;17113:2;;17140:1;17131:10;;17142:5;;17113:2;17209:4;17257:1;17252:27;;;;17293:1;17288:191;;;;17202:277;;17252:27;17270:1;17261:10;;17272:5;;;17288:191;17333:3;17323:8;17320:17;17317:2;;;17340:18;;:::i;:::-;17317:2;17389:8;17386:1;17382:16;17373:25;;17424:3;17417:5;17414:14;17411:2;;;17431:18;;:::i;:::-;17411:2;17464:5;;;17202:277;;17588:2;17578:8;17575:16;17569:3;17563:4;17560:13;17556:36;17538:2;17528:8;17525:16;17520:2;17514:4;17511:12;17507:35;17491:111;17488:2;;;17644:8;17638:4;17634:19;17625:28;;17679:3;17672:5;17669:14;17666:2;;;17686:18;;:::i;:::-;17666:2;17719:5;;17488:2;17759:42;17797:3;17787:8;17781:4;17778:1;17759:42;:::i;:::-;17744:57;;;;17833:4;17828:3;17824:14;17817:5;17814:25;17811:2;;;17842:18;;:::i;:::-;17811:2;17891:4;17884:5;17880:16;17871:25;;16889:1013;;;;;;:::o;17908:348::-;;17971:20;17989:1;17971:20;:::i;:::-;17966:25;;18005:20;18023:1;18005:20;:::i;:::-;18000:25;;18193:1;18125:66;18121:74;18118:1;18115:81;18110:1;18103:9;18096:17;18092:105;18089:2;;;18200:18;;:::i;:::-;18089:2;18248:1;18245;18241:9;18230:20;;17956:300;;;;:::o;18262:191::-;;18322:20;18340:1;18322:20;:::i;:::-;18317:25;;18356:20;18374:1;18356:20;:::i;:::-;18351:25;;18395:1;18392;18389:8;18386:2;;;18400:18;;:::i;:::-;18386:2;18445:1;18442;18438:9;18430:17;;18307:146;;;;:::o;18459:96::-;;18525:24;18543:5;18525:24;:::i;:::-;18514:35;;18504:51;;;:::o;18561:90::-;;18638:5;18631:13;18624:21;18613:32;;18603:48;;;:::o;18657:77::-;;18723:5;18712:16;;18702:32;;;:::o;18740:126::-;;18817:42;18810:5;18806:54;18795:65;;18785:81;;;:::o;18872:77::-;;18938:5;18927:16;;18917:32;;;:::o;18955:86::-;;19030:4;19023:5;19019:16;19008:27;;18998:43;;;:::o;19047:135::-;;19152:24;19170:5;19152:24;:::i;:::-;19139:37;;19129:53;;;:::o;19188:171::-;;19250:24;19268:5;19250:24;:::i;:::-;19241:33;;19296:4;19289:5;19286:15;19283:2;;;19304:18;;:::i;:::-;19283:2;19351:1;19344:5;19340:13;19333:20;;19231:128;;;:::o;19365:233::-;;19427:24;19445:5;19427:24;:::i;:::-;19418:33;;19473:66;19466:5;19463:77;19460:2;;;19543:18;;:::i;:::-;19460:2;19590:1;19583:5;19579:13;19572:20;;19408:190;;;:::o;19604:100::-;;19672:26;19692:5;19672:26;:::i;:::-;19661:37;;19651:53;;;:::o;19710:94::-;;19778:20;19792:5;19778:20;:::i;:::-;19767:31;;19757:47;;;:::o;19810:79::-;;19878:5;19867:16;;19857:32;;;:::o;19895:180::-;19943:77;19940:1;19933:88;20040:4;20037:1;20030:15;20064:4;20061:1;20054:15;20081:180;20129:77;20126:1;20119:88;20226:4;20223:1;20216:15;20250:4;20247:1;20240:15;20267:94;;20348:5;20344:2;20340:14;20319:35;;20309:52;;;:::o;20367:102::-;;20456:5;20453:1;20449:13;20428:34;;20418:51;;;:::o;20475:122::-;20548:24;20566:5;20548:24;:::i;:::-;20541:5;20538:35;20528:2;;20587:1;20584;20577:12;20528:2;20518:79;:::o;20603:116::-;20673:21;20688:5;20673:21;:::i;:::-;20666:5;20663:32;20653:2;;20709:1;20706;20699:12;20653:2;20643:76;:::o;20725:122::-;20798:24;20816:5;20798:24;:::i;:::-;20791:5;20788:35;20778:2;;20837:1;20834;20827:12;20778:2;20768:79;:::o;20853:122::-;20926:24;20944:5;20926:24;:::i;:::-;20919:5;20916:35;20906:2;;20965:1;20962;20955:12;20906:2;20896:79;:::o

Metadata Hash

e87ca8b583b4d404455cb14b767cc1dc92c021578ab694ea93e6ad74ca889599
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.