@dolomite-exchange/dolomite-margin 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/build/contracts/Account.json +11 -11
  2. package/build/contracts/Actions.json +11 -11
  3. package/build/contracts/Address.json +1 -1
  4. package/build/contracts/Admin.json +23 -23
  5. package/build/contracts/AdminImpl.json +35 -307
  6. package/build/contracts/AdvancedMath.json +7 -7
  7. package/build/contracts/AmmRebalancerProxy.json +577 -621
  8. package/build/contracts/AmmRebalancerProxyV1.json +78 -32
  9. package/build/contracts/Babylonian.json +1 -1
  10. package/build/contracts/Bits.json +9 -9
  11. package/build/contracts/Cache.json +13 -13
  12. package/build/contracts/ChainlinkPriceOracleV1.json +16 -16
  13. package/build/contracts/Context.json +1 -1
  14. package/build/contracts/CustomTestToken.json +9 -9
  15. package/build/contracts/Decimal.json +9 -9
  16. package/build/contracts/DelayedMultiSig.json +9 -9
  17. package/build/contracts/DolomiteAmmERC20.json +11 -11
  18. package/build/contracts/DolomiteAmmFactory.json +14 -52
  19. package/build/contracts/DolomiteAmmLibrary.json +24 -24
  20. package/build/contracts/DolomiteAmmPair.json +27 -27
  21. package/build/contracts/DolomiteAmmRouterProxy.json +30 -363
  22. package/build/contracts/DolomiteMargin.json +21 -67
  23. package/build/contracts/DoubleExponentInterestSetter.json +15 -21
  24. package/build/contracts/EnumerableSet.json +7 -7
  25. package/build/contracts/ErroringOmiseToken.json +9 -9
  26. package/build/contracts/ErroringToken.json +10 -10
  27. package/build/contracts/Events.json +17 -17
  28. package/build/contracts/ExcessivelySafeCall.json +35 -35
  29. package/build/contracts/Exchange.json +15 -15
  30. package/build/contracts/Expiry.json +36 -36
  31. package/build/contracts/Getters.json +33 -33
  32. package/build/contracts/IAutoTrader.json +9 -9
  33. package/build/contracts/ICallee.json +7 -7
  34. package/build/contracts/IChainlinkAggregator.json +5 -5
  35. package/build/contracts/IDolomiteAmmERC20.json +5 -5
  36. package/build/contracts/IDolomiteAmmFactory.json +9 -9
  37. package/build/contracts/IDolomiteAmmPair.json +9 -9
  38. package/build/contracts/IDolomiteMargin.json +23 -23
  39. package/build/contracts/IERC20.json +1 -1
  40. package/build/contracts/IERC20Detailed.json +5 -5
  41. package/build/contracts/IExchangeWrapper.json +5 -5
  42. package/build/contracts/IExpiry.json +9 -9
  43. package/build/contracts/IInterestSetter.json +7 -7
  44. package/build/contracts/ILiquidationCallback.json +7 -7
  45. package/build/contracts/IMakerOracle.json +5 -5
  46. package/build/contracts/IOasisDex.json +5 -5
  47. package/build/contracts/IPriceOracle.json +7 -7
  48. package/build/contracts/IRecyclable.json +9 -9
  49. package/build/contracts/ITransferProxy.json +5 -5
  50. package/build/contracts/IUniswapV2Callee.json +5 -5
  51. package/build/contracts/IUniswapV2Factory.json +5 -5
  52. package/build/contracts/IUniswapV2Pair.json +5 -5
  53. package/build/contracts/IUniswapV2Router.json +5 -5
  54. package/build/contracts/IWETH.json +5 -5
  55. package/build/contracts/Interest.json +15 -15
  56. package/build/contracts/LiquidateOrVaporizeImpl.json +32 -83
  57. package/build/contracts/LiquidatorProxyHelper.json +23 -23
  58. package/build/contracts/LiquidatorProxyV1.json +30 -36
  59. package/build/contracts/LiquidatorProxyV1WithAmm.json +49 -105
  60. package/build/contracts/Math.json +1 -1
  61. package/build/contracts/Migrations.json +8 -14
  62. package/build/contracts/Monetary.json +7 -7
  63. package/build/contracts/MultiCall.json +8 -14
  64. package/build/contracts/MultiSig.json +7 -7
  65. package/build/contracts/OmiseToken.json +8 -8
  66. package/build/contracts/OnlyDolomiteMargin.json +11 -11
  67. package/build/contracts/Operation.json +15 -15
  68. package/build/contracts/OperationImpl.json +39 -47
  69. package/build/contracts/Ownable.json +1 -1
  70. package/build/contracts/PartiallyDelayedMultiSig.json +9 -9
  71. package/build/contracts/PayableProxy.json +17 -23
  72. package/build/contracts/Permission.json +11 -11
  73. package/build/contracts/PolynomialInterestSetter.json +13 -13
  74. package/build/contracts/RecyclableTokenProxy.json +25 -25
  75. package/build/contracts/ReentrancyGuard.json +1 -1
  76. package/build/contracts/Require.json +7 -7
  77. package/build/contracts/SafeERC20.json +1 -1
  78. package/build/contracts/SafeETH.json +7 -7
  79. package/build/contracts/SafeLiquidationCallback.json +17 -17
  80. package/build/contracts/SafeMath.json +1 -1
  81. package/build/contracts/SignedOperationProxy.json +21 -104
  82. package/build/contracts/SimpleFeeOwner.json +18 -63
  83. package/build/contracts/State.json +9 -9
  84. package/build/contracts/Storage.json +37 -37
  85. package/build/contracts/TestAmmRebalancerProxy.json +32 -58
  86. package/build/contracts/TestAutoTrader.json +22 -22
  87. package/build/contracts/TestBtcUsdChainlinkAggregator.json +10 -10
  88. package/build/contracts/TestCallee.json +19 -19
  89. package/build/contracts/TestChainlinkPriceOracleV1.json +10 -94
  90. package/build/contracts/TestCounter.json +7 -7
  91. package/build/contracts/TestDaiUsdChainlinkAggregator.json +11 -11
  92. package/build/contracts/TestDolomiteMargin.json +22 -22
  93. package/build/contracts/TestDoubleExponentInterestSetter.json +10 -10
  94. package/build/contracts/TestEthUsdChainlinkAggregator.json +11 -11
  95. package/build/contracts/TestExchangeWrapper.json +28 -28
  96. package/build/contracts/TestInterestSetter.json +13 -13
  97. package/build/contracts/TestLib.json +22 -22
  98. package/build/contracts/TestLinkUsdChainlinkAggregator.json +11 -11
  99. package/build/contracts/TestLiquidateCallback.json +719 -719
  100. package/build/contracts/TestLiquidationCallback.json +13 -13
  101. package/build/contracts/TestLrcEthChainlinkAggregator.json +11 -11
  102. package/build/contracts/TestMakerOracle.json +10 -10
  103. package/build/contracts/TestMaticUsdChainlinkAggregator.json +10 -10
  104. package/build/contracts/TestOasisDex.json +12 -12
  105. package/build/contracts/TestOperationImpl.json +14 -14
  106. package/build/contracts/TestPolynomialInterestSetter.json +10 -10
  107. package/build/contracts/TestPriceAggregator.json +9 -9
  108. package/build/contracts/TestPriceOracle.json +13 -13
  109. package/build/contracts/TestRecyclableToken.json +9 -9
  110. package/build/contracts/TestSimpleCallee.json +15 -15
  111. package/build/contracts/TestToken.json +9 -9
  112. package/build/contracts/TestTrader.json +17 -17
  113. package/build/contracts/TestUniswapAmmRebalancerProxy.json +16 -16
  114. package/build/contracts/TestUsdcUsdChainlinkAggregator.json +11 -11
  115. package/build/contracts/TestWETH.json +9 -9
  116. package/build/contracts/Time.json +9 -9
  117. package/build/contracts/Token.json +9 -9
  118. package/build/contracts/TokenA.json +10 -10
  119. package/build/contracts/TokenB.json +10 -10
  120. package/build/contracts/TokenC.json +10 -10
  121. package/build/contracts/TokenD.json +10 -10
  122. package/build/contracts/TokenE.json +10 -10
  123. package/build/contracts/TokenF.json +10 -10
  124. package/build/contracts/TransferProxy.json +22 -28
  125. package/build/contracts/TypedSignature.json +9 -9
  126. package/build/contracts/Types.json +9 -9
  127. package/build/contracts/UQ112x112.json +7 -7
  128. package/build/contracts/UniswapV2ERC20.json +7 -7
  129. package/build/contracts/UniswapV2Factory.json +12 -12
  130. package/build/contracts/UniswapV2Library.json +20 -20
  131. package/build/contracts/UniswapV2Pair.json +17 -17
  132. package/build/contracts/UniswapV2Router02.json +16 -16
  133. package/build/contracts/WETH9.json +1 -1
  134. package/contracts/external/amm/DolomiteAmmERC20.sol +135 -0
  135. package/contracts/external/amm/DolomiteAmmFactory.sol +122 -0
  136. package/contracts/external/amm/DolomiteAmmPair.sol +573 -0
  137. package/contracts/external/amm/SimpleFeeOwner.sol +107 -0
  138. package/contracts/external/helpers/LiquidatorProxyHelper.sol +252 -0
  139. package/contracts/external/helpers/OnlyDolomiteMargin.sol +63 -0
  140. package/contracts/external/interestsetters/DoubleExponentInterestSetter.sol +212 -0
  141. package/contracts/external/interestsetters/PolynomialInterestSetter.sol +205 -0
  142. package/contracts/external/interfaces/IChainlinkAggregator.sol +33 -0
  143. package/contracts/external/interfaces/IDolomiteAmmERC20.sol +52 -0
  144. package/contracts/external/interfaces/IDolomiteAmmFactory.sol +42 -0
  145. package/contracts/external/interfaces/IDolomiteAmmPair.sol +116 -0
  146. package/contracts/external/interfaces/IExpiry.sol +70 -0
  147. package/contracts/external/interfaces/IMakerOracle.sol +52 -0
  148. package/contracts/external/interfaces/IOasisDex.sol +326 -0
  149. package/contracts/external/interfaces/ITransferProxy.sol +53 -0
  150. package/contracts/external/interfaces/IUniswapV2Router.sol +134 -0
  151. package/contracts/external/lib/AdvancedMath.sol +23 -0
  152. package/contracts/external/lib/DolomiteAmmLibrary.sol +323 -0
  153. package/contracts/external/lib/TypedSignature.sol +120 -0
  154. package/contracts/external/lib/UQ112x112.sol +22 -0
  155. package/contracts/external/multisig/DelayedMultiSig.sol +206 -0
  156. package/contracts/external/multisig/MultiSig.sol +571 -0
  157. package/contracts/external/multisig/PartiallyDelayedMultiSig.sol +174 -0
  158. package/contracts/external/oracles/ChainlinkPriceOracleV1.sol +197 -0
  159. package/contracts/external/oracles/TestChainlinkPriceOracleV1.sol +98 -0
  160. package/contracts/external/proxies/AmmRebalancerProxyV1.sol +465 -0
  161. package/contracts/external/proxies/DolomiteAmmRouterProxy.sol +877 -0
  162. package/contracts/external/proxies/LiquidatorProxyV1.sol +507 -0
  163. package/contracts/external/proxies/LiquidatorProxyV1WithAmm.sol +574 -0
  164. package/contracts/external/proxies/PayableProxy.sol +146 -0
  165. package/contracts/external/proxies/RecyclableTokenProxy.sol +463 -0
  166. package/contracts/external/proxies/SignedOperationProxy.sol +553 -0
  167. package/contracts/external/proxies/TransferProxy.sol +207 -0
  168. package/contracts/external/traders/Expiry.sol +532 -0
  169. package/contracts/external/uniswap-v2/UniswapV2ERC20.sol +118 -0
  170. package/contracts/external/uniswap-v2/UniswapV2Factory.sol +67 -0
  171. package/contracts/external/uniswap-v2/UniswapV2Pair.sol +283 -0
  172. package/contracts/external/uniswap-v2/UniswapV2Router02.sol +566 -0
  173. package/contracts/external/uniswap-v2/interfaces/IUniswapV2Callee.sol +13 -0
  174. package/contracts/external/uniswap-v2/interfaces/IUniswapV2Factory.sol +18 -0
  175. package/contracts/external/uniswap-v2/interfaces/IUniswapV2Pair.sol +67 -0
  176. package/contracts/external/uniswap-v2/interfaces/IWETH.sol +7 -0
  177. package/contracts/external/uniswap-v2/libraries/SafeETH.sol +29 -0
  178. package/contracts/external/uniswap-v2/libraries/UniswapV2Library.sol +117 -0
  179. package/contracts/external/utils/MultiCall.sol +95 -0
  180. package/contracts/protocol/impl/artifacts/OperationImpl.json +80 -0
  181. package/contracts/protocol/impl/artifacts/OperationImpl_metadata.json +193 -0
  182. package/dist/build/published_contracts/AdminImpl.json +2 -2
  183. package/dist/build/published_contracts/AmmRebalancerProxyV1.json +5 -0
  184. package/dist/build/published_contracts/ChainlinkPriceOracleV1.json +1 -1
  185. package/dist/build/published_contracts/DolomiteAmmFactory.json +1 -1
  186. package/dist/build/published_contracts/DolomiteAmmRouterProxy.json +1 -1
  187. package/dist/build/published_contracts/DoubleExponentInterestSetter.json +2 -2
  188. package/dist/build/published_contracts/Expiry.json +1 -1
  189. package/dist/build/published_contracts/LiquidatorProxyV1.json +1 -1
  190. package/dist/build/published_contracts/LiquidatorProxyV1WithAmm.json +1 -1
  191. package/dist/build/published_contracts/MultiCall.json +1 -1
  192. package/dist/build/published_contracts/PayableProxy.json +2 -2
  193. package/dist/build/published_contracts/SignedOperationProxy.json +2 -2
  194. package/dist/build/published_contracts/SimpleFeeOwner.json +1 -1
  195. package/dist/build/published_contracts/TestUniswapAmmRebalancerProxy.json +140 -0
  196. package/dist/build/published_contracts/TransferProxy.json +1 -1
  197. package/dist/src/lib/Contracts.d.ts +3 -1
  198. package/dist/src/lib/Contracts.js +7 -3
  199. package/dist/src/lib/Contracts.js.map +1 -1
  200. package/package.json +2 -1
@@ -1459,15 +1459,15 @@
1459
1459
  "type": "function"
1460
1460
  }
1461
1461
  ],
1462
- "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"baseToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"quoteToken\",\"type\":\"address\"}],\"name\":\"LogAddTokenPairWhitelist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"pair\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"maker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"pay_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"buy_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"LogBump\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"name\":\"LogBuyEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"keeper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogDelete\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"keeper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogInsert\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogItemUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"pair\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"maker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"pay_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"buy_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"LogKill\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"pair\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"maker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"pay_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"buy_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"LogMake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"name\":\"LogMatchingEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"min_amount\",\"type\":\"uint256\"}],\"name\":\"LogMinSell\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"baseToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"quoteToken\",\"type\":\"address\"}],\"name\":\"LogRemTokenPairWhitelist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogSortedOffer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"pair\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"maker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"taker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"take_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"give_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"LogTake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"}],\"name\":\"LogTrade\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogUnsortedOffer\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_best\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_dust\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_near\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_rank\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"next\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prev\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"delb\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_span\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id_\",\"type\":\"bytes32\"}],\"name\":\"bump\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"buy\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"max_fill_amount\",\"type\":\"uint256\"}],\"name\":\"buyAllAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fill_amt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"buyEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"cancel\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"del_rank\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dustId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"sell_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"}],\"name\":\"getBestOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getBetterOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"}],\"name\":\"getBuyAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fill_amt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getFirstUnsortedOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"}],\"name\":\"getMinSell\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getNextUnsortedOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"sell_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"}],\"name\":\"getOfferCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"}],\"name\":\"getPayAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fill_amt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getTime\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getWorseOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pos\",\"type\":\"uint256\"}],\"name\":\"insert\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"isActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isClosed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"closed\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"isOfferSorted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"kill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"last_offer_id\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"pay_amt\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"buy_amt\",\"type\":\"uint128\"}],\"name\":\"make\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"matchingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pos\",\"type\":\"uint256\"}],\"name\":\"offer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pos\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"rounding\",\"type\":\"bool\"}],\"name\":\"offer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"}],\"name\":\"offer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"offers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"min_fill_amount\",\"type\":\"uint256\"}],\"name\":\"sellAllAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fill_amt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bool\",\"name\":\"buyEnabled_\",\"type\":\"bool\"}],\"name\":\"setBuyEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bool\",\"name\":\"matchingEnabled_\",\"type\":\"bool\"}],\"name\":\"setMatchingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"dust\",\"type\":\"uint256\"}],\"name\":\"setMinSell\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"stop\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stopped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"maxTakeAmount\",\"type\":\"uint128\"}],\"name\":\"take\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"dYdX * Contract for testing stuff against OasisDex. Removes some functionality like auth, note, and non-reentrancy protection.\",\"methods\":{},\"title\":\"TestOasisDex\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/cdc218/projects/dolomite-protocol-v2/contracts/testing/TestOasisDex.sol\":\"TestOasisDex\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IERC20Detailed.sol\":{\"keccak256\":\"0x22a62e2a8155e70300773721902f4b9118e17aa0bb5d9d1b046050a014cfb223\",\"urls\":[\"bzz-raw://03af737a33c552fbe58f6f1fbd5496854fdc28dd57be4365d56663725c083a18\",\"dweb:/ipfs/QmbgLqGAQEd6tXsZB8QaPNCAMiU6nNzP75wNbKdS65BuUF\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Math.sol\":{\"keccak256\":\"0x0c0c913b6ccdb69063f9ec84879fcad20a1ee6f44402c9f5ec2b4f5b9f2fa16b\",\"urls\":[\"bzz-raw://89b32eefb57e5e63ad8c6e079ae7bf2d2c8622776cd45af0cf304e1cafd6e078\",\"dweb:/ipfs/Qmcj7yRnYuTgKC3ZqZqe8rynHGYVDS3UrFExcVGcqeaDHY\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Require.sol\":{\"keccak256\":\"0xe641662503ea29ca959e84674188c3e9deaaf64c5623fb9560a4301c521ca1d3\",\"urls\":[\"bzz-raw://b10a04c7d014b99eb792c8c774e203c846d070b30cf0b715325fc07838ed6a6d\",\"dweb:/ipfs/QmUqZWnbchfEY9jM647yQamHe4GzspfUeRQF9k2nn1Hixd\"]},\"/home/cdc218/projects/dolomite-protocol-v2/contracts/testing/TestOasisDex.sol\":{\"keccak256\":\"0x4ea45d4b175458dc517ee2ffda1c53181c56bd445f4828d629f40fbcac18a43e\",\"urls\":[\"bzz-raw://af98d4dbd199838a8fd94d26a786c9c346e3a8fa5995eca8c084e2696dd2cbf0\",\"dweb:/ipfs/QmSa1sMaPjh1UuaePWXDkgUP96otobrSvMXj5aznjTgqSG\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzz-raw://31113152e1ddb78fe7a4197f247591ca894e93f916867beb708d8e747b6cc74f\",\"dweb:/ipfs/QmbZaJyXdpsYGykVhHH9qpVGQg9DGCxE2QufbCUy3daTgq\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzz-raw://59fd025151435da35faa8093a5c7a17de02de9d08ad27275c5cdf05050820d91\",\"dweb:/ipfs/QmQMvwEcPhoRXzbXyrdoeRtvLoifUW9Qh7Luho7bmUPRkc\"]}},\"version\":1}",
1463
- "bytecode": "0x60806040526000805462ff00001961ff001990911661010017166201000017905534801561002c57600080fd5b5061315b8061003c6000396000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c8063779997c311610191578063bf7c734e116100e3578063d6f1546911610097578063f09ea2a611610071578063f09ea2a6146105fe578063f582d29314610611578063ff1fd97414610619576102e9565b8063d6f15469146105c5578063d6febde8146105d8578063e1a6f014146105eb576102e9565b8063c2d526aa116100c8578063c2d526aa14610570578063c41a360a14610592578063d2b420ce146105b2576102e9565b8063bf7c734e14610555578063c2b6b58c14610568576102e9565b80638af82a2e11610145578063943911bc1161011f578063943911bc1461051c578063a78d43161461052f578063b4f9b6c814610542576102e9565b80638af82a2e146104ee578063911550f4146104f657806391be90c814610509576102e9565b80638185402b116101765780638185402b146104a357806382afd23b146104b65780638a72ea6a146104c9576102e9565b8063779997c31461047d5780637ca9429a14610490576102e9565b806340e58ee51161024a578063557ed1ba116101fe578063677170e1116101d8578063677170e11461044f57806374c1d7d31461046257806375f12b2114610475576102e9565b8063557ed1ba1461041f57806356ad87641461043457806361f54a791461043c576102e9565b8063467f0b7b1161022f578063467f0b7b146103e657806349606455146103f9578063511fa4871461040c576102e9565b806340e58ee5146103b05780634579268a146103c3576102e9565b8063144a2752116102a15780631d834a1b116102865780631d834a1b14610382578063232cae0b146103955780632aed19051461039d576102e9565b8063144a27521461035c5780631b33d4121461036f576102e9565b80630621b4f6116102d25780630621b4f61461032c57806307da68f51461033f578063093f519814610349576102e9565b806301492a0b146102ee5780630374fc6f1461030c575b600080fd5b6102f661062c565b6040516103039190612eb1565b60405180910390f35b61031f61031a36600461285c565b61063b565b6040516103039190612ebf565b61031f61033a366004612974565b610668565b6103476107a4565b005b61031f610357366004612896565b6107d1565b61031f61036a3660046128f7565b61080e565b61031f61037d366004612aa8565b6108dc565b6102f6610390366004612ba4565b610909565b61031f610986565b6102f66103ab3660046129c9565b61098c565b6102f66103be366004612a05565b610a08565b6103d66103d1366004612a05565b610df9565b6040516103039493929190612f6d565b6102f66103f4366004612a05565b610e99565b610347610407366004612a23565b610f5b565b61031f61041a36600461283e565b610f84565b610427610f9f565b604051610303919061300d565b61031f610fa3565b61031f61044a366004612a05565b610fa9565b61031f61045d36600461285c565b610fbb565b61031f61047036600461285c565b610fd8565b6102f6610ff5565b61034761048b366004612a05565b610ffe565b61031f61049e36600461285c565b611130565b61031f6104b1366004612974565b61115b565b6102f66104c4366004612a05565b611277565b6104dc6104d7366004612a05565b6112b0565b60405161030396959493929190612fa2565b61031f611312565b61031f610504366004612a05565b611318565b61031f61051736600461283e565b61132a565b61031f61052a366004612a05565b61133c565b61031f61053d366004612a05565b611352565b610347610550366004612a05565b611364565b6102f6610563366004612944565b611379565b6102f66113c5565b61058361057e366004612a05565b6113ce565b60405161030393929190612ff2565b6105a56105a0366004612a05565b6113ee565b6040516103039190612e10565b6102f66105c0366004612a05565b61140c565b6102f66105d33660046129c9565b61147d565b6102f66105e6366004612ba4565b6114e7565b61031f6105f9366004612b1d565b611518565b61031f61060c366004612a53565b61156a565b6102f661158a565b61031f6106273660046128f7565b611598565b60005462010000900460ff1681565b6001600160a01b038083166000908152600260209081526040808320938516835292905220545b92915050565b6000805b841561078e5761067c848761063b565b90508061068857600080fd5b6000818152600960205260409020600281015490546106a7919061164c565b85670de0b6b3a76400000210156106bd5761078e565b6000818152600960205260409020600201548510610731576000818152600960205260409020546106ef90839061167b565b60008281526009602052604090206002015490925061070f9086906116c1565b60008281526009602052604090205490955061072c908290610f5b565b610789565b60008181526009602052604081208054600290910154633b9aca0091610763918984029161075e91611703565b61171f565b8161076a57fe5b049050610777838261167b565b92506107838282610f5b565b60009550505b61066c565b8282101561079b57600080fd5b50949350505050565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610803836fffffffffffffffffffffffffffffffff1686846fffffffffffffffffffffffffffffffff168761156a565b90505b949350505050565b60008061081b858561063b565b90505b6000818152600960205260409020600201548311156108935760008181526009602052604090205461085190839061167b565b6000828152600960205260409020600201549092506108719084906116c1565b9250821561088e576108828161133c565b90508061088e57600080fd5b61081e565b600081815260096020526040902080546002909101546108d3918491633b9aca00916108c6918884029161075e91611703565b816108cd57fe5b0461167b565b95945050505050565b60006108e66113c5565b156108f057600080fd5b6108ff86868686866001611518565b9695505050505050565b60006109148361140c565b1561091e57600080fd5b61092783611277565b61093057600080fd5b6109398361174f565b5061094483836117f9565b7f6d5c16212bdea16850dce4d9fa2314c446bd30ce84700d9c36c7677c6d2839403384604051610975929190612e46565b60405180910390a150600192915050565b60085481565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100008315158102919091178083556040517fea11e00ec1642be9b494019b756440e2c57dbe9e59242c4f9c64ce33fb4f41d9926109f79260ff9190041690612eb1565b60405180910390a15060015b919050565b600081610a1481611277565b610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f4d565b60405180910390fd5b610a5b6113c5565b80610a7f5750610a6a816113ee565b6001600160a01b0316336001600160a01b0316145b80610a8b575060075481145b610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f5d565b610aca8361140c565b15610ae657610ad88361199f565b610ae157600080fd5b610af8565b610aef8361174f565b610af857600080fd5b610b006127d2565b600960008581526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600960008581526020019081526020016000206000808201600090556001820160006101000a8154906001600160a01b03021916905560028201600090556003820160006101000a8154906001600160a01b0302191690556004820160006101000a8154906001600160a01b0302191690556004820160146101000a81549067ffffffffffffffff0219169055505080602001516001600160a01b031663a9059cbb826080015183600001516040518363ffffffff1660e01b8152600401610cbc929190612ea3565b602060405180830381600087803b158015610cd657600080fd5b505af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d0e91908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb348884604051610d3e9190612ebf565b60405180910390a180608001516001600160a01b031681602001518260600151604051602001610d6f929190612dea565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090850151606086015186519387015192948a947f9577941d28fff863bfbee4694a6a4a56fb09e169619189d2eaa750b5b481999594610de79493924290612e61565b60405180910390a45060019392505050565b600080600080610e076127d2565b5050506000928352505060096020908152604091829020825160c081018452815480825260018301546001600160a01b0390811694830185905260028401549583018690526003840154811660608401819052600490940154908116608084015274010000000000000000000000000000000000000000900467ffffffffffffffff1660a09092019190915293919291565b6000610ea482611277565b158015610ec1575060008281526001602052604090206002015415155b8015610eff57506000828152600160205260409020600201547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff64301115b610f0857600080fd5b6000828152600160208190526040808320838155918201839055600290910191909155517fcb9d6176c6aac6478ebb9a2754cdce22a944de29ed1f2642f8613884eba4b40c906109f79033908590612e46565b610f77826fffffffffffffffffffffffffffffffff83166114e7565b610f8057600080fd5b5050565b6001600160a01b031660009081526004602052604090205490565b4290565b60075481565b60009081526005602052604090205490565b600360209081526000928352604080842090915290825290205481565b600260209081526000928352604080842090915290825290205481565b60005460ff1681565b8061100881611277565b61101157600080fd5b6110196113c5565b1561102357600080fd5b60008281526009602090815260409182902060048101546001820154600390920154935186946001600160a01b0392831694611066948416939091169101612dea565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012060008681526009909252919020600181015460038201548254600284015460049094015494958a957f70a14c213064359ede031fd2a1645a11ce2ec825ffe6ab5cfb5b160c3ef4d0a295611123956001600160a01b0390811695169392909174010000000000000000000000000000000000000000900467ffffffffffffffff1690612e61565b60405180910390a4505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6000805b841561126a5761116f868561063b565b90508061117b57600080fd5b6000818152600960205260409020805460029091015461119b919061164c565b85670de0b6b3a76400000210156111b15761126a565b6000818152600960205260409020548510611222576000818152600960205260409020600201546111e390839061167b565b6000828152600960205260409020549092506112009086906116c1565b60008281526009602052604090205490955061121d908290610f5b565b611265565b600081815260096020526040902060028101549054611254918491633b9aca00916108c6918a84029161075e91611703565b91506112608186610f5b565b600094505b61115f565b8282111561079b57600080fd5b60009081526009602052604090206004015474010000000000000000000000000000000000000000900467ffffffffffffffff16151590565b6009602052600090815260409020805460018201546002830154600384015460049094015492936001600160a01b03928316939192908116919081169074010000000000000000000000000000000000000000900467ffffffffffffffff1686565b60065490565b60009081526001602052604090205490565b60046020526000908152604090205481565b6000908152600160208190526040909120015490565b60056020526000908152604090205481565b61136d81610a08565b61137657600080fd5b50565b6001600160a01b038216600090815260046020526040808220839055517fc28d56449b0bb31e64ee7487e061f57a2e72aea8019d810832f26dda099823d0906109759085908590612ea3565b60005460ff1690565b600160208190526000918252604090912080549181015460029091015483565b6000908152600960205260409020600401546001600160a01b031690565b60008181526001602052604081205415158061143957506000828152600160208190526040909120015415155b80610662575050600081815260096020908152604080832060018101546001600160a01b039081168552600284528285206003909201541684529091529020541490565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008315158102919091178083556040517f7089e4f0bcc948f9f723a361590c32d9c2284da7ab1981b1249ad2edb9f953c1926109f79260ff9190041690612eb1565b6000826114f381611277565b6114fc57600080fd5b6115046113c5565b1561150e57600080fd5b6108068484611b7b565b60006115226113c5565b1561152c57600080fd5b6001600160a01b03861660009081526004602052604090205487101561155157600080fd5b61155f878787878787611c42565b979650505050505050565b60006115746113c5565b1561157e57600080fd5b61080385858585611d9f565b600054610100900460ff1681565b6000806115a5848661063b565b90505b60008181526009602052604090205483111561161a576000818152600960205260409020600201546115db90839061167b565b6000828152600960205260409020549092506115f89084906116c1565b92508215611615576116098161133c565b90508061161557600080fd5b6115a8565b6000818152600960205260409020600281015490546108d3918491633b9aca00916108c6918884029161075e91611703565b60008161166c61166485670de0b6b3a7640000611e2d565b6002856108cd565b8161167357fe5b049392505050565b6000828201838110156116ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f2d565b9392505050565b60006116ba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e81565b60008161166c611664856b033b2e3c9fd0803ce8000000611e2d565b60006b033b2e3c9fd0803ce800000061166c61173b8585611e2d565b60026b033b2e3c9fd0803ce80000006108cd565b6006546000908061175f8461140c565b1561176957600080fd5b8360065414156117915750505060008181526005602052604081208054600655556001610a03565b5b6000821180156117a25750838214155b156117bd575060008181526005602052604090205490611792565b8382146117cf57600092505050610a03565b60008481526005602052604080822080549383529082209290925584815290555060019050919050565b61180282611277565b61180b57600080fd5b600082815260096020526040812060038101546001909101546001600160a01b039182169291169083158061185d57506000848152600960205260409020600101546001600160a01b03838116911614155b8061188557506000848152600960205260409020600301546001600160a01b03848116911614155b8061189657506118948461140c565b155b6118a9576118a48585611ec7565b6118b2565b6118b285611f9c565b935083156118e257506000838152600160208190526040808320909101805490879055868352912084905561190f565b506001600160a01b0381811660009081526002602090815260408083209386168352929052208054908590555b8015611934576000818152600160208190526040808320889055878352909120018190555b6001600160a01b038083166000908152600360209081526040808320938716835292905281902080546001019055517f20fb9bad86c18f7e22e8065258790d9416a7d2df8ff05f80f82c46d38b925acd90611990908790612ebf565b60405180910390a15050505050565b60008181526009602090815260408083206003808201546001909201546001600160a01b03908116808752918552838620921680865291909352908320549091906119e957600080fd5b600084815260016020526040902060020154158015611a0c5750611a0c8461140c565b611a1557600080fd5b6001600160a01b038082166000908152600260209081526040808320938616835292905220548414611a8757600084815260016020819052604080832054835290912001548414611a6557600080fd5b6000848152600160208190526040808320808301549054845292200155611abc565b6000848152600160208181526040808420909201546001600160a01b0380861685526002835283852090871685529091529120555b6000848152600160208190526040909120015415611b165760008481526001602081905260408083209091015482529020548414611af957600080fd5b600084815260016020819052604080832080549201548352909120555b6001600160a01b03908116600090815260036020908152604080832094909316825292835281812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938452600191829052909220436002909101555090565b60008054610100900460ff16611b9057600080fd5b600083815260096020526040902054821415611bce57611baf8361140c565b15611bc357611bbd8361199f565b50611bce565b611bcc8361174f565b505b611bd88383612021565b611be157600080fd5b611bea83611277565b8015611c245750600083815260096020818152604080842060018101546001600160a01b0316855260048352908420549387905291905254105b15611c39576007839055611c3783610a08565b505b50600192915050565b60008060008060005b6001600160a01b038089166000908152600260209081526040808320938e168352929052205415611d405750506001600160a01b038087166000908152600260208181526040808420948d168452938152838320548084526009909152929091209081015490549193509085611cc2576000611cca565b808b8a840101015b611cd48c83611e2d565b01611cdf838b611e2d565b1115611cea57611d40565b611cf8846105e6838c61245f565b50889250611d0f89611d0a838c61245f565b6116c1565b985082611d1c8a8d611e2d565b81611d2357fe5b049a508a1580611d31575088155b15611d3b57611d40565b611c4b565b600089118015611d50575060008b115b8015611d7457506001600160a01b038a166000908152600460205260409020548b10155b15611d9157611d858b8b8b8b612475565b9450611d9185886117f9565b505050509695505050505050565b6001600160a01b038316600090815260046020526040812054851015611dc457600080fd5b611dd085858585612475565b60068054600083815260056020526040908190209190915590829055519091507f8173832a493e0a3989e521458e55bfe9feac9f9b675a94e100b9d5a85f81486290611e1d908390612ebf565b60405180910390a1949350505050565b600082611e3c57506000610662565b82820282848281611e4957fe5b04146116ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f3d565b60008184841115611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a9190612f1c565b505050900390565b6000808311611ed557600080fd5b8115801590611eea5750611ee882611277565b155b15611f0a5760009182526001602081905260409092209091015490611ed5565b81611f1f57611f1883611f9c565b9050610662565b611f298383612774565b15611f645760005b8215801590611f455750611f458484612774565b15611f1857506000828152600160208190526040909120015491611f31565b8115801590611f7a5750611f788383612774565b155b15611f95576000918252600160205260409091205490611f64565b5080610662565b6000808211611faa57600080fd5b600082815260096020908152604080832060038101546001909101546001600160a01b03908116808652600285528386209190921680865293529083205491929091905b811580159061200257506120028683612774565b156108d357506000818152600160208190526040909120015490611fee565b600061202b6127d2565b506000838152600960209081526040808320815160c081018352815480825260018301546001600160a01b0390811695830195909552600283015493820184905260038301548516606083015260049092015493841660808201527401000000000000000000000000000000000000000090930467ffffffffffffffff1660a0840152919291906120bd908690611e2d565b816120c457fe5b04905080816fffffffffffffffffffffffffffffffff16146120e557600080fd5b83846fffffffffffffffffffffffffffffffff161461210357600080fd5b83158061210e575080155b806121195750815184115b806121275750816040015181115b1561213757600092505050610662565b815161214390856116c1565b600086815260096020526040908190209190915582015161216490826116c1565b60008681526009602052604090819020600201919091556060830151608084015191517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916323b872dd916121cc9133918690600401612e1e565b602060405180830381600087803b1580156121e657600080fd5b505af11580156121fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061221e91908101906129e7565b5081602001516001600160a01b031663a9059cbb33866040518363ffffffff1660e01b8152600401612251929190612e46565b602060405180830381600087803b15801561226b57600080fd5b505af115801561227f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122a391908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb3488856040516122d39190612ebf565b60405180910390a1336001600160a01b031682608001516001600160a01b03168360200151846060015160405160200161230e929190612dea565b604051602081830303815290604052805190602001207f3383e3357c77fd2e3a4b30deea81179bc70a795d053d14d5b7f2f01d0fd4596f8860001b866020015187606001518a884260405161236896959493929190612ecd565b60405180910390a481606001516001600160a01b031682602001516001600160a01b03167f819e390338feffe95e2de57172d6faf337853dfd15c7a09a32d76f7fd244387586846040516123bd929190612fe4565b60405180910390a36000858152600960205260409020546124545760008581526009602052604081208181556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600282019290925560038101805490921690915560040180547fffffffff000000000000000000000000000000000000000000000000000000001690555b506001949350505050565b600081831061246e57816116ba565b5090919050565b600084856fffffffffffffffffffffffffffffffff161461249557600080fd5b82836fffffffffffffffffffffffffffffffff16146124b357600080fd5b600085116124c057600080fd5b6001600160a01b0384166124d357600080fd5b600083116124e057600080fd5b6001600160a01b0382166124f357600080fd5b816001600160a01b0316846001600160a01b0316141561251257600080fd5b61251a6127d2565b8581526001600160a01b038086166020830152604082018590528316606082015233608082015267ffffffffffffffff421660a08201526125596127c4565b60008181526009602090815260409182902084518155908401516001820180546001600160a01b039283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155838601516002840155606086015160038401805491841691831691909117905560808601516004938401805460a089015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff93861691909416179190911691909117905591517f23b872dd000000000000000000000000000000000000000000000000000000008152929450908716916323b872dd9161267391339130918c9101612e1e565b602060405180830381600087803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126c591908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb3488826040516126f59190612ebf565b60405180910390a160405133906127129087908690602001612dea565b604051602081830303815290604052805190602001208360001b7f773ff502687307abfa024ac9f62f9752a0d210dac2ffd9a29e38e12e2ea82c8288878b8a42604051612763959493929190612e61565b60405180910390a450949350505050565b60008181526009602052604080822060020154848352908220546127989190611e2d565b600084815260096020526040808220600201548583529120546127bb9190611e2d565b10159392505050565b600880546001019081905590565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b8035610662816130e9565b8035610662816130fd565b8051610662816130fd565b803561066281613106565b80356106628161310f565b60006020828403121561285057600080fd5b60006108068484612807565b6000806040838503121561286f57600080fd5b600061287b8585612807565b925050602061288c85828601612807565b9150509250929050565b600080600080608085870312156128ac57600080fd5b60006128b88787612807565b94505060206128c987828801612807565b93505060406128da87828801612833565b92505060606128eb87828801612833565b91505092959194509250565b60008060006060848603121561290c57600080fd5b60006129188686612807565b935050602061292986828701612807565b925050604061293a86828701612828565b9150509250925092565b6000806040838503121561295757600080fd5b60006129638585612807565b925050602061288c85828601612828565b6000806000806080858703121561298a57600080fd5b60006129968787612807565b94505060206129a787828801612828565b93505060406129b887828801612807565b92505060606128eb87828801612828565b6000602082840312156129db57600080fd5b60006108068484612812565b6000602082840312156129f957600080fd5b6000610806848461281d565b600060208284031215612a1757600080fd5b60006108068484612828565b60008060408385031215612a3657600080fd5b6000612a428585612828565b925050602061288c85828601612833565b60008060008060808587031215612a6957600080fd5b6000612a758787612828565b9450506020612a8687828801612807565b9350506040612a9787828801612828565b92505060606128eb87828801612807565b600080600080600060a08688031215612ac057600080fd5b6000612acc8888612828565b9550506020612add88828901612807565b9450506040612aee88828901612828565b9350506060612aff88828901612807565b9250506080612b1088828901612828565b9150509295509295909350565b60008060008060008060c08789031215612b3657600080fd5b6000612b428989612828565b9650506020612b5389828a01612807565b9550506040612b6489828a01612828565b9450506060612b7589828a01612807565b9350506080612b8689828a01612828565b92505060a0612b9789828a01612812565b9150509295509295509295565b60008060408385031215612bb757600080fd5b60006129638585612828565b612bcc81613069565b82525050565b612bcc81613028565b612bcc612be782613028565b6130aa565b612bcc81613033565b612bcc81613038565b6000612c098261301b565b612c13818561301f565b9350612c2381856020860161307a565b612c2c816130bb565b9093019392505050565b6000612c43601b8361301f565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612c7c60218361301f565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000612cdb602d8361301f565b7f4f66666572207761732064656c65746564206f722074616b656e2c206f72206e81527f6576657220657869737465642e00000000000000000000000000000000000000602082015260400192915050565b6000612d3a60748361301f565b7f4f666665722063616e206e6f742062652063616e63656c6c656420626563617581527f73652075736572206973206e6f74206f776e65722c20616e64206d61726b657460208201527f206973206f70656e2c20616e64206f666665722073656c6c732072657175697260408201527f656420616d6f756e74206f6620746f6b656e732e000000000000000000000000606082015260800192915050565b612bcc8161303b565b612bcc8161305c565b6000612df68285612bdb565b601482019150612e068284612bdb565b5060140192915050565b602081016106628284612bd2565b60608101612e2c8286612bc3565b612e396020830185612bd2565b6108066040830184612bf5565b60408101612e548285612bc3565b6116ba6020830184612bf5565b60a08101612e6f8288612bd2565b612e7c6020830187612bd2565b612e896040830186612dd8565b612e966060830185612dd8565b6108ff6080830184612de1565b60408101612e548285612bd2565b602081016106628284612bec565b602081016106628284612bf5565b60c08101612edb8289612bf5565b612ee86020830188612bd2565b612ef56040830187612bd2565b612f026060830186612dd8565b612f0f6080830185612dd8565b61155f60a0830184612de1565b602080825281016116ba8184612bfe565b6020808252810161066281612c36565b6020808252810161066281612c6f565b6020808252810161066281612cce565b6020808252810161066281612d2d565b60808101612f7b8287612bf5565b612f886020830186612bd2565b612f956040830185612bf5565b6108d36060830184612bd2565b60c08101612fb08289612bf5565b612fbd6020830188612bd2565b612fca6040830187612bf5565b612fd76060830186612bd2565b612f0f6080830185612bd2565b60408101612e548285612bf5565b606081016130008286612bf5565b612e396020830185612bf5565b602081016106628284612de1565b5190565b90815260200190565b600061066282613050565b151590565b90565b6fffffffffffffffffffffffffffffffff1690565b6001600160a01b031690565b67ffffffffffffffff1690565b600061066282600061066282613028565b60005b8381101561309557818101518382015260200161307d565b838111156130a4576000848401525b50505050565b6000610662826000610662826130e3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b60601b90565b6130f281613028565b811461137657600080fd5b6130f281613033565b6130f281613038565b6130f28161303b56fea365627a7a7231582095fbe2b59e26834c45d730734d5592795f4b84edc6608226769555412470914b6c6578706572696d656e74616cf564736f6c63430005100040",
1464
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e95760003560e01c8063779997c311610191578063bf7c734e116100e3578063d6f1546911610097578063f09ea2a611610071578063f09ea2a6146105fe578063f582d29314610611578063ff1fd97414610619576102e9565b8063d6f15469146105c5578063d6febde8146105d8578063e1a6f014146105eb576102e9565b8063c2d526aa116100c8578063c2d526aa14610570578063c41a360a14610592578063d2b420ce146105b2576102e9565b8063bf7c734e14610555578063c2b6b58c14610568576102e9565b80638af82a2e11610145578063943911bc1161011f578063943911bc1461051c578063a78d43161461052f578063b4f9b6c814610542576102e9565b80638af82a2e146104ee578063911550f4146104f657806391be90c814610509576102e9565b80638185402b116101765780638185402b146104a357806382afd23b146104b65780638a72ea6a146104c9576102e9565b8063779997c31461047d5780637ca9429a14610490576102e9565b806340e58ee51161024a578063557ed1ba116101fe578063677170e1116101d8578063677170e11461044f57806374c1d7d31461046257806375f12b2114610475576102e9565b8063557ed1ba1461041f57806356ad87641461043457806361f54a791461043c576102e9565b8063467f0b7b1161022f578063467f0b7b146103e657806349606455146103f9578063511fa4871461040c576102e9565b806340e58ee5146103b05780634579268a146103c3576102e9565b8063144a2752116102a15780631d834a1b116102865780631d834a1b14610382578063232cae0b146103955780632aed19051461039d576102e9565b8063144a27521461035c5780631b33d4121461036f576102e9565b80630621b4f6116102d25780630621b4f61461032c57806307da68f51461033f578063093f519814610349576102e9565b806301492a0b146102ee5780630374fc6f1461030c575b600080fd5b6102f661062c565b6040516103039190612eb1565b60405180910390f35b61031f61031a36600461285c565b61063b565b6040516103039190612ebf565b61031f61033a366004612974565b610668565b6103476107a4565b005b61031f610357366004612896565b6107d1565b61031f61036a3660046128f7565b61080e565b61031f61037d366004612aa8565b6108dc565b6102f6610390366004612ba4565b610909565b61031f610986565b6102f66103ab3660046129c9565b61098c565b6102f66103be366004612a05565b610a08565b6103d66103d1366004612a05565b610df9565b6040516103039493929190612f6d565b6102f66103f4366004612a05565b610e99565b610347610407366004612a23565b610f5b565b61031f61041a36600461283e565b610f84565b610427610f9f565b604051610303919061300d565b61031f610fa3565b61031f61044a366004612a05565b610fa9565b61031f61045d36600461285c565b610fbb565b61031f61047036600461285c565b610fd8565b6102f6610ff5565b61034761048b366004612a05565b610ffe565b61031f61049e36600461285c565b611130565b61031f6104b1366004612974565b61115b565b6102f66104c4366004612a05565b611277565b6104dc6104d7366004612a05565b6112b0565b60405161030396959493929190612fa2565b61031f611312565b61031f610504366004612a05565b611318565b61031f61051736600461283e565b61132a565b61031f61052a366004612a05565b61133c565b61031f61053d366004612a05565b611352565b610347610550366004612a05565b611364565b6102f6610563366004612944565b611379565b6102f66113c5565b61058361057e366004612a05565b6113ce565b60405161030393929190612ff2565b6105a56105a0366004612a05565b6113ee565b6040516103039190612e10565b6102f66105c0366004612a05565b61140c565b6102f66105d33660046129c9565b61147d565b6102f66105e6366004612ba4565b6114e7565b61031f6105f9366004612b1d565b611518565b61031f61060c366004612a53565b61156a565b6102f661158a565b61031f6106273660046128f7565b611598565b60005462010000900460ff1681565b6001600160a01b038083166000908152600260209081526040808320938516835292905220545b92915050565b6000805b841561078e5761067c848761063b565b90508061068857600080fd5b6000818152600960205260409020600281015490546106a7919061164c565b85670de0b6b3a76400000210156106bd5761078e565b6000818152600960205260409020600201548510610731576000818152600960205260409020546106ef90839061167b565b60008281526009602052604090206002015490925061070f9086906116c1565b60008281526009602052604090205490955061072c908290610f5b565b610789565b60008181526009602052604081208054600290910154633b9aca0091610763918984029161075e91611703565b61171f565b8161076a57fe5b049050610777838261167b565b92506107838282610f5b565b60009550505b61066c565b8282101561079b57600080fd5b50949350505050565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610803836fffffffffffffffffffffffffffffffff1686846fffffffffffffffffffffffffffffffff168761156a565b90505b949350505050565b60008061081b858561063b565b90505b6000818152600960205260409020600201548311156108935760008181526009602052604090205461085190839061167b565b6000828152600960205260409020600201549092506108719084906116c1565b9250821561088e576108828161133c565b90508061088e57600080fd5b61081e565b600081815260096020526040902080546002909101546108d3918491633b9aca00916108c6918884029161075e91611703565b816108cd57fe5b0461167b565b95945050505050565b60006108e66113c5565b156108f057600080fd5b6108ff86868686866001611518565b9695505050505050565b60006109148361140c565b1561091e57600080fd5b61092783611277565b61093057600080fd5b6109398361174f565b5061094483836117f9565b7f6d5c16212bdea16850dce4d9fa2314c446bd30ce84700d9c36c7677c6d2839403384604051610975929190612e46565b60405180910390a150600192915050565b60085481565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100008315158102919091178083556040517fea11e00ec1642be9b494019b756440e2c57dbe9e59242c4f9c64ce33fb4f41d9926109f79260ff9190041690612eb1565b60405180910390a15060015b919050565b600081610a1481611277565b610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f4d565b60405180910390fd5b610a5b6113c5565b80610a7f5750610a6a816113ee565b6001600160a01b0316336001600160a01b0316145b80610a8b575060075481145b610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f5d565b610aca8361140c565b15610ae657610ad88361199f565b610ae157600080fd5b610af8565b610aef8361174f565b610af857600080fd5b610b006127d2565b600960008581526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600960008581526020019081526020016000206000808201600090556001820160006101000a8154906001600160a01b03021916905560028201600090556003820160006101000a8154906001600160a01b0302191690556004820160006101000a8154906001600160a01b0302191690556004820160146101000a81549067ffffffffffffffff0219169055505080602001516001600160a01b031663a9059cbb826080015183600001516040518363ffffffff1660e01b8152600401610cbc929190612ea3565b602060405180830381600087803b158015610cd657600080fd5b505af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d0e91908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb348884604051610d3e9190612ebf565b60405180910390a180608001516001600160a01b031681602001518260600151604051602001610d6f929190612dea565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090850151606086015186519387015192948a947f9577941d28fff863bfbee4694a6a4a56fb09e169619189d2eaa750b5b481999594610de79493924290612e61565b60405180910390a45060019392505050565b600080600080610e076127d2565b5050506000928352505060096020908152604091829020825160c081018452815480825260018301546001600160a01b0390811694830185905260028401549583018690526003840154811660608401819052600490940154908116608084015274010000000000000000000000000000000000000000900467ffffffffffffffff1660a09092019190915293919291565b6000610ea482611277565b158015610ec1575060008281526001602052604090206002015415155b8015610eff57506000828152600160205260409020600201547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff64301115b610f0857600080fd5b6000828152600160208190526040808320838155918201839055600290910191909155517fcb9d6176c6aac6478ebb9a2754cdce22a944de29ed1f2642f8613884eba4b40c906109f79033908590612e46565b610f77826fffffffffffffffffffffffffffffffff83166114e7565b610f8057600080fd5b5050565b6001600160a01b031660009081526004602052604090205490565b4290565b60075481565b60009081526005602052604090205490565b600360209081526000928352604080842090915290825290205481565b600260209081526000928352604080842090915290825290205481565b60005460ff1681565b8061100881611277565b61101157600080fd5b6110196113c5565b1561102357600080fd5b60008281526009602090815260409182902060048101546001820154600390920154935186946001600160a01b0392831694611066948416939091169101612dea565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012060008681526009909252919020600181015460038201548254600284015460049094015494958a957f70a14c213064359ede031fd2a1645a11ce2ec825ffe6ab5cfb5b160c3ef4d0a295611123956001600160a01b0390811695169392909174010000000000000000000000000000000000000000900467ffffffffffffffff1690612e61565b60405180910390a4505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6000805b841561126a5761116f868561063b565b90508061117b57600080fd5b6000818152600960205260409020805460029091015461119b919061164c565b85670de0b6b3a76400000210156111b15761126a565b6000818152600960205260409020548510611222576000818152600960205260409020600201546111e390839061167b565b6000828152600960205260409020549092506112009086906116c1565b60008281526009602052604090205490955061121d908290610f5b565b611265565b600081815260096020526040902060028101549054611254918491633b9aca00916108c6918a84029161075e91611703565b91506112608186610f5b565b600094505b61115f565b8282111561079b57600080fd5b60009081526009602052604090206004015474010000000000000000000000000000000000000000900467ffffffffffffffff16151590565b6009602052600090815260409020805460018201546002830154600384015460049094015492936001600160a01b03928316939192908116919081169074010000000000000000000000000000000000000000900467ffffffffffffffff1686565b60065490565b60009081526001602052604090205490565b60046020526000908152604090205481565b6000908152600160208190526040909120015490565b60056020526000908152604090205481565b61136d81610a08565b61137657600080fd5b50565b6001600160a01b038216600090815260046020526040808220839055517fc28d56449b0bb31e64ee7487e061f57a2e72aea8019d810832f26dda099823d0906109759085908590612ea3565b60005460ff1690565b600160208190526000918252604090912080549181015460029091015483565b6000908152600960205260409020600401546001600160a01b031690565b60008181526001602052604081205415158061143957506000828152600160208190526040909120015415155b80610662575050600081815260096020908152604080832060018101546001600160a01b039081168552600284528285206003909201541684529091529020541490565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008315158102919091178083556040517f7089e4f0bcc948f9f723a361590c32d9c2284da7ab1981b1249ad2edb9f953c1926109f79260ff9190041690612eb1565b6000826114f381611277565b6114fc57600080fd5b6115046113c5565b1561150e57600080fd5b6108068484611b7b565b60006115226113c5565b1561152c57600080fd5b6001600160a01b03861660009081526004602052604090205487101561155157600080fd5b61155f878787878787611c42565b979650505050505050565b60006115746113c5565b1561157e57600080fd5b61080385858585611d9f565b600054610100900460ff1681565b6000806115a5848661063b565b90505b60008181526009602052604090205483111561161a576000818152600960205260409020600201546115db90839061167b565b6000828152600960205260409020549092506115f89084906116c1565b92508215611615576116098161133c565b90508061161557600080fd5b6115a8565b6000818152600960205260409020600281015490546108d3918491633b9aca00916108c6918884029161075e91611703565b60008161166c61166485670de0b6b3a7640000611e2d565b6002856108cd565b8161167357fe5b049392505050565b6000828201838110156116ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f2d565b9392505050565b60006116ba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e81565b60008161166c611664856b033b2e3c9fd0803ce8000000611e2d565b60006b033b2e3c9fd0803ce800000061166c61173b8585611e2d565b60026b033b2e3c9fd0803ce80000006108cd565b6006546000908061175f8461140c565b1561176957600080fd5b8360065414156117915750505060008181526005602052604081208054600655556001610a03565b5b6000821180156117a25750838214155b156117bd575060008181526005602052604090205490611792565b8382146117cf57600092505050610a03565b60008481526005602052604080822080549383529082209290925584815290555060019050919050565b61180282611277565b61180b57600080fd5b600082815260096020526040812060038101546001909101546001600160a01b039182169291169083158061185d57506000848152600960205260409020600101546001600160a01b03838116911614155b8061188557506000848152600960205260409020600301546001600160a01b03848116911614155b8061189657506118948461140c565b155b6118a9576118a48585611ec7565b6118b2565b6118b285611f9c565b935083156118e257506000838152600160208190526040808320909101805490879055868352912084905561190f565b506001600160a01b0381811660009081526002602090815260408083209386168352929052208054908590555b8015611934576000818152600160208190526040808320889055878352909120018190555b6001600160a01b038083166000908152600360209081526040808320938716835292905281902080546001019055517f20fb9bad86c18f7e22e8065258790d9416a7d2df8ff05f80f82c46d38b925acd90611990908790612ebf565b60405180910390a15050505050565b60008181526009602090815260408083206003808201546001909201546001600160a01b03908116808752918552838620921680865291909352908320549091906119e957600080fd5b600084815260016020526040902060020154158015611a0c5750611a0c8461140c565b611a1557600080fd5b6001600160a01b038082166000908152600260209081526040808320938616835292905220548414611a8757600084815260016020819052604080832054835290912001548414611a6557600080fd5b6000848152600160208190526040808320808301549054845292200155611abc565b6000848152600160208181526040808420909201546001600160a01b0380861685526002835283852090871685529091529120555b6000848152600160208190526040909120015415611b165760008481526001602081905260408083209091015482529020548414611af957600080fd5b600084815260016020819052604080832080549201548352909120555b6001600160a01b03908116600090815260036020908152604080832094909316825292835281812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938452600191829052909220436002909101555090565b60008054610100900460ff16611b9057600080fd5b600083815260096020526040902054821415611bce57611baf8361140c565b15611bc357611bbd8361199f565b50611bce565b611bcc8361174f565b505b611bd88383612021565b611be157600080fd5b611bea83611277565b8015611c245750600083815260096020818152604080842060018101546001600160a01b0316855260048352908420549387905291905254105b15611c39576007839055611c3783610a08565b505b50600192915050565b60008060008060005b6001600160a01b038089166000908152600260209081526040808320938e168352929052205415611d405750506001600160a01b038087166000908152600260208181526040808420948d168452938152838320548084526009909152929091209081015490549193509085611cc2576000611cca565b808b8a840101015b611cd48c83611e2d565b01611cdf838b611e2d565b1115611cea57611d40565b611cf8846105e6838c61245f565b50889250611d0f89611d0a838c61245f565b6116c1565b985082611d1c8a8d611e2d565b81611d2357fe5b049a508a1580611d31575088155b15611d3b57611d40565b611c4b565b600089118015611d50575060008b115b8015611d7457506001600160a01b038a166000908152600460205260409020548b10155b15611d9157611d858b8b8b8b612475565b9450611d9185886117f9565b505050509695505050505050565b6001600160a01b038316600090815260046020526040812054851015611dc457600080fd5b611dd085858585612475565b60068054600083815260056020526040908190209190915590829055519091507f8173832a493e0a3989e521458e55bfe9feac9f9b675a94e100b9d5a85f81486290611e1d908390612ebf565b60405180910390a1949350505050565b600082611e3c57506000610662565b82820282848281611e4957fe5b04146116ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f3d565b60008184841115611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a9190612f1c565b505050900390565b6000808311611ed557600080fd5b8115801590611eea5750611ee882611277565b155b15611f0a5760009182526001602081905260409092209091015490611ed5565b81611f1f57611f1883611f9c565b9050610662565b611f298383612774565b15611f645760005b8215801590611f455750611f458484612774565b15611f1857506000828152600160208190526040909120015491611f31565b8115801590611f7a5750611f788383612774565b155b15611f95576000918252600160205260409091205490611f64565b5080610662565b6000808211611faa57600080fd5b600082815260096020908152604080832060038101546001909101546001600160a01b03908116808652600285528386209190921680865293529083205491929091905b811580159061200257506120028683612774565b156108d357506000818152600160208190526040909120015490611fee565b600061202b6127d2565b506000838152600960209081526040808320815160c081018352815480825260018301546001600160a01b0390811695830195909552600283015493820184905260038301548516606083015260049092015493841660808201527401000000000000000000000000000000000000000090930467ffffffffffffffff1660a0840152919291906120bd908690611e2d565b816120c457fe5b04905080816fffffffffffffffffffffffffffffffff16146120e557600080fd5b83846fffffffffffffffffffffffffffffffff161461210357600080fd5b83158061210e575080155b806121195750815184115b806121275750816040015181115b1561213757600092505050610662565b815161214390856116c1565b600086815260096020526040908190209190915582015161216490826116c1565b60008681526009602052604090819020600201919091556060830151608084015191517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916323b872dd916121cc9133918690600401612e1e565b602060405180830381600087803b1580156121e657600080fd5b505af11580156121fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061221e91908101906129e7565b5081602001516001600160a01b031663a9059cbb33866040518363ffffffff1660e01b8152600401612251929190612e46565b602060405180830381600087803b15801561226b57600080fd5b505af115801561227f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122a391908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb3488856040516122d39190612ebf565b60405180910390a1336001600160a01b031682608001516001600160a01b03168360200151846060015160405160200161230e929190612dea565b604051602081830303815290604052805190602001207f3383e3357c77fd2e3a4b30deea81179bc70a795d053d14d5b7f2f01d0fd4596f8860001b866020015187606001518a884260405161236896959493929190612ecd565b60405180910390a481606001516001600160a01b031682602001516001600160a01b03167f819e390338feffe95e2de57172d6faf337853dfd15c7a09a32d76f7fd244387586846040516123bd929190612fe4565b60405180910390a36000858152600960205260409020546124545760008581526009602052604081208181556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600282019290925560038101805490921690915560040180547fffffffff000000000000000000000000000000000000000000000000000000001690555b506001949350505050565b600081831061246e57816116ba565b5090919050565b600084856fffffffffffffffffffffffffffffffff161461249557600080fd5b82836fffffffffffffffffffffffffffffffff16146124b357600080fd5b600085116124c057600080fd5b6001600160a01b0384166124d357600080fd5b600083116124e057600080fd5b6001600160a01b0382166124f357600080fd5b816001600160a01b0316846001600160a01b0316141561251257600080fd5b61251a6127d2565b8581526001600160a01b038086166020830152604082018590528316606082015233608082015267ffffffffffffffff421660a08201526125596127c4565b60008181526009602090815260409182902084518155908401516001820180546001600160a01b039283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155838601516002840155606086015160038401805491841691831691909117905560808601516004938401805460a089015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff93861691909416179190911691909117905591517f23b872dd000000000000000000000000000000000000000000000000000000008152929450908716916323b872dd9161267391339130918c9101612e1e565b602060405180830381600087803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126c591908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb3488826040516126f59190612ebf565b60405180910390a160405133906127129087908690602001612dea565b604051602081830303815290604052805190602001208360001b7f773ff502687307abfa024ac9f62f9752a0d210dac2ffd9a29e38e12e2ea82c8288878b8a42604051612763959493929190612e61565b60405180910390a450949350505050565b60008181526009602052604080822060020154848352908220546127989190611e2d565b600084815260096020526040808220600201548583529120546127bb9190611e2d565b10159392505050565b600880546001019081905590565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b8035610662816130e9565b8035610662816130fd565b8051610662816130fd565b803561066281613106565b80356106628161310f565b60006020828403121561285057600080fd5b60006108068484612807565b6000806040838503121561286f57600080fd5b600061287b8585612807565b925050602061288c85828601612807565b9150509250929050565b600080600080608085870312156128ac57600080fd5b60006128b88787612807565b94505060206128c987828801612807565b93505060406128da87828801612833565b92505060606128eb87828801612833565b91505092959194509250565b60008060006060848603121561290c57600080fd5b60006129188686612807565b935050602061292986828701612807565b925050604061293a86828701612828565b9150509250925092565b6000806040838503121561295757600080fd5b60006129638585612807565b925050602061288c85828601612828565b6000806000806080858703121561298a57600080fd5b60006129968787612807565b94505060206129a787828801612828565b93505060406129b887828801612807565b92505060606128eb87828801612828565b6000602082840312156129db57600080fd5b60006108068484612812565b6000602082840312156129f957600080fd5b6000610806848461281d565b600060208284031215612a1757600080fd5b60006108068484612828565b60008060408385031215612a3657600080fd5b6000612a428585612828565b925050602061288c85828601612833565b60008060008060808587031215612a6957600080fd5b6000612a758787612828565b9450506020612a8687828801612807565b9350506040612a9787828801612828565b92505060606128eb87828801612807565b600080600080600060a08688031215612ac057600080fd5b6000612acc8888612828565b9550506020612add88828901612807565b9450506040612aee88828901612828565b9350506060612aff88828901612807565b9250506080612b1088828901612828565b9150509295509295909350565b60008060008060008060c08789031215612b3657600080fd5b6000612b428989612828565b9650506020612b5389828a01612807565b9550506040612b6489828a01612828565b9450506060612b7589828a01612807565b9350506080612b8689828a01612828565b92505060a0612b9789828a01612812565b9150509295509295509295565b60008060408385031215612bb757600080fd5b60006129638585612828565b612bcc81613069565b82525050565b612bcc81613028565b612bcc612be782613028565b6130aa565b612bcc81613033565b612bcc81613038565b6000612c098261301b565b612c13818561301f565b9350612c2381856020860161307a565b612c2c816130bb565b9093019392505050565b6000612c43601b8361301f565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612c7c60218361301f565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000612cdb602d8361301f565b7f4f66666572207761732064656c65746564206f722074616b656e2c206f72206e81527f6576657220657869737465642e00000000000000000000000000000000000000602082015260400192915050565b6000612d3a60748361301f565b7f4f666665722063616e206e6f742062652063616e63656c6c656420626563617581527f73652075736572206973206e6f74206f776e65722c20616e64206d61726b657460208201527f206973206f70656e2c20616e64206f666665722073656c6c732072657175697260408201527f656420616d6f756e74206f6620746f6b656e732e000000000000000000000000606082015260800192915050565b612bcc8161303b565b612bcc8161305c565b6000612df68285612bdb565b601482019150612e068284612bdb565b5060140192915050565b602081016106628284612bd2565b60608101612e2c8286612bc3565b612e396020830185612bd2565b6108066040830184612bf5565b60408101612e548285612bc3565b6116ba6020830184612bf5565b60a08101612e6f8288612bd2565b612e7c6020830187612bd2565b612e896040830186612dd8565b612e966060830185612dd8565b6108ff6080830184612de1565b60408101612e548285612bd2565b602081016106628284612bec565b602081016106628284612bf5565b60c08101612edb8289612bf5565b612ee86020830188612bd2565b612ef56040830187612bd2565b612f026060830186612dd8565b612f0f6080830185612dd8565b61155f60a0830184612de1565b602080825281016116ba8184612bfe565b6020808252810161066281612c36565b6020808252810161066281612c6f565b6020808252810161066281612cce565b6020808252810161066281612d2d565b60808101612f7b8287612bf5565b612f886020830186612bd2565b612f956040830185612bf5565b6108d36060830184612bd2565b60c08101612fb08289612bf5565b612fbd6020830188612bd2565b612fca6040830187612bf5565b612fd76060830186612bd2565b612f0f6080830185612bd2565b60408101612e548285612bf5565b606081016130008286612bf5565b612e396020830185612bf5565b602081016106628284612de1565b5190565b90815260200190565b600061066282613050565b151590565b90565b6fffffffffffffffffffffffffffffffff1690565b6001600160a01b031690565b67ffffffffffffffff1690565b600061066282600061066282613028565b60005b8381101561309557818101518382015260200161307d565b838111156130a4576000848401525b50505050565b6000610662826000610662826130e3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b60601b90565b6130f281613028565b811461137657600080fd5b6130f281613033565b6130f281613038565b6130f28161303b56fea365627a7a7231582095fbe2b59e26834c45d730734d5592795f4b84edc6608226769555412470914b6c6578706572696d656e74616cf564736f6c63430005100040",
1462
+ "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"baseToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"quoteToken\",\"type\":\"address\"}],\"name\":\"LogAddTokenPairWhitelist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"pair\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"maker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"pay_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"buy_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"LogBump\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"name\":\"LogBuyEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"keeper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogDelete\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"keeper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogInsert\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogItemUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"pair\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"maker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"pay_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"buy_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"LogKill\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"pair\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"maker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"pay_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"buy_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"LogMake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"name\":\"LogMatchingEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"min_amount\",\"type\":\"uint256\"}],\"name\":\"LogMinSell\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"baseToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"quoteToken\",\"type\":\"address\"}],\"name\":\"LogRemTokenPairWhitelist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogSortedOffer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"pair\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"maker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"taker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"take_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"give_amt\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"LogTake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"}],\"name\":\"LogTrade\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"LogUnsortedOffer\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_best\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_dust\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_near\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_rank\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"next\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prev\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"delb\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_span\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id_\",\"type\":\"bytes32\"}],\"name\":\"bump\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"buy\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"max_fill_amount\",\"type\":\"uint256\"}],\"name\":\"buyAllAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fill_amt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"buyEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"cancel\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"del_rank\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dustId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"sell_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"}],\"name\":\"getBestOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getBetterOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"}],\"name\":\"getBuyAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fill_amt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getFirstUnsortedOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"}],\"name\":\"getMinSell\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getNextUnsortedOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"sell_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"}],\"name\":\"getOfferCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"}],\"name\":\"getPayAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fill_amt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getTime\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getWorseOffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pos\",\"type\":\"uint256\"}],\"name\":\"insert\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"isActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isClosed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"closed\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"isOfferSorted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"kill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"last_offer_id\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"pay_amt\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"buy_amt\",\"type\":\"uint128\"}],\"name\":\"make\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"matchingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pos\",\"type\":\"uint256\"}],\"name\":\"offer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pos\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"rounding\",\"type\":\"bool\"}],\"name\":\"offer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"}],\"name\":\"offer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"offers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"buy_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pay_amt\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"buy_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"min_fill_amount\",\"type\":\"uint256\"}],\"name\":\"sellAllAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fill_amt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bool\",\"name\":\"buyEnabled_\",\"type\":\"bool\"}],\"name\":\"setBuyEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bool\",\"name\":\"matchingEnabled_\",\"type\":\"bool\"}],\"name\":\"setMatchingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"pay_gem\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"dust\",\"type\":\"uint256\"}],\"name\":\"setMinSell\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"stop\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stopped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"maxTakeAmount\",\"type\":\"uint128\"}],\"name\":\"take\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"dYdX * Contract for testing stuff against OasisDex. Removes some functionality like auth, note, and non-reentrancy protection.\",\"methods\":{},\"title\":\"TestOasisDex\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/testing/TestOasisDex.sol\":\"TestOasisDex\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/protocol/interfaces/IERC20Detailed.sol\":{\"keccak256\":\"0x22a62e2a8155e70300773721902f4b9118e17aa0bb5d9d1b046050a014cfb223\",\"urls\":[\"bzz-raw://03af737a33c552fbe58f6f1fbd5496854fdc28dd57be4365d56663725c083a18\",\"dweb:/ipfs/QmbgLqGAQEd6tXsZB8QaPNCAMiU6nNzP75wNbKdS65BuUF\"]},\"/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/protocol/lib/Math.sol\":{\"keccak256\":\"0x0c0c913b6ccdb69063f9ec84879fcad20a1ee6f44402c9f5ec2b4f5b9f2fa16b\",\"urls\":[\"bzz-raw://89b32eefb57e5e63ad8c6e079ae7bf2d2c8622776cd45af0cf304e1cafd6e078\",\"dweb:/ipfs/Qmcj7yRnYuTgKC3ZqZqe8rynHGYVDS3UrFExcVGcqeaDHY\"]},\"/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/protocol/lib/Require.sol\":{\"keccak256\":\"0xe641662503ea29ca959e84674188c3e9deaaf64c5623fb9560a4301c521ca1d3\",\"urls\":[\"bzz-raw://b10a04c7d014b99eb792c8c774e203c846d070b30cf0b715325fc07838ed6a6d\",\"dweb:/ipfs/QmUqZWnbchfEY9jM647yQamHe4GzspfUeRQF9k2nn1Hixd\"]},\"/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/testing/TestOasisDex.sol\":{\"keccak256\":\"0x4ea45d4b175458dc517ee2ffda1c53181c56bd445f4828d629f40fbcac18a43e\",\"urls\":[\"bzz-raw://af98d4dbd199838a8fd94d26a786c9c346e3a8fa5995eca8c084e2696dd2cbf0\",\"dweb:/ipfs/QmSa1sMaPjh1UuaePWXDkgUP96otobrSvMXj5aznjTgqSG\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzz-raw://31113152e1ddb78fe7a4197f247591ca894e93f916867beb708d8e747b6cc74f\",\"dweb:/ipfs/QmbZaJyXdpsYGykVhHH9qpVGQg9DGCxE2QufbCUy3daTgq\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzz-raw://59fd025151435da35faa8093a5c7a17de02de9d08ad27275c5cdf05050820d91\",\"dweb:/ipfs/QmQMvwEcPhoRXzbXyrdoeRtvLoifUW9Qh7Luho7bmUPRkc\"]}},\"version\":1}",
1463
+ "bytecode": "0x60806040526000805462ff00001961ff001990911661010017166201000017905534801561002c57600080fd5b5061315b8061003c6000396000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c8063779997c311610191578063bf7c734e116100e3578063d6f1546911610097578063f09ea2a611610071578063f09ea2a6146105fe578063f582d29314610611578063ff1fd97414610619576102e9565b8063d6f15469146105c5578063d6febde8146105d8578063e1a6f014146105eb576102e9565b8063c2d526aa116100c8578063c2d526aa14610570578063c41a360a14610592578063d2b420ce146105b2576102e9565b8063bf7c734e14610555578063c2b6b58c14610568576102e9565b80638af82a2e11610145578063943911bc1161011f578063943911bc1461051c578063a78d43161461052f578063b4f9b6c814610542576102e9565b80638af82a2e146104ee578063911550f4146104f657806391be90c814610509576102e9565b80638185402b116101765780638185402b146104a357806382afd23b146104b65780638a72ea6a146104c9576102e9565b8063779997c31461047d5780637ca9429a14610490576102e9565b806340e58ee51161024a578063557ed1ba116101fe578063677170e1116101d8578063677170e11461044f57806374c1d7d31461046257806375f12b2114610475576102e9565b8063557ed1ba1461041f57806356ad87641461043457806361f54a791461043c576102e9565b8063467f0b7b1161022f578063467f0b7b146103e657806349606455146103f9578063511fa4871461040c576102e9565b806340e58ee5146103b05780634579268a146103c3576102e9565b8063144a2752116102a15780631d834a1b116102865780631d834a1b14610382578063232cae0b146103955780632aed19051461039d576102e9565b8063144a27521461035c5780631b33d4121461036f576102e9565b80630621b4f6116102d25780630621b4f61461032c57806307da68f51461033f578063093f519814610349576102e9565b806301492a0b146102ee5780630374fc6f1461030c575b600080fd5b6102f661062c565b6040516103039190612eb1565b60405180910390f35b61031f61031a36600461285c565b61063b565b6040516103039190612ebf565b61031f61033a366004612974565b610668565b6103476107a4565b005b61031f610357366004612896565b6107d1565b61031f61036a3660046128f7565b61080e565b61031f61037d366004612aa8565b6108dc565b6102f6610390366004612ba4565b610909565b61031f610986565b6102f66103ab3660046129c9565b61098c565b6102f66103be366004612a05565b610a08565b6103d66103d1366004612a05565b610df9565b6040516103039493929190612f6d565b6102f66103f4366004612a05565b610e99565b610347610407366004612a23565b610f5b565b61031f61041a36600461283e565b610f84565b610427610f9f565b604051610303919061300d565b61031f610fa3565b61031f61044a366004612a05565b610fa9565b61031f61045d36600461285c565b610fbb565b61031f61047036600461285c565b610fd8565b6102f6610ff5565b61034761048b366004612a05565b610ffe565b61031f61049e36600461285c565b611130565b61031f6104b1366004612974565b61115b565b6102f66104c4366004612a05565b611277565b6104dc6104d7366004612a05565b6112b0565b60405161030396959493929190612fa2565b61031f611312565b61031f610504366004612a05565b611318565b61031f61051736600461283e565b61132a565b61031f61052a366004612a05565b61133c565b61031f61053d366004612a05565b611352565b610347610550366004612a05565b611364565b6102f6610563366004612944565b611379565b6102f66113c5565b61058361057e366004612a05565b6113ce565b60405161030393929190612ff2565b6105a56105a0366004612a05565b6113ee565b6040516103039190612e10565b6102f66105c0366004612a05565b61140c565b6102f66105d33660046129c9565b61147d565b6102f66105e6366004612ba4565b6114e7565b61031f6105f9366004612b1d565b611518565b61031f61060c366004612a53565b61156a565b6102f661158a565b61031f6106273660046128f7565b611598565b60005462010000900460ff1681565b6001600160a01b038083166000908152600260209081526040808320938516835292905220545b92915050565b6000805b841561078e5761067c848761063b565b90508061068857600080fd5b6000818152600960205260409020600281015490546106a7919061164c565b85670de0b6b3a76400000210156106bd5761078e565b6000818152600960205260409020600201548510610731576000818152600960205260409020546106ef90839061167b565b60008281526009602052604090206002015490925061070f9086906116c1565b60008281526009602052604090205490955061072c908290610f5b565b610789565b60008181526009602052604081208054600290910154633b9aca0091610763918984029161075e91611703565b61171f565b8161076a57fe5b049050610777838261167b565b92506107838282610f5b565b60009550505b61066c565b8282101561079b57600080fd5b50949350505050565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610803836fffffffffffffffffffffffffffffffff1686846fffffffffffffffffffffffffffffffff168761156a565b90505b949350505050565b60008061081b858561063b565b90505b6000818152600960205260409020600201548311156108935760008181526009602052604090205461085190839061167b565b6000828152600960205260409020600201549092506108719084906116c1565b9250821561088e576108828161133c565b90508061088e57600080fd5b61081e565b600081815260096020526040902080546002909101546108d3918491633b9aca00916108c6918884029161075e91611703565b816108cd57fe5b0461167b565b95945050505050565b60006108e66113c5565b156108f057600080fd5b6108ff86868686866001611518565b9695505050505050565b60006109148361140c565b1561091e57600080fd5b61092783611277565b61093057600080fd5b6109398361174f565b5061094483836117f9565b7f6d5c16212bdea16850dce4d9fa2314c446bd30ce84700d9c36c7677c6d2839403384604051610975929190612e46565b60405180910390a150600192915050565b60085481565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100008315158102919091178083556040517fea11e00ec1642be9b494019b756440e2c57dbe9e59242c4f9c64ce33fb4f41d9926109f79260ff9190041690612eb1565b60405180910390a15060015b919050565b600081610a1481611277565b610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f4d565b60405180910390fd5b610a5b6113c5565b80610a7f5750610a6a816113ee565b6001600160a01b0316336001600160a01b0316145b80610a8b575060075481145b610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f5d565b610aca8361140c565b15610ae657610ad88361199f565b610ae157600080fd5b610af8565b610aef8361174f565b610af857600080fd5b610b006127d2565b600960008581526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600960008581526020019081526020016000206000808201600090556001820160006101000a8154906001600160a01b03021916905560028201600090556003820160006101000a8154906001600160a01b0302191690556004820160006101000a8154906001600160a01b0302191690556004820160146101000a81549067ffffffffffffffff0219169055505080602001516001600160a01b031663a9059cbb826080015183600001516040518363ffffffff1660e01b8152600401610cbc929190612ea3565b602060405180830381600087803b158015610cd657600080fd5b505af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d0e91908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb348884604051610d3e9190612ebf565b60405180910390a180608001516001600160a01b031681602001518260600151604051602001610d6f929190612dea565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090850151606086015186519387015192948a947f9577941d28fff863bfbee4694a6a4a56fb09e169619189d2eaa750b5b481999594610de79493924290612e61565b60405180910390a45060019392505050565b600080600080610e076127d2565b5050506000928352505060096020908152604091829020825160c081018452815480825260018301546001600160a01b0390811694830185905260028401549583018690526003840154811660608401819052600490940154908116608084015274010000000000000000000000000000000000000000900467ffffffffffffffff1660a09092019190915293919291565b6000610ea482611277565b158015610ec1575060008281526001602052604090206002015415155b8015610eff57506000828152600160205260409020600201547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff64301115b610f0857600080fd5b6000828152600160208190526040808320838155918201839055600290910191909155517fcb9d6176c6aac6478ebb9a2754cdce22a944de29ed1f2642f8613884eba4b40c906109f79033908590612e46565b610f77826fffffffffffffffffffffffffffffffff83166114e7565b610f8057600080fd5b5050565b6001600160a01b031660009081526004602052604090205490565b4290565b60075481565b60009081526005602052604090205490565b600360209081526000928352604080842090915290825290205481565b600260209081526000928352604080842090915290825290205481565b60005460ff1681565b8061100881611277565b61101157600080fd5b6110196113c5565b1561102357600080fd5b60008281526009602090815260409182902060048101546001820154600390920154935186946001600160a01b0392831694611066948416939091169101612dea565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012060008681526009909252919020600181015460038201548254600284015460049094015494958a957f70a14c213064359ede031fd2a1645a11ce2ec825ffe6ab5cfb5b160c3ef4d0a295611123956001600160a01b0390811695169392909174010000000000000000000000000000000000000000900467ffffffffffffffff1690612e61565b60405180910390a4505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6000805b841561126a5761116f868561063b565b90508061117b57600080fd5b6000818152600960205260409020805460029091015461119b919061164c565b85670de0b6b3a76400000210156111b15761126a565b6000818152600960205260409020548510611222576000818152600960205260409020600201546111e390839061167b565b6000828152600960205260409020549092506112009086906116c1565b60008281526009602052604090205490955061121d908290610f5b565b611265565b600081815260096020526040902060028101549054611254918491633b9aca00916108c6918a84029161075e91611703565b91506112608186610f5b565b600094505b61115f565b8282111561079b57600080fd5b60009081526009602052604090206004015474010000000000000000000000000000000000000000900467ffffffffffffffff16151590565b6009602052600090815260409020805460018201546002830154600384015460049094015492936001600160a01b03928316939192908116919081169074010000000000000000000000000000000000000000900467ffffffffffffffff1686565b60065490565b60009081526001602052604090205490565b60046020526000908152604090205481565b6000908152600160208190526040909120015490565b60056020526000908152604090205481565b61136d81610a08565b61137657600080fd5b50565b6001600160a01b038216600090815260046020526040808220839055517fc28d56449b0bb31e64ee7487e061f57a2e72aea8019d810832f26dda099823d0906109759085908590612ea3565b60005460ff1690565b600160208190526000918252604090912080549181015460029091015483565b6000908152600960205260409020600401546001600160a01b031690565b60008181526001602052604081205415158061143957506000828152600160208190526040909120015415155b80610662575050600081815260096020908152604080832060018101546001600160a01b039081168552600284528285206003909201541684529091529020541490565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008315158102919091178083556040517f7089e4f0bcc948f9f723a361590c32d9c2284da7ab1981b1249ad2edb9f953c1926109f79260ff9190041690612eb1565b6000826114f381611277565b6114fc57600080fd5b6115046113c5565b1561150e57600080fd5b6108068484611b7b565b60006115226113c5565b1561152c57600080fd5b6001600160a01b03861660009081526004602052604090205487101561155157600080fd5b61155f878787878787611c42565b979650505050505050565b60006115746113c5565b1561157e57600080fd5b61080385858585611d9f565b600054610100900460ff1681565b6000806115a5848661063b565b90505b60008181526009602052604090205483111561161a576000818152600960205260409020600201546115db90839061167b565b6000828152600960205260409020549092506115f89084906116c1565b92508215611615576116098161133c565b90508061161557600080fd5b6115a8565b6000818152600960205260409020600281015490546108d3918491633b9aca00916108c6918884029161075e91611703565b60008161166c61166485670de0b6b3a7640000611e2d565b6002856108cd565b8161167357fe5b049392505050565b6000828201838110156116ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f2d565b9392505050565b60006116ba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e81565b60008161166c611664856b033b2e3c9fd0803ce8000000611e2d565b60006b033b2e3c9fd0803ce800000061166c61173b8585611e2d565b60026b033b2e3c9fd0803ce80000006108cd565b6006546000908061175f8461140c565b1561176957600080fd5b8360065414156117915750505060008181526005602052604081208054600655556001610a03565b5b6000821180156117a25750838214155b156117bd575060008181526005602052604090205490611792565b8382146117cf57600092505050610a03565b60008481526005602052604080822080549383529082209290925584815290555060019050919050565b61180282611277565b61180b57600080fd5b600082815260096020526040812060038101546001909101546001600160a01b039182169291169083158061185d57506000848152600960205260409020600101546001600160a01b03838116911614155b8061188557506000848152600960205260409020600301546001600160a01b03848116911614155b8061189657506118948461140c565b155b6118a9576118a48585611ec7565b6118b2565b6118b285611f9c565b935083156118e257506000838152600160208190526040808320909101805490879055868352912084905561190f565b506001600160a01b0381811660009081526002602090815260408083209386168352929052208054908590555b8015611934576000818152600160208190526040808320889055878352909120018190555b6001600160a01b038083166000908152600360209081526040808320938716835292905281902080546001019055517f20fb9bad86c18f7e22e8065258790d9416a7d2df8ff05f80f82c46d38b925acd90611990908790612ebf565b60405180910390a15050505050565b60008181526009602090815260408083206003808201546001909201546001600160a01b03908116808752918552838620921680865291909352908320549091906119e957600080fd5b600084815260016020526040902060020154158015611a0c5750611a0c8461140c565b611a1557600080fd5b6001600160a01b038082166000908152600260209081526040808320938616835292905220548414611a8757600084815260016020819052604080832054835290912001548414611a6557600080fd5b6000848152600160208190526040808320808301549054845292200155611abc565b6000848152600160208181526040808420909201546001600160a01b0380861685526002835283852090871685529091529120555b6000848152600160208190526040909120015415611b165760008481526001602081905260408083209091015482529020548414611af957600080fd5b600084815260016020819052604080832080549201548352909120555b6001600160a01b03908116600090815260036020908152604080832094909316825292835281812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938452600191829052909220436002909101555090565b60008054610100900460ff16611b9057600080fd5b600083815260096020526040902054821415611bce57611baf8361140c565b15611bc357611bbd8361199f565b50611bce565b611bcc8361174f565b505b611bd88383612021565b611be157600080fd5b611bea83611277565b8015611c245750600083815260096020818152604080842060018101546001600160a01b0316855260048352908420549387905291905254105b15611c39576007839055611c3783610a08565b505b50600192915050565b60008060008060005b6001600160a01b038089166000908152600260209081526040808320938e168352929052205415611d405750506001600160a01b038087166000908152600260208181526040808420948d168452938152838320548084526009909152929091209081015490549193509085611cc2576000611cca565b808b8a840101015b611cd48c83611e2d565b01611cdf838b611e2d565b1115611cea57611d40565b611cf8846105e6838c61245f565b50889250611d0f89611d0a838c61245f565b6116c1565b985082611d1c8a8d611e2d565b81611d2357fe5b049a508a1580611d31575088155b15611d3b57611d40565b611c4b565b600089118015611d50575060008b115b8015611d7457506001600160a01b038a166000908152600460205260409020548b10155b15611d9157611d858b8b8b8b612475565b9450611d9185886117f9565b505050509695505050505050565b6001600160a01b038316600090815260046020526040812054851015611dc457600080fd5b611dd085858585612475565b60068054600083815260056020526040908190209190915590829055519091507f8173832a493e0a3989e521458e55bfe9feac9f9b675a94e100b9d5a85f81486290611e1d908390612ebf565b60405180910390a1949350505050565b600082611e3c57506000610662565b82820282848281611e4957fe5b04146116ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f3d565b60008184841115611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a9190612f1c565b505050900390565b6000808311611ed557600080fd5b8115801590611eea5750611ee882611277565b155b15611f0a5760009182526001602081905260409092209091015490611ed5565b81611f1f57611f1883611f9c565b9050610662565b611f298383612774565b15611f645760005b8215801590611f455750611f458484612774565b15611f1857506000828152600160208190526040909120015491611f31565b8115801590611f7a5750611f788383612774565b155b15611f95576000918252600160205260409091205490611f64565b5080610662565b6000808211611faa57600080fd5b600082815260096020908152604080832060038101546001909101546001600160a01b03908116808652600285528386209190921680865293529083205491929091905b811580159061200257506120028683612774565b156108d357506000818152600160208190526040909120015490611fee565b600061202b6127d2565b506000838152600960209081526040808320815160c081018352815480825260018301546001600160a01b0390811695830195909552600283015493820184905260038301548516606083015260049092015493841660808201527401000000000000000000000000000000000000000090930467ffffffffffffffff1660a0840152919291906120bd908690611e2d565b816120c457fe5b04905080816fffffffffffffffffffffffffffffffff16146120e557600080fd5b83846fffffffffffffffffffffffffffffffff161461210357600080fd5b83158061210e575080155b806121195750815184115b806121275750816040015181115b1561213757600092505050610662565b815161214390856116c1565b600086815260096020526040908190209190915582015161216490826116c1565b60008681526009602052604090819020600201919091556060830151608084015191517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916323b872dd916121cc9133918690600401612e1e565b602060405180830381600087803b1580156121e657600080fd5b505af11580156121fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061221e91908101906129e7565b5081602001516001600160a01b031663a9059cbb33866040518363ffffffff1660e01b8152600401612251929190612e46565b602060405180830381600087803b15801561226b57600080fd5b505af115801561227f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122a391908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb3488856040516122d39190612ebf565b60405180910390a1336001600160a01b031682608001516001600160a01b03168360200151846060015160405160200161230e929190612dea565b604051602081830303815290604052805190602001207f3383e3357c77fd2e3a4b30deea81179bc70a795d053d14d5b7f2f01d0fd4596f8860001b866020015187606001518a884260405161236896959493929190612ecd565b60405180910390a481606001516001600160a01b031682602001516001600160a01b03167f819e390338feffe95e2de57172d6faf337853dfd15c7a09a32d76f7fd244387586846040516123bd929190612fe4565b60405180910390a36000858152600960205260409020546124545760008581526009602052604081208181556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600282019290925560038101805490921690915560040180547fffffffff000000000000000000000000000000000000000000000000000000001690555b506001949350505050565b600081831061246e57816116ba565b5090919050565b600084856fffffffffffffffffffffffffffffffff161461249557600080fd5b82836fffffffffffffffffffffffffffffffff16146124b357600080fd5b600085116124c057600080fd5b6001600160a01b0384166124d357600080fd5b600083116124e057600080fd5b6001600160a01b0382166124f357600080fd5b816001600160a01b0316846001600160a01b0316141561251257600080fd5b61251a6127d2565b8581526001600160a01b038086166020830152604082018590528316606082015233608082015267ffffffffffffffff421660a08201526125596127c4565b60008181526009602090815260409182902084518155908401516001820180546001600160a01b039283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155838601516002840155606086015160038401805491841691831691909117905560808601516004938401805460a089015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff93861691909416179190911691909117905591517f23b872dd000000000000000000000000000000000000000000000000000000008152929450908716916323b872dd9161267391339130918c9101612e1e565b602060405180830381600087803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126c591908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb3488826040516126f59190612ebf565b60405180910390a160405133906127129087908690602001612dea565b604051602081830303815290604052805190602001208360001b7f773ff502687307abfa024ac9f62f9752a0d210dac2ffd9a29e38e12e2ea82c8288878b8a42604051612763959493929190612e61565b60405180910390a450949350505050565b60008181526009602052604080822060020154848352908220546127989190611e2d565b600084815260096020526040808220600201548583529120546127bb9190611e2d565b10159392505050565b600880546001019081905590565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b8035610662816130e9565b8035610662816130fd565b8051610662816130fd565b803561066281613106565b80356106628161310f565b60006020828403121561285057600080fd5b60006108068484612807565b6000806040838503121561286f57600080fd5b600061287b8585612807565b925050602061288c85828601612807565b9150509250929050565b600080600080608085870312156128ac57600080fd5b60006128b88787612807565b94505060206128c987828801612807565b93505060406128da87828801612833565b92505060606128eb87828801612833565b91505092959194509250565b60008060006060848603121561290c57600080fd5b60006129188686612807565b935050602061292986828701612807565b925050604061293a86828701612828565b9150509250925092565b6000806040838503121561295757600080fd5b60006129638585612807565b925050602061288c85828601612828565b6000806000806080858703121561298a57600080fd5b60006129968787612807565b94505060206129a787828801612828565b93505060406129b887828801612807565b92505060606128eb87828801612828565b6000602082840312156129db57600080fd5b60006108068484612812565b6000602082840312156129f957600080fd5b6000610806848461281d565b600060208284031215612a1757600080fd5b60006108068484612828565b60008060408385031215612a3657600080fd5b6000612a428585612828565b925050602061288c85828601612833565b60008060008060808587031215612a6957600080fd5b6000612a758787612828565b9450506020612a8687828801612807565b9350506040612a9787828801612828565b92505060606128eb87828801612807565b600080600080600060a08688031215612ac057600080fd5b6000612acc8888612828565b9550506020612add88828901612807565b9450506040612aee88828901612828565b9350506060612aff88828901612807565b9250506080612b1088828901612828565b9150509295509295909350565b60008060008060008060c08789031215612b3657600080fd5b6000612b428989612828565b9650506020612b5389828a01612807565b9550506040612b6489828a01612828565b9450506060612b7589828a01612807565b9350506080612b8689828a01612828565b92505060a0612b9789828a01612812565b9150509295509295509295565b60008060408385031215612bb757600080fd5b60006129638585612828565b612bcc81613069565b82525050565b612bcc81613028565b612bcc612be782613028565b6130aa565b612bcc81613033565b612bcc81613038565b6000612c098261301b565b612c13818561301f565b9350612c2381856020860161307a565b612c2c816130bb565b9093019392505050565b6000612c43601b8361301f565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612c7c60218361301f565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000612cdb602d8361301f565b7f4f66666572207761732064656c65746564206f722074616b656e2c206f72206e81527f6576657220657869737465642e00000000000000000000000000000000000000602082015260400192915050565b6000612d3a60748361301f565b7f4f666665722063616e206e6f742062652063616e63656c6c656420626563617581527f73652075736572206973206e6f74206f776e65722c20616e64206d61726b657460208201527f206973206f70656e2c20616e64206f666665722073656c6c732072657175697260408201527f656420616d6f756e74206f6620746f6b656e732e000000000000000000000000606082015260800192915050565b612bcc8161303b565b612bcc8161305c565b6000612df68285612bdb565b601482019150612e068284612bdb565b5060140192915050565b602081016106628284612bd2565b60608101612e2c8286612bc3565b612e396020830185612bd2565b6108066040830184612bf5565b60408101612e548285612bc3565b6116ba6020830184612bf5565b60a08101612e6f8288612bd2565b612e7c6020830187612bd2565b612e896040830186612dd8565b612e966060830185612dd8565b6108ff6080830184612de1565b60408101612e548285612bd2565b602081016106628284612bec565b602081016106628284612bf5565b60c08101612edb8289612bf5565b612ee86020830188612bd2565b612ef56040830187612bd2565b612f026060830186612dd8565b612f0f6080830185612dd8565b61155f60a0830184612de1565b602080825281016116ba8184612bfe565b6020808252810161066281612c36565b6020808252810161066281612c6f565b6020808252810161066281612cce565b6020808252810161066281612d2d565b60808101612f7b8287612bf5565b612f886020830186612bd2565b612f956040830185612bf5565b6108d36060830184612bd2565b60c08101612fb08289612bf5565b612fbd6020830188612bd2565b612fca6040830187612bf5565b612fd76060830186612bd2565b612f0f6080830185612bd2565b60408101612e548285612bf5565b606081016130008286612bf5565b612e396020830185612bf5565b602081016106628284612de1565b5190565b90815260200190565b600061066282613050565b151590565b90565b6fffffffffffffffffffffffffffffffff1690565b6001600160a01b031690565b67ffffffffffffffff1690565b600061066282600061066282613028565b60005b8381101561309557818101518382015260200161307d565b838111156130a4576000848401525b50505050565b6000610662826000610662826130e3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b60601b90565b6130f281613028565b811461137657600080fd5b6130f281613033565b6130f281613038565b6130f28161303b56fea365627a7a723158204b3005880e22c4e275ed43f1df81336c1e726c1d07a5b04595715d7cba04256c6c6578706572696d656e74616cf564736f6c63430005100040",
1464
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e95760003560e01c8063779997c311610191578063bf7c734e116100e3578063d6f1546911610097578063f09ea2a611610071578063f09ea2a6146105fe578063f582d29314610611578063ff1fd97414610619576102e9565b8063d6f15469146105c5578063d6febde8146105d8578063e1a6f014146105eb576102e9565b8063c2d526aa116100c8578063c2d526aa14610570578063c41a360a14610592578063d2b420ce146105b2576102e9565b8063bf7c734e14610555578063c2b6b58c14610568576102e9565b80638af82a2e11610145578063943911bc1161011f578063943911bc1461051c578063a78d43161461052f578063b4f9b6c814610542576102e9565b80638af82a2e146104ee578063911550f4146104f657806391be90c814610509576102e9565b80638185402b116101765780638185402b146104a357806382afd23b146104b65780638a72ea6a146104c9576102e9565b8063779997c31461047d5780637ca9429a14610490576102e9565b806340e58ee51161024a578063557ed1ba116101fe578063677170e1116101d8578063677170e11461044f57806374c1d7d31461046257806375f12b2114610475576102e9565b8063557ed1ba1461041f57806356ad87641461043457806361f54a791461043c576102e9565b8063467f0b7b1161022f578063467f0b7b146103e657806349606455146103f9578063511fa4871461040c576102e9565b806340e58ee5146103b05780634579268a146103c3576102e9565b8063144a2752116102a15780631d834a1b116102865780631d834a1b14610382578063232cae0b146103955780632aed19051461039d576102e9565b8063144a27521461035c5780631b33d4121461036f576102e9565b80630621b4f6116102d25780630621b4f61461032c57806307da68f51461033f578063093f519814610349576102e9565b806301492a0b146102ee5780630374fc6f1461030c575b600080fd5b6102f661062c565b6040516103039190612eb1565b60405180910390f35b61031f61031a36600461285c565b61063b565b6040516103039190612ebf565b61031f61033a366004612974565b610668565b6103476107a4565b005b61031f610357366004612896565b6107d1565b61031f61036a3660046128f7565b61080e565b61031f61037d366004612aa8565b6108dc565b6102f6610390366004612ba4565b610909565b61031f610986565b6102f66103ab3660046129c9565b61098c565b6102f66103be366004612a05565b610a08565b6103d66103d1366004612a05565b610df9565b6040516103039493929190612f6d565b6102f66103f4366004612a05565b610e99565b610347610407366004612a23565b610f5b565b61031f61041a36600461283e565b610f84565b610427610f9f565b604051610303919061300d565b61031f610fa3565b61031f61044a366004612a05565b610fa9565b61031f61045d36600461285c565b610fbb565b61031f61047036600461285c565b610fd8565b6102f6610ff5565b61034761048b366004612a05565b610ffe565b61031f61049e36600461285c565b611130565b61031f6104b1366004612974565b61115b565b6102f66104c4366004612a05565b611277565b6104dc6104d7366004612a05565b6112b0565b60405161030396959493929190612fa2565b61031f611312565b61031f610504366004612a05565b611318565b61031f61051736600461283e565b61132a565b61031f61052a366004612a05565b61133c565b61031f61053d366004612a05565b611352565b610347610550366004612a05565b611364565b6102f6610563366004612944565b611379565b6102f66113c5565b61058361057e366004612a05565b6113ce565b60405161030393929190612ff2565b6105a56105a0366004612a05565b6113ee565b6040516103039190612e10565b6102f66105c0366004612a05565b61140c565b6102f66105d33660046129c9565b61147d565b6102f66105e6366004612ba4565b6114e7565b61031f6105f9366004612b1d565b611518565b61031f61060c366004612a53565b61156a565b6102f661158a565b61031f6106273660046128f7565b611598565b60005462010000900460ff1681565b6001600160a01b038083166000908152600260209081526040808320938516835292905220545b92915050565b6000805b841561078e5761067c848761063b565b90508061068857600080fd5b6000818152600960205260409020600281015490546106a7919061164c565b85670de0b6b3a76400000210156106bd5761078e565b6000818152600960205260409020600201548510610731576000818152600960205260409020546106ef90839061167b565b60008281526009602052604090206002015490925061070f9086906116c1565b60008281526009602052604090205490955061072c908290610f5b565b610789565b60008181526009602052604081208054600290910154633b9aca0091610763918984029161075e91611703565b61171f565b8161076a57fe5b049050610777838261167b565b92506107838282610f5b565b60009550505b61066c565b8282101561079b57600080fd5b50949350505050565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610803836fffffffffffffffffffffffffffffffff1686846fffffffffffffffffffffffffffffffff168761156a565b90505b949350505050565b60008061081b858561063b565b90505b6000818152600960205260409020600201548311156108935760008181526009602052604090205461085190839061167b565b6000828152600960205260409020600201549092506108719084906116c1565b9250821561088e576108828161133c565b90508061088e57600080fd5b61081e565b600081815260096020526040902080546002909101546108d3918491633b9aca00916108c6918884029161075e91611703565b816108cd57fe5b0461167b565b95945050505050565b60006108e66113c5565b156108f057600080fd5b6108ff86868686866001611518565b9695505050505050565b60006109148361140c565b1561091e57600080fd5b61092783611277565b61093057600080fd5b6109398361174f565b5061094483836117f9565b7f6d5c16212bdea16850dce4d9fa2314c446bd30ce84700d9c36c7677c6d2839403384604051610975929190612e46565b60405180910390a150600192915050565b60085481565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100008315158102919091178083556040517fea11e00ec1642be9b494019b756440e2c57dbe9e59242c4f9c64ce33fb4f41d9926109f79260ff9190041690612eb1565b60405180910390a15060015b919050565b600081610a1481611277565b610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f4d565b60405180910390fd5b610a5b6113c5565b80610a7f5750610a6a816113ee565b6001600160a01b0316336001600160a01b0316145b80610a8b575060075481145b610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f5d565b610aca8361140c565b15610ae657610ad88361199f565b610ae157600080fd5b610af8565b610aef8361174f565b610af857600080fd5b610b006127d2565b600960008581526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600960008581526020019081526020016000206000808201600090556001820160006101000a8154906001600160a01b03021916905560028201600090556003820160006101000a8154906001600160a01b0302191690556004820160006101000a8154906001600160a01b0302191690556004820160146101000a81549067ffffffffffffffff0219169055505080602001516001600160a01b031663a9059cbb826080015183600001516040518363ffffffff1660e01b8152600401610cbc929190612ea3565b602060405180830381600087803b158015610cd657600080fd5b505af1158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d0e91908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb348884604051610d3e9190612ebf565b60405180910390a180608001516001600160a01b031681602001518260600151604051602001610d6f929190612dea565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090850151606086015186519387015192948a947f9577941d28fff863bfbee4694a6a4a56fb09e169619189d2eaa750b5b481999594610de79493924290612e61565b60405180910390a45060019392505050565b600080600080610e076127d2565b5050506000928352505060096020908152604091829020825160c081018452815480825260018301546001600160a01b0390811694830185905260028401549583018690526003840154811660608401819052600490940154908116608084015274010000000000000000000000000000000000000000900467ffffffffffffffff1660a09092019190915293919291565b6000610ea482611277565b158015610ec1575060008281526001602052604090206002015415155b8015610eff57506000828152600160205260409020600201547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff64301115b610f0857600080fd5b6000828152600160208190526040808320838155918201839055600290910191909155517fcb9d6176c6aac6478ebb9a2754cdce22a944de29ed1f2642f8613884eba4b40c906109f79033908590612e46565b610f77826fffffffffffffffffffffffffffffffff83166114e7565b610f8057600080fd5b5050565b6001600160a01b031660009081526004602052604090205490565b4290565b60075481565b60009081526005602052604090205490565b600360209081526000928352604080842090915290825290205481565b600260209081526000928352604080842090915290825290205481565b60005460ff1681565b8061100881611277565b61101157600080fd5b6110196113c5565b1561102357600080fd5b60008281526009602090815260409182902060048101546001820154600390920154935186946001600160a01b0392831694611066948416939091169101612dea565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012060008681526009909252919020600181015460038201548254600284015460049094015494958a957f70a14c213064359ede031fd2a1645a11ce2ec825ffe6ab5cfb5b160c3ef4d0a295611123956001600160a01b0390811695169392909174010000000000000000000000000000000000000000900467ffffffffffffffff1690612e61565b60405180910390a4505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6000805b841561126a5761116f868561063b565b90508061117b57600080fd5b6000818152600960205260409020805460029091015461119b919061164c565b85670de0b6b3a76400000210156111b15761126a565b6000818152600960205260409020548510611222576000818152600960205260409020600201546111e390839061167b565b6000828152600960205260409020549092506112009086906116c1565b60008281526009602052604090205490955061121d908290610f5b565b611265565b600081815260096020526040902060028101549054611254918491633b9aca00916108c6918a84029161075e91611703565b91506112608186610f5b565b600094505b61115f565b8282111561079b57600080fd5b60009081526009602052604090206004015474010000000000000000000000000000000000000000900467ffffffffffffffff16151590565b6009602052600090815260409020805460018201546002830154600384015460049094015492936001600160a01b03928316939192908116919081169074010000000000000000000000000000000000000000900467ffffffffffffffff1686565b60065490565b60009081526001602052604090205490565b60046020526000908152604090205481565b6000908152600160208190526040909120015490565b60056020526000908152604090205481565b61136d81610a08565b61137657600080fd5b50565b6001600160a01b038216600090815260046020526040808220839055517fc28d56449b0bb31e64ee7487e061f57a2e72aea8019d810832f26dda099823d0906109759085908590612ea3565b60005460ff1690565b600160208190526000918252604090912080549181015460029091015483565b6000908152600960205260409020600401546001600160a01b031690565b60008181526001602052604081205415158061143957506000828152600160208190526040909120015415155b80610662575050600081815260096020908152604080832060018101546001600160a01b039081168552600284528285206003909201541684529091529020541490565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008315158102919091178083556040517f7089e4f0bcc948f9f723a361590c32d9c2284da7ab1981b1249ad2edb9f953c1926109f79260ff9190041690612eb1565b6000826114f381611277565b6114fc57600080fd5b6115046113c5565b1561150e57600080fd5b6108068484611b7b565b60006115226113c5565b1561152c57600080fd5b6001600160a01b03861660009081526004602052604090205487101561155157600080fd5b61155f878787878787611c42565b979650505050505050565b60006115746113c5565b1561157e57600080fd5b61080385858585611d9f565b600054610100900460ff1681565b6000806115a5848661063b565b90505b60008181526009602052604090205483111561161a576000818152600960205260409020600201546115db90839061167b565b6000828152600960205260409020549092506115f89084906116c1565b92508215611615576116098161133c565b90508061161557600080fd5b6115a8565b6000818152600960205260409020600281015490546108d3918491633b9aca00916108c6918884029161075e91611703565b60008161166c61166485670de0b6b3a7640000611e2d565b6002856108cd565b8161167357fe5b049392505050565b6000828201838110156116ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f2d565b9392505050565b60006116ba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e81565b60008161166c611664856b033b2e3c9fd0803ce8000000611e2d565b60006b033b2e3c9fd0803ce800000061166c61173b8585611e2d565b60026b033b2e3c9fd0803ce80000006108cd565b6006546000908061175f8461140c565b1561176957600080fd5b8360065414156117915750505060008181526005602052604081208054600655556001610a03565b5b6000821180156117a25750838214155b156117bd575060008181526005602052604090205490611792565b8382146117cf57600092505050610a03565b60008481526005602052604080822080549383529082209290925584815290555060019050919050565b61180282611277565b61180b57600080fd5b600082815260096020526040812060038101546001909101546001600160a01b039182169291169083158061185d57506000848152600960205260409020600101546001600160a01b03838116911614155b8061188557506000848152600960205260409020600301546001600160a01b03848116911614155b8061189657506118948461140c565b155b6118a9576118a48585611ec7565b6118b2565b6118b285611f9c565b935083156118e257506000838152600160208190526040808320909101805490879055868352912084905561190f565b506001600160a01b0381811660009081526002602090815260408083209386168352929052208054908590555b8015611934576000818152600160208190526040808320889055878352909120018190555b6001600160a01b038083166000908152600360209081526040808320938716835292905281902080546001019055517f20fb9bad86c18f7e22e8065258790d9416a7d2df8ff05f80f82c46d38b925acd90611990908790612ebf565b60405180910390a15050505050565b60008181526009602090815260408083206003808201546001909201546001600160a01b03908116808752918552838620921680865291909352908320549091906119e957600080fd5b600084815260016020526040902060020154158015611a0c5750611a0c8461140c565b611a1557600080fd5b6001600160a01b038082166000908152600260209081526040808320938616835292905220548414611a8757600084815260016020819052604080832054835290912001548414611a6557600080fd5b6000848152600160208190526040808320808301549054845292200155611abc565b6000848152600160208181526040808420909201546001600160a01b0380861685526002835283852090871685529091529120555b6000848152600160208190526040909120015415611b165760008481526001602081905260408083209091015482529020548414611af957600080fd5b600084815260016020819052604080832080549201548352909120555b6001600160a01b03908116600090815260036020908152604080832094909316825292835281812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938452600191829052909220436002909101555090565b60008054610100900460ff16611b9057600080fd5b600083815260096020526040902054821415611bce57611baf8361140c565b15611bc357611bbd8361199f565b50611bce565b611bcc8361174f565b505b611bd88383612021565b611be157600080fd5b611bea83611277565b8015611c245750600083815260096020818152604080842060018101546001600160a01b0316855260048352908420549387905291905254105b15611c39576007839055611c3783610a08565b505b50600192915050565b60008060008060005b6001600160a01b038089166000908152600260209081526040808320938e168352929052205415611d405750506001600160a01b038087166000908152600260208181526040808420948d168452938152838320548084526009909152929091209081015490549193509085611cc2576000611cca565b808b8a840101015b611cd48c83611e2d565b01611cdf838b611e2d565b1115611cea57611d40565b611cf8846105e6838c61245f565b50889250611d0f89611d0a838c61245f565b6116c1565b985082611d1c8a8d611e2d565b81611d2357fe5b049a508a1580611d31575088155b15611d3b57611d40565b611c4b565b600089118015611d50575060008b115b8015611d7457506001600160a01b038a166000908152600460205260409020548b10155b15611d9157611d858b8b8b8b612475565b9450611d9185886117f9565b505050509695505050505050565b6001600160a01b038316600090815260046020526040812054851015611dc457600080fd5b611dd085858585612475565b60068054600083815260056020526040908190209190915590829055519091507f8173832a493e0a3989e521458e55bfe9feac9f9b675a94e100b9d5a85f81486290611e1d908390612ebf565b60405180910390a1949350505050565b600082611e3c57506000610662565b82820282848281611e4957fe5b04146116ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a90612f3d565b60008184841115611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a9190612f1c565b505050900390565b6000808311611ed557600080fd5b8115801590611eea5750611ee882611277565b155b15611f0a5760009182526001602081905260409092209091015490611ed5565b81611f1f57611f1883611f9c565b9050610662565b611f298383612774565b15611f645760005b8215801590611f455750611f458484612774565b15611f1857506000828152600160208190526040909120015491611f31565b8115801590611f7a5750611f788383612774565b155b15611f95576000918252600160205260409091205490611f64565b5080610662565b6000808211611faa57600080fd5b600082815260096020908152604080832060038101546001909101546001600160a01b03908116808652600285528386209190921680865293529083205491929091905b811580159061200257506120028683612774565b156108d357506000818152600160208190526040909120015490611fee565b600061202b6127d2565b506000838152600960209081526040808320815160c081018352815480825260018301546001600160a01b0390811695830195909552600283015493820184905260038301548516606083015260049092015493841660808201527401000000000000000000000000000000000000000090930467ffffffffffffffff1660a0840152919291906120bd908690611e2d565b816120c457fe5b04905080816fffffffffffffffffffffffffffffffff16146120e557600080fd5b83846fffffffffffffffffffffffffffffffff161461210357600080fd5b83158061210e575080155b806121195750815184115b806121275750816040015181115b1561213757600092505050610662565b815161214390856116c1565b600086815260096020526040908190209190915582015161216490826116c1565b60008681526009602052604090819020600201919091556060830151608084015191517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916323b872dd916121cc9133918690600401612e1e565b602060405180830381600087803b1580156121e657600080fd5b505af11580156121fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061221e91908101906129e7565b5081602001516001600160a01b031663a9059cbb33866040518363ffffffff1660e01b8152600401612251929190612e46565b602060405180830381600087803b15801561226b57600080fd5b505af115801561227f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122a391908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb3488856040516122d39190612ebf565b60405180910390a1336001600160a01b031682608001516001600160a01b03168360200151846060015160405160200161230e929190612dea565b604051602081830303815290604052805190602001207f3383e3357c77fd2e3a4b30deea81179bc70a795d053d14d5b7f2f01d0fd4596f8860001b866020015187606001518a884260405161236896959493929190612ecd565b60405180910390a481606001516001600160a01b031682602001516001600160a01b03167f819e390338feffe95e2de57172d6faf337853dfd15c7a09a32d76f7fd244387586846040516123bd929190612fe4565b60405180910390a36000858152600960205260409020546124545760008581526009602052604081208181556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600282019290925560038101805490921690915560040180547fffffffff000000000000000000000000000000000000000000000000000000001690555b506001949350505050565b600081831061246e57816116ba565b5090919050565b600084856fffffffffffffffffffffffffffffffff161461249557600080fd5b82836fffffffffffffffffffffffffffffffff16146124b357600080fd5b600085116124c057600080fd5b6001600160a01b0384166124d357600080fd5b600083116124e057600080fd5b6001600160a01b0382166124f357600080fd5b816001600160a01b0316846001600160a01b0316141561251257600080fd5b61251a6127d2565b8581526001600160a01b038086166020830152604082018590528316606082015233608082015267ffffffffffffffff421660a08201526125596127c4565b60008181526009602090815260409182902084518155908401516001820180546001600160a01b039283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155838601516002840155606086015160038401805491841691831691909117905560808601516004938401805460a089015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff93861691909416179190911691909117905591517f23b872dd000000000000000000000000000000000000000000000000000000008152929450908716916323b872dd9161267391339130918c9101612e1e565b602060405180830381600087803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126c591908101906129e7565b507fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb3488826040516126f59190612ebf565b60405180910390a160405133906127129087908690602001612dea565b604051602081830303815290604052805190602001208360001b7f773ff502687307abfa024ac9f62f9752a0d210dac2ffd9a29e38e12e2ea82c8288878b8a42604051612763959493929190612e61565b60405180910390a450949350505050565b60008181526009602052604080822060020154848352908220546127989190611e2d565b600084815260096020526040808220600201548583529120546127bb9190611e2d565b10159392505050565b600880546001019081905590565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b8035610662816130e9565b8035610662816130fd565b8051610662816130fd565b803561066281613106565b80356106628161310f565b60006020828403121561285057600080fd5b60006108068484612807565b6000806040838503121561286f57600080fd5b600061287b8585612807565b925050602061288c85828601612807565b9150509250929050565b600080600080608085870312156128ac57600080fd5b60006128b88787612807565b94505060206128c987828801612807565b93505060406128da87828801612833565b92505060606128eb87828801612833565b91505092959194509250565b60008060006060848603121561290c57600080fd5b60006129188686612807565b935050602061292986828701612807565b925050604061293a86828701612828565b9150509250925092565b6000806040838503121561295757600080fd5b60006129638585612807565b925050602061288c85828601612828565b6000806000806080858703121561298a57600080fd5b60006129968787612807565b94505060206129a787828801612828565b93505060406129b887828801612807565b92505060606128eb87828801612828565b6000602082840312156129db57600080fd5b60006108068484612812565b6000602082840312156129f957600080fd5b6000610806848461281d565b600060208284031215612a1757600080fd5b60006108068484612828565b60008060408385031215612a3657600080fd5b6000612a428585612828565b925050602061288c85828601612833565b60008060008060808587031215612a6957600080fd5b6000612a758787612828565b9450506020612a8687828801612807565b9350506040612a9787828801612828565b92505060606128eb87828801612807565b600080600080600060a08688031215612ac057600080fd5b6000612acc8888612828565b9550506020612add88828901612807565b9450506040612aee88828901612828565b9350506060612aff88828901612807565b9250506080612b1088828901612828565b9150509295509295909350565b60008060008060008060c08789031215612b3657600080fd5b6000612b428989612828565b9650506020612b5389828a01612807565b9550506040612b6489828a01612828565b9450506060612b7589828a01612807565b9350506080612b8689828a01612828565b92505060a0612b9789828a01612812565b9150509295509295509295565b60008060408385031215612bb757600080fd5b60006129638585612828565b612bcc81613069565b82525050565b612bcc81613028565b612bcc612be782613028565b6130aa565b612bcc81613033565b612bcc81613038565b6000612c098261301b565b612c13818561301f565b9350612c2381856020860161307a565b612c2c816130bb565b9093019392505050565b6000612c43601b8361301f565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612c7c60218361301f565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000612cdb602d8361301f565b7f4f66666572207761732064656c65746564206f722074616b656e2c206f72206e81527f6576657220657869737465642e00000000000000000000000000000000000000602082015260400192915050565b6000612d3a60748361301f565b7f4f666665722063616e206e6f742062652063616e63656c6c656420626563617581527f73652075736572206973206e6f74206f776e65722c20616e64206d61726b657460208201527f206973206f70656e2c20616e64206f666665722073656c6c732072657175697260408201527f656420616d6f756e74206f6620746f6b656e732e000000000000000000000000606082015260800192915050565b612bcc8161303b565b612bcc8161305c565b6000612df68285612bdb565b601482019150612e068284612bdb565b5060140192915050565b602081016106628284612bd2565b60608101612e2c8286612bc3565b612e396020830185612bd2565b6108066040830184612bf5565b60408101612e548285612bc3565b6116ba6020830184612bf5565b60a08101612e6f8288612bd2565b612e7c6020830187612bd2565b612e896040830186612dd8565b612e966060830185612dd8565b6108ff6080830184612de1565b60408101612e548285612bd2565b602081016106628284612bec565b602081016106628284612bf5565b60c08101612edb8289612bf5565b612ee86020830188612bd2565b612ef56040830187612bd2565b612f026060830186612dd8565b612f0f6080830185612dd8565b61155f60a0830184612de1565b602080825281016116ba8184612bfe565b6020808252810161066281612c36565b6020808252810161066281612c6f565b6020808252810161066281612cce565b6020808252810161066281612d2d565b60808101612f7b8287612bf5565b612f886020830186612bd2565b612f956040830185612bf5565b6108d36060830184612bd2565b60c08101612fb08289612bf5565b612fbd6020830188612bd2565b612fca6040830187612bf5565b612fd76060830186612bd2565b612f0f6080830185612bd2565b60408101612e548285612bf5565b606081016130008286612bf5565b612e396020830185612bf5565b602081016106628284612de1565b5190565b90815260200190565b600061066282613050565b151590565b90565b6fffffffffffffffffffffffffffffffff1690565b6001600160a01b031690565b67ffffffffffffffff1690565b600061066282600061066282613028565b60005b8381101561309557818101518382015260200161307d565b838111156130a4576000848401525b50505050565b6000610662826000610662826130e3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b60601b90565b6130f281613028565b811461137657600080fd5b6130f281613033565b6130f281613038565b6130f28161303b56fea365627a7a723158204b3005880e22c4e275ed43f1df81336c1e726c1d07a5b04595715d7cba04256c6c6578706572696d656e74616cf564736f6c63430005100040",
1465
1465
  "sourceMap": "1035:32173:104:-;;;3632:29;;;-1:-1:-1;;;;3632:29:104;;;;;3667:34;;;;;1035:32173;5:2:-1;;;;30:1;27;20:12;5:2;1035:32173:104;;;;;;;",
1466
1466
  "deployedSourceMap": "1035:32173:104:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1035:32173:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3667:34;;;:::i;:::-;;;;;;;;;;;;;;;;12329:134;;;;;;;;;:::i;:::-;;;;;;;;14354:1737;;;;;;;;;:::i;4929:54::-;;;:::i;:::-;;5924:247;;;;;;;;;:::i;17830:1003::-;;;;;;;;;:::i;7361:471::-;;;;;;;;;:::i;9613:536::-;;;;;;;;;:::i;4024:28::-;;;:::i;11974:195::-;;;;;;;;;:::i;8694:833::-;;;;;;;;;:::i;5219:235::-;;;;;;;;;:::i;:::-;;;;;;;;;;;10226:259;;;;;;;;;:::i;6177:113::-;;;;;;;;;:::i;11106:201::-;;;;;;;;;:::i;4840:83::-;;;:::i;:::-;;;;;;;;3997:21;;;:::i;14026:104::-;;;;;;;;;:::i;3820:60::-;;;;;;;;;:::i;3754:::-;;;;;;;;;:::i;3607:19::-;;;:::i;5460:458::-;;;;;;;;;:::i;13210:135::-;;;;;;;;;:::i;16097:1727::-;;;;;;;;;:::i;4989:112::-;;;;;;;;;:::i;4058:44::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13829:91;;;:::i;13042:104::-;;;;;;;;;:::i;3886:40::-;;;;;;;;;:::i;12689:102::-;;;;;;;;;:::i;3932:40::-;;;;;;;;;:::i;6296:78::-;;;;;;;;;:::i;10747:302::-;;;;;;;;;:::i;4749:85::-;;;:::i;3707:41::-;;;;;;;;;:::i;:::-;;;;;;;;;;5107:106;;;;;;;;;:::i;:::-;;;;;;;;14136:212;;;;;;;;;:::i;11358:165::-;;;;;;;;;:::i;8499:144::-;;;;;;;;;:::i;7838:578::-;;;;;;;;;:::i;6904:378::-;;;;;;;;;:::i;3632:29::-;;;:::i;18839:1003::-;;;;;;;;;:::i;3667:34::-;;;;;;;;;:::o;12329:134::-;-1:-1:-1;;;;;12432:15:104;;;12406:7;12432:15;;;:5;:15;;;;;;;;:24;;;;;;;;;;12329:134;;;;;:::o;14354:1737::-;14485:16;14517:15;14542:1497;14549:11;;14542:1497;;14644:30;14657:7;14666;14644:12;:30::i;:::-;14634:40;-1:-1:-1;14738:12:104;14730:21;;;;;;14940:15;;;;:6;:15;;;;;:23;;;;14965;;14935:54;;14940:23;14935:4;:54::i;:::-;14915:7;14925;14915:17;:74;14911:189;;;15009:5;;14911:189;15128:15;;;;:6;:15;;;;;:23;;;15117:34;;15113:916;;15299:15;;;;:6;:15;;;;;:23;15276:47;;15289:8;;15276:12;:47::i;:::-;15416:15;;;;:6;:15;;;;;:23;;;15265:58;;-1:-1:-1;15394:46:104;;15407:7;;15394:12;:46::i;:::-;15500:16;15526:15;;;:6;:15;;;;;:23;15384:56;;-1:-1:-1;15495:56:104;;15508:7;;15495:4;:56::i;:::-;15113:916;;;15630:12;15674:15;;;:6;:15;;;;;:23;;15699;;;;;15727:7;;15645:79;;15650:17;;;;15669:54;;:4;:54::i;:::-;15645:4;:79::i;:::-;:89;;;;;;15630:104;;15763:28;15776:8;15786:4;15763:12;:28::i;:::-;15752:39;-1:-1:-1;15851:37:104;15864:7;15882:4;15851;:37::i;:::-;15965:1;15955:11;;15113:916;;14542:1497;;;16068:15;16056:8;:27;;16048:36;;;;;;14354:1737;;;;;;;:::o;4929:54::-;4962:7;:14;;;;4972:4;4962:14;;;4929:54::o;5924:247::-;6084:7;6122:41;6128:7;6122:41;;6137:7;6146;6122:41;;6155:7;6122:5;:41::i;:::-;6114:50;-1:-1:-1;5924:247:104;;;;;;;:::o;17830:1003::-;17924:16;17952:15;17970:30;17983:7;17992;17970:12;:30::i;:::-;17952:48;;18056:578;18073:15;;;;:6;:15;;;;;:23;;;18063:33;;18056:578;;;18146:15;;;;:6;:15;;;;;:23;18123:47;;18136:8;;18123:12;:47::i;:::-;18249:15;;;;:6;:15;;;;;:23;;;18112:58;;-1:-1:-1;18227:46:104;;18240:7;;18227:12;:46::i;:::-;18217:56;-1:-1:-1;18319:11:104;;18315:309;;18424:22;18438:7;18424:13;:22::i;:::-;18414:32;-1:-1:-1;18520:12:104;18512:21;;;;;;18056:578;;;18706:15;;;;:6;:15;;;;;:23;;18731;;;;;18654:113;;18667:8;;18759:7;;18677:79;;18682:17;;;;18701:54;;:4;:54::i;18677:79::-;:89;;;;;;18654:12;:113::i;:::-;18643:124;17830:1003;-1:-1:-1;;;;;17830:1003:104:o;7361:471::-;7743:7;4191:10;:8;:10::i;:::-;4190:11;4182:20;;;;;;7773:52;7779:7;7788;7797;7806;7815:3;7820:4;7773:5;:52::i;:::-;7766:59;7361:471;-1:-1:-1;;;;;;7361:471:104:o;9613:536::-;9755:4;9784:17;9798:2;9784:13;:17::i;:::-;9783:18;9775:27;;;;;;9864:12;9873:2;9864:8;:12::i;:::-;9856:21;;;;;;9930:9;9936:2;9930:5;:9::i;:::-;;10011:14;10017:2;10021:3;10011:5;:14::i;:::-;10096:25;10106:10;10118:2;10096:25;;;;;;;;;;;;;;;;-1:-1:-1;10138:4:104;9613:536;;;;:::o;4024:28::-;;;;:::o;11974:195::-;12041:4;12057:34;;;;;;;;;;;;;;;;;12106:35;;;;;;12057:34;12125:15;;;;;12106:35;;;;;;;;;;-1:-1:-1;12158:4:104;11974:195;;;;:::o;8694:833::-;8777:12;8756:2;4390:12;4399:2;4390:8;:12::i;:::-;4382:70;;;;;;;;;;;;;;;;;;;;;;4483:10;:8;:10::i;:::-;:40;;;;4511:12;4520:2;4511:8;:12::i;:::-;-1:-1:-1;;;;;4497:26:104;:10;-1:-1:-1;;;;;4497:26:104;;4483:40;:56;;;;4533:6;;4527:2;:12;4483:56;4462:219;;;;;;;;;;;;;;8809:17;8823:2;8809:13;:17::i;:::-;8805:117;;;8850:11;8858:2;8850:7;:11::i;:::-;8842:20;;;;;;8805:117;;;8901:9;8907:2;8901:5;:9::i;:::-;8893:18;;;;;;9008:23;;:::i;:::-;9034:6;:10;9041:2;9034:10;;;;;;;;;;;9008:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9008:36:104;-1:-1:-1;;;;;9008:36:104;-1:-1:-1;;;;;9008:36:104;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9008:36:104;-1:-1:-1;;;;;9008:36:104;-1:-1:-1;;;;;9008:36:104;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9008:36:104;-1:-1:-1;;;;;9008:36:104;-1:-1:-1;;;;;9008:36:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;9061:6;:10;9068:2;9061:10;;;;;;;;;;;;9054:17;;;;;;;;;;;;;;;-1:-1:-1;;;;;9054:17:104;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9054:17:104;;;;;;;;;;;;;;-1:-1:-1;;;;;9054:17:104;;;;;;;;;;;;;;;;;;;;;;9097:6;:14;;;-1:-1:-1;;;;;9082:39:104;;9122:6;:12;;;9136:6;:14;;;9082:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9082:69:104;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9082:69:104;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;9082:69:104;;;;;;;;;;9167:17;9181:2;9167:17;;;;;;;;;;;;;;;9318:6;:12;;;-1:-1:-1;;;;;9199:296:104;9272:6;:14;;;9288:6;:14;;;9255:48;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;9255:48:104;;;9245:59;;49:4:-1;9245:59:104;;;;9344:14;;;;9372;;;;9408;;9445;;;;9245:59;;9228:2;;9199:296;;;;9344:14;9372;9481:3;;9199:296;;;;;;;;;;-1:-1:-1;9516:4:104;;8694:833;-1:-1:-1;;;8694:833:104:o;5219:235::-;5270:7;5279;5288;5297;5316:23;;:::i;:::-;-1:-1:-1;;;5342:10:104;;;;-1:-1:-1;;5342:6:104;:10;;;;;;;;;5316:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5316:36:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5219:235::o;10226:259::-;10288:4;10317:12;10326:2;10317:8;:12::i;:::-;10316:13;:36;;;;-1:-1:-1;10333:9:104;;;;:5;:9;;;;;:14;;;:19;;10316:36;:74;;;;-1:-1:-1;10356:9:104;;;;:5;:9;;;;;:14;;;10373:17;:12;:17;-1:-1:-1;10316:74:104;10308:83;;;;;;10408:9;;;;:5;:9;;;;;;;;10401:16;;;;;;;;;;;;;;;;;10432:25;;;;;10442:10;;10414:2;;10432:25;;6177:113;6251:31;6263:2;6251:31;;;:3;:31::i;:::-;6243:40;;;;;;6177:113;;:::o;11106:201::-;-1:-1:-1;;;;;11286:14:104;11256:7;11286:14;;;:5;:14;;;;;;;11106:201::o;4840:83::-;4912:3;4840:83;:::o;3997:21::-;;;;:::o;14026:104::-;14088:7;14114:9;;;:5;:9;;;;;;;14026:104::o;3820:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;3754:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;3607:19::-;;;;;;:::o;5460:458::-;5526:3;4273:12;5526:3;4273:8;:12::i;:::-;4265:21;;;;;;4305:10;:8;:10::i;:::-;4304:11;4296:20;;;;;;5546:10;5705;;;:6;:10;;;;;;;;;:16;;;;;5651:18;;;5671;;;;;5634:56;;5705:10;;-1:-1:-1;;;;;5705:16:104;;;;5634:56;;5651:18;;;5671;;;;5634:56;;;;;;;26:21:-1;;;22:32;;6:49;;5634:56:104;;;5624:67;;49:4:-1;5624:67:104;;;;5735:10;;;;:6;:10;;;;;;:18;;;;5767;;;;5807;;5848;;;;5881:20;;;;;5624:67;;5607:3;;5586:325;;;;-1:-1:-1;;;;;5735:18:104;;;;5767;;5807;5848;;5881:20;;;;;;5586:325;;;;;;;;;;4326:1;5460:458;;:::o;13210:135::-;-1:-1:-1;;;;;13314:15:104;;;13288:7;13314:15;;;:5;:15;;;;;;;;:24;;;;;;;;;;;;;13210:135::o;16097:1727::-;16227:16;16259:15;16284:1488;16291:11;;16284:1488;;16389:30;16402:7;16411;16389:12;:30::i;:::-;16379:40;-1:-1:-1;16483:12:104;16475:21;;;;;;16627:15;;;;:6;:15;;;;;:23;;16652;;;;;16622:54;;16627:23;16622:4;:54::i;:::-;16602:7;16612;16602:17;:74;16598:189;;;16696:5;;16598:189;16815:15;;;;:6;:15;;;;;:23;16804:34;;16800:962;;16986:15;;;;:6;:15;;;;;:23;;;16963:47;;16976:8;;16963:12;:47::i;:::-;17101:15;;;;:6;:15;;;;;:23;16952:58;;-1:-1:-1;17079:46:104;;17092:7;;17079:12;:46::i;:::-;17184:16;17210:15;;;:6;:15;;;;;:23;17069:56;;-1:-1:-1;17179:56:104;;17192:7;;17179:4;:56::i;:::-;16800:962;;;17431:15;;;;:6;:15;;;;;:23;;;;17456;;17379:113;;17392:8;;17484:7;;17402:79;;17407:17;;;;17426:54;;:4;:54::i;17379:113::-;17368:124;-1:-1:-1;17542:40:104;17555:7;17573;17542:4;:40::i;:::-;17676:1;17666:11;;16800:962;16284:1488;;;17801:15;17789:8;:27;;17781:36;;;;;4989:112;5040:11;5070:10;;;:6;:10;;;;;:20;;;;;;;;:24;;;4989:112::o;4058:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4058:44:104;;;;;;;;;;;;;;;;;;;;:::o;13829:91::-;13908:5;;13829:91;:::o;13042:104::-;13098:7;13125:9;;;:5;:9;;;;;:14;;13042:104::o;3886:40::-;;;;;;;;;;;;;:::o;12689:102::-;12744:7;12770:9;;;:5;:9;;;;;;;;:14;;;12689:102::o;3932:40::-;;;;;;;;;;;;;:::o;6296:78::-;6347:19;6362:2;6347:6;:19::i;:::-;6339:28;;;;;;6296:78;:::o;10747:302::-;-1:-1:-1;;;;;10960:14:104;;10940:4;10960:14;;;:5;:14;;;;;;:21;;;10996:25;;;;;10966:7;;10977:4;;10996:25;;4749:85;4790:11;4820:7;;;4749:85;:::o;3707:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5107:106::-;5158:13;5190:10;;;:6;:10;;;;;:16;;;-1:-1:-1;;;;;5190:16:104;;5107:106::o;14136:212::-;14191:4;14214:9;;;:5;:9;;;;;:14;:19;;;:57;;-1:-1:-1;14252:9:104;;;;:5;:9;;;;;;;;:14;;:19;;14214:57;:127;;;-1:-1:-1;;14290:25:104;14296:10;;;:6;:10;;;;;;;;:18;;;;-1:-1:-1;;;;;14296:18:104;;;14290:25;;:5;:25;;;;;14316:18;;;;;;14290:45;;;;;;;;:51;;14136:212::o;11358:165::-;11415:4;11431:24;;;;;;;;;;;;;;;;;11470:25;;;;;;11431:24;11484:10;;;;;11470:25;;8499:144;8592:4;8571:2;4273:12;4282:2;4273:8;:12::i;:::-;4265:21;;;;;;4305:10;:8;:10::i;:::-;4304:11;4296:20;;;;;;8619:17;8625:2;8629:6;8619:5;:17::i;7838:578::-;8276:7;4191:10;:8;:10::i;:::-;4190:11;4182:20;;;;;;-1:-1:-1;;;;;8307:14:104;;;;;;:5;:14;;;;;;:25;-1:-1:-1;8307:25:104;8299:34;;;;;;8351:58;8359:7;8368;8377;8386;8395:3;8400:8;8351:7;:58::i;:::-;8344:65;7838:578;-1:-1:-1;;;;;;;7838:578:104:o;6904:378::-;7202:7;4191:10;:8;:10::i;:::-;4190:11;4182:20;;;;;;7232:43;7240:7;7249;7258;7267;7232;:43::i;3632:29::-;;;;;;;;;:::o;18839:1003::-;18933:16;18961:15;18979:30;18992:7;19001;18979:12;:30::i;:::-;18961:48;;19065:578;19082:15;;;;:6;:15;;;;;:23;19072:33;;19065:578;;;19155:15;;;;:6;:15;;;;;:23;;;19132:47;;19145:8;;19132:12;:47::i;:::-;19258:15;;;;:6;:15;;;;;:23;19121:58;;-1:-1:-1;19236:46:104;;19249:7;;19236:12;:46::i;:::-;19226:56;-1:-1:-1;19328:11:104;;19324:309;;19433:22;19447:7;19433:13;:22::i;:::-;19423:32;-1:-1:-1;19529:12:104;19521:21;;;;;;19065:578;;;19715:15;;;;:6;:15;;;;;:23;;;;19740;;19663:113;;19676:8;;19768:7;;19686:79;;19691:17;;;;19710:54;;:4;:54::i;32929:136::-;32988:9;33057:1;33013:41;33026:20;33039:1;1130:8;33026:12;:20::i;:::-;33052:1;33048;:5;;33013:41;:45;;;;;;;32929:136;-1:-1:-1;;;32929:136:104:o;834:176:124:-;892:7;923:5;;;946:6;;;;938:46;;;;;;;;;;;;;;1002:1;834:176;-1:-1:-1;;;834:176:124:o;1274:134::-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;33070:136:104:-;33129:9;33198:1;33154:41;33167:20;33180:1;1167:8;33167:12;:20::i;32786:138::-;32845:9;1167:8;32870:41;32883:18;32896:1;32899;32883:12;:18::i;:::-;32909:1;1167:8;32903:7;;28930:1168;29092:5;;29058:4;;29092:5;29262:17;29276:2;29262:13;:17::i;:::-;29261:18;29253:27;;;;;;29357:2;29348:5;;:11;29344:281;;;-1:-1:-1;;;29452:9:104;;;;:5;:9;;;;;;;29444:5;:17;29523:13;-1:-1:-1;29603:11:104;;29344:281;29634:130;29647:1;29641:3;:7;:20;;;;;29659:2;29652:3;:9;;29641:20;29634:130;;;-1:-1:-1;29743:10:104;;;;:5;:10;;;;;;;29634:130;;;29784:2;29777:3;:9;29773:115;;29872:5;29865:12;;;;;;29773:115;29910:9;;;;:5;:9;;;;;;;;29897:10;;;;;;:22;;;;30000:9;;;:13;;-1:-1:-1;;;;28930:1168:104;;;:::o;26234:1402::-;26384:12;26393:2;26384:8;:12::i;:::-;26376:21;;;;;;26408:15;26426:10;;;:6;:10;;;;;:18;;;;;26472;;;;-1:-1:-1;;;;;26426:18:104;;;;26472;;;26586:8;;;:42;;-1:-1:-1;26598:11:104;;;;:6;:11;;;;;:19;;;-1:-1:-1;;;;;26598:30:104;;;:19;;:30;;26586:42;:76;;;-1:-1:-1;26632:11:104;;;;:6;:11;;;;;:19;;;-1:-1:-1;;;;;26632:30:104;;;:19;;:30;;26586:76;:99;;;;26667:18;26681:3;26667:13;:18::i;:::-;26666:19;26586:99;:171;;26740:17;26749:2;26753:3;26740:8;:17::i;:::-;26586:171;;;26708:9;26714:2;26708:5;:9::i;:::-;26580:177;-1:-1:-1;26772:8:104;;26768:501;;-1:-1:-1;26993:10:104;;;;:5;:10;;;;;;;;:15;;;;;27022:20;;;;27056:9;;;;;:20;;;26768:501;;;-1:-1:-1;;;;;;27193:14:104;;;;;;;:5;:14;;;;;;;;:23;;;;;;;;;;;27230:28;;;;26768:501;27283:12;;27279:282;;27488:14;;;;:5;:14;;;;;;;;:24;;;27526:9;;;;;;:14;:24;;;27279:282;-1:-1:-1;;;;;27571:14:104;;;;;;;:5;:14;;;;;;;;:23;;;;;;;;;;;:25;;;;;;27611:18;;;;;27626:2;;27611:18;;;;;;;;;;26234:1402;;;;;:::o;27707:1147::-;27840:4;27878:10;;;:6;:10;;;;;;;;:18;;;;;;27924;;;;-1:-1:-1;;;;;27924:18:104;;;27960:14;;;;;;;;;27878:18;;27960:23;;;;;;;;;;;27878:18;;27924;27952:36;;;;;;28007:9;;;;:5;:9;;;;;:14;;;:19;:110;;;;;28100:17;28114:2;28100:13;:17::i;:::-;27999:119;;;;;;-1:-1:-1;;;;;28139:14:104;;;;;;;:5;:14;;;;;;;;:23;;;;;;;;;;28133:29;;28129:356;;28238:21;28244:9;;;28238:5;28244:9;;;;;;;;:14;28238:21;;;;;:26;;:32;;28230:41;;;;;;28314:9;;;;:5;:9;;;;;;;;:14;;;;28291;;28285:21;;;;:26;:43;28129:356;;;28460:9;;;;:5;:9;;;;;;;;:14;;;;-1:-1:-1;;;;;28434:14:104;;;;;:5;:14;;;;;:23;;;;;;;;;;:40;28129:356;28499:9;;;;:5;:9;;;;;;;;:14;;:19;28495:208;;28602:21;28608:9;;;28602:5;28608:9;;;;;;;;:14;;;;28602:21;;;;:26;:32;;28594:41;;;;;;28678:9;;;;:5;:9;;;;;;;;:14;;28655;;;28649:21;;;;;:43;28495:208;-1:-1:-1;;;;;28713:14:104;;;;;;;:5;:14;;;;;;;;:23;;;;;;;;;;;;:25;;;;;;28748:9;;;-1:-1:-1;28748:9:104;;;;;;;28765:12;28748:14;;;;:29;-1:-1:-1;;27707:1147:104:o;20028:699::-;20105:4;20133:10;;;;;;;20125:19;;;;;;20168:10;;;;:6;:10;;;;;:18;20158:28;;20154:261;;;20206:17;20220:2;20206:13;:17::i;:::-;20202:203;;;20333:11;20341:2;20333:7;:11::i;:::-;;20202:203;;;20381:9;20387:2;20381:5;:9::i;:::-;;20202:203;20432:21;20442:2;20446:6;20432:9;:21::i;:::-;20424:30;;;;;;20529:12;20538:2;20529:8;:12::i;:::-;:62;;;;-1:-1:-1;20566:25:104;20572:10;;;:6;:10;;;;;;;;:18;;;;-1:-1:-1;;;;;20572:18:104;20566:25;;:5;:25;;;;;;20545:10;;;;;;;:18;:46;20529:62;20525:175;;;20607:6;:11;;;20679:10;20616:2;20679:6;:10::i;:::-;;20525:175;-1:-1:-1;20716:4:104;20028:699;;;;:::o;23065:2363::-;23435:10;23461:21;23514;23575:17;23652;23792:1348;-1:-1:-1;;;;;23799:16:104;;;23829:1;23799:16;;;:5;:16;;;;;;;;:27;;;;;;;;;;:31;23792:1348;;-1:-1:-1;;;;;;;23862:16:104;;;;;;;:5;:16;;;;;;;;:27;;;;;;;;;;;;23915:21;;;:6;:21;;;;;;;:29;;;;23970;;23862:27;;-1:-1:-1;23915:29:104;24556:8;:60;;24615:1;24556:60;;;24603:9;24591;24579;24567;:21;:33;:45;24556:60;24502:34;24515:9;24526;24502:12;:34::i;:::-;:115;24465:34;24478:9;24489;24465:12;:34::i;:::-;:152;24461:208;;;24649:5;;24461:208;24793:50;24797:13;24812:30;24821:9;24832;24812:8;:30::i;24793:50::-;;24873:9;24857:25;;24908:55;24921:9;24932:30;24941:9;24952;24932:8;:30::i;:::-;24908:12;:55::i;:::-;24896:67;;25026:13;24989:34;25002:9;25013;24989:12;:34::i;:::-;:50;;;;;;;-1:-1:-1;25058:14:104;;;:32;;-1:-1:-1;25076:14:104;;25058:32;25054:76;;;25110:5;;25054:76;23792:1348;;;25166:1;25154:9;:13;:30;;;;;25183:1;25171:9;:13;25154:30;:63;;;;-1:-1:-1;;;;;;25201:16:104;;;;;;:5;:16;;;;;;25188:29;;;25154:63;25150:272;;;25280:55;25292:9;25303;25314;25325;25280:11;:55::i;:::-;25275:60;;25397:14;25403:2;25407:3;25397:5;:14::i;:::-;23065:2363;;;;;;;;;;;;:::o;25688:503::-;-1:-1:-1;;;;;26014:14:104;;25980:10;26014:14;;;:5;:14;;;;;;:25;-1:-1:-1;26014:25:104;26006:34;;;;;;26055:47;26067:7;26076;26085;26094;26055:11;:47::i;:::-;26124:5;;;26112:9;;;;:5;:9;;;;;;;:17;;;;26139:10;;;;26164:20;26050:52;;-1:-1:-1;26164:20:104;;;;26050:52;;26164:20;;;;;;;;;;25688:503;;;;;;:::o;2159:459:124:-;2217:7;2458:6;2454:45;;-1:-1:-1;2487:1:124;2480:8;;2454:45;2521:5;;;2525:1;2521;:5;:1;2544:5;;;;;:10;2536:56;;;;;;;;;;;;;1732:187;1818:7;1853:12;1845:6;;;;1837:29;;;;;;;;;;;;;;;-1:-1:-1;;;1888:5:124;;;1732:187::o;21373:1121:104:-;21463:7;21499:1;21494:2;:6;21486:15;;;;;;21556:8;;;;;:26;;;21569:13;21578:3;21569:8;:13::i;:::-;21568:14;21556:26;21549:81;;;21604:10;;;;:5;:10;;;;;;;;:15;;;;;21549:81;;;21644:8;21640:848;;21748:9;21754:2;21748:5;:9::i;:::-;21741:16;;;;21640:848;21898:24;21914:2;21918:3;21898:15;:24::i;:::-;21895:583;;;21942:15;22082:142;22089:8;;;;;:36;;;22101:24;22117:2;22121:3;22101:15;:24::i;:::-;22082:142;;;-1:-1:-1;22190:10:104;;;;:5;:10;;;;;;;;:15;;;22082:142;;21895:583;22335:8;;;;;:37;;;22348:24;22364:2;22368:3;22348:15;:24::i;:::-;22347:25;22335:37;22328:108;;;22402:10;;;;:5;:10;;;;;;:15;;22328:108;;;-1:-1:-1;22460:3:104;22453:10;;20793:514;20867:7;20903:1;20898:2;:6;20890:15;;;;;;20916;20934:10;;;:6;:10;;;;;;;;:18;;;;;20980;;;;-1:-1:-1;;;;;20980:18:104;;;21022:14;;;:5;:14;;;;;20934:18;;;;21022:23;;;;;;;;;20934:18;;20980;;21022:23;21159:118;21166:8;;;;;:36;;;21178:24;21194:2;21198:3;21178:15;:24::i;:::-;21159:118;;;-1:-1:-1;21251:10:104;;;;:5;:10;;;;;;;;:15;;;21159:118;;30226:1341;30309:4;30329:23;;:::i;:::-;-1:-1:-1;30355:10:104;;;;:6;:10;;;;;;;;30329:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30329:36:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30355:10;30329:36;30391:38;;30404:8;;30391:12;:38::i;:::-;:55;;;;;;30375:71;;30483:5;30473;30465:23;;;30457:32;;;;;;30528:8;30515;30507:29;;;30499:38;;;;;;30601:13;;;:27;;-1:-1:-1;30618:10:104;;30601:27;:68;;;-1:-1:-1;30655:14:104;;30644:25;;30601:68;:94;;;;30681:6;:14;;;30673:5;:22;30601:94;30597:145;;;30726:5;30719:12;;;;;;30597:145;30786:14;;30773:38;;30802:8;30773:12;:38::i;:::-;30752:10;;;;:6;:10;;;;;;;:59;;;;30855:14;;;30842:35;;30871:5;30842:12;:35::i;:::-;30821:10;;;;:6;:10;;;;;;;:18;;:56;;;;30902:14;;;;30943:12;;;;30887:76;;;;;-1:-1:-1;;;;;30887:43:104;;;;;;:76;;30931:10;;30957:5;;30887:76;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30887:76:104;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30887:76:104;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30887:76:104;;;;;;;;;;30988:6;:14;;;-1:-1:-1;;;;;30973:39:104;;31013:10;31025:8;30973:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30973:61:104;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30973:61:104;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30973:61:104;;;;;;;;;;31050:17;31064:2;31050:17;;;;;;;;;;;;;;;31283:10;-1:-1:-1;;;;;31082:305:104;31201:6;:12;;;-1:-1:-1;;;;;31082:305:104;31155:6;:14;;;31171:6;:14;;;31138:48;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;31138:48:104;;;31128:59;;;;;;31082:305;31111:2;31103:11;;31227:6;:14;;;31255:6;:14;;;31315:8;31346:5;31373:3;31082:305;;;;;;;;;;;;;;;;;;;;31444:6;:14;;;-1:-1:-1;;;;;31402:57:104;31421:6;:14;;;-1:-1:-1;;;;;31402:57:104;;31411:8;31437:5;31402:57;;;;;;;;;;;;;;;;31474:10;;;;:6;:10;;;;;:18;31470:69;;31518:10;;;;:6;:10;;;;;31511:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31470:69;-1:-1:-1;31556:4:104;;30226:1341;-1:-1:-1;;;;30226:1341:104:o;3742:154:75:-;3846:7;3880:1;3876;:5;:13;;3888:1;3876:13;;;-1:-1:-1;3884:1:75;;3742:154;-1:-1:-1;3742:154:75:o;31646:1085:104:-;31769:10;31823:7;31811;31803:27;;;31795:36;;;;;;31869:7;31857;31849:27;;;31841:36;;;;;;31905:1;31895:7;:11;31887:20;;;;;;-1:-1:-1;;;;;31925:23:104;;31917:32;;;;;;31977:1;31967:7;:11;31959:20;;;;;;-1:-1:-1;;;;;31997:23:104;;31989:32;;;;;;32050:7;-1:-1:-1;;;;;32039:18:104;:7;-1:-1:-1;;;;;32039:18:104;;;32031:27;;;;;;32069:21;;:::i;:::-;32100:22;;;-1:-1:-1;;;;;32132:22:104;;;:12;;;:22;32164:12;;;:22;;;32196;;:12;;;:22;32241:10;32228;;;:23;32261:28;32285:3;32261:28;:14;;;:28;32304:10;:8;:10::i;:::-;32324;;;;:6;:10;;;;;;;;;:17;;;;;;;;;;;;;-1:-1:-1;;;;;32324:17:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32352:72;;;;;32299:15;;-1:-1:-1;32352:36:104;;;;;;:72;;32389:10;;32409:4;;32416:7;;32352:72;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32352:72:104;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32352:72:104;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32352:72:104;;;;;;;;;;32440:17;32454:2;32440:17;;;;;;;;;;;;;;;32528:34;;32577:10;;32528:34;;32545:7;;32554;;32528:34;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;32528:34:104;;;32518:45;;;;;;32501:2;32493:11;;32472:252;32601:7;32622;32651;32681;32710:3;32472:252;;;;;;;;;;;;;;;;;;;31646:1085;;;;;;;:::o;22575:336::-;22753:4;22862:12;;;:6;:12;;;;;;:20;;;22884:11;;;;;;:19;22849:55;;22862:20;22849:12;:55::i;:::-;22793:11;;;;:6;:11;;;;;;:19;;;22814:12;;;;;:20;22780:55;;22793:19;22780:12;:55::i;:::-;:124;;;22575:336;-1:-1:-1;;;22575:336:104:o;19901:121::-;19978:13;:15;;;;;;;;19901:121;:::o;1035:32173::-;;;;;;;;;-1:-1:-1;1035:32173:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:124;206:20;;231:30;206:20;231:30;;273:128;348:13;;366:30;348:13;366:30;;408:130;475:20;;500:33;475:20;500:33;;545:130;612:20;;637:33;612:20;637:33;;819:241;;923:2;911:9;902:7;898:23;894:32;891:2;;;939:1;936;929:12;891:2;974:1;991:53;1036:7;1016:9;991:53;;1067:366;;;1188:2;1176:9;1167:7;1163:23;1159:32;1156:2;;;1204:1;1201;1194:12;1156:2;1239:1;1256:53;1301:7;1281:9;1256:53;;;1246:63;;1218:97;1346:2;1364:53;1409:7;1400:6;1389:9;1385:22;1364:53;;;1354:63;;1325:98;1150:283;;;;;;1440:617;;;;;1595:3;1583:9;1574:7;1570:23;1566:33;1563:2;;;1612:1;1609;1602:12;1563:2;1647:1;1664:53;1709:7;1689:9;1664:53;;;1654:63;;1626:97;1754:2;1772:53;1817:7;1808:6;1797:9;1793:22;1772:53;;;1762:63;;1733:98;1862:2;1880:53;1925:7;1916:6;1905:9;1901:22;1880:53;;;1870:63;;1841:98;1970:2;1988:53;2033:7;2024:6;2013:9;2009:22;1988:53;;;1978:63;;1949:98;1557:500;;;;;;;;2064:491;;;;2202:2;2190:9;2181:7;2177:23;2173:32;2170:2;;;2218:1;2215;2208:12;2170:2;2253:1;2270:53;2315:7;2295:9;2270:53;;;2260:63;;2232:97;2360:2;2378:53;2423:7;2414:6;2403:9;2399:22;2378:53;;;2368:63;;2339:98;2468:2;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;;;2476:63;;2447:98;2164:391;;;;;;2562:366;;;2683:2;2671:9;2662:7;2658:23;2654:32;2651:2;;;2699:1;2696;2689:12;2651:2;2734:1;2751:53;2796:7;2776:9;2751:53;;;2741:63;;2713:97;2841:2;2859:53;2904:7;2895:6;2884:9;2880:22;2859:53;;2935:617;;;;;3090:3;3078:9;3069:7;3065:23;3061:33;3058:2;;;3107:1;3104;3097:12;3058:2;3142:1;3159:53;3204:7;3184:9;3159:53;;;3149:63;;3121:97;3249:2;3267:53;3312:7;3303:6;3292:9;3288:22;3267:53;;;3257:63;;3228:98;3357:2;3375:53;3420:7;3411:6;3400:9;3396:22;3375:53;;;3365:63;;3336:98;3465:2;3483:53;3528:7;3519:6;3508:9;3504:22;3483:53;;3559:235;;3660:2;3648:9;3639:7;3635:23;3631:32;3628:2;;;3676:1;3673;3666:12;3628:2;3711:1;3728:50;3770:7;3750:9;3728:50;;3801:257;;3913:2;3901:9;3892:7;3888:23;3884:32;3881:2;;;3929:1;3926;3919:12;3881:2;3964:1;3981:61;4034:7;4014:9;3981:61;;4065:241;;4169:2;4157:9;4148:7;4144:23;4140:32;4137:2;;;4185:1;4182;4175:12;4137:2;4220:1;4237:53;4282:7;4262:9;4237:53;;4313:366;;;4434:2;4422:9;4413:7;4409:23;4405:32;4402:2;;;4450:1;4447;4440:12;4402:2;4485:1;4502:53;4547:7;4527:9;4502:53;;;4492:63;;4464:97;4592:2;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;;4934:617;;;;;5089:3;5077:9;5068:7;5064:23;5060:33;5057:2;;;5106:1;5103;5096:12;5057:2;5141:1;5158:53;5203:7;5183:9;5158:53;;;5148:63;;5120:97;5248:2;5266:53;5311:7;5302:6;5291:9;5287:22;5266:53;;;5256:63;;5227:98;5356:2;5374:53;5419:7;5410:6;5399:9;5395:22;5374:53;;;5364:63;;5335:98;5464:2;5482:53;5527:7;5518:6;5507:9;5503:22;5482:53;;5558:743;;;;;;5730:3;5718:9;5709:7;5705:23;5701:33;5698:2;;;5747:1;5744;5737:12;5698:2;5782:1;5799:53;5844:7;5824:9;5799:53;;;5789:63;;5761:97;5889:2;5907:53;5952:7;5943:6;5932:9;5928:22;5907:53;;;5897:63;;5868:98;5997:2;6015:53;6060:7;6051:6;6040:9;6036:22;6015:53;;;6005:63;;5976:98;6105:2;6123:53;6168:7;6159:6;6148:9;6144:22;6123:53;;;6113:63;;6084:98;6213:3;6232:53;6277:7;6268:6;6257:9;6253:22;6232:53;;;6222:63;;6192:99;5692:609;;;;;;;;;6308:863;;;;;;;6494:3;6482:9;6473:7;6469:23;6465:33;6462:2;;;6511:1;6508;6501:12;6462:2;6546:1;6563:53;6608:7;6588:9;6563:53;;;6553:63;;6525:97;6653:2;6671:53;6716:7;6707:6;6696:9;6692:22;6671:53;;;6661:63;;6632:98;6761:2;6779:53;6824:7;6815:6;6804:9;6800:22;6779:53;;;6769:63;;6740:98;6869:2;6887:53;6932:7;6923:6;6912:9;6908:22;6887:53;;;6877:63;;6848:98;6977:3;6996:53;7041:7;7032:6;7021:9;7017:22;6996:53;;;6986:63;;6956:99;7086:3;7105:50;7147:7;7138:6;7127:9;7123:22;7105:50;;;7095:60;;7065:96;6456:715;;;;;;;;;7178:366;;;7299:2;7287:9;7278:7;7274:23;7270:32;7267:2;;;7315:1;7312;7305:12;7267:2;7350:1;7367:53;7412:7;7392:9;7367:53;;7551:142;7642:45;7681:5;7642:45;;;7637:3;7630:58;7624:69;;;7700:113;7783:24;7801:5;7783:24;;7820:152;7921:45;7941:24;7959:5;7941:24;;;7921:45;;7979:104;8056:21;8071:5;8056:21;;8090:113;8173:24;8191:5;8173:24;;8210:347;;8322:39;8355:5;8322:39;;;8373:71;8437:6;8432:3;8373:71;;;8366:78;;8449:52;8494:6;8489:3;8482:4;8475:5;8471:16;8449:52;;;8522:29;8544:6;8522:29;;;8513:39;;;;8302:255;-1:-1;;;8302:255;8565:327;;8725:67;8789:2;8784:3;8725:67;;;8825:29;8805:50;;8883:2;8874:12;;8711:181;-1:-1;;8711:181;8901:370;;9061:67;9125:2;9120:3;9061:67;;;9161:34;9141:55;;9230:3;9225:2;9216:12;;9209:25;9262:2;9253:12;;9047:224;-1:-1;;9047:224;9280:382;;9440:67;9504:2;9499:3;9440:67;;;9540:34;9520:55;;9609:15;9604:2;9595:12;;9588:37;9653:2;9644:12;;9426:236;-1:-1;;9426:236;9671:529;;9831:68;9895:3;9890;9831:68;;;9932:34;9912:55;;10001:34;9996:2;9987:12;;9980:56;10070:34;10065:2;10056:12;;10049:56;10139:22;10134:2;10125:12;;10118:44;10190:3;10181:13;;9817:383;-1:-1;;9817:383;10208:113;10291:24;10309:5;10291:24;;10448:110;10529:23;10546:5;10529:23;;10565:383;;10712:75;10783:3;10774:6;10712:75;;;10809:2;10804:3;10800:12;10793:19;;10823:75;10894:3;10885:6;10823:75;;;-1:-1;10920:2;10911:12;;10700:248;-1:-1;;10700:248;10955:213;11073:2;11058:18;;11087:71;11062:9;11131:6;11087:71;;11175:451;11357:2;11342:18;;11371:79;11346:9;11423:6;11371:79;;;11461:72;11529:2;11518:9;11514:18;11505:6;11461:72;;;11544;11612:2;11601:9;11597:18;11588:6;11544:72;;11633:340;11787:2;11772:18;;11801:79;11776:9;11853:6;11801:79;;;11891:72;11959:2;11948:9;11944:18;11935:6;11891:72;;11980:655;12208:3;12193:19;;12223:71;12197:9;12267:6;12223:71;;;12305:72;12373:2;12362:9;12358:18;12349:6;12305:72;;;12388;12456:2;12445:9;12441:18;12432:6;12388:72;;;12471;12539:2;12528:9;12524:18;12515:6;12471:72;;;12554:71;12620:3;12609:9;12605:19;12596:6;12554:71;;12642:324;12788:2;12773:18;;12802:71;12777:9;12846:6;12802:71;;12973:201;13085:2;13070:18;;13099:65;13074:9;13137:6;13099:65;;13181:213;13299:2;13284:18;;13313:71;13288:9;13357:6;13313:71;;13401:767;13657:3;13642:19;;13672:71;13646:9;13716:6;13672:71;;;13754:72;13822:2;13811:9;13807:18;13798:6;13754:72;;;13837;13905:2;13894:9;13890:18;13881:6;13837:72;;;13920;13988:2;13977:9;13973:18;13964:6;13920:72;;;14003:73;14071:3;14060:9;14056:19;14047:6;14003:73;;;14087:71;14153:3;14142:9;14138:19;14129:6;14087:71;;14175:301;14313:2;14327:47;;;14298:18;;14388:78;14298:18;14452:6;14388:78;;14483:407;14674:2;14688:47;;;14659:18;;14749:131;14659:18;14749:131;;14897:407;15088:2;15102:47;;;15073:18;;15163:131;15073:18;15163:131;;15311:407;15502:2;15516:47;;;15487:18;;15577:131;15487:18;15577:131;;15725:407;15916:2;15930:47;;;15901:18;;15991:131;15901:18;15991:131;;16359:547;16561:3;16546:19;;16576:71;16550:9;16620:6;16576:71;;;16658:72;16726:2;16715:9;16711:18;16702:6;16658:72;;;16741;16809:2;16798:9;16794:18;16785:6;16741:72;;;16824;16892:2;16881:9;16877:18;16868:6;16824:72;;16913:767;17169:3;17154:19;;17184:71;17158:9;17228:6;17184:71;;;17266:72;17334:2;17323:9;17319:18;17310:6;17266:72;;;17349;17417:2;17406:9;17402:18;17393:6;17349:72;;;17432;17500:2;17489:9;17485:18;17476:6;17432:72;;;17515:73;17583:3;17572:9;17568:19;17559:6;17515:73;;17687:324;17833:2;17818:18;;17847:71;17822:9;17891:6;17847:71;;18018:435;18192:2;18177:18;;18206:71;18181:9;18250:6;18206:71;;;18288:72;18356:2;18345:9;18341:18;18332:6;18288:72;;18460:209;18576:2;18561:18;;18590:69;18565:9;18632:6;18590:69;;18676:122;18764:12;;18735:63;18806:163;18909:19;;;18958:4;18949:14;;18902:67;18977:91;;19039:24;19057:5;19039:24;;19075:85;19141:13;19134:21;;19117:43;19167:72;19229:5;19212:27;19246:113;19319:34;19308:46;;19291:68;19366:121;-1:-1;;;;;19428:54;;19411:76;19573:96;19645:18;19634:30;;19617:52;19676:129;;19763:37;19794:5;19812:121;19891:37;19922:5;19891:37;;20056:268;20121:1;20128:101;20142:6;20139:1;20136:13;20128:101;;;20209:11;;;20203:18;20190:11;;;20183:39;20164:2;20157:10;20128:101;;;20244:6;20241:1;20238:13;20235:2;;;20309:1;20300:6;20295:3;20291:16;20284:27;20235:2;20105:219;;;;;20332:95;;20396:26;20416:5;20434:89;20498:20;20512:5;20498:20;;20530:97;20618:2;20598:14;20614:7;20594:28;;20578:49;20635:94;20709:2;20705:14;;20677:52;20737:117;20806:24;20824:5;20806:24;;;20799:5;20796:35;20786:2;;20845:1;20842;20835:12;20861:111;20927:21;20942:5;20927:21;;20979:117;21048:24;21066:5;21048:24;;21103:117;21172:24;21190:5;21172:24;",
1467
1467
  "source": "/*\n\n Copyright 2019 dYdX Trading Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.7;\npragma experimental ABIEncoderV2;\n\nimport { SafeMath } from \"@openzeppelin/contracts/math/SafeMath.sol\";\nimport { IERC20Detailed } from \"../protocol/interfaces/IERC20Detailed.sol\";\nimport { Math } from \"../protocol/lib/Math.sol\";\n\n\n/**\n * @title TestOasisDex\n * @author dYdX\n *\n * Contract for testing stuff against OasisDex. Removes some functionality like auth, note, and\n * non-reentrancy protection.\n */\ncontract TestOasisDex {\n // ============ Constants ============\n\n uint256 constant WAD = 10 ** 18;\n uint256 constant RAY = 10 ** 27;\n\n // ============ Events ============\n\n event LogItemUpdate(uint256 id);\n event LogTrade(\n uint256 pay_amt,\n address indexed pay_gem,\n uint256 buy_amt,\n address indexed buy_gem\n );\n event LogMake(\n bytes32 indexed id,\n bytes32 indexed pair,\n address indexed maker,\n address pay_gem,\n address buy_gem,\n uint128 pay_amt,\n uint128 buy_amt,\n uint64 timestamp\n );\n event LogBump(\n bytes32 indexed id,\n bytes32 indexed pair,\n address indexed maker,\n address pay_gem,\n address buy_gem,\n uint128 pay_amt,\n uint128 buy_amt,\n uint64 timestamp\n );\n event LogTake(\n bytes32 id,\n bytes32 indexed pair,\n address indexed maker,\n address pay_gem,\n address buy_gem,\n address indexed taker,\n uint128 take_amt,\n uint128 give_amt,\n uint64 timestamp\n );\n event LogKill(\n bytes32 indexed id,\n bytes32 indexed pair,\n address indexed maker,\n address pay_gem,\n address buy_gem,\n uint128 pay_amt,\n uint128 buy_amt,\n uint64 timestamp\n );\n event LogBuyEnabled(bool isEnabled);\n event LogMinSell(address pay_gem, uint256 min_amount);\n event LogMatchingEnabled(bool isEnabled);\n event LogUnsortedOffer(uint256 id);\n event LogSortedOffer(uint256 id);\n event LogAddTokenPairWhitelist(address baseToken, address quoteToken);\n event LogRemTokenPairWhitelist(address baseToken, address quoteToken);\n event LogInsert(address keeper, uint256 id);\n event LogDelete(address keeper, uint256 id);\n\n // ============ Structs ============\n\n struct OfferInfo {\n uint256 pay_amt;\n address pay_gem;\n uint256 buy_amt;\n address buy_gem;\n address owner;\n uint64 timestamp;\n }\n\n struct sortInfo {\n uint256 next; //points to id of next higher offer\n uint256 prev; //points to id of previous lower offer\n uint256 delb; //the blocknumber where this entry was marked for delete\n }\n\n // ============ Storage ============\n\n bool public stopped;\n bool public buyEnabled = true;\n bool public matchingEnabled = true;\n mapping(uint256 => sortInfo) public _rank;\n mapping(address => mapping(address => uint256)) public _best;\n mapping(address => mapping(address => uint256)) public _span;\n mapping(address => uint256) public _dust;\n mapping(uint256 => uint256) public _near;\n uint256 _head;\n uint256 public dustId;\n uint256 public last_offer_id;\n mapping (uint256 => OfferInfo) public offers;\n\n // ============ Modifiers ============\n\n modifier can_offer {\n require(!isClosed());\n _;\n }\n\n modifier can_buy(uint256 id) {\n require(isActive(id));\n require(!isClosed());\n _;\n }\n\n modifier can_cancel(uint256 id) {\n require(isActive(id), \"Offer was deleted or taken, or never existed.\");\n require(\n isClosed() || msg.sender == getOwner(id) || id == dustId,\n \"Offer can not be cancelled because user is not owner, and market is open, and offer sells required amount of tokens.\"\n );\n _;\n }\n\n // ============ Functions ============\n\n function isClosed() public view returns (bool closed) {\n return stopped;\n }\n\n function getTime() public view returns (uint64) {\n return uint64(now);\n }\n\n function stop() public {\n stopped = true;\n }\n\n function isActive(uint256 id) public view returns (bool active) {\n return offers[id].timestamp > 0;\n }\n\n function getOwner(uint256 id) public view returns (address owner) {\n return offers[id].owner;\n }\n\n function getOffer(uint256 id) public view returns (uint256, address, uint256, address) {\n OfferInfo memory _offer = offers[id];\n return (_offer.pay_amt, _offer.pay_gem,\n _offer.buy_amt, _offer.buy_gem);\n }\n\n function bump(bytes32 id_)\n public\n can_buy(uint256(id_))\n {\n uint256 id = uint256(id_);\n emit LogBump(\n id_,\n keccak256(abi.encodePacked(offers[id].pay_gem, offers[id].buy_gem)),\n offers[id].owner,\n offers[id].pay_gem,\n offers[id].buy_gem,\n uint128(offers[id].pay_amt),\n uint128(offers[id].buy_amt),\n offers[id].timestamp\n );\n }\n\n function make(\n address pay_gem,\n address buy_gem,\n uint128 pay_amt,\n uint128 buy_amt\n )\n public\n returns (bytes32)\n {\n return bytes32(offer(pay_amt, pay_gem, buy_amt, buy_gem));\n }\n\n function take(bytes32 id, uint128 maxTakeAmount) public {\n require(buy(uint256(id), maxTakeAmount));\n }\n\n function kill(bytes32 id) public {\n require(cancel(uint256(id)));\n }\n\n // Make a new offer. Takes funds from the caller into market escrow.\n //\n // If matching is enabled:\n // * creates new offer without putting it in\n // the sorted list.\n // * available to authorized contracts only!\n // * keepers should call insert(id,pos)\n // to put offer in the sorted list.\n //\n // If matching is disabled:\n // * calls expiring market's offer().\n // * available to everyone without authorization.\n // * no sorting is done.\n //\n function offer(\n uint256 pay_amt, //maker (ask) sell how much\n address pay_gem, //maker (ask) sell which token\n uint256 buy_amt, //taker (ask) buy how much\n address buy_gem //taker (ask) buy which token\n )\n public\n can_offer\n returns (uint256)\n {\n return _offeru(pay_amt, pay_gem, buy_amt, buy_gem);\n }\n\n // Make a new offer. Takes funds from the caller into market escrow.\n function offer(\n uint256 pay_amt, //maker (ask) sell how much\n address pay_gem, //maker (ask) sell which token\n uint256 buy_amt, //maker (ask) buy how much\n address buy_gem, //maker (ask) buy which token\n uint256 pos //position to insert offer, 0 should be used if unknown\n )\n public\n can_offer\n returns (uint256)\n {\n return offer(pay_amt, pay_gem, buy_amt, buy_gem, pos, true);\n }\n\n function offer(\n uint256 pay_amt, //maker (ask) sell how much\n address pay_gem, //maker (ask) sell which token\n uint256 buy_amt, //maker (ask) buy how much\n address buy_gem, //maker (ask) buy which token\n uint256 pos, //position to insert offer, 0 should be used if unknown\n bool rounding //match \"close enough\" orders?\n )\n public\n can_offer\n returns (uint256)\n {\n require(_dust[pay_gem] <= pay_amt);\n\n return _matcho(pay_amt, pay_gem, buy_amt, buy_gem, pos, rounding);\n }\n\n //Transfers funds from caller to offer maker, and from market to caller.\n function buy(uint256 id, uint256 amount)\n public\n can_buy(id)\n returns (bool)\n {\n return _buys(id, amount);\n }\n\n // Cancel an offer. Refunds offer maker.\n function cancel(uint256 id)\n public\n can_cancel(id)\n returns (bool success)\n {\n if (isOfferSorted(id)) {\n require(_unsort(id));\n } else {\n require(_hide(id));\n }\n // read-only offer. Modify an offer by directly accessing offers[id]\n OfferInfo memory _offer = offers[id];\n delete offers[id];\n\n IERC20Detailed(_offer.pay_gem).transfer(_offer.owner, _offer.pay_amt);\n\n emit LogItemUpdate(id);\n emit LogKill(\n bytes32(id),\n keccak256(abi.encodePacked(_offer.pay_gem, _offer.buy_gem)),\n _offer.owner,\n _offer.pay_gem,\n _offer.buy_gem,\n uint128(_offer.pay_amt),\n uint128(_offer.buy_amt),\n uint64(now)\n );\n\n success = true;\n }\n\n //insert offer into the sorted list\n //keepers need to use this function\n function insert(\n uint256 id, //maker (ask) id\n uint256 pos //position to insert into\n )\n public\n returns (bool)\n {\n require(!isOfferSorted(id)); //make sure offers[id] is not yet sorted\n require(isActive(id)); //make sure offers[id] is active\n\n _hide(id); //remove offer from unsorted offers list\n _sort(id, pos); //put offer into the sorted offers list\n emit LogInsert(msg.sender, id);\n return true;\n }\n\n //deletes _rank [id]\n // Function should be called by keepers.\n function del_rank(uint256 id)\n public\n returns (bool)\n {\n require(!isActive(id) && _rank[id].delb != 0 && _rank[id].delb < block.number - 10);\n delete _rank[id];\n emit LogDelete(msg.sender, id);\n return true;\n }\n\n //set the minimum sell amount for a token\n // Function is used to avoid \"dust offers\" that have\n // very small amount of tokens to sell, and it would\n // cost more gas to accept the offer, than the value\n // of tokens received.\n function setMinSell(\n address pay_gem, //token to assign minimum sell amount to\n uint256 dust //maker (ask) minimum sell amount\n )\n public\n returns (bool)\n {\n _dust[pay_gem] = dust;\n emit LogMinSell(pay_gem, dust);\n return true;\n }\n\n //returns the minimum sell amount for an offer\n function getMinSell(\n address pay_gem //token for which minimum sell amount is queried\n )\n public\n view\n returns (uint256)\n {\n return _dust[pay_gem];\n }\n\n //set buy functionality enabled/disabled\n function setBuyEnabled(bool buyEnabled_) public returns (bool) {\n buyEnabled = buyEnabled_;\n emit LogBuyEnabled(buyEnabled);\n return true;\n }\n\n //set matching enabled/disabled\n // If matchingEnabled true(default), then inserted offers are matched.\n // Except the ones inserted by contracts, because those end up\n // in the unsorted list of offers, that must be later sorted by\n // keepers using insert().\n // If matchingEnabled is false then MatchingMarket is reverted to ExpiringMarket,\n // and matching is not done, and sorted lists are disabled.\n function setMatchingEnabled(bool matchingEnabled_) public returns (bool) {\n matchingEnabled = matchingEnabled_;\n emit LogMatchingEnabled(matchingEnabled);\n return true;\n }\n\n //return the best offer for a token pair\n // the best offer is the lowest one if it's an ask,\n // and highest one if it's a bid offer\n function getBestOffer(address sell_gem, address buy_gem) public view returns(uint256) {\n return _best[sell_gem][buy_gem];\n }\n\n //return the next worse offer in the sorted list\n // the worse offer is the higher one if its an ask,\n // a lower one if its a bid offer,\n // and in both cases the newer one if they're equal.\n function getWorseOffer(uint256 id) public view returns(uint256) {\n return _rank[id].prev;\n }\n\n //return the next better offer in the sorted list\n // the better offer is in the lower priced one if its an ask,\n // the next higher priced one if its a bid offer\n // and in both cases the older one if they're equal.\n function getBetterOffer(uint256 id) public view returns(uint256) {\n\n return _rank[id].next;\n }\n\n //return the amount of better offers for a token pair\n function getOfferCount(address sell_gem, address buy_gem) public view returns(uint256) {\n return _span[sell_gem][buy_gem];\n }\n\n //get the first unsorted offer that was inserted by a contract\n // Contracts can't calculate the insertion position of their offer because it is not an O(1) operation.\n // Their offers get put in the unsorted list of offers.\n // Keepers can calculate the insertion position offchain and pass it to the insert() function to insert\n // the unsorted offer into the sorted list. Unsorted offers will not be matched, but can be bought with buy().\n function getFirstUnsortedOffer() public view returns(uint256) {\n return _head;\n }\n\n //get the next unsorted offer\n // Can be used to cycle through all the unsorted offers.\n function getNextUnsortedOffer(uint256 id) public view returns(uint256) {\n return _near[id];\n }\n\n function isOfferSorted(uint256 id) public view returns(bool) {\n return _rank[id].next != 0\n || _rank[id].prev != 0\n || _best[offers[id].pay_gem][offers[id].buy_gem] == id;\n }\n\n function sellAllAmount(address pay_gem, uint256 pay_amt, address buy_gem, uint256 min_fill_amount)\n public\n returns (uint256 fill_amt)\n {\n uint256 offerId;\n while (pay_amt > 0) { //while there is amount to sell\n offerId = getBestOffer(buy_gem, pay_gem); //Get the best offer for the token pair\n require(offerId != 0); //Fails if there are not more offers\n\n // There is a chance that pay_amt is smaller than 1 wei of the other token\n if (pay_amt * 1 ether < wdiv(offers[offerId].buy_amt, offers[offerId].pay_amt)) {\n break; //We consider that all amount is sold\n }\n if (pay_amt >= offers[offerId].buy_amt) { //If amount to sell is higher or equal than current offer amount to buy\n fill_amt = SafeMath.add(fill_amt, offers[offerId].pay_amt); //Add amount bought to acumulator\n pay_amt = SafeMath.sub(pay_amt, offers[offerId].buy_amt); //Decrease amount to sell\n take(bytes32(offerId), uint128(offers[offerId].pay_amt)); //We take the whole offer\n } else { // if lower\n uint256 baux = rmul(pay_amt * 10 ** 9, rdiv(offers[offerId].pay_amt, offers[offerId].buy_amt)) / 10 ** 9;\n fill_amt = SafeMath.add(fill_amt, baux); //Add amount bought to acumulator\n take(bytes32(offerId), uint128(baux)); //We take the portion of the offer that we need\n pay_amt = 0; //All amount is sold\n }\n }\n require(fill_amt >= min_fill_amount);\n }\n\n function buyAllAmount(address buy_gem, uint256 buy_amt, address pay_gem, uint256 max_fill_amount)\n public\n returns (uint256 fill_amt)\n {\n uint256 offerId;\n while (buy_amt > 0) { //Meanwhile there is amount to buy\n offerId = getBestOffer(buy_gem, pay_gem); //Get the best offer for the token pair\n require(offerId != 0);\n\n // There is a chance that buy_amt is smaller than 1 wei of the other token\n if (buy_amt * 1 ether < wdiv(offers[offerId].pay_amt, offers[offerId].buy_amt)) {\n break; //We consider that all amount is sold\n }\n if (buy_amt >= offers[offerId].pay_amt) { //If amount to buy is higher or equal than current offer amount to sell\n fill_amt = SafeMath.add(fill_amt, offers[offerId].buy_amt); //Add amount sold to acumulator\n buy_amt = SafeMath.sub(buy_amt, offers[offerId].pay_amt); //Decrease amount to buy\n take(bytes32(offerId), uint128(offers[offerId].pay_amt)); //We take the whole offer\n } else { //if lower\n fill_amt = SafeMath.add(fill_amt, rmul(buy_amt * 10 ** 9, rdiv(offers[offerId].buy_amt, offers[offerId].pay_amt)) / 10 ** 9); //Add amount sold to acumulator\n take(bytes32(offerId), uint128(buy_amt)); //We take the portion of the offer that we need\n buy_amt = 0; //All amount is bought\n }\n }\n require(fill_amt <= max_fill_amount);\n }\n\n function getBuyAmount(address buy_gem, address pay_gem, uint256 pay_amt) public view returns (uint256 fill_amt) {\n uint256 offerId = getBestOffer(buy_gem, pay_gem); //Get best offer for the token pair\n while (pay_amt > offers[offerId].buy_amt) {\n fill_amt = SafeMath.add(fill_amt, offers[offerId].pay_amt); //Add amount to buy accumulator\n pay_amt = SafeMath.sub(pay_amt, offers[offerId].buy_amt); //Decrease amount to pay\n if (pay_amt > 0) { //If we still need more offers\n offerId = getWorseOffer(offerId); //We look for the next best offer\n require(offerId != 0); //Fails if there are not enough offers to complete\n }\n }\n fill_amt = SafeMath.add(fill_amt, rmul(pay_amt * 10 ** 9, rdiv(offers[offerId].pay_amt, offers[offerId].buy_amt)) / 10 ** 9); //Add proportional amount of last offer to buy accumulator\n }\n\n function getPayAmount(address pay_gem, address buy_gem, uint256 buy_amt) public view returns (uint256 fill_amt) {\n uint256 offerId = getBestOffer(buy_gem, pay_gem); //Get best offer for the token pair\n while (buy_amt > offers[offerId].pay_amt) {\n fill_amt = SafeMath.add(fill_amt, offers[offerId].buy_amt); //Add amount to pay accumulator\n buy_amt = SafeMath.sub(buy_amt, offers[offerId].pay_amt); //Decrease amount to buy\n if (buy_amt > 0) { //If we still need more offers\n offerId = getWorseOffer(offerId); //We look for the next best offer\n require(offerId != 0); //Fails if there are not enough offers to complete\n }\n }\n fill_amt = SafeMath.add(fill_amt, rmul(buy_amt * 10 ** 9, rdiv(offers[offerId].buy_amt, offers[offerId].pay_amt)) / 10 ** 9); //Add proportional amount of last offer to pay accumulator\n }\n\n // ============ Internal Functions ============\n\n function _next_id()\n internal\n returns (uint256)\n {\n last_offer_id++; return last_offer_id;\n }\n\n function _buys(uint256 id, uint256 amount)\n internal\n returns (bool)\n {\n require(buyEnabled);\n if (amount == offers[id].pay_amt) {\n if (isOfferSorted(id)) {\n //offers[id] must be removed from sorted list because all of it is bought\n _unsort(id);\n }else{\n _hide(id);\n }\n }\n require(super_buy(id, amount));\n // If offer has become dust during buy, we cancel it\n if (isActive(id) && offers[id].pay_amt < _dust[offers[id].pay_gem]) {\n dustId = id; //enable current msg.sender to call cancel(id)\n cancel(id);\n }\n return true;\n }\n\n //find the id of the next higher offer after offers[id]\n function _find(uint256 id)\n internal\n view\n returns (uint256)\n {\n require(id > 0);\n\n address buy_gem = offers[id].buy_gem;\n address pay_gem = offers[id].pay_gem;\n uint256 top = _best[pay_gem][buy_gem];\n uint256 old_top = 0;\n\n // Find the larger-than-id order whose successor is less-than-id.\n while (top != 0 && _isPricedLtOrEq(id, top)) {\n old_top = top;\n top = _rank[top].prev;\n }\n return old_top;\n }\n\n //find the id of the next higher offer after offers[id]\n function _findpos(uint256 id, uint256 pos)\n internal\n view\n returns (uint256)\n {\n require(id > 0);\n\n // Look for an active order.\n while (pos != 0 && !isActive(pos)) {\n pos = _rank[pos].prev;\n }\n\n if (pos == 0) {\n //if we got to the end of list without a single active offer\n return _find(id);\n\n } else {\n // if we did find a nearby active offer\n // Walk the order book down from there...\n if(_isPricedLtOrEq(id, pos)) {\n uint256 old_pos;\n\n // Guaranteed to run at least once because of\n // the prior if statements.\n while (pos != 0 && _isPricedLtOrEq(id, pos)) {\n old_pos = pos;\n pos = _rank[pos].prev;\n }\n return old_pos;\n\n // ...or walk it up.\n } else {\n while (pos != 0 && !_isPricedLtOrEq(id, pos)) {\n pos = _rank[pos].next;\n }\n return pos;\n }\n }\n }\n\n //return true if offers[low] priced less than or equal to offers[high]\n function _isPricedLtOrEq(\n uint256 low, //lower priced offer's id\n uint256 high //higher priced offer's id\n )\n internal\n view\n returns (bool)\n {\n return SafeMath.mul(offers[low].buy_amt, offers[high].pay_amt)\n >= SafeMath.mul(offers[high].buy_amt, offers[low].pay_amt);\n }\n\n //these variables are global only because of solidity local variable limit\n\n //match offers with taker offer, and execute token transactions\n function _matcho(\n uint256 t_pay_amt, //taker sell how much\n address t_pay_gem, //taker sell which token\n uint256 t_buy_amt, //taker buy how much\n address t_buy_gem, //taker buy which token\n uint256 pos, //position id\n bool rounding //match \"close enough\" orders?\n )\n internal\n returns (uint256 id)\n {\n uint256 best_maker_id; //highest maker id\n uint256 t_buy_amt_old; //taker buy how much saved\n uint256 m_buy_amt; //maker offer wants to buy this much token\n uint256 m_pay_amt; //maker offer wants to sell this much token\n\n // there is at least one offer stored for token pair\n while (_best[t_buy_gem][t_pay_gem] > 0) {\n best_maker_id = _best[t_buy_gem][t_pay_gem];\n m_buy_amt = offers[best_maker_id].buy_amt;\n m_pay_amt = offers[best_maker_id].pay_amt;\n\n // Ugly hack to work around rounding errors. Based on the idea that\n // the furthest the amounts can stray from their \"true\" values is 1.\n // Ergo the worst case has t_pay_amt and m_pay_amt at +1 away from\n // their \"correct\" values and m_buy_amt and t_buy_amt at -1.\n // Since (c - 1) * (d - 1) > (a + 1) * (b + 1) is equivalent to\n // c * d > a * b + a + b + c + d, we write...\n if (SafeMath.mul(m_buy_amt, t_buy_amt) > SafeMath.mul(t_pay_amt, m_pay_amt) +\n (rounding ? m_buy_amt + t_buy_amt + t_pay_amt + m_pay_amt : 0))\n {\n break;\n }\n // ^ The `rounding` parameter is a compromise borne of a couple days\n // of discussion.\n buy(best_maker_id, Math.min(m_pay_amt, t_buy_amt));\n t_buy_amt_old = t_buy_amt;\n t_buy_amt = SafeMath.sub(t_buy_amt, Math.min(m_pay_amt, t_buy_amt));\n t_pay_amt = SafeMath.mul(t_buy_amt, t_pay_amt) / t_buy_amt_old;\n\n if (t_pay_amt == 0 || t_buy_amt == 0) {\n break;\n }\n }\n\n if (t_buy_amt > 0 && t_pay_amt > 0 && t_pay_amt >= _dust[t_pay_gem]) {\n //new offer should be created\n id = super_offer(t_pay_amt, t_pay_gem, t_buy_amt, t_buy_gem);\n //insert offer into the sorted list\n _sort(id, pos);\n }\n }\n\n // Make a new offer without putting it in the sorted list.\n // Takes funds from the caller into market escrow.\n // ****Available to authorized contracts only!**********\n // Keepers should call insert(id,pos) to put offer in the sorted list.\n function _offeru(\n uint256 pay_amt, //maker (ask) sell how much\n address pay_gem, //maker (ask) sell which token\n uint256 buy_amt, //maker (ask) buy how much\n address buy_gem //maker (ask) buy which token\n )\n internal\n returns (uint256 id)\n {\n require(_dust[pay_gem] <= pay_amt);\n id = super_offer(pay_amt, pay_gem, buy_amt, buy_gem);\n _near[id] = _head;\n _head = id;\n emit LogUnsortedOffer(id);\n }\n\n //put offer into the sorted list\n function _sort(\n uint256 id, //maker (ask) id\n uint256 pos //position to insert into\n )\n internal\n {\n require(isActive(id));\n\n address buy_gem = offers[id].buy_gem;\n address pay_gem = offers[id].pay_gem;\n uint256 prev_id; //maker (ask) id\n\n pos = pos == 0 || offers[pos].pay_gem != pay_gem || offers[pos].buy_gem != buy_gem || !isOfferSorted(pos)\n ?\n _find(id)\n :\n _findpos(id, pos);\n\n if (pos != 0) { //offers[id] is not the highest offer\n //requirement below is satisfied by statements above\n //require(_isPricedLtOrEq(id, pos));\n prev_id = _rank[pos].prev;\n _rank[pos].prev = id;\n _rank[id].next = pos;\n } else { //offers[id] is the highest offer\n prev_id = _best[pay_gem][buy_gem];\n _best[pay_gem][buy_gem] = id;\n }\n\n if (prev_id != 0) { //if lower offer does exist\n //requirement below is satisfied by statements above\n //require(!_isPricedLtOrEq(id, prev_id));\n _rank[prev_id].next = id;\n _rank[id].prev = prev_id;\n }\n\n _span[pay_gem][buy_gem]++;\n emit LogSortedOffer(id);\n }\n\n // Remove offer from the sorted list (does not cancel offer)\n function _unsort(\n uint256 id //id of maker (ask) offer to remove from sorted list\n )\n internal\n returns (bool)\n {\n address buy_gem = offers[id].buy_gem;\n address pay_gem = offers[id].pay_gem;\n require(_span[pay_gem][buy_gem] > 0);\n\n require(_rank[id].delb == 0 && //assert id is in the sorted list\n isOfferSorted(id));\n\n if (id != _best[pay_gem][buy_gem]) { // offers[id] is not the highest offer\n require(_rank[_rank[id].next].prev == id);\n _rank[_rank[id].next].prev = _rank[id].prev;\n } else { //offers[id] is the highest offer\n _best[pay_gem][buy_gem] = _rank[id].prev;\n }\n\n if (_rank[id].prev != 0) { //offers[id] is not the lowest offer\n require(_rank[_rank[id].prev].next == id);\n _rank[_rank[id].prev].next = _rank[id].next;\n }\n\n _span[pay_gem][buy_gem]--;\n _rank[id].delb = block.number; //mark _rank[id] for deletion\n return true;\n }\n\n //Hide offer from the unsorted order book (does not cancel offer)\n function _hide(\n uint256 id //id of maker offer to remove from unsorted list\n )\n internal\n returns (bool)\n {\n uint256 uid = _head; //id of an offer in unsorted offers list\n uint256 pre = uid; //id of previous offer in unsorted offers list\n\n require(!isOfferSorted(id)); //make sure offer id is not in sorted offers list\n\n if (_head == id) { //check if offer is first offer in unsorted offers list\n _head = _near[id]; //set head to new first unsorted offer\n _near[id] = 0; //delete order from unsorted order list\n return true;\n }\n while (uid > 0 && uid != id) { //find offer in unsorted order list\n pre = uid;\n uid = _near[uid];\n }\n if (uid != id) { //did not find offer id in unsorted offers list\n return false;\n }\n _near[pre] = _near[id]; //set previous unsorted offer to point to offer after offer id\n _near[id] = 0; //delete order from unsorted order list\n return true;\n }\n\n // Accept given `quantity` of an offer. Transfers funds from caller to\n // offer maker, and from market to caller.\n function super_buy(uint256 id, uint256 quantity)\n internal\n returns (bool)\n {\n OfferInfo memory _offer = offers[id];\n uint256 spend = SafeMath.mul(quantity, _offer.buy_amt) / _offer.pay_amt;\n\n require(uint128(spend) == spend);\n require(uint128(quantity) == quantity);\n\n // For backwards semantic compatibility.\n if (quantity == 0 || spend == 0 ||\n quantity > _offer.pay_amt || spend > _offer.buy_amt)\n {\n return false;\n }\n\n offers[id].pay_amt = SafeMath.sub(_offer.pay_amt, quantity);\n offers[id].buy_amt = SafeMath.sub(_offer.buy_amt, spend);\n IERC20Detailed(_offer.buy_gem).transferFrom(msg.sender, _offer.owner, spend);\n IERC20Detailed(_offer.pay_gem).transfer(msg.sender, quantity);\n\n emit LogItemUpdate(id);\n emit LogTake(\n bytes32(id),\n keccak256(abi.encodePacked(_offer.pay_gem, _offer.buy_gem)),\n _offer.owner,\n _offer.pay_gem,\n _offer.buy_gem,\n msg.sender,\n uint128(quantity),\n uint128(spend),\n uint64(now)\n );\n emit LogTrade(quantity, _offer.pay_gem, spend, _offer.buy_gem);\n\n if (offers[id].pay_amt == 0) {\n delete offers[id];\n }\n\n return true;\n }\n\n // Make a new offer. Takes funds from the caller into market escrow.\n function super_offer(uint256 pay_amt, address pay_gem, uint256 buy_amt, address buy_gem)\n internal\n returns (uint256 id)\n {\n require(uint128(pay_amt) == pay_amt);\n require(uint128(buy_amt) == buy_amt);\n require(pay_amt > 0);\n require(pay_gem != address(0x0));\n require(buy_amt > 0);\n require(buy_gem != address(0x0));\n require(pay_gem != buy_gem);\n\n OfferInfo memory info;\n info.pay_amt = pay_amt;\n info.pay_gem = pay_gem;\n info.buy_amt = buy_amt;\n info.buy_gem = buy_gem;\n info.owner = msg.sender;\n info.timestamp = uint64(now);\n id = _next_id();\n offers[id] = info;\n\n IERC20Detailed(pay_gem).transferFrom(msg.sender, address(this), pay_amt);\n\n emit LogItemUpdate(id);\n emit LogMake(\n bytes32(id),\n keccak256(abi.encodePacked(pay_gem, buy_gem)),\n msg.sender,\n pay_gem,\n buy_gem,\n uint128(pay_amt),\n uint128(buy_amt),\n uint64(now)\n );\n }\n\n // ============ Math Functions ============\n\n function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = SafeMath.add(SafeMath.mul(x, y), RAY / 2) / RAY;\n }\n function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = SafeMath.add(SafeMath.mul(x, WAD), y / 2) / y;\n }\n function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = SafeMath.add(SafeMath.mul(x, RAY), y / 2) / y;\n }\n}\n",
1468
- "sourcePath": "/home/cdc218/projects/dolomite-protocol-v2/contracts/testing/TestOasisDex.sol",
1468
+ "sourcePath": "/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/testing/TestOasisDex.sol",
1469
1469
  "ast": {
1470
- "absolutePath": "/home/cdc218/projects/dolomite-protocol-v2/contracts/testing/TestOasisDex.sol",
1470
+ "absolutePath": "/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/testing/TestOasisDex.sol",
1471
1471
  "exportedSymbols": {
1472
1472
  "TestOasisDex": [
1473
1473
  39547
@@ -1513,7 +1513,7 @@
1513
1513
  "unitAlias": ""
1514
1514
  },
1515
1515
  {
1516
- "absolutePath": "/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IERC20Detailed.sol",
1516
+ "absolutePath": "/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/protocol/interfaces/IERC20Detailed.sol",
1517
1517
  "file": "../protocol/interfaces/IERC20Detailed.sol",
1518
1518
  "id": 36888,
1519
1519
  "nodeType": "ImportDirective",
@@ -1529,7 +1529,7 @@
1529
1529
  "unitAlias": ""
1530
1530
  },
1531
1531
  {
1532
- "absolutePath": "/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Math.sol",
1532
+ "absolutePath": "/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/protocol/lib/Math.sol",
1533
1533
  "file": "../protocol/lib/Math.sol",
1534
1534
  "id": 36890,
1535
1535
  "nodeType": "ImportDirective",
@@ -37694,7 +37694,7 @@
37694
37694
  "src": "603:32606:104"
37695
37695
  },
37696
37696
  "legacyAST": {
37697
- "absolutePath": "/home/cdc218/projects/dolomite-protocol-v2/contracts/testing/TestOasisDex.sol",
37697
+ "absolutePath": "/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/testing/TestOasisDex.sol",
37698
37698
  "exportedSymbols": {
37699
37699
  "TestOasisDex": [
37700
37700
  39547
@@ -37740,7 +37740,7 @@
37740
37740
  "unitAlias": ""
37741
37741
  },
37742
37742
  {
37743
- "absolutePath": "/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/interfaces/IERC20Detailed.sol",
37743
+ "absolutePath": "/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/protocol/interfaces/IERC20Detailed.sol",
37744
37744
  "file": "../protocol/interfaces/IERC20Detailed.sol",
37745
37745
  "id": 36888,
37746
37746
  "nodeType": "ImportDirective",
@@ -37756,7 +37756,7 @@
37756
37756
  "unitAlias": ""
37757
37757
  },
37758
37758
  {
37759
- "absolutePath": "/home/cdc218/projects/dolomite-protocol-v2/contracts/protocol/lib/Math.sol",
37759
+ "absolutePath": "/Users/corey/Leavitt-Innovations/dolomite-v2-protocol/contracts/protocol/lib/Math.sol",
37760
37760
  "file": "../protocol/lib/Math.sol",
37761
37761
  "id": 36890,
37762
37762
  "nodeType": "ImportDirective",
@@ -74347,11 +74347,11 @@
74347
74347
  },
74348
74348
  "links": {},
74349
74349
  "address": "0xDb56f2e9369E0D7bD191099125a3f6C370F8ed15",
74350
- "transactionHash": "0xb94f4905cbb3cc13c5bcf2923d1ad79f5d047830924c3cdcb1d6856f9c12507a"
74350
+ "transactionHash": "0xacda057d8ec7fc8d8b4ea5cf2b12577341a0592e2da5b91b98c208f7b2f7d02c"
74351
74351
  }
74352
74352
  },
74353
74353
  "schemaVersion": "3.0.23",
74354
- "updatedAt": "2022-02-04T01:55:01.289Z",
74354
+ "updatedAt": "2022-02-07T07:18:45.447Z",
74355
74355
  "devdoc": {
74356
74356
  "author": "dYdX * Contract for testing stuff against OasisDex. Removes some functionality like auth, note, and non-reentrancy protection.",
74357
74357
  "methods": {},