More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 174 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Cast Vote Withou... | 114739998 | 369 days ago | IN | 0 ETH | 0.000087850812 | ||||
Cast Vote Withou... | 114739987 | 369 days ago | IN | 0 ETH | 0.000087109157 | ||||
Cast Vote Withou... | 114739973 | 369 days ago | IN | 0 ETH | 0.000084387169 | ||||
Cast Vote Withou... | 114739973 | 369 days ago | IN | 0 ETH | 0.000085150015 | ||||
Cast Vote Withou... | 114739959 | 369 days ago | IN | 0 ETH | 0.000089714528 | ||||
Cast Vote Withou... | 114739895 | 369 days ago | IN | 0 ETH | 0.000089264132 | ||||
Cast Vote Withou... | 114739810 | 369 days ago | IN | 0 ETH | 0.000060630017 | ||||
Cast Vote Withou... | 114739731 | 369 days ago | IN | 0 ETH | 0.000068097935 | ||||
Cast Vote | 114739703 | 369 days ago | IN | 0 ETH | 0.000188227593 | ||||
Cast Vote Withou... | 114739685 | 369 days ago | IN | 0 ETH | 0.000077122204 | ||||
Cast Vote Withou... | 114739551 | 369 days ago | IN | 0 ETH | 0.000069567295 | ||||
Cast Vote | 114739520 | 369 days ago | IN | 0 ETH | 0.000185647747 | ||||
Cast Vote Withou... | 114738561 | 369 days ago | IN | 0 ETH | 0.000088605429 | ||||
Cast Vote Withou... | 114738363 | 369 days ago | IN | 0 ETH | 0.000123266561 | ||||
Cast Vote Withou... | 114738343 | 369 days ago | IN | 0 ETH | 0.000129670969 | ||||
Cast Vote | 114738263 | 369 days ago | IN | 0 ETH | 0.000233752761 | ||||
Cast Vote Withou... | 114736420 | 369 days ago | IN | 0 ETH | 0.000061872676 | ||||
Cast Vote Withou... | 114736398 | 369 days ago | IN | 0 ETH | 0.000064147735 | ||||
Cast Vote Withou... | 114736376 | 369 days ago | IN | 0 ETH | 0.000060667225 | ||||
Cast Vote Withou... | 114736359 | 369 days ago | IN | 0 ETH | 0.000060707264 | ||||
Cast Vote Withou... | 114736341 | 369 days ago | IN | 0 ETH | 0.000062057399 | ||||
Cast Vote Withou... | 114736322 | 369 days ago | IN | 0 ETH | 0.000058700311 | ||||
Cast Vote Withou... | 114736305 | 369 days ago | IN | 0 ETH | 0.000059559556 | ||||
Cast Vote Withou... | 114736282 | 369 days ago | IN | 0 ETH | 0.000065748853 | ||||
Cast Vote Withou... | 114736263 | 369 days ago | IN | 0 ETH | 0.000063082803 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
114653345 | 371 days ago | 0.000345 ETH | ||||
114653345 | 371 days ago | 0.000345 ETH | ||||
114653154 | 371 days ago | 0.000345 ETH | ||||
114653154 | 371 days ago | 0.000345 ETH | ||||
114652445 | 371 days ago | 0.000345 ETH | ||||
114652445 | 371 days ago | 0.000345 ETH | ||||
114652042 | 371 days ago | 0.000345 ETH | ||||
114652042 | 371 days ago | 0.000345 ETH | ||||
114651838 | 371 days ago | 0.000345 ETH | ||||
114651838 | 371 days ago | 0.000345 ETH | ||||
114651816 | 371 days ago | 0.000345 ETH | ||||
114651816 | 371 days ago | 0.000345 ETH | ||||
114651770 | 371 days ago | 0.000345 ETH | ||||
114651770 | 371 days ago | 0.000345 ETH | ||||
114651541 | 371 days ago | 0.000345 ETH | ||||
114651541 | 371 days ago | 0.000345 ETH | ||||
114651418 | 371 days ago | 0.000345 ETH | ||||
114651418 | 371 days ago | 0.000345 ETH | ||||
114651298 | 371 days ago | 0.000345 ETH | ||||
114651298 | 371 days ago | 0.000345 ETH | ||||
114650342 | 371 days ago | 0.000345 ETH | ||||
114650342 | 371 days ago | 0.000345 ETH | ||||
114649784 | 371 days ago | 0.000345 ETH | ||||
114649784 | 371 days ago | 0.000345 ETH | ||||
114648908 | 372 days ago | 0.000345 ETH |
Loading...
Loading
Contract Name:
Contest
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at optimistic.etherscan.io on 2024-01-11 */ // SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.19; // Forked from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/governance/Governor.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol) // This file was procedurally generated from scripts/generate/templates/SafeCast.js. /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such 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. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toUint248(uint256 value) internal pure returns (uint248) { require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits"); return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toUint240(uint256 value) internal pure returns (uint240) { require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits"); return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toUint232(uint256 value) internal pure returns (uint232) { require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits"); return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.2._ */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toUint216(uint256 value) internal pure returns (uint216) { require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits"); return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toUint208(uint256 value) internal pure returns (uint208) { require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits"); return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toUint200(uint256 value) internal pure returns (uint200) { require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits"); return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toUint192(uint256 value) internal pure returns (uint192) { require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits"); return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toUint184(uint256 value) internal pure returns (uint184) { require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits"); return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toUint176(uint256 value) internal pure returns (uint176) { require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits"); return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toUint168(uint256 value) internal pure returns (uint168) { require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits"); return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toUint160(uint256 value) internal pure returns (uint160) { require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits"); return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toUint152(uint256 value) internal pure returns (uint152) { require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits"); return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toUint144(uint256 value) internal pure returns (uint144) { require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits"); return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toUint136(uint256 value) internal pure returns (uint136) { require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits"); return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v2.5._ */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toUint120(uint256 value) internal pure returns (uint120) { require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits"); return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toUint112(uint256 value) internal pure returns (uint112) { require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits"); return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toUint104(uint256 value) internal pure returns (uint104) { require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits"); return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.2._ */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toUint88(uint256 value) internal pure returns (uint88) { require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits"); return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toUint80(uint256 value) internal pure returns (uint80) { require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits"); return uint80(value); } /** * @dev Returns the downcasted uint72 from uint256, reverting on * overflow (when the input is greater than largest uint72). * * Counterpart to Solidity's `uint72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toUint72(uint256 value) internal pure returns (uint72) { require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits"); return uint72(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v2.5._ */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toUint56(uint256 value) internal pure returns (uint56) { require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits"); return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toUint48(uint256 value) internal pure returns (uint48) { require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits"); return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toUint40(uint256 value) internal pure returns (uint40) { require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits"); return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v2.5._ */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toUint24(uint256 value) internal pure returns (uint24) { require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits"); return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v2.5._ */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v2.5._ */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. * * _Available since v3.0._ */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int248 from int256, reverting on * overflow (when the input is less than smallest int248 or * greater than largest int248). * * Counterpart to Solidity's `int248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toInt248(int256 value) internal pure returns (int248 downcasted) { downcasted = int248(value); require(downcasted == value, "SafeCast: value doesn't fit in 248 bits"); } /** * @dev Returns the downcasted int240 from int256, reverting on * overflow (when the input is less than smallest int240 or * greater than largest int240). * * Counterpart to Solidity's `int240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toInt240(int256 value) internal pure returns (int240 downcasted) { downcasted = int240(value); require(downcasted == value, "SafeCast: value doesn't fit in 240 bits"); } /** * @dev Returns the downcasted int232 from int256, reverting on * overflow (when the input is less than smallest int232 or * greater than largest int232). * * Counterpart to Solidity's `int232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toInt232(int256 value) internal pure returns (int232 downcasted) { downcasted = int232(value); require(downcasted == value, "SafeCast: value doesn't fit in 232 bits"); } /** * @dev Returns the downcasted int224 from int256, reverting on * overflow (when the input is less than smallest int224 or * greater than largest int224). * * Counterpart to Solidity's `int224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.7._ */ function toInt224(int256 value) internal pure returns (int224 downcasted) { downcasted = int224(value); require(downcasted == value, "SafeCast: value doesn't fit in 224 bits"); } /** * @dev Returns the downcasted int216 from int256, reverting on * overflow (when the input is less than smallest int216 or * greater than largest int216). * * Counterpart to Solidity's `int216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toInt216(int256 value) internal pure returns (int216 downcasted) { downcasted = int216(value); require(downcasted == value, "SafeCast: value doesn't fit in 216 bits"); } /** * @dev Returns the downcasted int208 from int256, reverting on * overflow (when the input is less than smallest int208 or * greater than largest int208). * * Counterpart to Solidity's `int208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toInt208(int256 value) internal pure returns (int208 downcasted) { downcasted = int208(value); require(downcasted == value, "SafeCast: value doesn't fit in 208 bits"); } /** * @dev Returns the downcasted int200 from int256, reverting on * overflow (when the input is less than smallest int200 or * greater than largest int200). * * Counterpart to Solidity's `int200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toInt200(int256 value) internal pure returns (int200 downcasted) { downcasted = int200(value); require(downcasted == value, "SafeCast: value doesn't fit in 200 bits"); } /** * @dev Returns the downcasted int192 from int256, reverting on * overflow (when the input is less than smallest int192 or * greater than largest int192). * * Counterpart to Solidity's `int192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toInt192(int256 value) internal pure returns (int192 downcasted) { downcasted = int192(value); require(downcasted == value, "SafeCast: value doesn't fit in 192 bits"); } /** * @dev Returns the downcasted int184 from int256, reverting on * overflow (when the input is less than smallest int184 or * greater than largest int184). * * Counterpart to Solidity's `int184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toInt184(int256 value) internal pure returns (int184 downcasted) { downcasted = int184(value); require(downcasted == value, "SafeCast: value doesn't fit in 184 bits"); } /** * @dev Returns the downcasted int176 from int256, reverting on * overflow (when the input is less than smallest int176 or * greater than largest int176). * * Counterpart to Solidity's `int176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toInt176(int256 value) internal pure returns (int176 downcasted) { downcasted = int176(value); require(downcasted == value, "SafeCast: value doesn't fit in 176 bits"); } /** * @dev Returns the downcasted int168 from int256, reverting on * overflow (when the input is less than smallest int168 or * greater than largest int168). * * Counterpart to Solidity's `int168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toInt168(int256 value) internal pure returns (int168 downcasted) { downcasted = int168(value); require(downcasted == value, "SafeCast: value doesn't fit in 168 bits"); } /** * @dev Returns the downcasted int160 from int256, reverting on * overflow (when the input is less than smallest int160 or * greater than largest int160). * * Counterpart to Solidity's `int160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toInt160(int256 value) internal pure returns (int160 downcasted) { downcasted = int160(value); require(downcasted == value, "SafeCast: value doesn't fit in 160 bits"); } /** * @dev Returns the downcasted int152 from int256, reverting on * overflow (when the input is less than smallest int152 or * greater than largest int152). * * Counterpart to Solidity's `int152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toInt152(int256 value) internal pure returns (int152 downcasted) { downcasted = int152(value); require(downcasted == value, "SafeCast: value doesn't fit in 152 bits"); } /** * @dev Returns the downcasted int144 from int256, reverting on * overflow (when the input is less than smallest int144 or * greater than largest int144). * * Counterpart to Solidity's `int144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toInt144(int256 value) internal pure returns (int144 downcasted) { downcasted = int144(value); require(downcasted == value, "SafeCast: value doesn't fit in 144 bits"); } /** * @dev Returns the downcasted int136 from int256, reverting on * overflow (when the input is less than smallest int136 or * greater than largest int136). * * Counterpart to Solidity's `int136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toInt136(int256 value) internal pure returns (int136 downcasted) { downcasted = int136(value); require(downcasted == value, "SafeCast: value doesn't fit in 136 bits"); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128 downcasted) { downcasted = int128(value); require(downcasted == value, "SafeCast: value doesn't fit in 128 bits"); } /** * @dev Returns the downcasted int120 from int256, reverting on * overflow (when the input is less than smallest int120 or * greater than largest int120). * * Counterpart to Solidity's `int120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toInt120(int256 value) internal pure returns (int120 downcasted) { downcasted = int120(value); require(downcasted == value, "SafeCast: value doesn't fit in 120 bits"); } /** * @dev Returns the downcasted int112 from int256, reverting on * overflow (when the input is less than smallest int112 or * greater than largest int112). * * Counterpart to Solidity's `int112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toInt112(int256 value) internal pure returns (int112 downcasted) { downcasted = int112(value); require(downcasted == value, "SafeCast: value doesn't fit in 112 bits"); } /** * @dev Returns the downcasted int104 from int256, reverting on * overflow (when the input is less than smallest int104 or * greater than largest int104). * * Counterpart to Solidity's `int104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toInt104(int256 value) internal pure returns (int104 downcasted) { downcasted = int104(value); require(downcasted == value, "SafeCast: value doesn't fit in 104 bits"); } /** * @dev Returns the downcasted int96 from int256, reverting on * overflow (when the input is less than smallest int96 or * greater than largest int96). * * Counterpart to Solidity's `int96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.7._ */ function toInt96(int256 value) internal pure returns (int96 downcasted) { downcasted = int96(value); require(downcasted == value, "SafeCast: value doesn't fit in 96 bits"); } /** * @dev Returns the downcasted int88 from int256, reverting on * overflow (when the input is less than smallest int88 or * greater than largest int88). * * Counterpart to Solidity's `int88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toInt88(int256 value) internal pure returns (int88 downcasted) { downcasted = int88(value); require(downcasted == value, "SafeCast: value doesn't fit in 88 bits"); } /** * @dev Returns the downcasted int80 from int256, reverting on * overflow (when the input is less than smallest int80 or * greater than largest int80). * * Counterpart to Solidity's `int80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toInt80(int256 value) internal pure returns (int80 downcasted) { downcasted = int80(value); require(downcasted == value, "SafeCast: value doesn't fit in 80 bits"); } /** * @dev Returns the downcasted int72 from int256, reverting on * overflow (when the input is less than smallest int72 or * greater than largest int72). * * Counterpart to Solidity's `int72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toInt72(int256 value) internal pure returns (int72 downcasted) { downcasted = int72(value); require(downcasted == value, "SafeCast: value doesn't fit in 72 bits"); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64 downcasted) { downcasted = int64(value); require(downcasted == value, "SafeCast: value doesn't fit in 64 bits"); } /** * @dev Returns the downcasted int56 from int256, reverting on * overflow (when the input is less than smallest int56 or * greater than largest int56). * * Counterpart to Solidity's `int56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toInt56(int256 value) internal pure returns (int56 downcasted) { downcasted = int56(value); require(downcasted == value, "SafeCast: value doesn't fit in 56 bits"); } /** * @dev Returns the downcasted int48 from int256, reverting on * overflow (when the input is less than smallest int48 or * greater than largest int48). * * Counterpart to Solidity's `int48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toInt48(int256 value) internal pure returns (int48 downcasted) { downcasted = int48(value); require(downcasted == value, "SafeCast: value doesn't fit in 48 bits"); } /** * @dev Returns the downcasted int40 from int256, reverting on * overflow (when the input is less than smallest int40 or * greater than largest int40). * * Counterpart to Solidity's `int40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toInt40(int256 value) internal pure returns (int40 downcasted) { downcasted = int40(value); require(downcasted == value, "SafeCast: value doesn't fit in 40 bits"); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32 downcasted) { downcasted = int32(value); require(downcasted == value, "SafeCast: value doesn't fit in 32 bits"); } /** * @dev Returns the downcasted int24 from int256, reverting on * overflow (when the input is less than smallest int24 or * greater than largest int24). * * Counterpart to Solidity's `int24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toInt24(int256 value) internal pure returns (int24 downcasted) { downcasted = int24(value); require(downcasted == value, "SafeCast: value doesn't fit in 24 bits"); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16 downcasted) { downcasted = int16(value); require(downcasted == value, "SafeCast: value doesn't fit in 16 bits"); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8 downcasted) { downcasted = int8(value); require(downcasted == value, "SafeCast: value doesn't fit in 8 bits"); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. * * _Available since v3.0._ */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // Forked from https://github.com/Anish-Agnihotri/merkle-airdrop-starter/blob/master/contracts/src/MerkleClaimERC20.sol /// ============ Imports ============ // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // OZ: MerkleProof /// @title GovernorMerkleVotes abstract contract GovernorMerkleVotes { /// ============ Immutable storage ============ /// @notice Participant inclusion roots bytes32 public submissionMerkleRoot; bytes32 public votingMerkleRoot; /// ============ Errors ============ /// @notice Thrown if address/amount are not part of Merkle tree error NotInMerkle(); /// ============ Constructor ============ /// @notice Creates a new GovernorMerkleVotes contract /// @param _submissionMerkleRoot of participants /// @param _votingMerkleRoot of participants constructor(bytes32 _submissionMerkleRoot, bytes32 _votingMerkleRoot) { submissionMerkleRoot = _submissionMerkleRoot; // Update root votingMerkleRoot = _votingMerkleRoot; // Update root } /// ============ Functions ============ /// @notice Allows checking of proofs for an address /// @param addressToCheck address of participant /// @param amount to check that the participant has the correct amount /// @param proof merkle proof to prove address and amount are in tree /// @param voting true if this is for a voting proof, false if this is for a submission proof function checkProof(address addressToCheck, uint256 amount, bytes32[] calldata proof, bool voting) public view returns (bool verified) { // Verify merkle proof, or revert if not in tree bytes32 leaf = keccak256(abi.encodePacked(addressToCheck, amount)); bool isValidLeaf = voting ? MerkleProof.verify(proof, votingMerkleRoot, leaf) : MerkleProof.verify(proof, submissionMerkleRoot, leaf); if (!isValidLeaf) revert NotInMerkle(); return true; } } /** * @dev Logic for sorting and ranking. */ abstract contract GovernorSorting { // TLDR: This code maintains a sorted array. // Because of the array rule below, the actual number of rankings that this contract will be able to track is determined by three things: // - RANK_LIMIT // - Woulda Beens (WBs) // The number of would-be ranked proposals (at the end of the contest if rankings were counted // without taking out deleted proposals) within the limit that are deleted and do not have other, non-deleted proposals // with the same amounts of votes/that are tied with them. // - To Tied or Deleted (TTDs), or to a previous TTD // The number of times a proposal's newValue goes into an index to tie it; an index that is already tied; an index that was last deleted; // or an index that wasn't garbage collected because it went to either one of last three cases or an index that also wasn't garbage // collected because of the same recursive logic, from a ranking that was in the tracked rankings at the time that vote was cast. // // The equation to calcluate how many rankings this contract will actually be able to track is: // # of rankings GovernorSorting can track for a given contest = RANK_LIMIT - WBs - TTDs // // With this in mind, it is strongly reccomended to set RANK_LIMIT sufficiently high to create a buffer for // WBs and TTDs that may occur in your contest. The thing to consider with regard to making it too high is just // that it is more gas for users on average the higher that RANK_LIMIT is set. uint256 public sortingEnabled; // Either 0 for false or 1 for true uint256 public rankLimit; // RULE: Cannot be 0 // RULE: array length can never end lower than it started a transaction, otherwise erroneous ranking can happen uint256[] public sortedRanks; // value is forVotes counts, has the constraint of no duplicate values. constructor(uint256 sortingEnabled_, uint256 rankLimit_) { sortingEnabled = sortingEnabled_; rankLimit = rankLimit_; } /** * @dev See {GovernorCountingSimple-getNumProposalsWithThisManyForVotes}. */ function getNumProposalsWithThisManyForVotes(uint256 forVotes) public view virtual returns (uint256 count); /** * @dev Get the sortedRanks array. */ function getSortedRanks() public view returns (uint256[] memory sortedRanksArray) { return sortedRanks; } /** * @dev Insert a new value into sortedRanks (this function is strictly O(n) or better). * We know at this point that the idx where it should go is in [0, sortedRanks.length - 1]. */ function _insertRank( uint256 oldValue, uint256 newValue, uint256 sortedRanksLength, uint256[] memory sortedRanksMemVar ) internal { // find the index to insert newValue at uint256 insertingIndex; for (uint256 index = 0; index < sortedRanksLength; index++) { // is this value already in the array? (is this a TTD or to a previous TTD?) if (newValue == sortedRanksMemVar[index]) { // if so, we don't need to insert anything and the oldValue of this doesn't get cleaned up return; } if (newValue > sortedRanksMemVar[index]) { insertingIndex = index; break; } } // are we checking for the oldValue? bool checkForOldValue = (oldValue > 0) && (getNumProposalsWithThisManyForVotes(oldValue) == 0); // if there are props left with oldValue votes, we don't want to remove it bool haveFoundOldValue = false; // DO ANY SHIFTING? - we do not need to if 1. if we're checking for oldValue and 2. oldValue is at insertingIndex - if both of those are the case, then we don't need to update anything besides insertingIndex. if (!(checkForOldValue && (sortedRanksMemVar[insertingIndex] == oldValue))) { // DO SHIFTING FROM (insertingIndex, sortedRanksLength)? // - if insertingIndex == sortedRanksLength - 1, then there's nothing after it to shift down. // - also if this is the case + oldValue's not at insertingIndex, then don't need to worry about oldValue bc it's not in the array. if (!(insertingIndex == sortedRanksLength - 1)) { // SHIFT UNTIL/IF YOU FIND OLD VALUE IN THE RANGE (insertingIndex, sortedRanksLength) - go through and shift everything down until/if we hit oldValue. // if we hit the limit then the last item will just be dropped). for (uint256 index = insertingIndex + 1; index < sortedRanksLength; index++) { sortedRanks[index] = sortedRanksMemVar[index - 1]; // STOP ONCE YOU FIND OLD VALUE - if I'm looking for it, once I shift a value into the index oldValue was in (if it's in here) I can stop! if (checkForOldValue && (sortedRanksMemVar[index] == oldValue)) { haveFoundOldValue = true; break; } } } // SHIFT INTO NEW INDEX? - if we didn't run into oldValue and we wouldn't be trying to shift into index RANK_LIMIT, then // go ahead and shift what was in sortedRanksLength - 1 into the next idx if (!haveFoundOldValue && (sortedRanksLength < rankLimit)) { sortedRanks.push(sortedRanksMemVar[sortedRanksLength - 1]); } } // SET INSERTING IDX - now that everything's been accounted for, let's correctly set sortedRanks[insertingIndex] sortedRanks[insertingIndex] = newValue; } /** * @dev Keep things sorted as we go. * Only works for no downvoting bc dealing w what happens when something leaves the top ranks and needs to be *replaced* is an issue that necessitates the sorting of all the others, which we don't want to do bc gas. * Invariant: Because of no downvoting, and that a vote of 0 is not allowed, newValue will always be greater than oldValue. */ function _updateRanks(uint256 oldValue, uint256 newValue) internal { uint256 sortedRanksLength = sortedRanks.length; // only check state var once to save on gas uint256[] memory sortedRanksMemVar = sortedRanks; // only check state var once to save on gas // FIRST ENTRY? - if this is the first item ever then we just need to put it in idx 0 and that's it if (sortedRanksLength == 0) { sortedRanks.push(newValue); return; } // SMALLER THAN CURRENT SMALLEST VAL? // this also means that the old value was 0 (or less than the lowest value if sortedRanks.length == RANK_LIMIT and/or the array is full), so all good with regards to oldValue. if (newValue < sortedRanksMemVar[sortedRanksLength - 1]) { if (sortedRanksLength == rankLimit) { // if we've reached the size limit of sortedRanks, then we're done here return; } else { // otherwise, put this value in the index after the current smallest value sortedRanks.push(newValue); return; } } // SO IT'S IN [0, sortedRanksLength - 1]! // find where it should go and insert it. _insertRank(oldValue, newValue, sortedRanksLength, sortedRanksMemVar); } } /** * @dev Core of the governance system, designed to be extended though various modules. */ abstract contract Governor is GovernorSorting, GovernorMerkleVotes { using SafeCast for uint256; enum ContestState { NotStarted, Active, Canceled, Queued, Completed } enum Metadatas { Target, Safe } struct TargetMetadata { address targetAddress; } struct SafeMetadata { address[] signers; uint256 threshold; } struct ProposalCore { address author; bool exists; string description; TargetMetadata targetMetadata; SafeMetadata safeMetadata; } event JokeraceCreated(string name, address creator); event ProposalCreated(uint256 proposalId, address proposer); event ProposalsDeleted(uint256[] proposalIds); event ContestCanceled(); event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 numVotes); event PaymentReleased(address to, uint256 amount); uint256 public constant METADATAS_COUNT = uint256(type(Metadatas).max) + 1; uint256 public constant AMOUNT_FOR_SUMBITTER_PROOF = 10000000000000000000; address public constant JK_LABS_ADDRESS = 0xDc652C746A8F85e18Ce632d97c6118e8a52fa738; string public name; // The title of the contest string public prompt; address public creator; uint256 public contestStart; // The Unix timestamp that the contest starts at. uint256 public votingDelay; // Number of seconds that submissions are open. uint256 public votingPeriod; // Number of seconds that voting is open. uint256 public numAllowedProposalSubmissions; // The number of proposals that an address who is qualified to propose can submit for this contest. uint256 public maxProposalCount; // Max number of proposals allowed in this contest. uint256 public downvotingAllowed; // If downvoting is enabled in this contest. uint256 public costToPropose; uint256 public percentageToCreator; uint256[] public proposalIds; uint256[] public deletedProposalIds; mapping(uint256 => bool) public proposalIsDeleted; bool public canceled; mapping(uint256 => ProposalCore) public proposals; mapping(address => uint256) public numSubmissions; address[] public proposalAuthors; address[] public addressesThatHaveVoted; mapping(address => uint256) public addressTotalVotes; mapping(address => bool) public addressTotalVotesVerified; mapping(address => bool) public addressSubmitterVerified; error AuthorIsNotSender(address author, address sender); error ZeroSignersInSafeMetadata(); error ZeroThresholdInSafeMetadata(); error UnexpectedMetadata(Metadatas unexpectedMetadata); error EmptyProposalDescription(); error IncorrectCostToProposeSent(uint256 msgValue, uint256 costToPropose); error AddressNotPermissionedToSubmit(); error ContestMustBeQueuedToPropose(ContestState currentState); error ContestMustBeActiveToVote(ContestState currentState); error SenderSubmissionLimitReached(uint256 numAllowedProposalSubmissions); error ContestSubmissionLimitReached(uint256 maxProposalCount); error DuplicateSubmission(uint256 proposalId); error CannotVoteOnDeletedProposal(); error NeedAtLeastOneVoteToVote(); error NeedToSubmitWithProofFirst(); error NeedToVoteWithProofFirst(); error OnlyCreatorCanDelete(); error CannotDeleteWhenCompleted(); error OnlyJkLabsOrCreatorCanCancel(); error ContestAlreadyCancelled(); error OnlyJkLabsCanAmend(); constructor( string memory name_, string memory prompt_, bytes32 submissionMerkleRoot_, bytes32 votingMerkleRoot_, uint256 contestStart_, uint256 votingDelay_, uint256 votingPeriod_, uint256 numAllowedProposalSubmissions_, uint256 maxProposalCount_, uint256 downvotingAllowed_, uint256 costToPropose_, uint256 percentageToCreator_ ) GovernorMerkleVotes(submissionMerkleRoot_, votingMerkleRoot_) { name = name_; prompt = prompt_; creator = msg.sender; contestStart = contestStart_; votingDelay = votingDelay_; votingPeriod = votingPeriod_; numAllowedProposalSubmissions = numAllowedProposalSubmissions_; maxProposalCount = maxProposalCount_; downvotingAllowed = downvotingAllowed_; costToPropose = costToPropose_; percentageToCreator = percentageToCreator_; emit JokeraceCreated(name_, msg.sender); // emit upon creation to be able to easily find jokeraces on a chain } function version() public pure returns (string memory) { return "4.20"; } function hashProposal(ProposalCore memory proposal) public pure returns (uint256) { return uint256(keccak256(abi.encode(proposal))); } function state() public view returns (ContestState) { if (canceled) { return ContestState.Canceled; } if (contestStart >= block.timestamp) { return ContestState.NotStarted; } if (voteStart() >= block.timestamp) { return ContestState.Queued; } if (contestDeadline() >= block.timestamp) { return ContestState.Active; } return ContestState.Completed; } /** * @dev Return all proposals. */ function getAllProposalIds() public view returns (uint256[] memory) { return proposalIds; } /** * @dev Return all proposal authors. */ function getAllProposalAuthors() public view returns (address[] memory) { return proposalAuthors; } /** * @dev Return all addresses that have voted. */ function getAllAddressesThatHaveVoted() public view returns (address[] memory) { return addressesThatHaveVoted; } /** * @dev Return all deleted proposals. */ function getAllDeletedProposalIds() public view returns (uint256[] memory) { return deletedProposalIds; } /** * @dev Return all authors of deleted proposals. */ function getAllAuthorsOfDeletedProposals() public view returns (address[] memory) { uint256[] memory deletedProposalIdsMemVar = deletedProposalIds; address[] memory authorsArray = new address[](deletedProposalIdsMemVar.length); for (uint256 i = 0; i < deletedProposalIdsMemVar.length; i++) { authorsArray[i] = proposals[deletedProposalIdsMemVar[i]].author; } return authorsArray; } /** * @dev Timestamp the contest vote begins. Votes open at the end of this block, so it is possible to propose * during this block. */ function voteStart() public view returns (uint256) { return contestStart + votingDelay; } /** * @dev Returns if a proposal has been deleted or not. */ function contestDeadline() public view returns (uint256) { return voteStart() + votingPeriod; } /** * @dev Retrieve proposal data. */ function getProposal(uint256 proposalId) public view returns (ProposalCore memory) { return proposals[proposalId]; } /** * @dev Remove deleted proposalIds from forVotesToProposalIds and decrement copy counts of the forVotes of proposalIds. */ function _multiRmProposalIdFromForVotesMap(uint256[] calldata proposalIds) internal virtual; /** * @dev Register a vote with a given support and voting weight. * * Note: Support is generic and can represent various things depending on the voting system used. */ function _countVote(uint256 proposalId, address account, uint8 support, uint256 numVotes, uint256 totalVotes) internal virtual; /** * @dev Verifies that `account` is permissioned to propose via merkle proof. */ function verifyProposer(address account, bytes32[] calldata proof) public { if (!addressSubmitterVerified[account]) { if (submissionMerkleRoot == 0) { // if the submission root is 0, then anyone can submit return; } checkProof(account, AMOUNT_FOR_SUMBITTER_PROOF, proof, false); // will revert with NotInMerkle if not valid addressSubmitterVerified[account] = true; } } /** * @dev Verifies that all of the metadata in the proposal is valid. */ function validateProposalData(ProposalCore memory proposal) public view { if (proposal.author != msg.sender) revert AuthorIsNotSender(proposal.author, msg.sender); for (uint256 index = 0; index < METADATAS_COUNT; index++) { Metadatas currentMetadata = Metadatas(index); if (currentMetadata == Metadatas.Target) { continue; // Nothing to check here since strictly typed to address } else if (currentMetadata == Metadatas.Safe) { if (proposal.safeMetadata.signers.length == 0) revert ZeroSignersInSafeMetadata(); if (proposal.safeMetadata.threshold == 0) revert ZeroThresholdInSafeMetadata(); } else { revert UnexpectedMetadata(currentMetadata); } } if (bytes(proposal.description).length == 0) revert EmptyProposalDescription(); } /** * @dev Distribute the costToPropose to jk labs and the creator based on _percentageToCreator. */ function _distributeCostToPropose() private { if (costToPropose > 0) { // Send proposal fee to jk labs address and creator uint256 sendingToJkLabs = (msg.value * (100 - percentageToCreator)) / 100; if (sendingToJkLabs > 0) { Address.sendValue(payable(JK_LABS_ADDRESS), sendingToJkLabs); emit PaymentReleased(JK_LABS_ADDRESS, sendingToJkLabs); } uint256 sendingToCreator = msg.value - sendingToJkLabs; if (sendingToCreator > 0) { Address.sendValue(payable(creator), sendingToCreator); // creator gets the extra wei in the case of rounding emit PaymentReleased(creator, sendingToCreator); } } } /** * @dev Create a new proposal. */ function propose(ProposalCore calldata proposal, bytes32[] calldata proof) public payable returns (uint256) { if (msg.value != costToPropose) revert IncorrectCostToProposeSent(msg.value, costToPropose); verifyProposer(msg.sender, proof); validateProposalData(proposal); uint256 proposalId = _castProposal(proposal); _distributeCostToPropose(); return proposalId; } /** * @dev Create a new proposal without a proof if you have already proposed with a proof. */ function proposeWithoutProof(ProposalCore calldata proposal) public payable returns (uint256) { if (msg.value != costToPropose) revert IncorrectCostToProposeSent(msg.value, costToPropose); if (submissionMerkleRoot != 0) { // if the submission root is 0, then anyone can submit; otherwise, this address needs to have been verified if (!addressSubmitterVerified[msg.sender]) revert NeedToSubmitWithProofFirst(); } validateProposalData(proposal); uint256 proposalId = _castProposal(proposal); _distributeCostToPropose(); return proposalId; } function _castProposal(ProposalCore memory proposal) internal returns (uint256) { if (state() != ContestState.Queued) revert ContestMustBeQueuedToPropose(state()); if (numSubmissions[msg.sender] == numAllowedProposalSubmissions) { revert SenderSubmissionLimitReached(numAllowedProposalSubmissions); } if ((proposalIds.length - deletedProposalIds.length) == maxProposalCount) { revert ContestSubmissionLimitReached(maxProposalCount); } uint256 proposalId = hashProposal(proposal); if (proposals[proposalId].exists) revert DuplicateSubmission(proposalId); proposalIds.push(proposalId); proposals[proposalId] = proposal; numSubmissions[msg.sender] += 1; proposalAuthors.push(msg.sender); emit ProposalCreated(proposalId, msg.sender); return proposalId; } /** * @dev Delete proposals. * * Emits a {IGovernor-ProposalsDeleted} event. */ function deleteProposals(uint256[] calldata proposalIdsToDelete) public { if (msg.sender != creator) revert OnlyCreatorCanDelete(); if (state() == ContestState.Completed) revert CannotDeleteWhenCompleted(); for (uint256 index = 0; index < proposalIdsToDelete.length; index++) { uint256 currentProposalId = proposalIdsToDelete[index]; if (!proposalIsDeleted[currentProposalId]) { // if this proposal hasn't already been deleted proposalIsDeleted[currentProposalId] = true; // this proposal now won't count towards the total number allowed in the contest // it will still count towards the total number of proposals that the user is allowed to submit though deletedProposalIds.push(currentProposalId); } } // we only do sorting if downvoting is disabled and if sorting is enabled if (downvotingAllowed == 0 && sortingEnabled == 1) { // remove proposalIds from forVotesToProposalIds (could contain proposalIds that have been deleted before, that's ok though) _multiRmProposalIdFromForVotesMap(proposalIdsToDelete); } emit ProposalsDeleted(proposalIds); } /** * @dev Cancels the contest. * * Emits a {IGovernor-ContestCanceled} event. */ function cancel() public { if (((msg.sender != creator) && (msg.sender != JK_LABS_ADDRESS))) revert OnlyJkLabsOrCreatorCanCancel(); ContestState status = state(); if (status == ContestState.Canceled) revert ContestAlreadyCancelled(); canceled = true; emit ContestCanceled(); } /** * @dev Verifies that `account` is permissioned to vote with `totalVotes` via merkle proof. */ function verifyVoter(address account, uint256 totalVotes, bytes32[] calldata proof) public { if (!addressTotalVotesVerified[account]) { checkProof(account, totalVotes, proof, true); // will revert with NotInMerkle if not valid addressTotalVotes[account] = totalVotes; addressTotalVotesVerified[account] = true; } } /** * @dev Cast a vote with a merkle proof. */ function castVote(uint256 proposalId, uint8 support, uint256 totalVotes, uint256 numVotes, bytes32[] calldata proof) public returns (uint256) { address voter = msg.sender; if (proposalIsDeleted[proposalId]) revert CannotVoteOnDeletedProposal(); verifyVoter(voter, totalVotes, proof); return _castVote(proposalId, voter, support, numVotes); } /** * @dev Cast a vote without a proof if you have already voted with a proof. */ function castVoteWithoutProof(uint256 proposalId, uint8 support, uint256 numVotes) public returns (uint256) { address voter = msg.sender; if (proposalIsDeleted[proposalId]) revert CannotVoteOnDeletedProposal(); if (!addressTotalVotesVerified[voter]) revert NeedToVoteWithProofFirst(); return _castVote(proposalId, voter, support, numVotes); } /** * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve * voting weight using addressTotalVotes() and call the {_countVote} internal function. * * Emits a {IGovernor-VoteCast} event. */ function _castVote(uint256 proposalId, address account, uint8 support, uint256 numVotes) internal returns (uint256) { if (state() != ContestState.Active) revert ContestMustBeActiveToVote(state()); if (numVotes == 0) revert NeedAtLeastOneVoteToVote(); _countVote(proposalId, account, support, numVotes, addressTotalVotes[account]); addressesThatHaveVoted.push(msg.sender); emit VoteCast(account, proposalId, support, numVotes); return addressTotalVotes[account]; } function setSubmissionMerkleRoot(bytes32 newSubmissionMerkleRoot) public { if (msg.sender != JK_LABS_ADDRESS) revert OnlyJkLabsCanAmend(); submissionMerkleRoot = newSubmissionMerkleRoot; } function setVotingMerkleRoot(bytes32 newVotingMerkleRoot) public { if (msg.sender != JK_LABS_ADDRESS) revert OnlyJkLabsCanAmend(); votingMerkleRoot = newVotingMerkleRoot; } } // Forked from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/governance/extensions/GovernorCountingSimple.sol /** * @dev Extension of {Governor} for simple vote counting. */ abstract contract GovernorCountingSimple is Governor { /** * @dev Supported vote types. Matches Governor Bravo ordering. */ enum VoteType { For, Against } struct VoteCounts { uint256 forVotes; uint256 againstVotes; } struct ProposalVote { VoteCounts proposalVoteCounts; address[] addressesVoted; mapping(address => VoteCounts) addressVoteCounts; } uint256 public totalVotesCast; // Total votes cast in contest so far mapping(address => uint256) public addressTotalCastVoteCounts; mapping(uint256 => ProposalVote) public proposalVotesStructs; mapping(uint256 => uint256[]) public forVotesToProposalIds; error MoreThanOneProposalWithThisManyVotes(); error NotEnoughVotesLeft(); error DownvotingNotEnabled(); error InvalidVoteType(); error RankCannotBeZero(); error RankIsNotInSortedRanks(); error IndexHasNotBeenPopulated(); /** * @dev Accessor to the internal vote counts for a given proposal. */ function proposalVotes(uint256 proposalId) public view returns (uint256 forVotes, uint256 againstVotes) { ProposalVote storage proposalvote = proposalVotesStructs[proposalId]; return (proposalvote.proposalVoteCounts.forVotes, proposalvote.proposalVoteCounts.againstVotes); } /** * @dev Accessor to how many votes an address has cast for a given proposal. */ function proposalAddressVotes(uint256 proposalId, address userAddress) public view returns (uint256 forVotes, uint256 againstVotes) { ProposalVote storage proposalvote = proposalVotesStructs[proposalId]; return ( proposalvote.addressVoteCounts[userAddress].forVotes, proposalvote.addressVoteCounts[userAddress].againstVotes ); } /** * @dev Accessor to which addresses have cast a vote for a given proposal. */ function proposalAddressesHaveVoted(uint256 proposalId) public view returns (address[] memory) { ProposalVote storage proposalvote = proposalVotesStructs[proposalId]; return proposalvote.addressesVoted; } /** * @dev Accessor to how many votes an address has cast total for the contest so far. */ function contestAddressTotalVotesCast(address userAddress) public view returns (uint256 userTotalVotesCast) { return addressTotalCastVoteCounts[userAddress]; } /** * @dev Accessor to the internal vote counts for a given proposal. */ function allProposalTotalVotes() public view returns (uint256[] memory proposalIdsReturn, VoteCounts[] memory proposalVoteCountsArrayReturn) { uint256[] memory proposalIdsMemVar = getAllProposalIds(); VoteCounts[] memory proposalVoteCountsArray = new VoteCounts[](proposalIdsMemVar.length); for (uint256 i = 0; i < proposalIdsMemVar.length; i++) { proposalVoteCountsArray[i] = proposalVotesStructs[proposalIdsMemVar[i]].proposalVoteCounts; } return (proposalIdsMemVar, proposalVoteCountsArray); } /** * @dev Get the whole array in `forVotesToProposalIds` for a given `forVotes` amount. */ function getProposalsWithThisManyForVotes(uint256 forVotes) public view returns (uint256[] memory proposalsWithThisManyForVotes) { return forVotesToProposalIds[forVotes]; } /** * @dev Get the number of proposals that have `forVotes` number of for votes. */ function getNumProposalsWithThisManyForVotes(uint256 forVotes) public view override returns (uint256 count) { return forVotesToProposalIds[forVotes].length; } /** * @dev Get the only proposal id with this many for votes. * NOTE: Should only get called at a point at which you are sure there is only one proposal id * with a certain number of forVotes (we only use it in the RewardsModule after ties have * been checked for). */ function getOnlyProposalIdWithThisManyForVotes(uint256 forVotes) public view returns (uint256 proposalId) { if (forVotesToProposalIds[forVotes].length != 1) revert MoreThanOneProposalWithThisManyVotes(); return forVotesToProposalIds[forVotes][0]; } /** * @dev Get the idx of sortedRanks considered to hold the queried rank taking deleted proposals into account. * A rank has to have > 0 votes to be considered valid. */ function getRankIndex(uint256 rank) public view returns (uint256 rankIndex) { if (rank == 0) revert RankCannotBeZero(); uint256 sortedRanksLength = sortedRanks.length; // only check state var once to save on gas uint256[] memory sortedRanksMemVar = sortedRanks; // only check state var once to save on gas uint256 counter = 1; for (uint256 index = 0; index < sortedRanksLength; index++) { // if this is a value of a deleted proposal or an ungarbage collected oldValue, go forwards without // incrementing the counter if (getNumProposalsWithThisManyForVotes(sortedRanksMemVar[index]) == 0) { continue; } // if the counter is at the rank we are looking for, then return with it if (counter == rank) { return index; } counter++; } // if there's no valid index for that rank in sortedRanks, revert revert RankIsNotInSortedRanks(); } /** * @dev Returns whether a given index in sortedRanks is tied or is below a tied rank. */ function isOrIsBelowTiedRank(uint256 idx) public view returns (bool atOrBelowTiedRank) { if (idx > sortedRanks.length - 1) { // if `idx` hasn't been populated, then it's not a valid index to be checking and something is wrong revert IndexHasNotBeenPopulated(); } for (uint256 index = 0; index < idx + 1; index++) { if (getNumProposalsWithThisManyForVotes(sortedRanks[index]) > 1) { return true; } } return false; } /** * @dev Remove this proposalId from the list of proposalIds that share its current forVotes * value in forVotesToProposalIds. */ function _rmProposalIdFromForVotesMap(uint256 proposalId, uint256 forVotes) internal { uint256[] memory forVotesToPropIdMemVar = forVotesToProposalIds[forVotes]; // only check state var once to save on gas for (uint256 i = 0; i < forVotesToPropIdMemVar.length; i++) { if (forVotesToPropIdMemVar[i] == proposalId) { // swap with last item and pop bc we don't care about order. // makes things cleaner (than just deleting) and saves on gas if there end up being a ton of proposals that pass // through having a certain number of votes throughout the contest. forVotesToProposalIds[forVotes][i] = forVotesToPropIdMemVar[forVotesToPropIdMemVar.length - 1]; forVotesToProposalIds[forVotes].pop(); break; } } } /** * @dev See {Governor-_multiRmProposalIdFromForVotesMap}. */ function _multiRmProposalIdFromForVotesMap(uint256[] calldata proposalIdsToDelete) internal override { for (uint256 i = 0; i < proposalIdsToDelete.length; i++) { uint256 currentProposalId = proposalIdsToDelete[i]; uint256 currentProposalsForVotes = proposalVotesStructs[currentProposalId].proposalVoteCounts.forVotes; // remove this proposalId from the list of proposalIdsToDelete that share its current forVotes // value in forVotesToProposalIds _rmProposalIdFromForVotesMap(currentProposalId, currentProposalsForVotes); } } /** * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo). */ function _countVote(uint256 proposalId, address account, uint8 support, uint256 numVotes, uint256 totalVotes) internal override { ProposalVote storage proposalvote = proposalVotesStructs[proposalId]; if (numVotes > (totalVotes - addressTotalCastVoteCounts[account])) revert NotEnoughVotesLeft(); bool firstTimeVoting = ( proposalvote.addressVoteCounts[account].forVotes == 0 && proposalvote.addressVoteCounts[account].againstVotes == 0 ); if (support == uint8(VoteType.For)) { proposalvote.proposalVoteCounts.forVotes += numVotes; proposalvote.addressVoteCounts[account].forVotes += numVotes; } else if (support == uint8(VoteType.Against)) { if (downvotingAllowed != 1) revert DownvotingNotEnabled(); proposalvote.proposalVoteCounts.againstVotes += numVotes; proposalvote.addressVoteCounts[account].againstVotes += numVotes; } else { revert InvalidVoteType(); } if (firstTimeVoting) { proposalvote.addressesVoted.push(account); } addressTotalCastVoteCounts[account] += numVotes; totalVotesCast += numVotes; // sorting and consequently rewards module compatibility is only available if downvoting is disabled and sorting enabled if ((downvotingAllowed == 0) && (sortingEnabled == 1)) { uint256 newForVotes = proposalvote.proposalVoteCounts.forVotes; // only check state var once to save on gas uint256 oldForVotes = newForVotes - numVotes; // update map of forVotes => proposalId[] to be able to go from rank => proposalId. // if oldForVotes is 0, then this proposal will not already be in this map, so we don't need to rm it if (oldForVotes > 0) { _rmProposalIdFromForVotesMap(proposalId, oldForVotes); } forVotesToProposalIds[newForVotes].push(proposalId); _updateRanks(oldForVotes, newForVotes); } } } // Forked from OpenZeppelin Contracts (v4.7.0) (finance/PaymentSplitter.sol) // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } /** * @title RewardsModule * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the * time of contract deployment and can't be updated thereafter. * * `RewardsModule` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract RewardsModule { event PayeeAdded(uint256 ranking, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); event RewardWithdrawn(address by, uint256 amount); event ERC20RewardWithdrawn(IERC20 indexed token, address by, uint256 amount); uint256 public totalShares; uint256 public totalReleased; mapping(uint256 => uint256) public shares; // Getter for the amount of shares held by a ranking. mapping(uint256 => uint256) public released; // Getter for the amount of Ether already released to a ranking. uint256[] public payees; mapping(IERC20 => uint256) public erc20TotalReleased; mapping(IERC20 => mapping(uint256 => uint256)) public erc20Released; GovernorCountingSimple public underlyingContest; address public creator; bool public paysOutTarget; // If true, pay out target address; if false, pay out proposal author. error PayeesSharesLengthMismatch(); error MustHaveAtLeastOnePayee(); error TotalSharesCannotBeZero(); error MustHaveDownvotingDisabled(); error MustHaveSortingEnabled(); error ContestMustBeCompleted(); error PayoutRankCannotBeZero(); error RankingHasNoShares(); error AccountNotDueNativePayment(); error CannotPayOutToZeroAddress(); error AccountNotDueERC20Payment(); error OnlyCreatorCanWithdraw(); error RankingCannotBeZero(); error SharesCannotBeZero(); error AccountAlreadyHasShares(); /** * @dev Creates an instance of `RewardsModule` where each ranking in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All rankings in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor( uint256[] memory payees_, uint256[] memory shares_, GovernorCountingSimple underlyingContest_, bool paysOutTarget_ ) payable { if (payees_.length != shares_.length) revert PayeesSharesLengthMismatch(); if (payees_.length == 0) revert MustHaveAtLeastOnePayee(); for (uint256 i = 0; i < payees_.length; i++) { _addPayee(payees_[i], shares_[i]); } if (totalShares == 0) revert TotalSharesCannotBeZero(); paysOutTarget = paysOutTarget_; underlyingContest = underlyingContest_; creator = msg.sender; } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. */ receive() external payable { emit PaymentReceived(msg.sender, msg.value); } /** * @dev Version of the rewards module. */ function version() public pure returns (string memory) { return "4.20"; } /** * @dev Getter for list of rankings that will be paid out. */ function getPayees() public view returns (uint256[] memory) { return payees; } /** * @dev Getter for the underlying contest. */ function getUnderlyingContest() public view returns (GovernorCountingSimple) { return underlyingContest; } /** * @dev Getter for the amount of payee's releasable Ether. */ function releasable(uint256 ranking) public view returns (uint256) { uint256 totalReceived = address(this).balance + totalReleased; return _pendingPayment(ranking, totalReceived, released[ranking]); } /** * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(IERC20 token, uint256 ranking) public view returns (uint256) { uint256 totalReceived = token.balanceOf(address(this)) + erc20TotalReleased[token]; return _pendingPayment(ranking, totalReceived, erc20Released[token][ranking]); } /** * @dev Run release checks. */ function runReleaseChecks(uint256 ranking) public view { if (underlyingContest.downvotingAllowed() != 0) revert MustHaveDownvotingDisabled(); if (underlyingContest.sortingEnabled() != 1) revert MustHaveSortingEnabled(); if (underlyingContest.state() != Governor.ContestState.Completed) revert ContestMustBeCompleted(); if (ranking == 0) revert PayoutRankCannotBeZero(); if (shares[ranking] == 0) revert RankingHasNoShares(); } /** * @dev Return address to pay out for a given ranking. */ function getAddressToPayOut(uint256 ranking) public view returns (address) { address addressToPayOut; uint256 determinedRankingIdxInSortedRanks = underlyingContest.getRankIndex(ranking); // if the ranking that we land on is tied or it's below a tied ranking, send to creator if (underlyingContest.isOrIsBelowTiedRank(determinedRankingIdxInSortedRanks)) { addressToPayOut = creator; } // otherwise, determine proposal at ranking and pay out according to that else { uint256 rankValue = underlyingContest.sortedRanks(determinedRankingIdxInSortedRanks); Governor.ProposalCore memory rankingProposal = underlyingContest.getProposal( underlyingContest.getOnlyProposalIdWithThisManyForVotes(rankValue) // if no ties there should only be one ); addressToPayOut = paysOutTarget ? rankingProposal.targetMetadata.targetAddress : rankingProposal.author; } return addressToPayOut; } /** * @dev Triggers a transfer to `ranking` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(uint256 ranking) public { runReleaseChecks(ranking); uint256 payment = releasable(ranking); if (payment == 0) revert AccountNotDueNativePayment(); // totalReleased is the sum of all values in released. // If "totalReleased += payment" does not overflow, then "released[account] += payment" cannot overflow. totalReleased += payment; unchecked { released[ranking] += payment; } address payable addressToPayOut = payable(getAddressToPayOut(ranking)); if (addressToPayOut == address(0)) revert CannotPayOutToZeroAddress(); emit PaymentReleased(addressToPayOut, payment); Address.sendValue(addressToPayOut, payment); } /** * @dev Triggers a transfer to `ranking` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, uint256 ranking) public { runReleaseChecks(ranking); uint256 payment = releasable(token, ranking); if (payment == 0) revert AccountNotDueERC20Payment(); // erc20TotalReleased[token] is the sum of all values in erc20Released[token]. // If "erc20TotalReleased[token] += payment" does not overflow, then "erc20Released[token][account] += payment" cannot overflow. erc20TotalReleased[token] += payment; unchecked { erc20Released[token][ranking] += payment; } address payable addressToPayOut = payable(getAddressToPayOut(ranking)); if (addressToPayOut == address(0)) revert CannotPayOutToZeroAddress(); emit ERC20PaymentReleased(token, addressToPayOut, payment); SafeERC20.safeTransfer(token, addressToPayOut, payment); } function withdrawRewards() public { if (msg.sender != creator) revert OnlyCreatorCanWithdraw(); emit RewardWithdrawn(creator, address(this).balance); Address.sendValue(payable(creator), address(this).balance); } function withdrawRewards(IERC20 token) public { if (msg.sender != creator) revert OnlyCreatorCanWithdraw(); emit ERC20RewardWithdrawn(token, creator, token.balanceOf(address(this))); SafeERC20.safeTransfer(token, payable(creator), token.balanceOf(address(this))); } /** * @dev internal logic for computing the pending payment of a `ranking` given the token historical balances and * already released amounts. */ function _pendingPayment(uint256 ranking, uint256 totalReceived, uint256 alreadyReleased) private view returns (uint256) { return (totalReceived * shares[ranking]) / totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param ranking The ranking of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(uint256 ranking, uint256 shares_) private { if (ranking == 0) revert RankingCannotBeZero(); if (shares_ == 0) revert SharesCannotBeZero(); if (shares[ranking] != 0) revert AccountAlreadyHasShares(); payees.push(ranking); shares[ranking] = shares_; totalShares = totalShares + shares_; emit PayeeAdded(ranking, shares_); } } /** * @dev Extension of {Governor} for module management. */ abstract contract GovernorModuleRegistry is Governor { event OfficialRewardsModuleSet(RewardsModule oldOfficialRewardsModule, RewardsModule newOfficialRewardsModule); RewardsModule public officialRewardsModule; error OnlyCreatorCanSetRewardsModule(); /** * @dev Get the official rewards module contract for this contest (effectively reverse record). */ function setOfficialRewardsModule(RewardsModule officialRewardsModule_) public { if (msg.sender != creator) revert OnlyCreatorCanSetRewardsModule(); RewardsModule oldOfficialRewardsModule = officialRewardsModule; officialRewardsModule = officialRewardsModule_; emit OfficialRewardsModuleSet(oldOfficialRewardsModule, officialRewardsModule_); } } /** * @dev Extension of {Governor} for engagement features. */ abstract contract GovernorEngagement is Governor { struct CommentCore { address author; uint256 timestamp; uint256 proposalId; string commentContent; } /** * @dev Emitted when a comment is created. */ event CommentCreated(uint256 commentId); /** * @dev Emitted when comments are deleted. */ event CommentsDeleted(uint256[] commentIds); uint256[] public commentIds; uint256[] public deletedCommentIds; mapping(uint256 => CommentCore) public comments; mapping(uint256 => uint256[]) public proposalComments; mapping(uint256 => bool) public commentIsDeleted; error OnlyCreatorOrAuthorCanDeleteComments(uint256 failedToDeleteCommentId); /** * @dev Hashing function used to build the comment id from the comment details. */ function hashComment(CommentCore memory commentObj) public pure returns (uint256) { return uint256(keccak256(abi.encode(commentObj))); } /** * @dev Return all commentIds. */ function getAllCommentIds() public view returns (uint256[] memory) { return commentIds; } /** * @dev Return all deleted commentIds. */ function getAllDeletedCommentIds() public view returns (uint256[] memory) { return deletedCommentIds; } /** * @dev Return a comment object. */ function getComment(uint256 commentId) public view returns (CommentCore memory) { return comments[commentId]; } /** * @dev Return the array of commentIds on a given proposalId. */ function getProposalComments(uint256 proposalId) public view returns (uint256[] memory) { return proposalComments[proposalId]; } /** * @dev Comment on a proposal. * * Emits a {CommentCreated} event. */ function comment(uint256 proposalId, string memory commentContent) public returns (uint256) { CommentCore memory commentObject = CommentCore({ author: msg.sender, timestamp: block.timestamp, proposalId: proposalId, commentContent: commentContent }); uint256 commentId = hashComment(commentObject); commentIds.push(commentId); comments[commentId] = commentObject; proposalComments[proposalId].push(commentId); emit CommentCreated(commentId); return commentId; } /** * @dev Delete comments. * * Emits a {CommentsDeleted} event. */ function deleteComments(uint256[] memory commentIdsParam) public { uint256 commentIdsParamMemVar = commentIdsParam.length; for (uint256 index = 0; index < commentIdsParamMemVar; index++) { uint256 currentCommentId = commentIdsParam[index]; if ((msg.sender != creator) && (msg.sender != comments[currentCommentId].author)) { revert OnlyCreatorOrAuthorCanDeleteComments(currentCommentId); } if (!commentIsDeleted[currentCommentId]) { commentIsDeleted[currentCommentId] = true; deletedCommentIds.push(currentCommentId); } } emit CommentsDeleted(commentIdsParam); } } contract Contest is GovernorCountingSimple, GovernorModuleRegistry, GovernorEngagement { constructor( string memory _name, string memory _prompt, bytes32 _submissionMerkleRoot, bytes32 _votingMerkleRoot, uint256[] memory _constructorIntParams ) Governor( _name, _prompt, _submissionMerkleRoot, _votingMerkleRoot, _constructorIntParams[0], // contestStart _constructorIntParams[1], // votingDelay, _constructorIntParams[2], // votingPeriod, _constructorIntParams[3], // numAllowedProposalSubmissions, _constructorIntParams[4], // maxProposalCount _constructorIntParams[5], // downvotingAllowed _constructorIntParams[6], // costToPropose _constructorIntParams[7] // percentageToCreator ) GovernorSorting( _constructorIntParams[8], // sortingEnabled _constructorIntParams[9] // rankLimit ) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_prompt","type":"string"},{"internalType":"bytes32","name":"_submissionMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_votingMerkleRoot","type":"bytes32"},{"internalType":"uint256[]","name":"_constructorIntParams","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressNotPermissionedToSubmit","type":"error"},{"inputs":[{"internalType":"address","name":"author","type":"address"},{"internalType":"address","name":"sender","type":"address"}],"name":"AuthorIsNotSender","type":"error"},{"inputs":[],"name":"CannotDeleteWhenCompleted","type":"error"},{"inputs":[],"name":"CannotVoteOnDeletedProposal","type":"error"},{"inputs":[],"name":"ContestAlreadyCancelled","type":"error"},{"inputs":[{"internalType":"enum Governor.ContestState","name":"currentState","type":"uint8"}],"name":"ContestMustBeActiveToVote","type":"error"},{"inputs":[{"internalType":"enum Governor.ContestState","name":"currentState","type":"uint8"}],"name":"ContestMustBeQueuedToPropose","type":"error"},{"inputs":[{"internalType":"uint256","name":"maxProposalCount","type":"uint256"}],"name":"ContestSubmissionLimitReached","type":"error"},{"inputs":[],"name":"DownvotingNotEnabled","type":"error"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"DuplicateSubmission","type":"error"},{"inputs":[],"name":"EmptyProposalDescription","type":"error"},{"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"},{"internalType":"uint256","name":"costToPropose","type":"uint256"}],"name":"IncorrectCostToProposeSent","type":"error"},{"inputs":[],"name":"IndexHasNotBeenPopulated","type":"error"},{"inputs":[],"name":"InvalidVoteType","type":"error"},{"inputs":[],"name":"MoreThanOneProposalWithThisManyVotes","type":"error"},{"inputs":[],"name":"NeedAtLeastOneVoteToVote","type":"error"},{"inputs":[],"name":"NeedToSubmitWithProofFirst","type":"error"},{"inputs":[],"name":"NeedToVoteWithProofFirst","type":"error"},{"inputs":[],"name":"NotEnoughVotesLeft","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"inputs":[],"name":"OnlyCreatorCanDelete","type":"error"},{"inputs":[],"name":"OnlyCreatorCanSetRewardsModule","type":"error"},{"inputs":[{"internalType":"uint256","name":"failedToDeleteCommentId","type":"uint256"}],"name":"OnlyCreatorOrAuthorCanDeleteComments","type":"error"},{"inputs":[],"name":"OnlyJkLabsCanAmend","type":"error"},{"inputs":[],"name":"OnlyJkLabsOrCreatorCanCancel","type":"error"},{"inputs":[],"name":"RankCannotBeZero","type":"error"},{"inputs":[],"name":"RankIsNotInSortedRanks","type":"error"},{"inputs":[{"internalType":"uint256","name":"numAllowedProposalSubmissions","type":"uint256"}],"name":"SenderSubmissionLimitReached","type":"error"},{"inputs":[{"internalType":"enum Governor.Metadatas","name":"unexpectedMetadata","type":"uint8"}],"name":"UnexpectedMetadata","type":"error"},{"inputs":[],"name":"ZeroSignersInSafeMetadata","type":"error"},{"inputs":[],"name":"ZeroThresholdInSafeMetadata","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"commentId","type":"uint256"}],"name":"CommentCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"commentIds","type":"uint256[]"}],"name":"CommentsDeleted","type":"event"},{"anonymous":false,"inputs":[],"name":"ContestCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"creator","type":"address"}],"name":"JokeraceCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract RewardsModule","name":"oldOfficialRewardsModule","type":"address"},{"indexed":false,"internalType":"contract RewardsModule","name":"newOfficialRewardsModule","type":"address"}],"name":"OfficialRewardsModuleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"proposalIds","type":"uint256[]"}],"name":"ProposalsDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"support","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"numVotes","type":"uint256"}],"name":"VoteCast","type":"event"},{"inputs":[],"name":"AMOUNT_FOR_SUMBITTER_PROOF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JK_LABS_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATAS_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressSubmitterVerified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressTotalCastVoteCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressTotalVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressTotalVotesVerified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressesThatHaveVoted","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allProposalTotalVotes","outputs":[{"internalType":"uint256[]","name":"proposalIdsReturn","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"}],"internalType":"struct GovernorCountingSimple.VoteCounts[]","name":"proposalVoteCountsArrayReturn","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canceled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"uint256","name":"totalVotes","type":"uint256"},{"internalType":"uint256","name":"numVotes","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"castVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"uint256","name":"numVotes","type":"uint256"}],"name":"castVoteWithoutProof","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToCheck","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bool","name":"voting","type":"bool"}],"name":"checkProof","outputs":[{"internalType":"bool","name":"verified","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"commentContent","type":"string"}],"name":"comment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commentIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commentIsDeleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"comments","outputs":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"commentContent","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"contestAddressTotalVotesCast","outputs":[{"internalType":"uint256","name":"userTotalVotesCast","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contestDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contestStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costToPropose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"commentIdsParam","type":"uint256[]"}],"name":"deleteComments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"proposalIdsToDelete","type":"uint256[]"}],"name":"deleteProposals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deletedCommentIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deletedProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"downvotingAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"forVotesToProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllAddressesThatHaveVoted","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllAuthorsOfDeletedProposals","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllCommentIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllDeletedCommentIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllDeletedProposalIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllProposalAuthors","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllProposalIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"commentId","type":"uint256"}],"name":"getComment","outputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"commentContent","type":"string"}],"internalType":"struct GovernorEngagement.CommentCore","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"forVotes","type":"uint256"}],"name":"getNumProposalsWithThisManyForVotes","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"forVotes","type":"uint256"}],"name":"getOnlyProposalIdWithThisManyForVotes","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"address","name":"targetAddress","type":"address"}],"internalType":"struct Governor.TargetMetadata","name":"targetMetadata","type":"tuple"},{"components":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"internalType":"struct Governor.SafeMetadata","name":"safeMetadata","type":"tuple"}],"internalType":"struct Governor.ProposalCore","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalComments","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"forVotes","type":"uint256"}],"name":"getProposalsWithThisManyForVotes","outputs":[{"internalType":"uint256[]","name":"proposalsWithThisManyForVotes","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rank","type":"uint256"}],"name":"getRankIndex","outputs":[{"internalType":"uint256","name":"rankIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSortedRanks","outputs":[{"internalType":"uint256[]","name":"sortedRanksArray","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"commentContent","type":"string"}],"internalType":"struct GovernorEngagement.CommentCore","name":"commentObj","type":"tuple"}],"name":"hashComment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"address","name":"targetAddress","type":"address"}],"internalType":"struct Governor.TargetMetadata","name":"targetMetadata","type":"tuple"},{"components":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"internalType":"struct Governor.SafeMetadata","name":"safeMetadata","type":"tuple"}],"internalType":"struct Governor.ProposalCore","name":"proposal","type":"tuple"}],"name":"hashProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"}],"name":"isOrIsBelowTiedRank","outputs":[{"internalType":"bool","name":"atOrBelowTiedRank","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxProposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numAllowedProposalSubmissions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numSubmissions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"officialRewardsModule","outputs":[{"internalType":"contract RewardsModule","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentageToCreator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prompt","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"proposalAddressVotes","outputs":[{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"proposalAddressesHaveVoted","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalAuthors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalComments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalIsDeleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"proposalVotes","outputs":[{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalVotesStructs","outputs":[{"components":[{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"}],"internalType":"struct GovernorCountingSimple.VoteCounts","name":"proposalVoteCounts","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"address","name":"author","type":"address"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"address","name":"targetAddress","type":"address"}],"internalType":"struct Governor.TargetMetadata","name":"targetMetadata","type":"tuple"},{"components":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"internalType":"struct Governor.SafeMetadata","name":"safeMetadata","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"address","name":"targetAddress","type":"address"}],"internalType":"struct Governor.TargetMetadata","name":"targetMetadata","type":"tuple"},{"components":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"internalType":"struct Governor.SafeMetadata","name":"safeMetadata","type":"tuple"}],"internalType":"struct Governor.ProposalCore","name":"proposal","type":"tuple"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"address","name":"targetAddress","type":"address"}],"internalType":"struct Governor.TargetMetadata","name":"targetMetadata","type":"tuple"},{"components":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"internalType":"struct Governor.SafeMetadata","name":"safeMetadata","type":"tuple"}],"internalType":"struct Governor.ProposalCore","name":"proposal","type":"tuple"}],"name":"proposeWithoutProof","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rankLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract RewardsModule","name":"officialRewardsModule_","type":"address"}],"name":"setOfficialRewardsModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newSubmissionMerkleRoot","type":"bytes32"}],"name":"setSubmissionMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newVotingMerkleRoot","type":"bytes32"}],"name":"setVotingMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sortedRanks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sortingEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum Governor.ContestState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"submissionMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVotesCast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"address","name":"targetAddress","type":"address"}],"internalType":"struct Governor.TargetMetadata","name":"targetMetadata","type":"tuple"},{"components":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"internalType":"struct Governor.SafeMetadata","name":"safeMetadata","type":"tuple"}],"internalType":"struct Governor.ProposalCore","name":"proposal","type":"tuple"}],"name":"validateProposalData","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verifyProposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"totalVotes","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verifyVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"voteStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004ab038038062004ab083398101604081905262000034916200030b565b84848484846000815181106200004e576200004e6200041c565b6020026020010151856001815181106200006c576200006c6200041c565b6020026020010151866002815181106200008a576200008a6200041c565b602002602001015187600381518110620000a857620000a86200041c565b602002602001015188600481518110620000c657620000c66200041c565b602002602001015189600581518110620000e457620000e46200041c565b60200260200101518a6006815181106200010257620001026200041c565b60200260200101518b6007815181106200012057620001206200041c565b602002602001015189898e6008815181106200014057620001406200041c565b60200260200101518f6009815181106200015e576200015e6200041c565b60209081029190910101516000919091556001556003919091556004556005620001898d82620004c1565b506006620001988c82620004c1565b50600780546001600160a01b0319163390811790915560088990556009889055600a879055600b869055600c859055600d849055600e839055600f8290556040517f1eae03a78f765227bc1e8574db32390cefa5b3c0a954017973e497e40a1237349162000209918f91906200058d565b60405180910390a15050505050505050505050505050505050620005d3565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000269576200026962000228565b604052919050565b60005b838110156200028e57818101518382015260200162000274565b50506000910152565b600082601f830112620002a957600080fd5b81516001600160401b03811115620002c557620002c562000228565b620002da601f8201601f19166020016200023e565b818152846020838601011115620002f057600080fd5b6200030382602083016020870162000271565b949350505050565b600080600080600060a086880312156200032457600080fd5b85516001600160401b03808211156200033c57600080fd5b6200034a89838a0162000297565b96506020915081880151818111156200036257600080fd5b620003708a828b0162000297565b96505060408801519450606088015193506080880151818111156200039457600080fd5b8801601f81018a13620003a657600080fd5b805182811115620003bb57620003bb62000228565b8060051b9250620003ce8484016200023e565b818152928201840192848101908c851115620003e957600080fd5b928501925b848410156200040957835182529285019290850190620003ee565b8096505050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200044757607f821691505b6020821081036200046857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004bc57600081815260208120601f850160051c81016020861015620004975750805b601f850160051c820191505b81811015620004b857828155600101620004a3565b5050505b505050565b81516001600160401b03811115620004dd57620004dd62000228565b620004f581620004ee845462000432565b846200046e565b602080601f8311600181146200052d5760008415620005145750858301515b600019600386901b1c1916600185901b178555620004b8565b600085815260208120601f198616915b828110156200055e578886015182559484019460019091019084016200053d565b50858210156200057d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260008351806040840152620005ae81606085016020880162000271565b6001600160a01b0393909316602083015250601f91909101601f191601606001919050565b6144cd80620005e36000396000f3fe6080604052600436106104885760003560e01c806375e509c511610255578063c19d93fb11610144578063ea8a1af0116100c1578063f4f3d7ec11610085578063f4f3d7ec14610e65578063f5c3641114610e85578063f61736f414610ea5578063f79c017214610ec5578063fb8ddab414610ef5578063fb9bf8d414610f1557600080fd5b8063ea8a1af014610ddd578063edcd1be414610df2578063eef18e1714610e08578063efa90d3614610e30578063f0a7db0a14610e4557600080fd5b8063daf762db11610108578063daf762db14610d50578063dd96a19d14610d70578063dea5f6a614610d86578063e031535b14610db3578063e11db9d814610dc857600080fd5b8063c19d93fb14610c9c578063c7f758a814610cbe578063c9a1b6b214610ceb578063cb85395014610d0b578063cbdc27cb14610d3b57600080fd5b80639ba197af116101d2578063b323580d11610196578063b323580d14610c13578063b66d1da314610c33578063bddc164114610c53578063c05f410414610c69578063c0ffaa7814610c8957600080fd5b80639ba197af14610b33578063a1ac6cb214610b60578063ac67f80114610b8d578063ae66b8ad14610bad578063aec116b614610bdd57600080fd5b80638ebb4c15116102195780638ebb4c1514610a7e5780639174778c14610aae578063930de97914610ace578063946369b514610afe5780639b644a2314610b1357600080fd5b806375e509c5146109f0578063785ddfe514610a1d5780637c65d71114610a3d5780637de418d514610a52578063832009af14610a6857600080fd5b80633f9942ff1161037c578063544c7bb4116102f957806360506ff6116102bd57806360506ff61461094f57806365f16263146109655780636e4eb810146109855780636ed815ad146109a55780636fd3636b146109bb578063711effc8146109d057600080fd5b8063544c7bb414610883578063544ffc9c146108a357806354fd4d50146108ed5780635c7107d81461091a5780635cb718a11461093a57600080fd5b8063476f4d8a11610340578063476f4d8a146107f85780634d24a67f1461080b57806350a5e5241461082057806350c4b61614610843578063531bd8121461086357600080fd5b80633f9942ff1461075e5780633fb57c9214610778578063409fd03014610798578063419c533c146107b8578063458da87d146107d857600080fd5b80631242b7371161040a578063325cc6d9116103ce578063325cc6d9146106c657806332763c22146106e6578063347cf66514610716578063366ecf5b146107325780633932abb11461074857600080fd5b80631242b7371461062b5780631805c5231461064d57806320b3e8451461066d578063262e59e91461068f5780632c39805f146106a457600080fd5b806305846cae1161045157806305846cae1461054b57806306fdde031461056b578063070dc5d91461058d5780630800e300146105de5780630aa25e441461060b57600080fd5b80624114a81461048d578063013cf08b146104b657806302a251a3146104e757806302d05d3f146104fd5780630414126a14610535575b600080fd5b34801561049957600080fd5b506104a360085481565b6040519081526020015b60405180910390f35b3480156104c257600080fd5b506104d66104d13660046136eb565b610f2b565b6040516104ad9594939291906137a3565b3480156104f357600080fd5b506104a3600a5481565b34801561050957600080fd5b5060075461051d906001600160a01b031681565b6040516001600160a01b0390911681526020016104ad565b34801561054157600080fd5b506104a360015481565b34801561055757600080fd5b506104a36105663660046136eb565b611073565b34801561057757600080fd5b50610580611094565b6040516104ad91906137f5565b34801561059957600080fd5b506105d16105a83660046136eb565b601d60209081526000918252604091829020825180840190935280548352600101549082015281565b6040516104ad9190613808565b3480156105ea57600080fd5b506105fe6105f93660046136eb565b611122565b6040516104ad919061381f565b34801561061757600080fd5b5061051d6106263660046136eb565b611236565b34801561063757600080fd5b50610640611260565b6040516104ad919061389b565b34801561065957600080fd5b506104a36106683660046139cf565b6112b8565b34801561067957600080fd5b5061068d610688366004613a6e565b6113d7565b005b34801561069b57600080fd5b506104a3611446565b3480156106b057600080fd5b506106b9611462565b6040516104ad9190613ac2565b3480156106d257600080fd5b506104a36106e13660046136eb565b6114c3565b3480156106f257600080fd5b50610706610701366004613b24565b6114d3565b60405190151581526020016104ad565b34801561072257600080fd5b506104a3678ac7230489e8000081565b34801561073e57600080fd5b506104a360005481565b34801561075457600080fd5b506104a360095481565b34801561076a57600080fd5b506013546107069060ff1681565b34801561078457600080fd5b506104a36107933660046136eb565b6115d2565b3480156107a457600080fd5b506104a36107b3366004613b94565b6115e2565b3480156107c457600080fd5b506104a36107d3366004613c50565b611613565b3480156107e457600080fd5b506104a36107f3366004613e5f565b611669565b6104a3610806366004613eab565b61167c565b34801561081757600080fd5b506104a3611713565b34801561082c57600080fd5b50610835611721565b6040516104ad929190613edf565b34801561084f57600080fd5b5061051d61085e3660046136eb565b611827565b34801561086f57600080fd5b5061068d61087e366004613f48565b611837565b34801561088f57600080fd5b5061068d61089e3660046136eb565b61189d565b3480156108af57600080fd5b506108d86108be3660046136eb565b6000908152601d6020526040902080546001909101549091565b604080519283526020830191909152016104ad565b3480156108f957600080fd5b506040805180820190915260048152630342e32360e41b6020820152610580565b34801561092657600080fd5b506104a36109353660046136eb565b6118d6565b34801561094657600080fd5b506106406119dd565b34801561095b57600080fd5b506104a3600d5481565b34801561097157600080fd5b506104a3610980366004613fa3565b611a33565b34801561099157600080fd5b506108d86109a0366004613fd8565b611ab3565b3480156109b157600080fd5b506104a3600e5481565b3480156109c757600080fd5b50610640611ae8565b3480156109dc57600080fd5b506104a36109eb366004614008565b611b3e565b3480156109fc57600080fd5b506104a3610a0b36600461402a565b60156020526000908152604090205481565b348015610a2957600080fd5b50601f5461051d906001600160a01b031681565b348015610a4957600080fd5b50610580611b6f565b348015610a5e57600080fd5b506104a3601b5481565b348015610a7457600080fd5b506104a3600b5481565b348015610a8a57600080fd5b50610a9e610a993660046136eb565b611b7c565b6040516104ad9493929190614047565b348015610aba57600080fd5b50610706610ac93660046136eb565b611c39565b348015610ada57600080fd5b50610706610ae936600461402a565b60196020526000908152604090205460ff1681565b348015610b0a57600080fd5b506106b9611cdf565b348015610b1f57600080fd5b506104a3610b2e3660046136eb565b611d3f565b348015610b3f57600080fd5b506104a3610b4e3660046136eb565b6000908152601e602052604090205490565b348015610b6c57600080fd5b506104a3610b7b36600461402a565b601c6020526000908152604090205481565b348015610b9957600080fd5b5061068d610ba836600461407e565b611d4f565b348015610bb957600080fd5b50610706610bc83660046136eb565b60246020526000908152604090205460ff1681565b348015610be957600080fd5b506104a3610bf836600461402a565b6001600160a01b03166000908152601c602052604090205490565b348015610c1f57600080fd5b506106b9610c2e3660046136eb565b611e84565b348015610c3f57600080fd5b506104a3610c4e3660046136eb565b611ef6565b348015610c5f57600080fd5b506104a360035481565b348015610c7557600080fd5b50610640610c843660046136eb565b611f56565b6104a3610c9736600461410e565b611fb8565b348015610ca857600080fd5b50610cb1612020565b6040516104ad919061417f565b348015610cca57600080fd5b50610cde610cd93660046136eb565b612071565b6040516104ad9190614199565b348015610cf757600080fd5b50610640610d063660046136eb565b6121eb565b348015610d1757600080fd5b50610706610d2636600461402a565b601a6020526000908152604090205460ff1681565b348015610d4757600080fd5b506106b961224b565b348015610d5c57600080fd5b5061068d610d6b3660046136eb565b61237b565b348015610d7c57600080fd5b506104a360045481565b348015610d9257600080fd5b506104a3610da136600461402a565b60186020526000908152604090205481565b348015610dbf57600080fd5b506104a36123b4565b348015610dd457600080fd5b506106406123c6565b348015610de957600080fd5b5061068d61241c565b348015610dfe57600080fd5b506104a3600f5481565b348015610e1457600080fd5b5061051d73dc652c746a8f85e18ce632d97c6118e8a52fa73881565b348015610e3c57600080fd5b506106406124e0565b348015610e5157600080fd5b5061068d610e60366004614200565b612536565b348015610e7157600080fd5b5061068d610e8036600461402a565b612691565b348015610e9157600080fd5b506104a3610ea03660046136eb565b612716565b348015610eb157600080fd5b506104a3610ec0366004614008565b612726565b348015610ed157600080fd5b50610706610ee03660046136eb565b60126020526000908152604090205460ff1681565b348015610f0157600080fd5b5061068d610f10366004613e5f565b612742565b348015610f2157600080fd5b506104a3600c5481565b601460205260009081526040902080546001820180546001600160a01b03831693600160a01b90930460ff16929190610f6390614241565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8f90614241565b8015610fdc5780601f10610fb157610100808354040283529160200191610fdc565b820191906000526020600020905b815481529060010190602001808311610fbf57829003601f168201915b5050604080516020808201835260028801546001600160a01b03168252825160038901805460609381028301840186529482018581529899939893975090955093508492849184018282801561105b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161103d575b50505050508152602001600182015481525050905085565b6011818154811061108357600080fd5b600091825260209091200154905081565b600580546110a190614241565b80601f01602080910402602001604051908101604052809291908181526020018280546110cd90614241565b801561111a5780601f106110ef5761010080835404028352916020019161111a565b820191906000526020600020905b8154815290600101906020018083116110fd57829003601f168201915b505050505081565b611156604051806080016040528060006001600160a01b031681526020016000815260200160008152602001606081525090565b600082815260226020908152604091829020825160808101845281546001600160a01b031681526001820154928101929092526002810154928201929092526003820180549192916060840191906111ad90614241565b80601f01602080910402602001604051908101604052809291908181526020018280546111d990614241565b80156112265780601f106111fb57610100808354040283529160200191611226565b820191906000526020600020905b81548152906001019060200180831161120957829003601f168201915b5050505050815250509050919050565b6016818154811061124657600080fd5b6000918252602090912001546001600160a01b0316905081565b606060118054806020026020016040519081016040528092919081815260200182805480156112ae57602002820191906000526020600020905b81548152602001906001019080831161129a575b5050505050905090565b6040805160808101825233815242602082015290810183905260608101829052600090816112e5826115e2565b60208054600180820183557fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb909101839055600083815260228352604090819020865181546001600160a01b0319166001600160a01b039091161781559286015191830191909155840151600282015560608401519192508391600382019061136e90826142c3565b505050600085815260236020908152604080832080546001810182559084529190922001829055517f5a1a930fed43f34b3a07db782ebcac28a661c273e662bb98458cfba5a8ccd220906113c59083815260200190565b60405180910390a19150505b92915050565b6001600160a01b0383166000908152601a602052604090205460ff166114415760035460000361140657505050565b61141c83678ac7230489e80000848460006114d3565b506001600160a01b0383166000908152601a60205260409020805460ff191660011790555b505050565b6000600a546114536123b4565b61145d9190614398565b905090565b606060178054806020026020016040519081016040528092919081815260200182805480156112ae57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161149c575050505050905090565b6002818154811061108357600080fd5b6040516bffffffffffffffffffffffff19606087901b1660208201526034810185905260009081906054016040516020818303038152906040528051906020012090506000836115635761155e868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506003549150859050612891565b6115a4565b6115a4868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506004549150859050612891565b9050806115c45760405163452c2df160e11b815260040160405180910390fd5b506001979650505050505050565b6021818154811061108357600080fd5b6000816040516020016115f5919061381f565b60408051601f19818403018152919052805160209091012092915050565b600086815260126020526040812054339060ff1615611645576040516358f1119560e01b815260040160405180910390fd5b61165181878686611837565b61165d888289886128a7565b98975050505050505050565b6000816040516020016115f59190614199565b6000600e5434146116b257600e546040516380a7af9f60e01b815234600482015260248101919091526044015b60405180910390fd5b600354156116ea57336000908152601a602052604090205460ff166116ea57604051631f22097560e01b815260040160405180910390fd5b6116f6610f10836143ab565b6000611709611704846143ab565b6129ee565b90506113d1612c69565b61171e600180614398565b81565b606080600061172e6124e0565b9050600081516001600160401b0381111561174b5761174b6138ae565b60405190808252806020026020018201604052801561179057816020015b60408051808201909152600080825260208201528152602001906001900390816117695790505b50905060005b825181101561181d57601d60008483815181106117b5576117b56143b7565b60200260200101518152602001908152602001600020600001604051806040016040529081600082015481526020016001820154815250508282815181106117ff576117ff6143b7565b60200260200101819052508080611815906143cd565b915050611796565b5090939092509050565b6017818154811061124657600080fd5b6001600160a01b03841660009081526019602052604090205460ff16611897576118658484848460016114d3565b506001600160a01b038416600090815260186020908152604080832086905560199091529020805460ff191660011790555b50505050565b3373dc652c746a8f85e18ce632d97c6118e8a52fa738146118d15760405163de07280160e01b815260040160405180910390fd5b600455565b6000816000036118f957604051630ec90a1760e31b815260040160405180910390fd5b6002805460408051602080840282018101909252828152919260009291849083018282801561194757602002820191906000526020600020905b815481526020019060010190808311611933575b5050505050905060006001905060005b838110156119c35761198e838281518110611974576119746143b7565b60200260200101516000908152601e602052604090205490565b156119b1578582036119a35795945050505050565b816119ad816143cd565b9250505b806119bb816143cd565b915050611957565b50604051632cc2ab7360e11b815260040160405180910390fd5b606060218054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081548152602001906001019080831161129a575050505050905090565b600083815260126020526040812054339060ff1615611a65576040516358f1119560e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16611a9e5760405163126ec6d160e31b815260040160405180910390fd5b611aaa858286866128a7565b95945050505050565b6000828152601d602090815260408083206001600160a01b0385168452600301909152902080546001909101545b9250929050565b606060028054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081548152602001906001019080831161129a575050505050905090565b601e6020528160005260406000208181548110611b5a57600080fd5b90600052602060002001600091509150505481565b600680546110a190614241565b60226020526000908152604090208054600182015460028301546003840180546001600160a01b03909416949293919291611bb690614241565b80601f0160208091040260200160405190810160405280929190818152602001828054611be290614241565b8015611c2f5780601f10611c0457610100808354040283529160200191611c2f565b820191906000526020600020905b815481529060010190602001808311611c1257829003601f168201915b5050505050905084565b600254600090611c4b906001906143e6565b821115611c6b576040516365d6f35160e11b815260040160405180910390fd5b60005b611c79836001614398565b811015611cd6576001611cb560028381548110611c9857611c986143b7565b90600052602060002001546000908152601e602052604090205490565b1115611cc45750600192915050565b80611cce816143cd565b915050611c6e565b50600092915050565b606060168054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161149c575050505050905090565b6010818154811061108357600080fd5b805160005b81811015611e48576000838281518110611d7057611d706143b7565b60209081029190910101516007549091506001600160a01b03163314801590611db057506000818152602260205260409020546001600160a01b03163314155b15611dd157604051635450763d60e11b8152600481018290526024016116a9565b60008181526024602052604090205460ff16611e35576000818152602460205260408120805460ff191660019081179091556021805491820181559091527f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b570018190555b5080611e40816143cd565b915050611d54565b507f788a4349d25bc08585923ae212bce8bb346a623bce753eeecb85fd9ce58dcb4b82604051611e78919061389b565b60405180910390a15050565b6000818152601d60209081526040918290206002810180548451818502810185019095528085526060949293830182828015611ee957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ecb575b5050505050915050919050565b6000818152601e6020526040812054600114611f2557604051633832a15560e21b815260040160405180910390fd5b6000828152601e602052604081208054909190611f4457611f446143b7565b90600052602060002001549050919050565b600081815260236020908152604091829020805483518184028101840190945280845260609392830182828015611fac57602002820191906000526020600020905b815481526020019060010190808311611f98575b50505050509050919050565b6000600e543414611fe957600e546040516380a7af9f60e01b815234600482015260248101919091526044016116a9565b611ff43384846113d7565b612000610f10856143ab565b600061200e611704866143ab565b9050612018612c69565b949350505050565b60135460009060ff16156120345750600290565b42600854106120435750600090565b4261204c6123b4565b106120575750600390565b42612060611446565b1061206b5750600190565b50600490565b612079613600565b600082815260146020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b900460ff1615159281019290925260018101805492939192918401916120cb90614241565b80601f01602080910402602001604051908101604052809291908181526020018280546120f790614241565b80156121445780601f1061211957610100808354040283529160200191612144565b820191906000526020600020905b81548152906001019060200180831161212757829003601f168201915b5050509183525050604080516020818101835260028501546001600160a01b031682528084019190915281516003850180546060938102830184018552828501818152949095019491939092849284918401828280156121cd57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121af575b50505050508152602001600182015481525050815250509050919050565b6000818152601e6020908152604091829020805483518184028101840190945280845260609392830182828015611fac5760200282019190600052602060002090815481526020019060010190808311611f985750505050509050919050565b60606000601180548060200260200160405190810160405280929190818152602001828054801561229b57602002820191906000526020600020905b815481526020019060010190808311612287575b50505050509050600081516001600160401b038111156122bd576122bd6138ae565b6040519080825280602002602001820160405280156122e6578160200160208202803683370190505b50905060005b8251811015612374576014600084838151811061230b5761230b6143b7565b6020026020010151815260200190815260200160002060000160009054906101000a90046001600160a01b031682828151811061234a5761234a6143b7565b6001600160a01b03909216602092830291909101909101528061236c816143cd565b9150506122ec565b5092915050565b3373dc652c746a8f85e18ce632d97c6118e8a52fa738146123af5760405163de07280160e01b815260040160405180910390fd5b600355565b600060095460085461145d9190614398565b606060208054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081548152602001906001019080831161129a575050505050905090565b6007546001600160a01b0316331480159061244b57503373dc652c746a8f85e18ce632d97c6118e8a52fa73814155b15612469576040516301dbf46f60e71b815260040160405180910390fd5b6000612473612020565b9050600281600481111561248957612489614169565b036124a757604051633c30acbf60e01b815260040160405180910390fd5b6013805460ff191660011790556040517f4cd963a081760a54f571abc0f1db4dde31b4a07d8d6da3e844b8c6f47eeaaa4290600090a150565b606060108054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081548152602001906001019080831161129a575050505050905090565b6007546001600160a01b031633146125615760405163b8d4540960e01b815260040160405180910390fd5b600461256b612020565b600481111561257c5761257c614169565b0361259a576040516331da1c8b60e11b815260040160405180910390fd5b60005b8181101561263f5760008383838181106125b9576125b96143b7565b60209081029290920135600081815260129093526040909220549192505060ff1661262c576000818152601260205260408120805460ff191660019081179091556011805491820181559091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68018190555b5080612637816143cd565b91505061259d565b50600d5415801561265257506000546001145b15612661576126618282612d7e565b7f75a75cf5c561892f4cc5b26c1b8e933849b42238c96dd073d080d1ae96c514166010604051611e7891906143f9565b6007546001600160a01b031633146126bc57604051630f4cb1bd60e11b815260040160405180910390fd5b601f80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f753a2cf8d360cff631674504210913e48247f8e56b3e6d2006c2103d4095999f9101611e78565b6020818154811061108357600080fd5b60236020528160005260406000208181548110611b5a57600080fd5b80516001600160a01b0316331461278057805160405163fbbf4d7f60e01b81526001600160a01b0390911660048201523360248201526044016116a9565b60005b61278e600180614398565b8110156128675760008160018111156127a9576127a9614169565b905060008160018111156127bf576127bf614169565b036127ca5750612855565b60018160018111156127de576127de614169565b03612838576080830151515160000361280a5760405163c3b2798b60e01b815260040160405180910390fd5b826080015160200151600003612833576040516392fb9a3560e01b815260040160405180910390fd5b612853565b8060405163d2277d4960e01b81526004016116a99190614434565b505b8061285f816143cd565b915050612783565b5080604001515160000361288e5760405163e182473360e01b815260040160405180910390fd5b50565b60008261289e8584612ddb565b14949350505050565b600060016128b3612020565b60048111156128c4576128c4614169565b146128eb576128d1612020565b60405163049cab4960e51b81526004016116a9919061417f565b8160000361290c5760405163502e1c2960e01b815260040160405180910390fd5b61293e85858585601860008a6001600160a01b03166001600160a01b0316815260200190815260200160002054612e28565b601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b031916331790556040805186815260ff851660208201529081018390526001600160a01b038516907f2c9deb38f462962eadbd85a9d3a4120503ee091f1582eaaa10aa8c6797651d299060600160405180910390a25050506001600160a01b0316600090815260186020526040902054919050565b600060036129fa612020565b6004811115612a0b57612a0b614169565b14612a3257612a18612020565b604051632889531360e01b81526004016116a9919061417f565b600b543360009081526015602052604090205403612a6957600b54604051632bd6d93960e21b81526004016116a991815260200190565b600c54601154601054612a7c91906143e6565b03612aa057600c546040516302217f5360e51b81526004016116a991815260200190565b6000612aab83611669565b600081815260146020526040902054909150600160a01b900460ff1615612ae85760405163baffc42360e01b8152600481018290526024016116a9565b6010805460018181019092557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720182905560008281526014602090815260409182902086518154928801511515600160a01b026001600160a81b03199093166001600160a01b0390911617919091178155908501518592820190612b6c90826142c3565b506060820151516002820180546001600160a01b0319166001600160a01b039092169190911790556080820151805180516003840191612bb191839160200190613671565b5060209182015160019182015533600090815260159092526040822080549194509250612bdf908490614398565b9091555050601680546001810182556000919091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b031916339081179091556040805183815260208101929092527fcd423cc1203c0af96b9b3d68d73b3064a69de2d14450bb7181c5e5df2132b358910160405180910390a192915050565b600e5415612d7c5760006064600f546064612c8491906143e6565b612c8e9034614448565b612c98919061445f565b90508015612d0c57612cbe73dc652c746a8f85e18ce632d97c6118e8a52fa7388261308f565b6040805173dc652c746a8f85e18ce632d97c6118e8a52fa7388152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15b6000612d1882346143e6565b90508015612d7957600754612d36906001600160a01b03168261308f565b600754604080516001600160a01b039092168252602082018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0569101611e78565b50505b565b60005b81811015611441576000838383818110612d9d57612d9d6143b7565b602090810292909201356000818152601d909352604090922054919250612dc6905082826131a8565b50508080612dd3906143cd565b915050612d81565b600081815b8451811015612e2057612e0c82868381518110612dff57612dff6143b7565b60200260200101516132d9565b915080612e18816143cd565b915050612de0565b509392505050565b6000858152601d602090815260408083206001600160a01b0388168452601c90925290912054612e5890836143e6565b831115612e785760405163660fa07360e11b815260040160405180910390fd5b6001600160a01b0385166000908152600382016020526040812054158015612ebb57506001600160a01b0386166000908152600383016020526040902060010154155b905060ff8516612f1357815484908390600090612ed9908490614398565b90915550506001600160a01b038616600090815260038301602052604081208054869290612f08908490614398565b90915550612fa49050565b60001960ff861601612f8b57600d54600114612f4257604051639755958f60e01b815260040160405180910390fd5b83826000016001016000828254612f599190614398565b90915550506001600160a01b038616600090815260038301602052604081206001018054869290612f08908490614398565b604051638eed55d160e01b815260040160405180910390fd5b8015612fdb57600282018054600181018255600091825260209091200180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b0386166000908152601c602052604081208054869290613003908490614398565b9250508190555083601b600082825461301c9190614398565b9091555050600d5415801561303357506000546001145b15613086578154600061304686836143e6565b905080156130585761305889826131a8565b6000828152601e6020908152604082208054600181018255908352912001899055613083818361330b565b50505b50505050505050565b804710156130df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016116a9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461312c576040519150601f19603f3d011682016040523d82523d6000602084013e613131565b606091505b50509050806114415760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016116a9565b6000818152601e60209081526040808320805482518185028101850190935280835291929091908301828280156131fe57602002820191906000526020600020905b8154815260200190600101908083116131ea575b5050505050905060005b81518110156118975783828281518110613224576132246143b7565b6020026020010151036132c757816001835161324091906143e6565b81518110613250576132506143b7565b6020026020010151601e6000858152602001908152602001600020828154811061327c5761327c6143b7565b9060005260206000200181905550601e60008481526020019081526020016000208054806132ac576132ac614481565b60019003818190600052602060002001600090559055611897565b806132d1816143cd565b915050613208565b60008183106132f5576000828152602084905260409020613304565b60008381526020839052604090205b9392505050565b6002805460408051602080840282018101909252828152919260009291849083018282801561335957602002820191906000526020600020905b815481526020019060010190808311613345575b50505050509050816000036133a0575050600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace015550565b806133ac6001846143e6565b815181106133bc576133bc6143b7565b60200260200101518310156134125760015482036133da5750505050565b5050600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace015550565b611897848484846000805b8381101561348757828181518110613437576134376143b7565b6020026020010151850361344c575050611897565b82818151811061345e5761345e6143b7565b602002602001015185111561347557809150613487565b8061347f816143cd565b91505061341d565b50600080861180156134a557506000868152601e6020526040902054155b905060008180156134ce5750868484815181106134c4576134c46143b7565b6020026020010151145b6135d7576134dd6001866143e6565b83146135855760006134f0846001614398565b90505b8581101561358357846135076001836143e6565b81518110613517576135176143b7565b602002602001015160028281548110613532576135326143b7565b600091825260209091200155828015613563575087858281518110613559576135596143b7565b6020026020010151145b156135715760019150613583565b8061357b816143cd565b9150506134f3565b505b80158015613594575060015485105b156135d7576002846135a76001886143e6565b815181106135b7576135b76143b7565b602090810291909101810151825460018101845560009384529190922001555b85600284815481106135eb576135eb6143b7565b60009182526020909120015550505050505050565b6040518060a0016040528060006001600160a01b031681526020016000151581526020016060815260200161364a604051806020016040528060006001600160a01b031681525090565b815260200161366c604051806040016040528060608152602001600081525090565b905290565b8280548282559060005260206000209081019282156136c6579160200282015b828111156136c657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613691565b506136d29291506136d6565b5090565b5b808211156136d257600081556001016136d7565b6000602082840312156136fd57600080fd5b5035919050565b6000815180845260005b8181101561372a5760208185018101518683018201520161370e565b506000602082860101526020601f19601f83011685010191505092915050565b805160408084528151908401819052600091602091908201906060860190845b8181101561378f5783516001600160a01b03168352928401929184019160010161376a565b505093820151949091019390935250919050565b600060018060a01b038088168352861515602084015260a060408401526137cd60a0840187613704565b81865116606085015283810360808501526137e8818661374a565b9998505050505050505050565b6020815260006133046020830184613704565b8151815260208083015190820152604081016113d1565b6020815260018060a01b03825116602082015260208201516040820152604082015160608201526000606083015160808084015261201860a0840182613704565b600081518084526020808501945080840160005b8381101561389057815187529582019590820190600101613874565b509495945050505050565b6020815260006133046020830184613860565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156138e6576138e66138ae565b60405290565b60405160a081016001600160401b03811182821017156138e6576138e66138ae565b604051602081016001600160401b03811182821017156138e6576138e66138ae565b604051601f8201601f191681016001600160401b0381118282101715613958576139586138ae565b604052919050565b600082601f83011261397157600080fd5b81356001600160401b0381111561398a5761398a6138ae565b61399d601f8201601f1916602001613930565b8181528460208386010111156139b257600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156139e257600080fd5b8235915060208301356001600160401b038111156139ff57600080fd5b613a0b85828601613960565b9150509250929050565b6001600160a01b038116811461288e57600080fd5b60008083601f840112613a3c57600080fd5b5081356001600160401b03811115613a5357600080fd5b6020830191508360208260051b8501011115611ae157600080fd5b600080600060408486031215613a8357600080fd5b8335613a8e81613a15565b925060208401356001600160401b03811115613aa957600080fd5b613ab586828701613a2a565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015613b035783516001600160a01b031683529284019291840191600101613ade565b50909695505050505050565b80358015158114613b1f57600080fd5b919050565b600080600080600060808688031215613b3c57600080fd5b8535613b4781613a15565b94506020860135935060408601356001600160401b03811115613b6957600080fd5b613b7588828901613a2a565b9094509250613b88905060608701613b0f565b90509295509295909350565b600060208284031215613ba657600080fd5b81356001600160401b0380821115613bbd57600080fd5b9083019060808286031215613bd157600080fd5b604051608081018181108382111715613bec57613bec6138ae565b6040528235613bfa81613a15565b808252506020830135602082015260408301356040820152606083013582811115613c2457600080fd5b613c3087828601613960565b60608301525095945050505050565b803560ff81168114613b1f57600080fd5b60008060008060008060a08789031215613c6957600080fd5b86359550613c7960208801613c3f565b9450604087013593506060870135925060808701356001600160401b03811115613ca257600080fd5b613cae89828a01613a2a565b979a9699509497509295939492505050565b60006001600160401b03821115613cd957613cd96138ae565b5060051b60200190565b600060408284031215613cf557600080fd5b613cfd6138c4565b905081356001600160401b03811115613d1557600080fd5b8201601f81018413613d2657600080fd5b80356020613d3b613d3683613cc0565b613930565b82815260059290921b83018101918181019087841115613d5a57600080fd5b938201935b83851015613d81578435613d7281613a15565b82529382019390820190613d5f565b85525093840135938301939093525092915050565b600081830360a0811215613da957600080fd5b613db16138ec565b91508235613dbe81613a15565b8252613dcc60208401613b0f565b602083015260408301356001600160401b0380821115613deb57600080fd5b613df786838701613960565b60408501526020605f1984011215613e0e57600080fd5b613e1661390e565b925060608501359150613e2882613a15565b8183528260608501526080850135925080831115613e4557600080fd5b5050613e5384828501613ce3565b60808301525092915050565b600060208284031215613e7157600080fd5b81356001600160401b03811115613e8757600080fd5b61201884828501613d96565b600060a08284031215613ea557600080fd5b50919050565b600060208284031215613ebd57600080fd5b81356001600160401b03811115613ed357600080fd5b61201884828501613e93565b60006040808352613ef281840186613860565b83810360208581019190915285518083528682019282019060005b81811015613f3a57613f2a83865180518252602090810151910152565b9383019391850191600101613f0d565b509098975050505050505050565b60008060008060608587031215613f5e57600080fd5b8435613f6981613a15565b93506020850135925060408501356001600160401b03811115613f8b57600080fd5b613f9787828801613a2a565b95989497509550505050565b600080600060608486031215613fb857600080fd5b83359250613fc860208501613c3f565b9150604084013590509250925092565b60008060408385031215613feb57600080fd5b823591506020830135613ffd81613a15565b809150509250929050565b6000806040838503121561401b57600080fd5b50508035926020909101359150565b60006020828403121561403c57600080fd5b813561330481613a15565b60018060a01b03851681528360208201528260408201526080606082015260006140746080830184613704565b9695505050505050565b6000602080838503121561409157600080fd5b82356001600160401b038111156140a757600080fd5b8301601f810185136140b857600080fd5b80356140c6613d3682613cc0565b81815260059190911b820183019083810190878311156140e557600080fd5b928401925b82841015614103578335825292840192908401906140ea565b979650505050505050565b60008060006040848603121561412357600080fd5b83356001600160401b038082111561413a57600080fd5b61414687838801613e93565b9450602086013591508082111561415c57600080fd5b50613ab586828701613a2a565b634e487b7160e01b600052602160045260246000fd5b602081016005831061419357614193614169565b91905290565b60208152600060018060a01b03808451166020840152602084015115156040840152604084015160a060608501526141d460c0850182613704565b90508160608601515116608085015260808501519150601f198482030160a0850152611aaa818361374a565b6000806020838503121561421357600080fd5b82356001600160401b0381111561422957600080fd5b61423585828601613a2a565b90969095509350505050565b600181811c9082168061425557607f821691505b602082108103613ea557634e487b7160e01b600052602260045260246000fd5b601f82111561144157600081815260208120601f850160051c8101602086101561429c5750805b601f850160051c820191505b818110156142bb578281556001016142a8565b505050505050565b81516001600160401b038111156142dc576142dc6138ae565b6142f0816142ea8454614241565b84614275565b602080601f831160018114614325576000841561430d5750858301515b600019600386901b1c1916600185901b1785556142bb565b600085815260208120601f198616915b8281101561435457888601518255948401946001909101908401614335565b50858210156143725787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808201808211156113d1576113d1614382565b60006113d13683613d96565b634e487b7160e01b600052603260045260246000fd5b6000600182016143df576143df614382565b5060010190565b818103818111156113d1576113d1614382565b6020808252825482820181905260008481528281209092916040850190845b81811015613b0357835483526001938401939285019201614418565b602081016002831061419357614193614169565b80820281158282048414176113d1576113d1614382565b60008261447c57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fdfea26469706673582212204542e8389da7e513dbabe17e3685d7f8b36e8414b2c252693e060b1551b9aa3a64736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e08b5e3c1e0d86a856d5a0639742b314ac766352368a3813928cf503677d6c8786c9fbf6309c4f39ad75a4f5a46ede474c3f9c170800a77e206aee042c62e26348000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000000000195265686173682053372047756573742053656c656374696f6e000000000000000000000000000000000000000000000000000000000000000000000000000f7a636f6e7465737420636f6d7065746974696f6e7c6e6f6d696e61746520612067756573747c3c703e3c656d3e536561736f6e2037206f66205265686173682077696c6c206169722066726f6d204a616e203138202d204d61722032382c203230323420616e6420636f6e7461696e20313120657069736f6465732e3c2f656d3e3c2f703e3c703e3c2f703e3c703e3c7374726f6e673e54494d454c494e453c2f7374726f6e673e3a203c2f703e3c756c3e3c6c693e3c703e4e6f6d696e6174696f6e733a204a616e7561727920352d31302c20323032342061742039616d2050543c2f703e3c2f6c693e3c6c693e3c703e566f74696e673a204a616e756172792031302d31322c20323032342061742039616d2050543c2f703e3c2f6c693e3c2f756c3e3c703e3c2f703e3c703e3c7374726f6e673e454c49474942494c4954593c2f7374726f6e673e3a3c2f703e3c703e3c656d3e4e6f6d696e61746f72733c2f656d3e3a3c2f703e3c756c3e3c6c693e3c703e486f6c64657273206f66206174206c65617374206f6e652052656861736820706f6463617374204e46543c2f703e3c2f6c693e3c6c693e3c703e436f6c6c6563746f7273206f662072656d61737465726564202262657374206f662220636f6c6c656374696f6e206f6e20506f64733c2f703e3c2f6c693e3c2f756c3e3c703e3c656d3e566f746572733c2f656d3e3a203c2f703e3c756c3e3c6c693e3c703e5061737420677565737473206f6e205265686173683c2f703e3c2f6c693e3c6c693e3c703e506173742073706f6e736f7273206f66205265686173683c2f703e3c2f6c693e3c6c693e3c703e486f6c64657273206f6620746865206f726967696e616c20706f64636173746572204e46542066726f6d206f757220417072696c2032303232204d6972726f722063726f776466756e643c2f703e3c2f6c693e3c6c693e3c703e436f6c6c6563746f7273206f662072656d61737465726564202262657374206f662220636f6c6c656374696f6e206f6e20506f6473202831303020657874726120766f7465732070657220636f6c6c656374293c2f703e3c2f6c693e3c6c693e3c703e31303020657874726120766f74657320746f206e6f6d696e61746f7273206f66205336206775657374733c2f703e3c2f6c693e3c2f756c3e3c703e3c2f703e3c703e3c7374726f6e673e484f5720544f204e4f4d494e41544520412047554553543c2f7374726f6e673e3a3c2f703e3c756c3e3c6c693e3c703e4e6f6d696e617465206120677565737420647572696e6720746865206e6f6d696e6174696f6e20706572696f6420284a616e203520402039616d205054202d204a616e203130204020383a3539616d205054293c2f703e3c2f6c693e3c6c693e3c703e4f6e65206775657374206e6f6d696e6174696f6e207065722070726f706f73616c3c2f703e3c2f6c693e3c6c693e3c703e496e20796f75722070726f706f73616c2c20706c6561736520696e636c75646520746865206775657374206e616d652c206775657374277320616666696c696174696f6e2028636f6d70616e79206f722070726f6a656374206e616d65292c2072656c6576616e74206c696e6b7320746f2074686569722077656273697465206f7220736f6369616c732c20746f7069637320796f752764206c696b6520746f2068656172207468656d2074616c6b2061626f75742c20616e642077687920526568617368206c697374656e65727320776f756c6420656e6a6f792068656172696e672066726f6d20746869732067756573743c2f703e3c2f6c693e3c6c693e3c703e596f75206d6179206e6f6d696e61746520616e796f6e6520796f75206c696b652c20696e636c7564696e6720796f757273656c662c2070617374206775657374732c206775657374732077686f2068617665206e65766572206170706561726564206f6e206120706f6463617374206265666f72652c206574632e3c2f703e3c2f6c693e3c6c693e3c703e506c65617365206b65657020696e206d696e64205265686173682773203320636f72652076616c756573207768656e206e6f6d696e6174696e6720612067756573743a3c2f703e3c756c3e3c6c693e3c703e2831292057652077616e7420746f206d616b65206120636f6e7363696f7573206566666f727420746f20726570726573656e74206173206d616e7920646976657273652070657273706563746976657320617320706f737369626c652e3c2f703e3c2f6c693e3c6c693e3c703e2832292057652062656c696576652074686520776f726c642028696e636c7564696e672074686520776f726c64206f66207765623329206f70657261746573206f6e206120677265797363616c652c206e6f7420696e20626c61636b20616e642077686974652e3c2f703e3c2f6c693e3c6c693e3c703e2833292057652062656c696576652077656233206973207468652066757475726520616e64207468617420696e207468657365206561726c79207374616765732c20776520616c6c20706c617920616e20696e74656772616c20726f6c6520696e2068656c70696e6720736861706520746865206675747572652e3c2f703e3c2f6c693e3c6c693e3c703e596f752063616e2072656164206d6f72652061626f7574206f757220636f72652076616c75657320696e203c61207461726765743d225f626c616e6b222072656c3d226e6f6f70656e6572206e6f7265666572726572206e6f666f6c6c6f772220687265663d2268747470733a2f2f782e636f6d2f726568617368776562332f7374617475732f313531363039313837393237313436303836383f733d343626616d703b743d736c4c3059465773704f6b53364c5779735f4f766a67223e3c7374726f6e673e746869732054776974746572207468726561643c2f7374726f6e673e3c2f613e2e3c2f703e3c2f6c693e3c2f756c3e3c2f6c693e3c6c693e3c703e596f75206d6179206e6f6d696e617465206173206d616e792067756573747320617320796f752764206c696b653c2f703e3c2f6c693e3c6c693e3c703e596f75206d61792063616d706169676e2076696120616e79206d6574686f6420666f7220796f7572206e6f6d696e6565733c2f703e3c2f6c693e3c6c693e3c703e496620796f7572206e6f6d696e656520656e647320757020617070656172696e67206f6e20536561736f6e2037206f662074686520706f64636173742c20796f752077696c6c20726563656976652032206164646974696f6e616c20766f74657320706572206e6f6d696e656520666f722074686520666f6c6c6f77696e6720736561736f6e3c2f703e3c2f6c693e3c2f756c3e3c703e3c2f703e3c703e3c7374726f6e673e484f5720544f20564f544520464f5220412047554553543c2f7374726f6e673e3a3c2f703e3c756c3e3c6c693e3c703e566f746520666f722067756573747320647572696e672074686520766f74696e6720706572696f6420284a616e20313020402039616d205054202d204a616e20313220402039616d205054293c2f703e3c2f6c693e3c6c693e3c703e4561636820656c696769626c6520766f74657220686173207265636569766564203131303020766f7465732028706c757320657874726120766f74657320666f7220736f6d65202d207365652061626f7665293c2f703e3c2f6c693e3c6c693e3c703e596f75206d6179206361737420796f757220766f74657320696e20616e792077617920796f752764206c696b652028692e652e206361737420616c6c20766f74657320666f72206f6e652067756573742c206f722073706c697420757020796f757220766f74657320696e20616e792077617920796f75206c696b65293c2f703e3c2f6c693e3c6c693e3c703e596f75206d61792063616d706169676e20666f7220706172746963756c6172206775657374732c2073747261746567697a652077697468206f746865722052656861736820766f746572732c206f72206576656e207375626d69742062726962657320746f2052656861736820766f74657273202d206e6f7468696e67206973206f6666206c696d6974733c2f703e3c2f6c693e3c6c693e3c703e54686520746f70203131206775657374732061742074686520656e64206f662074686520766f74696e6720706572696f642077696c6c20626520696e7669746564206f6e746f20536561736f6e2037206f662074686520706f64636173743c2f703e3c2f6c693e3c2f756c3e7c3c703e566f746572732073686f756c6420766f746520666f72206e6f6d696e6565732077686f3a3c2f703e3c756c3e3c6c693e3c703e416c69676e2077697468205265686173682773203320636f72652076616c7565733a3c2f703e3c756c3e3c6c693e3c703e2831292057652077616e7420746f206d616b65206120636f6e7363696f7573206566666f727420746f20726570726573656e74206173206d616e7920646976657273652070657273706563746976657320617320706f737369626c652e3c2f703e3c2f6c693e3c6c693e3c703e2832292057652062656c696576652074686520776f726c642028696e636c7564696e672074686520776f726c64206f66207765623329206f70657261746573206f6e206120677265797363616c652c206e6f7420696e20626c61636b20616e642077686974652e3c2f703e3c2f6c693e3c6c693e3c703e2833292057652062656c696576652077656233206973207468652066757475726520616e64207468617420696e207468657365206561726c79207374616765732c20776520616c6c20706c617920616e20696e74656772616c20726f6c6520696e2068656c70696e6720736861706520746865206675747572652e3c2f703e3c2f6c693e3c6c693e3c703e596f752063616e2072656164206d6f72652061626f7574206f757220636f72652076616c75657320696e203c61207461726765743d225f626c616e6b222072656c3d226e6f6f70656e6572206e6f7265666572726572206e6f666f6c6c6f772220687265663d2268747470733a2f2f782e636f6d2f726568617368776562332f7374617475732f313531363039313837393237313436303836383f733d343626616d703b743d736c4c3059465773704f6b53364c5779735f4f766a67223e3c7374726f6e673e746869732054776974746572207468726561643c2f7374726f6e673e3c2f613e2e3c2f703e3c2f6c693e3c2f756c3e3c2f6c693e3c6c693e3c703e4172652065787065727473206f6e2061206365727461696e20746f706963206f722061726520776f726b696e67206f6e20696e6e6f7661746976652070726f6a65637473207468617420526568617368206c697374656e65727320776f756c642066696e6420696e746572657374696e673c2f703e3c2f6c693e3c2f756c3e000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000659835900000000000000000000000000000000000000000000000000000000000069744000000000000000000000000000000000000000000000000000000000002a33c000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000002738d24e520000000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa
Deployed Bytecode
0x6080604052600436106104885760003560e01c806375e509c511610255578063c19d93fb11610144578063ea8a1af0116100c1578063f4f3d7ec11610085578063f4f3d7ec14610e65578063f5c3641114610e85578063f61736f414610ea5578063f79c017214610ec5578063fb8ddab414610ef5578063fb9bf8d414610f1557600080fd5b8063ea8a1af014610ddd578063edcd1be414610df2578063eef18e1714610e08578063efa90d3614610e30578063f0a7db0a14610e4557600080fd5b8063daf762db11610108578063daf762db14610d50578063dd96a19d14610d70578063dea5f6a614610d86578063e031535b14610db3578063e11db9d814610dc857600080fd5b8063c19d93fb14610c9c578063c7f758a814610cbe578063c9a1b6b214610ceb578063cb85395014610d0b578063cbdc27cb14610d3b57600080fd5b80639ba197af116101d2578063b323580d11610196578063b323580d14610c13578063b66d1da314610c33578063bddc164114610c53578063c05f410414610c69578063c0ffaa7814610c8957600080fd5b80639ba197af14610b33578063a1ac6cb214610b60578063ac67f80114610b8d578063ae66b8ad14610bad578063aec116b614610bdd57600080fd5b80638ebb4c15116102195780638ebb4c1514610a7e5780639174778c14610aae578063930de97914610ace578063946369b514610afe5780639b644a2314610b1357600080fd5b806375e509c5146109f0578063785ddfe514610a1d5780637c65d71114610a3d5780637de418d514610a52578063832009af14610a6857600080fd5b80633f9942ff1161037c578063544c7bb4116102f957806360506ff6116102bd57806360506ff61461094f57806365f16263146109655780636e4eb810146109855780636ed815ad146109a55780636fd3636b146109bb578063711effc8146109d057600080fd5b8063544c7bb414610883578063544ffc9c146108a357806354fd4d50146108ed5780635c7107d81461091a5780635cb718a11461093a57600080fd5b8063476f4d8a11610340578063476f4d8a146107f85780634d24a67f1461080b57806350a5e5241461082057806350c4b61614610843578063531bd8121461086357600080fd5b80633f9942ff1461075e5780633fb57c9214610778578063409fd03014610798578063419c533c146107b8578063458da87d146107d857600080fd5b80631242b7371161040a578063325cc6d9116103ce578063325cc6d9146106c657806332763c22146106e6578063347cf66514610716578063366ecf5b146107325780633932abb11461074857600080fd5b80631242b7371461062b5780631805c5231461064d57806320b3e8451461066d578063262e59e91461068f5780632c39805f146106a457600080fd5b806305846cae1161045157806305846cae1461054b57806306fdde031461056b578063070dc5d91461058d5780630800e300146105de5780630aa25e441461060b57600080fd5b80624114a81461048d578063013cf08b146104b657806302a251a3146104e757806302d05d3f146104fd5780630414126a14610535575b600080fd5b34801561049957600080fd5b506104a360085481565b6040519081526020015b60405180910390f35b3480156104c257600080fd5b506104d66104d13660046136eb565b610f2b565b6040516104ad9594939291906137a3565b3480156104f357600080fd5b506104a3600a5481565b34801561050957600080fd5b5060075461051d906001600160a01b031681565b6040516001600160a01b0390911681526020016104ad565b34801561054157600080fd5b506104a360015481565b34801561055757600080fd5b506104a36105663660046136eb565b611073565b34801561057757600080fd5b50610580611094565b6040516104ad91906137f5565b34801561059957600080fd5b506105d16105a83660046136eb565b601d60209081526000918252604091829020825180840190935280548352600101549082015281565b6040516104ad9190613808565b3480156105ea57600080fd5b506105fe6105f93660046136eb565b611122565b6040516104ad919061381f565b34801561061757600080fd5b5061051d6106263660046136eb565b611236565b34801561063757600080fd5b50610640611260565b6040516104ad919061389b565b34801561065957600080fd5b506104a36106683660046139cf565b6112b8565b34801561067957600080fd5b5061068d610688366004613a6e565b6113d7565b005b34801561069b57600080fd5b506104a3611446565b3480156106b057600080fd5b506106b9611462565b6040516104ad9190613ac2565b3480156106d257600080fd5b506104a36106e13660046136eb565b6114c3565b3480156106f257600080fd5b50610706610701366004613b24565b6114d3565b60405190151581526020016104ad565b34801561072257600080fd5b506104a3678ac7230489e8000081565b34801561073e57600080fd5b506104a360005481565b34801561075457600080fd5b506104a360095481565b34801561076a57600080fd5b506013546107069060ff1681565b34801561078457600080fd5b506104a36107933660046136eb565b6115d2565b3480156107a457600080fd5b506104a36107b3366004613b94565b6115e2565b3480156107c457600080fd5b506104a36107d3366004613c50565b611613565b3480156107e457600080fd5b506104a36107f3366004613e5f565b611669565b6104a3610806366004613eab565b61167c565b34801561081757600080fd5b506104a3611713565b34801561082c57600080fd5b50610835611721565b6040516104ad929190613edf565b34801561084f57600080fd5b5061051d61085e3660046136eb565b611827565b34801561086f57600080fd5b5061068d61087e366004613f48565b611837565b34801561088f57600080fd5b5061068d61089e3660046136eb565b61189d565b3480156108af57600080fd5b506108d86108be3660046136eb565b6000908152601d6020526040902080546001909101549091565b604080519283526020830191909152016104ad565b3480156108f957600080fd5b506040805180820190915260048152630342e32360e41b6020820152610580565b34801561092657600080fd5b506104a36109353660046136eb565b6118d6565b34801561094657600080fd5b506106406119dd565b34801561095b57600080fd5b506104a3600d5481565b34801561097157600080fd5b506104a3610980366004613fa3565b611a33565b34801561099157600080fd5b506108d86109a0366004613fd8565b611ab3565b3480156109b157600080fd5b506104a3600e5481565b3480156109c757600080fd5b50610640611ae8565b3480156109dc57600080fd5b506104a36109eb366004614008565b611b3e565b3480156109fc57600080fd5b506104a3610a0b36600461402a565b60156020526000908152604090205481565b348015610a2957600080fd5b50601f5461051d906001600160a01b031681565b348015610a4957600080fd5b50610580611b6f565b348015610a5e57600080fd5b506104a3601b5481565b348015610a7457600080fd5b506104a3600b5481565b348015610a8a57600080fd5b50610a9e610a993660046136eb565b611b7c565b6040516104ad9493929190614047565b348015610aba57600080fd5b50610706610ac93660046136eb565b611c39565b348015610ada57600080fd5b50610706610ae936600461402a565b60196020526000908152604090205460ff1681565b348015610b0a57600080fd5b506106b9611cdf565b348015610b1f57600080fd5b506104a3610b2e3660046136eb565b611d3f565b348015610b3f57600080fd5b506104a3610b4e3660046136eb565b6000908152601e602052604090205490565b348015610b6c57600080fd5b506104a3610b7b36600461402a565b601c6020526000908152604090205481565b348015610b9957600080fd5b5061068d610ba836600461407e565b611d4f565b348015610bb957600080fd5b50610706610bc83660046136eb565b60246020526000908152604090205460ff1681565b348015610be957600080fd5b506104a3610bf836600461402a565b6001600160a01b03166000908152601c602052604090205490565b348015610c1f57600080fd5b506106b9610c2e3660046136eb565b611e84565b348015610c3f57600080fd5b506104a3610c4e3660046136eb565b611ef6565b348015610c5f57600080fd5b506104a360035481565b348015610c7557600080fd5b50610640610c843660046136eb565b611f56565b6104a3610c9736600461410e565b611fb8565b348015610ca857600080fd5b50610cb1612020565b6040516104ad919061417f565b348015610cca57600080fd5b50610cde610cd93660046136eb565b612071565b6040516104ad9190614199565b348015610cf757600080fd5b50610640610d063660046136eb565b6121eb565b348015610d1757600080fd5b50610706610d2636600461402a565b601a6020526000908152604090205460ff1681565b348015610d4757600080fd5b506106b961224b565b348015610d5c57600080fd5b5061068d610d6b3660046136eb565b61237b565b348015610d7c57600080fd5b506104a360045481565b348015610d9257600080fd5b506104a3610da136600461402a565b60186020526000908152604090205481565b348015610dbf57600080fd5b506104a36123b4565b348015610dd457600080fd5b506106406123c6565b348015610de957600080fd5b5061068d61241c565b348015610dfe57600080fd5b506104a3600f5481565b348015610e1457600080fd5b5061051d73dc652c746a8f85e18ce632d97c6118e8a52fa73881565b348015610e3c57600080fd5b506106406124e0565b348015610e5157600080fd5b5061068d610e60366004614200565b612536565b348015610e7157600080fd5b5061068d610e8036600461402a565b612691565b348015610e9157600080fd5b506104a3610ea03660046136eb565b612716565b348015610eb157600080fd5b506104a3610ec0366004614008565b612726565b348015610ed157600080fd5b50610706610ee03660046136eb565b60126020526000908152604090205460ff1681565b348015610f0157600080fd5b5061068d610f10366004613e5f565b612742565b348015610f2157600080fd5b506104a3600c5481565b601460205260009081526040902080546001820180546001600160a01b03831693600160a01b90930460ff16929190610f6390614241565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8f90614241565b8015610fdc5780601f10610fb157610100808354040283529160200191610fdc565b820191906000526020600020905b815481529060010190602001808311610fbf57829003601f168201915b5050604080516020808201835260028801546001600160a01b03168252825160038901805460609381028301840186529482018581529899939893975090955093508492849184018282801561105b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161103d575b50505050508152602001600182015481525050905085565b6011818154811061108357600080fd5b600091825260209091200154905081565b600580546110a190614241565b80601f01602080910402602001604051908101604052809291908181526020018280546110cd90614241565b801561111a5780601f106110ef5761010080835404028352916020019161111a565b820191906000526020600020905b8154815290600101906020018083116110fd57829003601f168201915b505050505081565b611156604051806080016040528060006001600160a01b031681526020016000815260200160008152602001606081525090565b600082815260226020908152604091829020825160808101845281546001600160a01b031681526001820154928101929092526002810154928201929092526003820180549192916060840191906111ad90614241565b80601f01602080910402602001604051908101604052809291908181526020018280546111d990614241565b80156112265780601f106111fb57610100808354040283529160200191611226565b820191906000526020600020905b81548152906001019060200180831161120957829003601f168201915b5050505050815250509050919050565b6016818154811061124657600080fd5b6000918252602090912001546001600160a01b0316905081565b606060118054806020026020016040519081016040528092919081815260200182805480156112ae57602002820191906000526020600020905b81548152602001906001019080831161129a575b5050505050905090565b6040805160808101825233815242602082015290810183905260608101829052600090816112e5826115e2565b60208054600180820183557fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb909101839055600083815260228352604090819020865181546001600160a01b0319166001600160a01b039091161781559286015191830191909155840151600282015560608401519192508391600382019061136e90826142c3565b505050600085815260236020908152604080832080546001810182559084529190922001829055517f5a1a930fed43f34b3a07db782ebcac28a661c273e662bb98458cfba5a8ccd220906113c59083815260200190565b60405180910390a19150505b92915050565b6001600160a01b0383166000908152601a602052604090205460ff166114415760035460000361140657505050565b61141c83678ac7230489e80000848460006114d3565b506001600160a01b0383166000908152601a60205260409020805460ff191660011790555b505050565b6000600a546114536123b4565b61145d9190614398565b905090565b606060178054806020026020016040519081016040528092919081815260200182805480156112ae57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161149c575050505050905090565b6002818154811061108357600080fd5b6040516bffffffffffffffffffffffff19606087901b1660208201526034810185905260009081906054016040516020818303038152906040528051906020012090506000836115635761155e868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506003549150859050612891565b6115a4565b6115a4868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506004549150859050612891565b9050806115c45760405163452c2df160e11b815260040160405180910390fd5b506001979650505050505050565b6021818154811061108357600080fd5b6000816040516020016115f5919061381f565b60408051601f19818403018152919052805160209091012092915050565b600086815260126020526040812054339060ff1615611645576040516358f1119560e01b815260040160405180910390fd5b61165181878686611837565b61165d888289886128a7565b98975050505050505050565b6000816040516020016115f59190614199565b6000600e5434146116b257600e546040516380a7af9f60e01b815234600482015260248101919091526044015b60405180910390fd5b600354156116ea57336000908152601a602052604090205460ff166116ea57604051631f22097560e01b815260040160405180910390fd5b6116f6610f10836143ab565b6000611709611704846143ab565b6129ee565b90506113d1612c69565b61171e600180614398565b81565b606080600061172e6124e0565b9050600081516001600160401b0381111561174b5761174b6138ae565b60405190808252806020026020018201604052801561179057816020015b60408051808201909152600080825260208201528152602001906001900390816117695790505b50905060005b825181101561181d57601d60008483815181106117b5576117b56143b7565b60200260200101518152602001908152602001600020600001604051806040016040529081600082015481526020016001820154815250508282815181106117ff576117ff6143b7565b60200260200101819052508080611815906143cd565b915050611796565b5090939092509050565b6017818154811061124657600080fd5b6001600160a01b03841660009081526019602052604090205460ff16611897576118658484848460016114d3565b506001600160a01b038416600090815260186020908152604080832086905560199091529020805460ff191660011790555b50505050565b3373dc652c746a8f85e18ce632d97c6118e8a52fa738146118d15760405163de07280160e01b815260040160405180910390fd5b600455565b6000816000036118f957604051630ec90a1760e31b815260040160405180910390fd5b6002805460408051602080840282018101909252828152919260009291849083018282801561194757602002820191906000526020600020905b815481526020019060010190808311611933575b5050505050905060006001905060005b838110156119c35761198e838281518110611974576119746143b7565b60200260200101516000908152601e602052604090205490565b156119b1578582036119a35795945050505050565b816119ad816143cd565b9250505b806119bb816143cd565b915050611957565b50604051632cc2ab7360e11b815260040160405180910390fd5b606060218054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081548152602001906001019080831161129a575050505050905090565b600083815260126020526040812054339060ff1615611a65576040516358f1119560e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16611a9e5760405163126ec6d160e31b815260040160405180910390fd5b611aaa858286866128a7565b95945050505050565b6000828152601d602090815260408083206001600160a01b0385168452600301909152902080546001909101545b9250929050565b606060028054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081548152602001906001019080831161129a575050505050905090565b601e6020528160005260406000208181548110611b5a57600080fd5b90600052602060002001600091509150505481565b600680546110a190614241565b60226020526000908152604090208054600182015460028301546003840180546001600160a01b03909416949293919291611bb690614241565b80601f0160208091040260200160405190810160405280929190818152602001828054611be290614241565b8015611c2f5780601f10611c0457610100808354040283529160200191611c2f565b820191906000526020600020905b815481529060010190602001808311611c1257829003601f168201915b5050505050905084565b600254600090611c4b906001906143e6565b821115611c6b576040516365d6f35160e11b815260040160405180910390fd5b60005b611c79836001614398565b811015611cd6576001611cb560028381548110611c9857611c986143b7565b90600052602060002001546000908152601e602052604090205490565b1115611cc45750600192915050565b80611cce816143cd565b915050611c6e565b50600092915050565b606060168054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161149c575050505050905090565b6010818154811061108357600080fd5b805160005b81811015611e48576000838281518110611d7057611d706143b7565b60209081029190910101516007549091506001600160a01b03163314801590611db057506000818152602260205260409020546001600160a01b03163314155b15611dd157604051635450763d60e11b8152600481018290526024016116a9565b60008181526024602052604090205460ff16611e35576000818152602460205260408120805460ff191660019081179091556021805491820181559091527f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b570018190555b5080611e40816143cd565b915050611d54565b507f788a4349d25bc08585923ae212bce8bb346a623bce753eeecb85fd9ce58dcb4b82604051611e78919061389b565b60405180910390a15050565b6000818152601d60209081526040918290206002810180548451818502810185019095528085526060949293830182828015611ee957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ecb575b5050505050915050919050565b6000818152601e6020526040812054600114611f2557604051633832a15560e21b815260040160405180910390fd5b6000828152601e602052604081208054909190611f4457611f446143b7565b90600052602060002001549050919050565b600081815260236020908152604091829020805483518184028101840190945280845260609392830182828015611fac57602002820191906000526020600020905b815481526020019060010190808311611f98575b50505050509050919050565b6000600e543414611fe957600e546040516380a7af9f60e01b815234600482015260248101919091526044016116a9565b611ff43384846113d7565b612000610f10856143ab565b600061200e611704866143ab565b9050612018612c69565b949350505050565b60135460009060ff16156120345750600290565b42600854106120435750600090565b4261204c6123b4565b106120575750600390565b42612060611446565b1061206b5750600190565b50600490565b612079613600565b600082815260146020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b900460ff1615159281019290925260018101805492939192918401916120cb90614241565b80601f01602080910402602001604051908101604052809291908181526020018280546120f790614241565b80156121445780601f1061211957610100808354040283529160200191612144565b820191906000526020600020905b81548152906001019060200180831161212757829003601f168201915b5050509183525050604080516020818101835260028501546001600160a01b031682528084019190915281516003850180546060938102830184018552828501818152949095019491939092849284918401828280156121cd57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121af575b50505050508152602001600182015481525050815250509050919050565b6000818152601e6020908152604091829020805483518184028101840190945280845260609392830182828015611fac5760200282019190600052602060002090815481526020019060010190808311611f985750505050509050919050565b60606000601180548060200260200160405190810160405280929190818152602001828054801561229b57602002820191906000526020600020905b815481526020019060010190808311612287575b50505050509050600081516001600160401b038111156122bd576122bd6138ae565b6040519080825280602002602001820160405280156122e6578160200160208202803683370190505b50905060005b8251811015612374576014600084838151811061230b5761230b6143b7565b6020026020010151815260200190815260200160002060000160009054906101000a90046001600160a01b031682828151811061234a5761234a6143b7565b6001600160a01b03909216602092830291909101909101528061236c816143cd565b9150506122ec565b5092915050565b3373dc652c746a8f85e18ce632d97c6118e8a52fa738146123af5760405163de07280160e01b815260040160405180910390fd5b600355565b600060095460085461145d9190614398565b606060208054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081548152602001906001019080831161129a575050505050905090565b6007546001600160a01b0316331480159061244b57503373dc652c746a8f85e18ce632d97c6118e8a52fa73814155b15612469576040516301dbf46f60e71b815260040160405180910390fd5b6000612473612020565b9050600281600481111561248957612489614169565b036124a757604051633c30acbf60e01b815260040160405180910390fd5b6013805460ff191660011790556040517f4cd963a081760a54f571abc0f1db4dde31b4a07d8d6da3e844b8c6f47eeaaa4290600090a150565b606060108054806020026020016040519081016040528092919081815260200182805480156112ae576020028201919060005260206000209081548152602001906001019080831161129a575050505050905090565b6007546001600160a01b031633146125615760405163b8d4540960e01b815260040160405180910390fd5b600461256b612020565b600481111561257c5761257c614169565b0361259a576040516331da1c8b60e11b815260040160405180910390fd5b60005b8181101561263f5760008383838181106125b9576125b96143b7565b60209081029290920135600081815260129093526040909220549192505060ff1661262c576000818152601260205260408120805460ff191660019081179091556011805491820181559091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68018190555b5080612637816143cd565b91505061259d565b50600d5415801561265257506000546001145b15612661576126618282612d7e565b7f75a75cf5c561892f4cc5b26c1b8e933849b42238c96dd073d080d1ae96c514166010604051611e7891906143f9565b6007546001600160a01b031633146126bc57604051630f4cb1bd60e11b815260040160405180910390fd5b601f80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f753a2cf8d360cff631674504210913e48247f8e56b3e6d2006c2103d4095999f9101611e78565b6020818154811061108357600080fd5b60236020528160005260406000208181548110611b5a57600080fd5b80516001600160a01b0316331461278057805160405163fbbf4d7f60e01b81526001600160a01b0390911660048201523360248201526044016116a9565b60005b61278e600180614398565b8110156128675760008160018111156127a9576127a9614169565b905060008160018111156127bf576127bf614169565b036127ca5750612855565b60018160018111156127de576127de614169565b03612838576080830151515160000361280a5760405163c3b2798b60e01b815260040160405180910390fd5b826080015160200151600003612833576040516392fb9a3560e01b815260040160405180910390fd5b612853565b8060405163d2277d4960e01b81526004016116a99190614434565b505b8061285f816143cd565b915050612783565b5080604001515160000361288e5760405163e182473360e01b815260040160405180910390fd5b50565b60008261289e8584612ddb565b14949350505050565b600060016128b3612020565b60048111156128c4576128c4614169565b146128eb576128d1612020565b60405163049cab4960e51b81526004016116a9919061417f565b8160000361290c5760405163502e1c2960e01b815260040160405180910390fd5b61293e85858585601860008a6001600160a01b03166001600160a01b0316815260200190815260200160002054612e28565b601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b031916331790556040805186815260ff851660208201529081018390526001600160a01b038516907f2c9deb38f462962eadbd85a9d3a4120503ee091f1582eaaa10aa8c6797651d299060600160405180910390a25050506001600160a01b0316600090815260186020526040902054919050565b600060036129fa612020565b6004811115612a0b57612a0b614169565b14612a3257612a18612020565b604051632889531360e01b81526004016116a9919061417f565b600b543360009081526015602052604090205403612a6957600b54604051632bd6d93960e21b81526004016116a991815260200190565b600c54601154601054612a7c91906143e6565b03612aa057600c546040516302217f5360e51b81526004016116a991815260200190565b6000612aab83611669565b600081815260146020526040902054909150600160a01b900460ff1615612ae85760405163baffc42360e01b8152600481018290526024016116a9565b6010805460018181019092557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720182905560008281526014602090815260409182902086518154928801511515600160a01b026001600160a81b03199093166001600160a01b0390911617919091178155908501518592820190612b6c90826142c3565b506060820151516002820180546001600160a01b0319166001600160a01b039092169190911790556080820151805180516003840191612bb191839160200190613671565b5060209182015160019182015533600090815260159092526040822080549194509250612bdf908490614398565b9091555050601680546001810182556000919091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b031916339081179091556040805183815260208101929092527fcd423cc1203c0af96b9b3d68d73b3064a69de2d14450bb7181c5e5df2132b358910160405180910390a192915050565b600e5415612d7c5760006064600f546064612c8491906143e6565b612c8e9034614448565b612c98919061445f565b90508015612d0c57612cbe73dc652c746a8f85e18ce632d97c6118e8a52fa7388261308f565b6040805173dc652c746a8f85e18ce632d97c6118e8a52fa7388152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15b6000612d1882346143e6565b90508015612d7957600754612d36906001600160a01b03168261308f565b600754604080516001600160a01b039092168252602082018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0569101611e78565b50505b565b60005b81811015611441576000838383818110612d9d57612d9d6143b7565b602090810292909201356000818152601d909352604090922054919250612dc6905082826131a8565b50508080612dd3906143cd565b915050612d81565b600081815b8451811015612e2057612e0c82868381518110612dff57612dff6143b7565b60200260200101516132d9565b915080612e18816143cd565b915050612de0565b509392505050565b6000858152601d602090815260408083206001600160a01b0388168452601c90925290912054612e5890836143e6565b831115612e785760405163660fa07360e11b815260040160405180910390fd5b6001600160a01b0385166000908152600382016020526040812054158015612ebb57506001600160a01b0386166000908152600383016020526040902060010154155b905060ff8516612f1357815484908390600090612ed9908490614398565b90915550506001600160a01b038616600090815260038301602052604081208054869290612f08908490614398565b90915550612fa49050565b60001960ff861601612f8b57600d54600114612f4257604051639755958f60e01b815260040160405180910390fd5b83826000016001016000828254612f599190614398565b90915550506001600160a01b038616600090815260038301602052604081206001018054869290612f08908490614398565b604051638eed55d160e01b815260040160405180910390fd5b8015612fdb57600282018054600181018255600091825260209091200180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b0386166000908152601c602052604081208054869290613003908490614398565b9250508190555083601b600082825461301c9190614398565b9091555050600d5415801561303357506000546001145b15613086578154600061304686836143e6565b905080156130585761305889826131a8565b6000828152601e6020908152604082208054600181018255908352912001899055613083818361330b565b50505b50505050505050565b804710156130df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016116a9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461312c576040519150601f19603f3d011682016040523d82523d6000602084013e613131565b606091505b50509050806114415760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016116a9565b6000818152601e60209081526040808320805482518185028101850190935280835291929091908301828280156131fe57602002820191906000526020600020905b8154815260200190600101908083116131ea575b5050505050905060005b81518110156118975783828281518110613224576132246143b7565b6020026020010151036132c757816001835161324091906143e6565b81518110613250576132506143b7565b6020026020010151601e6000858152602001908152602001600020828154811061327c5761327c6143b7565b9060005260206000200181905550601e60008481526020019081526020016000208054806132ac576132ac614481565b60019003818190600052602060002001600090559055611897565b806132d1816143cd565b915050613208565b60008183106132f5576000828152602084905260409020613304565b60008381526020839052604090205b9392505050565b6002805460408051602080840282018101909252828152919260009291849083018282801561335957602002820191906000526020600020905b815481526020019060010190808311613345575b50505050509050816000036133a0575050600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace015550565b806133ac6001846143e6565b815181106133bc576133bc6143b7565b60200260200101518310156134125760015482036133da5750505050565b5050600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace015550565b611897848484846000805b8381101561348757828181518110613437576134376143b7565b6020026020010151850361344c575050611897565b82818151811061345e5761345e6143b7565b602002602001015185111561347557809150613487565b8061347f816143cd565b91505061341d565b50600080861180156134a557506000868152601e6020526040902054155b905060008180156134ce5750868484815181106134c4576134c46143b7565b6020026020010151145b6135d7576134dd6001866143e6565b83146135855760006134f0846001614398565b90505b8581101561358357846135076001836143e6565b81518110613517576135176143b7565b602002602001015160028281548110613532576135326143b7565b600091825260209091200155828015613563575087858281518110613559576135596143b7565b6020026020010151145b156135715760019150613583565b8061357b816143cd565b9150506134f3565b505b80158015613594575060015485105b156135d7576002846135a76001886143e6565b815181106135b7576135b76143b7565b602090810291909101810151825460018101845560009384529190922001555b85600284815481106135eb576135eb6143b7565b60009182526020909120015550505050505050565b6040518060a0016040528060006001600160a01b031681526020016000151581526020016060815260200161364a604051806020016040528060006001600160a01b031681525090565b815260200161366c604051806040016040528060608152602001600081525090565b905290565b8280548282559060005260206000209081019282156136c6579160200282015b828111156136c657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613691565b506136d29291506136d6565b5090565b5b808211156136d257600081556001016136d7565b6000602082840312156136fd57600080fd5b5035919050565b6000815180845260005b8181101561372a5760208185018101518683018201520161370e565b506000602082860101526020601f19601f83011685010191505092915050565b805160408084528151908401819052600091602091908201906060860190845b8181101561378f5783516001600160a01b03168352928401929184019160010161376a565b505093820151949091019390935250919050565b600060018060a01b038088168352861515602084015260a060408401526137cd60a0840187613704565b81865116606085015283810360808501526137e8818661374a565b9998505050505050505050565b6020815260006133046020830184613704565b8151815260208083015190820152604081016113d1565b6020815260018060a01b03825116602082015260208201516040820152604082015160608201526000606083015160808084015261201860a0840182613704565b600081518084526020808501945080840160005b8381101561389057815187529582019590820190600101613874565b509495945050505050565b6020815260006133046020830184613860565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156138e6576138e66138ae565b60405290565b60405160a081016001600160401b03811182821017156138e6576138e66138ae565b604051602081016001600160401b03811182821017156138e6576138e66138ae565b604051601f8201601f191681016001600160401b0381118282101715613958576139586138ae565b604052919050565b600082601f83011261397157600080fd5b81356001600160401b0381111561398a5761398a6138ae565b61399d601f8201601f1916602001613930565b8181528460208386010111156139b257600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156139e257600080fd5b8235915060208301356001600160401b038111156139ff57600080fd5b613a0b85828601613960565b9150509250929050565b6001600160a01b038116811461288e57600080fd5b60008083601f840112613a3c57600080fd5b5081356001600160401b03811115613a5357600080fd5b6020830191508360208260051b8501011115611ae157600080fd5b600080600060408486031215613a8357600080fd5b8335613a8e81613a15565b925060208401356001600160401b03811115613aa957600080fd5b613ab586828701613a2a565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015613b035783516001600160a01b031683529284019291840191600101613ade565b50909695505050505050565b80358015158114613b1f57600080fd5b919050565b600080600080600060808688031215613b3c57600080fd5b8535613b4781613a15565b94506020860135935060408601356001600160401b03811115613b6957600080fd5b613b7588828901613a2a565b9094509250613b88905060608701613b0f565b90509295509295909350565b600060208284031215613ba657600080fd5b81356001600160401b0380821115613bbd57600080fd5b9083019060808286031215613bd157600080fd5b604051608081018181108382111715613bec57613bec6138ae565b6040528235613bfa81613a15565b808252506020830135602082015260408301356040820152606083013582811115613c2457600080fd5b613c3087828601613960565b60608301525095945050505050565b803560ff81168114613b1f57600080fd5b60008060008060008060a08789031215613c6957600080fd5b86359550613c7960208801613c3f565b9450604087013593506060870135925060808701356001600160401b03811115613ca257600080fd5b613cae89828a01613a2a565b979a9699509497509295939492505050565b60006001600160401b03821115613cd957613cd96138ae565b5060051b60200190565b600060408284031215613cf557600080fd5b613cfd6138c4565b905081356001600160401b03811115613d1557600080fd5b8201601f81018413613d2657600080fd5b80356020613d3b613d3683613cc0565b613930565b82815260059290921b83018101918181019087841115613d5a57600080fd5b938201935b83851015613d81578435613d7281613a15565b82529382019390820190613d5f565b85525093840135938301939093525092915050565b600081830360a0811215613da957600080fd5b613db16138ec565b91508235613dbe81613a15565b8252613dcc60208401613b0f565b602083015260408301356001600160401b0380821115613deb57600080fd5b613df786838701613960565b60408501526020605f1984011215613e0e57600080fd5b613e1661390e565b925060608501359150613e2882613a15565b8183528260608501526080850135925080831115613e4557600080fd5b5050613e5384828501613ce3565b60808301525092915050565b600060208284031215613e7157600080fd5b81356001600160401b03811115613e8757600080fd5b61201884828501613d96565b600060a08284031215613ea557600080fd5b50919050565b600060208284031215613ebd57600080fd5b81356001600160401b03811115613ed357600080fd5b61201884828501613e93565b60006040808352613ef281840186613860565b83810360208581019190915285518083528682019282019060005b81811015613f3a57613f2a83865180518252602090810151910152565b9383019391850191600101613f0d565b509098975050505050505050565b60008060008060608587031215613f5e57600080fd5b8435613f6981613a15565b93506020850135925060408501356001600160401b03811115613f8b57600080fd5b613f9787828801613a2a565b95989497509550505050565b600080600060608486031215613fb857600080fd5b83359250613fc860208501613c3f565b9150604084013590509250925092565b60008060408385031215613feb57600080fd5b823591506020830135613ffd81613a15565b809150509250929050565b6000806040838503121561401b57600080fd5b50508035926020909101359150565b60006020828403121561403c57600080fd5b813561330481613a15565b60018060a01b03851681528360208201528260408201526080606082015260006140746080830184613704565b9695505050505050565b6000602080838503121561409157600080fd5b82356001600160401b038111156140a757600080fd5b8301601f810185136140b857600080fd5b80356140c6613d3682613cc0565b81815260059190911b820183019083810190878311156140e557600080fd5b928401925b82841015614103578335825292840192908401906140ea565b979650505050505050565b60008060006040848603121561412357600080fd5b83356001600160401b038082111561413a57600080fd5b61414687838801613e93565b9450602086013591508082111561415c57600080fd5b50613ab586828701613a2a565b634e487b7160e01b600052602160045260246000fd5b602081016005831061419357614193614169565b91905290565b60208152600060018060a01b03808451166020840152602084015115156040840152604084015160a060608501526141d460c0850182613704565b90508160608601515116608085015260808501519150601f198482030160a0850152611aaa818361374a565b6000806020838503121561421357600080fd5b82356001600160401b0381111561422957600080fd5b61423585828601613a2a565b90969095509350505050565b600181811c9082168061425557607f821691505b602082108103613ea557634e487b7160e01b600052602260045260246000fd5b601f82111561144157600081815260208120601f850160051c8101602086101561429c5750805b601f850160051c820191505b818110156142bb578281556001016142a8565b505050505050565b81516001600160401b038111156142dc576142dc6138ae565b6142f0816142ea8454614241565b84614275565b602080601f831160018114614325576000841561430d5750858301515b600019600386901b1c1916600185901b1785556142bb565b600085815260208120601f198616915b8281101561435457888601518255948401946001909101908401614335565b50858210156143725787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808201808211156113d1576113d1614382565b60006113d13683613d96565b634e487b7160e01b600052603260045260246000fd5b6000600182016143df576143df614382565b5060010190565b818103818111156113d1576113d1614382565b6020808252825482820181905260008481528281209092916040850190845b81811015613b0357835483526001938401939285019201614418565b602081016002831061419357614193614169565b80820281158282048414176113d1576113d1614382565b60008261447c57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fdfea26469706673582212204542e8389da7e513dbabe17e3685d7f8b36e8414b2c252693e060b1551b9aa3a64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e08b5e3c1e0d86a856d5a0639742b314ac766352368a3813928cf503677d6c8786c9fbf6309c4f39ad75a4f5a46ede474c3f9c170800a77e206aee042c62e26348000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000000000195265686173682053372047756573742053656c656374696f6e000000000000000000000000000000000000000000000000000000000000000000000000000f7a636f6e7465737420636f6d7065746974696f6e7c6e6f6d696e61746520612067756573747c3c703e3c656d3e536561736f6e2037206f66205265686173682077696c6c206169722066726f6d204a616e203138202d204d61722032382c203230323420616e6420636f6e7461696e20313120657069736f6465732e3c2f656d3e3c2f703e3c703e3c2f703e3c703e3c7374726f6e673e54494d454c494e453c2f7374726f6e673e3a203c2f703e3c756c3e3c6c693e3c703e4e6f6d696e6174696f6e733a204a616e7561727920352d31302c20323032342061742039616d2050543c2f703e3c2f6c693e3c6c693e3c703e566f74696e673a204a616e756172792031302d31322c20323032342061742039616d2050543c2f703e3c2f6c693e3c2f756c3e3c703e3c2f703e3c703e3c7374726f6e673e454c49474942494c4954593c2f7374726f6e673e3a3c2f703e3c703e3c656d3e4e6f6d696e61746f72733c2f656d3e3a3c2f703e3c756c3e3c6c693e3c703e486f6c64657273206f66206174206c65617374206f6e652052656861736820706f6463617374204e46543c2f703e3c2f6c693e3c6c693e3c703e436f6c6c6563746f7273206f662072656d61737465726564202262657374206f662220636f6c6c656374696f6e206f6e20506f64733c2f703e3c2f6c693e3c2f756c3e3c703e3c656d3e566f746572733c2f656d3e3a203c2f703e3c756c3e3c6c693e3c703e5061737420677565737473206f6e205265686173683c2f703e3c2f6c693e3c6c693e3c703e506173742073706f6e736f7273206f66205265686173683c2f703e3c2f6c693e3c6c693e3c703e486f6c64657273206f6620746865206f726967696e616c20706f64636173746572204e46542066726f6d206f757220417072696c2032303232204d6972726f722063726f776466756e643c2f703e3c2f6c693e3c6c693e3c703e436f6c6c6563746f7273206f662072656d61737465726564202262657374206f662220636f6c6c656374696f6e206f6e20506f6473202831303020657874726120766f7465732070657220636f6c6c656374293c2f703e3c2f6c693e3c6c693e3c703e31303020657874726120766f74657320746f206e6f6d696e61746f7273206f66205336206775657374733c2f703e3c2f6c693e3c2f756c3e3c703e3c2f703e3c703e3c7374726f6e673e484f5720544f204e4f4d494e41544520412047554553543c2f7374726f6e673e3a3c2f703e3c756c3e3c6c693e3c703e4e6f6d696e617465206120677565737420647572696e6720746865206e6f6d696e6174696f6e20706572696f6420284a616e203520402039616d205054202d204a616e203130204020383a3539616d205054293c2f703e3c2f6c693e3c6c693e3c703e4f6e65206775657374206e6f6d696e6174696f6e207065722070726f706f73616c3c2f703e3c2f6c693e3c6c693e3c703e496e20796f75722070726f706f73616c2c20706c6561736520696e636c75646520746865206775657374206e616d652c206775657374277320616666696c696174696f6e2028636f6d70616e79206f722070726f6a656374206e616d65292c2072656c6576616e74206c696e6b7320746f2074686569722077656273697465206f7220736f6369616c732c20746f7069637320796f752764206c696b6520746f2068656172207468656d2074616c6b2061626f75742c20616e642077687920526568617368206c697374656e65727320776f756c6420656e6a6f792068656172696e672066726f6d20746869732067756573743c2f703e3c2f6c693e3c6c693e3c703e596f75206d6179206e6f6d696e61746520616e796f6e6520796f75206c696b652c20696e636c7564696e6720796f757273656c662c2070617374206775657374732c206775657374732077686f2068617665206e65766572206170706561726564206f6e206120706f6463617374206265666f72652c206574632e3c2f703e3c2f6c693e3c6c693e3c703e506c65617365206b65657020696e206d696e64205265686173682773203320636f72652076616c756573207768656e206e6f6d696e6174696e6720612067756573743a3c2f703e3c756c3e3c6c693e3c703e2831292057652077616e7420746f206d616b65206120636f6e7363696f7573206566666f727420746f20726570726573656e74206173206d616e7920646976657273652070657273706563746976657320617320706f737369626c652e3c2f703e3c2f6c693e3c6c693e3c703e2832292057652062656c696576652074686520776f726c642028696e636c7564696e672074686520776f726c64206f66207765623329206f70657261746573206f6e206120677265797363616c652c206e6f7420696e20626c61636b20616e642077686974652e3c2f703e3c2f6c693e3c6c693e3c703e2833292057652062656c696576652077656233206973207468652066757475726520616e64207468617420696e207468657365206561726c79207374616765732c20776520616c6c20706c617920616e20696e74656772616c20726f6c6520696e2068656c70696e6720736861706520746865206675747572652e3c2f703e3c2f6c693e3c6c693e3c703e596f752063616e2072656164206d6f72652061626f7574206f757220636f72652076616c75657320696e203c61207461726765743d225f626c616e6b222072656c3d226e6f6f70656e6572206e6f7265666572726572206e6f666f6c6c6f772220687265663d2268747470733a2f2f782e636f6d2f726568617368776562332f7374617475732f313531363039313837393237313436303836383f733d343626616d703b743d736c4c3059465773704f6b53364c5779735f4f766a67223e3c7374726f6e673e746869732054776974746572207468726561643c2f7374726f6e673e3c2f613e2e3c2f703e3c2f6c693e3c2f756c3e3c2f6c693e3c6c693e3c703e596f75206d6179206e6f6d696e617465206173206d616e792067756573747320617320796f752764206c696b653c2f703e3c2f6c693e3c6c693e3c703e596f75206d61792063616d706169676e2076696120616e79206d6574686f6420666f7220796f7572206e6f6d696e6565733c2f703e3c2f6c693e3c6c693e3c703e496620796f7572206e6f6d696e656520656e647320757020617070656172696e67206f6e20536561736f6e2037206f662074686520706f64636173742c20796f752077696c6c20726563656976652032206164646974696f6e616c20766f74657320706572206e6f6d696e656520666f722074686520666f6c6c6f77696e6720736561736f6e3c2f703e3c2f6c693e3c2f756c3e3c703e3c2f703e3c703e3c7374726f6e673e484f5720544f20564f544520464f5220412047554553543c2f7374726f6e673e3a3c2f703e3c756c3e3c6c693e3c703e566f746520666f722067756573747320647572696e672074686520766f74696e6720706572696f6420284a616e20313020402039616d205054202d204a616e20313220402039616d205054293c2f703e3c2f6c693e3c6c693e3c703e4561636820656c696769626c6520766f74657220686173207265636569766564203131303020766f7465732028706c757320657874726120766f74657320666f7220736f6d65202d207365652061626f7665293c2f703e3c2f6c693e3c6c693e3c703e596f75206d6179206361737420796f757220766f74657320696e20616e792077617920796f752764206c696b652028692e652e206361737420616c6c20766f74657320666f72206f6e652067756573742c206f722073706c697420757020796f757220766f74657320696e20616e792077617920796f75206c696b65293c2f703e3c2f6c693e3c6c693e3c703e596f75206d61792063616d706169676e20666f7220706172746963756c6172206775657374732c2073747261746567697a652077697468206f746865722052656861736820766f746572732c206f72206576656e207375626d69742062726962657320746f2052656861736820766f74657273202d206e6f7468696e67206973206f6666206c696d6974733c2f703e3c2f6c693e3c6c693e3c703e54686520746f70203131206775657374732061742074686520656e64206f662074686520766f74696e6720706572696f642077696c6c20626520696e7669746564206f6e746f20536561736f6e2037206f662074686520706f64636173743c2f703e3c2f6c693e3c2f756c3e7c3c703e566f746572732073686f756c6420766f746520666f72206e6f6d696e6565732077686f3a3c2f703e3c756c3e3c6c693e3c703e416c69676e2077697468205265686173682773203320636f72652076616c7565733a3c2f703e3c756c3e3c6c693e3c703e2831292057652077616e7420746f206d616b65206120636f6e7363696f7573206566666f727420746f20726570726573656e74206173206d616e7920646976657273652070657273706563746976657320617320706f737369626c652e3c2f703e3c2f6c693e3c6c693e3c703e2832292057652062656c696576652074686520776f726c642028696e636c7564696e672074686520776f726c64206f66207765623329206f70657261746573206f6e206120677265797363616c652c206e6f7420696e20626c61636b20616e642077686974652e3c2f703e3c2f6c693e3c6c693e3c703e2833292057652062656c696576652077656233206973207468652066757475726520616e64207468617420696e207468657365206561726c79207374616765732c20776520616c6c20706c617920616e20696e74656772616c20726f6c6520696e2068656c70696e6720736861706520746865206675747572652e3c2f703e3c2f6c693e3c6c693e3c703e596f752063616e2072656164206d6f72652061626f7574206f757220636f72652076616c75657320696e203c61207461726765743d225f626c616e6b222072656c3d226e6f6f70656e6572206e6f7265666572726572206e6f666f6c6c6f772220687265663d2268747470733a2f2f782e636f6d2f726568617368776562332f7374617475732f313531363039313837393237313436303836383f733d343626616d703b743d736c4c3059465773704f6b53364c5779735f4f766a67223e3c7374726f6e673e746869732054776974746572207468726561643c2f7374726f6e673e3c2f613e2e3c2f703e3c2f6c693e3c2f756c3e3c2f6c693e3c6c693e3c703e4172652065787065727473206f6e2061206365727461696e20746f706963206f722061726520776f726b696e67206f6e20696e6e6f7661746976652070726f6a65637473207468617420526568617368206c697374656e65727320776f756c642066696e6420696e746572657374696e673c2f703e3c2f6c693e3c2f756c3e000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000659835900000000000000000000000000000000000000000000000000000000000069744000000000000000000000000000000000000000000000000000000000002a33c000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000002738d24e520000000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fa
-----Decoded View---------------
Arg [0] : _name (string): Rehash S7 Guest Selection
Arg [1] : _prompt (string): contest competition|nominate a guest|<p><em>Season 7 of Rehash will air from Jan 18 - Mar 28, 2024 and contain 11 episodes.</em></p><p></p><p><strong>TIMELINE</strong>: </p><ul><li><p>Nominations: January 5-10, 2024 at 9am PT</p></li><li><p>Voting: January 10-12, 2024 at 9am PT</p></li></ul><p></p><p><strong>ELIGIBILITY</strong>:</p><p><em>Nominators</em>:</p><ul><li><p>Holders of at least one Rehash podcast NFT</p></li><li><p>Collectors of remastered "best of" collection on Pods</p></li></ul><p><em>Voters</em>: </p><ul><li><p>Past guests on Rehash</p></li><li><p>Past sponsors of Rehash</p></li><li><p>Holders of the original podcaster NFT from our April 2022 Mirror crowdfund</p></li><li><p>Collectors of remastered "best of" collection on Pods (100 extra votes per collect)</p></li><li><p>100 extra votes to nominators of S6 guests</p></li></ul><p></p><p><strong>HOW TO NOMINATE A GUEST</strong>:</p><ul><li><p>Nominate a guest during the nomination period (Jan 5 @ 9am PT - Jan 10 @ 8:59am PT)</p></li><li><p>One guest nomination per proposal</p></li><li><p>In your proposal, please include the guest name, guest's affiliation (company or project name), relevant links to their website or socials, topics you'd like to hear them talk about, and why Rehash listeners would enjoy hearing from this guest</p></li><li><p>You may nominate anyone you like, including yourself, past guests, guests who have never appeared on a podcast before, etc.</p></li><li><p>Please keep in mind Rehash's 3 core values when nominating a guest:</p><ul><li><p>(1) We want to make a conscious effort to represent as many diverse perspectives as possible.</p></li><li><p>(2) We believe the world (including the world of web3) operates on a greyscale, not in black and white.</p></li><li><p>(3) We believe web3 is the future and that in these early stages, we all play an integral role in helping shape the future.</p></li><li><p>You can read more about our core values in <a target="_blank" rel="noopener noreferrer nofollow" href="https://x.com/rehashweb3/status/1516091879271460868?s=46&t=slL0YFWspOkS6LWys_Ovjg"><strong>this Twitter thread</strong></a>.</p></li></ul></li><li><p>You may nominate as many guests as you'd like</p></li><li><p>You may campaign via any method for your nominees</p></li><li><p>If your nominee ends up appearing on Season 7 of the podcast, you will receive 2 additional votes per nominee for the following season</p></li></ul><p></p><p><strong>HOW TO VOTE FOR A GUEST</strong>:</p><ul><li><p>Vote for guests during the voting period (Jan 10 @ 9am PT - Jan 12 @ 9am PT)</p></li><li><p>Each eligible voter has received 1100 votes (plus extra votes for some - see above)</p></li><li><p>You may cast your votes in any way you'd like (i.e. cast all votes for one guest, or split up your votes in any way you like)</p></li><li><p>You may campaign for particular guests, strategize with other Rehash voters, or even submit bribes to Rehash voters - nothing is off limits</p></li><li><p>The top 11 guests at the end of the voting period will be invited onto Season 7 of the podcast</p></li></ul>|<p>Voters should vote for nominees who:</p><ul><li><p>Align with Rehash's 3 core values:</p><ul><li><p>(1) We want to make a conscious effort to represent as many diverse perspectives as possible.</p></li><li><p>(2) We believe the world (including the world of web3) operates on a greyscale, not in black and white.</p></li><li><p>(3) We believe web3 is the future and that in these early stages, we all play an integral role in helping shape the future.</p></li><li><p>You can read more about our core values in <a target="_blank" rel="noopener noreferrer nofollow" href="https://x.com/rehashweb3/status/1516091879271460868?s=46&t=slL0YFWspOkS6LWys_Ovjg"><strong>this Twitter thread</strong></a>.</p></li></ul></li><li><p>Are experts on a certain topic or are working on innovative projects that Rehash listeners would find interesting</p></li></ul>
Arg [2] : _submissionMerkleRoot (bytes32): 0x8b5e3c1e0d86a856d5a0639742b314ac766352368a3813928cf503677d6c8786
Arg [3] : _votingMerkleRoot (bytes32): 0xc9fbf6309c4f39ad75a4f5a46ede474c3f9c170800a77e206aee042c62e26348
Arg [4] : _constructorIntParams (uint256[]): 1704474000,431940,172860,100,1000000,1,690000000000000,50,1,250
-----Encoded View---------------
143 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 8b5e3c1e0d86a856d5a0639742b314ac766352368a3813928cf503677d6c8786
Arg [3] : c9fbf6309c4f39ad75a4f5a46ede474c3f9c170800a77e206aee042c62e26348
Arg [4] : 0000000000000000000000000000000000000000000000000000000000001080
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [6] : 5265686173682053372047756573742053656c656374696f6e00000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000f7a
Arg [8] : 636f6e7465737420636f6d7065746974696f6e7c6e6f6d696e61746520612067
Arg [9] : 756573747c3c703e3c656d3e536561736f6e2037206f66205265686173682077
Arg [10] : 696c6c206169722066726f6d204a616e203138202d204d61722032382c203230
Arg [11] : 323420616e6420636f6e7461696e20313120657069736f6465732e3c2f656d3e
Arg [12] : 3c2f703e3c703e3c2f703e3c703e3c7374726f6e673e54494d454c494e453c2f
Arg [13] : 7374726f6e673e3a203c2f703e3c756c3e3c6c693e3c703e4e6f6d696e617469
Arg [14] : 6f6e733a204a616e7561727920352d31302c20323032342061742039616d2050
Arg [15] : 543c2f703e3c2f6c693e3c6c693e3c703e566f74696e673a204a616e75617279
Arg [16] : 2031302d31322c20323032342061742039616d2050543c2f703e3c2f6c693e3c
Arg [17] : 2f756c3e3c703e3c2f703e3c703e3c7374726f6e673e454c49474942494c4954
Arg [18] : 593c2f7374726f6e673e3a3c2f703e3c703e3c656d3e4e6f6d696e61746f7273
Arg [19] : 3c2f656d3e3a3c2f703e3c756c3e3c6c693e3c703e486f6c64657273206f6620
Arg [20] : 6174206c65617374206f6e652052656861736820706f6463617374204e46543c
Arg [21] : 2f703e3c2f6c693e3c6c693e3c703e436f6c6c6563746f7273206f662072656d
Arg [22] : 61737465726564202262657374206f662220636f6c6c656374696f6e206f6e20
Arg [23] : 506f64733c2f703e3c2f6c693e3c2f756c3e3c703e3c656d3e566f746572733c
Arg [24] : 2f656d3e3a203c2f703e3c756c3e3c6c693e3c703e5061737420677565737473
Arg [25] : 206f6e205265686173683c2f703e3c2f6c693e3c6c693e3c703e506173742073
Arg [26] : 706f6e736f7273206f66205265686173683c2f703e3c2f6c693e3c6c693e3c70
Arg [27] : 3e486f6c64657273206f6620746865206f726967696e616c20706f6463617374
Arg [28] : 6572204e46542066726f6d206f757220417072696c2032303232204d6972726f
Arg [29] : 722063726f776466756e643c2f703e3c2f6c693e3c6c693e3c703e436f6c6c65
Arg [30] : 63746f7273206f662072656d61737465726564202262657374206f662220636f
Arg [31] : 6c6c656374696f6e206f6e20506f6473202831303020657874726120766f7465
Arg [32] : 732070657220636f6c6c656374293c2f703e3c2f6c693e3c6c693e3c703e3130
Arg [33] : 3020657874726120766f74657320746f206e6f6d696e61746f7273206f662053
Arg [34] : 36206775657374733c2f703e3c2f6c693e3c2f756c3e3c703e3c2f703e3c703e
Arg [35] : 3c7374726f6e673e484f5720544f204e4f4d494e41544520412047554553543c
Arg [36] : 2f7374726f6e673e3a3c2f703e3c756c3e3c6c693e3c703e4e6f6d696e617465
Arg [37] : 206120677565737420647572696e6720746865206e6f6d696e6174696f6e2070
Arg [38] : 6572696f6420284a616e203520402039616d205054202d204a616e2031302040
Arg [39] : 20383a3539616d205054293c2f703e3c2f6c693e3c6c693e3c703e4f6e652067
Arg [40] : 75657374206e6f6d696e6174696f6e207065722070726f706f73616c3c2f703e
Arg [41] : 3c2f6c693e3c6c693e3c703e496e20796f75722070726f706f73616c2c20706c
Arg [42] : 6561736520696e636c75646520746865206775657374206e616d652c20677565
Arg [43] : 7374277320616666696c696174696f6e2028636f6d70616e79206f722070726f
Arg [44] : 6a656374206e616d65292c2072656c6576616e74206c696e6b7320746f207468
Arg [45] : 6569722077656273697465206f7220736f6369616c732c20746f706963732079
Arg [46] : 6f752764206c696b6520746f2068656172207468656d2074616c6b2061626f75
Arg [47] : 742c20616e642077687920526568617368206c697374656e65727320776f756c
Arg [48] : 6420656e6a6f792068656172696e672066726f6d20746869732067756573743c
Arg [49] : 2f703e3c2f6c693e3c6c693e3c703e596f75206d6179206e6f6d696e61746520
Arg [50] : 616e796f6e6520796f75206c696b652c20696e636c7564696e6720796f757273
Arg [51] : 656c662c2070617374206775657374732c206775657374732077686f20686176
Arg [52] : 65206e65766572206170706561726564206f6e206120706f6463617374206265
Arg [53] : 666f72652c206574632e3c2f703e3c2f6c693e3c6c693e3c703e506c65617365
Arg [54] : 206b65657020696e206d696e64205265686173682773203320636f7265207661
Arg [55] : 6c756573207768656e206e6f6d696e6174696e6720612067756573743a3c2f70
Arg [56] : 3e3c756c3e3c6c693e3c703e2831292057652077616e7420746f206d616b6520
Arg [57] : 6120636f6e7363696f7573206566666f727420746f20726570726573656e7420
Arg [58] : 6173206d616e7920646976657273652070657273706563746976657320617320
Arg [59] : 706f737369626c652e3c2f703e3c2f6c693e3c6c693e3c703e28322920576520
Arg [60] : 62656c696576652074686520776f726c642028696e636c7564696e6720746865
Arg [61] : 20776f726c64206f66207765623329206f70657261746573206f6e2061206772
Arg [62] : 65797363616c652c206e6f7420696e20626c61636b20616e642077686974652e
Arg [63] : 3c2f703e3c2f6c693e3c6c693e3c703e2833292057652062656c696576652077
Arg [64] : 656233206973207468652066757475726520616e64207468617420696e207468
Arg [65] : 657365206561726c79207374616765732c20776520616c6c20706c617920616e
Arg [66] : 20696e74656772616c20726f6c6520696e2068656c70696e6720736861706520
Arg [67] : 746865206675747572652e3c2f703e3c2f6c693e3c6c693e3c703e596f752063
Arg [68] : 616e2072656164206d6f72652061626f7574206f757220636f72652076616c75
Arg [69] : 657320696e203c61207461726765743d225f626c616e6b222072656c3d226e6f
Arg [70] : 6f70656e6572206e6f7265666572726572206e6f666f6c6c6f77222068726566
Arg [71] : 3d2268747470733a2f2f782e636f6d2f726568617368776562332f7374617475
Arg [72] : 732f313531363039313837393237313436303836383f733d343626616d703b74
Arg [73] : 3d736c4c3059465773704f6b53364c5779735f4f766a67223e3c7374726f6e67
Arg [74] : 3e746869732054776974746572207468726561643c2f7374726f6e673e3c2f61
Arg [75] : 3e2e3c2f703e3c2f6c693e3c2f756c3e3c2f6c693e3c6c693e3c703e596f7520
Arg [76] : 6d6179206e6f6d696e617465206173206d616e79206775657374732061732079
Arg [77] : 6f752764206c696b653c2f703e3c2f6c693e3c6c693e3c703e596f75206d6179
Arg [78] : 2063616d706169676e2076696120616e79206d6574686f6420666f7220796f75
Arg [79] : 72206e6f6d696e6565733c2f703e3c2f6c693e3c6c693e3c703e496620796f75
Arg [80] : 72206e6f6d696e656520656e647320757020617070656172696e67206f6e2053
Arg [81] : 6561736f6e2037206f662074686520706f64636173742c20796f752077696c6c
Arg [82] : 20726563656976652032206164646974696f6e616c20766f7465732070657220
Arg [83] : 6e6f6d696e656520666f722074686520666f6c6c6f77696e6720736561736f6e
Arg [84] : 3c2f703e3c2f6c693e3c2f756c3e3c703e3c2f703e3c703e3c7374726f6e673e
Arg [85] : 484f5720544f20564f544520464f5220412047554553543c2f7374726f6e673e
Arg [86] : 3a3c2f703e3c756c3e3c6c693e3c703e566f746520666f722067756573747320
Arg [87] : 647572696e672074686520766f74696e6720706572696f6420284a616e203130
Arg [88] : 20402039616d205054202d204a616e20313220402039616d205054293c2f703e
Arg [89] : 3c2f6c693e3c6c693e3c703e4561636820656c696769626c6520766f74657220
Arg [90] : 686173207265636569766564203131303020766f7465732028706c7573206578
Arg [91] : 74726120766f74657320666f7220736f6d65202d207365652061626f7665293c
Arg [92] : 2f703e3c2f6c693e3c6c693e3c703e596f75206d6179206361737420796f7572
Arg [93] : 20766f74657320696e20616e792077617920796f752764206c696b652028692e
Arg [94] : 652e206361737420616c6c20766f74657320666f72206f6e652067756573742c
Arg [95] : 206f722073706c697420757020796f757220766f74657320696e20616e792077
Arg [96] : 617920796f75206c696b65293c2f703e3c2f6c693e3c6c693e3c703e596f7520
Arg [97] : 6d61792063616d706169676e20666f7220706172746963756c61722067756573
Arg [98] : 74732c2073747261746567697a652077697468206f7468657220526568617368
Arg [99] : 20766f746572732c206f72206576656e207375626d6974206272696265732074
Arg [100] : 6f2052656861736820766f74657273202d206e6f7468696e67206973206f6666
Arg [101] : 206c696d6974733c2f703e3c2f6c693e3c6c693e3c703e54686520746f702031
Arg [102] : 31206775657374732061742074686520656e64206f662074686520766f74696e
Arg [103] : 6720706572696f642077696c6c20626520696e7669746564206f6e746f205365
Arg [104] : 61736f6e2037206f662074686520706f64636173743c2f703e3c2f6c693e3c2f
Arg [105] : 756c3e7c3c703e566f746572732073686f756c6420766f746520666f72206e6f
Arg [106] : 6d696e6565732077686f3a3c2f703e3c756c3e3c6c693e3c703e416c69676e20
Arg [107] : 77697468205265686173682773203320636f72652076616c7565733a3c2f703e
Arg [108] : 3c756c3e3c6c693e3c703e2831292057652077616e7420746f206d616b652061
Arg [109] : 20636f6e7363696f7573206566666f727420746f20726570726573656e742061
Arg [110] : 73206d616e792064697665727365207065727370656374697665732061732070
Arg [111] : 6f737369626c652e3c2f703e3c2f6c693e3c6c693e3c703e2832292057652062
Arg [112] : 656c696576652074686520776f726c642028696e636c7564696e672074686520
Arg [113] : 776f726c64206f66207765623329206f70657261746573206f6e206120677265
Arg [114] : 797363616c652c206e6f7420696e20626c61636b20616e642077686974652e3c
Arg [115] : 2f703e3c2f6c693e3c6c693e3c703e2833292057652062656c69657665207765
Arg [116] : 6233206973207468652066757475726520616e64207468617420696e20746865
Arg [117] : 7365206561726c79207374616765732c20776520616c6c20706c617920616e20
Arg [118] : 696e74656772616c20726f6c6520696e2068656c70696e672073686170652074
Arg [119] : 6865206675747572652e3c2f703e3c2f6c693e3c6c693e3c703e596f75206361
Arg [120] : 6e2072656164206d6f72652061626f7574206f757220636f72652076616c7565
Arg [121] : 7320696e203c61207461726765743d225f626c616e6b222072656c3d226e6f6f
Arg [122] : 70656e6572206e6f7265666572726572206e6f666f6c6c6f772220687265663d
Arg [123] : 2268747470733a2f2f782e636f6d2f726568617368776562332f737461747573
Arg [124] : 2f313531363039313837393237313436303836383f733d343626616d703b743d
Arg [125] : 736c4c3059465773704f6b53364c5779735f4f766a67223e3c7374726f6e673e
Arg [126] : 746869732054776974746572207468726561643c2f7374726f6e673e3c2f613e
Arg [127] : 2e3c2f703e3c2f6c693e3c2f756c3e3c2f6c693e3c6c693e3c703e4172652065
Arg [128] : 787065727473206f6e2061206365727461696e20746f706963206f7220617265
Arg [129] : 20776f726b696e67206f6e20696e6e6f7661746976652070726f6a6563747320
Arg [130] : 7468617420526568617368206c697374656e65727320776f756c642066696e64
Arg [131] : 20696e746572657374696e673c2f703e3c2f6c693e3c2f756c3e000000000000
Arg [132] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [133] : 0000000000000000000000000000000000000000000000000000000065983590
Arg [134] : 0000000000000000000000000000000000000000000000000000000000069744
Arg [135] : 000000000000000000000000000000000000000000000000000000000002a33c
Arg [136] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [137] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [138] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [139] : 0000000000000000000000000000000000000000000000000002738d24e52000
Arg [140] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [141] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [142] : 00000000000000000000000000000000000000000000000000000000000000fa
Deployed Bytecode Sourcemap
120505:1070:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66875:27;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;66875:27:0;;;;;;;;67679:49;;;;;;;;;;-1:-1:-1;67679:49:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;67040:27::-;;;;;;;;;;;;;;;;66846:22;;;;;;;;;;-1:-1:-1;66846:22:0;;;;-1:-1:-1;;;;;66846:22:0;;;;;;-1:-1:-1;;;;;2440:32:1;;;2422:51;;2410:2;2395:18;66846:22:0;2276:203:1;59440:24:0;;;;;;;;;;;;;;;;67554:35;;;;;;;;;;-1:-1:-1;67554:35:0;;;;;:::i;:::-;;:::i;66766:18::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;83562:60::-;;;;;;;;;;-1:-1:-1;83562:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;118602:125::-;;;;;;;;;;-1:-1:-1;118602:125:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67791:32::-;;;;;;;;;;-1:-1:-1;67791:32:0;;;;;:::i;:::-;;:::i;71600:119::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;119072:595::-;;;;;;;;;;-1:-1:-1;119072:595:0;;;;;:::i;:::-;;:::i;73603:478::-;;;;;;;;;;-1:-1:-1;73603:478:0;;;;;:::i;:::-;;:::i;:::-;;72599:109;;;;;;;;;;;;;:::i;71404:127::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59611:28::-;;;;;;;;;;-1:-1:-1;59611:28:0;;;;;:::i;:::-;;:::i;57116:551::-;;;;;;;;;;-1:-1:-1;57116:551:0;;;;;:::i;:::-;;:::i;:::-;;;9300:14:1;;9293:22;9275:41;;9263:2;9248:18;57116:551:0;9135:187:1;66593:73:0;;;;;;;;;;;;66646:20;66593:73;;59368:29;;;;;;;;;;;;;;;;66959:26;;;;;;;;;;;;;;;;67652:20;;;;;;;;;;-1:-1:-1;67652:20:0;;;;;;;;117637:34;;;;;;;;;;-1:-1:-1;117637:34:0;;;;;:::i;:::-;;:::i;118036:150::-;;;;;;;;;;-1:-1:-1;118036:150:0;;;;;:::i;:::-;;:::i;80572:405::-;;;;;;;;;;-1:-1:-1;80572:405:0;;;;;:::i;:::-;;:::i;70329:148::-;;;;;;;;;;-1:-1:-1;70329:148:0;;;;;:::i;:::-;;:::i;76596:638::-;;;;;;:::i;:::-;;:::i;66512:74::-;;;;;;;;;;;;;:::i;85591:591::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;67830:39::-;;;;;;;;;;-1:-1:-1;67830:39:0;;;;;:::i;:::-;;:::i;80124:376::-;;;;;;;;;;-1:-1:-1;80124:376:0;;;;;:::i;:::-;;:::i;82536:195::-;;;;;;;;;;-1:-1:-1;82536:195:0;;;;;:::i;:::-;;:::i;84048:297::-;;;;;;;;;;-1:-1:-1;84048:297:0;;;;;:::i;:::-;84112:16;84199:32;;;:20;:32;;;;;84250:40;;84292:44;;;;;84250:40;;84048:297;;;;;16336:25:1;;;16392:2;16377:18;;16370:34;;;;16309:18;84048:297:0;16162:248:1;70234:87:0;;;;;;;;;;-1:-1:-1;70300:13:0;;;;;;;;;;;;-1:-1:-1;;;70300:13:0;;;;70234:87;;87600:1049;;;;;;;;;;-1:-1:-1;87600:1049:0;;;;;:::i;:::-;;:::i;118421:117::-;;;;;;;;;;;;;:::i;67357:32::-;;;;;;;;;;;;;;;;81084:383;;;;;;;;;;-1:-1:-1;81084:383:0;;;;;:::i;:::-;;:::i;84453:418::-;;;;;;;;;;-1:-1:-1;84453:418:0;;;;;:::i;:::-;;:::i;67441:28::-;;;;;;;;;;;;;;;;60139:119;;;;;;;;;;;;;:::i;83631:58::-;;;;;;;;;;-1:-1:-1;83631:58:0;;;;;:::i;:::-;;:::i;67735:49::-;;;;;;;;;;-1:-1:-1;67735:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;116490:42;;;;;;;;;;-1:-1:-1;116490:42:0;;;;-1:-1:-1;;;;;116490:42:0;;;66819:20;;;;;;;;;;;;;:::i;83420:29::-;;;;;;;;;;;;;;;;67116:44;;;;;;;;;;;;;;;;117678:47;;;;;;;;;;-1:-1:-1;117678:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;88766:535::-;;;;;;;;;;-1:-1:-1;88766:535:0;;;;;:::i;:::-;;:::i;67937:57::-;;;;;;;;;;-1:-1:-1;67937:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;71214:113;;;;;;;;;;;;;:::i;67519:28::-;;;;;;;;;;-1:-1:-1;67519:28:0;;;;;:::i;:::-;;:::i;86626:172::-;;;;;;;;;;-1:-1:-1;86626:172:0;;;;;:::i;:::-;86719:13;86752:31;;;:21;:31;;;;;:38;;86626:172;83494:61;;;;;;;;;;-1:-1:-1;83494:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;119772:726;;;;;;;;;;-1:-1:-1;119772:726:0;;;;;:::i;:::-;;:::i;117792:48::-;;;;;;;;;;-1:-1:-1;117792:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;85320:173;;;;;;;;;;-1:-1:-1;85320:173:0;;;;;:::i;:::-;-1:-1:-1;;;;;85446:39:0;85400:26;85446:39;;;:26;:39;;;;;;;85320:173;84977:227;;;;;;;;;;-1:-1:-1;84977:227:0;;;;;:::i;:::-;;:::i;87122:271::-;;;;;;;;;;-1:-1:-1;87122:271:0;;;;;:::i;:::-;;:::i;56052:35::-;;;;;;;;;;;;;;;;118820:142;;;;;;;;;;-1:-1:-1;118820:142:0;;;;;:::i;:::-;;:::i;76047:429::-;;;;;;:::i;:::-;;:::i;70485:495::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;72771:130::-;;;;;;;;;;-1:-1:-1;72771:130:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;86299:218::-;;;;;;;;;;-1:-1:-1;86299:218:0;;;;;:::i;:::-;;:::i;68001:56::-;;;;;;;;;;-1:-1:-1;68001:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;71799:444;;;;;;;;;;;;;:::i;82317:211::-;;;;;;;;;;-1:-1:-1;82317:211:0;;;;;:::i;:::-;;:::i;56094:31::-;;;;;;;;;;;;;;;;67878:52;;;;;;;;;;-1:-1:-1;67878:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;72410:103;;;;;;;;;;;;;:::i;118248:::-;;;;;;;;;;;;;:::i;79669:332::-;;;;;;;;;;;;;:::i;67476:34::-;;;;;;;;;;;;;;;;66673:84;;;;;;;;;;;;66715:42;66673:84;;71041:105;;;;;;;;;;;;;:::i;78266:1284::-;;;;;;;;;;-1:-1:-1;78266:1284:0;;;;;:::i;:::-;;:::i;116707:384::-;;;;;;;;;;-1:-1:-1;116707:384:0;;;;;:::i;:::-;;:::i;117603:27::-;;;;;;;;;;-1:-1:-1;117603:27:0;;;;;:::i;:::-;;:::i;117732:53::-;;;;;;;;;;-1:-1:-1;117732:53:0;;;;;:::i;:::-;;:::i;67596:49::-;;;;;;;;;;-1:-1:-1;67596:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;74180:903;;;;;;;;;;-1:-1:-1;74180:903:0;;;;;:::i;:::-;;:::i;67267:31::-;;;;;;;;;;;;;;;;67679:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67679:49:0;;;-1:-1:-1;;;67679:49:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67679:49:0;;;;;;;;;;;;;-1:-1:-1;;;;;67679:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67679:49:0;;-1:-1:-1;67679:49:0;-1:-1:-1;67679:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67679:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67554:35::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67554:35:0;:::o;66766:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;118602:125::-;118662:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118662:18:0;118700:19;;;;:8;:19;;;;;;;;;118693:26;;;;;;;;;-1:-1:-1;;;;;118693:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118700:19;118693:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118602:125;;;:::o;67791:32::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67791:32:0;;-1:-1:-1;67791:32:0;:::o;71600:119::-;71657:16;71693:18;71686:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71600:119;:::o;119072:595::-;119210:180;;;;;;;;119245:10;119210:180;;119281:15;119210:180;;;;;;;;;;;;;;;;119155:7;;;119421:26;119210:180;119421:11;:26::i;:::-;119460:10;:26;;;;;;;;;;;;;;;-1:-1:-1;119497:19:0;;;:8;:19;;;;;;;:35;;;;-1:-1:-1;;;;;;119497:35:0;-1:-1:-1;;;;;119497:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;119460:26;;-1:-1:-1;119497:35:0;;;;;;;;;;:::i;:::-;-1:-1:-1;;;119543:28:0;;;;:16;:28;;;;;;;;:44;;;;;;;;;;;;;;;;;;119605:25;;;;;119577:9;160:25:1;;148:2;133:18;;14:177;119605:25:0;;;;;;;;119650:9;-1:-1:-1;;119072:595:0;;;;;:::o;73603:478::-;-1:-1:-1;;;;;73693:33:0;;;;;;:24;:33;;;;;;;;73688:386;;73747:20;;73771:1;73747:25;73743:144;;73603:478;;;:::o;73743:144::-;73901:61;73912:7;66646:20;73949:5;;73956;73901:10;:61::i;:::-;-1:-1:-1;;;;;;74022:33:0;;;;;;:24;:33;;;;;:40;;-1:-1:-1;;74022:40:0;74058:4;74022:40;;;73688:386;73603:478;;;:::o;72599:109::-;72647:7;72688:12;;72674:11;:9;:11::i;:::-;:26;;;;:::i;:::-;72667:33;;72599:109;:::o;71404:127::-;71465:16;71501:22;71494:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;71494:29:0;;;;;;;;;;;;;;;;;;;;;;71404:127;:::o;59611:28::-;;;;;;;;;;;;57116:551;57377:40;;-1:-1:-1;;24999:2:1;24995:15;;;24991:53;57377:40:0;;;24979:66:1;25061:12;;;25054:28;;;57263:13:0;;;;25098:12:1;;57377:40:0;;;;;;;;;;;;57367:51;;;;;;57352:66;;57429:16;57448:6;:140;;57535:53;57554:5;;57535:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57561:20:0;;;-1:-1:-1;57583:4:0;;-1:-1:-1;57535:18:0;:53::i;:::-;57448:140;;;57470:49;57489:5;;57470:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57496:16:0;;;-1:-1:-1;57514:4:0;;-1:-1:-1;57470:18:0;:49::i;:::-;57429:159;;57604:11;57599:38;;57624:13;;-1:-1:-1;;;57624:13:0;;;;;;;;;;;57599:38;-1:-1:-1;57655:4:0;;57116:551;-1:-1:-1;;;;;;;57116:551:0:o;117637:34::-;;;;;;;;;;;;118036:150;118109:7;118165:10;118154:22;;;;;;;;:::i;:::-;;;;-1:-1:-1;;118154:22:0;;;;;;;;;118144:33;;118154:22;118144:33;;;;;118036:150;-1:-1:-1;;118036:150:0:o;80572:405::-;80723:7;80789:29;;;:17;:29;;;;;;80764:10;;80789:29;;80785:71;;;80827:29;;-1:-1:-1;;;80827:29:0;;;;;;;;;;;80785:71;80867:37;80879:5;80886:10;80898:5;;80867:11;:37::i;:::-;80922:47;80932:10;80944:5;80951:7;80960:8;80922:9;:47::i;:::-;80915:54;80572:405;-1:-1:-1;;;;;;;;80572:405:0:o;70329:148::-;70402:7;70458:8;70447:20;;;;;;;;:::i;76596:638::-;76681:7;76718:13;;76705:9;:26;76701:91;;76778:13;;76740:52;;-1:-1:-1;;;76740:52:0;;76767:9;76740:52;;;16336:25:1;16377:18;;;16370:34;;;;16309:18;;76740:52:0;;;;;;;;76701:91;76809:20;;:25;76805:257;;77002:10;76977:36;;;;:24;:36;;;;;;;;76972:78;;77022:28;;-1:-1:-1;;;77022:28:0;;;;;;;;;;;76972:78;77072:30;;77093:8;77072:30;:::i;:::-;77113:18;77134:23;;77148:8;77134:23;:::i;:::-;:13;:23::i;:::-;77113:44;;77170:26;:24;:26::i;66512:74::-;66554:32;66562:19;;66554:32;:::i;:::-;66512:74;:::o;85591:591::-;85672:34;85708:49;85775:34;85812:19;:17;:19::i;:::-;85775:56;;85842:43;85905:17;:24;-1:-1:-1;;;;;85888:42:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;85888:42:0;;;;;;;;;;;;;;;;85842:88;;85946:9;85941:172;85965:17;:24;85961:1;:28;85941:172;;;86040:20;:42;86061:17;86079:1;86061:20;;;;;;;;:::i;:::-;;;;;;;86040:42;;;;;;;;;;;:61;;86011:90;;;;;;;;;;;;;;;;;;;;;;;;;:23;86035:1;86011:26;;;;;;;;:::i;:::-;;;;;;:90;;;;85991:3;;;;;:::i;:::-;;;;85941:172;;;-1:-1:-1;86131:17:0;;86150:23;;-1:-1:-1;85591:591:0;-1:-1:-1;85591:591:0:o;67830:39::-;;;;;;;;;;;;80124:376;-1:-1:-1;;;;;80231:34:0;;;;;;:25;:34;;;;;;;;80226:267;;80282:44;80293:7;80302:10;80314:5;;80321:4;80282:10;:44::i;:::-;-1:-1:-1;;;;;;80386:26:0;;;;;;:17;:26;;;;;;;;:39;;;80440:25;:34;;;;;:41;;-1:-1:-1;;80440:41:0;80477:4;80440:41;;;80226:267;80124:376;;;;:::o;82536:195::-;82616:10;66715:42;82616:29;82612:62;;82654:20;;-1:-1:-1;;;82654:20:0;;;;;;;;;;;82612:62;82685:16;:38;82536:195::o;87600:1049::-;87657:17;87691:4;87699:1;87691:9;87687:40;;87709:18;;-1:-1:-1;;;87709:18:0;;;;;;;;;;;87687:40;87768:11;:18;;87841:48;;;;;;;;;;;;;;;;;87768:18;;87740:25;;87841:48;87768:18;;87841:48;;87768:11;:18;87841:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87946:15;87964:1;87946:19;;87981:13;87976:547;88008:17;88000:5;:25;87976:547;;;88209:61;88245:17;88263:5;88245:24;;;;;;;;:::i;:::-;;;;;;;86719:13;86752:31;;;:21;:31;;;;;:38;;86626:172;88209:61;88205:115;88296:8;88205:115;88435:4;88424:7;:15;88420:68;;88467:5;87600:1049;-1:-1:-1;;;;;87600:1049:0:o;88420:68::-;88502:9;;;;:::i;:::-;;;;87976:547;88027:7;;;;:::i;:::-;;;;87976:547;;;;88617:24;;-1:-1:-1;;;88617:24:0;;;;;;;;;;;118421:117;118477:16;118513:17;118506:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118421:117;:::o;81084:383::-;81183:7;81244:29;;;:17;:29;;;;;;81219:10;;81244:29;;81240:71;;;81282:29;;-1:-1:-1;;;81282:29:0;;;;;;;;;;;81240:71;-1:-1:-1;;;;;81327:32:0;;;;;;:25;:32;;;;;;;;81322:72;;81368:26;;-1:-1:-1;;;81368:26:0;;;;;;;;;;;81322:72;81412:47;81422:10;81434:5;81441:7;81450:8;81412:9;:47::i;:::-;81405:54;81084:383;-1:-1:-1;;;;;81084:383:0:o;84453:418::-;84572:16;84664:32;;;:20;:32;;;;;;;;-1:-1:-1;;;;;84729:43:0;;;;:30;;:43;;;;;:52;;84796:56;;;;;84453:418;;;;;;:::o;60139:119::-;60186:33;60239:11;60232:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60139:119;:::o;83631:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66819:20::-;;;;;;;:::i;117678:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;117678:47:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88766:535::-;88874:11;:18;88829:22;;88874;;88895:1;;88874:22;:::i;:::-;88868:3;:28;88864:208;;;89034:26;;-1:-1:-1;;;89034:26:0;;;;;;;;;;;88864:208;89089:13;89084:187;89116:7;:3;89122:1;89116:7;:::i;:::-;89108:5;:15;89084:187;;;89211:1;89153:55;89189:11;89201:5;89189:18;;;;;;;;:::i;:::-;;;;;;;;;86719:13;86752:31;;;:21;:31;;;;;:38;;86626:172;89153:55;:59;89149:111;;;-1:-1:-1;89240:4:0;;88766:535;-1:-1:-1;;88766:535:0:o;89149:111::-;89125:7;;;;:::i;:::-;;;;89084:187;;;-1:-1:-1;89288:5:0;;88766:535;-1:-1:-1;;88766:535:0:o;71214:113::-;71268:16;71304:15;71297:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;71297:22:0;;;;;;;;;;;;;;;;;;;;;;71214:113;:::o;67519:28::-;;;;;;;;;;;;119772:726;119880:22;;119848:29;119915:526;119947:21;119939:5;:29;119915:526;;;119994:24;120021:15;120037:5;120021:22;;;;;;;;:::i;:::-;;;;;;;;;;;120079:7;;120021:22;;-1:-1:-1;;;;;;120079:7:0;120065:10;:21;;;;120064:76;;-1:-1:-1;120106:26:0;;;;:8;:26;;;;;:33;-1:-1:-1;;;;;120106:33:0;120092:10;:47;;120064:76;120060:178;;;120168:54;;-1:-1:-1;;;120168:54:0;;;;;160:25:1;;;133:18;;120168:54:0;14:177:1;120060:178:0;120259:34;;;;:16;:34;;;;;;;;120254:176;;120314:34;;;;:16;:34;;;;;:41;;-1:-1:-1;;120314:41:0;120351:4;120314:41;;;;;;120374:17;:40;;;;;;;;;;;;;;;120254:176;-1:-1:-1;119970:7:0;;;;:::i;:::-;;;;119915:526;;;;120458:32;120474:15;120458:32;;;;;;:::i;:::-;;;;;;;;119837:661;119772:726;:::o;84977:227::-;85083:33;85119:32;;;:20;:32;;;;;;;;;85169:27;;;85162:34;;;;;;;;;;;;;;;;;85054:16;;85119:32;;85162:34;;85169:27;85162:34;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;85162:34:0;;;;;;;;;;;;;;;;;;;;;;;;84977:227;;;:::o;87122:271::-;87208:18;87243:31;;;:21;:31;;;;;:38;87285:1;87243:43;87239:94;;87295:38;;-1:-1:-1;;;87295:38:0;;;;;;;;;;;87239:94;87351:31;;;;:21;:31;;;;;:34;;:31;;;:34;;;;:::i;:::-;;;;;;;;;87344:41;;87122:271;;;:::o;118820:142::-;118926:28;;;;:16;:28;;;;;;;;;118919:35;;;;;;;;;;;;;;;;;118890:16;;118919:35;;;118926:28;118919:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118820:142;;;:::o;76047:429::-;76146:7;76183:13;;76170:9;:26;76166:91;;76243:13;;76205:52;;-1:-1:-1;;;76205:52:0;;76232:9;76205:52;;;16336:25:1;16377:18;;;16370:34;;;;16309:18;;76205:52:0;16162:248:1;76166:91:0;76270:33;76285:10;76297:5;;76270:14;:33::i;:::-;76314:30;;76335:8;76314:30;:::i;:::-;76355:18;76376:23;;76390:8;76376:23;:::i;:::-;76355:44;;76412:26;:24;:26::i;:::-;76458:10;76047:429;-1:-1:-1;;;;76047:429:0:o;70485:495::-;70552:8;;70523:12;;70552:8;;70548:69;;;-1:-1:-1;70584:21:0;;70485:495::o;70548:69::-;70649:15;70633:12;;:31;70629:94;;-1:-1:-1;70688:23:0;;70485:495::o;70629:94::-;70754:15;70739:11;:9;:11::i;:::-;:30;70735:89;;-1:-1:-1;70793:19:0;;70485:495::o;70735:89::-;70861:15;70840:17;:15;:17::i;:::-;:36;70836:95;;-1:-1:-1;70900:19:0;;70485:495::o;70836:95::-;-1:-1:-1;70950:22:0;;70485:495::o;72771:130::-;72833:19;;:::i;:::-;72872:21;;;;:9;:21;;;;;;;;;72865:28;;;;;;;;;-1:-1:-1;;;;;72865:28:0;;;;-1:-1:-1;;;72865:28:0;;;;;;;;;;;;;;;;;;;;72872:21;;72865:28;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72865:28:0;;;-1:-1:-1;;72865:28:0;;;;;;;;;;;;;-1:-1:-1;;;;;72865:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72865:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72771:130;;;:::o;86299:218::-;86478:31;;;;:21;:31;;;;;;;;;86471:38;;;;;;;;;;;;;;;;;86407:46;;86471:38;;;86478:31;86471:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86299:218;;;:::o;71799:444::-;71863:16;71892:41;71936:18;71892:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71965:29;72011:24;:31;-1:-1:-1;;;;;71997:46:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71997:46:0;;71965:78;;72059:9;72054:152;72078:24;:31;72074:1;:35;72054:152;;;72149:9;:38;72159:24;72184:1;72159:27;;;;;;;;:::i;:::-;;;;;;;72149:38;;;;;;;;;;;:45;;;;;;;;;;-1:-1:-1;;;;;72149:45:0;72131:12;72144:1;72131:15;;;;;;;;:::i;:::-;-1:-1:-1;;;;;72131:63:0;;;:15;;;;;;;;;;;:63;72111:3;;;;:::i;:::-;;;;72054:152;;;-1:-1:-1;72223:12:0;71799:444;-1:-1:-1;;71799:444:0:o;82317:211::-;82405:10;66715:42;82405:29;82401:62;;82443:20;;-1:-1:-1;;;82443:20:0;;;;;;;;;;;82401:62;82474:20;:46;82317:211::o;72410:103::-;72452:7;72494:11;;72479:12;;:26;;;;:::i;118248:103::-;118297:16;118333:10;118326:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118248:103;:::o;79669:332::-;79725:7;;-1:-1:-1;;;;;79725:7:0;79711:10;:21;;;;79710:58;;-1:-1:-1;79738:10:0;66715:42;79738:29;;79710:58;79705:103;;;79778:30;;-1:-1:-1;;;79778:30:0;;;;;;;;;;;79705:103;79821:19;79843:7;:5;:7::i;:::-;79821:29;-1:-1:-1;79875:21:0;79865:6;:31;;;;;;;;:::i;:::-;;79861:69;;79905:25;;-1:-1:-1;;;79905:25:0;;;;;;;;;;;79861:69;79943:8;:15;;-1:-1:-1;;79943:15:0;79954:4;79943:15;;;79976:17;;;;79943:8;;79976:17;79694:307;79669:332::o;71041:105::-;71091:16;71127:11;71120:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71041:105;:::o;78266:1284::-;78367:7;;-1:-1:-1;;;;;78367:7:0;78353:10;:21;78349:56;;78383:22;;-1:-1:-1;;;78383:22:0;;;;;;;;;;;78349:56;78431:22;78420:7;:5;:7::i;:::-;:33;;;;;;;;:::i;:::-;;78416:73;;78462:27;;-1:-1:-1;;;78462:27:0;;;;;;;;;;;78416:73;78507:13;78502:629;78526:34;;;78502:629;;;78586:25;78614:19;;78634:5;78614:26;;;;;;;:::i;:::-;;;;;;;;;;78660:36;;;;:17;:36;;;;;;;;78614:26;;-1:-1:-1;;78660:36:0;;78655:465;;78782:36;;;;:17;:36;;;;;:43;;-1:-1:-1;;78782:43:0;78821:4;78782:43;;;;;;79062:18;:42;;;;;;;;;;;;;;;78655:465;-1:-1:-1;78562:7:0;;;;:::i;:::-;;;;78502:629;;;-1:-1:-1;79230:17:0;;:22;:45;;;;;79256:14;;79274:1;79256:19;79230:45;79226:270;;;79430:54;79464:19;;79430:33;:54::i;:::-;79513:29;79530:11;79513:29;;;;;;:::i;116707:384::-;116815:7;;-1:-1:-1;;;;;116815:7:0;116801:10;:21;116797:66;;116831:32;;-1:-1:-1;;;116831:32:0;;;;;;;;;;;116797:66;116915:21;;;-1:-1:-1;;;;;116947:46:0;;;-1:-1:-1;;;;;;116947:46:0;;;;;;;117009:74;;;116915:21;;;;26671:34:1;;;26736:2;26721:18;;26714:43;;;;117009:74:0;;26606:18:1;117009:74:0;26399:364:1;117603:27:0;;;;;;;;;;;;117732:53;;;;;;;;;;;;;;;;;;;;74180:903;74267:15;;-1:-1:-1;;;;;74267:29:0;74286:10;74267:29;74263:88;;74323:15;;74305:46;;-1:-1:-1;;;74305:46:0;;-1:-1:-1;;;;;26689:15:1;;;74305:46:0;;;26671:34:1;74340:10:0;26721:18:1;;;26714:43;26606:18;;74305:46:0;26399:364:1;74263:88:0;74367:13;74362:625;66554:32;66562:19;;66554:32;:::i;:::-;74386:5;:23;74362:625;;;74435:25;74473:5;74463:16;;;;;;;;:::i;:::-;74435:44;-1:-1:-1;74517:16:0;74498:15;:35;;;;;;;;:::i;:::-;;74494:482;;74554:8;;;74494:482;74664:14;74645:15;:33;;;;;;;;:::i;:::-;;74641:335;;74703:21;;;;:29;:36;:29;:41;74699:81;;74753:27;;-1:-1:-1;;;74753:27:0;;;;;;;;;;;74699:81;74803:8;:21;;;:31;;;74838:1;74803:36;74799:78;;74848:29;;-1:-1:-1;;;74848:29:0;;;;;;;;;;;74799:78;74641:335;;;74944:15;74925:35;;-1:-1:-1;;;74925:35:0;;;;;;;;:::i;74641:335::-;74420:567;74362:625;74411:7;;;;:::i;:::-;;;;74362:625;;;;75007:8;:20;;;75001:34;75039:1;75001:39;74997:78;;75049:26;;-1:-1:-1;;;75049:26:0;;;;;;;;;;;74997:78;74180:903;:::o;47185:156::-;47276:4;47329;47300:25;47313:5;47320:4;47300:12;:25::i;:::-;:33;;47185:156;-1:-1:-1;;;;47185:156:0:o;81756:553::-;81881:7;81921:19;81910:7;:5;:7::i;:::-;:30;;;;;;;;:::i;:::-;;81906:77;;81975:7;:5;:7::i;:::-;81949:34;;-1:-1:-1;;;81949:34:0;;;;;;;;:::i;81906:77::-;81998:8;82010:1;81998:13;81994:52;;82020:26;;-1:-1:-1;;;82020:26:0;;;;;;;;;;;81994:52;82059:78;82070:10;82082:7;82091;82100:8;82110:17;:26;82128:7;-1:-1:-1;;;;;82110:26:0;-1:-1:-1;;;;;82110:26:0;;;;;;;;;;;;;82059:10;:78::i;:::-;82150:22;:39;;;;;;;-1:-1:-1;82150:39:0;;;;;;;;-1:-1:-1;;;;;;82150:39:0;82178:10;82150:39;;;82207:48;;;27525:25:1;;;27598:4;27586:17;;27581:2;27566:18;;27559:45;27620:18;;;27613:34;;;-1:-1:-1;;;;;82207:48:0;;;;;27513:2:1;27498:18;82207:48:0;;;;;;;-1:-1:-1;;;;;;;;82275:26:0;;;;;:17;:26;;;;;;;81756:553;-1:-1:-1;81756:553:0:o;77242:907::-;77313:7;77348:19;77337:7;:5;:7::i;:::-;:30;;;;;;;;:::i;:::-;;77333:80;;77405:7;:5;:7::i;:::-;77376:37;;-1:-1:-1;;;77376:37:0;;;;;;;;:::i;77333:80::-;77458:29;;77443:10;77428:26;;;;:14;:26;;;;;;:59;77424:158;;77540:29;;77511:59;;-1:-1:-1;;;77511:59:0;;;;;;160:25:1;;148:2;133:18;;14:177;77424:158:0;77648:16;;77618:18;:25;77597:11;:18;:46;;77618:25;77597:46;:::i;:::-;77596:68;77592:155;;77718:16;;77688:47;;-1:-1:-1;;;77688:47:0;;;;;;160:25:1;;148:2;133:18;;14:177;77592:155:0;77759:18;77780:22;77793:8;77780:12;:22::i;:::-;77817:21;;;;:9;:21;;;;;:28;:21;;-1:-1:-1;;;;77817:28:0;;;;77813:72;;;77854:31;;-1:-1:-1;;;77854:31:0;;;;;160:25:1;;;133:18;;77854:31:0;14:177:1;77813:72:0;77898:11;:28;;;;;;;;;;;;;;-1:-1:-1;77937:21:0;;;:9;77898:28;77937:21;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;77937:32:0;-1:-1:-1;;;;;;77937:32:0;;;-1:-1:-1;;;;;77937:32:0;;;;;;;;;;;;;;77961:8;;77937:32;;;;;;;:::i;:::-;-1:-1:-1;77937:32:0;;;;;;;;;;-1:-1:-1;;;;;;77937:32:0;-1:-1:-1;;;;;77937:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77937:32:0;;;;;;;;;;77995:10;77980:26;;;;:14;:26;;;;;;:31;;77937:32;;-1:-1:-1;77980:26:0;-1:-1:-1;77980:31:0;;77937:32;;77980:31;:::i;:::-;;;;-1:-1:-1;;78022:15:0;:32;;;;;;;-1:-1:-1;78022:32:0;;;;;;;;-1:-1:-1;;;;;;78022:32:0;78043:10;78022:32;;;;;;78072:39;;;27832:25:1;;;27888:2;27873:18;;27866:60;;;;78072:39:0;;27805:18:1;78072:39:0;;;;;;;78131:10;77242:907;-1:-1:-1;;77242:907:0:o;75209:776::-;75268:13;;:17;75264:714;;75367:23;75437:3;75413:19;;75407:3;:25;;;;:::i;:::-;75394:39;;:9;:39;:::i;:::-;75393:47;;;;:::i;:::-;75367:73;-1:-1:-1;75459:19:0;;75455:193;;75499:60;66715:42;75543:15;75499:17;:60::i;:::-;75583:49;;;66715:42;28506:51:1;;28588:2;28573:18;;28566:34;;;75583:49:0;;28479:18:1;75583:49:0;;;;;;;75455:193;75664:24;75691:27;75703:15;75691:9;:27;:::i;:::-;75664:54;-1:-1:-1;75737:20:0;;75733:234;;75804:7;;75778:53;;-1:-1:-1;;;;;75804:7:0;75814:16;75778:17;:53::i;:::-;75925:7;;75909:42;;;-1:-1:-1;;;;;75925:7:0;;;28506:51:1;;28588:2;28573:18;;28566:34;;;75909:42:0;;28479:18:1;75909:42:0;28332:274:1;75733:234:0;75287:691;;75264:714;75209:776::o;90422:615::-;90539:9;90534:496;90554:30;;;90534:496;;;90606:25;90634:19;;90654:1;90634:22;;;;;;;:::i;:::-;;;;;;;;;;90671:32;90706:39;;;:20;:39;;;;;;;:67;90634:22;;-1:-1:-1;90945:73:0;;-1:-1:-1;90634:22:0;90706:67;90945:28;:73::i;:::-;90591:439;;90586:3;;;;;:::i;:::-;;;;90534:496;;47984:296;48067:7;48110:4;48067:7;48125:118;48149:5;:12;48145:1;:16;48125:118;;;48198:33;48208:12;48222:5;48228:1;48222:8;;;;;;;;:::i;:::-;;;;;;;48198:9;:33::i;:::-;48183:48;-1:-1:-1;48163:3:0;;;;:::i;:::-;;;;48125:118;;;-1:-1:-1;48260:12:0;47984:296;-1:-1:-1;;;47984:296:0:o;91182:2120::-;91344:33;91380:32;;;:20;:32;;;;;;;;-1:-1:-1;;;;;91454:35:0;;;;:26;:35;;;;;;;91441:48;;:10;:48;:::i;:::-;91429:8;:61;91425:94;;;91499:20;;-1:-1:-1;;;91499:20:0;;;;;;;;;;;91425:94;-1:-1:-1;;;;;91570:39:0;;91532:20;91570:39;;;:30;;;:39;;;;;:48;:53;:131;;;;-1:-1:-1;;;;;;91644:39:0;;;;;;:30;;;:39;;;;;:52;;;:57;91570:131;91532:180;-1:-1:-1;91729:30:0;;;91725:527;;91776:52;;91820:8;;91776:12;;:31;;:52;;91820:8;;91776:52;:::i;:::-;;;;-1:-1:-1;;;;;;;91843:39:0;;;;;;:30;;;:39;;;;;:60;;91895:8;;91843:39;:60;;91895:8;;91843:60;:::i;:::-;;;;-1:-1:-1;91725:527:0;;-1:-1:-1;91725:527:0;;-1:-1:-1;;91925:34:0;;;;91921:331;;91980:17;;92001:1;91980:22;91976:57;;92011:22;;-1:-1:-1;;;92011:22:0;;;;;;;;;;;91976:57;92096:8;92048:12;:31;;:44;;;:56;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;92119:39:0;;;;;;:30;;;:39;;;;;:52;;:64;;92175:8;;92119:39;:64;;92175:8;;92119:64;:::i;91921:331::-;92223:17;;-1:-1:-1;;;92223:17:0;;;;;;;;;;;91921:331;92268:15;92264:89;;;92300:27;;;:41;;;;;;;-1:-1:-1;92300:41:0;;;;;;;;;;-1:-1:-1;;;;;;92300:41:0;-1:-1:-1;;;;;92300:41:0;;;;;92264:89;-1:-1:-1;;;;;92363:35:0;;;;;;:26;:35;;;;;:47;;92402:8;;92363:35;:47;;92402:8;;92363:47;:::i;:::-;;;;;;;;92439:8;92421:14;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;92595:17:0;;:22;92594:49;;;;;92623:14;;92641:1;92623:19;92594:49;92590:705;;;92682:40;;92660:19;92803:22;92817:8;92682:40;92803:22;:::i;:::-;92781:44;-1:-1:-1;93058:15:0;;93054:109;;93094:53;93123:10;93135:11;93094:28;:53::i;:::-;93177:34;;;;:21;:34;;;;;;;:51;;;;;;;;;;;;;;;;93245:38;93258:11;93199;93245:12;:38::i;:::-;92645:650;;92590:705;91333:1969;;91182:2120;;;;;:::o;38999:317::-;39114:6;39089:21;:31;;39081:73;;;;-1:-1:-1;;;39081:73:0;;28813:2:1;39081:73:0;;;28795:21:1;28852:2;28832:18;;;28825:30;28891:31;28871:18;;;28864:59;28940:18;;39081:73:0;28611:353:1;39081:73:0;39168:12;39186:9;-1:-1:-1;;;;;39186:14:0;39208:6;39186:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39167:52;;;39238:7;39230:78;;;;-1:-1:-1;;;39230:78:0;;29381:2:1;39230:78:0;;;29363:21:1;29420:2;29400:18;;;29393:30;29459:34;29439:18;;;29432:62;29530:28;29510:18;;;29503:56;29576:19;;39230:78:0;29179:422:1;89469:864:0;89565:39;89607:31;;;:21;:31;;;;;;;;89565:73;;;;;;;;;;;;;;;;;;;89607:31;;89565:73;;;89607:31;89565:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89698:9;89693:633;89717:22;:29;89713:1;:33;89693:633;;;89801:10;89772:22;89795:1;89772:25;;;;;;;;:::i;:::-;;;;;;;:39;89768:547;;90162:22;90217:1;90185:22;:29;:33;;;;:::i;:::-;90162:57;;;;;;;;:::i;:::-;;;;;;;90125:21;:31;90147:8;90125:31;;;;;;;;;;;90157:1;90125:34;;;;;;;;:::i;:::-;;;;;;;;:94;;;;90238:21;:31;90260:8;90238:31;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;90294:5;;89768:547;89748:3;;;;:::i;:::-;;;;89693:633;;55422:149;55485:7;55516:1;55512;:5;:51;;55647:13;55741:15;;;55777:4;55770:15;;;55824:4;55808:21;;55512:51;;;55647:13;55741:15;;;55777:4;55770:15;;;55824:4;55808:21;;55520:20;55505:58;55422:149;-1:-1:-1;;;55422:149:0:o;64035:1363::-;64141:11;:18;;64214:48;;;;;;;;;;;;;;;;;64141:18;;64113:25;;64214:48;64141:18;;64214:48;;64141:11;:18;64214:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64432:17;64453:1;64432:22;64428:102;;-1:-1:-1;;64471:11:0;:26;;;;;;;-1:-1:-1;64471:26:0;;;;;;;-1:-1:-1;64035:1363:0:o;64428:102::-;64789:17;64807:21;64827:1;64807:17;:21;:::i;:::-;64789:40;;;;;;;;:::i;:::-;;;;;;;64778:8;:51;64774:433;;;64871:9;;64850:17;:30;64846:350;;64990:7;;64035:1363;;:::o;64846:350::-;-1:-1:-1;;65129:11:0;:26;;;;;;;-1:-1:-1;65129:26:0;;;;;;;-1:-1:-1;64035:1363:0:o;64846:350::-;65321:69;65333:8;65343;65353:17;65372;60711:22;;60744:505;60776:17;60768:5;:25;60744:505;;;60925:17;60943:5;60925:24;;;;;;;;:::i;:::-;;;;;;;60913:8;:36;60909:191;;61078:7;;;;60909:191;61131:17;61149:5;61131:24;;;;;;;;:::i;:::-;;;;;;;61120:8;:35;61116:122;;;61193:5;61176:22;;61217:5;;61116:122;60795:7;;;;:::i;:::-;;;;60744:505;;;;61307:21;61343:1;61332:8;:12;61331:70;;;;-1:-1:-1;86719:13:0;86752:31;;;:21;:31;;;;;:38;61350:50;61331:70;61307:94;;61487:22;61754:16;:67;;;;;61812:8;61775:17;61793:14;61775:33;;;;;;;;:::i;:::-;;;;;;;:45;61754:67;61748:1679;;62195:21;62215:1;62195:17;:21;:::i;:::-;62177:14;:39;62171:856;;62493:13;62509:18;:14;62526:1;62509:18;:::i;:::-;62493:34;;62488:524;62537:17;62529:5;:25;62488:524;;;62609:17;62627:9;62635:1;62627:5;:9;:::i;:::-;62609:28;;;;;;;;:::i;:::-;;;;;;;62588:11;62600:5;62588:18;;;;;;;;:::i;:::-;;;;;;;;;;:49;62826:16;:58;;;;;62875:8;62847:17;62865:5;62847:24;;;;;;;;:::i;:::-;;;;;;;:36;62826:58;62822:171;;;62933:4;62913:24;;62964:5;;62822:171;62556:7;;;;:::i;:::-;;;;62488:524;;;;62171:856;63269:17;63268:18;:53;;;;;63311:9;;63291:17;:29;63268:53;63264:152;;;63342:11;63359:17;63377:21;63397:1;63377:17;:21;:::i;:::-;63359:40;;;;;;;;:::i;:::-;;;;;;;;;;;;63342:58;;;;;;;-1:-1:-1;63342:58:0;;;;;;;;;63264:152;63591:8;63561:11;63573:14;63561:27;;;;;;;;:::i;:::-;;;;;;;;;;:38;-1:-1:-1;;;60479:3128:0;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:180:1;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;381:423::-;423:3;461:5;455:12;488:6;483:3;476:19;513:1;523:162;537:6;534:1;531:13;523:162;;;599:4;655:13;;;651:22;;645:29;627:11;;;623:20;;616:59;552:12;523:162;;;527:3;730:1;723:4;714:6;709:3;705:16;701:27;694:38;793:4;786:2;782:7;777:2;769:6;765:15;761:29;756:3;752:39;748:50;741:57;;;381:423;;;;:::o;809:668::-;937:12;;903:4;958:17;;;1024:19;;894:14;;;1052:20;;;864:3;;1121:4;;1148:21;;;;1099:2;1090:12;;;864:3;1197:201;1211:6;1208:1;1205:13;1197:201;;;1278:13;;-1:-1:-1;;;;;1274:39:1;1260:54;;1373:15;;;;1336:14;;;;1310:1;1226:9;1197:201;;;-1:-1:-1;;1434:14:1;;;1428:21;1414:12;;;;1407:43;;;;-1:-1:-1;1466:5:1;809:668;-1:-1:-1;809:668:1:o;1482:789::-;1824:4;1870:1;1866;1861:3;1857:11;1853:19;1911:2;1903:6;1899:15;1888:9;1881:34;1965:6;1958:14;1951:22;1946:2;1935:9;1931:18;1924:50;2010:3;2005:2;1994:9;1990:18;1983:31;2037:46;2078:3;2067:9;2063:19;2055:6;2037:46;:::i;:::-;2138:2;2129:6;2123:13;2119:22;2114:2;2103:9;2099:18;2092:50;2191:9;2183:6;2179:22;2173:3;2162:9;2158:19;2151:51;2219:46;2258:6;2250;2219:46;:::i;:::-;2211:54;1482:789;-1:-1:-1;;;;;;;;;1482:789:1:o;2484:220::-;2633:2;2622:9;2615:21;2596:4;2653:45;2694:2;2683:9;2679:18;2671:6;2653:45;:::i;2865:255::-;2785:12;;2773:25;;2847:4;2836:16;;;2830:23;2814:14;;;2807:47;3055:2;3040:18;;3067:47;2709:151;3125:553;3312:2;3301:9;3294:21;3387:1;3383;3378:3;3374:11;3370:19;3361:6;3355:13;3351:39;3346:2;3335:9;3331:18;3324:67;3445:2;3437:6;3433:15;3427:22;3422:2;3411:9;3407:18;3400:50;3504:2;3496:6;3492:15;3486:22;3481:2;3470:9;3466:18;3459:50;3275:4;3556:2;3548:6;3544:15;3538:22;3598:4;3591;3580:9;3576:20;3569:34;3620:52;3667:3;3656:9;3652:19;3638:12;3620:52;:::i;3683:435::-;3736:3;3774:5;3768:12;3801:6;3796:3;3789:19;3827:4;3856:2;3851:3;3847:12;3840:19;;3893:2;3886:5;3882:14;3914:1;3924:169;3938:6;3935:1;3932:13;3924:169;;;3999:13;;3987:26;;4033:12;;;;4068:15;;;;3960:1;3953:9;3924:169;;;-1:-1:-1;4109:3:1;;3683:435;-1:-1:-1;;;;;3683:435:1:o;4123:261::-;4302:2;4291:9;4284:21;4265:4;4322:56;4374:2;4363:9;4359:18;4351:6;4322:56;:::i;4389:127::-;4450:10;4445:3;4441:20;4438:1;4431:31;4481:4;4478:1;4471:15;4505:4;4502:1;4495:15;4521:257;4593:4;4587:11;;;4625:17;;-1:-1:-1;;;;;4657:34:1;;4693:22;;;4654:62;4651:88;;;4719:18;;:::i;:::-;4755:4;4748:24;4521:257;:::o;4783:253::-;4855:2;4849:9;4897:4;4885:17;;-1:-1:-1;;;;;4917:34:1;;4953:22;;;4914:62;4911:88;;;4979:18;;:::i;5041:251::-;5113:2;5107:9;5155:2;5143:15;;-1:-1:-1;;;;;5173:34:1;;5209:22;;;5170:62;5167:88;;;5235:18;;:::i;5297:275::-;5368:2;5362:9;5433:2;5414:13;;-1:-1:-1;;5410:27:1;5398:40;;-1:-1:-1;;;;;5453:34:1;;5489:22;;;5450:62;5447:88;;;5515:18;;:::i;:::-;5551:2;5544:22;5297:275;;-1:-1:-1;5297:275:1:o;5577:531::-;5620:5;5673:3;5666:4;5658:6;5654:17;5650:27;5640:55;;5691:1;5688;5681:12;5640:55;5727:6;5714:20;-1:-1:-1;;;;;5749:2:1;5746:26;5743:52;;;5775:18;;:::i;:::-;5819:55;5862:2;5843:13;;-1:-1:-1;;5839:27:1;5868:4;5835:38;5819:55;:::i;:::-;5899:2;5890:7;5883:19;5945:3;5938:4;5933:2;5925:6;5921:15;5917:26;5914:35;5911:55;;;5962:1;5959;5952:12;5911:55;6027:2;6020:4;6012:6;6008:17;6001:4;5992:7;5988:18;5975:55;6075:1;6050:16;;;6068:4;6046:27;6039:38;;;;6054:7;5577:531;-1:-1:-1;;;5577:531:1:o;6113:390::-;6191:6;6199;6252:2;6240:9;6231:7;6227:23;6223:32;6220:52;;;6268:1;6265;6258:12;6220:52;6304:9;6291:23;6281:33;;6365:2;6354:9;6350:18;6337:32;-1:-1:-1;;;;;6384:6:1;6381:30;6378:50;;;6424:1;6421;6414:12;6378:50;6447;6489:7;6480:6;6469:9;6465:22;6447:50;:::i;:::-;6437:60;;;6113:390;;;;;:::o;6508:131::-;-1:-1:-1;;;;;6583:31:1;;6573:42;;6563:70;;6629:1;6626;6619:12;6644:367;6707:8;6717:6;6771:3;6764:4;6756:6;6752:17;6748:27;6738:55;;6789:1;6786;6779:12;6738:55;-1:-1:-1;6812:20:1;;-1:-1:-1;;;;;6844:30:1;;6841:50;;;6887:1;6884;6877:12;6841:50;6924:4;6916:6;6912:17;6900:29;;6984:3;6977:4;6967:6;6964:1;6960:14;6952:6;6948:27;6944:38;6941:47;6938:67;;;7001:1;6998;6991:12;7016:572;7111:6;7119;7127;7180:2;7168:9;7159:7;7155:23;7151:32;7148:52;;;7196:1;7193;7186:12;7148:52;7235:9;7222:23;7254:31;7279:5;7254:31;:::i;:::-;7304:5;-1:-1:-1;7360:2:1;7345:18;;7332:32;-1:-1:-1;;;;;7376:30:1;;7373:50;;;7419:1;7416;7409:12;7373:50;7458:70;7520:7;7511:6;7500:9;7496:22;7458:70;:::i;:::-;7016:572;;7547:8;;-1:-1:-1;7432:96:1;;-1:-1:-1;;;;7016:572:1:o;7593:658::-;7764:2;7816:21;;;7886:13;;7789:18;;;7908:22;;;7735:4;;7764:2;7987:15;;;;7961:2;7946:18;;;7735:4;8030:195;8044:6;8041:1;8038:13;8030:195;;;8109:13;;-1:-1:-1;;;;;8105:39:1;8093:52;;8200:15;;;;8165:12;;;;8141:1;8059:9;8030:195;;;-1:-1:-1;8242:3:1;;7593:658;-1:-1:-1;;;;;;7593:658:1:o;8256:160::-;8321:20;;8377:13;;8370:21;8360:32;;8350:60;;8406:1;8403;8396:12;8350:60;8256:160;;;:::o;8421:709::-;8531:6;8539;8547;8555;8563;8616:3;8604:9;8595:7;8591:23;8587:33;8584:53;;;8633:1;8630;8623:12;8584:53;8672:9;8659:23;8691:31;8716:5;8691:31;:::i;:::-;8741:5;-1:-1:-1;8793:2:1;8778:18;;8765:32;;-1:-1:-1;8848:2:1;8833:18;;8820:32;-1:-1:-1;;;;;8864:30:1;;8861:50;;;8907:1;8904;8897:12;8861:50;8946:70;9008:7;8999:6;8988:9;8984:22;8946:70;:::i;:::-;9035:8;;-1:-1:-1;8920:96:1;-1:-1:-1;9089:35:1;;-1:-1:-1;9120:2:1;9105:18;;9089:35;:::i;:::-;9079:45;;8421:709;;;;;;;;:::o;9327:1003::-;9415:6;9468:2;9456:9;9447:7;9443:23;9439:32;9436:52;;;9484:1;9481;9474:12;9436:52;9524:9;9511:23;-1:-1:-1;;;;;9594:2:1;9586:6;9583:14;9580:34;;;9610:1;9607;9600:12;9580:34;9633:22;;;;9689:4;9671:16;;;9667:27;9664:47;;;9707:1;9704;9697:12;9664:47;9740:2;9734:9;9782:4;9774:6;9770:17;9837:6;9825:10;9822:22;9817:2;9805:10;9802:18;9799:46;9796:72;;;9848:18;;:::i;:::-;9884:2;9877:22;9921:16;;9946:31;9921:16;9946:31;:::i;:::-;10001:5;9993:6;9986:21;;10061:2;10057;10053:11;10040:25;10035:2;10027:6;10023:15;10016:50;10120:2;10116;10112:11;10099:25;10094:2;10086:6;10082:15;10075:50;10171:2;10167;10163:11;10150:25;10200:2;10190:8;10187:16;10184:36;;;10216:1;10213;10206:12;10184:36;10253:45;10290:7;10279:8;10275:2;10271:17;10253:45;:::i;:::-;10248:2;10236:15;;10229:70;-1:-1:-1;10240:6:1;9327:1003;-1:-1:-1;;;;;9327:1003:1:o;10335:156::-;10401:20;;10461:4;10450:16;;10440:27;;10430:55;;10481:1;10478;10471:12;10496:713;10616:6;10624;10632;10640;10648;10656;10709:3;10697:9;10688:7;10684:23;10680:33;10677:53;;;10726:1;10723;10716:12;10677:53;10762:9;10749:23;10739:33;;10791:36;10823:2;10812:9;10808:18;10791:36;:::i;:::-;10781:46;;10874:2;10863:9;10859:18;10846:32;10836:42;;10925:2;10914:9;10910:18;10897:32;10887:42;;10980:3;10969:9;10965:19;10952:33;-1:-1:-1;;;;;11000:6:1;10997:30;10994:50;;;11040:1;11037;11030:12;10994:50;11079:70;11141:7;11132:6;11121:9;11117:22;11079:70;:::i;:::-;10496:713;;;;-1:-1:-1;10496:713:1;;-1:-1:-1;10496:713:1;;11168:8;;10496:713;-1:-1:-1;;;10496:713:1:o;11214:183::-;11274:4;-1:-1:-1;;;;;11299:6:1;11296:30;11293:56;;;11329:18;;:::i;:::-;-1:-1:-1;11374:1:1;11370:14;11386:4;11366:25;;11214:183::o;11402:1048::-;11461:5;11509:4;11497:9;11492:3;11488:19;11484:30;11481:50;;;11527:1;11524;11517:12;11481:50;11549:22;;:::i;:::-;11540:31;;11607:9;11594:23;-1:-1:-1;;;;;11632:6:1;11629:30;11626:50;;;11672:1;11669;11662:12;11626:50;11695:22;;11748:4;11740:13;;11736:23;-1:-1:-1;11726:51:1;;11773:1;11770;11763:12;11726:51;11809:2;11796:16;11831:4;11855:60;11871:43;11911:2;11871:43;:::i;:::-;11855:60;:::i;:::-;11949:15;;;12031:1;12027:10;;;;12019:19;;12015:28;;;11980:12;;;;12055:15;;;12052:35;;;12083:1;12080;12073:12;12052:35;12107:11;;;;12127:223;12143:6;12138:3;12135:15;12127:223;;;12225:3;12212:17;12242:33;12267:7;12242:33;:::i;:::-;12288:20;;12160:12;;;;12328;;;;12127:223;;;12359:20;;-1:-1:-1;12424:18:1;;;12411:32;12395:14;;;12388:56;;;;-1:-1:-1;12366:5:1;11402:1048;-1:-1:-1;;11402:1048:1:o;12455:1067::-;12514:5;12553:9;12548:3;12544:19;12583:4;12579:2;12575:13;12572:33;;;12601:1;12598;12591:12;12572:33;12623:22;;:::i;:::-;12614:31;;12682:9;12669:23;12701:33;12726:7;12701:33;:::i;:::-;12743:22;;12797:35;12828:2;12813:18;;12797:35;:::i;:::-;12792:2;12785:5;12781:14;12774:59;12884:2;12873:9;12869:18;12856:32;-1:-1:-1;;;;;12948:2:1;12940:6;12937:14;12934:34;;;12964:1;12961;12954:12;12934:34;13000:46;13042:3;13033:6;13022:9;13018:22;13000:46;:::i;:::-;12995:2;12984:14;;12977:70;13081:2;-1:-1:-1;;13063:16:1;;13059:25;13056:45;;;13097:1;13094;13087:12;13056:45;13125:22;;:::i;:::-;13110:37;;13199:2;13188:9;13184:18;13171:32;13156:47;;13212:33;13237:7;13212:33;:::i;:::-;13270:7;13261;13254:24;13310:7;13305:2;13298:5;13294:14;13287:31;13371:3;13360:9;13356:19;13343:33;13327:49;;13401:2;13391:8;13388:16;13385:36;;;13417:1;13414;13407:12;13385:36;;;13454:61;13511:3;13500:8;13489:9;13485:24;13454:61;:::i;:::-;13448:3;13441:5;13437:15;13430:86;;12455:1067;;;;:::o;13527:355::-;13616:6;13669:2;13657:9;13648:7;13644:23;13640:32;13637:52;;;13685:1;13682;13675:12;13637:52;13725:9;13712:23;-1:-1:-1;;;;;13750:6:1;13747:30;13744:50;;;13790:1;13787;13780:12;13744:50;13813:63;13868:7;13859:6;13848:9;13844:22;13813:63;:::i;13887:161::-;13952:5;13997:3;13988:6;13983:3;13979:16;13975:26;13972:46;;;14014:1;14011;14004:12;13972:46;-1:-1:-1;14036:6:1;13887:161;-1:-1:-1;13887:161:1:o;14053:366::-;14144:6;14197:2;14185:9;14176:7;14172:23;14168:32;14165:52;;;14213:1;14210;14203:12;14165:52;14253:9;14240:23;-1:-1:-1;;;;;14278:6:1;14275:30;14272:50;;;14318:1;14315;14308:12;14272:50;14341:72;14405:7;14396:6;14385:9;14381:22;14341:72;:::i;14424:903::-;14700:4;14729:2;14758;14747:9;14740:21;14784:56;14836:2;14825:9;14821:18;14813:6;14784:56;:::i;:::-;14897:22;;;14859:2;14877:18;;;14870:50;;;;14969:13;;14991:22;;;15067:15;;;;15029;;;15100:1;15110:191;15124:6;15121:1;15118:13;15110:191;;;15173:48;15217:3;15208:6;15202:13;2785:12;;2773:25;;2847:4;2836:16;;;2830:23;2814:14;;2807:47;2709:151;15173:48;15276:15;;;;15241:12;;;;15146:1;15139:9;15110:191;;;-1:-1:-1;15318:3:1;;14424:903;-1:-1:-1;;;;;;;;14424:903:1:o;15332:640::-;15436:6;15444;15452;15460;15513:2;15501:9;15492:7;15488:23;15484:32;15481:52;;;15529:1;15526;15519:12;15481:52;15568:9;15555:23;15587:31;15612:5;15587:31;:::i;:::-;15637:5;-1:-1:-1;15689:2:1;15674:18;;15661:32;;-1:-1:-1;15744:2:1;15729:18;;15716:32;-1:-1:-1;;;;;15760:30:1;;15757:50;;;15803:1;15800;15793:12;15757:50;15842:70;15904:7;15895:6;15884:9;15880:22;15842:70;:::i;:::-;15332:640;;;;-1:-1:-1;15931:8:1;-1:-1:-1;;;;15332:640:1:o;16415:318::-;16490:6;16498;16506;16559:2;16547:9;16538:7;16534:23;16530:32;16527:52;;;16575:1;16572;16565:12;16527:52;16611:9;16598:23;16588:33;;16640:36;16672:2;16661:9;16657:18;16640:36;:::i;:::-;16630:46;;16723:2;16712:9;16708:18;16695:32;16685:42;;16415:318;;;;;:::o;16738:315::-;16806:6;16814;16867:2;16855:9;16846:7;16842:23;16838:32;16835:52;;;16883:1;16880;16873:12;16835:52;16919:9;16906:23;16896:33;;16979:2;16968:9;16964:18;16951:32;16992:31;17017:5;16992:31;:::i;:::-;17042:5;17032:15;;;16738:315;;;;;:::o;17058:248::-;17126:6;17134;17187:2;17175:9;17166:7;17162:23;17158:32;17155:52;;;17203:1;17200;17193:12;17155:52;-1:-1:-1;;17226:23:1;;;17296:2;17281:18;;;17268:32;;-1:-1:-1;17058:248:1:o;17311:247::-;17370:6;17423:2;17411:9;17402:7;17398:23;17394:32;17391:52;;;17439:1;17436;17429:12;17391:52;17478:9;17465:23;17497:31;17522:5;17497:31;:::i;17801:461::-;18063:1;18059;18054:3;18050:11;18046:19;18038:6;18034:32;18023:9;18016:51;18103:6;18098:2;18087:9;18083:18;18076:34;18146:6;18141:2;18130:9;18126:18;18119:34;18189:3;18184:2;18173:9;18169:18;18162:31;17997:4;18210:46;18251:3;18240:9;18236:19;18228:6;18210:46;:::i;:::-;18202:54;17801:461;-1:-1:-1;;;;;;17801:461:1:o;18267:891::-;18351:6;18382:2;18425;18413:9;18404:7;18400:23;18396:32;18393:52;;;18441:1;18438;18431:12;18393:52;18481:9;18468:23;-1:-1:-1;;;;;18506:6:1;18503:30;18500:50;;;18546:1;18543;18536:12;18500:50;18569:22;;18622:4;18614:13;;18610:27;-1:-1:-1;18600:55:1;;18651:1;18648;18641:12;18600:55;18687:2;18674:16;18710:60;18726:43;18766:2;18726:43;:::i;18710:60::-;18804:15;;;18886:1;18882:10;;;;18874:19;;18870:28;;;18835:12;;;;18910:19;;;18907:39;;;18942:1;18939;18932:12;18907:39;18966:11;;;;18986:142;19002:6;18997:3;18994:15;18986:142;;;19068:17;;19056:30;;19019:12;;;;19106;;;;18986:142;;;19147:5;18267:891;-1:-1:-1;;;;;;;18267:891:1:o;19345:702::-;19472:6;19480;19488;19541:2;19529:9;19520:7;19516:23;19512:32;19509:52;;;19557:1;19554;19547:12;19509:52;19597:9;19584:23;-1:-1:-1;;;;;19667:2:1;19659:6;19656:14;19653:34;;;19683:1;19680;19673:12;19653:34;19706:72;19770:7;19761:6;19750:9;19746:22;19706:72;:::i;:::-;19696:82;;19831:2;19820:9;19816:18;19803:32;19787:48;;19860:2;19850:8;19847:16;19844:36;;;19876:1;19873;19866:12;19844:36;;19915:72;19979:7;19968:8;19957:9;19953:24;19915:72;:::i;20052:127::-;20113:10;20108:3;20104:20;20101:1;20094:31;20144:4;20141:1;20134:15;20168:4;20165:1;20158:15;20184:248;20333:2;20318:18;;20366:1;20355:13;;20345:47;;20372:18;;:::i;:::-;20401:25;;;20184:248;:::o;20437:813::-;20626:2;20615:9;20608:21;20589:4;20665:1;20661;20656:3;20652:11;20648:19;20722:2;20713:6;20707:13;20703:22;20698:2;20687:9;20683:18;20676:50;20794:2;20786:6;20782:15;20776:22;20769:30;20762:38;20757:2;20746:9;20742:18;20735:66;20848:2;20840:6;20836:15;20830:22;20888:4;20883:2;20872:9;20868:18;20861:32;20916:52;20963:3;20952:9;20948:19;20934:12;20916:52;:::i;:::-;20902:66;;21040:2;21033;21025:6;21021:15;21015:22;21009:29;21005:38;20999:3;20988:9;20984:19;20977:67;21093:3;21085:6;21081:16;21075:23;21053:45;;21168:2;21164:7;21152:9;21144:6;21140:22;21136:36;21129:4;21118:9;21114:20;21107:66;21190:54;21237:6;21221:14;21190:54;:::i;21255:437::-;21341:6;21349;21402:2;21390:9;21381:7;21377:23;21373:32;21370:52;;;21418:1;21415;21408:12;21370:52;21458:9;21445:23;-1:-1:-1;;;;;21483:6:1;21480:30;21477:50;;;21523:1;21520;21513:12;21477:50;21562:70;21624:7;21615:6;21604:9;21600:22;21562:70;:::i;:::-;21651:8;;21536:96;;-1:-1:-1;21255:437:1;-1:-1:-1;;;;21255:437:1:o;21971:380::-;22050:1;22046:12;;;;22093;;;22114:61;;22168:4;22160:6;22156:17;22146:27;;22114:61;22221:2;22213:6;22210:14;22190:18;22187:38;22184:161;;22267:10;22262:3;22258:20;22255:1;22248:31;22302:4;22299:1;22292:15;22330:4;22327:1;22320:15;22482:545;22584:2;22579:3;22576:11;22573:448;;;22620:1;22645:5;22641:2;22634:17;22690:4;22686:2;22676:19;22760:2;22748:10;22744:19;22741:1;22737:27;22731:4;22727:38;22796:4;22784:10;22781:20;22778:47;;;-1:-1:-1;22819:4:1;22778:47;22874:2;22869:3;22865:12;22862:1;22858:20;22852:4;22848:31;22838:41;;22929:82;22947:2;22940:5;22937:13;22929:82;;;22992:17;;;22973:1;22962:13;22929:82;;;22933:3;;;22482:545;;;:::o;23203:1352::-;23329:3;23323:10;-1:-1:-1;;;;;23348:6:1;23345:30;23342:56;;;23378:18;;:::i;:::-;23407:97;23497:6;23457:38;23489:4;23483:11;23457:38;:::i;:::-;23451:4;23407:97;:::i;:::-;23559:4;;23623:2;23612:14;;23640:1;23635:663;;;;24342:1;24359:6;24356:89;;;-1:-1:-1;24411:19:1;;;24405:26;24356:89;-1:-1:-1;;23160:1:1;23156:11;;;23152:24;23148:29;23138:40;23184:1;23180:11;;;23135:57;24458:81;;23605:944;;23635:663;22429:1;22422:14;;;22466:4;22453:18;;-1:-1:-1;;23671:20:1;;;23789:236;23803:7;23800:1;23797:14;23789:236;;;23892:19;;;23886:26;23871:42;;23984:27;;;;23952:1;23940:14;;;;23819:19;;23789:236;;;23793:3;24053:6;24044:7;24041:19;24038:201;;;24114:19;;;24108:26;-1:-1:-1;;24197:1:1;24193:14;;;24209:3;24189:24;24185:37;24181:42;24166:58;24151:74;;24038:201;-1:-1:-1;;;;;24285:1:1;24269:14;;;24265:22;24252:36;;-1:-1:-1;23203:1352:1:o;24560:127::-;24621:10;24616:3;24612:20;24609:1;24602:31;24652:4;24649:1;24642:15;24676:4;24673:1;24666:15;24692:125;24757:9;;;24778:10;;;24775:36;;;24791:18;;:::i;25121:208::-;25233:9;25270:53;25308:14;25301:5;25270:53;:::i;25334:127::-;25395:10;25390:3;25386:20;25383:1;25376:31;25426:4;25423:1;25416:15;25450:4;25447:1;25440:15;25466:135;25505:3;25526:17;;;25523:43;;25546:18;;:::i;:::-;-1:-1:-1;25593:1:1;25582:13;;25466:135::o;25606:128::-;25673:9;;;25694:11;;;25691:37;;;25708:18;;:::i;25739:655::-;25907:2;25959:21;;;26029:13;;25932:18;;;26051:22;;;25878:4;26116:17;;;26156:16;;;25878:4;;25907:2;26104;26089:18;;;25878:4;26200:168;26214:6;26211:1;26208:13;26200:168;;;26275:13;;26263:26;;26356:1;26344:14;;;;26309:12;;;;26229:9;26200:168;;27077:245;27223:2;27208:18;;27256:1;27245:13;;27235:47;;27262:18;;:::i;27937:168::-;28010:9;;;28041;;28058:15;;;28052:22;;28038:37;28028:71;;28079:18;;:::i;28110:217::-;28150:1;28176;28166:132;;28220:10;28215:3;28211:20;28208:1;28201:31;28255:4;28252:1;28245:15;28283:4;28280:1;28273:15;28166:132;-1:-1:-1;28312:9:1;;28110:217::o;29606:127::-;29667:10;29662:3;29658:20;29655:1;29648:31;29698:4;29695:1;29688:15;29722:4;29719:1;29712:15
Swarm Source
ipfs://4542e8389da7e513dbabe17e3685d7f8b36e8414b2c252693e060b1551b9aa3a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.