From e4deeb60b98672efabbddd578afd29687df76d68 Mon Sep 17 00:00:00 2001 From: wangdong Date: Fri, 20 Apr 2018 19:05:33 -0400 Subject: [PATCH 01/68] solidity 0.4.23 --- contracts/LoopringProtocol.sol | 2 +- contracts/LoopringProtocolImpl.sol | 4 +- contracts/Migrations.sol | 4 +- contracts/TokenFactory.sol | 2 +- contracts/TokenFactoryImpl.sol | 7 +-- contracts/TokenRegistry.sol | 2 +- contracts/TokenRegistryImpl.sol | 2 +- contracts/TokenTransferDelegate.sol | 2 +- contracts/TokenTransferDelegateImpl.sol | 2 +- contracts/TransferableMultsig.sol | 2 +- contracts/TransferableMultsigImpl.sol | 4 +- contracts/lib/AddressUtil.sol | 2 +- contracts/lib/Claimable.sol | 2 +- contracts/lib/ERC20.sol | 2 +- contracts/lib/ERC20Token.sol | 4 +- contracts/lib/MathBytes32.sol | 2 +- contracts/lib/MathUint.sol | 2 +- contracts/lib/MathUint8.sol | 2 +- contracts/lib/Ownable.sol | 4 +- contracts/lib/StringUtil.sol | 2 +- contracts/test/DummyToken.sol | 5 +- package-lock.json | 72 ++++++++++++++++--------- package.json | 8 +-- 23 files changed, 81 insertions(+), 59 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index 7434451b..f6073053 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Loopring Token Exchange Protocol Contract Interface diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index a8147f8d..2821defd 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; import "./lib/AddressUtil.sol"; import "./lib/ERC20.sol"; @@ -109,7 +109,7 @@ contract LoopringProtocolImpl is LoopringProtocol { bytes32 ringHash; // computed } - function LoopringProtocolImpl( + constructor( address _lrcTokenAddress, address _tokenRegistryAddress, address _delegateAddress, diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol index 39801dcf..b52c3ef9 100644 --- a/contracts/Migrations.sol +++ b/contracts/Migrations.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; contract Migrations { @@ -28,7 +28,7 @@ contract Migrations { } } - function Migrations() + constructor() public { owner = msg.sender; diff --git a/contracts/TokenFactory.sol b/contracts/TokenFactory.sol index de6ce298..4726f1ec 100644 --- a/contracts/TokenFactory.sol +++ b/contracts/TokenFactory.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title ERC20 Token Mint diff --git a/contracts/TokenFactoryImpl.sol b/contracts/TokenFactoryImpl.sol index 7ec77eff..e72dec99 100644 --- a/contracts/TokenFactoryImpl.sol +++ b/contracts/TokenFactoryImpl.sol @@ -14,11 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; +//pragma experimental ABIEncoderV2; import "./lib/AddressUtil.sol"; -import "./lib/StringUtil.sol"; import "./lib/ERC20Token.sol"; +import "./lib/StringUtil.sol"; import "./TokenFactory.sol"; import "./TokenRegistry.sol"; @@ -42,7 +43,7 @@ contract TokenFactoryImpl is TokenFactory { revert(); } - function TokenFactoryImpl( + constructor( address _tokenRegistry ) public diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index 9e186fb6..c845025a 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Token Register Contract diff --git a/contracts/TokenRegistryImpl.sol b/contracts/TokenRegistryImpl.sol index 96e8c6d4..235603bf 100644 --- a/contracts/TokenRegistryImpl.sol +++ b/contracts/TokenRegistryImpl.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; import "./lib/AddressUtil.sol"; import "./lib/Claimable.sol"; diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TokenTransferDelegate.sol index e62b42aa..781d5a98 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TokenTransferDelegate.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title TokenTransferDelegate diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index 23a1e5e1..37e05728 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; import "./lib/Claimable.sol"; import "./lib/ERC20.sol"; diff --git a/contracts/TransferableMultsig.sol b/contracts/TransferableMultsig.sol index b5652bc5..900d5787 100644 --- a/contracts/TransferableMultsig.sol +++ b/contracts/TransferableMultsig.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Transferable Multisignature Contract diff --git a/contracts/TransferableMultsigImpl.sol b/contracts/TransferableMultsigImpl.sol index b002a1b2..c7864984 100644 --- a/contracts/TransferableMultsigImpl.sol +++ b/contracts/TransferableMultsigImpl.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; import "./TransferableMultsig.sol"; @@ -28,7 +28,7 @@ contract TransferableMultsigImpl is TransferableMultsig { mapping (address => bool) ownerMap; // immutable state address[] public owners; // immutable state - function TransferableMultsig( + constructor( uint _threshold, address[] _owners ) diff --git a/contracts/lib/AddressUtil.sol b/contracts/lib/AddressUtil.sol index 57d39a37..ff2386e9 100644 --- a/contracts/lib/AddressUtil.sol +++ b/contracts/lib/AddressUtil.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Utility Functions for address diff --git a/contracts/lib/Claimable.sol b/contracts/lib/Claimable.sol index 862e0668..a20d54a1 100644 --- a/contracts/lib/Claimable.sol +++ b/contracts/lib/Claimable.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; import "./Ownable.sol"; diff --git a/contracts/lib/ERC20.sol b/contracts/lib/ERC20.sol index c6549cf5..4afb7d00 100644 --- a/contracts/lib/ERC20.sol +++ b/contracts/lib/ERC20.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title ERC20 Token Interface diff --git a/contracts/lib/ERC20Token.sol b/contracts/lib/ERC20Token.sol index 63993fb5..f420072a 100644 --- a/contracts/lib/ERC20Token.sol +++ b/contracts/lib/ERC20Token.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; import "./AddressUtil.sol"; import "./ERC20.sol"; @@ -47,7 +47,7 @@ contract ERC20Token is ERC20 { uint256 value ); - function ERC20Token( + constructor( string _name, string _symbol, uint8 _decimals, diff --git a/contracts/lib/MathBytes32.sol b/contracts/lib/MathBytes32.sol index 1d02d311..00172412 100644 --- a/contracts/lib/MathBytes32.sol +++ b/contracts/lib/MathBytes32.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Utility Functions for byte32 diff --git a/contracts/lib/MathUint.sol b/contracts/lib/MathUint.sol index 73636d16..67b717d0 100644 --- a/contracts/lib/MathUint.sol +++ b/contracts/lib/MathUint.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Utility Functions for uint diff --git a/contracts/lib/MathUint8.sol b/contracts/lib/MathUint8.sol index 4b4f0b4f..6e9efe97 100644 --- a/contracts/lib/MathUint8.sol +++ b/contracts/lib/MathUint8.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Utility Functions for uint8 diff --git a/contracts/lib/Ownable.sol b/contracts/lib/Ownable.sol index f39184bb..83159d16 100644 --- a/contracts/lib/Ownable.sol +++ b/contracts/lib/Ownable.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Ownable @@ -31,7 +31,7 @@ contract Ownable { /// @dev The Ownable constructor sets the original `owner` of the contract /// to the sender. - function Ownable() + constructor() public { owner = msg.sender; diff --git a/contracts/lib/StringUtil.sol b/contracts/lib/StringUtil.sol index c5e0856d..30079ae9 100644 --- a/contracts/lib/StringUtil.sol +++ b/contracts/lib/StringUtil.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; /// @title Utility Functions for address diff --git a/contracts/test/DummyToken.sol b/contracts/test/DummyToken.sol index 55672e00..af235d23 100644 --- a/contracts/test/DummyToken.sol +++ b/contracts/test/DummyToken.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.21; +pragma solidity 0.4.23; import "../lib/ERC20Token.sol"; import "../lib/MathUint.sol"; @@ -24,8 +24,7 @@ import "../lib/MathUint.sol"; contract DummyToken is ERC20Token { using MathUint for uint; - /// constructor. - function DummyToken( + constructor( string _name, string _symbol, uint8 _decimals, diff --git a/package-lock.json b/package-lock.json index eba91ecc..8f1b8039 100644 --- a/package-lock.json +++ b/package-lock.json @@ -220,9 +220,9 @@ "dev": true }, "assertion-error": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", - "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "ast-types": { @@ -1289,13 +1289,17 @@ "dev": true }, "chai": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-2.3.0.tgz", - "integrity": "sha1-ii9qNHSNqAEJD9cyh7Kqc5pOkJo=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.0.0", - "deep-eql": "0.1.3" + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" } }, "chalk": { @@ -1317,6 +1321,12 @@ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1666,12 +1676,12 @@ } }, "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "0.1.1" + "type-detect": "4.0.8" } }, "deep-extend": { @@ -3156,6 +3166,12 @@ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -8933,6 +8949,12 @@ "pinkie-promise": "2.0.1" } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, "pegjs": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", @@ -9580,9 +9602,9 @@ "dev": true }, "solc": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.21.tgz", - "integrity": "sha512-8lJmimVjOG9AJOQRWS2ph4rSctPMsPGZ4H360HLs5iI+euUlt7iAvUxSLeFZZzwk0kas4Qta7HmlMXNU3yYwhw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.23.tgz", + "integrity": "sha512-AT7anLHY6uIRg2It6N0UlCHeZ7YeecIkUhnlirrCgCPCUevtnoN48BxvgigN/4jJTRljv5oFhAJtI6gvHzT5DQ==", "dev": true, "requires": { "fs-extra": "0.30.0", @@ -10036,14 +10058,14 @@ "dev": true }, "truffle": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.5.tgz", - "integrity": "sha512-6sOVFQ0xNbb52MMWf0nHxv0FiXWPTV+OIbq1B0+I5F3sIS8JJ7pM1+o7chbs+oO/CLqbbC6ggXJqFWzIWaiaQg==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.7.tgz", + "integrity": "sha512-fe6BIcD9xo6iIJvV1m6ZhOk56kmB8k38kdoWOKYnPPw7ZUUSupgojeTb2K5e+4qIpIHvEvmET4yLUjSGR+hvwA==", "dev": true, "requires": { "mocha": "3.5.3", "original-require": "1.0.1", - "solc": "0.4.21" + "solc": "0.4.23" }, "dependencies": { "commander": { @@ -10192,15 +10214,15 @@ } }, "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "typescript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", + "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", "dev": true }, "underscore": { diff --git a/package.json b/package.json index 2d1fa189..bac64ef3 100644 --- a/package.json +++ b/package.json @@ -29,14 +29,14 @@ "@types/node": "9.3.0", "@types/request-promise-native": "^1.0.14", "ajv": "^5.0.0", - "chai": "^2.2.1", + "chai": "^4.0.1", "copyfiles": "^1.2.0", - "dirty-chai": "^2.0.0", + "dirty-chai": "^2.0.1", "ganache-cli": "^6.1.0", "solium": "^1.1.6", - "truffle": "4.1.5", + "truffle": "^4.1.7", "tslint": "5.8.0", - "typescript": "2.4.2", + "typescript": "2.7.1", "web3-typescript-typings": "0.0.3" }, "dependencies": { From 2a1228e4e2dfe040d35af5e81cbba0241a527e7d Mon Sep 17 00:00:00 2001 From: wangdong Date: Fri, 20 Apr 2018 19:11:20 -0400 Subject: [PATCH 02/68] turn on experimental "v0.5.0" --- contracts/LoopringProtocolImpl.sol | 2 +- contracts/TokenFactoryImpl.sol | 5 +++-- contracts/TokenRegistryImpl.sol | 2 +- contracts/TokenTransferDelegateImpl.sol | 2 +- contracts/TransferableMultsigImpl.sol | 2 +- contracts/lib/ERC20Token.sol | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 2821defd..ca2605ad 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -135,7 +135,7 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @dev Disable default function. function () payable - public + external { revert(); } diff --git a/contracts/TokenFactoryImpl.sol b/contracts/TokenFactoryImpl.sol index e72dec99..fdc14b07 100644 --- a/contracts/TokenFactoryImpl.sol +++ b/contracts/TokenFactoryImpl.sol @@ -15,7 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; -//pragma experimental ABIEncoderV2; +pragma experimental "v0.5.0"; +// pragma experimental ABIEncoderV2; import "./lib/AddressUtil.sol"; import "./lib/ERC20Token.sol"; @@ -38,7 +39,7 @@ contract TokenFactoryImpl is TokenFactory { /// @dev Disable default function. function () payable - public + external { revert(); } diff --git a/contracts/TokenRegistryImpl.sol b/contracts/TokenRegistryImpl.sol index 235603bf..123b1307 100644 --- a/contracts/TokenRegistryImpl.sol +++ b/contracts/TokenRegistryImpl.sol @@ -40,7 +40,7 @@ contract TokenRegistryImpl is TokenRegistry, Claimable { /// @dev Disable default function. function () payable - public + external { revert(); } diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index 37e05728..895a29c7 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -45,7 +45,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { /// @dev Disable default function. function () payable - public + external { revert(); } diff --git a/contracts/TransferableMultsigImpl.sol b/contracts/TransferableMultsigImpl.sol index c7864984..aa41b69f 100644 --- a/contracts/TransferableMultsigImpl.sol +++ b/contracts/TransferableMultsigImpl.sol @@ -40,7 +40,7 @@ contract TransferableMultsigImpl is TransferableMultsig { // default function does nothing. function () payable - public + external { } diff --git a/contracts/lib/ERC20Token.sol b/contracts/lib/ERC20Token.sol index f420072a..4007ad9c 100644 --- a/contracts/lib/ERC20Token.sol +++ b/contracts/lib/ERC20Token.sol @@ -70,7 +70,7 @@ contract ERC20Token is ERC20 { function () payable - public + external { revert(); } From 63fb034df105a13d73ea75dcb8dc4e7e6f0e60e1 Mon Sep 17 00:00:00 2001 From: wangdong Date: Fri, 20 Apr 2018 19:41:22 -0400 Subject: [PATCH 03/68] use ABIEncoderV2 and v0.5.0 experimental features --- contracts/LoopringProtocol.sol | 2 ++ contracts/LoopringProtocolImpl.sol | 2 ++ contracts/Migrations.sol | 2 ++ contracts/TokenFactory.sol | 2 ++ contracts/TokenFactoryImpl.sol | 2 +- contracts/TokenRegistry.sol | 2 ++ contracts/TokenRegistryImpl.sol | 2 ++ contracts/TokenTransferDelegate.sol | 2 ++ contracts/TokenTransferDelegateImpl.sol | 2 ++ contracts/TransferableMultsig.sol | 2 ++ contracts/TransferableMultsigImpl.sol | 4 +++- contracts/lib/AddressUtil.sol | 4 +++- contracts/lib/Claimable.sol | 2 ++ contracts/lib/ERC20.sol | 2 ++ contracts/lib/ERC20Token.sol | 4 +++- contracts/lib/MathBytes32.sol | 4 +++- contracts/lib/MathUint.sol | 14 ++++++++------ contracts/lib/MathUint8.sol | 4 +++- contracts/lib/Ownable.sol | 2 ++ contracts/lib/StringUtil.sol | 8 +++++--- contracts/test/DummyToken.sol | 2 ++ 21 files changed, 55 insertions(+), 15 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index f6073053..09c9422b 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Loopring Token Exchange Protocol Contract Interface diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index ca2605ad..bbf9fc88 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/ERC20.sol"; diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol index b52c3ef9..fc7e0294 100644 --- a/contracts/Migrations.sol +++ b/contracts/Migrations.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; contract Migrations { diff --git a/contracts/TokenFactory.sol b/contracts/TokenFactory.sol index 4726f1ec..86ba3a8d 100644 --- a/contracts/TokenFactory.sol +++ b/contracts/TokenFactory.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title ERC20 Token Mint diff --git a/contracts/TokenFactoryImpl.sol b/contracts/TokenFactoryImpl.sol index fdc14b07..995e5cf9 100644 --- a/contracts/TokenFactoryImpl.sol +++ b/contracts/TokenFactoryImpl.sol @@ -16,7 +16,7 @@ */ pragma solidity 0.4.23; pragma experimental "v0.5.0"; -// pragma experimental ABIEncoderV2; +pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/ERC20Token.sol"; diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index c845025a..afc680f2 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Token Register Contract diff --git a/contracts/TokenRegistryImpl.sol b/contracts/TokenRegistryImpl.sol index 123b1307..81160cd4 100644 --- a/contracts/TokenRegistryImpl.sol +++ b/contracts/TokenRegistryImpl.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/Claimable.sol"; diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TokenTransferDelegate.sol index 781d5a98..887be681 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TokenTransferDelegate.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title TokenTransferDelegate diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index 895a29c7..fd1f8db8 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; import "./lib/Claimable.sol"; import "./lib/ERC20.sol"; diff --git a/contracts/TransferableMultsig.sol b/contracts/TransferableMultsig.sol index 900d5787..a049ddb0 100644 --- a/contracts/TransferableMultsig.sol +++ b/contracts/TransferableMultsig.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Transferable Multisignature Contract diff --git a/contracts/TransferableMultsigImpl.sol b/contracts/TransferableMultsigImpl.sol index aa41b69f..f15a738c 100644 --- a/contracts/TransferableMultsigImpl.sol +++ b/contracts/TransferableMultsigImpl.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; import "./TransferableMultsig.sol"; @@ -152,7 +154,7 @@ contract TransferableMultsigImpl is TransferableMultsig { } address lastAddr = 0x0; - for (i = 0; i < _owners.length; i++) { + for (uint i = 0; i < _owners.length; i++) { address owner = _owners[i]; require(owner > lastAddr); diff --git a/contracts/lib/AddressUtil.sol b/contracts/lib/AddressUtil.sol index ff2386e9..485ad353 100644 --- a/contracts/lib/AddressUtil.sol +++ b/contracts/lib/AddressUtil.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Utility Functions for address @@ -23,7 +25,7 @@ library AddressUtil { function isContract( address addr ) - internal + public view returns (bool) { diff --git a/contracts/lib/Claimable.sol b/contracts/lib/Claimable.sol index a20d54a1..830cf955 100644 --- a/contracts/lib/Claimable.sol +++ b/contracts/lib/Claimable.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; import "./Ownable.sol"; diff --git a/contracts/lib/ERC20.sol b/contracts/lib/ERC20.sol index 4afb7d00..d6664f09 100644 --- a/contracts/lib/ERC20.sol +++ b/contracts/lib/ERC20.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title ERC20 Token Interface diff --git a/contracts/lib/ERC20Token.sol b/contracts/lib/ERC20Token.sol index 4007ad9c..61e2ae22 100644 --- a/contracts/lib/ERC20Token.sol +++ b/contracts/lib/ERC20Token.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; import "./AddressUtil.sol"; import "./ERC20.sol"; @@ -256,7 +258,7 @@ contract ERC20Token is ERC20 { } bytes memory n = bytes(_name); require(n.length >= s.length && n.length <= 128); - for (i = 0; i < n.length; i++) { + for (uint i = 0; i < n.length; i++) { require(n[i] >= 0x20 && n[i] <= 0x7E); } } diff --git a/contracts/lib/MathBytes32.sol b/contracts/lib/MathBytes32.sol index 00172412..daa36e39 100644 --- a/contracts/lib/MathBytes32.sol +++ b/contracts/lib/MathBytes32.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Utility Functions for byte32 @@ -26,7 +28,7 @@ library MathBytes32 { bytes32[] arr, uint len ) - internal + public pure returns (bytes32 res) { diff --git a/contracts/lib/MathUint.sol b/contracts/lib/MathUint.sol index 67b717d0..826de10e 100644 --- a/contracts/lib/MathUint.sol +++ b/contracts/lib/MathUint.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Utility Functions for uint @@ -25,7 +27,7 @@ library MathUint { uint a, uint b ) - internal + public pure returns (uint c) { @@ -37,7 +39,7 @@ library MathUint { uint a, uint b ) - internal + public pure returns (uint) { @@ -49,7 +51,7 @@ library MathUint { uint a, uint b ) - internal + public pure returns (uint c) { @@ -61,7 +63,7 @@ library MathUint { uint a, uint b ) - internal + public pure returns (uint c) { @@ -74,7 +76,7 @@ library MathUint { uint[] arr, uint scale ) - internal + public pure returns (uint) { @@ -96,7 +98,7 @@ library MathUint { uint cvs = 0; uint s; uint item; - for (i = 0; i < len; i++) { + for (uint i = 0; i < len; i++) { item = arr[i]; s = item > avg ? item - avg : avg - item; cvs += mul(s, s); diff --git a/contracts/lib/MathUint8.sol b/contracts/lib/MathUint8.sol index 6e9efe97..238cde04 100644 --- a/contracts/lib/MathUint8.sol +++ b/contracts/lib/MathUint8.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Utility Functions for uint8 @@ -25,7 +27,7 @@ library MathUint8 { uint8[] arr, uint len ) - internal + public pure returns (uint8 res) { diff --git a/contracts/lib/Ownable.sol b/contracts/lib/Ownable.sol index 83159d16..4c82b5f7 100644 --- a/contracts/lib/Ownable.sol +++ b/contracts/lib/Ownable.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Ownable diff --git a/contracts/lib/StringUtil.sol b/contracts/lib/StringUtil.sol index 30079ae9..9388591c 100644 --- a/contracts/lib/StringUtil.sol +++ b/contracts/lib/StringUtil.sol @@ -15,13 +15,15 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; /// @title Utility Functions for address /// @author Kongliang Zhong - library StringUtil { function stringToBytes12(string str) - internal + public pure returns (bytes12 result) { @@ -31,7 +33,7 @@ library StringUtil { } function stringToBytes10(string str) - internal + public pure returns (bytes10 result) { @@ -42,7 +44,7 @@ library StringUtil { /// check length >= min && <= max function checkStringLength(string name, uint min, uint max) - internal + public pure returns (bool) { diff --git a/contracts/test/DummyToken.sol b/contracts/test/DummyToken.sol index af235d23..a0b86b29 100644 --- a/contracts/test/DummyToken.sol +++ b/contracts/test/DummyToken.sol @@ -15,6 +15,8 @@ limitations under the License. */ pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; import "../lib/ERC20Token.sol"; import "../lib/MathUint.sol"; From df07a34d610155f9f77e41833997880717dfaebb Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 21 Apr 2018 01:11:28 -0400 Subject: [PATCH 04/68] Refactor submitRing (#314) --- contracts/LoopringProtocol.sol | 3 - contracts/LoopringProtocolImpl.sol | 737 ++++++++++++++--------------- 2 files changed, 351 insertions(+), 389 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index 09c9422b..9949040d 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -25,9 +25,6 @@ pragma experimental "ABIEncoderV2"; contract LoopringProtocol { uint8 public constant MARGIN_SPLIT_PERCENTAGE_BASE = 100; - /// @dev Event to emit if a ring is successfully mined. - /// _amountsList is an array of: - /// [_amountS, _amountB, _lrcReward, _lrcFee, splitS, splitB]. event RingMined( uint _ringIndex, bytes32 indexed _ringHash, diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index bbf9fc88..4f746527 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -101,13 +101,20 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @dev A struct to capture parameters passed to submitRing method and /// various of other variables used across the submitRing core logics. - struct RingParams { + struct Context { + address[4][] addressList; + uint[6][] uintArgsList; + uint8[1][] uint8ArgsList; + bool[] buyNoMoreThanAmountBList; uint8[] vList; bytes32[] rList; bytes32[] sList; address miner; uint16 feeSelections; + uint64 ringIndex; uint ringSize; // computed + TokenTransferDelegate delegate; + OrderState[] orders; bytes32 ringHash; // computed } @@ -155,7 +162,7 @@ contract LoopringProtocolImpl is LoopringProtocol { { uint cancelAmount = orderValues[5]; - require(cancelAmount > 0); // "amount to cancel is zero"); + require(cancelAmount > 0, "invalid cancelAmount"); OrderState memory order = OrderState( addresses[0], @@ -181,7 +188,10 @@ contract LoopringProtocolImpl is LoopringProtocol { 0 ); - require(msg.sender == order.owner); // "cancelOrder not submitted by order owner"); + require( + msg.sender == order.owner, + "cancelOrder not submitted by owner" + ); bytes32 orderHash = calculateOrderHash(order); @@ -212,8 +222,10 @@ contract LoopringProtocolImpl is LoopringProtocol { bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); - require(delegate.tradingPairCutoffs(msg.sender, tokenPair) < t); - // "attempted to set cutoff to a smaller value" + require( + delegate.tradingPairCutoffs(msg.sender, tokenPair) < t, + "cutoff too small" + ); delegate.setTradingPairCutoffs(tokenPair, t); emit OrdersCancelled( @@ -232,7 +244,10 @@ contract LoopringProtocolImpl is LoopringProtocol { uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); - require(delegate.cutoffs(msg.sender) < t); // "attempted to set cutoff to a smaller value" + require( + delegate.cutoffs(msg.sender) < t, + "cutoff too small" + ); delegate.setCutoffs(t); emit AllOrdersCancelled(msg.sender, t); @@ -251,272 +266,357 @@ contract LoopringProtocolImpl is LoopringProtocol { ) public { - // Check if the highest bit of ringIndex is '1'. - require((ringIndex >> 63) == 0); // "attempted to re-ent submitRing function"); - - // Set the highest bit of ringIndex to '1'. - uint64 _ringIndex = ringIndex; - ringIndex |= (1 << 63); - - RingParams memory params = RingParams( + Context memory ctx = Context( + addressList, + uintArgsList, + uint8ArgsList, + buyNoMoreThanAmountBList, vList, rList, sList, miner, feeSelections, + ringIndex, addressList.length, + TokenTransferDelegate(delegateAddress), + new OrderState[](addressList.length), 0x0 // ringHash ); - verifyInputDataIntegrity( - params, - addressList, - uintArgsList, - uint8ArgsList, - buyNoMoreThanAmountBList + // Check if the highest bit of ringIndex is '1'. + require((ringIndex >> 63) == 0, "reentry"); + + // Set the highest bit of ringIndex to '1'. + ringIndex |= (1 << 63); + + verifyInputDataIntegrity(ctx); + + assembleOrders(ctx); + + validateOrdersCutoffs(ctx); + + verifyRingSignatures(ctx); + + verifyTokensRegistered(ctx); + + verifyRingHasNoSubRing(ctx); + + verifyMinerSuppliedFillRates(ctx); + + scaleRingBasedOnHistoricalRecords(ctx); + + calculateRingFillAmount(ctx); + + calculateRingFees(ctx); + + settleRing(ctx); + + ringIndex = ctx.ringIndex + 1; + } + + /// @dev verify input data's basic integrity. + function verifyInputDataIntegrity( + Context ctx + ) + private + pure + { + require(ctx.miner != 0x0, "bad miner"); + require( + ctx.ringSize == ctx.addressList.length, + "wrong addressList size" + ); + require( + ctx.ringSize == ctx.uintArgsList.length, + "wrong uintArgsList size" + ); + require( + ctx.ringSize == ctx.uint8ArgsList.length, + "wrong uint8ArgsList size" + ); + require( + ctx.ringSize == ctx.buyNoMoreThanAmountBList.length, + "wrong buyNoMoreThanAmountBList size" ); + // Validate ring-mining related arguments. + for (uint i = 0; i < ctx.ringSize; i++) { + require(ctx.uintArgsList[i][5] > 0, "rateAmountS is 0"); + } - // Assemble input data into structs so we can pass them to other functions. - // This method also calculates ringHash, therefore it must be called before - // calling `verifyRingSignatures`. - TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); - OrderState[] memory orders = assembleOrders( - params, - delegate, - addressList, - uintArgsList, - uint8ArgsList, - buyNoMoreThanAmountBList + //Check ring size + require( + ctx.ringSize > 1 && ctx.ringSize <= MAX_RING_SIZE, + "invalid ring size" ); - verifyRingSignatures(params, orders); + uint sigSize = ctx.ringSize << 1; + require(sigSize == ctx.vList.length, "invalid vList size"); + require(sigSize == ctx.rList.length, "invalid rList size"); + require(sigSize == ctx.sList.length, "invalid sList size"); + } + + /// @dev Assemble input data into structs so we can pass them to other functions. + /// This method also calculates ringHash, therefore it must be called before + /// calling `verifyRingSignatures`. + function assembleOrders( + Context ctx + ) + private + view + { + for (uint i = 0; i < ctx.ringSize; i++) { + uint[6] memory uintArgs = ctx.uintArgsList[i]; + bool marginSplitAsFee = (ctx.feeSelections & (uint16(1) << i)) > 0; + ctx.orders[i] = OrderState( + ctx.addressList[i][0], + ctx.addressList[i][1], + ctx.addressList[(i + 1) % ctx.ringSize][1], + ctx.addressList[i][2], + ctx.addressList[i][3], + uintArgs[2], + uintArgs[3], + uintArgs[0], + uintArgs[1], + uintArgs[4], + ctx.buyNoMoreThanAmountBList[i], + marginSplitAsFee, + bytes32(0), + ctx.uint8ArgsList[i][0], + uintArgs[5], + uintArgs[1], + 0, // fillAmountS + 0, // lrcReward + 0, // lrcFee + 0, // splitS + 0 // splitB + ); + + validateOrder(ctx.orders[i]); - verifyTokensRegistered(params, orders); + bytes32 orderHash = calculateOrderHash(ctx.orders[i]); + ctx.orders[i].orderHash = orderHash; - handleRing(_ringIndex, params, orders, delegate); + verifySignature( + ctx.orders[i].owner, + orderHash, + ctx.vList[i], + ctx.rList[i], + ctx.sList[i] + ); - ringIndex = _ringIndex + 1; + ctx.ringHash ^= orderHash; + } + + ctx.ringHash = keccak256( + ctx.ringHash, + ctx.miner, + ctx.feeSelections + ); } - /// @dev Validate a ring. - function verifyRingHasNoSubRing( - uint ringSize, - OrderState[] orders + function validateOrdersCutoffs( + Context ctx ) private - pure + view { - // Check the ring has no sub-ring. - for (uint i = 0; i < ringSize - 1; i++) { - address tokenS = orders[i].tokenS; - for (uint j = i + 1; j < ringSize; j++) { - require(tokenS != orders[j].tokenS); // "found sub-ring"); - } + address[] memory owners = new address[](ctx.ringSize); + bytes20[] memory tradingPairs = new bytes20[](ctx.ringSize); + uint[] memory validSinceTimes = new uint[](ctx.ringSize); + + for (uint i = 0; i < ctx.ringSize; i++) { + owners[i] = ctx.orders[i].owner; + tradingPairs[i] = bytes20(ctx.orders[i].tokenS) ^ bytes20(ctx.orders[i].tokenB); + validSinceTimes[i] = ctx.orders[i].validSince; } + + ctx.delegate.checkCutoffsBatch(owners, tradingPairs, validSinceTimes); } /// @dev Verify the ringHash has been signed with each order's auth private /// keys as well as the miner's private key. function verifyRingSignatures( - RingParams params, - OrderState[] orders + Context ctx ) private pure { uint j; - for (uint i = 0; i < params.ringSize; i++) { - j = i + params.ringSize; + for (uint i = 0; i < ctx.ringSize; i++) { + j = i + ctx.ringSize; verifySignature( - orders[i].authAddr, - params.ringHash, - params.vList[j], - params.rList[j], - params.sList[j] + ctx.orders[i].authAddr, + ctx.ringHash, + ctx.vList[j], + ctx.rList[j], + ctx.sList[j] ); } } function verifyTokensRegistered( - RingParams params, - OrderState[] orders + Context ctx ) private view { // Extract the token addresses - address[] memory tokens = new address[](params.ringSize); - for (uint i = 0; i < params.ringSize; i++) { - tokens[i] = orders[i].tokenS; + address[] memory tokens = new address[](ctx.ringSize); + for (uint i = 0; i < ctx.ringSize; i++) { + tokens[i] = ctx.orders[i].tokenS; } // Test all token addresses at once require( - TokenRegistry(tokenRegistryAddress).areAllTokensRegistered(tokens) - ); // "token not registered"); + TokenRegistry(tokenRegistryAddress).areAllTokensRegistered(tokens), + "token not registered" + ); } - function handleRing( - uint64 _ringIndex, - RingParams params, - OrderState[] orders, - TokenTransferDelegate delegate + /// @dev Validate a ring. + function verifyRingHasNoSubRing( + Context ctx ) private + pure { - address _lrcTokenAddress = lrcTokenAddress; - - // Do the hard work. - verifyRingHasNoSubRing(params.ringSize, orders); - - // Exchange rates calculation are performed by ring-miners as solidity - // cannot get power-of-1/n operation, therefore we have to verify - // these rates are correct. - verifyMinerSuppliedFillRates(params.ringSize, orders); - - // Scale down each order independently by substracting amount-filled and - // amount-cancelled. Order owner's current balance and allowance are - // not taken into consideration in these operations. - scaleRingBasedOnHistoricalRecords(delegate, params.ringSize, orders); - - // Based on the already verified exchange rate provided by ring-miners, - // we can furthur scale down orders based on token balance and allowance, - // then find the smallest order of the ring, then calculate each order's - // `fillAmountS`. - calculateRingFillAmount(params.ringSize, orders); - - // Calculate each order's `lrcFee` and `lrcRewrard` and splict how much - // of `fillAmountS` shall be paid to matching order or miner as margin - // split. - - calculateRingFees( - delegate, - params.ringSize, - orders, - params.miner, - _lrcTokenAddress - ); + // Check the ring has no sub-ring. + for (uint i = 0; i < ctx.ringSize - 1; i++) { + address tokenS = ctx.orders[i].tokenS; + for (uint j = i + 1; j < ctx.ringSize; j++) { + require(tokenS != ctx.orders[j].tokenS, "subring found"); + } + } + } - /// Make transfers. - uint[] memory orderInfoList = settleRing( - delegate, - params.ringSize, - orders, - params.miner, - _lrcTokenAddress - ); + /// @dev Exchange rates calculation are performed by ring-miners as solidity + /// cannot get power-of-1/n operation, therefore we have to verify + /// these rates are correct. + function verifyMinerSuppliedFillRates( + Context ctx + ) + private + view + { + uint[] memory rateRatios = new uint[](ctx.ringSize); + uint _rateRatioScale = RATE_RATIO_SCALE; - emit RingMined( - _ringIndex, - params.ringHash, - params.miner, - orderInfoList - ); + for (uint i = 0; i < ctx.ringSize; i++) { + uint s1b0 = ctx.orders[i].rateS.mul(ctx.orders[i].amountB); + uint s0b1 = ctx.orders[i].amountS.mul(ctx.orders[i].rateB); + + require(s1b0 <= s0b1, "invalid discount"); + + rateRatios[i] = _rateRatioScale.mul(s1b0) / s0b1; + } + + uint cvs = MathUint.cvsquare(rateRatios, _rateRatioScale); + + require(cvs <= rateRatioCVSThreshold, "uneven discount"); } - function settleRing( - TokenTransferDelegate delegate, - uint ringSize, - OrderState[] orders, - address miner, - address _lrcTokenAddress + /// @dev Scale down all orders based on historical fill or cancellation + /// stats but key the order's original exchange rate. + function scaleRingBasedOnHistoricalRecords( + Context ctx ) private - returns (uint[] memory orderInfoList) + view { - bytes32[] memory batch = new bytes32[](ringSize * 7); // ringSize * (owner + tokenS + 4 amounts + wallet) - orderInfoList = new uint[](ringSize * 6); - uint p = 0; - uint prevSplitB = orders[ringSize - 1].splitB; + uint ringSize = ctx.ringSize; + OrderState[] memory orders = ctx.orders; + for (uint i = 0; i < ringSize; i++) { OrderState memory state = orders[i]; - uint nextFillAmountS = orders[(i + 1) % ringSize].fillAmountS; + uint amount; - // Store owner and tokenS of every order - batch[p] = bytes32(state.owner); - batch[p + 1] = bytes32(state.tokenS); + if (state.buyNoMoreThanAmountB) { + amount = state.amountB.tolerantSub( + ctx.delegate.cancelledOrFilled(state.orderHash) + ); - // Store all amounts - batch[p + 2] = bytes32(state.fillAmountS - prevSplitB); - batch[p + 3] = bytes32(prevSplitB + state.splitS); - batch[p + 4] = bytes32(state.lrcReward); - batch[p + 5] = bytes32(state.lrcFeeState); - batch[p + 6] = bytes32(state.wallet); - p += 7; + state.amountS = amount.mul(state.amountS) / state.amountB; + state.lrcFee = amount.mul(state.lrcFee) / state.amountB; - // Update fill records - if (state.buyNoMoreThanAmountB) { - delegate.addCancelledOrFilled(state.orderHash, nextFillAmountS); + state.amountB = amount; } else { - delegate.addCancelledOrFilled(state.orderHash, state.fillAmountS); + amount = state.amountS.tolerantSub( + ctx.delegate.cancelledOrFilled(state.orderHash) + ); + + state.amountB = amount.mul(state.amountB) / state.amountS; + state.lrcFee = amount.mul(state.lrcFee) / state.amountS; + + state.amountS = amount; } - orderInfoList[i * 6 + 0] = uint(state.orderHash); - orderInfoList[i * 6 + 1] = state.fillAmountS; - orderInfoList[i * 6 + 2] = state.lrcReward; - orderInfoList[i * 6 + 3] = state.lrcFeeState; - orderInfoList[i * 6 + 4] = state.splitS; - orderInfoList[i * 6 + 5] = state.splitB; + require(state.amountS > 0, "amountS scaled to 0"); + require(state.amountB > 0, "amountB scaled to 0"); - prevSplitB = state.splitB; - } + uint availableAmountS = getSpendable(ctx.delegate, state.tokenS, state.owner); + require(availableAmountS > 0, "spendable is 0"); - // Do all transactions - delegate.batchTransferToken( - _lrcTokenAddress, - miner, - walletSplitPercentage, - batch - ); + state.fillAmountS = ( + state.amountS < availableAmountS ? + state.amountS : availableAmountS + ); + } } - /// @dev Verify miner has calculte the rates correctly. - function verifyMinerSuppliedFillRates( - uint ringSize, - OrderState[] orders + /// @dev Based on the already verified exchange rate provided by ring-miners, + /// we can furthur scale down orders based on token balance and allowance, + /// then find the smallest order of the ring, then calculate each order's + /// `fillAmountS`. + function calculateRingFillAmount( + Context ctx ) private - view + pure { - uint[] memory rateRatios = new uint[](ringSize); - uint _rateRatioScale = RATE_RATIO_SCALE; - - for (uint i = 0; i < ringSize; i++) { - uint s1b0 = orders[i].rateS.mul(orders[i].amountB); - uint s0b1 = orders[i].amountS.mul(orders[i].rateB); - - require(s1b0 <= s0b1); // "miner supplied exchange rate provides invalid discount"); + uint smallestIdx = 0; - rateRatios[i] = _rateRatioScale.mul(s1b0) / s0b1; + for (uint i = 0; i < ctx.ringSize; i++) { + uint j = (i + 1) % ctx.ringSize; + smallestIdx = calculateOrderFillAmount( + ctx.orders[i], + ctx.orders[j], + i, + j, + smallestIdx + ); } - uint cvs = MathUint.cvsquare(rateRatios, _rateRatioScale); - - require(cvs <= rateRatioCVSThreshold); - // "miner supplied exchange rate is not evenly discounted"); + for (uint i = 0; i < smallestIdx; i++) { + calculateOrderFillAmount( + ctx.orders[i], + ctx.orders[(i + 1) % ctx.ringSize], + 0, // Not needed + 0, // Not needed + 0 // Not needed + ); + } } - /// @dev Calculate each order's fee or LRC reward. + /// @dev Calculate each order's `lrcFee` and `lrcRewrard` and splict how much + /// of `fillAmountS` shall be paid to matching order or miner as margin + /// split. function calculateRingFees( - TokenTransferDelegate delegate, - uint ringSize, - OrderState[] orders, - address miner, - address _lrcTokenAddress + Context ctx ) private view { + uint ringSize = ctx.ringSize; bool checkedMinerLrcSpendable = false; uint minerLrcSpendable = 0; uint8 _marginSplitPercentageBase = MARGIN_SPLIT_PERCENTAGE_BASE; uint nextFillAmountS; for (uint i = 0; i < ringSize; i++) { - OrderState memory state = orders[i]; + OrderState memory state = ctx.orders[i]; uint lrcReceiable = 0; if (state.lrcFeeState == 0) { @@ -526,20 +626,20 @@ contract LoopringProtocolImpl is LoopringProtocol { state.marginSplitPercentage = _marginSplitPercentageBase; } else { uint lrcSpendable = getSpendable( - delegate, - _lrcTokenAddress, + ctx.delegate, + lrcTokenAddress, state.owner ); // If the order is selling LRC, we need to calculate how much LRC // is left that can be used as fee. - if (state.tokenS == _lrcTokenAddress) { + if (state.tokenS == lrcTokenAddress) { lrcSpendable -= state.fillAmountS; } // If the order is buyign LRC, it will has more to pay as fee. - if (state.tokenB == _lrcTokenAddress) { - nextFillAmountS = orders[(i + 1) % ringSize].fillAmountS; + if (state.tokenB == lrcTokenAddress) { + nextFillAmountS = ctx.orders[(i + 1) % ringSize].fillAmountS; lrcReceiable = nextFillAmountS; } @@ -571,13 +671,13 @@ contract LoopringProtocolImpl is LoopringProtocol { // Only check the available miner balance when absolutely needed if (!checkedMinerLrcSpendable && minerLrcSpendable < state.lrcFeeState) { checkedMinerLrcSpendable = true; - minerLrcSpendable = getSpendable(delegate, _lrcTokenAddress, miner); + minerLrcSpendable = getSpendable(ctx.delegate, lrcTokenAddress, ctx.miner); } // Only calculate split when miner has enough LRC; // otherwise all splits are 0. if (minerLrcSpendable >= state.lrcFeeState) { - nextFillAmountS = orders[(i + 1) % ringSize].fillAmountS; + nextFillAmountS = ctx.orders[(i + 1) % ringSize].fillAmountS; uint split; if (state.buyNoMoreThanAmountB) { split = (nextFillAmountS.mul( @@ -619,38 +719,63 @@ contract LoopringProtocolImpl is LoopringProtocol { } } - /// @dev Calculate each order's fill amount. - function calculateRingFillAmount( - uint ringSize, - OrderState[] orders + function settleRing( + Context ctx ) private - pure { - uint smallestIdx = 0; - uint i; - uint j; + bytes32[] memory batch = new bytes32[](ctx.ringSize * 7); // ringSize * (owner + tokenS + 4 amounts + wallet) + uint[] memory orderInfoList = new uint[](ctx.ringSize * 6); - for (i = 0; i < ringSize; i++) { - j = (i + 1) % ringSize; - smallestIdx = calculateOrderFillAmount( - orders[i], - orders[j], - i, - j, - smallestIdx - ); - } + uint p = 0; + uint prevSplitB = ctx.orders[ctx.ringSize - 1].splitB; + for (uint i = 0; i < ctx.ringSize; i++) { + OrderState memory state = ctx.orders[i]; + uint nextFillAmountS = ctx.orders[(i + 1) % ctx.ringSize].fillAmountS; - for (i = 0; i < smallestIdx; i++) { - calculateOrderFillAmount( - orders[i], - orders[(i + 1) % ringSize], - 0, // Not needed - 0, // Not needed - 0 // Not needed - ); + // Store owner and tokenS of every order + batch[p] = bytes32(state.owner); + batch[p + 1] = bytes32(state.tokenS); + + // Store all amounts + batch[p + 2] = bytes32(state.fillAmountS - prevSplitB); + batch[p + 3] = bytes32(prevSplitB + state.splitS); + batch[p + 4] = bytes32(state.lrcReward); + batch[p + 5] = bytes32(state.lrcFeeState); + batch[p + 6] = bytes32(state.wallet); + p += 7; + + // Update fill records + if (state.buyNoMoreThanAmountB) { + ctx.delegate.addCancelledOrFilled(state.orderHash, nextFillAmountS); + } else { + ctx.delegate.addCancelledOrFilled(state.orderHash, state.fillAmountS); + } + + orderInfoList[i * 6 + 0] = uint(state.orderHash); + orderInfoList[i * 6 + 1] = state.fillAmountS; + orderInfoList[i * 6 + 2] = state.lrcReward; + orderInfoList[i * 6 + 3] = state.lrcFeeState; + orderInfoList[i * 6 + 4] = state.splitS; + orderInfoList[i * 6 + 5] = state.splitB; + + prevSplitB = state.splitB; } + + // Do all transactions + ctx.delegate.batchTransferToken( + lrcTokenAddress, + ctx.miner, + walletSplitPercentage, + batch + ); + + emit RingMined( + ctx.ringIndex, + ctx.ringHash, + ctx.miner, + orderInfoList + ); } /// @return The smallest order's index. @@ -698,53 +823,6 @@ contract LoopringProtocolImpl is LoopringProtocol { } } - /// @dev Scale down all orders based on historical fill or cancellation - /// stats but key the order's original exchange rate. - function scaleRingBasedOnHistoricalRecords( - TokenTransferDelegate delegate, - uint ringSize, - OrderState[] orders - ) - private - view - { - for (uint i = 0; i < ringSize; i++) { - OrderState memory state = orders[i]; - uint amount; - - if (state.buyNoMoreThanAmountB) { - amount = state.amountB.tolerantSub( - delegate.cancelledOrFilled(state.orderHash) - ); - - state.amountS = amount.mul(state.amountS) / state.amountB; - state.lrcFee = amount.mul(state.lrcFee) / state.amountB; - - state.amountB = amount; - } else { - amount = state.amountS.tolerantSub( - delegate.cancelledOrFilled(state.orderHash) - ); - - state.amountB = amount.mul(state.amountB) / state.amountS; - state.lrcFee = amount.mul(state.lrcFee) / state.amountS; - - state.amountS = amount; - } - - require(state.amountS > 0); // "amountS is zero"); - require(state.amountB > 0); // "amountB is zero"); - - uint availableAmountS = getSpendable(delegate, state.tokenS, state.owner); - require(availableAmountS > 0); // "order spendable amountS is zero"); - - state.fillAmountS = ( - state.amountS < availableAmountS ? - state.amountS : availableAmountS - ); - } - } - /// @return Amount of ERC20 token that can be spent by this contract. function getSpendable( TokenTransferDelegate delegate, @@ -764,105 +842,6 @@ contract LoopringProtocolImpl is LoopringProtocol { return (allowance < balance ? allowance : balance); } - /// @dev verify input data's basic integrity. - function verifyInputDataIntegrity( - RingParams params, - address[4][] addressList, - uint[6][] uintArgsList, - uint8[1][] uint8ArgsList, - bool[] buyNoMoreThanAmountBList - ) - private - pure - { - require(params.miner != 0x0); - require(params.ringSize == addressList.length); - require(params.ringSize == uintArgsList.length); - require(params.ringSize == uint8ArgsList.length); - require(params.ringSize == buyNoMoreThanAmountBList.length); - - // Validate ring-mining related arguments. - for (uint i = 0; i < params.ringSize; i++) { - require(uintArgsList[i][5] > 0); // "order rateAmountS is zero"); - } - - //Check ring size - require(params.ringSize > 1 && params.ringSize <= MAX_RING_SIZE); // "invalid ring size"); - - uint sigSize = params.ringSize << 1; - require(sigSize == params.vList.length); - require(sigSize == params.rList.length); - require(sigSize == params.sList.length); - } - - /// @dev assmble order parameters into Order struct. - /// @return A list of orders. - function assembleOrders( - RingParams params, - TokenTransferDelegate delegate, - address[4][] addressList, - uint[6][] uintArgsList, - uint8[1][] uint8ArgsList, - bool[] buyNoMoreThanAmountBList - ) - private - view - returns (OrderState[] memory orders) - { - orders = new OrderState[](params.ringSize); - - for (uint i = 0; i < params.ringSize; i++) { - uint[6] memory uintArgs = uintArgsList[i]; - bool marginSplitAsFee = (params.feeSelections & (uint16(1) << i)) > 0; - orders[i] = OrderState( - addressList[i][0], - addressList[i][1], - addressList[(i + 1) % params.ringSize][1], - addressList[i][2], - addressList[i][3], - uintArgs[2], - uintArgs[3], - uintArgs[0], - uintArgs[1], - uintArgs[4], - buyNoMoreThanAmountBList[i], - marginSplitAsFee, - bytes32(0), - uint8ArgsList[i][0], - uintArgs[5], - uintArgs[1], - 0, // fillAmountS - 0, // lrcReward - 0, // lrcFee - 0, // splitS - 0 // splitB - ); - - validateOrder(orders[i]); - - bytes32 orderHash = calculateOrderHash(orders[i]); - orders[i].orderHash = orderHash; - - verifySignature( - orders[i].owner, - orderHash, - params.vList[i], - params.rList[i], - params.sList[i] - ); - - params.ringHash ^= orderHash; - } - - validateOrdersCutoffs(orders, delegate); - - params.ringHash = keccak256( - params.ringHash, - params.miner, - params.feeSelections - ); - } - /// @dev validate order's parameters are OK. function validateOrder( OrderState order @@ -870,33 +849,18 @@ contract LoopringProtocolImpl is LoopringProtocol { private view { - require(order.owner != 0x0); // invalid order owner - require(order.tokenS != 0x0); // invalid order tokenS - require(order.tokenB != 0x0); // invalid order tokenB - require(order.amountS != 0); // invalid order amountS - require(order.amountB != 0); // invalid order amountB - require(order.marginSplitPercentage <= MARGIN_SPLIT_PERCENTAGE_BASE); - // invalid order marginSplitPercentage - - require(order.validSince <= block.timestamp); // order is too early to match - require(order.validUntil > block.timestamp); // order is expired - } - - function validateOrdersCutoffs(OrderState[] orders, TokenTransferDelegate delegate) - private - view - { - address[] memory owners = new address[](orders.length); - bytes20[] memory tradingPairs = new bytes20[](orders.length); - uint[] memory validSinceTimes = new uint[](orders.length); - - for (uint i = 0; i < orders.length; i++) { - owners[i] = orders[i].owner; - tradingPairs[i] = bytes20(orders[i].tokenS) ^ bytes20(orders[i].tokenB); - validSinceTimes[i] = orders[i].validSince; - } + require(order.owner != 0x0, "invalid owner"); + require(order.tokenS != 0x0, "invalid tokenS"); + require(order.tokenB != 0x0, "nvalid tokenB"); + require(order.amountS != 0, "invalid amountS"); + require(order.amountB != 0, "invalid amountB"); + require( + order.marginSplitPercentage <= MARGIN_SPLIT_PERCENTAGE_BASE, + "invalid marginSplitPercentage" + ); - delegate.checkCutoffsBatch(owners, tradingPairs, validSinceTimes); + require(order.validSince <= block.timestamp, "immature"); + require(order.validUntil > block.timestamp, "expired"); } /// @dev Get the Keccak-256 hash of order with specified parameters. @@ -941,8 +905,9 @@ contract LoopringProtocolImpl is LoopringProtocol { v, r, s - ) - ); // "invalid signature"); + ), + "bad signature" + ); } function getTradingPairCutoffs( From 8b0a7f56d7daa2244b54911f3ceef00172f95871 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 21 Apr 2018 02:12:51 -0400 Subject: [PATCH 05/68] Set margin split to 50% (#315) --- contracts/LoopringProtocol.sol | 39 ++-- contracts/LoopringProtocolImpl.sol | 286 ++++++++++++++--------------- 2 files changed, 150 insertions(+), 175 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index 9949040d..675020d5 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -25,6 +25,8 @@ pragma experimental "ABIEncoderV2"; contract LoopringProtocol { uint8 public constant MARGIN_SPLIT_PERCENTAGE_BASE = 100; + uint8 public constant OPTION_MASK_CAP_BY_AMOUNTB = 0x01; + event RingMined( uint _ringIndex, bytes32 indexed _ringHash, @@ -50,23 +52,19 @@ contract LoopringProtocol { ); /// @dev Cancel a order. cancel amount(amountS or amountB) can be specified - /// in orderValues. + /// in values. /// @param addresses owner, tokenS, tokenB, wallet, authAddr - /// @param orderValues amountS, amountB, validSince (second), + /// @param values amountS, amountB, validSince (second), /// validUntil (second), lrcFee, and cancelAmount. - /// @param buyNoMoreThanAmountB - - /// This indicates when a order should be considered + /// @param option This indicates when a order should be considered /// as 'completely filled'. - /// @param marginSplitPercentage - - /// Percentage of margin split to share with miner. /// @param v Order ECDSA signature parameter v. /// @param r Order ECDSA signature parameters r. /// @param s Order ECDSA signature parameters s. function cancelOrder( address[5] addresses, - uint[6] orderValues, - bool buyNoMoreThanAmountB, - uint8 marginSplitPercentage, + uint[6] values, + uint8 option, uint8 v, bytes32 r, bytes32 s @@ -96,17 +94,13 @@ contract LoopringProtocol { external; /// @dev Submit a order-ring for validation and settlement. - /// @param addressList List of each order's owner, tokenS, wallet, authAddr. - /// Note that next order's `tokenS` equals this order's - /// `tokenB`. - /// @param uintArgsList List of uint-type arguments in this order: + /// @param addressesList List of each order's owner, tokenS, wallet, authAddr. + /// Note that next order's `tokenS` equals this order's + /// `tokenB`. + /// @param valuesList List of uint-type arguments in this order: /// amountS, amountB, validSince (second), /// validUntil (second), lrcFee, and rateAmountS. - /// @param uint8ArgsList - - /// List of unit8-type arguments, in this order: - /// marginSplitPercentageList. - /// @param buyNoMoreThanAmountBList - - /// This indicates when a order should be considered + /// @param optionList This indicates when a order should be considered /// @param vList List of v for each order. This list is 1-larger than /// the previous lists, with the last element being the /// v value of the ring signature. @@ -121,15 +115,14 @@ contract LoopringProtocol { /// Bits to indicate fee selections. `1` represents margin /// split and `0` represents LRC as fee. function submitRing( - address[4][] addressList, - uint[6][] uintArgsList, - uint8[1][] uint8ArgsList, - bool[] buyNoMoreThanAmountBList, + address[4][] addressesList, + uint[6][] valuesList, + bool[] optionList, uint8[] vList, bytes32[] rList, bytes32[] sList, address miner, - uint16 feeSelections + uint8 feeSelections ) public; } diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 4f746527..9b780535 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -58,7 +58,7 @@ contract LoopringProtocolImpl is LoopringProtocol { // `(0.025 * RATE_RATIO_SCALE)^2` or 62500. uint public rateRatioCVSThreshold = 0; - uint public constant MAX_RING_SIZE = 16; + uint public constant MAX_RING_SIZE = 8; uint public constant RATE_RATIO_SCALE = 10000; @@ -75,7 +75,7 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @param lrcFeeState The amount of LR paid by order owner to miner. /// @param splitS TokenS paid to miner. /// @param splitB TokenB paid to miner. - struct OrderState { + struct Order { address owner; address tokenS; address tokenB; @@ -86,10 +86,10 @@ contract LoopringProtocolImpl is LoopringProtocol { uint amountS; uint amountB; uint lrcFee; - bool buyNoMoreThanAmountB; + uint8 option; + bool capByAmountB; bool marginSplitAsFee; bytes32 orderHash; - uint8 marginSplitPercentage; uint rateS; uint rateB; uint fillAmountS; @@ -102,19 +102,18 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @dev A struct to capture parameters passed to submitRing method and /// various of other variables used across the submitRing core logics. struct Context { - address[4][] addressList; - uint[6][] uintArgsList; - uint8[1][] uint8ArgsList; - bool[] buyNoMoreThanAmountBList; + address[4][] addressesList; + uint[6][] valuesList; + uint8[] optionList; uint8[] vList; bytes32[] rList; bytes32[] sList; address miner; - uint16 feeSelections; + uint8 feeSelections; uint64 ringIndex; uint ringSize; // computed TokenTransferDelegate delegate; - OrderState[] orders; + Order[] orders; bytes32 ringHash; // computed } @@ -152,8 +151,7 @@ contract LoopringProtocolImpl is LoopringProtocol { function cancelOrder( address[5] addresses, uint[6] orderValues, - bool buyNoMoreThanAmountB, - uint8 marginSplitPercentage, + uint8 option, uint8 v, bytes32 r, bytes32 s @@ -164,7 +162,7 @@ contract LoopringProtocolImpl is LoopringProtocol { require(cancelAmount > 0, "invalid cancelAmount"); - OrderState memory order = OrderState( + Order memory order = Order( addresses[0], addresses[1], addresses[2], @@ -175,10 +173,10 @@ contract LoopringProtocolImpl is LoopringProtocol { orderValues[0], orderValues[1], orderValues[4], - buyNoMoreThanAmountB, + option, + option & OPTION_MASK_CAP_BY_AMOUNTB > 0 ? true : false, false, 0x0, - marginSplitPercentage, 0, 0, 0, @@ -254,32 +252,30 @@ contract LoopringProtocolImpl is LoopringProtocol { } function submitRing( - address[4][] addressList, - uint[6][] uintArgsList, - uint8[1][] uint8ArgsList, - bool[] buyNoMoreThanAmountBList, + address[4][] addressesList, + uint[6][] valuesList, + uint8[] optionList, uint8[] vList, bytes32[] rList, bytes32[] sList, address miner, - uint16 feeSelections + uint8 feeSelections ) public { Context memory ctx = Context( - addressList, - uintArgsList, - uint8ArgsList, - buyNoMoreThanAmountBList, + addressesList, + valuesList, + optionList, vList, rList, sList, miner, feeSelections, ringIndex, - addressList.length, + addressesList.length, TokenTransferDelegate(delegateAddress), - new OrderState[](addressList.length), + new Order[](addressesList.length), 0x0 // ringHash ); @@ -322,26 +318,25 @@ contract LoopringProtocolImpl is LoopringProtocol { pure { require(ctx.miner != 0x0, "bad miner"); + require( - ctx.ringSize == ctx.addressList.length, - "wrong addressList size" - ); - require( - ctx.ringSize == ctx.uintArgsList.length, - "wrong uintArgsList size" + ctx.ringSize == ctx.addressesList.length, + "wrong addressesList size" ); + require( - ctx.ringSize == ctx.uint8ArgsList.length, - "wrong uint8ArgsList size" + ctx.ringSize == ctx.valuesList.length, + "wrong valuesList size" ); + require( - ctx.ringSize == ctx.buyNoMoreThanAmountBList.length, - "wrong buyNoMoreThanAmountBList size" + ctx.ringSize == ctx.optionList.length, + "wrong optionList size" ); // Validate ring-mining related arguments. for (uint i = 0; i < ctx.ringSize; i++) { - require(ctx.uintArgsList[i][5] > 0, "rateAmountS is 0"); + require(ctx.valuesList[i][5] > 0, "rateAmountS is 0"); } //Check ring size @@ -366,23 +361,25 @@ contract LoopringProtocolImpl is LoopringProtocol { view { for (uint i = 0; i < ctx.ringSize; i++) { - uint[6] memory uintArgs = ctx.uintArgsList[i]; - bool marginSplitAsFee = (ctx.feeSelections & (uint16(1) << i)) > 0; - ctx.orders[i] = OrderState( - ctx.addressList[i][0], - ctx.addressList[i][1], - ctx.addressList[(i + 1) % ctx.ringSize][1], - ctx.addressList[i][2], - ctx.addressList[i][3], + + uint[6] memory uintArgs = ctx.valuesList[i]; + bool marginSplitAsFee = (ctx.feeSelections & (uint8(1) << i)) > 0; + + ctx.orders[i] = Order( + ctx.addressesList[i][0], + ctx.addressesList[i][1], + ctx.addressesList[(i + 1) % ctx.ringSize][1], + ctx.addressesList[i][2], + ctx.addressesList[i][3], uintArgs[2], uintArgs[3], uintArgs[0], uintArgs[1], uintArgs[4], - ctx.buyNoMoreThanAmountBList[i], + ctx.optionList[i], + ctx.optionList[i] & OPTION_MASK_CAP_BY_AMOUNTB > 0 ? true : false, marginSplitAsFee, bytes32(0), - ctx.uint8ArgsList[i][0], uintArgs[5], uintArgs[1], 0, // fillAmountS @@ -527,41 +524,41 @@ contract LoopringProtocolImpl is LoopringProtocol { { uint ringSize = ctx.ringSize; - OrderState[] memory orders = ctx.orders; + Order[] memory orders = ctx.orders; for (uint i = 0; i < ringSize; i++) { - OrderState memory state = orders[i]; + Order memory order = orders[i]; uint amount; - if (state.buyNoMoreThanAmountB) { - amount = state.amountB.tolerantSub( - ctx.delegate.cancelledOrFilled(state.orderHash) + if (order.capByAmountB) { + amount = order.amountB.tolerantSub( + ctx.delegate.cancelledOrFilled(order.orderHash) ); - state.amountS = amount.mul(state.amountS) / state.amountB; - state.lrcFee = amount.mul(state.lrcFee) / state.amountB; + order.amountS = amount.mul(order.amountS) / order.amountB; + order.lrcFee = amount.mul(order.lrcFee) / order.amountB; - state.amountB = amount; + order.amountB = amount; } else { - amount = state.amountS.tolerantSub( - ctx.delegate.cancelledOrFilled(state.orderHash) + amount = order.amountS.tolerantSub( + ctx.delegate.cancelledOrFilled(order.orderHash) ); - state.amountB = amount.mul(state.amountB) / state.amountS; - state.lrcFee = amount.mul(state.lrcFee) / state.amountS; + order.amountB = amount.mul(order.amountB) / order.amountS; + order.lrcFee = amount.mul(order.lrcFee) / order.amountS; - state.amountS = amount; + order.amountS = amount; } - require(state.amountS > 0, "amountS scaled to 0"); - require(state.amountB > 0, "amountB scaled to 0"); + require(order.amountS > 0, "amountS scaled to 0"); + require(order.amountB > 0, "amountB scaled to 0"); - uint availableAmountS = getSpendable(ctx.delegate, state.tokenS, state.owner); + uint availableAmountS = getSpendable(ctx.delegate, order.tokenS, order.owner); require(availableAmountS > 0, "spendable is 0"); - state.fillAmountS = ( - state.amountS < availableAmountS ? - state.amountS : availableAmountS + order.fillAmountS = ( + order.amountS < availableAmountS ? + order.amountS : availableAmountS ); } } @@ -612,33 +609,31 @@ contract LoopringProtocolImpl is LoopringProtocol { uint ringSize = ctx.ringSize; bool checkedMinerLrcSpendable = false; uint minerLrcSpendable = 0; - uint8 _marginSplitPercentageBase = MARGIN_SPLIT_PERCENTAGE_BASE; uint nextFillAmountS; for (uint i = 0; i < ringSize; i++) { - OrderState memory state = ctx.orders[i]; + Order memory order = ctx.orders[i]; uint lrcReceiable = 0; - if (state.lrcFeeState == 0) { + if (order.lrcFeeState == 0) { // When an order's LRC fee is 0 or smaller than the specified fee, // we help miner automatically select margin-split. - state.marginSplitAsFee = true; - state.marginSplitPercentage = _marginSplitPercentageBase; + order.marginSplitAsFee = true; } else { uint lrcSpendable = getSpendable( ctx.delegate, lrcTokenAddress, - state.owner + order.owner ); // If the order is selling LRC, we need to calculate how much LRC // is left that can be used as fee. - if (state.tokenS == lrcTokenAddress) { - lrcSpendable -= state.fillAmountS; + if (order.tokenS == lrcTokenAddress) { + lrcSpendable -= order.fillAmountS; } // If the order is buyign LRC, it will has more to pay as fee. - if (state.tokenB == lrcTokenAddress) { + if (order.tokenB == lrcTokenAddress) { nextFillAmountS = ctx.orders[(i + 1) % ringSize].fillAmountS; lrcReceiable = nextFillAmountS; } @@ -646,75 +641,68 @@ contract LoopringProtocolImpl is LoopringProtocol { uint lrcTotal = lrcSpendable + lrcReceiable; // If order doesn't have enough LRC, set margin split to 100%. - if (lrcTotal < state.lrcFeeState) { - state.lrcFeeState = lrcTotal; - state.marginSplitPercentage = _marginSplitPercentageBase; + if (lrcTotal < order.lrcFeeState) { + order.lrcFeeState = lrcTotal; } - if (state.lrcFeeState == 0) { - state.marginSplitAsFee = true; + if (order.lrcFeeState == 0) { + order.marginSplitAsFee = true; } } - if (!state.marginSplitAsFee) { + if (!order.marginSplitAsFee) { if (lrcReceiable > 0) { - if (lrcReceiable >= state.lrcFeeState) { - state.splitB = state.lrcFeeState; - state.lrcFeeState = 0; + if (lrcReceiable >= order.lrcFeeState) { + order.splitB = order.lrcFeeState; + order.lrcFeeState = 0; } else { - state.splitB = lrcReceiable; - state.lrcFeeState -= lrcReceiable; + order.splitB = lrcReceiable; + order.lrcFeeState -= lrcReceiable; } } } else { // Only check the available miner balance when absolutely needed - if (!checkedMinerLrcSpendable && minerLrcSpendable < state.lrcFeeState) { + if (!checkedMinerLrcSpendable && minerLrcSpendable < order.lrcFeeState) { checkedMinerLrcSpendable = true; minerLrcSpendable = getSpendable(ctx.delegate, lrcTokenAddress, ctx.miner); } // Only calculate split when miner has enough LRC; // otherwise all splits are 0. - if (minerLrcSpendable >= state.lrcFeeState) { + if (minerLrcSpendable >= order.lrcFeeState) { nextFillAmountS = ctx.orders[(i + 1) % ringSize].fillAmountS; uint split; - if (state.buyNoMoreThanAmountB) { + if (order.capByAmountB) { split = (nextFillAmountS.mul( - state.amountS - ) / state.amountB).sub( - state.fillAmountS - ); + order.amountS + ) / order.amountB).sub( + order.fillAmountS + ) / 2; } else { split = nextFillAmountS.sub( - state.fillAmountS.mul( - state.amountB - ) / state.amountS - ); - } - - if (state.marginSplitPercentage != _marginSplitPercentageBase) { - split = split.mul( - state.marginSplitPercentage - ) / _marginSplitPercentageBase; + order.fillAmountS.mul( + order.amountB + ) / order.amountS + ) / 2; } - if (state.buyNoMoreThanAmountB) { - state.splitS = split; + if (order.capByAmountB) { + order.splitS = split; } else { - state.splitB = split; + order.splitB = split; } // This implicits order with smaller index in the ring will // be paid LRC reward first, so the orders in the ring does // mater. if (split > 0) { - minerLrcSpendable -= state.lrcFeeState; - state.lrcReward = state.lrcFeeState; + minerLrcSpendable -= order.lrcFeeState; + order.lrcReward = order.lrcFeeState; } } - state.lrcFeeState = 0; + order.lrcFeeState = 0; } } } @@ -730,36 +718,36 @@ contract LoopringProtocolImpl is LoopringProtocol { uint p = 0; uint prevSplitB = ctx.orders[ctx.ringSize - 1].splitB; for (uint i = 0; i < ctx.ringSize; i++) { - OrderState memory state = ctx.orders[i]; + Order memory order = ctx.orders[i]; uint nextFillAmountS = ctx.orders[(i + 1) % ctx.ringSize].fillAmountS; // Store owner and tokenS of every order - batch[p] = bytes32(state.owner); - batch[p + 1] = bytes32(state.tokenS); + batch[p] = bytes32(order.owner); + batch[p + 1] = bytes32(order.tokenS); // Store all amounts - batch[p + 2] = bytes32(state.fillAmountS - prevSplitB); - batch[p + 3] = bytes32(prevSplitB + state.splitS); - batch[p + 4] = bytes32(state.lrcReward); - batch[p + 5] = bytes32(state.lrcFeeState); - batch[p + 6] = bytes32(state.wallet); + batch[p + 2] = bytes32(order.fillAmountS - prevSplitB); + batch[p + 3] = bytes32(prevSplitB + order.splitS); + batch[p + 4] = bytes32(order.lrcReward); + batch[p + 5] = bytes32(order.lrcFeeState); + batch[p + 6] = bytes32(order.wallet); p += 7; // Update fill records - if (state.buyNoMoreThanAmountB) { - ctx.delegate.addCancelledOrFilled(state.orderHash, nextFillAmountS); + if (order.capByAmountB) { + ctx.delegate.addCancelledOrFilled(order.orderHash, nextFillAmountS); } else { - ctx.delegate.addCancelledOrFilled(state.orderHash, state.fillAmountS); + ctx.delegate.addCancelledOrFilled(order.orderHash, order.fillAmountS); } - orderInfoList[i * 6 + 0] = uint(state.orderHash); - orderInfoList[i * 6 + 1] = state.fillAmountS; - orderInfoList[i * 6 + 2] = state.lrcReward; - orderInfoList[i * 6 + 3] = state.lrcFeeState; - orderInfoList[i * 6 + 4] = state.splitS; - orderInfoList[i * 6 + 5] = state.splitB; + orderInfoList[i * 6 + 0] = uint(order.orderHash); + orderInfoList[i * 6 + 1] = order.fillAmountS; + orderInfoList[i * 6 + 2] = order.lrcReward; + orderInfoList[i * 6 + 3] = order.lrcFeeState; + orderInfoList[i * 6 + 4] = order.splitS; + orderInfoList[i * 6 + 5] = order.splitB; - prevSplitB = state.splitB; + prevSplitB = order.splitB; } // Do all transactions @@ -780,8 +768,8 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @return The smallest order's index. function calculateOrderFillAmount( - OrderState state, - OrderState next, + Order order, + Order next, uint i, uint j, uint smallestIdx @@ -793,27 +781,27 @@ contract LoopringProtocolImpl is LoopringProtocol { // Default to the same smallest index newSmallestIdx = smallestIdx; - uint fillAmountB = state.fillAmountS.mul( - state.rateB - ) / state.rateS; + uint fillAmountB = order.fillAmountS.mul( + order.rateB + ) / order.rateS; - if (state.buyNoMoreThanAmountB) { - if (fillAmountB > state.amountB) { - fillAmountB = state.amountB; + if (order.capByAmountB) { + if (fillAmountB > order.amountB) { + fillAmountB = order.amountB; - state.fillAmountS = fillAmountB.mul( - state.rateS - ) / state.rateB; + order.fillAmountS = fillAmountB.mul( + order.rateS + ) / order.rateB; newSmallestIdx = i; } - state.lrcFeeState = state.lrcFee.mul( + order.lrcFeeState = order.lrcFee.mul( fillAmountB - ) / state.amountB; + ) / order.amountB; } else { - state.lrcFeeState = state.lrcFee.mul( - state.fillAmountS - ) / state.amountS; + order.lrcFeeState = order.lrcFee.mul( + order.fillAmountS + ) / order.amountS; } if (fillAmountB <= next.fillAmountS) { @@ -844,7 +832,7 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @dev validate order's parameters are OK. function validateOrder( - OrderState order + Order order ) private view @@ -854,18 +842,13 @@ contract LoopringProtocolImpl is LoopringProtocol { require(order.tokenB != 0x0, "nvalid tokenB"); require(order.amountS != 0, "invalid amountS"); require(order.amountB != 0, "invalid amountB"); - require( - order.marginSplitPercentage <= MARGIN_SPLIT_PERCENTAGE_BASE, - "invalid marginSplitPercentage" - ); - require(order.validSince <= block.timestamp, "immature"); require(order.validUntil > block.timestamp, "expired"); } /// @dev Get the Keccak-256 hash of order with specified parameters. function calculateOrderHash( - OrderState order + Order order ) private view @@ -883,8 +866,7 @@ contract LoopringProtocolImpl is LoopringProtocol { order.validSince, order.validUntil, order.lrcFee, - order.buyNoMoreThanAmountB, - order.marginSplitPercentage + order.option ); } From 3c28eb42dd040b51ac9d6bd50eb7ba129b94591f Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 21 Apr 2018 13:12:42 -0400 Subject: [PATCH 06/68] V1.6 broker (#317) --- contracts/BrokerRegistry.sol | 72 ++++++++++++++ contracts/BrokerRegistryImpl.sol | 147 +++++++++++++++++++++++++++++ contracts/BrokerTracker.sol | 54 +++++++++++ contracts/LoopringProtocolImpl.sol | 2 + contracts/TokenRegistryImpl.sol | 13 ++- 5 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 contracts/BrokerRegistry.sol create mode 100644 contracts/BrokerRegistryImpl.sol create mode 100644 contracts/BrokerTracker.sol diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol new file mode 100644 index 00000000..3daf3e96 --- /dev/null +++ b/contracts/BrokerRegistry.sol @@ -0,0 +1,72 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title Trade Broker +/// @dev A broker is an account that can submit order on behalf of other +/// accounts. When register a broker, the owner can also specify a +/// pre-deployed BrokageTracker to manage the allowance of for the +/// specific broker. +/// @author Daniel Wang - . +contract BrokerRegistry { + event BrokerRegistered( + address owner, + address broker, + address tracker + ); + + event BrokerUnregistered( + address owner, + address broker + ); + + function getBroker( + address owner, + address broker + ) + external + view + returns( + bool authenticated, + address tracker + ); + + function getBrokers( + uint start, + uint count + ) + public + view + returns ( + address[] brokers, + address[] trackers + ); + + function registerBroker( + address broker, + address tracker // 0x0 allowed + ) + external; + + function unregisterBroker( + address broker + ) + external; +} diff --git a/contracts/BrokerRegistryImpl.sol b/contracts/BrokerRegistryImpl.sol new file mode 100644 index 00000000..e8ac9b0d --- /dev/null +++ b/contracts/BrokerRegistryImpl.sol @@ -0,0 +1,147 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "./BrokerRegistry.sol"; + + +/// @title An Implementation of BrokerRegistry. +/// @author Daniel Wang - . +contract BrokerRegistryImpl is BrokerRegistry { + struct Broker { + uint pos; // 0 mens unregistered; if > 0, pos - 1 is the + // token's position in `addresses`. + address owner; + address addr; + address tracker; + } + + mapping(address => Broker[]) public brokerageMap; + mapping(address => mapping(address => Broker)) public brokerMap; + + function getBroker( + address owner, + address broker + ) + external + view + returns( + bool authenticated, + address tracker + ) + { + Broker storage b = brokerMap[owner][broker]; + authenticated = (b.addr != 0x0); + tracker = b.tracker; + } + + function getBrokers( + uint start, + uint count + ) + public + view + returns ( + address[] brokers, + address[] trackers + ) + { + Broker[] storage _brokers = brokerageMap[msg.sender]; + uint num = _brokers.length; + + if (start >= num) { + return; + } + + uint end = start + count; + if (end > num) { + end = num; + } + + if (start == num) { + return; + } + + brokers = new address[](end - start); + trackers = new address[](end - start); + for (uint i = start; i < end; i++) { + brokers[i - start] = _brokers[i].addr; + trackers[i - start] = _brokers[i].tracker; + } + } + + function registerBroker( + address broker, + address tracker // 0x0 allowed + ) + external + { + require(0x0 != broker,"bad broker"); + require( + 0 == brokerMap[msg.sender][broker].pos, + "broker already exists" + ); + + Broker[] storage brokers = brokerageMap[msg.sender]; + Broker memory b = Broker( + brokers.length + 1, + msg.sender, + broker, + tracker + ); + + brokers.push(b); + brokerMap[msg.sender][broker] = b; + + emit BrokerRegistered( + msg.sender, + broker, + tracker + ); + } + + function unregisterBroker( + address broker + ) + external + { + require(0x0 != broker, "bad broker"); + require( + brokerMap[msg.sender][broker].addr == broker, + "broker not found" + ); + + Broker storage b = brokerMap[msg.sender][broker]; + delete brokerMap[msg.sender][broker]; + + Broker[] storage brokers = brokerageMap[msg.sender]; + Broker storage lastBroker = brokers[brokers.length - 1]; + + if (lastBroker.addr != broker) { + // Swap with the last token and update the pos + lastBroker.pos = b.pos; + brokers[b.pos - 1] = lastBroker; + brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker; + } + + brokers.length--; + + emit BrokerUnregistered(msg.sender, broker); + } +} diff --git a/contracts/BrokerTracker.sol b/contracts/BrokerTracker.sol new file mode 100644 index 00000000..55c9247c --- /dev/null +++ b/contracts/BrokerTracker.sol @@ -0,0 +1,54 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title BrokerTracker +contract BrokerTracker { + /// @dev Returns the max amount the broker can buy or sell. + function getAllowance( + address owner, + address broker, + address tokenB, + address tokenS + ) + public + view + returns ( + uint allowanceB, + uint allowanceS, + uint lrcAllowance + ); + + /// @dev This method will be called from TokenTransferDelegateImpl, so + /// it must check `msg.sender` is the address of LoopringProtocol. + /// Check https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md + /// for the current address of LoopringProtocol deployment. + function onSettlement( + address owner, + address broker, + address tokenB, + uint amountB, + address tokenS, + uint amountS, + uint lrcFee, + uint lrcReward + ) + public; +} \ No newline at end of file diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 9b780535..6830a45d 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -21,6 +21,8 @@ pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; +import "./BrokerRegistry.sol"; +import "./BrokerTracker.sol"; import "./LoopringProtocol.sol"; import "./TokenRegistry.sol"; import "./TokenTransferDelegate.sol"; diff --git a/contracts/TokenRegistryImpl.sol b/contracts/TokenRegistryImpl.sol index 81160cd4..81c811df 100644 --- a/contracts/TokenRegistryImpl.sol +++ b/contracts/TokenRegistryImpl.sol @@ -34,7 +34,7 @@ contract TokenRegistryImpl is TokenRegistry, Claimable { mapping (string => address) symbolMap; struct TokenInfo { - uint pos; // 0 mens unregistered; if > 0, pos + 1 is the + uint pos; // 0 mens unregistered; if > 0, pos - 1 is the // token's position in `addresses`. string symbol; // Symbol of the token } @@ -170,6 +170,17 @@ contract TokenRegistryImpl is TokenRegistry, Claimable { } } + // address[] public addresses; + // mapping (address => TokenInfo) addressMap; + // mapping (string => address) symbolMap; + + // struct TokenInfo { + // uint pos; // 0 mens unregistered; if > 0, pos - 1 is the + // // token's position in `addresses`. + // string symbol; // Symbol of the token + // } + + function registerTokenInternal( address addr, string symbol From 4c279499d12a9b30fad4ad5bdec66bdec911c2b0 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 21 Apr 2018 19:11:02 -0400 Subject: [PATCH 07/68] modify RingMined event (#319) --- contracts/LoopringProtocol.sol | 11 ++++++++++- contracts/LoopringProtocolImpl.sol | 18 ++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index 675020d5..6b4c4ea5 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -27,11 +27,20 @@ contract LoopringProtocol { uint8 public constant OPTION_MASK_CAP_BY_AMOUNTB = 0x01; + struct Fill { + bytes32 orderHash; + uint amountS; + uint lrcReward; + uint lrcFee; + uint splitS; + uint splitB; + } + event RingMined( uint _ringIndex, bytes32 indexed _ringHash, address _miner, - uint[] _orderInfoList + Fill[] _fills ); event OrderCancelled( diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 6830a45d..54e33a15 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -715,7 +715,7 @@ contract LoopringProtocolImpl is LoopringProtocol { private { bytes32[] memory batch = new bytes32[](ctx.ringSize * 7); // ringSize * (owner + tokenS + 4 amounts + wallet) - uint[] memory orderInfoList = new uint[](ctx.ringSize * 6); + Fill[] memory fills = new Fill[](ctx.ringSize); uint p = 0; uint prevSplitB = ctx.orders[ctx.ringSize - 1].splitB; @@ -742,12 +742,14 @@ contract LoopringProtocolImpl is LoopringProtocol { ctx.delegate.addCancelledOrFilled(order.orderHash, order.fillAmountS); } - orderInfoList[i * 6 + 0] = uint(order.orderHash); - orderInfoList[i * 6 + 1] = order.fillAmountS; - orderInfoList[i * 6 + 2] = order.lrcReward; - orderInfoList[i * 6 + 3] = order.lrcFeeState; - orderInfoList[i * 6 + 4] = order.splitS; - orderInfoList[i * 6 + 5] = order.splitB; + fills[i] = Fill( + order.orderHash, + order.fillAmountS, + order.lrcReward, + order.lrcFeeState, + order.splitS, + order.splitB + ); prevSplitB = order.splitB; } @@ -764,7 +766,7 @@ contract LoopringProtocolImpl is LoopringProtocol { ctx.ringIndex, ctx.ringHash, ctx.miner, - orderInfoList + fills ); } From 547eafc9f8d9196b29ad674e4e69543de63e333f Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 21 Apr 2018 19:21:21 -0400 Subject: [PATCH 08/68] V1.6 broker apply (#318) * minor * change order field order * add a signer field to order * change order field order * temp; * reader tracker * reader tracker * more * almost done * resolve conflict * minor change --- , | 0 contracts/BrokerRegistryImpl.sol | 2 +- contracts/BrokerTracker.sol | 22 +-- contracts/LoopringProtocol.sol | 9 +- contracts/LoopringProtocolImpl.sol | 187 ++++++++++++++++-------- contracts/TokenRegistry.sol | 2 +- contracts/TokenTransferDelegate.sol | 26 +++- contracts/TokenTransferDelegateImpl.sol | 117 +++++++++------ 8 files changed, 233 insertions(+), 132 deletions(-) create mode 100644 , diff --git a/, b/, new file mode 100644 index 00000000..e69de29b diff --git a/contracts/BrokerRegistryImpl.sol b/contracts/BrokerRegistryImpl.sol index e8ac9b0d..fdff5610 100644 --- a/contracts/BrokerRegistryImpl.sol +++ b/contracts/BrokerRegistryImpl.sol @@ -47,7 +47,7 @@ contract BrokerRegistryImpl is BrokerRegistry { ) { Broker storage b = brokerMap[owner][broker]; - authenticated = (b.addr != 0x0); + authenticated = (b.addr == broker); tracker = b.tracker; } diff --git a/contracts/BrokerTracker.sol b/contracts/BrokerTracker.sol index 55c9247c..e52f5d61 100644 --- a/contracts/BrokerTracker.sol +++ b/contracts/BrokerTracker.sol @@ -25,30 +25,22 @@ contract BrokerTracker { function getAllowance( address owner, address broker, - address tokenB, - address tokenS + address token ) public view - returns ( - uint allowanceB, - uint allowanceS, - uint lrcAllowance - ); + returns (uint allowance); /// @dev This method will be called from TokenTransferDelegateImpl, so /// it must check `msg.sender` is the address of LoopringProtocol. /// Check https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md /// for the current address of LoopringProtocol deployment. - function onSettlement( + function onTokenSpent( address owner, address broker, - address tokenB, - uint amountB, - address tokenS, - uint amountS, - uint lrcFee, - uint lrcReward + address token, + uint amount ) - public; + public + returns (bool ok); } \ No newline at end of file diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index 6b4c4ea5..8bc1d4c1 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -62,7 +62,7 @@ contract LoopringProtocol { /// @dev Cancel a order. cancel amount(amountS or amountB) can be specified /// in values. - /// @param addresses owner, tokenS, tokenB, wallet, authAddr + /// @param addresses owner, signer, tokenS, tokenB, wallet, authAddr /// @param values amountS, amountB, validSince (second), /// validUntil (second), lrcFee, and cancelAmount. /// @param option This indicates when a order should be considered @@ -71,7 +71,7 @@ contract LoopringProtocol { /// @param r Order ECDSA signature parameters r. /// @param s Order ECDSA signature parameters s. function cancelOrder( - address[5] addresses, + address[6] addresses, uint[6] values, uint8 option, uint8 v, @@ -103,7 +103,8 @@ contract LoopringProtocol { external; /// @dev Submit a order-ring for validation and settlement. - /// @param addressesList List of each order's owner, tokenS, wallet, authAddr. + /// @param addressesList List of each order's owner, signer, tokenS, wallet, + /// and authAddr. /// Note that next order's `tokenS` equals this order's /// `tokenB`. /// @param valuesList List of uint-type arguments in this order: @@ -124,7 +125,7 @@ contract LoopringProtocol { /// Bits to indicate fee selections. `1` represents margin /// split and `0` represents LRC as fee. function submitRing( - address[4][] addressesList, + address[5][] addressesList, uint[6][] valuesList, bool[] optionList, uint8[] vList, diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 54e33a15..b6e0af38 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -45,9 +45,9 @@ contract LoopringProtocolImpl is LoopringProtocol { address public lrcTokenAddress = 0x0; address public tokenRegistryAddress = 0x0; address public delegateAddress = 0x0; + address public brokerRegistryAddress = 0x0; uint64 public ringIndex = 0; - uint8 public walletSplitPercentage = 0; // Exchange rate (rate) is the amount to sell or sold divided by the amount // to buy or bought. @@ -64,34 +64,23 @@ contract LoopringProtocolImpl is LoopringProtocol { uint public constant RATE_RATIO_SCALE = 10000; - /// @param orderHash The order's hash - /// @param feeSelection - - /// A miner-supplied value indicating if LRC (value = 0) - /// or margin split is choosen by the miner (value = 1). - /// We may support more fee model in the future. - /// @param rateS Sell Exchange rate provided by miner. - /// @param rateB Buy Exchange rate provided by miner. - /// @param fillAmountS Amount of tokenS to sell, calculated by protocol. - /// @param lrcReward The amount of LRC paid by miner to order owner in - /// exchange for margin split. - /// @param lrcFeeState The amount of LR paid by order owner to miner. - /// @param splitS TokenS paid to miner. - /// @param splitB TokenB paid to miner. struct Order { address owner; + address signer; address tokenS; address tokenB; address wallet; address authAddr; - uint validSince; - uint validUntil; uint amountS; uint amountB; + uint validSince; + uint validUntil; uint lrcFee; uint8 option; bool capByAmountB; bool marginSplitAsFee; bytes32 orderHash; + address trackerAddr; uint rateS; uint rateB; uint fillAmountS; @@ -104,7 +93,7 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @dev A struct to capture parameters passed to submitRing method and /// various of other variables used across the submitRing core logics. struct Context { - address[4][] addressesList; + address[5][] addressesList; uint[6][] valuesList; uint8[] optionList; uint8[] vList; @@ -115,6 +104,7 @@ contract LoopringProtocolImpl is LoopringProtocol { uint64 ringIndex; uint ringSize; // computed TokenTransferDelegate delegate; + BrokerRegistry brokerRegistry; Order[] orders; bytes32 ringHash; // computed } @@ -123,23 +113,23 @@ contract LoopringProtocolImpl is LoopringProtocol { address _lrcTokenAddress, address _tokenRegistryAddress, address _delegateAddress, - uint _rateRatioCVSThreshold, - uint8 _walletSplitPercentage + address _brokerRegistryAddress, + uint _rateRatioCVSThreshold ) public { require(_lrcTokenAddress.isContract()); require(_tokenRegistryAddress.isContract()); require(_delegateAddress.isContract()); + require(_brokerRegistryAddress.isContract()); require(_rateRatioCVSThreshold > 0); - require(_walletSplitPercentage > 0 && _walletSplitPercentage < 100); lrcTokenAddress = _lrcTokenAddress; tokenRegistryAddress = _tokenRegistryAddress; delegateAddress = _delegateAddress; + brokerRegistryAddress = _brokerRegistryAddress; rateRatioCVSThreshold = _rateRatioCVSThreshold; - walletSplitPercentage = _walletSplitPercentage; } /// @dev Disable default function. @@ -151,7 +141,7 @@ contract LoopringProtocolImpl is LoopringProtocol { } function cancelOrder( - address[5] addresses, + address[6] addresses, uint[6] orderValues, uint8 option, uint8 v, @@ -163,22 +153,23 @@ contract LoopringProtocolImpl is LoopringProtocol { uint cancelAmount = orderValues[5]; require(cancelAmount > 0, "invalid cancelAmount"); - Order memory order = Order( addresses[0], addresses[1], addresses[2], addresses[3], addresses[4], - orderValues[2], - orderValues[3], + addresses[5], orderValues[0], orderValues[1], + orderValues[2], + orderValues[3], orderValues[4], option, option & OPTION_MASK_CAP_BY_AMOUNTB > 0 ? true : false, false, 0x0, + 0x0, 0, 0, 0, @@ -187,22 +178,32 @@ contract LoopringProtocolImpl is LoopringProtocol { 0, 0 ); - require( - msg.sender == order.owner, - "cancelOrder not submitted by owner" + msg.sender == order.signer, + "cancelOrder not submitted by signer" ); bytes32 orderHash = calculateOrderHash(order); verifySignature( - order.owner, + order.signer, orderHash, v, r, s ); + if (order.signer != order.owner) { + BrokerRegistry brokerRegistry = BrokerRegistry(brokerRegistryAddress); + bool authenticated; + address tracker; + (authenticated, tracker) = brokerRegistry.getBroker( + order.owner, + order.signer + ); + require(authenticated, "invalid broker"); + } + TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); delegate.addCancelled(orderHash, cancelAmount); delegate.addCancelledOrFilled(orderHash, cancelAmount); @@ -254,7 +255,7 @@ contract LoopringProtocolImpl is LoopringProtocol { } function submitRing( - address[4][] addressesList, + address[5][] addressesList, uint[6][] valuesList, uint8[] optionList, uint8[] vList, @@ -277,6 +278,7 @@ contract LoopringProtocolImpl is LoopringProtocol { ringIndex, addressesList.length, TokenTransferDelegate(delegateAddress), + BrokerRegistry(brokerRegistryAddress), new Order[](addressesList.length), 0x0 // ringHash ); @@ -367,44 +369,57 @@ contract LoopringProtocolImpl is LoopringProtocol { uint[6] memory uintArgs = ctx.valuesList[i]; bool marginSplitAsFee = (ctx.feeSelections & (uint8(1) << i)) > 0; - ctx.orders[i] = Order( + Order memory order = Order( ctx.addressesList[i][0], ctx.addressesList[i][1], - ctx.addressesList[(i + 1) % ctx.ringSize][1], ctx.addressesList[i][2], + ctx.addressesList[(i + 2) % ctx.ringSize][1], ctx.addressesList[i][3], - uintArgs[2], - uintArgs[3], + ctx.addressesList[i][4], uintArgs[0], uintArgs[1], + uintArgs[2], + uintArgs[3], uintArgs[4], ctx.optionList[i], ctx.optionList[i] & OPTION_MASK_CAP_BY_AMOUNTB > 0 ? true : false, marginSplitAsFee, - bytes32(0), + 0x0, + 0x0, // brokderTracker uintArgs[5], uintArgs[1], 0, // fillAmountS 0, // lrcReward 0, // lrcFee 0, // splitS - 0 // splitB + 0. // splitB ); - validateOrder(ctx.orders[i]); + validateOrder(order); - bytes32 orderHash = calculateOrderHash(ctx.orders[i]); - ctx.orders[i].orderHash = orderHash; + order.orderHash = calculateOrderHash(order); verifySignature( - ctx.orders[i].owner, - orderHash, + order.signer, + order.orderHash, ctx.vList[i], ctx.rList[i], ctx.sList[i] ); - ctx.ringHash ^= orderHash; + if (order.signer != order.owner) { + BrokerRegistry brokerRegistry = BrokerRegistry(brokerRegistryAddress); + bool authenticated; + (authenticated, order.trackerAddr) = brokerRegistry.getBroker( + order.owner, + order.signer + ); + + require(authenticated, "invalid broker"); + } + + ctx.orders[i] = order; + ctx.ringHash ^= order.orderHash; } ctx.ringHash = keccak256( @@ -555,7 +570,13 @@ contract LoopringProtocolImpl is LoopringProtocol { require(order.amountS > 0, "amountS scaled to 0"); require(order.amountB > 0, "amountB scaled to 0"); - uint availableAmountS = getSpendable(ctx.delegate, order.tokenS, order.owner); + uint availableAmountS = getSpendable( + ctx.delegate, + order.tokenS, + order.owner, + order.signer, + order.trackerAddr + ); require(availableAmountS > 0, "spendable is 0"); order.fillAmountS = ( @@ -625,7 +646,9 @@ contract LoopringProtocolImpl is LoopringProtocol { uint lrcSpendable = getSpendable( ctx.delegate, lrcTokenAddress, - order.owner + order.owner, + order.signer, + order.trackerAddr ); // If the order is selling LRC, we need to calculate how much LRC @@ -667,7 +690,13 @@ contract LoopringProtocolImpl is LoopringProtocol { // Only check the available miner balance when absolutely needed if (!checkedMinerLrcSpendable && minerLrcSpendable < order.lrcFeeState) { checkedMinerLrcSpendable = true; - minerLrcSpendable = getSpendable(ctx.delegate, lrcTokenAddress, ctx.miner); + minerLrcSpendable = getSpendable( + ctx.delegate, + lrcTokenAddress, + ctx.miner, + 0x0, + 0x0 + ); } // Only calculate split when miner has enough LRC; @@ -714,7 +743,7 @@ contract LoopringProtocolImpl is LoopringProtocol { ) private { - bytes32[] memory batch = new bytes32[](ctx.ringSize * 7); // ringSize * (owner + tokenS + 4 amounts + wallet) + bytes32[] memory batch = new bytes32[](ctx.ringSize * 7); Fill[] memory fills = new Fill[](ctx.ringSize); uint p = 0; @@ -725,21 +754,29 @@ contract LoopringProtocolImpl is LoopringProtocol { // Store owner and tokenS of every order batch[p] = bytes32(order.owner); - batch[p + 1] = bytes32(order.tokenS); + batch[p + 1] = bytes32(order.signer); + batch[p + 2] = bytes32(order.trackerAddr); + batch[p + 3] = bytes32(order.tokenS); // Store all amounts - batch[p + 2] = bytes32(order.fillAmountS - prevSplitB); - batch[p + 3] = bytes32(prevSplitB + order.splitS); - batch[p + 4] = bytes32(order.lrcReward); - batch[p + 5] = bytes32(order.lrcFeeState); - batch[p + 6] = bytes32(order.wallet); - p += 7; + batch[p + 4] = bytes32(order.fillAmountS - prevSplitB); + batch[p + 5] = bytes32(prevSplitB + order.splitS); + batch[p + 6] = bytes32(order.lrcReward); + batch[p + 7] = bytes32(order.lrcFeeState); + batch[p + 8] = bytes32(order.wallet); + p += 9; // Update fill records if (order.capByAmountB) { - ctx.delegate.addCancelledOrFilled(order.orderHash, nextFillAmountS); + ctx.delegate.addCancelledOrFilled( + order.orderHash, + nextFillAmountS + ); } else { - ctx.delegate.addCancelledOrFilled(order.orderHash, order.fillAmountS); + ctx.delegate.addCancelledOrFilled( + order.orderHash, + order.fillAmountS + ); } fills[i] = Fill( @@ -754,11 +791,11 @@ contract LoopringProtocolImpl is LoopringProtocol { prevSplitB = order.splitB; } + // Do all transactions ctx.delegate.batchTransferToken( lrcTokenAddress, ctx.miner, - walletSplitPercentage, batch ); @@ -774,9 +811,9 @@ contract LoopringProtocolImpl is LoopringProtocol { function calculateOrderFillAmount( Order order, Order next, - uint i, - uint j, - uint smallestIdx + uint i, + uint j, + uint smallestIdx ) private pure @@ -819,19 +856,40 @@ contract LoopringProtocolImpl is LoopringProtocol { function getSpendable( TokenTransferDelegate delegate, address tokenAddress, - address tokenOwner + address tokenOwner, + address broker, + address trackerAddr ) private view - returns (uint) + returns (uint spendable) { ERC20 token = ERC20(tokenAddress); - uint allowance = token.allowance( + spendable = token.allowance( tokenOwner, address(delegate) ); - uint balance = token.balanceOf(tokenOwner); - return (allowance < balance ? allowance : balance); + if (spendable == 0) { + return; + } + uint amount = token.balanceOf(tokenOwner); + if (amount < spendable) { + spendable = amount; + if (spendable == 0) { + return; + } + } + + if (trackerAddr != 0x0) { + amount = BrokerTracker(trackerAddr).getAllowance( + tokenOwner, + broker, + tokenAddress + ); + if (amount < spendable) { + spendable = amount; + } + } } /// @dev validate order's parameters are OK. @@ -861,6 +919,7 @@ contract LoopringProtocolImpl is LoopringProtocol { return keccak256( delegateAddress, order.owner, + order.signer, order.tokenS, order.tokenB, order.wallet, diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index afc680f2..3a1727c1 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -31,7 +31,7 @@ contract TokenRegistry { event TokenUnregistered( address indexed addr, - string indexed symbol + string symbol ); function registerToken( diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TokenTransferDelegate.sol index 887be681..b5655dbc 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TokenTransferDelegate.sol @@ -84,7 +84,6 @@ contract TokenTransferDelegate { function batchTransferToken( address lrcTokenAddress, address minerFeeRecipient, - uint8 walletSplitPercentage, bytes32[] batch ) external; @@ -96,19 +95,34 @@ contract TokenTransferDelegate { view returns (bool); - function addCancelled(bytes32 orderHash, uint cancelAmount) + function addCancelled( + bytes32 orderHash, + uint cancelAmount + ) external; - function addCancelledOrFilled(bytes32 orderHash, uint cancelOrFillAmount) + function addCancelledOrFilled( + bytes32 orderHash, + uint cancelOrFillAmount + ) external; - function setCutoffs(uint t) + function setCutoffs( + uint cutoff + ) external; - function setTradingPairCutoffs(bytes20 tokenPair, uint t) + function setTradingPairCutoffs( + bytes20 tokenPair, + uint cutoff + ) external; - function checkCutoffsBatch(address[] owners, bytes20[] tradingPairs, uint[] validSince) + function checkCutoffsBatch( + address[] owners, + bytes20[] tradingPairs, + uint[] validSince + ) external view; } diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index fd1f8db8..4f885884 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -21,6 +21,7 @@ pragma experimental "ABIEncoderV2"; import "./lib/Claimable.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; +import "./BrokerTracker.sol"; import "./TokenTransferDelegate.sol"; @@ -29,6 +30,16 @@ import "./TokenTransferDelegate.sol"; contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { using MathUint for uint; + uint8 public walletSplitPercentage = 0; + + constructor( + uint8 _walletSplitPercentage + ) + public + { + require(_walletSplitPercentage >= 0 && _walletSplitPercentage <= 100); + walletSplitPercentage = _walletSplitPercentage; + } struct AddressInfo { address previous; uint32 index; @@ -133,48 +144,58 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { } function batchTransferToken( - address lrcTokenAddress, - address minerFeeRecipient, - uint8 walletSplitPercentage, + address lrcAddr, + address miner, bytes32[] batch ) onlyAuthorized external { - uint len = batch.length; - require(len % 7 == 0); - require(walletSplitPercentage > 0 && walletSplitPercentage < 100); + require(batch.length % 9 == 0, "invalid batch"); - ERC20 lrc = ERC20(lrcTokenAddress); + address prevOwner = address(batch[batch.length - 9]); - address prevOwner = address(batch[len - 7]); - for (uint i = 0; i < len; i += 7) { + for (uint i = 0; i < batch.length; i += 9) { address owner = address(batch[i]); + address signer = address(batch[i + 1]); + address tracker = address(batch[i + 2]); // Pay token to previous order, or to miner as previous order's // margin split or/and this order's margin split. + address token = address(batch[i + 3]); + uint amount; - ERC20 token = ERC20(address(batch[i + 1])); - - // Here batch[i + 2] has been checked not to be 0. + // Here batch[i + 4] has been checked not to be 0. if (owner != prevOwner) { + amount = uint(batch[i + 4]); require( - token.transferFrom( + ERC20(token).transferFrom( owner, prevOwner, - uint(batch[i + 2]) + amount ) ); + + if (tracker != 0x0) { + require( + BrokerTracker(tracker).onTokenSpent( + owner, + signer, + token, + amount + ) + ); + } } // Miner pays LRx fee to order owner - uint lrcReward = uint(batch[i + 4]); - if (lrcReward != 0 && minerFeeRecipient != owner) { + amount = uint(batch[i + 6]); + if (amount != 0 && miner != owner) { require( - lrc.transferFrom( - minerFeeRecipient, + ERC20(lrcAddr).transferFrom( + miner, owner, - lrcReward + amount ) ); } @@ -182,21 +203,23 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { // Split margin-split income between miner and wallet splitPayFee( token, - uint(batch[i + 3]), owner, - minerFeeRecipient, - address(batch[i + 6]), - walletSplitPercentage + miner, + signer, + tracker, + address(batch[i + 8]), + uint(batch[i + 5]) ); - // Split LRx fee income between miner and wallet + // Split LRC fee income between miner and wallet splitPayFee( - lrc, - uint(batch[i + 5]), + lrcAddr, owner, - minerFeeRecipient, - address(batch[i + 6]), - walletSplitPercentage + miner, + signer, + tracker, + address(batch[i + 8]), + uint(batch[i + 7]) ); prevOwner = owner; @@ -214,12 +237,13 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { } function splitPayFee( - ERC20 token, - uint fee, + address token, address owner, - address minerFeeRecipient, - address walletFeeRecipient, - uint walletSplitPercentage + address miner, + address broker, + address tracker, + address wallet, + uint fee ) internal { @@ -227,28 +251,39 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { return; } - uint walletFee = (walletFeeRecipient == 0x0) ? 0 : fee.mul(walletSplitPercentage) / 100; + uint walletFee = (wallet == 0x0) ? 0 : fee.mul(walletSplitPercentage) / 100; uint minerFee = fee - walletFee; - if (walletFee > 0 && walletFeeRecipient != owner) { + if (walletFee > 0 && wallet != owner) { require( - token.transferFrom( + ERC20(token).transferFrom( owner, - walletFeeRecipient, + wallet, walletFee ) ); } - if (minerFee > 0 && minerFeeRecipient != 0x0 && minerFeeRecipient != owner) { + if (minerFee > 0 && miner != 0x0 && miner != owner) { require( - token.transferFrom( + ERC20(token).transferFrom( owner, - minerFeeRecipient, + miner, minerFee ) ); } + + if (broker != 0x0) { + require( + BrokerTracker(tracker).onTokenSpent( + owner, + broker, + token, + fee + ) + ); + } } function addCancelled(bytes32 orderHash, uint cancelAmount) From 92fd81ef8ca098f273373ad7c3a92aaf3f6938bf Mon Sep 17 00:00:00 2001 From: wangdong Date: Sat, 21 Apr 2018 19:34:28 -0400 Subject: [PATCH 09/68] minor changes --- contracts/BrokerRegistry.sol | 2 +- contracts/LoopringProtocolImpl.sol | 6 ++- contracts/TokenFactoryImpl.sol | 7 +--- contracts/TokenRegistryImpl.sol | 12 +++--- contracts/TokenTransferDelegateImpl.sol | 52 ++++++++++++++++++------- 5 files changed, 51 insertions(+), 28 deletions(-) diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 3daf3e96..1f08e4fa 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -22,7 +22,7 @@ pragma experimental "ABIEncoderV2"; /// @title Trade Broker /// @dev A broker is an account that can submit order on behalf of other /// accounts. When register a broker, the owner can also specify a -/// pre-deployed BrokageTracker to manage the allowance of for the +/// pre-deployed BrokageTracker to manage the allowance of the /// specific broker. /// @author Daniel Wang - . contract BrokerRegistry { diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index b6e0af38..3ec17270 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -445,7 +445,11 @@ contract LoopringProtocolImpl is LoopringProtocol { validSinceTimes[i] = ctx.orders[i].validSince; } - ctx.delegate.checkCutoffsBatch(owners, tradingPairs, validSinceTimes); + ctx.delegate.checkCutoffsBatch( + owners, + tradingPairs, + validSinceTimes + ); } /// @dev Verify the ringHash has been signed with each order's auth private diff --git a/contracts/TokenFactoryImpl.sol b/contracts/TokenFactoryImpl.sol index 995e5cf9..db6dae88 100644 --- a/contracts/TokenFactoryImpl.sol +++ b/contracts/TokenFactoryImpl.sol @@ -34,7 +34,6 @@ contract TokenFactoryImpl is TokenFactory { mapping(bytes10 => address) public tokens; address public tokenRegistry; - address public tokenTransferDelegate; /// @dev Disable default function. function () @@ -62,12 +61,10 @@ contract TokenFactoryImpl is TokenFactory { external returns (address addr) { - require(tokenRegistry != 0x0); - require(tokenTransferDelegate != 0x0); - require(symbol.checkStringLength(3, 10)); + require(symbol.checkStringLength(3, 10), "bad symbol size"); bytes10 symbolBytes = symbol.stringToBytes10(); - require(tokens[symbolBytes] == 0x0); + require(tokens[symbolBytes] == 0x0, "invalid symbol"); ERC20Token token = new ERC20Token( name, diff --git a/contracts/TokenRegistryImpl.sol b/contracts/TokenRegistryImpl.sol index 81c811df..4f1b0e6a 100644 --- a/contracts/TokenRegistryImpl.sol +++ b/contracts/TokenRegistryImpl.sol @@ -73,8 +73,8 @@ contract TokenRegistryImpl is TokenRegistry, Claimable { external onlyOwner { - require(addr != 0x0); - require(symbolMap[symbol] == addr); + require(addr != 0x0,"bad address"); + require(symbolMap[symbol] == addr, "token not found"); delete symbolMap[symbol]; uint pos = addressMap[addr].pos; @@ -187,10 +187,10 @@ contract TokenRegistryImpl is TokenRegistry, Claimable { ) internal { - require(0x0 != addr); - require(bytes(symbol).length > 0); - require(0x0 == symbolMap[symbol]); - require(0 == addressMap[addr].pos); + require(0x0 != addr, "bad address"); + require(bytes(symbol).length > 0, "empty symbol"); + require(0x0 == symbolMap[symbol], "symbol registered"); + require(0 == addressMap[addr].pos, "address registered"); addresses.push(addr); symbolMap[symbol] = addr; diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index 4f885884..c3e73d6b 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -51,7 +51,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { modifier onlyAuthorized() { - require(addressInfos[msg.sender].authorized); + require(addressInfos[msg.sender].authorized, "unauthorized"); _; } @@ -138,7 +138,8 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { { if (value > 0 && from != to && to != 0x0) { require( - ERC20(token).transferFrom(from, to, value) + ERC20(token).transferFrom(from, to, value), + "token transfer failure" ); } } @@ -173,7 +174,8 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { owner, prevOwner, amount - ) + ), + "token transfer failure" ); if (tracker != 0x0) { @@ -183,7 +185,8 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { signer, token, amount - ) + ), + "tracker update failure" ); } } @@ -196,7 +199,8 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { miner, owner, amount - ) + ), + "token transfer failure" ); } @@ -260,7 +264,8 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { owner, wallet, walletFee - ) + ), + "token transfer failure" ); } @@ -270,7 +275,8 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { owner, miner, minerFee - ) + ), + "token transfer failure" ); } @@ -281,40 +287,56 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { broker, token, fee - ) + ), + "token transfer failure" ); } } - function addCancelled(bytes32 orderHash, uint cancelAmount) + function addCancelled( + bytes32 orderHash, + uint cancelAmount + ) onlyAuthorized external { cancelled[orderHash] = cancelled[orderHash].add(cancelAmount); } - function addCancelledOrFilled(bytes32 orderHash, uint cancelOrFillAmount) + function addCancelledOrFilled( + bytes32 orderHash, + uint cancelOrFillAmount + ) onlyAuthorized external { cancelledOrFilled[orderHash] = cancelledOrFilled[orderHash].add(cancelOrFillAmount); } - function setCutoffs(uint t) + function setCutoffs( + uint cutoff + ) onlyAuthorized external { - cutoffs[tx.origin] = t; + cutoffs[tx.origin] = cutoff; } - function setTradingPairCutoffs(bytes20 tokenPair, uint t) + function setTradingPairCutoffs( + bytes20 tokenPair, + uint cutoff + ) onlyAuthorized external { - tradingPairCutoffs[tx.origin][tokenPair] = t; + tradingPairCutoffs[tx.origin][tokenPair] = cutoff; } - function checkCutoffsBatch(address[] owners, bytes20[] tradingPairs, uint[] validSince) + function checkCutoffsBatch( + address[] owners, + bytes20[] tradingPairs, + uint[] validSince + ) external view { From 856debc4ff52497a57058ce28ce671107f854003 Mon Sep 17 00:00:00 2001 From: wangdong Date: Sat, 21 Apr 2018 19:35:01 -0400 Subject: [PATCH 10/68] minor changes --- contracts/TransferableMultsigImpl.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/TransferableMultsigImpl.sol b/contracts/TransferableMultsigImpl.sol index f15a738c..477cbf3f 100644 --- a/contracts/TransferableMultsigImpl.sol +++ b/contracts/TransferableMultsigImpl.sol @@ -76,7 +76,8 @@ contract TransferableMultsigImpl is TransferableMultsig { ); require( - destination.call.value(value)(data) + destination.call.value(value)(data), + "execution error" ); } From b23bcb805178094617a5e61564c64dc7c504baa0 Mon Sep 17 00:00:00 2001 From: wangdong Date: Sat, 21 Apr 2018 19:40:57 -0400 Subject: [PATCH 11/68] minor changes --- contracts/BrokerRegistry.sol | 2 +- contracts/BrokerRegistryImpl.sol | 4 ++-- contracts/BrokerTracker.sol | 2 +- contracts/LoopringProtocolImpl.sol | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 1f08e4fa..b69d940f 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -44,7 +44,7 @@ contract BrokerRegistry { external view returns( - bool authenticated, + bool registered, address tracker ); diff --git a/contracts/BrokerRegistryImpl.sol b/contracts/BrokerRegistryImpl.sol index fdff5610..b31b0b38 100644 --- a/contracts/BrokerRegistryImpl.sol +++ b/contracts/BrokerRegistryImpl.sol @@ -42,12 +42,12 @@ contract BrokerRegistryImpl is BrokerRegistry { external view returns( - bool authenticated, + bool registered, address tracker ) { Broker storage b = brokerMap[owner][broker]; - authenticated = (b.addr == broker); + registered = (b.addr == broker); tracker = b.tracker; } diff --git a/contracts/BrokerTracker.sol b/contracts/BrokerTracker.sol index e52f5d61..4aeb852b 100644 --- a/contracts/BrokerTracker.sol +++ b/contracts/BrokerTracker.sol @@ -34,7 +34,7 @@ contract BrokerTracker { /// @dev This method will be called from TokenTransferDelegateImpl, so /// it must check `msg.sender` is the address of LoopringProtocol. /// Check https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md - /// for the current address of LoopringProtocol deployment. + /// for the current address of TokenTransferDelegateImpl deployment. function onTokenSpent( address owner, address broker, diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 3ec17270..c6326ab2 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -195,13 +195,13 @@ contract LoopringProtocolImpl is LoopringProtocol { if (order.signer != order.owner) { BrokerRegistry brokerRegistry = BrokerRegistry(brokerRegistryAddress); - bool authenticated; + bool registered; address tracker; - (authenticated, tracker) = brokerRegistry.getBroker( + (registered, tracker) = brokerRegistry.getBroker( order.owner, order.signer ); - require(authenticated, "invalid broker"); + require(registered, "invalid broker"); } TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); From 8c8b9b253b545a7c2335e0c4cf611d3885ae5373 Mon Sep 17 00:00:00 2001 From: wangdong Date: Sat, 21 Apr 2018 19:46:34 -0400 Subject: [PATCH 12/68] minor changes --- contracts/LoopringProtocolImpl.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index c6326ab2..a2a86578 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -287,7 +287,7 @@ contract LoopringProtocolImpl is LoopringProtocol { require((ringIndex >> 63) == 0, "reentry"); // Set the highest bit of ringIndex to '1'. - ringIndex |= (1 << 63); + ringIndex |= (uint64(1) << 63); verifyInputDataIntegrity(ctx); From c64dfa50cd516cba0e5f981c7826432816338c9d Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 23 Apr 2018 00:23:22 -0400 Subject: [PATCH 13/68] batch update fill history (#325) --- contracts/LoopringProtocol.sol | 3 +- contracts/LoopringProtocolImpl.sol | 44 ++++++++++--------------- contracts/TokenTransferDelegate.sol | 5 +-- contracts/TokenTransferDelegateImpl.sol | 14 ++++++-- 4 files changed, 32 insertions(+), 34 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index 8bc1d4c1..8d6323f9 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -38,8 +38,7 @@ contract LoopringProtocol { event RingMined( uint _ringIndex, - bytes32 indexed _ringHash, - address _miner, + address indexed _miner, Fill[] _fills ); diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index a2a86578..6f70757c 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -748,40 +748,32 @@ contract LoopringProtocolImpl is LoopringProtocol { private { bytes32[] memory batch = new bytes32[](ctx.ringSize * 7); + bytes32[] memory historyBatch = new bytes32[](ctx.ringSize * 2); Fill[] memory fills = new Fill[](ctx.ringSize); uint p = 0; + uint q = 0; uint prevSplitB = ctx.orders[ctx.ringSize - 1].splitB; for (uint i = 0; i < ctx.ringSize; i++) { Order memory order = ctx.orders[i]; uint nextFillAmountS = ctx.orders[(i + 1) % ctx.ringSize].fillAmountS; // Store owner and tokenS of every order - batch[p] = bytes32(order.owner); - batch[p + 1] = bytes32(order.signer); - batch[p + 2] = bytes32(order.trackerAddr); - batch[p + 3] = bytes32(order.tokenS); + batch[p++] = bytes32(order.owner); + batch[p++] = bytes32(order.signer); + batch[p++] = bytes32(order.trackerAddr); + batch[p++] = bytes32(order.tokenS); // Store all amounts - batch[p + 4] = bytes32(order.fillAmountS - prevSplitB); - batch[p + 5] = bytes32(prevSplitB + order.splitS); - batch[p + 6] = bytes32(order.lrcReward); - batch[p + 7] = bytes32(order.lrcFeeState); - batch[p + 8] = bytes32(order.wallet); - p += 9; - - // Update fill records - if (order.capByAmountB) { - ctx.delegate.addCancelledOrFilled( - order.orderHash, - nextFillAmountS - ); - } else { - ctx.delegate.addCancelledOrFilled( - order.orderHash, - order.fillAmountS - ); - } + batch[p++] = bytes32(order.fillAmountS - prevSplitB); + batch[p++] = bytes32(prevSplitB + order.splitS); + batch[p++] = bytes32(order.lrcReward); + batch[p++] = bytes32(order.lrcFeeState); + batch[p++] = bytes32(order.wallet); + + historyBatch[q++] = order.orderHash; + historyBatch[q++] = + bytes32(order.capByAmountB ? nextFillAmountS : order.fillAmountS); fills[i] = Fill( order.orderHash, @@ -795,17 +787,15 @@ contract LoopringProtocolImpl is LoopringProtocol { prevSplitB = order.splitB; } - - // Do all transactions - ctx.delegate.batchTransferToken( + ctx.delegate.batchUpdateHistoryAndTransferTokens( lrcTokenAddress, ctx.miner, + historyBatch, batch ); emit RingMined( ctx.ringIndex, - ctx.ringHash, ctx.miner, fills ); diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TokenTransferDelegate.sol index b5655dbc..52d67d4d 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TokenTransferDelegate.sol @@ -81,10 +81,11 @@ contract TokenTransferDelegate { ) external; - function batchTransferToken( + function batchUpdateHistoryAndTransferTokens( address lrcTokenAddress, address minerFeeRecipient, - bytes32[] batch + bytes32[] historyBatch, + bytes32[] transferBatch ) external; diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index c3e73d6b..4ff8e6a4 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -144,19 +144,27 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { } } - function batchTransferToken( + function batchUpdateHistoryAndTransferTokens( address lrcAddr, address miner, + bytes32[] historyBatch, bytes32[] batch ) onlyAuthorized external { - require(batch.length % 9 == 0, "invalid batch"); + // require(batch.length % 9 == 0); + // require(historyBatch.length % 2 == 0); + // require(batch.length / 9 == historyBatch.length / 2); + uint i; + for (i = 0; i < historyBatch.length / 2; i += 2) { + cancelledOrFilled[historyBatch[i]] = + cancelledOrFilled[historyBatch[i]].add(uint(historyBatch[i + 1])); + } address prevOwner = address(batch[batch.length - 9]); - for (uint i = 0; i < batch.length; i += 9) { + for (i = 0; i < batch.length; i += 9) { address owner = address(batch[i]); address signer = address(batch[i + 1]); address tracker = address(batch[i + 2]); From 806e407526b3244155b494941e4fc14e3b55ac0b Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 23 Apr 2018 00:34:54 -0400 Subject: [PATCH 14/68] added boilerplate code for multihash (#320) * added boilerplate code for multihash * minor * remove ringhash from RingMined event * Optimized bytesToBytes32() (#321) * minor improvement --- contracts/LoopringProtocol.sol | 22 ++-------- contracts/LoopringProtocolImpl.sol | 67 +++++++----------------------- contracts/lib/BytesUtil.sol | 40 ++++++++++++++++++ contracts/lib/MultihashUtil.sol | 65 +++++++++++++++++++++++++++++ 4 files changed, 125 insertions(+), 69 deletions(-) create mode 100644 contracts/lib/BytesUtil.sol create mode 100644 contracts/lib/MultihashUtil.sol diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index 8d6323f9..e8cc28ed 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -66,16 +66,12 @@ contract LoopringProtocol { /// validUntil (second), lrcFee, and cancelAmount. /// @param option This indicates when a order should be considered /// as 'completely filled'. - /// @param v Order ECDSA signature parameter v. - /// @param r Order ECDSA signature parameters r. - /// @param s Order ECDSA signature parameters s. + /// @param sig Order's signature. function cancelOrder( address[6] addresses, uint[6] values, uint8 option, - uint8 v, - bytes32 r, - bytes32 s + bytes sig ) external; @@ -110,15 +106,7 @@ contract LoopringProtocol { /// amountS, amountB, validSince (second), /// validUntil (second), lrcFee, and rateAmountS. /// @param optionList This indicates when a order should be considered - /// @param vList List of v for each order. This list is 1-larger than - /// the previous lists, with the last element being the - /// v value of the ring signature. - /// @param rList List of r for each order. This list is 1-larger than - /// the previous lists, with the last element being the - /// r value of the ring signature. - /// @param sList List of s for each order. This list is 1-larger than - /// the previous lists, with the last element being the - /// s value of the ring signature. + /// @param sigList Signature lists. /// @param miner Miner address. /// @param feeSelections - /// Bits to indicate fee selections. `1` represents margin @@ -127,9 +115,7 @@ contract LoopringProtocol { address[5][] addressesList, uint[6][] valuesList, bool[] optionList, - uint8[] vList, - bytes32[] rList, - bytes32[] sList, + bytes[] sigList, address miner, uint8 feeSelections ) diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 6f70757c..19da2945 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -21,6 +21,7 @@ pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; +import "./lib/MultihashUtil.sol"; import "./BrokerRegistry.sol"; import "./BrokerTracker.sol"; import "./LoopringProtocol.sol"; @@ -96,9 +97,7 @@ contract LoopringProtocolImpl is LoopringProtocol { address[5][] addressesList; uint[6][] valuesList; uint8[] optionList; - uint8[] vList; - bytes32[] rList; - bytes32[] sList; + bytes[] sigList; address miner; uint8 feeSelections; uint64 ringIndex; @@ -144,9 +143,7 @@ contract LoopringProtocolImpl is LoopringProtocol { address[6] addresses, uint[6] orderValues, uint8 option, - uint8 v, - bytes32 r, - bytes32 s + bytes sig ) external { @@ -185,12 +182,10 @@ contract LoopringProtocolImpl is LoopringProtocol { bytes32 orderHash = calculateOrderHash(order); - verifySignature( + MultihashUtil.verifySignature( order.signer, orderHash, - v, - r, - s + sig ); if (order.signer != order.owner) { @@ -258,9 +253,7 @@ contract LoopringProtocolImpl is LoopringProtocol { address[5][] addressesList, uint[6][] valuesList, uint8[] optionList, - uint8[] vList, - bytes32[] rList, - bytes32[] sList, + bytes[] sigList, address miner, uint8 feeSelections ) @@ -270,9 +263,7 @@ contract LoopringProtocolImpl is LoopringProtocol { addressesList, valuesList, optionList, - vList, - rList, - sList, + sigList, miner, feeSelections, ringIndex, @@ -349,10 +340,10 @@ contract LoopringProtocolImpl is LoopringProtocol { "invalid ring size" ); - uint sigSize = ctx.ringSize << 1; - require(sigSize == ctx.vList.length, "invalid vList size"); - require(sigSize == ctx.rList.length, "invalid rList size"); - require(sigSize == ctx.sList.length, "invalid sList size"); + require( + (ctx.ringSize << 1) == ctx.sigList.length, + "invalid signature size" + ); } /// @dev Assemble input data into structs so we can pass them to other functions. @@ -399,13 +390,11 @@ contract LoopringProtocolImpl is LoopringProtocol { order.orderHash = calculateOrderHash(order); - verifySignature( + MultihashUtil.verifySignature( order.signer, order.orderHash, - ctx.vList[i], - ctx.rList[i], - ctx.sList[i] - ); + ctx.sigList[i] + ); if (order.signer != order.owner) { BrokerRegistry brokerRegistry = BrokerRegistry(brokerRegistryAddress); @@ -464,12 +453,10 @@ contract LoopringProtocolImpl is LoopringProtocol { for (uint i = 0; i < ctx.ringSize; i++) { j = i + ctx.ringSize; - verifySignature( + MultihashUtil.verifySignature( ctx.orders[i].authAddr, ctx.ringHash, - ctx.vList[j], - ctx.rList[j], - ctx.sList[j] + ctx.sigList[i] ); } } @@ -927,28 +914,6 @@ contract LoopringProtocolImpl is LoopringProtocol { ); } - /// @dev Verify signer's signature. - function verifySignature( - address signer, - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) - private - pure - { - require( - signer == ecrecover( - keccak256("\x19Ethereum Signed Message:\n32", hash), - v, - r, - s - ), - "bad signature" - ); - } - function getTradingPairCutoffs( address orderOwner, address token1, diff --git a/contracts/lib/BytesUtil.sol b/contracts/lib/BytesUtil.sol new file mode 100644 index 00000000..5c3ec22f --- /dev/null +++ b/contracts/lib/BytesUtil.sol @@ -0,0 +1,40 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title Utility Functions for bytes +/// @author Daniel Wang - +library BytesUtil { + function bytesToBytes32( + bytes b, + uint offset + ) + public + pure + returns (bytes32 out) + { + require(b.length >= offset + 32); + bytes32 temp; + assembly { + temp := mload(add(add(b, 0x20), offset)) + } + return temp; + } +} diff --git a/contracts/lib/MultihashUtil.sol b/contracts/lib/MultihashUtil.sol new file mode 100644 index 00000000..029096af --- /dev/null +++ b/contracts/lib/MultihashUtil.sol @@ -0,0 +1,65 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "./BytesUtil.sol"; + + +/// @title Utility Functions for Multihash signature verificaiton +/// @author Daniel Wang - +/// For more information: +/// - https://github.com/saurfang/ipfs-multihash-on-solidity +/// - https://github.com/multiformats/multihash +/// - https://github.com/multiformats/js-multihash +library MultihashUtil { + + string public constant SIG_PREFIX = "\x19Ethereum Signed Message:\n32"; + + function verifySignature( + address signer, + bytes32 plaintext, + bytes multihash + ) + public + pure + { + uint8 algorithm = uint8(multihash[0]); + uint8 size = uint8(multihash[1]); + require(multihash.length == (2 + size), "bad multihash size"); + + // Currently we default 0 to be the Ethereum's default signature. + if (algorithm == 0) { + require(size == 65, "bad multihash size"); + require( + signer == ecrecover( + keccak256( + SIG_PREFIX, + plaintext + ), + uint8(multihash[2]), + BytesUtil.bytesToBytes32(multihash, 3), + BytesUtil.bytesToBytes32(multihash, 11) + ), + "bad signature" + ); + } else { + revert("unsupported algorithm"); + } + } +} \ No newline at end of file From 4e360090cc7037238a8c35cd66cffac0d3dabc01 Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 23 Apr 2018 00:56:31 -0400 Subject: [PATCH 15/68] add address field to OrderCancelled --- contracts/LoopringProtocol.sol | 5 +++-- contracts/LoopringProtocolImpl.sol | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index e8cc28ed..bf065ea3 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -43,7 +43,8 @@ contract LoopringProtocol { ); event OrderCancelled( - bytes32 indexed _orderHash, + address indexed _address, + bytes32 _orderHash, uint _amountCancelled ); @@ -105,7 +106,7 @@ contract LoopringProtocol { /// @param valuesList List of uint-type arguments in this order: /// amountS, amountB, validSince (second), /// validUntil (second), lrcFee, and rateAmountS. - /// @param optionList This indicates when a order should be considered + /// @param optionList Options associated with each order. /// @param sigList Signature lists. /// @param miner Miner address. /// @param feeSelections - diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 19da2945..69466d6e 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -203,7 +203,11 @@ contract LoopringProtocolImpl is LoopringProtocol { delegate.addCancelled(orderHash, cancelAmount); delegate.addCancelledOrFilled(orderHash, cancelAmount); - emit OrderCancelled(orderHash, cancelAmount); + emit OrderCancelled( + order.owner, + orderHash, + cancelAmount + ); } function cancelAllOrdersByTradingPair( From 1f32058b8a789f652a03d3e4673124b2f0e0d5ac Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Mon, 23 Apr 2018 21:16:19 +0800 Subject: [PATCH 16/68] Security enhancement v1.6 (#327) --- contracts/LoopringProtocolImpl.sol | 9 ++--- contracts/TokenTransferDelegateImpl.sol | 50 ++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 69466d6e..95db09ef 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -534,7 +534,6 @@ contract LoopringProtocolImpl is LoopringProtocol { private view { - uint ringSize = ctx.ringSize; Order[] memory orders = ctx.orders; @@ -649,7 +648,7 @@ contract LoopringProtocolImpl is LoopringProtocol { // If the order is selling LRC, we need to calculate how much LRC // is left that can be used as fee. if (order.tokenS == lrcTokenAddress) { - lrcSpendable -= order.fillAmountS; + lrcSpendable = lrcSpendable.sub(order.fillAmountS); } // If the order is buyign LRC, it will has more to pay as fee. @@ -658,7 +657,7 @@ contract LoopringProtocolImpl is LoopringProtocol { lrcReceiable = nextFillAmountS; } - uint lrcTotal = lrcSpendable + lrcReceiable; + uint lrcTotal = lrcSpendable.add(lrcReceiable); // If order doesn't have enough LRC, set margin split to 100%. if (lrcTotal < order.lrcFeeState) { @@ -677,7 +676,7 @@ contract LoopringProtocolImpl is LoopringProtocol { order.lrcFeeState = 0; } else { order.splitB = lrcReceiable; - order.lrcFeeState -= lrcReceiable; + order.lrcFeeState = order.lrcFeeState.sub(lrcReceiable); } } } else { @@ -723,7 +722,7 @@ contract LoopringProtocolImpl is LoopringProtocol { // be paid LRC reward first, so the orders in the ring does // mater. if (split > 0) { - minerLrcSpendable -= order.lrcFeeState; + minerLrcSpendable = minerLrcSpendable.sub(order.lrcFeeState); order.lrcReward = order.lrcFeeState; } } diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index 4ff8e6a4..ad37cbd4 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -27,6 +27,7 @@ import "./TokenTransferDelegate.sol"; /// @title An Implementation of TokenTransferDelegate. /// @author Daniel Wang - . +/// @author Kongliang Zhong - . contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { using MathUint for uint; @@ -40,6 +41,9 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { require(_walletSplitPercentage >= 0 && _walletSplitPercentage <= 100); walletSplitPercentage = _walletSplitPercentage; } + + bool public suspended = false; + struct AddressInfo { address previous; uint32 index; @@ -55,6 +59,18 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { _; } + modifier notSuspended() + { + require(!suspended); + _; + } + + modifier isSuspended() + { + require(suspended); + _; + } + /// @dev Disable default function. function () payable @@ -134,6 +150,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { uint value ) onlyAuthorized + notSuspended external { if (value > 0 && from != to && to != 0x0) { @@ -151,6 +168,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { bytes32[] batch ) onlyAuthorized + notSuspended external { // require(batch.length % 9 == 0); @@ -306,6 +324,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { uint cancelAmount ) onlyAuthorized + notSuspended external { cancelled[orderHash] = cancelled[orderHash].add(cancelAmount); @@ -316,15 +335,18 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { uint cancelOrFillAmount ) onlyAuthorized - external + notSuspended + public { cancelledOrFilled[orderHash] = cancelledOrFilled[orderHash].add(cancelOrFillAmount); } + function setCutoffs( uint cutoff ) onlyAuthorized + notSuspended external { cutoffs[tx.origin] = cutoff; @@ -335,6 +357,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { uint cutoff ) onlyAuthorized + notSuspended external { tradingPairCutoffs[tx.origin][tokenPair] = cutoff; @@ -358,4 +381,29 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { } } + function suspend() + onlyOwner + notSuspended + public + { + suspended = true; + } + + function resume() + onlyOwner + isSuspended + public + { + suspended = false; + } + + /// owner must suspend delegate first before invoke kill method. + function kill() + onlyOwner + isSuspended + external + { + owner = 0x0; + emit OwnershipTransferred(owner, 0x0); + } } From bc91d3e612898457dea78348abb3fe0e9d4cde36 Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 23 Apr 2018 09:19:46 -0400 Subject: [PATCH 17/68] fix issue --- contracts/TokenTransferDelegate.sol | 9 +++++++++ contracts/TokenTransferDelegateImpl.sol | 9 +++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TokenTransferDelegate.sol index 52d67d4d..5c4c0b50 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TokenTransferDelegate.sol @@ -126,4 +126,13 @@ contract TokenTransferDelegate { ) external view; + + function suspend() + external; + + function resume() + external; + + function kill() + external; } diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index ad37cbd4..30f407ff 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -336,9 +336,10 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { ) onlyAuthorized notSuspended - public + external { - cancelledOrFilled[orderHash] = cancelledOrFilled[orderHash].add(cancelOrFillAmount); + cancelledOrFilled[orderHash] = + cancelledOrFilled[orderHash].add(cancelOrFillAmount); } @@ -384,7 +385,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { function suspend() onlyOwner notSuspended - public + external { suspended = true; } @@ -392,7 +393,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { function resume() onlyOwner isSuspended - public + external { suspended = false; } From 5de3d5997bd2e6e33c177f8dd9e8234850119881 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 23 Apr 2018 09:50:19 -0400 Subject: [PATCH 18/68] more security fix (#329) --- contracts/TokenTransferDelegate.sol | 6 +++--- contracts/TokenTransferDelegateImpl.sol | 2 +- contracts/lib/MathUint.sol | 4 ++-- contracts/lib/MultihashUtil.sol | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TokenTransferDelegate.sol index 5c4c0b50..df9b262b 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TokenTransferDelegate.sol @@ -82,8 +82,8 @@ contract TokenTransferDelegate { external; function batchUpdateHistoryAndTransferTokens( - address lrcTokenAddress, - address minerFeeRecipient, + address lrcTokenAddress, + address minerFeeRecipient, bytes32[] historyBatch, bytes32[] transferBatch ) @@ -122,7 +122,7 @@ contract TokenTransferDelegate { function checkCutoffsBatch( address[] owners, bytes20[] tradingPairs, - uint[] validSince + uint[] validSince ) external view; diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index 30f407ff..583c5360 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -282,7 +282,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { } uint walletFee = (wallet == 0x0) ? 0 : fee.mul(walletSplitPercentage) / 100; - uint minerFee = fee - walletFee; + uint minerFee = fee.sub(walletFee); if (walletFee > 0 && wallet != owner) { require( diff --git a/contracts/lib/MathUint.sol b/contracts/lib/MathUint.sol index 826de10e..437d806d 100644 --- a/contracts/lib/MathUint.sol +++ b/contracts/lib/MathUint.sol @@ -86,7 +86,7 @@ library MathUint { uint avg = 0; for (uint i = 0; i < len; i++) { - avg += arr[i]; + avg = add(avg, arr[i]); } avg = avg / len; @@ -101,7 +101,7 @@ library MathUint { for (uint i = 0; i < len; i++) { item = arr[i]; s = item > avg ? item - avg : avg - item; - cvs += mul(s, s); + cvs = add(cvs, mul(s, s)); } return ((mul(mul(cvs, scale), scale) / avg) / avg) / (len - 1); diff --git a/contracts/lib/MultihashUtil.sol b/contracts/lib/MultihashUtil.sol index 029096af..6e504223 100644 --- a/contracts/lib/MultihashUtil.sol +++ b/contracts/lib/MultihashUtil.sol @@ -49,8 +49,8 @@ library MultihashUtil { require( signer == ecrecover( keccak256( - SIG_PREFIX, - plaintext + SIG_PREFIX, + plaintext ), uint8(multihash[2]), BytesUtil.bytesToBytes32(multihash, 3), From 74c23caad1c152e6d03b862e19e871d642df3a7b Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 23 Apr 2018 21:23:45 -0400 Subject: [PATCH 19/68] fix lint issue --- contracts/LoopringProtocolImpl.sol | 5 +- contracts/lib/ERC20Token.sol | 9 +- package-lock.json | 2833 +++++++++++++++++++++++++++- package.json | 5 +- 4 files changed, 2778 insertions(+), 74 deletions(-) diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 95db09ef..d3749d8e 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -762,8 +762,9 @@ contract LoopringProtocolImpl is LoopringProtocol { batch[p++] = bytes32(order.wallet); historyBatch[q++] = order.orderHash; - historyBatch[q++] = - bytes32(order.capByAmountB ? nextFillAmountS : order.fillAmountS); + historyBatch[q++] = bytes32( + order.capByAmountB ? nextFillAmountS : order.fillAmountS + ); fills[i] = Fill( order.orderHash, diff --git a/contracts/lib/ERC20Token.sol b/contracts/lib/ERC20Token.sol index 61e2ae22..94ef9a0a 100644 --- a/contracts/lib/ERC20Token.sol +++ b/contracts/lib/ERC20Token.sol @@ -249,11 +249,12 @@ contract ERC20Token is ERC20 { bytes memory s = bytes(_symbol); require(s.length >= 3 && s.length <= 8); for (uint i = 0; i < s.length; i++) { + // make sure symbol contains only [A-Za-z._] require( - s[i] == 0x2E || // "." - s[i] == 0x5F || // "_" - s[i] >= 0x41 && s[i] <= 0x5A || // [A-Z] - s[i] >= 0x61 && s[i] <= 0x7A // [a-z] + s[i] == 0x2E || ( + s[i] == 0x5F) || ( + s[i] >= 0x41 && s[i] <= 0x5A) || ( + s[i] >= 0x61 && s[i] <= 0x7A) ); } bytes memory n = bytes(_name); diff --git a/package-lock.json b/package-lock.json index 8f1b8039..1e65beda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,18 +83,39 @@ "integrity": "sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA==", "dev": true }, + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "5.5.3" + } + }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", + "fast-deep-equal": "1.1.0", "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "json-schema-traverse": "0.3.1", + "uri-js": "3.0.2" } }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", + "dev": true + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -186,6 +207,12 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", @@ -219,12 +246,38 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "ast-types": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", @@ -243,6 +296,12 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "atob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", + "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", + "dev": true + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1101,6 +1160,79 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -1233,6 +1365,38 @@ "inherits": "2.0.3" } }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "1.0.6", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.2" + } + }, + "browserify-des": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, "browserify-sha3": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", @@ -1248,6 +1412,55 @@ } } }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.11", + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1259,6 +1472,66 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + }, + "dependencies": { + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "cacheable-request": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", @@ -1349,6 +1622,12 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, + "chrome-trace-event": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz", + "integrity": "sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1358,6 +1637,35 @@ "safe-buffer": "5.1.1" } }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -1504,6 +1812,16 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", @@ -1537,23 +1855,114 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.1.2", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "copyfiles": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-1.2.0.tgz", @@ -1579,6 +1988,16 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "create-ecdh": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", + "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, "create-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", @@ -1614,11 +2033,36 @@ "which": "1.3.0" } }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, "crypto-js": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -1639,6 +2083,12 @@ "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", "dev": true }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -1689,18 +2139,81 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "detect-conflict": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", - "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", - "dev": true - }, - "detect-indent": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "detect-conflict": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", + "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", + "dev": true + }, + "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", @@ -1715,12 +2228,29 @@ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", "dev": true }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, "dirty-chai": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-2.0.1.tgz", "integrity": "sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w==", "dev": true }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", @@ -1737,6 +2267,56 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, "editions": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", @@ -1893,12 +2473,31 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", @@ -2031,6 +2630,27 @@ "homedir-polyfill": "1.0.1" } }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -2052,9 +2672,9 @@ } }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, "fast-json-stable-stringify": { @@ -2091,6 +2711,17 @@ "repeat-string": "1.6.1" } }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.2.0", + "pkg-dir": "2.0.0" + } + }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -2154,6 +2785,54 @@ "integrity": "sha1-N4tRKNbQtVSosvFqTKPhq5ZJ8A4=", "dev": true }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2169,6 +2848,15 @@ "for-in": "1.0.2" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -2230,6 +2918,18 @@ "rimraf": "2.6.2" } }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "1.0.34" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3178,6 +3878,12 @@ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "gh-got": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", @@ -3460,6 +4166,66 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, "hash-base": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", @@ -3524,12 +4290,30 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, + "ieee754": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3545,6 +4329,12 @@ "repeating": "2.0.1" } }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3685,6 +4475,15 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3715,6 +4514,34 @@ "builtin-modules": "1.1.1" } }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", @@ -3805,12 +4632,46 @@ } } }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -4210,6 +5071,12 @@ "strip-bom": "2.0.0" } }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", @@ -4455,6 +5322,21 @@ } } }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -4622,6 +5504,16 @@ "regex-cache": "0.4.4" } }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, "mimic-fn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", @@ -4658,6 +5550,57 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.5.4", + "end-of-stream": "1.4.0", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + } + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -4704,6 +5647,20 @@ } } }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.1.2", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4733,6 +5690,46 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "neo-async": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", @@ -4756,6 +5753,81 @@ "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", "dev": true }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.1", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, "nomnom": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", @@ -8723,6 +9795,45 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -8733,6 +9844,23 @@ "is-extendable": "0.1.1" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8795,6 +9923,12 @@ "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", "dev": true }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -8884,6 +10018,74 @@ "p-finally": "1.0.0" } }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.0.6", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.2", + "pbkdf2": "3.0.16" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -8911,6 +10113,24 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -8955,6 +10175,19 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.8" + } + }, "pegjs": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", @@ -8982,6 +10215,32 @@ "pinkie": "2.0.4" } }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "prebuild-install": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.2.2.tgz", @@ -9040,11 +10299,23 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -9057,15 +10328,57 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "pump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" + } + }, + "pump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", "requires": { "end-of-stream": "1.4.0", "once": "1.4.0" } }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "dev": true, + "requires": { + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + } + } + }, + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + }, "query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", @@ -9077,6 +10390,18 @@ "strict-uri-encode": "1.1.0" } }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -9118,6 +10443,25 @@ } } }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.1" + } + }, "rc": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", @@ -9284,6 +10628,16 @@ "is-equal-shallow": "0.1.3" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -9395,6 +10749,12 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -9414,6 +10774,12 @@ "signal-exit": "3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -9446,6 +10812,15 @@ "is-promise": "2.1.0" } }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.1.2" + } + }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -9475,6 +10850,25 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "6.4.0", + "ajv-keywords": "3.1.0" + } + }, "scoped-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", @@ -9503,6 +10897,12 @@ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", "dev": true }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -9514,6 +10914,35 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, "sha.js": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", @@ -9589,6 +11018,120 @@ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.8", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, "sol-digger": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", @@ -9631,6 +11174,20 @@ "solium-plugin-security": "0.1.1", "solparse": "2.2.4", "text-table": "0.2.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } } }, "solium-plugin-security": { @@ -9764,12 +11321,31 @@ "is-plain-obj": "1.1.0" } }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.1.0", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, "source-map-support": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", @@ -9779,6 +11355,12 @@ "source-map": "0.6.1" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", @@ -9800,62 +11382,216 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, - "stream-to-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", - "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "any-observable": "0.2.0" + "extend-shallow": "3.0.2" } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "safe-buffer": "5.1.1" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, "requires": { - "ansi-regex": "2.1.1" + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "inherits": "2.0.3", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } } }, - "strip-bom-stream": { - "version": "2.0.0", + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", + "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "stream-to-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", + "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "dev": true, + "requires": { + "any-observable": "0.2.0" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", "dev": true, @@ -10036,6 +11772,15 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -10045,12 +11790,60 @@ "os-tmpdir": "1.0.2" } }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -10205,6 +11998,12 @@ "tslib": "1.8.0" } }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -10219,18 +12018,163 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "typescript": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", "dev": true }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.5", + "serialize-javascript": "1.5.0", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.1.0", + "worker-farm": "1.6.0" + } + }, "underscore": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", "dev": true }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "untildify": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", @@ -10242,6 +12186,45 @@ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==", + "dev": true + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -10257,11 +12240,45 @@ "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", "dev": true }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "utf8": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10308,6 +12325,368 @@ "vinyl": "1.2.0" } }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", + "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", + "dev": true, + "requires": { + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.1.2", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.8", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, "web3": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.2.tgz", @@ -10334,6 +12713,309 @@ "bignumber.js": "4.1.0" } }, + "webpack": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.6.0.tgz", + "integrity": "sha512-Fu/k/3fZeGtIhuFkiYpIy1UDHhMiGKjG4FFPVuvG+5Os2lWA1ttWpmi9Qnn6AgfZqj9MvhZW/rmj/ip+nHr06g==", + "dev": true, + "requires": { + "acorn": "5.5.3", + "acorn-dynamic-import": "3.0.0", + "ajv": "6.4.0", + "ajv-keywords": "3.1.0", + "chrome-trace-event": "0.1.3", + "enhanced-resolve": "4.0.0", + "eslint-scope": "3.7.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "neo-async": "2.5.0", + "node-libs-browser": "2.1.0", + "schema-utils": "0.4.5", + "tapable": "1.0.0", + "uglifyjs-webpack-plugin": "1.2.5", + "watchpack": "1.5.0", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.8", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, "webpack-addons": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", @@ -10591,6 +13273,16 @@ } } }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + } + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", @@ -10620,6 +13312,15 @@ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", "dev": true }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", diff --git a/package.json b/package.json index bac64ef3..e95c2d7c 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@types/lodash": "^4.14.107", "@types/node": "9.3.0", "@types/request-promise-native": "^1.0.14", - "ajv": "^5.0.0", + "ajv": "^6.0.0", "chai": "^4.0.1", "copyfiles": "^1.2.0", "dirty-chai": "^2.0.1", @@ -37,7 +37,8 @@ "truffle": "^4.1.7", "tslint": "5.8.0", "typescript": "2.7.1", - "web3-typescript-typings": "0.0.3" + "web3-typescript-typings": "0.0.3", + "webpack": "^4.0.0" }, "dependencies": { "@types/bitwise-xor": "0.0.30", From 1afc1bb322d97e1b2c3eb77c92c3aee1ca83f73d Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 23 Apr 2018 21:29:57 -0400 Subject: [PATCH 20/68] Update Dockerfile.test --- Dockerfile.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile.test b/Dockerfile.test index f5922003..13d54056 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -1,4 +1,4 @@ -FROM mhart/alpine-node:9.7 +FROM mhart/alpine-node:9.11.1 RUN apk add --no-cache git curl make gcc g++ python linux-headers @@ -16,4 +16,4 @@ ADD . . RUN npm run compile -CMD npm run testdocker \ No newline at end of file +CMD npm run testdocker From e5766218d62e30604e905762812518715f6529a0 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 23 Apr 2018 21:30:35 -0400 Subject: [PATCH 21/68] Update Dockerfile.testrpc --- Dockerfile.testrpc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile.testrpc b/Dockerfile.testrpc index 03063095..c08e11b7 100644 --- a/Dockerfile.testrpc +++ b/Dockerfile.testrpc @@ -1,6 +1,6 @@ -FROM mhart/alpine-node:9.7 +FROM mhart/alpine-node:9.11.1 -RUN npm install -g ganache-cli@6.0.3 +RUN npm install -g ganache-cli@6.1.0 ADD ganache.sh ganache.sh @@ -8,4 +8,4 @@ RUN chmod +x ganache.sh EXPOSE 8545 -CMD sh ganache.sh \ No newline at end of file +CMD sh ganache.sh From 65b6276acbdf02b53fb88f0f118fd6760b9e44eb Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 24 Apr 2018 13:27:11 -0400 Subject: [PATCH 22/68] Improve the definition of RingMined event (#330) * update dockerfile.test * improve RignMined definition * improve RignMined definition --- Dockerfile.test | 2 +- contracts/LoopringProtocol.sol | 12 ++++++------ contracts/LoopringProtocolImpl.sol | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Dockerfile.test b/Dockerfile.test index 13d54056..2a261e67 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -2,7 +2,7 @@ FROM mhart/alpine-node:9.11.1 RUN apk add --no-cache git curl make gcc g++ python linux-headers -RUN npm install -g truffle@4.0.1 typescript@2.4.2 +RUN npm install -g truffle@4.1.7 typescript@2.7.1 ADD package.json package.json diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index bf065ea3..54db794b 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -28,12 +28,12 @@ contract LoopringProtocol { uint8 public constant OPTION_MASK_CAP_BY_AMOUNTB = 0x01; struct Fill { - bytes32 orderHash; - uint amountS; - uint lrcReward; - uint lrcFee; - uint splitS; - uint splitB; + bytes32 orderHash; + address owner; + address tokenS; + uint amountS; + int split; // Positive number for splitS and negaive for splitB . + int lrcFee; } event RingMined( diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index d3749d8e..146c248a 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -768,11 +768,11 @@ contract LoopringProtocolImpl is LoopringProtocol { fills[i] = Fill( order.orderHash, + order.owner, + order.tokenS, order.fillAmountS, - order.lrcReward, - order.lrcFeeState, - order.splitS, - order.splitB + order.splitS > 0 ? int(order.splitS) : -int(order.splitB), + int(order.lrcFeeState) - int(order.lrcReward) ); prevSplitB = order.splitB; From 2abba8bceaa64c048383a63812d1c190d9ec8563 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Tue, 24 Apr 2018 13:27:22 -0400 Subject: [PATCH 23/68] support all-or-none order option (#333) * support all-or-none order option * minor change --- contracts/LoopringProtocol.sol | 1 + contracts/LoopringProtocolImpl.sol | 91 +++++++++++++++++++++--------- 2 files changed, 66 insertions(+), 26 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index 54db794b..d1c13de2 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -26,6 +26,7 @@ contract LoopringProtocol { uint8 public constant MARGIN_SPLIT_PERCENTAGE_BASE = 100; uint8 public constant OPTION_MASK_CAP_BY_AMOUNTB = 0x01; + uint8 public constant OPTION_MASK_ALL_OR_NONE = 0x02; struct Fill { bytes32 orderHash; diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 146c248a..92c87a13 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -78,7 +78,8 @@ contract LoopringProtocolImpl is LoopringProtocol { uint validUntil; uint lrcFee; uint8 option; - bool capByAmountB; + bool optCapByAmountB; + bool optAllOrNone; bool marginSplitAsFee; bytes32 orderHash; address trackerAddr; @@ -164,6 +165,7 @@ contract LoopringProtocolImpl is LoopringProtocol { orderValues[4], option, option & OPTION_MASK_CAP_BY_AMOUNTB > 0 ? true : false, + option & OPTION_MASK_ALL_OR_NONE > 0 ? true : false, false, 0x0, 0x0, @@ -199,6 +201,10 @@ contract LoopringProtocolImpl is LoopringProtocol { require(registered, "invalid broker"); } + // For AON orders, must cancel it as a whole. + if (order.optAllOrNone) { + cancelAmount = order.optCapByAmountB ? order.amountB : order.amountS; + } TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); delegate.addCancelled(orderHash, cancelAmount); delegate.addCancelledOrFilled(orderHash, cancelAmount); @@ -298,7 +304,7 @@ contract LoopringProtocolImpl is LoopringProtocol { verifyMinerSuppliedFillRates(ctx); - scaleRingBasedOnHistoricalRecords(ctx); + scaleOrders(ctx); calculateRingFillAmount(ctx); @@ -378,6 +384,7 @@ contract LoopringProtocolImpl is LoopringProtocol { uintArgs[4], ctx.optionList[i], ctx.optionList[i] & OPTION_MASK_CAP_BY_AMOUNTB > 0 ? true : false, + ctx.optionList[i] & OPTION_MASK_ALL_OR_NONE > 0 ? true : false, marginSplitAsFee, 0x0, 0x0, // brokderTracker @@ -528,7 +535,7 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @dev Scale down all orders based on historical fill or cancellation /// stats but key the order's original exchange rate. - function scaleRingBasedOnHistoricalRecords( + function scaleOrders( Context ctx ) private @@ -539,26 +546,34 @@ contract LoopringProtocolImpl is LoopringProtocol { for (uint i = 0; i < ringSize; i++) { Order memory order = orders[i]; - uint amount; - if (order.capByAmountB) { - amount = order.amountB.tolerantSub( - ctx.delegate.cancelledOrFilled(order.orderHash) + if (order.optAllOrNone) { + require( + ctx.delegate.cancelledOrFilled(order.orderHash) == 0, + "AON filled or cancelled already" ); + } else { + uint amount; - order.amountS = amount.mul(order.amountS) / order.amountB; - order.lrcFee = amount.mul(order.lrcFee) / order.amountB; + if (order.optCapByAmountB) { + amount = order.amountB.tolerantSub( + ctx.delegate.cancelledOrFilled(order.orderHash) + ); - order.amountB = amount; - } else { - amount = order.amountS.tolerantSub( - ctx.delegate.cancelledOrFilled(order.orderHash) - ); + order.amountS = amount.mul(order.amountS) / order.amountB; + order.lrcFee = amount.mul(order.lrcFee) / order.amountB; - order.amountB = amount.mul(order.amountB) / order.amountS; - order.lrcFee = amount.mul(order.lrcFee) / order.amountS; + order.amountB = amount; + } else { + amount = order.amountS.tolerantSub( + ctx.delegate.cancelledOrFilled(order.orderHash) + ); + + order.amountB = amount.mul(order.amountB) / order.amountS; + order.lrcFee = amount.mul(order.lrcFee) / order.amountS; - order.amountS = amount; + order.amountS = amount; + } } require(order.amountS > 0, "amountS scaled to 0"); @@ -571,12 +586,21 @@ contract LoopringProtocolImpl is LoopringProtocol { order.signer, order.trackerAddr ); - require(availableAmountS > 0, "spendable is 0"); - order.fillAmountS = ( - order.amountS < availableAmountS ? - order.amountS : availableAmountS - ); + // This check is more strict than it needs to be, in case the + // `optCapByAmountB`is true. + if (order.optAllOrNone) { + require( + availableAmountS >= order.amountS, + "AON spendable" + ); + } else { + require(availableAmountS > 0, "spendable is 0"); + order.fillAmountS = ( + order.amountS < availableAmountS ? + order.amountS : availableAmountS + ); + } } } @@ -698,7 +722,7 @@ contract LoopringProtocolImpl is LoopringProtocol { if (minerLrcSpendable >= order.lrcFeeState) { nextFillAmountS = ctx.orders[(i + 1) % ringSize].fillAmountS; uint split; - if (order.capByAmountB) { + if (order.optCapByAmountB) { split = (nextFillAmountS.mul( order.amountS ) / order.amountB).sub( @@ -712,7 +736,7 @@ contract LoopringProtocolImpl is LoopringProtocol { ) / 2; } - if (order.capByAmountB) { + if (order.optCapByAmountB) { order.splitS = split; } else { order.splitB = split; @@ -763,7 +787,7 @@ contract LoopringProtocolImpl is LoopringProtocol { historyBatch[q++] = order.orderHash; historyBatch[q++] = bytes32( - order.capByAmountB ? nextFillAmountS : order.fillAmountS + order.optCapByAmountB ? nextFillAmountS : order.fillAmountS ); fills[i] = Fill( @@ -811,7 +835,7 @@ contract LoopringProtocolImpl is LoopringProtocol { order.rateB ) / order.rateS; - if (order.capByAmountB) { + if (order.optCapByAmountB) { if (fillAmountB > order.amountB) { fillAmountB = order.amountB; @@ -830,6 +854,21 @@ contract LoopringProtocolImpl is LoopringProtocol { ) / order.amountS; } + // Check All-or-None orders + if (order.optAllOrNone){ + if (order.optCapByAmountB) { + require( + fillAmountB >= order.amountB, + "AON failed on amountB" + ); + } else { + require( + order.fillAmountS >= order.amountS, + "AON failed on amountS" + ); + } + } + if (fillAmountB <= next.fillAmountS) { next.fillAmountS = fillAmountB; } else { From fe5ba83805aa66a3b90b94fe84b09828968655fd Mon Sep 17 00:00:00 2001 From: wangdong Date: Tue, 24 Apr 2018 13:36:45 -0400 Subject: [PATCH 24/68] fix minor issue --- contracts/LoopringProtocol.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index d1c13de2..dc931a02 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -116,7 +116,7 @@ contract LoopringProtocol { function submitRing( address[5][] addressesList, uint[6][] valuesList, - bool[] optionList, + uint8[] optionList, bytes[] sigList, address miner, uint8 feeSelections From e9aebe02c026362e90689e4c4127ca32f7c7ba65 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 28 Apr 2018 02:00:30 -0400 Subject: [PATCH 25/68] not allow fillAmountS to be 0 (#336) --- contracts/LoopringProtocol.sol | 4 ++-- contracts/LoopringProtocolImpl.sol | 2 ++ contracts/TokenTransferDelegateImpl.sol | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/contracts/LoopringProtocol.sol b/contracts/LoopringProtocol.sol index dc931a02..96997de9 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/LoopringProtocol.sol @@ -85,7 +85,7 @@ contract LoopringProtocol { function cancelAllOrdersByTradingPair( address token1, address token2, - uint cutoff + uint cutoff ) external; @@ -116,7 +116,7 @@ contract LoopringProtocol { function submitRing( address[5][] addressesList, uint[6][] valuesList, - uint8[] optionList, + uint8[] optionList, bytes[] sigList, address miner, uint8 feeSelections diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/LoopringProtocolImpl.sol index 92c87a13..0c41e9ae 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/LoopringProtocolImpl.sol @@ -600,6 +600,7 @@ contract LoopringProtocolImpl is LoopringProtocol { order.amountS < availableAmountS ? order.amountS : availableAmountS ); + require(order.fillAmountS > 0, "fillAmountS is 0"); } } } @@ -842,6 +843,7 @@ contract LoopringProtocolImpl is LoopringProtocol { order.fillAmountS = fillAmountB.mul( order.rateS ) / order.rateB; + require(order.fillAmountS > 0, "fillAmountS is 0"); newSmallestIdx = i; } diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index 583c5360..1d6c7782 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -195,14 +195,16 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { // Here batch[i + 4] has been checked not to be 0. if (owner != prevOwner) { amount = uint(batch[i + 4]); - require( - ERC20(token).transferFrom( - owner, - prevOwner, - amount - ), - "token transfer failure" - ); + if (amount > 0) { + require( + ERC20(token).transferFrom( + owner, + prevOwner, + amount + ), + "token transfer failure" + ); + } if (tracker != 0x0) { require( From a28f30ffb63cc74f6edce97515e22891b1d0e313 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 29 Apr 2018 17:42:04 -0400 Subject: [PATCH 26/68] V1.6 interceptors (#338) * added basic interceptors * rename brokage tracker to broker interceptor --- ...rokerTracker.sol => BrokerInterceptor.sol} | 4 +-- contracts/BrokerRegistry.sol | 10 +++---- contracts/BrokerRegistryImpl.sol | 18 ++++++------- ...LoopringProtocol.sol => ClearingHouse.sol} | 15 ++++++----- ...ProtocolImpl.sol => ClearingHouseImpl.sol} | 22 ++++++++++------ contracts/OrderInterceptor.sol | 26 +++++++++++++++++++ contracts/RingInterceptor.sol | 26 +++++++++++++++++++ contracts/TokenTransferDelegateImpl.sol | 6 ++--- 8 files changed, 94 insertions(+), 33 deletions(-) rename contracts/{BrokerTracker.sol => BrokerInterceptor.sol} (96%) rename contracts/{LoopringProtocol.sol => ClearingHouse.sol} (92%) rename contracts/{LoopringProtocolImpl.sol => ClearingHouseImpl.sol} (98%) create mode 100644 contracts/OrderInterceptor.sol create mode 100644 contracts/RingInterceptor.sol diff --git a/contracts/BrokerTracker.sol b/contracts/BrokerInterceptor.sol similarity index 96% rename from contracts/BrokerTracker.sol rename to contracts/BrokerInterceptor.sol index 4aeb852b..59646a0f 100644 --- a/contracts/BrokerTracker.sol +++ b/contracts/BrokerInterceptor.sol @@ -19,8 +19,8 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -/// @title BrokerTracker -contract BrokerTracker { +/// @title BrokerInterceptor +contract BrokerInterceptor { /// @dev Returns the max amount the broker can buy or sell. function getAllowance( address owner, diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index b69d940f..3b49150d 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -22,14 +22,14 @@ pragma experimental "ABIEncoderV2"; /// @title Trade Broker /// @dev A broker is an account that can submit order on behalf of other /// accounts. When register a broker, the owner can also specify a -/// pre-deployed BrokageTracker to manage the allowance of the +/// pre-deployed BrokerInterceptor to manage the allowance of the /// specific broker. /// @author Daniel Wang - . contract BrokerRegistry { event BrokerRegistered( address owner, address broker, - address tracker + address interceptor ); event BrokerUnregistered( @@ -45,7 +45,7 @@ contract BrokerRegistry { view returns( bool registered, - address tracker + address interceptor ); function getBrokers( @@ -56,12 +56,12 @@ contract BrokerRegistry { view returns ( address[] brokers, - address[] trackers + address[] interceptors ); function registerBroker( address broker, - address tracker // 0x0 allowed + address interceptor // 0x0 allowed ) external; diff --git a/contracts/BrokerRegistryImpl.sol b/contracts/BrokerRegistryImpl.sol index b31b0b38..d2865d46 100644 --- a/contracts/BrokerRegistryImpl.sol +++ b/contracts/BrokerRegistryImpl.sol @@ -29,7 +29,7 @@ contract BrokerRegistryImpl is BrokerRegistry { // token's position in `addresses`. address owner; address addr; - address tracker; + address interceptor; } mapping(address => Broker[]) public brokerageMap; @@ -43,12 +43,12 @@ contract BrokerRegistryImpl is BrokerRegistry { view returns( bool registered, - address tracker + address interceptor ) { Broker storage b = brokerMap[owner][broker]; registered = (b.addr == broker); - tracker = b.tracker; + interceptor = b.interceptor; } function getBrokers( @@ -59,7 +59,7 @@ contract BrokerRegistryImpl is BrokerRegistry { view returns ( address[] brokers, - address[] trackers + address[] interceptors ) { Broker[] storage _brokers = brokerageMap[msg.sender]; @@ -79,16 +79,16 @@ contract BrokerRegistryImpl is BrokerRegistry { } brokers = new address[](end - start); - trackers = new address[](end - start); + interceptors = new address[](end - start); for (uint i = start; i < end; i++) { brokers[i - start] = _brokers[i].addr; - trackers[i - start] = _brokers[i].tracker; + interceptors[i - start] = _brokers[i].interceptor; } } function registerBroker( address broker, - address tracker // 0x0 allowed + address interceptor // 0x0 allowed ) external { @@ -103,7 +103,7 @@ contract BrokerRegistryImpl is BrokerRegistry { brokers.length + 1, msg.sender, broker, - tracker + interceptor ); brokers.push(b); @@ -112,7 +112,7 @@ contract BrokerRegistryImpl is BrokerRegistry { emit BrokerRegistered( msg.sender, broker, - tracker + interceptor ); } diff --git a/contracts/LoopringProtocol.sol b/contracts/ClearingHouse.sol similarity index 92% rename from contracts/LoopringProtocol.sol rename to contracts/ClearingHouse.sol index 96997de9..af48eb86 100644 --- a/contracts/LoopringProtocol.sol +++ b/contracts/ClearingHouse.sol @@ -19,10 +19,10 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -/// @title Loopring Token Exchange Protocol Contract Interface +/// @title Clearing House /// @author Daniel Wang - /// @author Kongliang Zhong - -contract LoopringProtocol { +contract ClearingHouse { uint8 public constant MARGIN_SPLIT_PERCENTAGE_BASE = 100; uint8 public constant OPTION_MASK_CAP_BY_AMOUNTB = 0x01; @@ -63,14 +63,15 @@ contract LoopringProtocol { /// @dev Cancel a order. cancel amount(amountS or amountB) can be specified /// in values. - /// @param addresses owner, signer, tokenS, tokenB, wallet, authAddr + /// @param addresses owner, signer, tokenS, tokenB, wallet, authAddr, + /// and order interceptor /// @param values amountS, amountB, validSince (second), /// validUntil (second), lrcFee, and cancelAmount. /// @param option This indicates when a order should be considered /// as 'completely filled'. /// @param sig Order's signature. function cancelOrder( - address[6] addresses, + address[7] addresses, uint[6] values, uint8 option, bytes sig @@ -101,7 +102,7 @@ contract LoopringProtocol { /// @dev Submit a order-ring for validation and settlement. /// @param addressesList List of each order's owner, signer, tokenS, wallet, - /// and authAddr. + /// authAddr, and order interceptor. /// Note that next order's `tokenS` equals this order's /// `tokenB`. /// @param valuesList List of uint-type arguments in this order: @@ -110,15 +111,17 @@ contract LoopringProtocol { /// @param optionList Options associated with each order. /// @param sigList Signature lists. /// @param miner Miner address. + /// @param inteceptor Ring interceptor address. /// @param feeSelections - /// Bits to indicate fee selections. `1` represents margin /// split and `0` represents LRC as fee. function submitRing( - address[5][] addressesList, + address[6][] addressesList, uint[6][] valuesList, uint8[] optionList, bytes[] sigList, address miner, + address inteceptor, uint8 feeSelections ) public; diff --git a/contracts/LoopringProtocolImpl.sol b/contracts/ClearingHouseImpl.sol similarity index 98% rename from contracts/LoopringProtocolImpl.sol rename to contracts/ClearingHouseImpl.sol index 0c41e9ae..93b9cfa9 100644 --- a/contracts/LoopringProtocolImpl.sol +++ b/contracts/ClearingHouseImpl.sol @@ -23,13 +23,13 @@ import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; import "./lib/MultihashUtil.sol"; import "./BrokerRegistry.sol"; -import "./BrokerTracker.sol"; -import "./LoopringProtocol.sol"; +import "./BrokerInterceptor.sol"; +import "./ClearingHouse.sol"; import "./TokenRegistry.sol"; import "./TokenTransferDelegate.sol"; -/// @title An Implementation of LoopringProtocol. +/// @title An Implementation of Clearn House. /// @author Daniel Wang - , /// @author Kongliang Zhong - /// @@ -39,7 +39,7 @@ import "./TokenTransferDelegate.sol"; /// https://github.com/BenjaminPrice /// https://github.com/jonasshen /// https://github.com/Hephyrius -contract LoopringProtocolImpl is LoopringProtocol { +contract ClearingHouseImpl is ClearingHouse { using AddressUtil for address; using MathUint for uint; @@ -72,6 +72,7 @@ contract LoopringProtocolImpl is LoopringProtocol { address tokenB; address wallet; address authAddr; + address interceptor; uint amountS; uint amountB; uint validSince; @@ -95,11 +96,12 @@ contract LoopringProtocolImpl is LoopringProtocol { /// @dev A struct to capture parameters passed to submitRing method and /// various of other variables used across the submitRing core logics. struct Context { - address[5][] addressesList; + address[6][] addressesList; uint[6][] valuesList; uint8[] optionList; bytes[] sigList; address miner; + address interceptor; uint8 feeSelections; uint64 ringIndex; uint ringSize; // computed @@ -141,7 +143,7 @@ contract LoopringProtocolImpl is LoopringProtocol { } function cancelOrder( - address[6] addresses, + address[7] addresses, uint[6] orderValues, uint8 option, bytes sig @@ -158,6 +160,7 @@ contract LoopringProtocolImpl is LoopringProtocol { addresses[3], addresses[4], addresses[5], + addresses[6], orderValues[0], orderValues[1], orderValues[2], @@ -260,11 +263,12 @@ contract LoopringProtocolImpl is LoopringProtocol { } function submitRing( - address[5][] addressesList, + address[6][] addressesList, uint[6][] valuesList, uint8[] optionList, bytes[] sigList, address miner, + address interceptor, uint8 feeSelections ) public @@ -275,6 +279,7 @@ contract LoopringProtocolImpl is LoopringProtocol { optionList, sigList, miner, + interceptor, feeSelections, ringIndex, addressesList.length, @@ -377,6 +382,7 @@ contract LoopringProtocolImpl is LoopringProtocol { ctx.addressesList[(i + 2) % ctx.ringSize][1], ctx.addressesList[i][3], ctx.addressesList[i][4], + ctx.addressesList[i][5], uintArgs[0], uintArgs[1], uintArgs[2], @@ -907,7 +913,7 @@ contract LoopringProtocolImpl is LoopringProtocol { } if (trackerAddr != 0x0) { - amount = BrokerTracker(trackerAddr).getAllowance( + amount = BrokerInterceptor(trackerAddr).getAllowance( tokenOwner, broker, tokenAddress diff --git a/contracts/OrderInterceptor.sol b/contracts/OrderInterceptor.sol new file mode 100644 index 00000000..26d805ad --- /dev/null +++ b/contracts/OrderInterceptor.sol @@ -0,0 +1,26 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title Order Interceptor +/// @author Daniel Wang - . +contract OrderInterceptor { + +} diff --git a/contracts/RingInterceptor.sol b/contracts/RingInterceptor.sol new file mode 100644 index 00000000..93fba2e6 --- /dev/null +++ b/contracts/RingInterceptor.sol @@ -0,0 +1,26 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title Ring Interceptor +/// @author Daniel Wang - . +contract RingInterceptor { + +} diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol index 1d6c7782..091e384d 100644 --- a/contracts/TokenTransferDelegateImpl.sol +++ b/contracts/TokenTransferDelegateImpl.sol @@ -21,7 +21,7 @@ pragma experimental "ABIEncoderV2"; import "./lib/Claimable.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; -import "./BrokerTracker.sol"; +import "./BrokerInterceptor.sol"; import "./TokenTransferDelegate.sol"; @@ -208,7 +208,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { if (tracker != 0x0) { require( - BrokerTracker(tracker).onTokenSpent( + BrokerInterceptor(tracker).onTokenSpent( owner, signer, token, @@ -310,7 +310,7 @@ contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { if (broker != 0x0) { require( - BrokerTracker(tracker).onTokenSpent( + BrokerInterceptor(tracker).onTokenSpent( owner, broker, token, From b3cb507928b5bd04f24e417c5423d1c4c0b069fd Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 29 Apr 2018 18:41:58 -0400 Subject: [PATCH 27/68] rename (#339) --- contracts/BrokerRegistry.sol | 113 ++++- contracts/BrokerRegistryImpl.sol | 147 ------- .../{ClearingHouseImpl.sol => Exchange.sol} | 54 +-- ...Interceptor.sol => IBrokerInterceptor.sol} | 4 +- contracts/IBrokerRegistry.sol | 72 +++ .../{ClearingHouse.sol => IExchange.sol} | 4 +- ...rInterceptor.sol => IOrderInterceptor.sol} | 4 +- ...ngInterceptor.sol => IRingInterceptor.sol} | 4 +- contracts/ITokenFactory.sol | 51 +++ contracts/ITokenRegistry.sol | 90 ++++ contracts/ITokenTransferDelegate.sol | 138 ++++++ contracts/ITransferableMultsig.sol | 45 ++ contracts/TokenFactory.sol | 79 +++- contracts/TokenFactoryImpl.sol | 90 ---- contracts/TokenRegistry.sol | 149 ++++++- contracts/TokenRegistryImpl.sol | 201 --------- contracts/TokenTransferDelegate.sol | 374 +++++++++++++--- contracts/TokenTransferDelegateImpl.sol | 412 ------------------ contracts/TransferableMultsig.sol | 135 +++++- contracts/TransferableMultsigImpl.sol | 168 ------- 20 files changed, 1167 insertions(+), 1167 deletions(-) delete mode 100644 contracts/BrokerRegistryImpl.sol rename contracts/{ClearingHouseImpl.sol => Exchange.sol} (95%) rename contracts/{BrokerInterceptor.sol => IBrokerInterceptor.sol} (95%) create mode 100644 contracts/IBrokerRegistry.sol rename contracts/{ClearingHouse.sol => IExchange.sol} (98%) rename contracts/{OrderInterceptor.sol => IOrderInterceptor.sol} (92%) rename contracts/{RingInterceptor.sol => IRingInterceptor.sol} (93%) create mode 100644 contracts/ITokenFactory.sol create mode 100644 contracts/ITokenRegistry.sol create mode 100644 contracts/ITokenTransferDelegate.sol create mode 100644 contracts/ITransferableMultsig.sol delete mode 100644 contracts/TokenFactoryImpl.sol delete mode 100644 contracts/TokenRegistryImpl.sol delete mode 100644 contracts/TokenTransferDelegateImpl.sol delete mode 100644 contracts/TransferableMultsigImpl.sol diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 3b49150d..9a04fc4f 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -18,24 +18,22 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "./IBrokerRegistry.sol"; -/// @title Trade Broker -/// @dev A broker is an account that can submit order on behalf of other -/// accounts. When register a broker, the owner can also specify a -/// pre-deployed BrokerInterceptor to manage the allowance of the -/// specific broker. + +/// @title An Implementation of IBrokerRegistry. /// @author Daniel Wang - . -contract BrokerRegistry { - event BrokerRegistered( - address owner, - address broker, - address interceptor - ); +contract BrokerRegistry is IBrokerRegistry { + struct Broker { + uint pos; // 0 mens unregistered; if > 0, pos - 1 is the + // token's position in `addresses`. + address owner; + address addr; + address interceptor; + } - event BrokerUnregistered( - address owner, - address broker - ); + mapping(address => Broker[]) public brokerageMap; + mapping(address => mapping(address => Broker)) public brokerMap; function getBroker( address owner, @@ -46,7 +44,12 @@ contract BrokerRegistry { returns( bool registered, address interceptor - ); + ) + { + Broker storage b = brokerMap[owner][broker]; + registered = (b.addr == broker); + interceptor = b.interceptor; + } function getBrokers( uint start, @@ -57,16 +60,88 @@ contract BrokerRegistry { returns ( address[] brokers, address[] interceptors - ); + ) + { + Broker[] storage _brokers = brokerageMap[msg.sender]; + uint num = _brokers.length; + + if (start >= num) { + return; + } + + uint end = start + count; + if (end > num) { + end = num; + } + + if (start == num) { + return; + } + + brokers = new address[](end - start); + interceptors = new address[](end - start); + for (uint i = start; i < end; i++) { + brokers[i - start] = _brokers[i].addr; + interceptors[i - start] = _brokers[i].interceptor; + } + } function registerBroker( address broker, address interceptor // 0x0 allowed ) - external; + external + { + require(0x0 != broker,"bad broker"); + require( + 0 == brokerMap[msg.sender][broker].pos, + "broker already exists" + ); + + Broker[] storage brokers = brokerageMap[msg.sender]; + Broker memory b = Broker( + brokers.length + 1, + msg.sender, + broker, + interceptor + ); + + brokers.push(b); + brokerMap[msg.sender][broker] = b; + + emit BrokerRegistered( + msg.sender, + broker, + interceptor + ); + } function unregisterBroker( address broker ) - external; + external + { + require(0x0 != broker, "bad broker"); + require( + brokerMap[msg.sender][broker].addr == broker, + "broker not found" + ); + + Broker storage b = brokerMap[msg.sender][broker]; + delete brokerMap[msg.sender][broker]; + + Broker[] storage brokers = brokerageMap[msg.sender]; + Broker storage lastBroker = brokers[brokers.length - 1]; + + if (lastBroker.addr != broker) { + // Swap with the last token and update the pos + lastBroker.pos = b.pos; + brokers[b.pos - 1] = lastBroker; + brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker; + } + + brokers.length--; + + emit BrokerUnregistered(msg.sender, broker); + } } diff --git a/contracts/BrokerRegistryImpl.sol b/contracts/BrokerRegistryImpl.sol deleted file mode 100644 index d2865d46..00000000 --- a/contracts/BrokerRegistryImpl.sol +++ /dev/null @@ -1,147 +0,0 @@ -/* - - Copyright 2017 Loopring Project Ltd (Loopring Foundation). - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -pragma solidity 0.4.23; -pragma experimental "v0.5.0"; -pragma experimental "ABIEncoderV2"; - -import "./BrokerRegistry.sol"; - - -/// @title An Implementation of BrokerRegistry. -/// @author Daniel Wang - . -contract BrokerRegistryImpl is BrokerRegistry { - struct Broker { - uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // token's position in `addresses`. - address owner; - address addr; - address interceptor; - } - - mapping(address => Broker[]) public brokerageMap; - mapping(address => mapping(address => Broker)) public brokerMap; - - function getBroker( - address owner, - address broker - ) - external - view - returns( - bool registered, - address interceptor - ) - { - Broker storage b = brokerMap[owner][broker]; - registered = (b.addr == broker); - interceptor = b.interceptor; - } - - function getBrokers( - uint start, - uint count - ) - public - view - returns ( - address[] brokers, - address[] interceptors - ) - { - Broker[] storage _brokers = brokerageMap[msg.sender]; - uint num = _brokers.length; - - if (start >= num) { - return; - } - - uint end = start + count; - if (end > num) { - end = num; - } - - if (start == num) { - return; - } - - brokers = new address[](end - start); - interceptors = new address[](end - start); - for (uint i = start; i < end; i++) { - brokers[i - start] = _brokers[i].addr; - interceptors[i - start] = _brokers[i].interceptor; - } - } - - function registerBroker( - address broker, - address interceptor // 0x0 allowed - ) - external - { - require(0x0 != broker,"bad broker"); - require( - 0 == brokerMap[msg.sender][broker].pos, - "broker already exists" - ); - - Broker[] storage brokers = brokerageMap[msg.sender]; - Broker memory b = Broker( - brokers.length + 1, - msg.sender, - broker, - interceptor - ); - - brokers.push(b); - brokerMap[msg.sender][broker] = b; - - emit BrokerRegistered( - msg.sender, - broker, - interceptor - ); - } - - function unregisterBroker( - address broker - ) - external - { - require(0x0 != broker, "bad broker"); - require( - brokerMap[msg.sender][broker].addr == broker, - "broker not found" - ); - - Broker storage b = brokerMap[msg.sender][broker]; - delete brokerMap[msg.sender][broker]; - - Broker[] storage brokers = brokerageMap[msg.sender]; - Broker storage lastBroker = brokers[brokers.length - 1]; - - if (lastBroker.addr != broker) { - // Swap with the last token and update the pos - lastBroker.pos = b.pos; - brokers[b.pos - 1] = lastBroker; - brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker; - } - - brokers.length--; - - emit BrokerUnregistered(msg.sender, broker); - } -} diff --git a/contracts/ClearingHouseImpl.sol b/contracts/Exchange.sol similarity index 95% rename from contracts/ClearingHouseImpl.sol rename to contracts/Exchange.sol index 93b9cfa9..1b6be0b3 100644 --- a/contracts/ClearingHouseImpl.sol +++ b/contracts/Exchange.sol @@ -22,14 +22,14 @@ import "./lib/AddressUtil.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; import "./lib/MultihashUtil.sol"; -import "./BrokerRegistry.sol"; -import "./BrokerInterceptor.sol"; -import "./ClearingHouse.sol"; -import "./TokenRegistry.sol"; -import "./TokenTransferDelegate.sol"; +import "./IBrokerRegistry.sol"; +import "./IBrokerInterceptor.sol"; +import "./IExchange.sol"; +import "./ITokenRegistry.sol"; +import "./ITokenTransferDelegate.sol"; -/// @title An Implementation of Clearn House. +/// @title An Implementation of IExchange. /// @author Daniel Wang - , /// @author Kongliang Zhong - /// @@ -39,7 +39,7 @@ import "./TokenTransferDelegate.sol"; /// https://github.com/BenjaminPrice /// https://github.com/jonasshen /// https://github.com/Hephyrius -contract ClearingHouseImpl is ClearingHouse { +contract Exchange is IExchange { using AddressUtil for address; using MathUint for uint; @@ -83,7 +83,7 @@ contract ClearingHouseImpl is ClearingHouse { bool optAllOrNone; bool marginSplitAsFee; bytes32 orderHash; - address trackerAddr; + address brokerInterceptor; uint rateS; uint rateB; uint fillAmountS; @@ -105,8 +105,8 @@ contract ClearingHouseImpl is ClearingHouse { uint8 feeSelections; uint64 ringIndex; uint ringSize; // computed - TokenTransferDelegate delegate; - BrokerRegistry brokerRegistry; + ITokenTransferDelegate delegate; + IBrokerRegistry brokerRegistry; Order[] orders; bytes32 ringHash; // computed } @@ -194,7 +194,7 @@ contract ClearingHouseImpl is ClearingHouse { ); if (order.signer != order.owner) { - BrokerRegistry brokerRegistry = BrokerRegistry(brokerRegistryAddress); + IBrokerRegistry brokerRegistry = IBrokerRegistry(brokerRegistryAddress); bool registered; address tracker; (registered, tracker) = brokerRegistry.getBroker( @@ -208,7 +208,7 @@ contract ClearingHouseImpl is ClearingHouse { if (order.optAllOrNone) { cancelAmount = order.optCapByAmountB ? order.amountB : order.amountS; } - TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); + ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); delegate.addCancelled(orderHash, cancelAmount); delegate.addCancelledOrFilled(orderHash, cancelAmount); @@ -229,7 +229,7 @@ contract ClearingHouseImpl is ClearingHouse { uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); - TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); + ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); require( delegate.tradingPairCutoffs(msg.sender, tokenPair) < t, @@ -251,7 +251,7 @@ contract ClearingHouseImpl is ClearingHouse { external { uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; - TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); + ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); require( delegate.cutoffs(msg.sender) < t, @@ -283,8 +283,8 @@ contract ClearingHouseImpl is ClearingHouse { feeSelections, ringIndex, addressesList.length, - TokenTransferDelegate(delegateAddress), - BrokerRegistry(brokerRegistryAddress), + ITokenTransferDelegate(delegateAddress), + IBrokerRegistry(brokerRegistryAddress), new Order[](addressesList.length), 0x0 // ringHash ); @@ -414,9 +414,9 @@ contract ClearingHouseImpl is ClearingHouse { ); if (order.signer != order.owner) { - BrokerRegistry brokerRegistry = BrokerRegistry(brokerRegistryAddress); + IBrokerRegistry brokerRegistry = IBrokerRegistry(brokerRegistryAddress); bool authenticated; - (authenticated, order.trackerAddr) = brokerRegistry.getBroker( + (authenticated, order.brokerInterceptor) = brokerRegistry.getBroker( order.owner, order.signer ); @@ -492,7 +492,7 @@ contract ClearingHouseImpl is ClearingHouse { // Test all token addresses at once require( - TokenRegistry(tokenRegistryAddress).areAllTokensRegistered(tokens), + ITokenRegistry(tokenRegistryAddress).areAllTokensRegistered(tokens), "token not registered" ); } @@ -590,7 +590,7 @@ contract ClearingHouseImpl is ClearingHouse { order.tokenS, order.owner, order.signer, - order.trackerAddr + order.brokerInterceptor ); // This check is more strict than it needs to be, in case the @@ -673,7 +673,7 @@ contract ClearingHouseImpl is ClearingHouse { lrcTokenAddress, order.owner, order.signer, - order.trackerAddr + order.brokerInterceptor ); // If the order is selling LRC, we need to calculate how much LRC @@ -782,7 +782,7 @@ contract ClearingHouseImpl is ClearingHouse { // Store owner and tokenS of every order batch[p++] = bytes32(order.owner); batch[p++] = bytes32(order.signer); - batch[p++] = bytes32(order.trackerAddr); + batch[p++] = bytes32(order.brokerInterceptor); batch[p++] = bytes32(order.tokenS); // Store all amounts @@ -886,11 +886,11 @@ contract ClearingHouseImpl is ClearingHouse { /// @return Amount of ERC20 token that can be spent by this contract. function getSpendable( - TokenTransferDelegate delegate, + ITokenTransferDelegate delegate, address tokenAddress, address tokenOwner, address broker, - address trackerAddr + address brokerInterceptor ) private view @@ -912,8 +912,8 @@ contract ClearingHouseImpl is ClearingHouse { } } - if (trackerAddr != 0x0) { - amount = BrokerInterceptor(trackerAddr).getAllowance( + if (brokerInterceptor != 0x0) { + amount = IBrokerInterceptor(brokerInterceptor).getAllowance( tokenOwner, broker, tokenAddress @@ -975,7 +975,7 @@ contract ClearingHouseImpl is ClearingHouse { returns (uint) { bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); - TokenTransferDelegate delegate = TokenTransferDelegate(delegateAddress); + ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); return delegate.tradingPairCutoffs(orderOwner, tokenPair); } } diff --git a/contracts/BrokerInterceptor.sol b/contracts/IBrokerInterceptor.sol similarity index 95% rename from contracts/BrokerInterceptor.sol rename to contracts/IBrokerInterceptor.sol index 59646a0f..7ad00698 100644 --- a/contracts/BrokerInterceptor.sol +++ b/contracts/IBrokerInterceptor.sol @@ -19,8 +19,8 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -/// @title BrokerInterceptor -contract BrokerInterceptor { +/// @title IBrokerInterceptor +contract IBrokerInterceptor { /// @dev Returns the max amount the broker can buy or sell. function getAllowance( address owner, diff --git a/contracts/IBrokerRegistry.sol b/contracts/IBrokerRegistry.sol new file mode 100644 index 00000000..3a64505b --- /dev/null +++ b/contracts/IBrokerRegistry.sol @@ -0,0 +1,72 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title IBrokerRegistry +/// @dev A broker is an account that can submit order on behalf of other +/// accounts. When register a broker, the owner can also specify a +/// pre-deployed BrokerInterceptor to manage the allowance of the +/// specific broker. +/// @author Daniel Wang - . +contract IBrokerRegistry { + event BrokerRegistered( + address owner, + address broker, + address interceptor + ); + + event BrokerUnregistered( + address owner, + address broker + ); + + function getBroker( + address owner, + address broker + ) + external + view + returns( + bool registered, + address interceptor + ); + + function getBrokers( + uint start, + uint count + ) + public + view + returns ( + address[] brokers, + address[] interceptors + ); + + function registerBroker( + address broker, + address interceptor // 0x0 allowed + ) + external; + + function unregisterBroker( + address broker + ) + external; +} diff --git a/contracts/ClearingHouse.sol b/contracts/IExchange.sol similarity index 98% rename from contracts/ClearingHouse.sol rename to contracts/IExchange.sol index af48eb86..04dbd68b 100644 --- a/contracts/ClearingHouse.sol +++ b/contracts/IExchange.sol @@ -19,10 +19,10 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -/// @title Clearing House +/// @title IExchange /// @author Daniel Wang - /// @author Kongliang Zhong - -contract ClearingHouse { +contract IExchange { uint8 public constant MARGIN_SPLIT_PERCENTAGE_BASE = 100; uint8 public constant OPTION_MASK_CAP_BY_AMOUNTB = 0x01; diff --git a/contracts/OrderInterceptor.sol b/contracts/IOrderInterceptor.sol similarity index 92% rename from contracts/OrderInterceptor.sol rename to contracts/IOrderInterceptor.sol index 26d805ad..a72f5dd4 100644 --- a/contracts/OrderInterceptor.sol +++ b/contracts/IOrderInterceptor.sol @@ -19,8 +19,8 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -/// @title Order Interceptor +/// @title IOrderInterceptor /// @author Daniel Wang - . -contract OrderInterceptor { +contract IOrderInterceptor { } diff --git a/contracts/RingInterceptor.sol b/contracts/IRingInterceptor.sol similarity index 93% rename from contracts/RingInterceptor.sol rename to contracts/IRingInterceptor.sol index 93fba2e6..1f584860 100644 --- a/contracts/RingInterceptor.sol +++ b/contracts/IRingInterceptor.sol @@ -19,8 +19,8 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -/// @title Ring Interceptor +/// @title IRingInterceptor /// @author Daniel Wang - . -contract RingInterceptor { +contract IRingInterceptor { } diff --git a/contracts/ITokenFactory.sol b/contracts/ITokenFactory.sol new file mode 100644 index 00000000..7996611c --- /dev/null +++ b/contracts/ITokenFactory.sol @@ -0,0 +1,51 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title ITokenFactory +/// @dev This contract deploys ERC20 token contract and registered the contract +/// so the token can be traded with Loopring Protocol. +/// @author Kongliang Zhong - , +/// @author Daniel Wang - . +contract ITokenFactory { + event TokenCreated( + address indexed addr, + string name, + string symbol, + uint8 decimals, + uint totalSupply, + address firstHolder + ); + + /// @dev Deploy an ERC20 token contract, register it with TokenRegistry, + /// and returns the new token's address. + /// @param name The name of the token + /// @param symbol The symbol of the token. + /// @param decimals The decimals of the token. + /// @param totalSupply The total supply of the token. + function createToken( + string name, + string symbol, + uint8 decimals, + uint totalSupply + ) + external + returns (address addr); +} diff --git a/contracts/ITokenRegistry.sol b/contracts/ITokenRegistry.sol new file mode 100644 index 00000000..11cc2ad1 --- /dev/null +++ b/contracts/ITokenRegistry.sol @@ -0,0 +1,90 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title ITokenRegistry +/// @dev This contract maintains a list of tokens the Protocol supports. +/// @author Kongliang Zhong - , +/// @author Daniel Wang - . +contract ITokenRegistry { + event TokenRegistered( + address indexed addr, + string symbol + ); + + event TokenUnregistered( + address indexed addr, + string symbol + ); + + function registerToken( + address addr, + string symbol + ) + external; + + function registerMintedToken( + address addr, + string symbol + ) + external; + + function unregisterToken( + address addr, + string symbol + ) + external; + + function areAllTokensRegistered( + address[] addressList + ) + external + view + returns (bool); + + function getAddressBySymbol( + string symbol + ) + external + view + returns (address); + + function isTokenRegisteredBySymbol( + string symbol + ) + public + view + returns (bool); + + function isTokenRegistered( + address addr + ) + public + view + returns (bool); + + function getTokens( + uint start, + uint count + ) + public + view + returns (address[] addressList); +} diff --git a/contracts/ITokenTransferDelegate.sol b/contracts/ITokenTransferDelegate.sol new file mode 100644 index 00000000..46aa535c --- /dev/null +++ b/contracts/ITokenTransferDelegate.sol @@ -0,0 +1,138 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title ITokenTransferDelegate +/// @dev Acts as a middle man to transfer ERC20 tokens on behalf of different +/// versions of Loopring protocol to avoid ERC20 re-authorization. +/// @author Daniel Wang - . +contract ITokenTransferDelegate { + event AddressAuthorized( + address indexed addr, + uint32 number + ); + + event AddressDeauthorized( + address indexed addr, + uint32 number + ); + + // The following map is used to keep trace of order fill and cancellation + // history. + mapping (bytes32 => uint) public cancelledOrFilled; + + // This map is used to keep trace of order's cancellation history. + mapping (bytes32 => uint) public cancelled; + + // A map from address to its cutoff timestamp. + mapping (address => uint) public cutoffs; + + // A map from address to its trading-pair cutoff timestamp. + mapping (address => mapping (bytes20 => uint)) public tradingPairCutoffs; + + /// @dev Add a Loopring protocol address. + /// @param addr A loopring protocol address. + function authorizeAddress( + address addr + ) + external; + + /// @dev Remove a Loopring protocol address. + /// @param addr A loopring protocol address. + function deauthorizeAddress( + address addr + ) + external; + + function getLatestAuthorizedAddresses( + uint max + ) + external + view + returns (address[] addresses); + + /// @dev Invoke ERC20 transferFrom method. + /// @param token Address of token to transfer. + /// @param from Address to transfer token from. + /// @param to Address to transfer token to. + /// @param value Amount of token to transfer. + function transferToken( + address token, + address from, + address to, + uint value + ) + external; + + function batchUpdateHistoryAndTransferTokens( + address lrcTokenAddress, + address minerFeeRecipient, + bytes32[] historyBatch, + bytes32[] transferBatch + ) + external; + + function isAddressAuthorized( + address addr + ) + public + view + returns (bool); + + function addCancelled( + bytes32 orderHash, + uint cancelAmount + ) + external; + + function addCancelledOrFilled( + bytes32 orderHash, + uint cancelOrFillAmount + ) + external; + + function setCutoffs( + uint cutoff + ) + external; + + function setTradingPairCutoffs( + bytes20 tokenPair, + uint cutoff + ) + external; + + function checkCutoffsBatch( + address[] owners, + bytes20[] tradingPairs, + uint[] validSince + ) + external + view; + + function suspend() + external; + + function resume() + external; + + function kill() + external; +} diff --git a/contracts/ITransferableMultsig.sol b/contracts/ITransferableMultsig.sol new file mode 100644 index 00000000..a0818751 --- /dev/null +++ b/contracts/ITransferableMultsig.sol @@ -0,0 +1,45 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title ITransferableMultsig +/// @author Daniel Wang - . +contract ITransferableMultsig { + // Note that address recovered from signatures must be strictly increasing. + function execute( + uint8[] sigV, + bytes32[] sigR, + bytes32[] sigS, + address destination, + uint value, + bytes data + ) + external; + + // Note that address recovered from signatures must be strictly increasing. + function transferOwnership( + uint8[] sigV, + bytes32[] sigR, + bytes32[] sigS, + uint _threshold, + address[] _owners + ) + external; +} diff --git a/contracts/TokenFactory.sol b/contracts/TokenFactory.sol index 86ba3a8d..fadff1c1 100644 --- a/contracts/TokenFactory.sol +++ b/contracts/TokenFactory.sol @@ -18,28 +18,40 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "./lib/AddressUtil.sol"; +import "./lib/ERC20Token.sol"; +import "./lib/StringUtil.sol"; +import "./ITokenFactory.sol"; +import "./ITokenRegistry.sol"; -/// @title ERC20 Token Mint -/// @dev This contract deploys ERC20 token contract and registered the contract -/// so the token can be traded with Loopring Protocol. + +/// @title An Implementation of ITokenFactory. /// @author Kongliang Zhong - , /// @author Daniel Wang - . -contract TokenFactory { - event TokenCreated( - address indexed addr, - string name, - string symbol, - uint8 decimals, - uint totalSupply, - address firstHolder - ); - - /// @dev Deploy an ERC20 token contract, register it with TokenRegistry, - /// and returns the new token's address. - /// @param name The name of the token - /// @param symbol The symbol of the token. - /// @param decimals The decimals of the token. - /// @param totalSupply The total supply of the token. +contract TokenFactoryImpl is ITokenFactory { + using AddressUtil for address; + using StringUtil for string; + + mapping(bytes10 => address) public tokens; + address public tokenRegistry; + + /// @dev Disable default function. + function () + payable + external + { + revert(); + } + + constructor( + address _tokenRegistry + ) + public + { + require(tokenRegistry == 0x0 && _tokenRegistry.isContract()); + tokenRegistry = _tokenRegistry; + } + function createToken( string name, string symbol, @@ -47,5 +59,32 @@ contract TokenFactory { uint totalSupply ) external - returns (address addr); + returns (address addr) + { + require(symbol.checkStringLength(3, 10), "bad symbol size"); + + bytes10 symbolBytes = symbol.stringToBytes10(); + require(tokens[symbolBytes] == 0x0, "invalid symbol"); + + ERC20Token token = new ERC20Token( + name, + symbol, + decimals, + totalSupply, + tx.origin + ); + + addr = address(token); + ITokenRegistry(tokenRegistry).registerMintedToken(addr, symbol); + tokens[symbolBytes] = addr; + + emit TokenCreated( + addr, + name, + symbol, + decimals, + totalSupply, + tx.origin + ); + } } diff --git a/contracts/TokenFactoryImpl.sol b/contracts/TokenFactoryImpl.sol deleted file mode 100644 index db6dae88..00000000 --- a/contracts/TokenFactoryImpl.sol +++ /dev/null @@ -1,90 +0,0 @@ -/* - - Copyright 2017 Loopring Project Ltd (Loopring Foundation). - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -pragma solidity 0.4.23; -pragma experimental "v0.5.0"; -pragma experimental "ABIEncoderV2"; - -import "./lib/AddressUtil.sol"; -import "./lib/ERC20Token.sol"; -import "./lib/StringUtil.sol"; -import "./TokenFactory.sol"; -import "./TokenRegistry.sol"; - - -/// @title An Implementation of TokenFactory. -/// @author Kongliang Zhong - , -/// @author Daniel Wang - . -contract TokenFactoryImpl is TokenFactory { - using AddressUtil for address; - using StringUtil for string; - - mapping(bytes10 => address) public tokens; - address public tokenRegistry; - - /// @dev Disable default function. - function () - payable - external - { - revert(); - } - - constructor( - address _tokenRegistry - ) - public - { - require(tokenRegistry == 0x0 && _tokenRegistry.isContract()); - tokenRegistry = _tokenRegistry; - } - - function createToken( - string name, - string symbol, - uint8 decimals, - uint totalSupply - ) - external - returns (address addr) - { - require(symbol.checkStringLength(3, 10), "bad symbol size"); - - bytes10 symbolBytes = symbol.stringToBytes10(); - require(tokens[symbolBytes] == 0x0, "invalid symbol"); - - ERC20Token token = new ERC20Token( - name, - symbol, - decimals, - totalSupply, - tx.origin - ); - - addr = address(token); - TokenRegistry(tokenRegistry).registerMintedToken(addr, symbol); - tokens[symbolBytes] = addr; - - emit TokenCreated( - addr, - name, - symbol, - decimals, - totalSupply, - tx.origin - ); - } -} diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index 3a1727c1..0be2e7f1 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -18,67 +18,128 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "./lib/AddressUtil.sol"; +import "./lib/Claimable.sol"; +import "./ITokenRegistry.sol"; -/// @title Token Register Contract -/// @dev This contract maintains a list of tokens the Protocol supports. + +/// @title An Implementation of TokenRegistry. /// @author Kongliang Zhong - , /// @author Daniel Wang - . -contract TokenRegistry { - event TokenRegistered( - address indexed addr, - string symbol - ); +contract TokenRegistry is ITokenRegistry, Claimable { + using AddressUtil for address; + + address[] public addresses; + mapping (address => TokenInfo) addressMap; + mapping (string => address) symbolMap; + + struct TokenInfo { + uint pos; // 0 mens unregistered; if > 0, pos - 1 is the + // token's position in `addresses`. + string symbol; // Symbol of the token + } - event TokenUnregistered( - address indexed addr, - string symbol - ); + /// @dev Disable default function. + function () + payable + external + { + revert(); + } function registerToken( address addr, string symbol ) - external; + external + onlyOwner + { + registerTokenInternal(addr, symbol); + } function registerMintedToken( address addr, string symbol ) - external; + external + { + registerTokenInternal(addr, symbol); + } function unregisterToken( address addr, string symbol ) - external; + external + onlyOwner + { + require(addr != 0x0,"bad address"); + require(symbolMap[symbol] == addr, "token not found"); + delete symbolMap[symbol]; + + uint pos = addressMap[addr].pos; + require(pos != 0); + delete addressMap[addr]; + + // We will replace the token we need to unregister with the last token + // Only the pos of the last token will need to be updated + address lastToken = addresses[addresses.length - 1]; + + // Don't do anything if the last token is the one we want to delete + if (addr != lastToken) { + // Swap with the last token and update the pos + addresses[pos - 1] = lastToken; + addressMap[lastToken].pos = pos; + } + addresses.length--; + + emit TokenUnregistered(addr, symbol); + } function areAllTokensRegistered( address[] addressList ) external view - returns (bool); + returns (bool) + { + for (uint i = 0; i < addressList.length; i++) { + if (addressMap[addressList[i]].pos == 0) { + return false; + } + } + return true; + } function getAddressBySymbol( string symbol ) external view - returns (address); + returns (address) + { + return symbolMap[symbol]; + } function isTokenRegisteredBySymbol( string symbol ) public view - returns (bool); + returns (bool) + { + return symbolMap[symbol] != 0x0; + } function isTokenRegistered( address addr ) public view - returns (bool); + returns (bool) + { + return addressMap[addr].pos != 0; + } function getTokens( uint start, @@ -86,5 +147,55 @@ contract TokenRegistry { ) public view - returns (address[] addressList); + returns (address[] addressList) + { + uint num = addresses.length; + + if (start >= num) { + return; + } + + uint end = start + count; + if (end > num) { + end = num; + } + + if (start == num) { + return; + } + + addressList = new address[](end - start); + for (uint i = start; i < end; i++) { + addressList[i - start] = addresses[i]; + } + } + + // address[] public addresses; + // mapping (address => TokenInfo) addressMap; + // mapping (string => address) symbolMap; + + // struct TokenInfo { + // uint pos; // 0 mens unregistered; if > 0, pos - 1 is the + // // token's position in `addresses`. + // string symbol; // Symbol of the token + // } + + + function registerTokenInternal( + address addr, + string symbol + ) + internal + { + require(0x0 != addr, "bad address"); + require(bytes(symbol).length > 0, "empty symbol"); + require(0x0 == symbolMap[symbol], "symbol registered"); + require(0 == addressMap[addr].pos, "address registered"); + + addresses.push(addr); + symbolMap[symbol] = addr; + addressMap[addr] = TokenInfo(addresses.length, symbol); + + emit TokenRegistered(addr, symbol); + } } diff --git a/contracts/TokenRegistryImpl.sol b/contracts/TokenRegistryImpl.sol deleted file mode 100644 index 4f1b0e6a..00000000 --- a/contracts/TokenRegistryImpl.sol +++ /dev/null @@ -1,201 +0,0 @@ -/* - - Copyright 2017 Loopring Project Ltd (Loopring Foundation). - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -pragma solidity 0.4.23; -pragma experimental "v0.5.0"; -pragma experimental "ABIEncoderV2"; - -import "./lib/AddressUtil.sol"; -import "./lib/Claimable.sol"; -import "./TokenRegistry.sol"; - - -/// @title An Implementation of TokenRegistry. -/// @author Kongliang Zhong - , -/// @author Daniel Wang - . -contract TokenRegistryImpl is TokenRegistry, Claimable { - using AddressUtil for address; - - address[] public addresses; - mapping (address => TokenInfo) addressMap; - mapping (string => address) symbolMap; - - struct TokenInfo { - uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // token's position in `addresses`. - string symbol; // Symbol of the token - } - - /// @dev Disable default function. - function () - payable - external - { - revert(); - } - - function registerToken( - address addr, - string symbol - ) - external - onlyOwner - { - registerTokenInternal(addr, symbol); - } - - function registerMintedToken( - address addr, - string symbol - ) - external - { - registerTokenInternal(addr, symbol); - } - - function unregisterToken( - address addr, - string symbol - ) - external - onlyOwner - { - require(addr != 0x0,"bad address"); - require(symbolMap[symbol] == addr, "token not found"); - delete symbolMap[symbol]; - - uint pos = addressMap[addr].pos; - require(pos != 0); - delete addressMap[addr]; - - // We will replace the token we need to unregister with the last token - // Only the pos of the last token will need to be updated - address lastToken = addresses[addresses.length - 1]; - - // Don't do anything if the last token is the one we want to delete - if (addr != lastToken) { - // Swap with the last token and update the pos - addresses[pos - 1] = lastToken; - addressMap[lastToken].pos = pos; - } - addresses.length--; - - emit TokenUnregistered(addr, symbol); - } - - function areAllTokensRegistered( - address[] addressList - ) - external - view - returns (bool) - { - for (uint i = 0; i < addressList.length; i++) { - if (addressMap[addressList[i]].pos == 0) { - return false; - } - } - return true; - } - - function getAddressBySymbol( - string symbol - ) - external - view - returns (address) - { - return symbolMap[symbol]; - } - - function isTokenRegisteredBySymbol( - string symbol - ) - public - view - returns (bool) - { - return symbolMap[symbol] != 0x0; - } - - function isTokenRegistered( - address addr - ) - public - view - returns (bool) - { - return addressMap[addr].pos != 0; - } - - function getTokens( - uint start, - uint count - ) - public - view - returns (address[] addressList) - { - uint num = addresses.length; - - if (start >= num) { - return; - } - - uint end = start + count; - if (end > num) { - end = num; - } - - if (start == num) { - return; - } - - addressList = new address[](end - start); - for (uint i = start; i < end; i++) { - addressList[i - start] = addresses[i]; - } - } - - // address[] public addresses; - // mapping (address => TokenInfo) addressMap; - // mapping (string => address) symbolMap; - - // struct TokenInfo { - // uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // // token's position in `addresses`. - // string symbol; // Symbol of the token - // } - - - function registerTokenInternal( - address addr, - string symbol - ) - internal - { - require(0x0 != addr, "bad address"); - require(bytes(symbol).length > 0, "empty symbol"); - require(0x0 == symbolMap[symbol], "symbol registered"); - require(0 == addressMap[addr].pos, "address registered"); - - addresses.push(addr); - symbolMap[symbol] = addr; - addressMap[addr] = TokenInfo(addresses.length, symbol); - - emit TokenRegistered(addr, symbol); - } -} diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TokenTransferDelegate.sol index df9b262b..db4da789 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TokenTransferDelegate.sol @@ -18,106 +18,353 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "./lib/Claimable.sol"; +import "./lib/ERC20.sol"; +import "./lib/MathUint.sol"; +import "./IBrokerInterceptor.sol"; +import "./ITokenTransferDelegate.sol"; -/// @title TokenTransferDelegate -/// @dev Acts as a middle man to transfer ERC20 tokens on behalf of different -/// versions of Loopring protocol to avoid ERC20 re-authorization. + +/// @title An Implementation of ITokenTransferDelegate. /// @author Daniel Wang - . -contract TokenTransferDelegate { - event AddressAuthorized( - address indexed addr, - uint32 number - ); +/// @author Kongliang Zhong - . +contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { + using MathUint for uint; + + uint8 public walletSplitPercentage = 0; + + constructor( + uint8 _walletSplitPercentage + ) + public + { + require(_walletSplitPercentage >= 0 && _walletSplitPercentage <= 100); + walletSplitPercentage = _walletSplitPercentage; + } + + bool public suspended = false; - event AddressDeauthorized( - address indexed addr, - uint32 number - ); + struct AddressInfo { + address previous; + uint32 index; + bool authorized; + } - // The following map is used to keep trace of order fill and cancellation - // history. - mapping (bytes32 => uint) public cancelledOrFilled; + mapping(address => AddressInfo) public addressInfos; + address public latestAddress; - // This map is used to keep trace of order's cancellation history. - mapping (bytes32 => uint) public cancelled; + modifier onlyAuthorized() + { + require(addressInfos[msg.sender].authorized, "unauthorized"); + _; + } - // A map from address to its cutoff timestamp. - mapping (address => uint) public cutoffs; + modifier notSuspended() + { + require(!suspended); + _; + } - // A map from address to its trading-pair cutoff timestamp. - mapping (address => mapping (bytes20 => uint)) public tradingPairCutoffs; + modifier isSuspended() + { + require(suspended); + _; + } + + /// @dev Disable default function. + function () + payable + external + { + revert(); + } - /// @dev Add a Loopring protocol address. - /// @param addr A loopring protocol address. function authorizeAddress( address addr ) - external; + onlyOwner + external + { + AddressInfo storage addrInfo = addressInfos[addr]; + + if (addrInfo.index != 0) { // existing + if (addrInfo.authorized == false) { // re-authorize + addrInfo.authorized = true; + emit AddressAuthorized(addr, addrInfo.index); + } + } else { + address prev = latestAddress; + if (prev == 0x0) { + addrInfo.index = 1; + addrInfo.authorized = true; + } else { + addrInfo.previous = prev; + addrInfo.index = addressInfos[prev].index + 1; + + } + addrInfo.authorized = true; + latestAddress = addr; + emit AddressAuthorized(addr, addrInfo.index); + } + } - /// @dev Remove a Loopring protocol address. - /// @param addr A loopring protocol address. function deauthorizeAddress( address addr ) - external; + onlyOwner + external + { + uint32 index = addressInfos[addr].index; + if (index != 0) { + addressInfos[addr].authorized = false; + emit AddressDeauthorized(addr, index); + } + } function getLatestAuthorizedAddresses( uint max ) external view - returns (address[] addresses); + returns (address[] addresses) + { + addresses = new address[](max); + address addr = latestAddress; + AddressInfo memory addrInfo; + uint count = 0; + + while (addr != 0x0 && count < max) { + addrInfo = addressInfos[addr]; + if (addrInfo.index == 0) { + break; + } + addresses[count++] = addr; + addr = addrInfo.previous; + } + } - /// @dev Invoke ERC20 transferFrom method. - /// @param token Address of token to transfer. - /// @param from Address to transfer token from. - /// @param to Address to transfer token to. - /// @param value Amount of token to transfer. function transferToken( address token, address from, address to, uint value ) - external; + onlyAuthorized + notSuspended + external + { + if (value > 0 && from != to && to != 0x0) { + require( + ERC20(token).transferFrom(from, to, value), + "token transfer failure" + ); + } + } function batchUpdateHistoryAndTransferTokens( - address lrcTokenAddress, - address minerFeeRecipient, + address lrcAddr, + address miner, bytes32[] historyBatch, - bytes32[] transferBatch + bytes32[] batch ) - external; + onlyAuthorized + notSuspended + external + { + // require(batch.length % 9 == 0); + // require(historyBatch.length % 2 == 0); + // require(batch.length / 9 == historyBatch.length / 2); + uint i; + for (i = 0; i < historyBatch.length / 2; i += 2) { + cancelledOrFilled[historyBatch[i]] = + cancelledOrFilled[historyBatch[i]].add(uint(historyBatch[i + 1])); + } + + address prevOwner = address(batch[batch.length - 9]); + + for (i = 0; i < batch.length; i += 9) { + address owner = address(batch[i]); + address signer = address(batch[i + 1]); + address brokerInterceptor = address(batch[i + 2]); + + // Pay token to previous order, or to miner as previous order's + // margin split or/and this order's margin split. + address token = address(batch[i + 3]); + uint amount; + + // Here batch[i + 4] has been checked not to be 0. + if (owner != prevOwner) { + amount = uint(batch[i + 4]); + if (amount > 0) { + require( + ERC20(token).transferFrom( + owner, + prevOwner, + amount + ), + "token transfer failure" + ); + } + + if (brokerInterceptor != 0x0) { + require( + IBrokerInterceptor(brokerInterceptor).onTokenSpent( + owner, + signer, + token, + amount + ), + "brokerInterceptor update failure" + ); + } + } + + // Miner pays LRx fee to order owner + amount = uint(batch[i + 6]); + if (amount != 0 && miner != owner) { + require( + ERC20(lrcAddr).transferFrom( + miner, + owner, + amount + ), + "token transfer failure" + ); + } + + // Split margin-split income between miner and wallet + splitPayFee( + token, + owner, + miner, + signer, + brokerInterceptor, + address(batch[i + 8]), + uint(batch[i + 5]) + ); + + // Split LRC fee income between miner and wallet + splitPayFee( + lrcAddr, + owner, + miner, + signer, + brokerInterceptor, + address(batch[i + 8]), + uint(batch[i + 7]) + ); + + prevOwner = owner; + } + } function isAddressAuthorized( address addr ) public view - returns (bool); + returns (bool) + { + return addressInfos[addr].authorized; + } + + function splitPayFee( + address token, + address owner, + address miner, + address broker, + address brokerInterceptor, + address wallet, + uint fee + ) + internal + { + if (fee == 0) { + return; + } + + uint walletFee = (wallet == 0x0) ? 0 : fee.mul(walletSplitPercentage) / 100; + uint minerFee = fee.sub(walletFee); + + if (walletFee > 0 && wallet != owner) { + require( + ERC20(token).transferFrom( + owner, + wallet, + walletFee + ), + "token transfer failure" + ); + } + + if (minerFee > 0 && miner != 0x0 && miner != owner) { + require( + ERC20(token).transferFrom( + owner, + miner, + minerFee + ), + "token transfer failure" + ); + } + + if (broker != 0x0) { + require( + IBrokerInterceptor(brokerInterceptor).onTokenSpent( + owner, + broker, + token, + fee + ), + "token transfer failure" + ); + } + } function addCancelled( bytes32 orderHash, - uint cancelAmount + uint cancelAmount ) - external; + onlyAuthorized + notSuspended + external + { + cancelled[orderHash] = cancelled[orderHash].add(cancelAmount); + } function addCancelledOrFilled( bytes32 orderHash, - uint cancelOrFillAmount + uint cancelOrFillAmount ) - external; + onlyAuthorized + notSuspended + external + { + cancelledOrFilled[orderHash] = + cancelledOrFilled[orderHash].add(cancelOrFillAmount); + } + function setCutoffs( uint cutoff ) - external; + onlyAuthorized + notSuspended + external + { + cutoffs[tx.origin] = cutoff; + } function setTradingPairCutoffs( bytes20 tokenPair, - uint cutoff + uint cutoff ) - external; + onlyAuthorized + notSuspended + external + { + tradingPairCutoffs[tx.origin][tokenPair] = cutoff; + } function checkCutoffsBatch( address[] owners, @@ -125,14 +372,41 @@ contract TokenTransferDelegate { uint[] validSince ) external - view; + view + { + uint len = owners.length; + require(len == tradingPairs.length); + require(len == validSince.length); + + for(uint i = 0; i < len; i++) { + require(validSince[i] > tradingPairCutoffs[owners[i]][tradingPairs[i]]); // order trading pair is cut off + require(validSince[i] > cutoffs[owners[i]]); // order is cut off + } + } function suspend() - external; + onlyOwner + notSuspended + external + { + suspended = true; + } function resume() - external; + onlyOwner + isSuspended + external + { + suspended = false; + } + /// owner must suspend delegate first before invoke kill method. function kill() - external; + onlyOwner + isSuspended + external + { + owner = 0x0; + emit OwnershipTransferred(owner, 0x0); + } } diff --git a/contracts/TokenTransferDelegateImpl.sol b/contracts/TokenTransferDelegateImpl.sol deleted file mode 100644 index 091e384d..00000000 --- a/contracts/TokenTransferDelegateImpl.sol +++ /dev/null @@ -1,412 +0,0 @@ -/* - - Copyright 2017 Loopring Project Ltd (Loopring Foundation). - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -pragma solidity 0.4.23; -pragma experimental "v0.5.0"; -pragma experimental "ABIEncoderV2"; - -import "./lib/Claimable.sol"; -import "./lib/ERC20.sol"; -import "./lib/MathUint.sol"; -import "./BrokerInterceptor.sol"; -import "./TokenTransferDelegate.sol"; - - -/// @title An Implementation of TokenTransferDelegate. -/// @author Daniel Wang - . -/// @author Kongliang Zhong - . -contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable { - using MathUint for uint; - - uint8 public walletSplitPercentage = 0; - - constructor( - uint8 _walletSplitPercentage - ) - public - { - require(_walletSplitPercentage >= 0 && _walletSplitPercentage <= 100); - walletSplitPercentage = _walletSplitPercentage; - } - - bool public suspended = false; - - struct AddressInfo { - address previous; - uint32 index; - bool authorized; - } - - mapping(address => AddressInfo) public addressInfos; - address public latestAddress; - - modifier onlyAuthorized() - { - require(addressInfos[msg.sender].authorized, "unauthorized"); - _; - } - - modifier notSuspended() - { - require(!suspended); - _; - } - - modifier isSuspended() - { - require(suspended); - _; - } - - /// @dev Disable default function. - function () - payable - external - { - revert(); - } - - function authorizeAddress( - address addr - ) - onlyOwner - external - { - AddressInfo storage addrInfo = addressInfos[addr]; - - if (addrInfo.index != 0) { // existing - if (addrInfo.authorized == false) { // re-authorize - addrInfo.authorized = true; - emit AddressAuthorized(addr, addrInfo.index); - } - } else { - address prev = latestAddress; - if (prev == 0x0) { - addrInfo.index = 1; - addrInfo.authorized = true; - } else { - addrInfo.previous = prev; - addrInfo.index = addressInfos[prev].index + 1; - - } - addrInfo.authorized = true; - latestAddress = addr; - emit AddressAuthorized(addr, addrInfo.index); - } - } - - function deauthorizeAddress( - address addr - ) - onlyOwner - external - { - uint32 index = addressInfos[addr].index; - if (index != 0) { - addressInfos[addr].authorized = false; - emit AddressDeauthorized(addr, index); - } - } - - function getLatestAuthorizedAddresses( - uint max - ) - external - view - returns (address[] addresses) - { - addresses = new address[](max); - address addr = latestAddress; - AddressInfo memory addrInfo; - uint count = 0; - - while (addr != 0x0 && count < max) { - addrInfo = addressInfos[addr]; - if (addrInfo.index == 0) { - break; - } - addresses[count++] = addr; - addr = addrInfo.previous; - } - } - - function transferToken( - address token, - address from, - address to, - uint value - ) - onlyAuthorized - notSuspended - external - { - if (value > 0 && from != to && to != 0x0) { - require( - ERC20(token).transferFrom(from, to, value), - "token transfer failure" - ); - } - } - - function batchUpdateHistoryAndTransferTokens( - address lrcAddr, - address miner, - bytes32[] historyBatch, - bytes32[] batch - ) - onlyAuthorized - notSuspended - external - { - // require(batch.length % 9 == 0); - // require(historyBatch.length % 2 == 0); - // require(batch.length / 9 == historyBatch.length / 2); - uint i; - for (i = 0; i < historyBatch.length / 2; i += 2) { - cancelledOrFilled[historyBatch[i]] = - cancelledOrFilled[historyBatch[i]].add(uint(historyBatch[i + 1])); - } - - address prevOwner = address(batch[batch.length - 9]); - - for (i = 0; i < batch.length; i += 9) { - address owner = address(batch[i]); - address signer = address(batch[i + 1]); - address tracker = address(batch[i + 2]); - - // Pay token to previous order, or to miner as previous order's - // margin split or/and this order's margin split. - address token = address(batch[i + 3]); - uint amount; - - // Here batch[i + 4] has been checked not to be 0. - if (owner != prevOwner) { - amount = uint(batch[i + 4]); - if (amount > 0) { - require( - ERC20(token).transferFrom( - owner, - prevOwner, - amount - ), - "token transfer failure" - ); - } - - if (tracker != 0x0) { - require( - BrokerInterceptor(tracker).onTokenSpent( - owner, - signer, - token, - amount - ), - "tracker update failure" - ); - } - } - - // Miner pays LRx fee to order owner - amount = uint(batch[i + 6]); - if (amount != 0 && miner != owner) { - require( - ERC20(lrcAddr).transferFrom( - miner, - owner, - amount - ), - "token transfer failure" - ); - } - - // Split margin-split income between miner and wallet - splitPayFee( - token, - owner, - miner, - signer, - tracker, - address(batch[i + 8]), - uint(batch[i + 5]) - ); - - // Split LRC fee income between miner and wallet - splitPayFee( - lrcAddr, - owner, - miner, - signer, - tracker, - address(batch[i + 8]), - uint(batch[i + 7]) - ); - - prevOwner = owner; - } - } - - function isAddressAuthorized( - address addr - ) - public - view - returns (bool) - { - return addressInfos[addr].authorized; - } - - function splitPayFee( - address token, - address owner, - address miner, - address broker, - address tracker, - address wallet, - uint fee - ) - internal - { - if (fee == 0) { - return; - } - - uint walletFee = (wallet == 0x0) ? 0 : fee.mul(walletSplitPercentage) / 100; - uint minerFee = fee.sub(walletFee); - - if (walletFee > 0 && wallet != owner) { - require( - ERC20(token).transferFrom( - owner, - wallet, - walletFee - ), - "token transfer failure" - ); - } - - if (minerFee > 0 && miner != 0x0 && miner != owner) { - require( - ERC20(token).transferFrom( - owner, - miner, - minerFee - ), - "token transfer failure" - ); - } - - if (broker != 0x0) { - require( - BrokerInterceptor(tracker).onTokenSpent( - owner, - broker, - token, - fee - ), - "token transfer failure" - ); - } - } - - function addCancelled( - bytes32 orderHash, - uint cancelAmount - ) - onlyAuthorized - notSuspended - external - { - cancelled[orderHash] = cancelled[orderHash].add(cancelAmount); - } - - function addCancelledOrFilled( - bytes32 orderHash, - uint cancelOrFillAmount - ) - onlyAuthorized - notSuspended - external - { - cancelledOrFilled[orderHash] = - cancelledOrFilled[orderHash].add(cancelOrFillAmount); - } - - - function setCutoffs( - uint cutoff - ) - onlyAuthorized - notSuspended - external - { - cutoffs[tx.origin] = cutoff; - } - - function setTradingPairCutoffs( - bytes20 tokenPair, - uint cutoff - ) - onlyAuthorized - notSuspended - external - { - tradingPairCutoffs[tx.origin][tokenPair] = cutoff; - } - - function checkCutoffsBatch( - address[] owners, - bytes20[] tradingPairs, - uint[] validSince - ) - external - view - { - uint len = owners.length; - require(len == tradingPairs.length); - require(len == validSince.length); - - for(uint i = 0; i < len; i++) { - require(validSince[i] > tradingPairCutoffs[owners[i]][tradingPairs[i]]); // order trading pair is cut off - require(validSince[i] > cutoffs[owners[i]]); // order is cut off - } - } - - function suspend() - onlyOwner - notSuspended - external - { - suspended = true; - } - - function resume() - onlyOwner - isSuspended - external - { - suspended = false; - } - - /// owner must suspend delegate first before invoke kill method. - function kill() - onlyOwner - isSuspended - external - { - owner = 0x0; - emit OwnershipTransferred(owner, 0x0); - } -} diff --git a/contracts/TransferableMultsig.sol b/contracts/TransferableMultsig.sol index a049ddb0..7ef0542b 100644 --- a/contracts/TransferableMultsig.sol +++ b/contracts/TransferableMultsig.sol @@ -18,11 +18,34 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "./ITransferableMultsig.sol"; -/// @title Transferable Multisignature Contract + +/// @title An Implementation of ITransferableMultsig /// @author Daniel Wang - . -contract TransferableMultsig { - // Note that address recovered from signatures must be strictly increasing. +contract TransferableMultsig is ITransferableMultsig { + + uint public nonce; // (only) mutable state + uint public threshold; // immutable state + mapping (address => bool) ownerMap; // immutable state + address[] public owners; // immutable state + + constructor( + uint _threshold, + address[] _owners + ) + public + { + updateOwners(_threshold, _owners); + } + + // default function does nothing. + function () + payable + external + { + } + function execute( uint8[] sigV, bytes32[] sigR, @@ -31,9 +54,33 @@ contract TransferableMultsig { uint value, bytes data ) - external; + external + { + // Follows ERC191 signature scheme: + // https://github.com/ethereum/EIPs/issues/191 + bytes32 txHash = keccak256( + byte(0x19), + byte(0), + this, + nonce++, + destination, + value, + data + ); + + verifySignatures( + sigV, + sigR, + sigS, + txHash + ); + + require( + destination.call.value(value)(data), + "execution error" + ); + } - // Note that address recovered from signatures must be strictly increasing. function transferOwnership( uint8[] sigV, bytes32[] sigR, @@ -41,5 +88,81 @@ contract TransferableMultsig { uint _threshold, address[] _owners ) - external; + external + { + // Follows ERC191 signature scheme: + // https://github.com/ethereum/EIPs/issues/191 + bytes32 txHash = keccak256( + byte(0x19), + byte(0), + this, + nonce++, + _threshold, + _owners + ); + + verifySignatures( + sigV, + sigR, + sigS, + txHash + ); + updateOwners(_threshold, _owners); + } + + function verifySignatures( + uint8[] sigV, + bytes32[] sigR, + bytes32[] sigS, + bytes32 txHash + ) + view + internal + { + uint _threshold = threshold; + require(_threshold == sigR.length); + require(_threshold == sigS.length); + require(_threshold == sigV.length); + + address lastAddr = 0x0; // cannot have 0x0 as an owner + for (uint i = 0; i < threshold; i++) { + address recovered = ecrecover( + txHash, + sigV[i], + sigR[i], + sigS[i] + ); + + require(recovered > lastAddr && ownerMap[recovered]); + lastAddr = recovered; + } + } + + function updateOwners( + uint _threshold, + address[] _owners + ) + internal + { + require(_owners.length <= 10); + require(_threshold <= _owners.length); + require(_threshold != 0); + + // remove all current owners from ownerMap. + address[] memory currentOwners = owners; + for (uint i = 0; i < currentOwners.length; i++) { + ownerMap[currentOwners[i]] = false; + } + + address lastAddr = 0x0; + for (uint i = 0; i < _owners.length; i++) { + address owner = _owners[i]; + require(owner > lastAddr); + + ownerMap[owner] = true; + lastAddr = owner; + } + owners = _owners; + threshold = _threshold; + } } diff --git a/contracts/TransferableMultsigImpl.sol b/contracts/TransferableMultsigImpl.sol deleted file mode 100644 index 477cbf3f..00000000 --- a/contracts/TransferableMultsigImpl.sol +++ /dev/null @@ -1,168 +0,0 @@ -/* - - Copyright 2017 Loopring Project Ltd (Loopring Foundation). - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -pragma solidity 0.4.23; -pragma experimental "v0.5.0"; -pragma experimental "ABIEncoderV2"; - -import "./TransferableMultsig.sol"; - - -/// @title An Implementation of TransferableMultsig。 -/// @author Daniel Wang - . -contract TransferableMultsigImpl is TransferableMultsig { - - uint public nonce; // (only) mutable state - uint public threshold; // immutable state - mapping (address => bool) ownerMap; // immutable state - address[] public owners; // immutable state - - constructor( - uint _threshold, - address[] _owners - ) - public - { - updateOwners(_threshold, _owners); - } - - // default function does nothing. - function () - payable - external - { - } - - function execute( - uint8[] sigV, - bytes32[] sigR, - bytes32[] sigS, - address destination, - uint value, - bytes data - ) - external - { - // Follows ERC191 signature scheme: - // https://github.com/ethereum/EIPs/issues/191 - bytes32 txHash = keccak256( - byte(0x19), - byte(0), - this, - nonce++, - destination, - value, - data - ); - - verifySignatures( - sigV, - sigR, - sigS, - txHash - ); - - require( - destination.call.value(value)(data), - "execution error" - ); - } - - function transferOwnership( - uint8[] sigV, - bytes32[] sigR, - bytes32[] sigS, - uint _threshold, - address[] _owners - ) - external - { - // Follows ERC191 signature scheme: - // https://github.com/ethereum/EIPs/issues/191 - bytes32 txHash = keccak256( - byte(0x19), - byte(0), - this, - nonce++, - _threshold, - _owners - ); - - verifySignatures( - sigV, - sigR, - sigS, - txHash - ); - updateOwners(_threshold, _owners); - } - - function verifySignatures( - uint8[] sigV, - bytes32[] sigR, - bytes32[] sigS, - bytes32 txHash - ) - view - internal - { - uint _threshold = threshold; - require(_threshold == sigR.length); - require(_threshold == sigS.length); - require(_threshold == sigV.length); - - address lastAddr = 0x0; // cannot have 0x0 as an owner - for (uint i = 0; i < threshold; i++) { - address recovered = ecrecover( - txHash, - sigV[i], - sigR[i], - sigS[i] - ); - - require(recovered > lastAddr && ownerMap[recovered]); - lastAddr = recovered; - } - } - - function updateOwners( - uint _threshold, - address[] _owners - ) - internal - { - require(_owners.length <= 10); - require(_threshold <= _owners.length); - require(_threshold != 0); - - // remove all current owners from ownerMap. - address[] memory currentOwners = owners; - for (uint i = 0; i < currentOwners.length; i++) { - ownerMap[currentOwners[i]] = false; - } - - address lastAddr = 0x0; - for (uint i = 0; i < _owners.length; i++) { - address owner = _owners[i]; - require(owner > lastAddr); - - ownerMap[owner] = true; - lastAddr = owner; - } - owners = _owners; - threshold = _threshold; - } -} From 38c9d0f0cb64dc1ef7b3d7f2860d95a34d308594 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 30 Apr 2018 12:50:59 -0400 Subject: [PATCH 28/68] fix issues (#342) * fix issues * fix issues * fix issues --- contracts/Exchange.sol | 121 ++++++++++++++++----------- contracts/IExchange.sol | 24 ++++-- contracts/ITokenTransferDelegate.sol | 5 +- contracts/TokenTransferDelegate.sol | 73 ++++++++-------- 4 files changed, 131 insertions(+), 92 deletions(-) diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index 1b6be0b3..d6545601 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -67,7 +67,7 @@ contract Exchange is IExchange { struct Order { address owner; - address signer; + address broker; address tokenS; address tokenB; address wallet; @@ -100,7 +100,7 @@ contract Exchange is IExchange { uint[6][] valuesList; uint8[] optionList; bytes[] sigList; - address miner; + address feeRecipient; address interceptor; uint8 feeSelections; uint64 ringIndex; @@ -181,28 +181,22 @@ contract Exchange is IExchange { 0 ); require( - msg.sender == order.signer, - "cancelOrder not submitted by signer" + tx.origin == order.broker, + "cancelOrder not submitted by broker" ); bytes32 orderHash = calculateOrderHash(order); MultihashUtil.verifySignature( - order.signer, + order.broker, orderHash, sig ); - if (order.signer != order.owner) { - IBrokerRegistry brokerRegistry = IBrokerRegistry(brokerRegistryAddress); - bool registered; - address tracker; - (registered, tracker) = brokerRegistry.getBroker( - order.owner, - order.signer - ); - require(registered, "invalid broker"); - } + order.brokerInterceptor = verifyAuthenticationGetInterceptor( + order.owner, + order.broker + ); // For AON orders, must cancel it as a whole. if (order.optAllOrNone) { @@ -214,31 +208,41 @@ contract Exchange is IExchange { emit OrderCancelled( order.owner, + tx.origin, orderHash, cancelAmount ); } function cancelAllOrdersByTradingPair( + address owner, address token1, address token2, uint cutoff ) external { + verifyAuthenticationGetInterceptor(owner, tx.origin); + uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); require( - delegate.tradingPairCutoffs(msg.sender, tokenPair) < t, + delegate.tradingPairCutoffs(owner, tokenPair) < t, "cutoff too small" ); - delegate.setTradingPairCutoffs(tokenPair, t); + delegate.setTradingPairCutoffs( + owner, + tokenPair, + t + ); + emit OrdersCancelled( - msg.sender, + owner, + tx.origin, token1, token2, t @@ -246,20 +250,27 @@ contract Exchange is IExchange { } function cancelAllOrders( - uint cutoff + address owner, + uint cutoff ) external { + verifyAuthenticationGetInterceptor(owner, tx.origin); + uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); require( - delegate.cutoffs(msg.sender) < t, + delegate.cutoffs(owner) < t, "cutoff too small" ); - delegate.setCutoffs(t); - emit AllOrdersCancelled(msg.sender, t); + delegate.setCutoffs(owner, t); + emit AllOrdersCancelled( + owner, + tx.origin, + t + ); } function submitRing( @@ -267,7 +278,7 @@ contract Exchange is IExchange { uint[6][] valuesList, uint8[] optionList, bytes[] sigList, - address miner, + address feeRecipient, address interceptor, uint8 feeSelections ) @@ -278,7 +289,7 @@ contract Exchange is IExchange { valuesList, optionList, sigList, - miner, + feeRecipient, interceptor, feeSelections, ringIndex, @@ -325,9 +336,11 @@ contract Exchange is IExchange { Context ctx ) private - pure + view { - require(ctx.miner != 0x0, "bad miner"); + if (ctx.feeRecipient == 0x0) { + ctx.feeRecipient = tx.origin; + } require( ctx.ringSize == ctx.addressesList.length, @@ -408,21 +421,15 @@ contract Exchange is IExchange { order.orderHash = calculateOrderHash(order); MultihashUtil.verifySignature( - order.signer, + order.broker, order.orderHash, ctx.sigList[i] ); - if (order.signer != order.owner) { - IBrokerRegistry brokerRegistry = IBrokerRegistry(brokerRegistryAddress); - bool authenticated; - (authenticated, order.brokerInterceptor) = brokerRegistry.getBroker( - order.owner, - order.signer - ); - - require(authenticated, "invalid broker"); - } + order.brokerInterceptor = verifyAuthenticationGetInterceptor( + order.owner, + order.broker + ); ctx.orders[i] = order; ctx.ringHash ^= order.orderHash; @@ -430,7 +437,7 @@ contract Exchange is IExchange { ctx.ringHash = keccak256( ctx.ringHash, - ctx.miner, + ctx.feeRecipient, ctx.feeSelections ); } @@ -459,7 +466,7 @@ contract Exchange is IExchange { } /// @dev Verify the ringHash has been signed with each order's auth private - /// keys as well as the miner's private key. + /// keys. function verifyRingSignatures( Context ctx ) @@ -589,7 +596,7 @@ contract Exchange is IExchange { ctx.delegate, order.tokenS, order.owner, - order.signer, + order.broker, order.brokerInterceptor ); @@ -646,7 +653,7 @@ contract Exchange is IExchange { } /// @dev Calculate each order's `lrcFee` and `lrcRewrard` and splict how much - /// of `fillAmountS` shall be paid to matching order or miner as margin + /// of `fillAmountS` shall be paid to matching order or fee recipient as margin /// split. function calculateRingFees( Context ctx @@ -672,7 +679,7 @@ contract Exchange is IExchange { ctx.delegate, lrcTokenAddress, order.owner, - order.signer, + order.broker, order.brokerInterceptor ); @@ -718,7 +725,7 @@ contract Exchange is IExchange { minerLrcSpendable = getSpendable( ctx.delegate, lrcTokenAddress, - ctx.miner, + tx.origin, 0x0, 0x0 ); @@ -781,7 +788,7 @@ contract Exchange is IExchange { // Store owner and tokenS of every order batch[p++] = bytes32(order.owner); - batch[p++] = bytes32(order.signer); + batch[p++] = bytes32(order.broker); batch[p++] = bytes32(order.brokerInterceptor); batch[p++] = bytes32(order.tokenS); @@ -811,14 +818,16 @@ contract Exchange is IExchange { ctx.delegate.batchUpdateHistoryAndTransferTokens( lrcTokenAddress, - ctx.miner, + tx.origin, + ctx.feeRecipient, historyBatch, batch ); emit RingMined( ctx.ringIndex, - ctx.miner, + tx.origin, + ctx.feeRecipient, fills ); } @@ -951,7 +960,7 @@ contract Exchange is IExchange { return keccak256( delegateAddress, order.owner, - order.signer, + order.broker, order.tokenS, order.tokenB, order.wallet, @@ -978,4 +987,22 @@ contract Exchange is IExchange { ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); return delegate.tradingPairCutoffs(orderOwner, tokenPair); } + + function verifyAuthenticationGetInterceptor( + address owner, + address signer + ) + private + view + returns (address brokerInterceptor) + { + if (signer == owner) { + brokerInterceptor = 0x0; + } else { + IBrokerRegistry brokerRegistry = IBrokerRegistry(brokerRegistryAddress); + bool authenticated; + (authenticated, brokerInterceptor) = brokerRegistry.getBroker(owner, signer); + require(authenticated, "broker unauthenticated"); + } + } } diff --git a/contracts/IExchange.sol b/contracts/IExchange.sol index 04dbd68b..2074ff23 100644 --- a/contracts/IExchange.sol +++ b/contracts/IExchange.sol @@ -39,23 +39,27 @@ contract IExchange { event RingMined( uint _ringIndex, - address indexed _miner, + address indexed _broker, + address indexed _feeRecipient, Fill[] _fills ); event OrderCancelled( - address indexed _address, + address indexed _owner, + address indexed _broker, bytes32 _orderHash, uint _amountCancelled ); event AllOrdersCancelled( - address indexed _address, + address indexed _owner, + address indexed _broker, uint _cutoff ); event OrdersCancelled( - address indexed _address, + address indexed _owner, + address indexed _broker, address _token1, address _token2, uint _cutoff @@ -63,7 +67,7 @@ contract IExchange { /// @dev Cancel a order. cancel amount(amountS or amountB) can be specified /// in values. - /// @param addresses owner, signer, tokenS, tokenB, wallet, authAddr, + /// @param addresses owner, broker, tokenS, tokenB, wallet, authAddr, /// and order interceptor /// @param values amountS, amountB, validSince (second), /// validUntil (second), lrcFee, and cancelAmount. @@ -84,6 +88,7 @@ contract IExchange { /// @param cutoff The cutoff timestamp, will default to `block.timestamp` /// if it is 0. function cancelAllOrdersByTradingPair( + address owner, address token1, address token2, uint cutoff @@ -96,12 +101,13 @@ contract IExchange { /// @param cutoff The cutoff timestamp, will default to `block.timestamp` /// if it is 0. function cancelAllOrders( - uint cutoff + address owner, + uint cutoff ) external; /// @dev Submit a order-ring for validation and settlement. - /// @param addressesList List of each order's owner, signer, tokenS, wallet, + /// @param addressesList List of each order's owner, broker, tokenS, wallet, /// authAddr, and order interceptor. /// Note that next order's `tokenS` equals this order's /// `tokenB`. @@ -110,7 +116,7 @@ contract IExchange { /// validUntil (second), lrcFee, and rateAmountS. /// @param optionList Options associated with each order. /// @param sigList Signature lists. - /// @param miner Miner address. + /// @param feeRecipient Mineing fee recipient address. /// @param inteceptor Ring interceptor address. /// @param feeSelections - /// Bits to indicate fee selections. `1` represents margin @@ -120,7 +126,7 @@ contract IExchange { uint[6][] valuesList, uint8[] optionList, bytes[] sigList, - address miner, + address feeRecipient, address inteceptor, uint8 feeSelections ) diff --git a/contracts/ITokenTransferDelegate.sol b/contracts/ITokenTransferDelegate.sol index 46aa535c..905ff109 100644 --- a/contracts/ITokenTransferDelegate.sol +++ b/contracts/ITokenTransferDelegate.sol @@ -83,7 +83,8 @@ contract ITokenTransferDelegate { function batchUpdateHistoryAndTransferTokens( address lrcTokenAddress, - address minerFeeRecipient, + address miner, + address feeRecipient, bytes32[] historyBatch, bytes32[] transferBatch ) @@ -109,11 +110,13 @@ contract ITokenTransferDelegate { external; function setCutoffs( + address owner, uint cutoff ) external; function setTradingPairCutoffs( + address owner, bytes20 tokenPair, uint cutoff ) diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TokenTransferDelegate.sol index db4da789..c32d0ef8 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TokenTransferDelegate.sol @@ -31,18 +31,12 @@ import "./ITokenTransferDelegate.sol"; contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { using MathUint for uint; - uint8 public walletSplitPercentage = 0; + address private latestAddress = 0x0; - constructor( - uint8 _walletSplitPercentage - ) - public - { - require(_walletSplitPercentage >= 0 && _walletSplitPercentage <= 100); - walletSplitPercentage = _walletSplitPercentage; - } - - bool public suspended = false; + uint8 public walletSplitPercentage = 0; + bool public suspended = false; + mapping(address => AddressInfo) public addressInfos; + struct AddressInfo { address previous; @@ -50,8 +44,14 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { bool authorized; } - mapping(address => AddressInfo) public addressInfos; - address public latestAddress; + constructor( + uint8 _walletSplitPercentage + ) + public + { + require(_walletSplitPercentage >= 0 && _walletSplitPercentage <= 100); + walletSplitPercentage = _walletSplitPercentage; + } modifier onlyAuthorized() { @@ -96,11 +96,9 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { address prev = latestAddress; if (prev == 0x0) { addrInfo.index = 1; - addrInfo.authorized = true; } else { addrInfo.previous = prev; addrInfo.index = addressInfos[prev].index + 1; - } addrInfo.authorized = true; latestAddress = addr; @@ -138,7 +136,9 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { if (addrInfo.index == 0) { break; } - addresses[count++] = addr; + if (addrInfo.authorized) { + addresses[count++] = addr; + } addr = addrInfo.previous; } } @@ -163,7 +163,8 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { function batchUpdateHistoryAndTransferTokens( address lrcAddr, - address miner, + address miner, + address feeRecipient, bytes32[] historyBatch, bytes32[] batch ) @@ -184,10 +185,10 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { for (i = 0; i < batch.length; i += 9) { address owner = address(batch[i]); - address signer = address(batch[i + 1]); + address broker = address(batch[i + 1]); address brokerInterceptor = address(batch[i + 2]); - // Pay token to previous order, or to miner as previous order's + // Pay token to previous order, or to feeRecipient as previous order's // margin split or/and this order's margin split. address token = address(batch[i + 3]); uint amount; @@ -210,7 +211,7 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { require( IBrokerInterceptor(brokerInterceptor).onTokenSpent( owner, - signer, + broker, token, amount ), @@ -219,7 +220,7 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { } } - // Miner pays LRx fee to order owner + // Miner pays LRC award to order owner amount = uint(batch[i + 6]); if (amount != 0 && miner != owner) { require( @@ -232,23 +233,23 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { ); } - // Split margin-split income between miner and wallet + // Split margin-split income between feeRecipient and wallet splitPayFee( token, owner, - miner, - signer, + feeRecipient, + broker, brokerInterceptor, address(batch[i + 8]), uint(batch[i + 5]) ); - // Split LRC fee income between miner and wallet + // Split LRC fee income between feeRecipient and wallet splitPayFee( lrcAddr, owner, - miner, - signer, + feeRecipient, + broker, brokerInterceptor, address(batch[i + 8]), uint(batch[i + 7]) @@ -271,7 +272,7 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { function splitPayFee( address token, address owner, - address miner, + address feeRecipient, address broker, address brokerInterceptor, address wallet, @@ -284,7 +285,7 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { } uint walletFee = (wallet == 0x0) ? 0 : fee.mul(walletSplitPercentage) / 100; - uint minerFee = fee.sub(walletFee); + uint feeRecipientFee = fee.sub(walletFee); if (walletFee > 0 && wallet != owner) { require( @@ -297,12 +298,12 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { ); } - if (minerFee > 0 && miner != 0x0 && miner != owner) { + if (feeRecipientFee > 0 && feeRecipient != 0x0 && feeRecipient != owner) { require( ERC20(token).transferFrom( owner, - miner, - minerFee + feeRecipient, + feeRecipientFee ), "token transfer failure" ); @@ -346,16 +347,18 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { function setCutoffs( - uint cutoff + address owner, + uint cutoff ) onlyAuthorized notSuspended external { - cutoffs[tx.origin] = cutoff; + cutoffs[owner] = cutoff; } function setTradingPairCutoffs( + address owner, bytes20 tokenPair, uint cutoff ) @@ -363,7 +366,7 @@ contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { notSuspended external { - tradingPairCutoffs[tx.origin][tokenPair] = cutoff; + tradingPairCutoffs[owner][tokenPair] = cutoff; } function checkCutoffsBatch( From 05f1974e50642139b5db9743512ac50f1b06e79f Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 30 Apr 2018 16:03:35 -0400 Subject: [PATCH 29/68] rename --- contracts/Exchange.sol | 16 ++++++++-------- contracts/IBrokerInterceptor.sol | 4 ++-- ...enTransferDelegate.sol => ITradeDelegate.sol} | 4 ++-- ...kenTransferDelegate.sol => TradeDelegate.sol} | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) rename contracts/{ITokenTransferDelegate.sol => ITradeDelegate.sol} (98%) rename contracts/{TokenTransferDelegate.sol => TradeDelegate.sol} (98%) diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index d6545601..66f9201e 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -26,7 +26,7 @@ import "./IBrokerRegistry.sol"; import "./IBrokerInterceptor.sol"; import "./IExchange.sol"; import "./ITokenRegistry.sol"; -import "./ITokenTransferDelegate.sol"; +import "./ITradeDelegate.sol"; /// @title An Implementation of IExchange. @@ -105,7 +105,7 @@ contract Exchange is IExchange { uint8 feeSelections; uint64 ringIndex; uint ringSize; // computed - ITokenTransferDelegate delegate; + ITradeDelegate delegate; IBrokerRegistry brokerRegistry; Order[] orders; bytes32 ringHash; // computed @@ -202,7 +202,7 @@ contract Exchange is IExchange { if (order.optAllOrNone) { cancelAmount = order.optCapByAmountB ? order.amountB : order.amountS; } - ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); + ITradeDelegate delegate = ITradeDelegate(delegateAddress); delegate.addCancelled(orderHash, cancelAmount); delegate.addCancelledOrFilled(orderHash, cancelAmount); @@ -227,7 +227,7 @@ contract Exchange is IExchange { uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); - ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); + ITradeDelegate delegate = ITradeDelegate(delegateAddress); require( delegate.tradingPairCutoffs(owner, tokenPair) < t, @@ -258,7 +258,7 @@ contract Exchange is IExchange { verifyAuthenticationGetInterceptor(owner, tx.origin); uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; - ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); + ITradeDelegate delegate = ITradeDelegate(delegateAddress); require( delegate.cutoffs(owner) < t, @@ -294,7 +294,7 @@ contract Exchange is IExchange { feeSelections, ringIndex, addressesList.length, - ITokenTransferDelegate(delegateAddress), + ITradeDelegate(delegateAddress), IBrokerRegistry(brokerRegistryAddress), new Order[](addressesList.length), 0x0 // ringHash @@ -895,7 +895,7 @@ contract Exchange is IExchange { /// @return Amount of ERC20 token that can be spent by this contract. function getSpendable( - ITokenTransferDelegate delegate, + ITradeDelegate delegate, address tokenAddress, address tokenOwner, address broker, @@ -984,7 +984,7 @@ contract Exchange is IExchange { returns (uint) { bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); - ITokenTransferDelegate delegate = ITokenTransferDelegate(delegateAddress); + ITradeDelegate delegate = ITradeDelegate(delegateAddress); return delegate.tradingPairCutoffs(orderOwner, tokenPair); } diff --git a/contracts/IBrokerInterceptor.sol b/contracts/IBrokerInterceptor.sol index 7ad00698..68fbe9f3 100644 --- a/contracts/IBrokerInterceptor.sol +++ b/contracts/IBrokerInterceptor.sol @@ -31,10 +31,10 @@ contract IBrokerInterceptor { view returns (uint allowance); - /// @dev This method will be called from TokenTransferDelegateImpl, so + /// @dev This method will be called from TradeDelegateImpl, so /// it must check `msg.sender` is the address of LoopringProtocol. /// Check https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md - /// for the current address of TokenTransferDelegateImpl deployment. + /// for the current address of TradeDelegateImpl deployment. function onTokenSpent( address owner, address broker, diff --git a/contracts/ITokenTransferDelegate.sol b/contracts/ITradeDelegate.sol similarity index 98% rename from contracts/ITokenTransferDelegate.sol rename to contracts/ITradeDelegate.sol index 905ff109..3cc5bf73 100644 --- a/contracts/ITokenTransferDelegate.sol +++ b/contracts/ITradeDelegate.sol @@ -19,11 +19,11 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -/// @title ITokenTransferDelegate +/// @title ITradeDelegate /// @dev Acts as a middle man to transfer ERC20 tokens on behalf of different /// versions of Loopring protocol to avoid ERC20 re-authorization. /// @author Daniel Wang - . -contract ITokenTransferDelegate { +contract ITradeDelegate { event AddressAuthorized( address indexed addr, uint32 number diff --git a/contracts/TokenTransferDelegate.sol b/contracts/TradeDelegate.sol similarity index 98% rename from contracts/TokenTransferDelegate.sol rename to contracts/TradeDelegate.sol index c32d0ef8..d3d90254 100644 --- a/contracts/TokenTransferDelegate.sol +++ b/contracts/TradeDelegate.sol @@ -22,13 +22,13 @@ import "./lib/Claimable.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; import "./IBrokerInterceptor.sol"; -import "./ITokenTransferDelegate.sol"; +import "./ITradeDelegate.sol"; -/// @title An Implementation of ITokenTransferDelegate. +/// @title An Implementation of ITradeDelegate. /// @author Daniel Wang - . /// @author Kongliang Zhong - . -contract TokenTransferDelegate is ITokenTransferDelegate, Claimable { +contract TradeDelegate is ITradeDelegate, Claimable { using MathUint for uint; address private latestAddress = 0x0; From 25e1509ba35a39a808c47c754d628fe1b00e66a9 Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 30 Apr 2018 16:09:03 -0400 Subject: [PATCH 30/68] move ITransferableMultsig to lib/ --- contracts/{ => lib}/ITransferableMultsig.sol | 0 contracts/{ => lib}/TransferableMultsig.sol | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename contracts/{ => lib}/ITransferableMultsig.sol (100%) rename contracts/{ => lib}/TransferableMultsig.sol (100%) diff --git a/contracts/ITransferableMultsig.sol b/contracts/lib/ITransferableMultsig.sol similarity index 100% rename from contracts/ITransferableMultsig.sol rename to contracts/lib/ITransferableMultsig.sol diff --git a/contracts/TransferableMultsig.sol b/contracts/lib/TransferableMultsig.sol similarity index 100% rename from contracts/TransferableMultsig.sol rename to contracts/lib/TransferableMultsig.sol From 44394dca31b0f9b0e63fe615d2dce8b60b356530 Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 30 Apr 2018 18:50:43 -0400 Subject: [PATCH 31/68] clean up IBrokerRegistry --- contracts/BrokerRegistry.sol | 54 ++++++++----- contracts/IBrokerRegistry.sol | 18 +++-- contracts/IMinerRegistry.sol | 68 ++++++++++++++++ contracts/MinerRegistry.sol | 147 ++++++++++++++++++++++++++++++++++ 4 files changed, 262 insertions(+), 25 deletions(-) create mode 100644 contracts/IMinerRegistry.sol create mode 100644 contracts/MinerRegistry.sol diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 9a04fc4f..6d252e60 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -26,9 +26,9 @@ import "./IBrokerRegistry.sol"; contract BrokerRegistry is IBrokerRegistry { struct Broker { uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // token's position in `addresses`. + // token's position in the containing array. address owner; - address addr; + address broker; address interceptor; } @@ -47,41 +47,42 @@ contract BrokerRegistry is IBrokerRegistry { ) { Broker storage b = brokerMap[owner][broker]; - registered = (b.addr == broker); + registered = (b.broker == broker); interceptor = b.interceptor; } function getBrokers( - uint start, - uint count + address owner, + uint start, + uint count ) - public + external view returns ( address[] brokers, address[] interceptors ) { - Broker[] storage _brokers = brokerageMap[msg.sender]; - uint num = _brokers.length; + Broker[] storage _brokers = brokerageMap[owner]; + uint size = _brokers.length; - if (start >= num) { + if (start >= size) { return; } uint end = start + count; - if (end > num) { - end = num; + if (end > size) { + end = size; } - if (start == num) { + if (start == end) { return; } brokers = new address[](end - start); interceptors = new address[](end - start); for (uint i = start; i < end; i++) { - brokers[i - start] = _brokers[i].addr; + brokers[i - start] = _brokers[i].broker; interceptors[i - start] = _brokers[i].interceptor; } } @@ -92,7 +93,7 @@ contract BrokerRegistry is IBrokerRegistry { ) external { - require(0x0 != broker,"bad broker"); + require(0x0 != broker, "bad broker"); require( 0 == brokerMap[msg.sender][broker].pos, "broker already exists" @@ -123,25 +124,38 @@ contract BrokerRegistry is IBrokerRegistry { { require(0x0 != broker, "bad broker"); require( - brokerMap[msg.sender][broker].addr == broker, + brokerMap[msg.sender][broker].broker == broker, "broker not found" ); Broker storage b = brokerMap[msg.sender][broker]; - delete brokerMap[msg.sender][broker]; - Broker[] storage brokers = brokerageMap[msg.sender]; Broker storage lastBroker = brokers[brokers.length - 1]; - if (lastBroker.addr != broker) { + if (lastBroker.broker != broker) { // Swap with the last token and update the pos lastBroker.pos = b.pos; - brokers[b.pos - 1] = lastBroker; - brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker; + brokers[lastBroker.pos - 1] = lastBroker; + brokerMap[lastBroker.owner][lastBroker.broker] = lastBroker; } + delete brokerMap[msg.sender][broker]; brokers.length--; emit BrokerUnregistered(msg.sender, broker); } + + function unregisterAllBroker( + ) + external + { + Broker[] storage brokers = brokerageMap[msg.sender]; + + for (uint i = 0; i < brokers.length; i++) { + delete brokerMap[msg.sender][brokers[i].broker]; + } + delete brokerageMap[msg.sender]; + + emit AllBrokersUnregistered(msg.sender); + } } diff --git a/contracts/IBrokerRegistry.sol b/contracts/IBrokerRegistry.sol index 3a64505b..00494c6b 100644 --- a/contracts/IBrokerRegistry.sol +++ b/contracts/IBrokerRegistry.sol @@ -22,8 +22,7 @@ pragma experimental "ABIEncoderV2"; /// @title IBrokerRegistry /// @dev A broker is an account that can submit order on behalf of other /// accounts. When register a broker, the owner can also specify a -/// pre-deployed BrokerInterceptor to manage the allowance of the -/// specific broker. +/// pre-deployed BrokerInterceptor to hook into Exchange smart contract. /// @author Daniel Wang - . contract IBrokerRegistry { event BrokerRegistered( @@ -37,6 +36,10 @@ contract IBrokerRegistry { address broker ); + event AllBrokersUnregistered( + address owner + ); + function getBroker( address owner, address broker @@ -49,10 +52,11 @@ contract IBrokerRegistry { ); function getBrokers( - uint start, - uint count + address owner, + uint start, + uint count ) - public + external view returns ( address[] brokers, @@ -69,4 +73,8 @@ contract IBrokerRegistry { address broker ) external; + + function unregisterAllBrokers( + ) + external; } diff --git a/contracts/IMinerRegistry.sol b/contracts/IMinerRegistry.sol new file mode 100644 index 00000000..0b4e1cfe --- /dev/null +++ b/contracts/IMinerRegistry.sol @@ -0,0 +1,68 @@ +// /* + +// Copyright 2017 Loopring Project Ltd (Loopring Foundation). + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// */ +// pragma solidity 0.4.23; +// pragma experimental "v0.5.0"; +// pragma experimental "ABIEncoderV2"; + + +// /// @title IMinerRegistry +// /// @dev A miner need to be registered so it can mine on behalf of other addresses. +// /// @author Daniel Wang - . +// contract IMinerRegistry { +// event MinerRegistered( +// address feeRecipient, +// address miner, +// ); + +// event MinerUnregistered( +// address feeRecipient, +// address miner +// ); + +// function isMinerRegistered( +// address feeRecipient, +// address miner +// ) +// external +// view +// returns(bool); + +// function getMiners( +// address feeRecipient, +// uint start, +// uint count +// ) +// external +// view +// returns (address[] miners); + +// // @dev this method must be called by feeRecipient. +// function registerMiner( +// address miner +// ) +// external; + +// // @dev this method must be called by feeRecipient. +// function unregisterMiner( +// address miner +// ) +// external; + +// // @dev this method must be called by feeRecipient. +// function unregisterAllMiners() +// external; +// } diff --git a/contracts/MinerRegistry.sol b/contracts/MinerRegistry.sol new file mode 100644 index 00000000..0320aa40 --- /dev/null +++ b/contracts/MinerRegistry.sol @@ -0,0 +1,147 @@ +// /* + +// Copyright 2017 Loopring Project Ltd (Loopring Foundation). + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// */ +// pragma solidity 0.4.23; +// pragma experimental "v0.5.0"; +// pragma experimental "ABIEncoderV2"; + +// import "./IMinerRegistry.sol"; + + +// /// @title An Implementation of IBrokerRegistry. +// /// @author Daniel Wang - . +// contract MinerRegistry is IMinerRegistry { +// struct Miner { +// uint pos; // 0 mens unregistered; if > 0, pos - 1 is the +// // token's position in `addresses`. +// address owner; +// address addr; +// address interceptor; +// } + +// mapping(address => Broker[]) public brokerageMap; +// mapping(address => mapping(address => Broker)) public brokerMap; + +// function getBroker( +// address owner, +// address broker +// ) +// external +// view +// returns( +// bool registered, +// address interceptor +// ) +// { +// Broker storage b = brokerMap[owner][broker]; +// registered = (b.addr == broker); +// interceptor = b.interceptor; +// } + +// function getBrokers( +// uint start, +// uint count +// ) +// public +// view +// returns ( +// address[] brokers, +// address[] interceptors +// ) +// { +// Broker[] storage _brokers = brokerageMap[msg.sender]; +// uint num = _brokers.length; + +// if (start >= num) { +// return; +// } + +// uint end = start + count; +// if (end > num) { +// end = num; +// } + +// if (start == num) { +// return; +// } + +// brokers = new address[](end - start); +// interceptors = new address[](end - start); +// for (uint i = start; i < end; i++) { +// brokers[i - start] = _brokers[i].addr; +// interceptors[i - start] = _brokers[i].interceptor; +// } +// } + +// function registerBroker( +// address broker, +// address interceptor // 0x0 allowed +// ) +// external +// { +// require(0x0 != broker,"bad broker"); +// require( +// 0 == brokerMap[msg.sender][broker].pos, +// "broker already exists" +// ); + +// Broker[] storage brokers = brokerageMap[msg.sender]; +// Broker memory b = Broker( +// brokers.length + 1, +// msg.sender, +// broker, +// interceptor +// ); + +// brokers.push(b); +// brokerMap[msg.sender][broker] = b; + +// emit BrokerRegistered( +// msg.sender, +// broker, +// interceptor +// ); +// } + +// function unregisterBroker( +// address broker +// ) +// external +// { +// require(0x0 != broker, "bad broker"); +// require( +// brokerMap[msg.sender][broker].addr == broker, +// "broker not found" +// ); + +// Broker storage b = brokerMap[msg.sender][broker]; +// delete brokerMap[msg.sender][broker]; + +// Broker[] storage brokers = brokerageMap[msg.sender]; +// Broker storage lastBroker = brokers[brokers.length - 1]; + +// if (lastBroker.addr != broker) { +// // Swap with the last token and update the pos +// lastBroker.pos = b.pos; +// brokers[b.pos - 1] = lastBroker; +// brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker; +// } + +// brokers.length--; + +// emit BrokerUnregistered(msg.sender, broker); +// } +// } From 170187602acb32ac30844544772366f253d4d3cb Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 30 Apr 2018 19:52:02 -0400 Subject: [PATCH 32/68] support agencies in token registry --- contracts/BrokerRegistry.sol | 36 +++-- contracts/IMinerRegistry.sol | 116 +++++++------- contracts/ITokenRegistry.sol | 33 ++++ contracts/MinerRegistry.sol | 302 ++++++++++++++++++----------------- contracts/TokenFactory.sol | 2 +- contracts/TokenRegistry.sol | 157 ++++++++++++------ 6 files changed, 379 insertions(+), 267 deletions(-) diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 6d252e60..fd5a6a07 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -28,13 +28,21 @@ contract BrokerRegistry is IBrokerRegistry { uint pos; // 0 mens unregistered; if > 0, pos - 1 is the // token's position in the containing array. address owner; - address broker; + address addr; address interceptor; } - mapping(address => Broker[]) public brokerageMap; + mapping(address => Broker[]) public brokerListMap; mapping(address => mapping(address => Broker)) public brokerMap; + /// @dev Disable default function. + function () + payable + external + { + revert(); + } + function getBroker( address owner, address broker @@ -47,7 +55,7 @@ contract BrokerRegistry is IBrokerRegistry { ) { Broker storage b = brokerMap[owner][broker]; - registered = (b.broker == broker); + registered = (b.addr == broker); interceptor = b.interceptor; } @@ -63,7 +71,7 @@ contract BrokerRegistry is IBrokerRegistry { address[] interceptors ) { - Broker[] storage _brokers = brokerageMap[owner]; + Broker[] storage _brokers = brokerListMap[owner]; uint size = _brokers.length; if (start >= size) { @@ -82,7 +90,7 @@ contract BrokerRegistry is IBrokerRegistry { brokers = new address[](end - start); interceptors = new address[](end - start); for (uint i = start; i < end; i++) { - brokers[i - start] = _brokers[i].broker; + brokers[i - start] = _brokers[i].addr; interceptors[i - start] = _brokers[i].interceptor; } } @@ -99,7 +107,7 @@ contract BrokerRegistry is IBrokerRegistry { "broker already exists" ); - Broker[] storage brokers = brokerageMap[msg.sender]; + Broker[] storage brokers = brokerListMap[msg.sender]; Broker memory b = Broker( brokers.length + 1, msg.sender, @@ -124,23 +132,23 @@ contract BrokerRegistry is IBrokerRegistry { { require(0x0 != broker, "bad broker"); require( - brokerMap[msg.sender][broker].broker == broker, + brokerMap[msg.sender][broker].addr == broker, "broker not found" ); Broker storage b = brokerMap[msg.sender][broker]; - Broker[] storage brokers = brokerageMap[msg.sender]; + Broker[] storage brokers = brokerListMap[msg.sender]; Broker storage lastBroker = brokers[brokers.length - 1]; - if (lastBroker.broker != broker) { + if (lastBroker.addr != broker) { // Swap with the last token and update the pos lastBroker.pos = b.pos; brokers[lastBroker.pos - 1] = lastBroker; - brokerMap[lastBroker.owner][lastBroker.broker] = lastBroker; + brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker; } - delete brokerMap[msg.sender][broker]; brokers.length--; + delete brokerMap[msg.sender][broker]; emit BrokerUnregistered(msg.sender, broker); } @@ -149,12 +157,12 @@ contract BrokerRegistry is IBrokerRegistry { ) external { - Broker[] storage brokers = brokerageMap[msg.sender]; + Broker[] storage brokers = brokerListMap[msg.sender]; for (uint i = 0; i < brokers.length; i++) { - delete brokerMap[msg.sender][brokers[i].broker]; + delete brokerMap[msg.sender][brokers[i].addr]; } - delete brokerageMap[msg.sender]; + delete brokerListMap[msg.sender]; emit AllBrokersUnregistered(msg.sender); } diff --git a/contracts/IMinerRegistry.sol b/contracts/IMinerRegistry.sol index 0b4e1cfe..c4c83b15 100644 --- a/contracts/IMinerRegistry.sol +++ b/contracts/IMinerRegistry.sol @@ -1,68 +1,72 @@ -// /* +/* -// Copyright 2017 Loopring Project Ltd (Loopring Foundation). + Copyright 2017 Loopring Project Ltd (Loopring Foundation). -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// */ -// pragma solidity 0.4.23; -// pragma experimental "v0.5.0"; -// pragma experimental "ABIEncoderV2"; + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; -// /// @title IMinerRegistry -// /// @dev A miner need to be registered so it can mine on behalf of other addresses. -// /// @author Daniel Wang - . -// contract IMinerRegistry { -// event MinerRegistered( -// address feeRecipient, -// address miner, -// ); +/// @title IMinerRegistry +/// @dev A miner need to be registered so it can mine on behalf of other addresses. +/// @author Daniel Wang - . +contract IMinerRegistry { + event MinerRegistered( + address feeRecipient, + address miner + ); -// event MinerUnregistered( -// address feeRecipient, -// address miner -// ); + event MinerUnregistered( + address feeRecipient, + address miner + ); -// function isMinerRegistered( -// address feeRecipient, -// address miner -// ) -// external -// view -// returns(bool); + event AllMinersUnregistered( + address feeRecipient + ); -// function getMiners( -// address feeRecipient, -// uint start, -// uint count -// ) -// external -// view -// returns (address[] miners); + function isMinerRegistered( + address feeRecipient, + address miner + ) + external + view + returns(bool); -// // @dev this method must be called by feeRecipient. -// function registerMiner( -// address miner -// ) -// external; + function getMiners( + address feeRecipient, + uint start, + uint count + ) + external + view + returns (address[] miners); + + // @dev this method must be called by feeRecipient. + function registerMiner( + address miner + ) + external; -// // @dev this method must be called by feeRecipient. -// function unregisterMiner( -// address miner -// ) -// external; + // @dev this method must be called by feeRecipient. + function unregisterMiner( + address miner + ) + external; -// // @dev this method must be called by feeRecipient. -// function unregisterAllMiners() -// external; -// } + // @dev this method must be called by feeRecipient. + function unregisterAllMiners() + external; +} diff --git a/contracts/ITokenRegistry.sol b/contracts/ITokenRegistry.sol index 11cc2ad1..fa05ef09 100644 --- a/contracts/ITokenRegistry.sol +++ b/contracts/ITokenRegistry.sol @@ -24,6 +24,17 @@ pragma experimental "ABIEncoderV2"; /// @author Kongliang Zhong - , /// @author Daniel Wang - . contract ITokenRegistry { + event AgencyRegistered( + address indexed agency + ); + + event AgencyUnregistered( + address indexed agency + ); + + event AllAgenciesUnregistered( + ); + event TokenRegistered( address indexed addr, string symbol @@ -34,6 +45,28 @@ contract ITokenRegistry { string symbol ); + function registerAgency( + address agency + ) + external; + + function unregisterAgency( + address agency + ) + external; + + function unregisterAllAgencies( + ) + external; + + function getAngencies( + uint start, + uint count + ) + public + view + returns (address[] agencies); + function registerToken( address addr, string symbol diff --git a/contracts/MinerRegistry.sol b/contracts/MinerRegistry.sol index 0320aa40..33ed6393 100644 --- a/contracts/MinerRegistry.sol +++ b/contracts/MinerRegistry.sol @@ -1,147 +1,155 @@ -// /* - -// Copyright 2017 Loopring Project Ltd (Loopring Foundation). - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// */ -// pragma solidity 0.4.23; -// pragma experimental "v0.5.0"; -// pragma experimental "ABIEncoderV2"; - -// import "./IMinerRegistry.sol"; - - -// /// @title An Implementation of IBrokerRegistry. -// /// @author Daniel Wang - . -// contract MinerRegistry is IMinerRegistry { -// struct Miner { -// uint pos; // 0 mens unregistered; if > 0, pos - 1 is the -// // token's position in `addresses`. -// address owner; -// address addr; -// address interceptor; -// } - -// mapping(address => Broker[]) public brokerageMap; -// mapping(address => mapping(address => Broker)) public brokerMap; - -// function getBroker( -// address owner, -// address broker -// ) -// external -// view -// returns( -// bool registered, -// address interceptor -// ) -// { -// Broker storage b = brokerMap[owner][broker]; -// registered = (b.addr == broker); -// interceptor = b.interceptor; -// } - -// function getBrokers( -// uint start, -// uint count -// ) -// public -// view -// returns ( -// address[] brokers, -// address[] interceptors -// ) -// { -// Broker[] storage _brokers = brokerageMap[msg.sender]; -// uint num = _brokers.length; - -// if (start >= num) { -// return; -// } - -// uint end = start + count; -// if (end > num) { -// end = num; -// } - -// if (start == num) { -// return; -// } - -// brokers = new address[](end - start); -// interceptors = new address[](end - start); -// for (uint i = start; i < end; i++) { -// brokers[i - start] = _brokers[i].addr; -// interceptors[i - start] = _brokers[i].interceptor; -// } -// } - -// function registerBroker( -// address broker, -// address interceptor // 0x0 allowed -// ) -// external -// { -// require(0x0 != broker,"bad broker"); -// require( -// 0 == brokerMap[msg.sender][broker].pos, -// "broker already exists" -// ); - -// Broker[] storage brokers = brokerageMap[msg.sender]; -// Broker memory b = Broker( -// brokers.length + 1, -// msg.sender, -// broker, -// interceptor -// ); - -// brokers.push(b); -// brokerMap[msg.sender][broker] = b; - -// emit BrokerRegistered( -// msg.sender, -// broker, -// interceptor -// ); -// } - -// function unregisterBroker( -// address broker -// ) -// external -// { -// require(0x0 != broker, "bad broker"); -// require( -// brokerMap[msg.sender][broker].addr == broker, -// "broker not found" -// ); - -// Broker storage b = brokerMap[msg.sender][broker]; -// delete brokerMap[msg.sender][broker]; - -// Broker[] storage brokers = brokerageMap[msg.sender]; -// Broker storage lastBroker = brokers[brokers.length - 1]; - -// if (lastBroker.addr != broker) { -// // Swap with the last token and update the pos -// lastBroker.pos = b.pos; -// brokers[b.pos - 1] = lastBroker; -// brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker; -// } - -// brokers.length--; - -// emit BrokerUnregistered(msg.sender, broker); -// } -// } +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "./IMinerRegistry.sol"; + + +/// @title An Implementation of IMinerRegistry. +/// @author Daniel Wang - . +contract MinerRegistry is IMinerRegistry { + struct Miner { + uint pos; // 0 mens unregistered; if > 0, pos - 1 is the + // token's position in `addresses`. + address owner; + address addr; + } + + mapping(address => Miner[]) public minerListMap; + mapping(address => mapping(address => Miner)) public minerMap; + + /// @dev Disable default function. + function () + payable + external + { + revert(); + } + + function isMinerRegistered( + address feeRecipient, + address miner + ) + external + view + returns(bool) + { + Miner storage m = minerMap[feeRecipient][miner]; + return (m.addr == miner); + } + + function getMiners( + address feeRecipient, + uint start, + uint count + ) + external + view + returns (address[] miners) + { + Miner[] storage _miners = minerListMap[feeRecipient]; + uint size = _miners.length; + + if (start >= size) { + return; + } + + uint end = start + count; + if (end > size) { + end = size; + } + + if (start == end) { + return; + } + + miners = new address[](end - start); + for (uint i = start; i < end; i++) { + miners[i - start] = _miners[i].addr; + } + } + + function registerMiner( + address miner + ) + external + { + require(0x0 != miner, "bad miner"); + require( + 0 == minerMap[msg.sender][miner].pos, + "miner already exists" + ); + + Miner[] storage miners = minerListMap[msg.sender]; + Miner memory m = Miner( + miners.length + 1, + msg.sender, + miner + ); + + miners.push(m); + minerMap[msg.sender][miner] = m; + + emit MinerRegistered( + msg.sender, + miner + ); + } + + function unregisterMiner( + address miner + ) + external + { + require(0x0 != miner, "bad miner"); + require( + minerMap[msg.sender][miner].addr == miner, + "miner not found" + ); + + Miner storage m = minerMap[msg.sender][miner]; + Miner[] storage miners = minerListMap[msg.sender]; + Miner storage lastMiner = miners[miners.length - 1]; + + if (lastMiner.addr != miner) { + // Swap with the last token and update the pos + lastMiner.pos = m.pos; + miners[lastMiner.pos - 1] = lastMiner; + minerMap[lastMiner.owner][lastMiner.addr] = lastMiner; + } + + miners.length--; + delete minerMap[msg.sender][miner]; + + emit MinerUnregistered(msg.sender, miner); + } + + function unregisterAllMiners() + external + { + Miner[] storage miners = minerListMap[msg.sender]; + + for (uint i = 0; i < miners.length; i++) { + delete minerMap[msg.sender][miners[i].addr]; + } + delete minerListMap[msg.sender]; + + emit AllMinersUnregistered(msg.sender); + } +} diff --git a/contracts/TokenFactory.sol b/contracts/TokenFactory.sol index fadff1c1..a2f4794c 100644 --- a/contracts/TokenFactory.sol +++ b/contracts/TokenFactory.sol @@ -75,7 +75,7 @@ contract TokenFactoryImpl is ITokenFactory { ); addr = address(token); - ITokenRegistry(tokenRegistry).registerMintedToken(addr, symbol); + ITokenRegistry(tokenRegistry).registerToken(addr, symbol); tokens[symbolBytes] = addr; emit TokenCreated( diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index 0be2e7f1..31dab336 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -29,13 +29,16 @@ import "./ITokenRegistry.sol"; contract TokenRegistry is ITokenRegistry, Claimable { using AddressUtil for address; - address[] public addresses; - mapping (address => TokenInfo) addressMap; + address[] public agencies; + mapping (address => uint) agencyPosMap; + + address[] public tokens; + mapping (address => Token) addressMap; mapping (string => address) symbolMap; - struct TokenInfo { + struct Token { uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // token's position in `addresses`. + // token's position in `tokens`. string symbol; // Symbol of the token } @@ -47,23 +50,107 @@ contract TokenRegistry is ITokenRegistry, Claimable { revert(); } - function registerToken( - address addr, - string symbol + function registerAgency( + address agency ) + onlyOwner external + { + require(0x0 != agency, "bad agency"); + require( + 0 == agencyPosMap[agency], + "agency already exists" + ); + + agencies.push(agency); + agencyPosMap[agency] = agencies.length; + + emit AgencyRegistered(agency); + } + + function unregisterAgency( + address agency + ) + onlyOwner + external + { + require(0x0 != agency, "bad agency"); + + uint pos = agencyPosMap[agency]; + require(pos != 0, "agency not exists"); + + if (pos != agencies.length) { + agencies[pos - 1] = agencies[agencies.length - 1]; + } + + agencies.length--; + delete agencyPosMap[agency]; + + emit AgencyUnregistered(agency); + } + + function unregisterAllAgencies( + ) onlyOwner + external { - registerTokenInternal(addr, symbol); + for (uint i = 0; i < agencies.length; i++) { + delete agencyPosMap[agencies[i]]; + } + agencies.length = 0; + + emit AllAgenciesUnregistered(); } - function registerMintedToken( + function getAngencies( + uint start, + uint count + ) + public + view + returns (address[] agencyList) + { + uint num = agencies.length; + + if (start >= num) { + return; + } + + uint end = start + count; + if (end > num) { + end = num; + } + + if (start == end) { + return; + } + + agencyList = new address[](end - start); + for (uint i = start; i < end; i++) { + agencyList[i - start] = agencies[i]; + } + } + + function registerToken( address addr, string symbol ) external { - registerTokenInternal(addr, symbol); + require( + msg.sender == owner || agencyPosMap[msg.sender] != 0, + "unauthenticated" + ); + require(0x0 != addr, "bad address"); + require(bytes(symbol).length > 0, "empty symbol"); + require(0x0 == symbolMap[symbol], "symbol registered"); + require(0 == addressMap[addr].pos, "address registered"); + + tokens.push(addr); + symbolMap[symbol] = addr; + addressMap[addr] = Token(tokens.length, symbol); + + emit TokenRegistered(addr, symbol); } function unregisterToken( @@ -73,25 +160,26 @@ contract TokenRegistry is ITokenRegistry, Claimable { external onlyOwner { - require(addr != 0x0,"bad address"); + require(addr != 0x0, "bad token address "); require(symbolMap[symbol] == addr, "token not found"); - delete symbolMap[symbol]; + uint pos = addressMap[addr].pos; require(pos != 0); - delete addressMap[addr]; - // We will replace the token we need to unregister with the last token // Only the pos of the last token will need to be updated - address lastToken = addresses[addresses.length - 1]; + address lastToken = tokens[tokens.length - 1]; // Don't do anything if the last token is the one we want to delete if (addr != lastToken) { // Swap with the last token and update the pos - addresses[pos - 1] = lastToken; + tokens[pos - 1] = lastToken; addressMap[lastToken].pos = pos; } - addresses.length--; + + tokens.length--; + delete addressMap[addr]; + delete symbolMap[symbol]; emit TokenUnregistered(addr, symbol); } @@ -149,7 +237,7 @@ contract TokenRegistry is ITokenRegistry, Claimable { view returns (address[] addressList) { - uint num = addresses.length; + uint num = tokens.length; if (start >= num) { return; @@ -160,42 +248,13 @@ contract TokenRegistry is ITokenRegistry, Claimable { end = num; } - if (start == num) { + if (start == end) { return; } addressList = new address[](end - start); for (uint i = start; i < end; i++) { - addressList[i - start] = addresses[i]; + addressList[i - start] = tokens[i]; } } - - // address[] public addresses; - // mapping (address => TokenInfo) addressMap; - // mapping (string => address) symbolMap; - - // struct TokenInfo { - // uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // // token's position in `addresses`. - // string symbol; // Symbol of the token - // } - - - function registerTokenInternal( - address addr, - string symbol - ) - internal - { - require(0x0 != addr, "bad address"); - require(bytes(symbol).length > 0, "empty symbol"); - require(0x0 == symbolMap[symbol], "symbol registered"); - require(0 == addressMap[addr].pos, "address registered"); - - addresses.push(addr); - symbolMap[symbol] = addr; - addressMap[addr] = TokenInfo(addresses.length, symbol); - - emit TokenRegistered(addr, symbol); - } } From 271d6ae767b42cf04f2bb9fc1011daba93081cce Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 30 Apr 2018 19:56:40 -0400 Subject: [PATCH 33/68] update --- contracts/ITokenRegistry.sol | 8 ++++---- contracts/TokenRegistry.sol | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/contracts/ITokenRegistry.sol b/contracts/ITokenRegistry.sol index fa05ef09..61e6b3bf 100644 --- a/contracts/ITokenRegistry.sol +++ b/contracts/ITokenRegistry.sol @@ -63,7 +63,7 @@ contract ITokenRegistry { uint start, uint count ) - public + external view returns (address[] agencies); @@ -102,14 +102,14 @@ contract ITokenRegistry { function isTokenRegisteredBySymbol( string symbol ) - public + external view returns (bool); function isTokenRegistered( address addr ) - public + external view returns (bool); @@ -117,7 +117,7 @@ contract ITokenRegistry { uint start, uint count ) - public + external view returns (address[] addressList); } diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index 31dab336..fee65a11 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -56,7 +56,7 @@ contract TokenRegistry is ITokenRegistry, Claimable { onlyOwner external { - require(0x0 != agency, "bad agency"); + require(agency.isContract(), "bad agency"); require( 0 == agencyPosMap[agency], "agency already exists" @@ -106,7 +106,7 @@ contract TokenRegistry is ITokenRegistry, Claimable { uint start, uint count ) - public + external view returns (address[] agencyList) { @@ -212,7 +212,7 @@ contract TokenRegistry is ITokenRegistry, Claimable { function isTokenRegisteredBySymbol( string symbol ) - public + external view returns (bool) { @@ -222,7 +222,7 @@ contract TokenRegistry is ITokenRegistry, Claimable { function isTokenRegistered( address addr ) - public + external view returns (bool) { @@ -233,7 +233,7 @@ contract TokenRegistry is ITokenRegistry, Claimable { uint start, uint count ) - public + external view returns (address[] addressList) { From 4838c98a21bca5a3ca0c115890697623c02a5e63 Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 30 Apr 2018 22:20:05 -0400 Subject: [PATCH 34/68] optimize --- contracts/BrokerRegistry.sol | 4 --- contracts/ITokenRegistry.sol | 21 +++---------- contracts/MinerRegistry.sol | 4 --- contracts/TokenRegistry.sol | 61 ------------------------------------ 4 files changed, 5 insertions(+), 85 deletions(-) diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index fd5a6a07..d9197ab4 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -83,10 +83,6 @@ contract BrokerRegistry is IBrokerRegistry { end = size; } - if (start == end) { - return; - } - brokers = new address[](end - start); interceptors = new address[](end - start); for (uint i = start; i < end; i++) { diff --git a/contracts/ITokenRegistry.sol b/contracts/ITokenRegistry.sol index 61e6b3bf..d96fc434 100644 --- a/contracts/ITokenRegistry.sol +++ b/contracts/ITokenRegistry.sol @@ -24,6 +24,11 @@ pragma experimental "ABIEncoderV2"; /// @author Kongliang Zhong - , /// @author Daniel Wang - . contract ITokenRegistry { + + address[] public agencies; + + address[] public tokens; + event AgencyRegistered( address indexed agency ); @@ -59,14 +64,6 @@ contract ITokenRegistry { ) external; - function getAngencies( - uint start, - uint count - ) - external - view - returns (address[] agencies); - function registerToken( address addr, string symbol @@ -112,12 +109,4 @@ contract ITokenRegistry { external view returns (bool); - - function getTokens( - uint start, - uint count - ) - external - view - returns (address[] addressList); } diff --git a/contracts/MinerRegistry.sol b/contracts/MinerRegistry.sol index 33ed6393..763d7923 100644 --- a/contracts/MinerRegistry.sol +++ b/contracts/MinerRegistry.sol @@ -75,10 +75,6 @@ contract MinerRegistry is IMinerRegistry { end = size; } - if (start == end) { - return; - } - miners = new address[](end - start); for (uint i = start; i < end; i++) { miners[i - start] = _miners[i].addr; diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index fee65a11..f4ec1942 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -29,10 +29,7 @@ import "./ITokenRegistry.sol"; contract TokenRegistry is ITokenRegistry, Claimable { using AddressUtil for address; - address[] public agencies; mapping (address => uint) agencyPosMap; - - address[] public tokens; mapping (address => Token) addressMap; mapping (string => address) symbolMap; @@ -102,35 +99,6 @@ contract TokenRegistry is ITokenRegistry, Claimable { emit AllAgenciesUnregistered(); } - function getAngencies( - uint start, - uint count - ) - external - view - returns (address[] agencyList) - { - uint num = agencies.length; - - if (start >= num) { - return; - } - - uint end = start + count; - if (end > num) { - end = num; - } - - if (start == end) { - return; - } - - agencyList = new address[](end - start); - for (uint i = start; i < end; i++) { - agencyList[i - start] = agencies[i]; - } - } - function registerToken( address addr, string symbol @@ -228,33 +196,4 @@ contract TokenRegistry is ITokenRegistry, Claimable { { return addressMap[addr].pos != 0; } - - function getTokens( - uint start, - uint count - ) - external - view - returns (address[] addressList) - { - uint num = tokens.length; - - if (start >= num) { - return; - } - - uint end = start + count; - if (end > num) { - end = num; - } - - if (start == end) { - return; - } - - addressList = new address[](end - start); - for (uint i = start; i < end; i++) { - addressList[i - start] = tokens[i]; - } - } } From c4c3a6e670a9aea1bfcbb60a4877b47ec76d6e8a Mon Sep 17 00:00:00 2001 From: wangdong Date: Mon, 30 Apr 2018 23:46:14 -0400 Subject: [PATCH 35/68] optimize IBrokerRegistry --- contracts/BrokerRegistry.sol | 66 ++++++++++++++-------------- contracts/ITradeDelegate.sol | 15 ++----- contracts/TradeDelegate.sol | 85 +++++++++++++----------------------- 3 files changed, 67 insertions(+), 99 deletions(-) diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index d9197ab4..74cf6841 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -25,15 +25,13 @@ import "./IBrokerRegistry.sol"; /// @author Daniel Wang - . contract BrokerRegistry is IBrokerRegistry { struct Broker { - uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // token's position in the containing array. address owner; address addr; address interceptor; } - mapping(address => Broker[]) public brokerListMap; - mapping(address => mapping(address => Broker)) public brokerMap; + mapping(address => Broker[]) public brokersMap; + mapping(address => mapping(address => uint)) public positionMap; /// @dev Disable default function. function () @@ -45,7 +43,7 @@ contract BrokerRegistry is IBrokerRegistry { function getBroker( address owner, - address broker + address addr ) external view @@ -54,9 +52,14 @@ contract BrokerRegistry is IBrokerRegistry { address interceptor ) { - Broker storage b = brokerMap[owner][broker]; - registered = (b.addr == broker); - interceptor = b.interceptor; + uint pos = positionMap[owner][addr]; + if (pos == 0) { + registered = false; + } else { + registered = true; + Broker storage broker = brokersMap[owner][pos - 1]; + interceptor = broker.interceptor; + } } function getBrokers( @@ -71,7 +74,7 @@ contract BrokerRegistry is IBrokerRegistry { address[] interceptors ) { - Broker[] storage _brokers = brokerListMap[owner]; + Broker[] storage _brokers = brokersMap[owner]; uint size = _brokers.length; if (start >= size) { @@ -85,6 +88,7 @@ contract BrokerRegistry is IBrokerRegistry { brokers = new address[](end - start); interceptors = new address[](end - start); + for (uint i = start; i < end; i++) { brokers[i - start] = _brokers[i].addr; interceptors[i - start] = _brokers[i].interceptor; @@ -99,20 +103,19 @@ contract BrokerRegistry is IBrokerRegistry { { require(0x0 != broker, "bad broker"); require( - 0 == brokerMap[msg.sender][broker].pos, + 0 == positionMap[msg.sender][broker], "broker already exists" ); - Broker[] storage brokers = brokerListMap[msg.sender]; + Broker[] storage brokers = brokersMap[msg.sender]; Broker memory b = Broker( - brokers.length + 1, msg.sender, broker, interceptor ); brokers.push(b); - brokerMap[msg.sender][broker] = b; + positionMap[msg.sender][broker] = brokers.length; emit BrokerRegistered( msg.sender, @@ -122,43 +125,40 @@ contract BrokerRegistry is IBrokerRegistry { } function unregisterBroker( - address broker + address addr ) external { - require(0x0 != broker, "bad broker"); - require( - brokerMap[msg.sender][broker].addr == broker, - "broker not found" - ); + require(0x0 != addr, "bad broker"); + + uint pos = positionMap[msg.sender][addr]; + require(pos != 0, "broker not found"); - Broker storage b = brokerMap[msg.sender][broker]; - Broker[] storage brokers = brokerListMap[msg.sender]; - Broker storage lastBroker = brokers[brokers.length - 1]; + Broker[] storage brokers = brokersMap[msg.sender]; + uint size = brokers.length; - if (lastBroker.addr != broker) { - // Swap with the last token and update the pos - lastBroker.pos = b.pos; - brokers[lastBroker.pos - 1] = lastBroker; - brokerMap[lastBroker.owner][lastBroker.addr] = lastBroker; + if (pos != size) { + Broker storage lastOne = brokers[size - 1]; + brokers[pos - 1] = lastOne; + positionMap[lastOne.owner][lastOne.addr] = pos; } - brokers.length--; - delete brokerMap[msg.sender][broker]; + brokers.length -= 1; + delete positionMap[msg.sender][addr]; - emit BrokerUnregistered(msg.sender, broker); + emit BrokerUnregistered(msg.sender, addr); } function unregisterAllBroker( ) external { - Broker[] storage brokers = brokerListMap[msg.sender]; + Broker[] storage brokers = brokersMap[msg.sender]; for (uint i = 0; i < brokers.length; i++) { - delete brokerMap[msg.sender][brokers[i].addr]; + delete positionMap[msg.sender][brokers[i].addr]; } - delete brokerListMap[msg.sender]; + delete brokersMap[msg.sender]; emit AllBrokersUnregistered(msg.sender); } diff --git a/contracts/ITradeDelegate.sol b/contracts/ITradeDelegate.sol index 3cc5bf73..22f1930c 100644 --- a/contracts/ITradeDelegate.sol +++ b/contracts/ITradeDelegate.sol @@ -25,15 +25,15 @@ pragma experimental "ABIEncoderV2"; /// @author Daniel Wang - . contract ITradeDelegate { event AddressAuthorized( - address indexed addr, - uint32 number + address indexed addr ); event AddressDeauthorized( - address indexed addr, - uint32 number + address indexed addr ); + address[] authorizedAddresses; + // The following map is used to keep trace of order fill and cancellation // history. mapping (bytes32 => uint) public cancelledOrFilled; @@ -61,13 +61,6 @@ contract ITradeDelegate { ) external; - function getLatestAuthorizedAddresses( - uint max - ) - external - view - returns (address[] addresses); - /// @dev Invoke ERC20 transferFrom method. /// @param token Address of token to transfer. /// @param from Address to transfer token from. diff --git a/contracts/TradeDelegate.sol b/contracts/TradeDelegate.sol index d3d90254..55009837 100644 --- a/contracts/TradeDelegate.sol +++ b/contracts/TradeDelegate.sol @@ -31,17 +31,14 @@ import "./ITradeDelegate.sol"; contract TradeDelegate is ITradeDelegate, Claimable { using MathUint for uint; - address private latestAddress = 0x0; - uint8 public walletSplitPercentage = 0; bool public suspended = false; - mapping(address => AddressInfo) public addressInfos; + mapping(address => uint) private positionMap; - struct AddressInfo { - address previous; - uint32 index; - bool authorized; + struct AuthorizedAddress { + uint pos; + address addr; } constructor( @@ -55,7 +52,7 @@ contract TradeDelegate is ITradeDelegate, Claimable { modifier onlyAuthorized() { - require(addressInfos[msg.sender].authorized, "unauthorized"); + require(positionMap[msg.sender] > 0, "unauthorized"); _; } @@ -85,25 +82,16 @@ contract TradeDelegate is ITradeDelegate, Claimable { onlyOwner external { - AddressInfo storage addrInfo = addressInfos[addr]; - - if (addrInfo.index != 0) { // existing - if (addrInfo.authorized == false) { // re-authorize - addrInfo.authorized = true; - emit AddressAuthorized(addr, addrInfo.index); - } - } else { - address prev = latestAddress; - if (prev == 0x0) { - addrInfo.index = 1; - } else { - addrInfo.previous = prev; - addrInfo.index = addressInfos[prev].index + 1; - } - addrInfo.authorized = true; - latestAddress = addr; - emit AddressAuthorized(addr, addrInfo.index); - } + require(addr != 0x0, "bad address"); + require( + 0 == positionMap[addr], + "address already registered" + ); + + authorizedAddresses.push(addr); + positionMap[addr] = authorizedAddresses.length; + emit AddressAuthorized(addr); + } function deauthorizeAddress( @@ -112,35 +100,22 @@ contract TradeDelegate is ITradeDelegate, Claimable { onlyOwner external { - uint32 index = addressInfos[addr].index; - if (index != 0) { - addressInfos[addr].authorized = false; - emit AddressDeauthorized(addr, index); - } - } + require(0x0 != addr, "bad address"); - function getLatestAuthorizedAddresses( - uint max - ) - external - view - returns (address[] addresses) - { - addresses = new address[](max); - address addr = latestAddress; - AddressInfo memory addrInfo; - uint count = 0; - - while (addr != 0x0 && count < max) { - addrInfo = addressInfos[addr]; - if (addrInfo.index == 0) { - break; - } - if (addrInfo.authorized) { - addresses[count++] = addr; - } - addr = addrInfo.previous; + uint pos = positionMap[addr]; + require(pos != 0, "address not found"); + + uint size = authorizedAddresses.length; + if (pos != size) { + address lastOne = authorizedAddresses[size - 1]; + authorizedAddresses[pos - 1] = lastOne; + positionMap[lastOne] = pos; } + + authorizedAddresses.length -= 1; + delete positionMap[addr]; + + emit AddressDeauthorized(addr); } function transferToken( @@ -266,7 +241,7 @@ contract TradeDelegate is ITradeDelegate, Claimable { view returns (bool) { - return addressInfos[addr].authorized; + return positionMap[addr] > 0; } function splitPayFee( From 603281c88014f0e1eb1de634af5d4586d2164214 Mon Sep 17 00:00:00 2001 From: wangdong Date: Tue, 1 May 2018 00:05:53 -0400 Subject: [PATCH 36/68] optimize MinerRegistry --- contracts/IMinerRegistry.sol | 2 + contracts/MinerRegistry.sol | 91 ++++++++++-------------------------- 2 files changed, 26 insertions(+), 67 deletions(-) diff --git a/contracts/IMinerRegistry.sol b/contracts/IMinerRegistry.sol index c4c83b15..b7a28039 100644 --- a/contracts/IMinerRegistry.sol +++ b/contracts/IMinerRegistry.sol @@ -23,6 +23,8 @@ pragma experimental "ABIEncoderV2"; /// @dev A miner need to be registered so it can mine on behalf of other addresses. /// @author Daniel Wang - . contract IMinerRegistry { + mapping(address => address[]) public minersMap; + event MinerRegistered( address feeRecipient, address miner diff --git a/contracts/MinerRegistry.sol b/contracts/MinerRegistry.sol index 763d7923..d87681e8 100644 --- a/contracts/MinerRegistry.sol +++ b/contracts/MinerRegistry.sol @@ -24,15 +24,8 @@ import "./IMinerRegistry.sol"; /// @title An Implementation of IMinerRegistry. /// @author Daniel Wang - . contract MinerRegistry is IMinerRegistry { - struct Miner { - uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // token's position in `addresses`. - address owner; - address addr; - } - mapping(address => Miner[]) public minerListMap; - mapping(address => mapping(address => Miner)) public minerMap; + mapping(address => mapping(address => uint)) private positionMap; /// @dev Disable default function. function () @@ -50,35 +43,7 @@ contract MinerRegistry is IMinerRegistry { view returns(bool) { - Miner storage m = minerMap[feeRecipient][miner]; - return (m.addr == miner); - } - - function getMiners( - address feeRecipient, - uint start, - uint count - ) - external - view - returns (address[] miners) - { - Miner[] storage _miners = minerListMap[feeRecipient]; - uint size = _miners.length; - - if (start >= size) { - return; - } - - uint end = start + count; - if (end > size) { - end = size; - } - - miners = new address[](end - start); - for (uint i = start; i < end; i++) { - miners[i - start] = _miners[i].addr; - } + return (positionMap[feeRecipient][miner] > 0); } function registerMiner( @@ -88,19 +53,14 @@ contract MinerRegistry is IMinerRegistry { { require(0x0 != miner, "bad miner"); require( - 0 == minerMap[msg.sender][miner].pos, + 0 == positionMap[msg.sender][miner], "miner already exists" ); - Miner[] storage miners = minerListMap[msg.sender]; - Miner memory m = Miner( - miners.length + 1, - msg.sender, - miner - ); - - miners.push(m); - minerMap[msg.sender][miner] = m; + address[] storage miners = minersMap[msg.sender]; + + miners.push(miner); + positionMap[msg.sender][miner] = miners.length; emit MinerRegistered( msg.sender, @@ -109,42 +69,39 @@ contract MinerRegistry is IMinerRegistry { } function unregisterMiner( - address miner + address addr ) external { - require(0x0 != miner, "bad miner"); - require( - minerMap[msg.sender][miner].addr == miner, - "miner not found" - ); + require(0x0 != addr, "bad miner"); + + uint pos = positionMap[msg.sender][addr]; + require(pos != 0, "broker not found"); - Miner storage m = minerMap[msg.sender][miner]; - Miner[] storage miners = minerListMap[msg.sender]; - Miner storage lastMiner = miners[miners.length - 1]; + address[] storage miners = minersMap[msg.sender]; + uint size = miners.length; - if (lastMiner.addr != miner) { - // Swap with the last token and update the pos - lastMiner.pos = m.pos; - miners[lastMiner.pos - 1] = lastMiner; - minerMap[lastMiner.owner][lastMiner.addr] = lastMiner; + if (pos != size) { + address lastOne = miners[size - 1]; + miners[pos - 1] = lastOne; + positionMap[msg.sender][lastOne] = pos; } - miners.length--; - delete minerMap[msg.sender][miner]; + miners.length -= 1; + delete positionMap[msg.sender][addr]; - emit MinerUnregistered(msg.sender, miner); + emit MinerUnregistered(msg.sender, addr); } function unregisterAllMiners() external { - Miner[] storage miners = minerListMap[msg.sender]; + address[] storage miners = minersMap[msg.sender]; for (uint i = 0; i < miners.length; i++) { - delete minerMap[msg.sender][miners[i].addr]; + delete positionMap[msg.sender][miners[i]]; } - delete minerListMap[msg.sender]; + delete minersMap[msg.sender]; emit AllMinersUnregistered(msg.sender); } From 1d0327e651f4be29a2fe1633127c64e3e6c91185 Mon Sep 17 00:00:00 2001 From: wangdong Date: Tue, 1 May 2018 00:12:29 -0400 Subject: [PATCH 37/68] minor changes --- contracts/IExchange.sol | 1 - contracts/TokenFactory.sol | 5 ----- contracts/TradeDelegate.sol | 4 ++-- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/contracts/IExchange.sol b/contracts/IExchange.sol index 2074ff23..8caf9a61 100644 --- a/contracts/IExchange.sol +++ b/contracts/IExchange.sol @@ -24,7 +24,6 @@ pragma experimental "ABIEncoderV2"; /// @author Kongliang Zhong - contract IExchange { uint8 public constant MARGIN_SPLIT_PERCENTAGE_BASE = 100; - uint8 public constant OPTION_MASK_CAP_BY_AMOUNTB = 0x01; uint8 public constant OPTION_MASK_ALL_OR_NONE = 0x02; diff --git a/contracts/TokenFactory.sol b/contracts/TokenFactory.sol index a2f4794c..9b8cd2fc 100644 --- a/contracts/TokenFactory.sol +++ b/contracts/TokenFactory.sol @@ -32,7 +32,6 @@ contract TokenFactoryImpl is ITokenFactory { using AddressUtil for address; using StringUtil for string; - mapping(bytes10 => address) public tokens; address public tokenRegistry; /// @dev Disable default function. @@ -63,9 +62,6 @@ contract TokenFactoryImpl is ITokenFactory { { require(symbol.checkStringLength(3, 10), "bad symbol size"); - bytes10 symbolBytes = symbol.stringToBytes10(); - require(tokens[symbolBytes] == 0x0, "invalid symbol"); - ERC20Token token = new ERC20Token( name, symbol, @@ -76,7 +72,6 @@ contract TokenFactoryImpl is ITokenFactory { addr = address(token); ITokenRegistry(tokenRegistry).registerToken(addr, symbol); - tokens[symbolBytes] = addr; emit TokenCreated( addr, diff --git a/contracts/TradeDelegate.sol b/contracts/TradeDelegate.sol index 55009837..0a64add0 100644 --- a/contracts/TradeDelegate.sol +++ b/contracts/TradeDelegate.sol @@ -82,10 +82,10 @@ contract TradeDelegate is ITradeDelegate, Claimable { onlyOwner external { - require(addr != 0x0, "bad address"); + require(0x0 !=addr, "bad address"); require( 0 == positionMap[addr], - "address already registered" + "address already exists" ); authorizedAddresses.push(addr); From a7ff26d331f955e35441e31633279277a5d058ac Mon Sep 17 00:00:00 2001 From: wangdong Date: Tue, 1 May 2018 14:22:09 -0400 Subject: [PATCH 38/68] optimize TokenRegistry --- contracts/ITokenRegistry.sol | 22 ++------- contracts/TokenRegistry.sol | 87 +++++++++++++++--------------------- contracts/TradeDelegate.sol | 2 + 3 files changed, 43 insertions(+), 68 deletions(-) diff --git a/contracts/ITokenRegistry.sol b/contracts/ITokenRegistry.sol index d96fc434..40bef22f 100644 --- a/contracts/ITokenRegistry.sol +++ b/contracts/ITokenRegistry.sol @@ -26,9 +26,9 @@ pragma experimental "ABIEncoderV2"; contract ITokenRegistry { address[] public agencies; - address[] public tokens; + event AgencyRegistered( address indexed agency ); @@ -70,15 +70,8 @@ contract ITokenRegistry { ) external; - function registerMintedToken( - address addr, - string symbol - ) - external; - function unregisterToken( - address addr, - string symbol + address addr ) external; @@ -96,17 +89,10 @@ contract ITokenRegistry { view returns (address); - function isTokenRegisteredBySymbol( + function getSymbolByAddress( string symbol ) external view - returns (bool); - - function isTokenRegistered( - address addr - ) - external - view - returns (bool); + returns (address); } diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index f4ec1942..1f614ff9 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -29,15 +29,10 @@ import "./ITokenRegistry.sol"; contract TokenRegistry is ITokenRegistry, Claimable { using AddressUtil for address; - mapping (address => uint) agencyPosMap; - mapping (address => Token) addressMap; - mapping (string => address) symbolMap; - - struct Token { - uint pos; // 0 mens unregistered; if > 0, pos - 1 is the - // token's position in `tokens`. - string symbol; // Symbol of the token - } + mapping (address => uint) private agencyPosMap; + mapping (address => uint) private tokenPosMap; + mapping (address => string) private addressToSymbolMap; + mapping (string => address) private symbolToAddressMap; /// @dev Disable default function. function () @@ -76,11 +71,14 @@ contract TokenRegistry is ITokenRegistry, Claimable { uint pos = agencyPosMap[agency]; require(pos != 0, "agency not exists"); - if (pos != agencies.length) { - agencies[pos - 1] = agencies[agencies.length - 1]; + uint size = agencies.length; + if (pos != size) { + address lastOne = agencies[size - 1]; + agencies[pos - 1] = lastOne; + agencyPosMap[lastOne] = pos; } - agencies.length--; + agencies.length -= 1; delete agencyPosMap[agency]; emit AgencyUnregistered(agency); @@ -109,45 +107,44 @@ contract TokenRegistry is ITokenRegistry, Claimable { msg.sender == owner || agencyPosMap[msg.sender] != 0, "unauthenticated" ); + require(0x0 != addr, "bad address"); require(bytes(symbol).length > 0, "empty symbol"); - require(0x0 == symbolMap[symbol], "symbol registered"); - require(0 == addressMap[addr].pos, "address registered"); + require(0x0 == symbolToAddressMap[symbol], "symbol registered"); + require(0 == bytes(addressToSymbolMap[addr]).length, "address registered"); tokens.push(addr); - symbolMap[symbol] = addr; - addressMap[addr] = Token(tokens.length, symbol); + tokenPosMap[addr] = tokens.length; + addressToSymbolMap[addr] = symbol; + symbolToAddressMap[symbol] = addr; emit TokenRegistered(addr, symbol); } function unregisterToken( - address addr, - string symbol + address addr ) external onlyOwner { require(addr != 0x0, "bad token address "); - require(symbolMap[symbol] == addr, "token not found"); - - - uint pos = addressMap[addr].pos; - require(pos != 0); - // We will replace the token we need to unregister with the last token - // Only the pos of the last token will need to be updated - address lastToken = tokens[tokens.length - 1]; - - // Don't do anything if the last token is the one we want to delete - if (addr != lastToken) { - // Swap with the last token and update the pos - tokens[pos - 1] = lastToken; - addressMap[lastToken].pos = pos; + + uint pos = tokenPosMap[addr]; + require(pos != 0, "token not found"); + + uint size = tokens.length; + if (pos != size) { + address lastOne = tokens[size - 1]; + tokens[pos - 1] = lastOne; + tokenPosMap[lastOne] = pos; } + tokens.length -= 1; - tokens.length--; - delete addressMap[addr]; - delete symbolMap[symbol]; + string storage symbol = addressToSymbolMap[addr]; + + delete symbolToAddressMap[symbol]; + delete addressToSymbolMap[addr]; + delete tokenPosMap[addr]; emit TokenUnregistered(addr, symbol); } @@ -160,7 +157,7 @@ contract TokenRegistry is ITokenRegistry, Claimable { returns (bool) { for (uint i = 0; i < addressList.length; i++) { - if (addressMap[addressList[i]].pos == 0) { + if (tokenPosMap[addressList[i]] == 0) { return false; } } @@ -174,26 +171,16 @@ contract TokenRegistry is ITokenRegistry, Claimable { view returns (address) { - return symbolMap[symbol]; + return symbolToAddressMap[symbol]; } - function isTokenRegisteredBySymbol( - string symbol - ) - external - view - returns (bool) - { - return symbolMap[symbol] != 0x0; - } - - function isTokenRegistered( + function getSymbolByAddress( address addr ) external view - returns (bool) + returns (string) { - return addressMap[addr].pos != 0; + return addressToSymbolMap[addr]; } } diff --git a/contracts/TradeDelegate.sol b/contracts/TradeDelegate.sol index 0a64add0..d7cb52ea 100644 --- a/contracts/TradeDelegate.sol +++ b/contracts/TradeDelegate.sol @@ -35,6 +35,8 @@ contract TradeDelegate is ITradeDelegate, Claimable { bool public suspended = false; mapping(address => uint) private positionMap; + mapping (address => string) private addressToSymbolMap; + mapping (string => address) private symbolToAddressMap; struct AuthorizedAddress { uint pos; From 548a97acfac5e00d95e62a5f20125a307cfaaba8 Mon Sep 17 00:00:00 2001 From: wangdong Date: Tue, 1 May 2018 14:27:16 -0400 Subject: [PATCH 39/68] add NoDefault.sol --- contracts/BrokerRegistry.sol | 11 ++--------- contracts/Exchange.sol | 11 ++--------- contracts/MinerRegistry.sol | 11 ++--------- contracts/TokenFactory.sol | 11 ++--------- contracts/TokenRegistry.sol | 15 ++++----------- contracts/TradeDelegate.sol | 11 ++--------- contracts/lib/NoDefault.sol | 31 +++++++++++++++++++++++++++++++ 7 files changed, 45 insertions(+), 56 deletions(-) create mode 100644 contracts/lib/NoDefault.sol diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 74cf6841..2ff6b415 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -18,12 +18,13 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "./lib/NoDefault.sol"; import "./IBrokerRegistry.sol"; /// @title An Implementation of IBrokerRegistry. /// @author Daniel Wang - . -contract BrokerRegistry is IBrokerRegistry { +contract BrokerRegistry is IBrokerRegistry, NoDefault { struct Broker { address owner; address addr; @@ -33,14 +34,6 @@ contract BrokerRegistry is IBrokerRegistry { mapping(address => Broker[]) public brokersMap; mapping(address => mapping(address => uint)) public positionMap; - /// @dev Disable default function. - function () - payable - external - { - revert(); - } - function getBroker( address owner, address addr diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index 66f9201e..51122755 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -22,6 +22,7 @@ import "./lib/AddressUtil.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; import "./lib/MultihashUtil.sol"; +import "./lib/NoDefault.sol"; import "./IBrokerRegistry.sol"; import "./IBrokerInterceptor.sol"; import "./IExchange.sol"; @@ -39,7 +40,7 @@ import "./ITradeDelegate.sol"; /// https://github.com/BenjaminPrice /// https://github.com/jonasshen /// https://github.com/Hephyrius -contract Exchange is IExchange { +contract Exchange is IExchange, NoDefault { using AddressUtil for address; using MathUint for uint; @@ -134,14 +135,6 @@ contract Exchange is IExchange { rateRatioCVSThreshold = _rateRatioCVSThreshold; } - /// @dev Disable default function. - function () - payable - external - { - revert(); - } - function cancelOrder( address[7] addresses, uint[6] orderValues, diff --git a/contracts/MinerRegistry.sol b/contracts/MinerRegistry.sol index d87681e8..abdd36eb 100644 --- a/contracts/MinerRegistry.sol +++ b/contracts/MinerRegistry.sol @@ -18,23 +18,16 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "./lib/NoDefault.sol"; import "./IMinerRegistry.sol"; /// @title An Implementation of IMinerRegistry. /// @author Daniel Wang - . -contract MinerRegistry is IMinerRegistry { +contract MinerRegistry is IMinerRegistry, NoDefault { mapping(address => mapping(address => uint)) private positionMap; - /// @dev Disable default function. - function () - payable - external - { - revert(); - } - function isMinerRegistered( address feeRecipient, address miner diff --git a/contracts/TokenFactory.sol b/contracts/TokenFactory.sol index 9b8cd2fc..67f1f5d3 100644 --- a/contracts/TokenFactory.sol +++ b/contracts/TokenFactory.sol @@ -20,6 +20,7 @@ pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/ERC20Token.sol"; +import "./lib/NoDefault.sol"; import "./lib/StringUtil.sol"; import "./ITokenFactory.sol"; import "./ITokenRegistry.sol"; @@ -28,20 +29,12 @@ import "./ITokenRegistry.sol"; /// @title An Implementation of ITokenFactory. /// @author Kongliang Zhong - , /// @author Daniel Wang - . -contract TokenFactoryImpl is ITokenFactory { +contract TokenFactoryImpl is ITokenFactory, NoDefault { using AddressUtil for address; using StringUtil for string; address public tokenRegistry; - /// @dev Disable default function. - function () - payable - external - { - revert(); - } - constructor( address _tokenRegistry ) diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index 1f614ff9..63b9c0f3 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -20,27 +20,20 @@ pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/Claimable.sol"; +import "./lib/NoDefault.sol"; import "./ITokenRegistry.sol"; /// @title An Implementation of TokenRegistry. /// @author Kongliang Zhong - , /// @author Daniel Wang - . -contract TokenRegistry is ITokenRegistry, Claimable { +contract TokenRegistry is ITokenRegistry, Claimable, NoDefault { using AddressUtil for address; mapping (address => uint) private agencyPosMap; mapping (address => uint) private tokenPosMap; - mapping (address => string) private addressToSymbolMap; - mapping (string => address) private symbolToAddressMap; - - /// @dev Disable default function. - function () - payable - external - { - revert(); - } + mapping (address => string) public addressToSymbolMap; + mapping (string => address) public symbolToAddressMap; function registerAgency( address agency diff --git a/contracts/TradeDelegate.sol b/contracts/TradeDelegate.sol index d7cb52ea..44b012e2 100644 --- a/contracts/TradeDelegate.sol +++ b/contracts/TradeDelegate.sol @@ -21,6 +21,7 @@ pragma experimental "ABIEncoderV2"; import "./lib/Claimable.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; +import "./lib/NoDefault.sol"; import "./IBrokerInterceptor.sol"; import "./ITradeDelegate.sol"; @@ -28,7 +29,7 @@ import "./ITradeDelegate.sol"; /// @title An Implementation of ITradeDelegate. /// @author Daniel Wang - . /// @author Kongliang Zhong - . -contract TradeDelegate is ITradeDelegate, Claimable { +contract TradeDelegate is ITradeDelegate, Claimable, NoDefault { using MathUint for uint; uint8 public walletSplitPercentage = 0; @@ -70,14 +71,6 @@ contract TradeDelegate is ITradeDelegate, Claimable { _; } - /// @dev Disable default function. - function () - payable - external - { - revert(); - } - function authorizeAddress( address addr ) diff --git a/contracts/lib/NoDefault.sol b/contracts/lib/NoDefault.sol new file mode 100644 index 00000000..519887b9 --- /dev/null +++ b/contracts/lib/NoDefault.sol @@ -0,0 +1,31 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title NoDefault +/// @dev Disable default functions. +contract NoDefault { + function () + payable + external + { + revert(); + } +} From 793cf1c8b4c17072b3299bf77148ae270dca938a Mon Sep 17 00:00:00 2001 From: wangdong Date: Tue, 1 May 2018 14:32:16 -0400 Subject: [PATCH 40/68] minor fix --- contracts/BrokerRegistry.sol | 7 ++++++- contracts/IBrokerRegistry.sol | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 2ff6b415..6a73dd66 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -130,6 +130,7 @@ contract BrokerRegistry is IBrokerRegistry, NoDefault { Broker[] storage brokers = brokersMap[msg.sender]; uint size = brokers.length; + address interceptor = brokers[pos - 1].interceptor; if (pos != size) { Broker storage lastOne = brokers[size - 1]; brokers[pos - 1] = lastOne; @@ -139,7 +140,11 @@ contract BrokerRegistry is IBrokerRegistry, NoDefault { brokers.length -= 1; delete positionMap[msg.sender][addr]; - emit BrokerUnregistered(msg.sender, addr); + emit BrokerUnregistered( + msg.sender, + addr, + interceptor + ); } function unregisterAllBroker( diff --git a/contracts/IBrokerRegistry.sol b/contracts/IBrokerRegistry.sol index 00494c6b..6423aeee 100644 --- a/contracts/IBrokerRegistry.sol +++ b/contracts/IBrokerRegistry.sol @@ -33,7 +33,8 @@ contract IBrokerRegistry { event BrokerUnregistered( address owner, - address broker + address broker, + address interceptor ); event AllBrokersUnregistered( From 62a58836133f4daa0f95082bf07f442b216a547b Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 2 May 2018 01:22:43 -0400 Subject: [PATCH 41/68] batch cancel orders by hash * minor change * fixed issue --- contracts/BrokerRegistry.sol | 8 +- contracts/Exchange.sol | 131 ++++++------------ contracts/IExchange.sol | 35 ++--- contracts/IMinerRegistry.sol | 2 +- contracts/IOrderBook.sol | 30 ++++ contracts/ITradeDelegate.sol | 12 +- contracts/MinerRegistry.sol | 6 +- contracts/OrderBook.sol | 36 +++++ contracts/TokenFactory.sol | 4 +- contracts/TokenRegistry.sol | 4 +- contracts/TradeDelegate.sol | 35 +++-- .../lib/{NoDefault.sol => NoDefaultFunc.sol} | 4 +- 12 files changed, 162 insertions(+), 145 deletions(-) create mode 100644 contracts/IOrderBook.sol create mode 100644 contracts/OrderBook.sol rename contracts/lib/{NoDefault.sol => NoDefaultFunc.sol} (94%) diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 6a73dd66..8c752695 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -18,21 +18,21 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/NoDefault.sol"; +import "./lib/NoDefaultFunc.sol"; import "./IBrokerRegistry.sol"; /// @title An Implementation of IBrokerRegistry. /// @author Daniel Wang - . -contract BrokerRegistry is IBrokerRegistry, NoDefault { +contract BrokerRegistry is IBrokerRegistry, NoDefaultFunc { struct Broker { address owner; address addr; address interceptor; } - mapping(address => Broker[]) public brokersMap; - mapping(address => mapping(address => uint)) public positionMap; + mapping (address => Broker[]) public brokersMap; + mapping (address => mapping (address => uint)) public positionMap; function getBroker( address owner, diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index 51122755..255181e0 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -19,10 +19,11 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; +import "./lib/BytesUtil.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; import "./lib/MultihashUtil.sol"; -import "./lib/NoDefault.sol"; +import "./lib/NoDefaultFunc.sol"; import "./IBrokerRegistry.sol"; import "./IBrokerInterceptor.sol"; import "./IExchange.sol"; @@ -40,7 +41,7 @@ import "./ITradeDelegate.sol"; /// https://github.com/BenjaminPrice /// https://github.com/jonasshen /// https://github.com/Hephyrius -contract Exchange is IExchange, NoDefault { +contract Exchange is IExchange, NoDefaultFunc { using AddressUtil for address; using MathUint for uint; @@ -135,79 +136,38 @@ contract Exchange is IExchange, NoDefault { rateRatioCVSThreshold = _rateRatioCVSThreshold; } - function cancelOrder( - address[7] addresses, - uint[6] orderValues, - uint8 option, - bytes sig + function cancelOrders( + address owner, + bytes orderHashes ) external { - uint cancelAmount = orderValues[5]; - - require(cancelAmount > 0, "invalid cancelAmount"); - Order memory order = Order( - addresses[0], - addresses[1], - addresses[2], - addresses[3], - addresses[4], - addresses[5], - addresses[6], - orderValues[0], - orderValues[1], - orderValues[2], - orderValues[3], - orderValues[4], - option, - option & OPTION_MASK_CAP_BY_AMOUNTB > 0 ? true : false, - option & OPTION_MASK_ALL_OR_NONE > 0 ? true : false, - false, - 0x0, - 0x0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ); - require( - tx.origin == order.broker, - "cancelOrder not submitted by broker" + uint size = orderHashes.length; + require(size > 0 && size % 32 == 0); + + verifyAuthenticationGetInterceptor( + owner, + tx.origin ); - bytes32 orderHash = calculateOrderHash(order); + size /= 32; + bytes32[] memory hashes = new bytes32[](size); - MultihashUtil.verifySignature( - order.broker, - orderHash, - sig - ); - - order.brokerInterceptor = verifyAuthenticationGetInterceptor( - order.owner, - order.broker - ); + ITradeDelegate delegate = ITradeDelegate(delegateAddress); - // For AON orders, must cancel it as a whole. - if (order.optAllOrNone) { - cancelAmount = order.optCapByAmountB ? order.amountB : order.amountS; + for (uint i = 0; i < size; i++) { + hashes[i] = BytesUtil.bytesToBytes32(orderHashes, i * 32); + delegate.setCancelled(owner, hashes[i]); } - ITradeDelegate delegate = ITradeDelegate(delegateAddress); - delegate.addCancelled(orderHash, cancelAmount); - delegate.addCancelledOrFilled(orderHash, cancelAmount); - emit OrderCancelled( - order.owner, + emit OrdersCancelled( + owner, tx.origin, - orderHash, - cancelAmount + hashes ); } - function cancelAllOrdersByTradingPair( + function cancelAllOrdersForTradingPair( address owner, address token1, address token2, @@ -220,20 +180,14 @@ contract Exchange is IExchange, NoDefault { uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); - ITradeDelegate delegate = ITradeDelegate(delegateAddress); - - require( - delegate.tradingPairCutoffs(owner, tokenPair) < t, - "cutoff too small" - ); - - delegate.setTradingPairCutoffs( + + ITradeDelegate(delegateAddress).setTradingPairCutoffs( owner, tokenPair, t ); - emit OrdersCancelled( + emit AllOrdersCancelledForTradingPair( owner, tx.origin, token1, @@ -248,17 +202,15 @@ contract Exchange is IExchange, NoDefault { ) external { - verifyAuthenticationGetInterceptor(owner, tx.origin); + verifyAuthenticationGetInterceptor( + owner, + tx.origin + ); uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; - ITradeDelegate delegate = ITradeDelegate(delegateAddress); - require( - delegate.cutoffs(owner) < t, - "cutoff too small" - ); + ITradeDelegate(delegateAddress).setCutoffs(owner, t); - delegate.setCutoffs(owner, t); emit AllOrdersCancelled( owner, tx.origin, @@ -303,7 +255,7 @@ contract Exchange is IExchange, NoDefault { assembleOrders(ctx); - validateOrdersCutoffs(ctx); + checkOrdersNotCancelled(ctx); verifyRingSignatures(ctx); @@ -435,7 +387,7 @@ contract Exchange is IExchange, NoDefault { ); } - function validateOrdersCutoffs( + function checkOrdersNotCancelled( Context ctx ) private @@ -446,9 +398,16 @@ contract Exchange is IExchange, NoDefault { uint[] memory validSinceTimes = new uint[](ctx.ringSize); for (uint i = 0; i < ctx.ringSize; i++) { - owners[i] = ctx.orders[i].owner; - tradingPairs[i] = bytes20(ctx.orders[i].tokenS) ^ bytes20(ctx.orders[i].tokenB); - validSinceTimes[i] = ctx.orders[i].validSince; + Order memory order = ctx.orders[i]; + + require( + !ctx.delegate.cancelled(order.owner, order.orderHash), + "ordre cancelled already" + ); + + owners[i] = order.owner; + tradingPairs[i] = bytes20(order.tokenS) ^ bytes20(order.tokenB); + validSinceTimes[i] = order.validSince; } ctx.delegate.checkCutoffsBatch( @@ -555,7 +514,7 @@ contract Exchange is IExchange, NoDefault { if (order.optAllOrNone) { require( - ctx.delegate.cancelledOrFilled(order.orderHash) == 0, + ctx.delegate.filled(order.orderHash) == 0, "AON filled or cancelled already" ); } else { @@ -563,7 +522,7 @@ contract Exchange is IExchange, NoDefault { if (order.optCapByAmountB) { amount = order.amountB.tolerantSub( - ctx.delegate.cancelledOrFilled(order.orderHash) + ctx.delegate.filled(order.orderHash) ); order.amountS = amount.mul(order.amountS) / order.amountB; @@ -572,7 +531,7 @@ contract Exchange is IExchange, NoDefault { order.amountB = amount; } else { amount = order.amountS.tolerantSub( - ctx.delegate.cancelledOrFilled(order.orderHash) + ctx.delegate.filled(order.orderHash) ); order.amountB = amount.mul(order.amountB) / order.amountS; diff --git a/contracts/IExchange.sol b/contracts/IExchange.sol index 8caf9a61..cd448111 100644 --- a/contracts/IExchange.sol +++ b/contracts/IExchange.sol @@ -43,41 +43,34 @@ contract IExchange { Fill[] _fills ); - event OrderCancelled( + event OrdersCancelled( address indexed _owner, address indexed _broker, - bytes32 _orderHash, - uint _amountCancelled + bytes32[] _orderHashes ); - event AllOrdersCancelled( + event AllOrdersCancelledForTradingPair( address indexed _owner, address indexed _broker, + address _token1, + address _token2, uint _cutoff ); - event OrdersCancelled( + event AllOrdersCancelled( address indexed _owner, address indexed _broker, - address _token1, - address _token2, uint _cutoff ); - /// @dev Cancel a order. cancel amount(amountS or amountB) can be specified - /// in values. - /// @param addresses owner, broker, tokenS, tokenB, wallet, authAddr, + + /// @dev Cancel multiple orders. + /// @param owner The order's owner. /// and order interceptor - /// @param values amountS, amountB, validSince (second), - /// validUntil (second), lrcFee, and cancelAmount. - /// @param option This indicates when a order should be considered - /// as 'completely filled'. - /// @param sig Order's signature. - function cancelOrder( - address[7] addresses, - uint[6] values, - uint8 option, - bytes sig + /// @param orderHashes Hashes of orders to be cancelled. + function cancelOrders( + address owner, + bytes orderHashes ) external; @@ -86,7 +79,7 @@ contract IExchange { /// timestamp, for a specific trading pair. /// @param cutoff The cutoff timestamp, will default to `block.timestamp` /// if it is 0. - function cancelAllOrdersByTradingPair( + function cancelAllOrdersForTradingPair( address owner, address token1, address token2, diff --git a/contracts/IMinerRegistry.sol b/contracts/IMinerRegistry.sol index b7a28039..e95863fa 100644 --- a/contracts/IMinerRegistry.sol +++ b/contracts/IMinerRegistry.sol @@ -23,7 +23,7 @@ pragma experimental "ABIEncoderV2"; /// @dev A miner need to be registered so it can mine on behalf of other addresses. /// @author Daniel Wang - . contract IMinerRegistry { - mapping(address => address[]) public minersMap; + mapping (address => address[]) public minersMap; event MinerRegistered( address feeRecipient, diff --git a/contracts/IOrderBook.sol b/contracts/IOrderBook.sol new file mode 100644 index 00000000..8a584668 --- /dev/null +++ b/contracts/IOrderBook.sol @@ -0,0 +1,30 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title IOrderBook +/// @author Daniel Wang - . +contract IOrderBook { + + function submitOrder( + address owner + ) + external; +} diff --git a/contracts/ITradeDelegate.sol b/contracts/ITradeDelegate.sol index 22f1930c..201032d0 100644 --- a/contracts/ITradeDelegate.sol +++ b/contracts/ITradeDelegate.sol @@ -36,10 +36,10 @@ contract ITradeDelegate { // The following map is used to keep trace of order fill and cancellation // history. - mapping (bytes32 => uint) public cancelledOrFilled; + mapping (bytes32 => uint) public filled; // This map is used to keep trace of order's cancellation history. - mapping (bytes32 => uint) public cancelled; + mapping (address => mapping (bytes32 => bool)) public cancelled; // A map from address to its cutoff timestamp. mapping (address => uint) public cutoffs; @@ -90,13 +90,13 @@ contract ITradeDelegate { view returns (bool); - function addCancelled( - bytes32 orderHash, - uint cancelAmount + function setCancelled( + address owner, + bytes32 orderHash ) external; - function addCancelledOrFilled( + function addFilled( bytes32 orderHash, uint cancelOrFillAmount ) diff --git a/contracts/MinerRegistry.sol b/contracts/MinerRegistry.sol index abdd36eb..72d7abc7 100644 --- a/contracts/MinerRegistry.sol +++ b/contracts/MinerRegistry.sol @@ -18,15 +18,15 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/NoDefault.sol"; +import "./lib/NoDefaultFunc.sol"; import "./IMinerRegistry.sol"; /// @title An Implementation of IMinerRegistry. /// @author Daniel Wang - . -contract MinerRegistry is IMinerRegistry, NoDefault { +contract MinerRegistry is IMinerRegistry, NoDefaultFunc { - mapping(address => mapping(address => uint)) private positionMap; + mapping (address => mapping (address => uint)) private positionMap; function isMinerRegistered( address feeRecipient, diff --git a/contracts/OrderBook.sol b/contracts/OrderBook.sol new file mode 100644 index 00000000..3d559e35 --- /dev/null +++ b/contracts/OrderBook.sol @@ -0,0 +1,36 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "./lib/NoDefaultFunc.sol"; +import "./IOrderBook.sol"; + + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +contract OrderBook is IOrderBook, NoDefaultFunc { + + function submitOrder( + address owner + ) + external + { + + } +} \ No newline at end of file diff --git a/contracts/TokenFactory.sol b/contracts/TokenFactory.sol index 67f1f5d3..96e8b824 100644 --- a/contracts/TokenFactory.sol +++ b/contracts/TokenFactory.sol @@ -20,7 +20,7 @@ pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/ERC20Token.sol"; -import "./lib/NoDefault.sol"; +import "./lib/NoDefaultFunc.sol"; import "./lib/StringUtil.sol"; import "./ITokenFactory.sol"; import "./ITokenRegistry.sol"; @@ -29,7 +29,7 @@ import "./ITokenRegistry.sol"; /// @title An Implementation of ITokenFactory. /// @author Kongliang Zhong - , /// @author Daniel Wang - . -contract TokenFactoryImpl is ITokenFactory, NoDefault { +contract TokenFactoryImpl is ITokenFactory, NoDefaultFunc { using AddressUtil for address; using StringUtil for string; diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index 63b9c0f3..c859719b 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -20,14 +20,14 @@ pragma experimental "ABIEncoderV2"; import "./lib/AddressUtil.sol"; import "./lib/Claimable.sol"; -import "./lib/NoDefault.sol"; +import "./lib/NoDefaultFunc.sol"; import "./ITokenRegistry.sol"; /// @title An Implementation of TokenRegistry. /// @author Kongliang Zhong - , /// @author Daniel Wang - . -contract TokenRegistry is ITokenRegistry, Claimable, NoDefault { +contract TokenRegistry is ITokenRegistry, Claimable, NoDefaultFunc { using AddressUtil for address; mapping (address => uint) private agencyPosMap; diff --git a/contracts/TradeDelegate.sol b/contracts/TradeDelegate.sol index 44b012e2..a388d03b 100644 --- a/contracts/TradeDelegate.sol +++ b/contracts/TradeDelegate.sol @@ -21,7 +21,7 @@ pragma experimental "ABIEncoderV2"; import "./lib/Claimable.sol"; import "./lib/ERC20.sol"; import "./lib/MathUint.sol"; -import "./lib/NoDefault.sol"; +import "./lib/NoDefaultFunc.sol"; import "./IBrokerInterceptor.sol"; import "./ITradeDelegate.sol"; @@ -29,13 +29,13 @@ import "./ITradeDelegate.sol"; /// @title An Implementation of ITradeDelegate. /// @author Daniel Wang - . /// @author Kongliang Zhong - . -contract TradeDelegate is ITradeDelegate, Claimable, NoDefault { +contract TradeDelegate is ITradeDelegate, Claimable, NoDefaultFunc { using MathUint for uint; uint8 public walletSplitPercentage = 0; bool public suspended = false; - mapping(address => uint) private positionMap; + mapping (address => uint) private positionMap; mapping (address => string) private addressToSymbolMap; mapping (string => address) private symbolToAddressMap; @@ -132,7 +132,7 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefault { } function batchUpdateHistoryAndTransferTokens( - address lrcAddr, + address lrcAddr, address miner, address feeRecipient, bytes32[] historyBatch, @@ -142,13 +142,11 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefault { notSuspended external { - // require(batch.length % 9 == 0); - // require(historyBatch.length % 2 == 0); - // require(batch.length / 9 == historyBatch.length / 2); uint i; for (i = 0; i < historyBatch.length / 2; i += 2) { - cancelledOrFilled[historyBatch[i]] = - cancelledOrFilled[historyBatch[i]].add(uint(historyBatch[i + 1])); + filled[historyBatch[i]] = filled[historyBatch[i]].add( + uint(historyBatch[i + 1]) + ); } address prevOwner = address(batch[batch.length - 9]); @@ -292,27 +290,26 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefault { } } - function addCancelled( - bytes32 orderHash, - uint cancelAmount + function setCancelled( + address owner, + bytes32 orderHash ) onlyAuthorized notSuspended external { - cancelled[orderHash] = cancelled[orderHash].add(cancelAmount); + cancelled[owner][orderHash] = true; } - function addCancelledOrFilled( + function addFilled( bytes32 orderHash, - uint cancelOrFillAmount + uint amount ) onlyAuthorized notSuspended external { - cancelledOrFilled[orderHash] = - cancelledOrFilled[orderHash].add(cancelOrFillAmount); + filled[orderHash] = filled[orderHash].add(amount); } @@ -324,6 +321,7 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefault { notSuspended external { + require(cutoffs[owner] < cutoff, "cutoff too small"); cutoffs[owner] = cutoff; } @@ -336,6 +334,7 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefault { notSuspended external { + require(tradingPairCutoffs[owner][tokenPair] < cutoff, "cutoff too small"); tradingPairCutoffs[owner][tokenPair] = cutoff; } @@ -351,7 +350,7 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefault { require(len == tradingPairs.length); require(len == validSince.length); - for(uint i = 0; i < len; i++) { + for (uint i = 0; i < len; i++) { require(validSince[i] > tradingPairCutoffs[owners[i]][tradingPairs[i]]); // order trading pair is cut off require(validSince[i] > cutoffs[owners[i]]); // order is cut off } diff --git a/contracts/lib/NoDefault.sol b/contracts/lib/NoDefaultFunc.sol similarity index 94% rename from contracts/lib/NoDefault.sol rename to contracts/lib/NoDefaultFunc.sol index 519887b9..80ce6531 100644 --- a/contracts/lib/NoDefault.sol +++ b/contracts/lib/NoDefaultFunc.sol @@ -19,9 +19,9 @@ pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -/// @title NoDefault +/// @title NoDefaultFunc /// @dev Disable default functions. -contract NoDefault { +contract NoDefaultFunc { function () payable external From bd24e8b888a861b5c1e9169150e0af973238960a Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 3 May 2018 00:04:28 -0400 Subject: [PATCH 42/68] disabled self-trading (#347) --- contracts/Exchange.sol | 23 ++++++------ contracts/ITradeDelegate.sol | 13 ------- contracts/TradeDelegate.sol | 73 ++++++++++++++---------------------- 3 files changed, 41 insertions(+), 68 deletions(-) diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index 255181e0..04425b0e 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -287,6 +287,12 @@ contract Exchange is IExchange, NoDefaultFunc { ctx.feeRecipient = tx.origin; } + //Check ring size + require( + ctx.ringSize > 1 && ctx.ringSize <= MAX_RING_SIZE, + "invalid ring size" + ); + require( ctx.ringSize == ctx.addressesList.length, "wrong addressesList size" @@ -302,21 +308,16 @@ contract Exchange is IExchange, NoDefaultFunc { "wrong optionList size" ); - // Validate ring-mining related arguments. - for (uint i = 0; i < ctx.ringSize; i++) { - require(ctx.valuesList[i][5] > 0, "rateAmountS is 0"); - } - - //Check ring size - require( - ctx.ringSize > 1 && ctx.ringSize <= MAX_RING_SIZE, - "invalid ring size" - ); - require( (ctx.ringSize << 1) == ctx.sigList.length, "invalid signature size" ); + + // Validate ring-mining related arguments. + + for (uint i = 0; i < ctx.ringSize; i++) { + require(ctx.valuesList[i][5] > 0, "rateAmountS is 0"); + } } /// @dev Assemble input data into structs so we can pass them to other functions. diff --git a/contracts/ITradeDelegate.sol b/contracts/ITradeDelegate.sol index 201032d0..c477b08e 100644 --- a/contracts/ITradeDelegate.sol +++ b/contracts/ITradeDelegate.sol @@ -61,19 +61,6 @@ contract ITradeDelegate { ) external; - /// @dev Invoke ERC20 transferFrom method. - /// @param token Address of token to transfer. - /// @param from Address to transfer token from. - /// @param to Address to transfer token to. - /// @param value Amount of token to transfer. - function transferToken( - address token, - address from, - address to, - uint value - ) - external; - function batchUpdateHistoryAndTransferTokens( address lrcTokenAddress, address miner, diff --git a/contracts/TradeDelegate.sol b/contracts/TradeDelegate.sol index a388d03b..3b9887a0 100644 --- a/contracts/TradeDelegate.sol +++ b/contracts/TradeDelegate.sol @@ -113,24 +113,6 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefaultFunc { emit AddressDeauthorized(addr); } - function transferToken( - address token, - address from, - address to, - uint value - ) - onlyAuthorized - notSuspended - external - { - if (value > 0 && from != to && to != 0x0) { - require( - ERC20(token).transferFrom(from, to, value), - "token transfer failure" - ); - } - } - function batchUpdateHistoryAndTransferTokens( address lrcAddr, address miner, @@ -162,30 +144,27 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefaultFunc { uint amount; // Here batch[i + 4] has been checked not to be 0. - if (owner != prevOwner) { - amount = uint(batch[i + 4]); - if (amount > 0) { - require( - ERC20(token).transferFrom( - owner, - prevOwner, - amount - ), - "token transfer failure" - ); - } - - if (brokerInterceptor != 0x0) { - require( - IBrokerInterceptor(brokerInterceptor).onTokenSpent( - owner, - broker, - token, - amount - ), - "brokerInterceptor update failure" - ); - } + require(owner != prevOwner, "self trading"); + amount = uint(batch[i + 4]); + require( + ERC20(token).transferFrom( + owner, + prevOwner, + amount + ), + "token transfer failure" + ); + + if (brokerInterceptor != 0x0) { + require( + IBrokerInterceptor(brokerInterceptor).onTokenSpent( + owner, + broker, + token, + amount + ), + "brokerInterceptor update failure" + ); } // Miner pays LRC award to order owner @@ -351,8 +330,14 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefaultFunc { require(len == validSince.length); for (uint i = 0; i < len; i++) { - require(validSince[i] > tradingPairCutoffs[owners[i]][tradingPairs[i]]); // order trading pair is cut off - require(validSince[i] > cutoffs[owners[i]]); // order is cut off + require( + validSince[i] > tradingPairCutoffs[owners[i]][tradingPairs[i]], + "order cancelled" + ); + require( + validSince[i] > cutoffs[owners[i]], + "order cancelled" + ); } } From 2dcc6c16498862a687f296a8f4c1d7d25ce12be1 Mon Sep 17 00:00:00 2001 From: wangdong Date: Fri, 4 May 2018 23:03:09 -0700 Subject: [PATCH 43/68] formatting --- , | 0 .soliumrc.json | 17 ++++--- README.md | 10 ++-- contracts/BrokerRegistry.sol | 2 +- contracts/IBrokerInterceptor.sol | 2 +- contracts/IBrokerRegistry.sol | 2 +- contracts/IMinerRegistry.sol | 4 +- contracts/MinerRegistry.sol | 4 +- contracts/TokenRegistry.sol | 2 +- contracts/TradeDelegate.sol | 5 +- docker-compose.yml | 2 +- package-lock.json | 2 +- package.json | 2 +- truffle.js | 84 ++++++++++++++++---------------- tsconfig.json | 35 ++++++------- tslint.json | 39 ++++++++------- 16 files changed, 108 insertions(+), 104 deletions(-) delete mode 100644 , diff --git a/, b/, deleted file mode 100644 index e69de29b..00000000 diff --git a/.soliumrc.json b/.soliumrc.json index 99c2e6f6..b8bca18d 100644 --- a/.soliumrc.json +++ b/.soliumrc.json @@ -1,9 +1,10 @@ { - "extends": "solium:recommended", - "rules": { - "imports-on-top": 0, - "variable-declarations": 0, - "indentation": ["error", 4], - "quotes": ["error", "double"] - } -} + "extends": "solium:recommended", + "rules": + { + "imports-on-top": 0, + "variable-declarations": 0, + "indentation": ["error", 4], + "quotes": ["error", "double"] + } +} \ No newline at end of file diff --git a/README.md b/README.md index ea483138..dddd3ea8 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ npm install --global --production windows-build-tools ``` Then run the following commands from project's root directory: - + ``` npm install npm run compile @@ -18,10 +18,10 @@ npm run compile ## Deployment on Ethereum Mainnet: - LRC - https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md#protocol-token---lrc - Protocol deployments: https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md#protocol - -## Run Unit Tests -* run `npm run testrpc` from project's root directory in terminal. -* run `npm run test` from project's root directory in another terminal window. + +## Run Unit Tests +* run `npm run testrpc` from project's root directory in terminal. +* run `npm run test` from project's root directory in another terminal window. * run single test: `npm run test -- transpiled/test/xxx.js` ## Run Unit Tests inside Docker diff --git a/contracts/BrokerRegistry.sol b/contracts/BrokerRegistry.sol index 8c752695..10a1ebb3 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/BrokerRegistry.sol @@ -116,7 +116,7 @@ contract BrokerRegistry is IBrokerRegistry, NoDefaultFunc { interceptor ); } - + function unregisterBroker( address addr ) diff --git a/contracts/IBrokerInterceptor.sol b/contracts/IBrokerInterceptor.sol index 68fbe9f3..222f3dd8 100644 --- a/contracts/IBrokerInterceptor.sol +++ b/contracts/IBrokerInterceptor.sol @@ -34,7 +34,7 @@ contract IBrokerInterceptor { /// @dev This method will be called from TradeDelegateImpl, so /// it must check `msg.sender` is the address of LoopringProtocol. /// Check https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md - /// for the current address of TradeDelegateImpl deployment. + /// for the current address of TradeDelegateImpl deployment. function onTokenSpent( address owner, address broker, diff --git a/contracts/IBrokerRegistry.sol b/contracts/IBrokerRegistry.sol index 6423aeee..c605a385 100644 --- a/contracts/IBrokerRegistry.sol +++ b/contracts/IBrokerRegistry.sol @@ -69,7 +69,7 @@ contract IBrokerRegistry { address interceptor // 0x0 allowed ) external; - + function unregisterBroker( address broker ) diff --git a/contracts/IMinerRegistry.sol b/contracts/IMinerRegistry.sol index e95863fa..75c69978 100644 --- a/contracts/IMinerRegistry.sol +++ b/contracts/IMinerRegistry.sol @@ -41,7 +41,7 @@ contract IMinerRegistry { function isMinerRegistered( address feeRecipient, - address miner + address miner ) external view @@ -61,7 +61,7 @@ contract IMinerRegistry { address miner ) external; - + // @dev this method must be called by feeRecipient. function unregisterMiner( address miner diff --git a/contracts/MinerRegistry.sol b/contracts/MinerRegistry.sol index 72d7abc7..6e318f6b 100644 --- a/contracts/MinerRegistry.sol +++ b/contracts/MinerRegistry.sol @@ -30,7 +30,7 @@ contract MinerRegistry is IMinerRegistry, NoDefaultFunc { function isMinerRegistered( address feeRecipient, - address miner + address miner ) external view @@ -51,7 +51,7 @@ contract MinerRegistry is IMinerRegistry, NoDefaultFunc { ); address[] storage miners = minersMap[msg.sender]; - + miners.push(miner); positionMap[msg.sender][miner] = miners.length; diff --git a/contracts/TokenRegistry.sol b/contracts/TokenRegistry.sol index c859719b..7f4b8136 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/TokenRegistry.sol @@ -57,7 +57,7 @@ contract TokenRegistry is ITokenRegistry, Claimable, NoDefaultFunc { address agency ) onlyOwner - external + external { require(0x0 != agency, "bad agency"); diff --git a/contracts/TradeDelegate.sol b/contracts/TradeDelegate.sol index 3b9887a0..1c90cf37 100644 --- a/contracts/TradeDelegate.sol +++ b/contracts/TradeDelegate.sol @@ -34,7 +34,7 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefaultFunc { uint8 public walletSplitPercentage = 0; bool public suspended = false; - + mapping (address => uint) private positionMap; mapping (address => string) private addressToSymbolMap; mapping (string => address) private symbolToAddressMap; @@ -86,7 +86,6 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefaultFunc { authorizedAddresses.push(addr); positionMap[addr] = authorizedAddresses.length; emit AddressAuthorized(addr); - } function deauthorizeAddress( @@ -337,7 +336,7 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefaultFunc { require( validSince[i] > cutoffs[owners[i]], "order cancelled" - ); + ); } } diff --git a/docker-compose.yml b/docker-compose.yml index 6a5a5d98..e55ff733 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,6 @@ services: container_name: test depends_on: - testrpc - build: + build: context: . dockerfile: Dockerfile.test \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1e65beda..1c57f47f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13694,4 +13694,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index e95c2d7c..9c75ba36 100644 --- a/package.json +++ b/package.json @@ -61,4 +61,4 @@ "npm": "^5.8.0", "web3": "0.20.2" } -} +} \ No newline at end of file diff --git a/truffle.js b/truffle.js index 3e3b451a..8d58fbc1 100644 --- a/truffle.js +++ b/truffle.js @@ -1,45 +1,45 @@ module.exports = { - solc: { - optimizer: { - enabled: true, - runs: 10000 - } - }, - networks: { - live: { - host: "localhost", - port: 8546, - network_id: '1', // main-net - gasPrice: 5000000000 + solc: { + optimizer: { + enabled: true, + runs: 10000 + } }, - testnet: { - host: "localhost", - port: 8545, - network_id: '2', // main-net - gasPrice: 21000000000 + networks: { + live: { + host: "localhost", + port: 8546, + network_id: '1', // main-net + gasPrice: 5000000000 + }, + testnet: { + host: "localhost", + port: 8545, + network_id: '2', // main-net + gasPrice: 21000000000 + }, + priv: { + host: "localhost", + port: 8545, + network_id: '50', // main-net + gasPrice: 5000000000, + gas: 4500000 + }, + development: { + host: "localhost", + port: 8545, + network_id: "*", // Match any network id + gasPrice: 21000000000, + gas: 4500000 + }, + docker: { + host: "testrpc", + port: 8545, + network_id: "*", // Match any network id + gasPrice: 21000000000, + gas: 4500000 + } }, - priv: { - host: "localhost", - port: 8545, - network_id: '50', // main-net - gasPrice: 5000000000, - gas: 4500000 - }, - development: { - host: "localhost", - port: 8545, - network_id: "*", // Match any network id - gasPrice: 21000000000, - gas: 4500000 - }, - docker: { - host: "testrpc", - port: 8545, - network_id: "*", // Match any network id - gasPrice: 21000000000, - gas: 4500000 - } - }, - test_directory: 'transpiled/test', - migrations_directory: 'transpiled/migrations', -}; + test_directory: 'transpiled/test', + migrations_directory: 'transpiled/migrations', +}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 49360bd1..66e93e81 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,19 @@ { - "compilerOptions": { - "outDir": "./transpiled/", - "sourceMap": true, - "noImplicitAny": true, - "module": "commonjs", - "target": "es6", - "baseUrl": ".", - "allowJs": true - }, - "include": [ - "node_modules/web3-typescript-typings/index.d.ts", - "./globals.d.ts", - "./util/**/*", - "./test/**/*", - "./migrations/**/*" - ] -} + "compilerOptions": + { + "outDir": "./transpiled/", + "sourceMap": true, + "noImplicitAny": true, + "module": "commonjs", + "target": "es6", + "baseUrl": ".", + "allowJs": true + }, + "include": [ + "node_modules/web3-typescript-typings/index.d.ts", + "./globals.d.ts", + "./util/**/*", + "./test/**/*", + "./migrations/**/*" + ] +} \ No newline at end of file diff --git a/tslint.json b/tslint.json index b1c57fcf..dbfe7bba 100644 --- a/tslint.json +++ b/tslint.json @@ -1,19 +1,22 @@ { - "defaultSeverity": "error", - "extends": [ - "tslint:recommended" - ], - "cliOptions": { - "exclude": [ - "./util/submit_rings.ts" - ] - }, - "jsRules": {}, - "rules": { - "no-console": false, - "no-bitwise": false, - "object-literal-sort-keys": false, - "interface-name": false - }, - "rulesDirectory": [] -} + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "cliOptions": + { + "exclude": [ + "./util/submit_rings.ts" + ] + }, + "jsRules": + {}, + "rules": + { + "no-console": false, + "no-bitwise": false, + "object-literal-sort-keys": false, + "interface-name": false + }, + "rulesDirectory": [] +} \ No newline at end of file From f8d24d8f7ed2838932216f98adc73e11b29d1533 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Fri, 1 Jun 2018 15:01:55 +0800 Subject: [PATCH 44/68] Multiring (#355) --- contracts/helper/InputsHelper.sol | 57 +++++ contracts/helper/MiningHelper.sol | 79 +++++++ contracts/helper/OrderHelper.sol | 196 ++++++++++++++++++ contracts/helper/ParticipationHelper.sol | 78 +++++++ contracts/helper/RingHelper.sol | 105 ++++++++++ contracts/{ => iface}/IBrokerInterceptor.sol | 0 contracts/{ => iface}/IBrokerRegistry.sol | 0 contracts/{ => iface}/IExchange.sol | 0 contracts/iface/IMinerInterceptor.sol | 25 +++ contracts/{ => iface}/IMinerRegistry.sol | 0 contracts/{ => iface}/IOrderBook.sol | 0 contracts/{ => iface}/IOrderInterceptor.sol | 0 contracts/iface/IOrderRegistry.sol | 33 +++ contracts/{ => iface}/IRingInterceptor.sol | 0 contracts/{ => iface}/ITokenFactory.sol | 0 contracts/{ => iface}/ITokenRegistry.sol | 0 contracts/{ => iface}/ITradeDelegate.sol | 8 +- contracts/{ => impl}/BrokerRegistry.sol | 4 +- contracts/impl/Data.sol | 114 ++++++++++ contracts/{ => impl}/Exchange.sol | 26 +-- contracts/impl/Exchange2.sol | 207 +++++++++++++++++++ contracts/{ => impl}/Migrations.sol | 0 contracts/{ => impl}/MinerRegistry.sol | 4 +- contracts/{ => impl}/OrderBook.sol | 4 +- contracts/impl/OrderRegistry.sol | 41 ++++ contracts/{ => impl}/TokenFactory.sol | 12 +- contracts/{ => impl}/TokenRegistry.sol | 8 +- contracts/{ => impl}/TradeDelegate.sol | 23 ++- contracts/spec/MiningSpec.sol | 58 ++++++ contracts/spec/OrderSpec.sol | 106 ++++++++++ contracts/spec/OrderSpecs.sol | 80 +++++++ contracts/spec/ParticipationSpec.sol | 43 ++++ contracts/spec/RingSpecs.sol | 93 +++++++++ 33 files changed, 1368 insertions(+), 36 deletions(-) create mode 100644 contracts/helper/InputsHelper.sol create mode 100644 contracts/helper/MiningHelper.sol create mode 100644 contracts/helper/OrderHelper.sol create mode 100644 contracts/helper/ParticipationHelper.sol create mode 100644 contracts/helper/RingHelper.sol rename contracts/{ => iface}/IBrokerInterceptor.sol (100%) rename contracts/{ => iface}/IBrokerRegistry.sol (100%) rename contracts/{ => iface}/IExchange.sol (100%) create mode 100644 contracts/iface/IMinerInterceptor.sol rename contracts/{ => iface}/IMinerRegistry.sol (100%) rename contracts/{ => iface}/IOrderBook.sol (100%) rename contracts/{ => iface}/IOrderInterceptor.sol (100%) create mode 100644 contracts/iface/IOrderRegistry.sol rename contracts/{ => iface}/IRingInterceptor.sol (100%) rename contracts/{ => iface}/ITokenFactory.sol (100%) rename contracts/{ => iface}/ITokenRegistry.sol (100%) rename contracts/{ => iface}/ITradeDelegate.sol (96%) rename contracts/{ => impl}/BrokerRegistry.sol (98%) create mode 100644 contracts/impl/Data.sol rename contracts/{ => impl}/Exchange.sol (98%) create mode 100644 contracts/impl/Exchange2.sol rename contracts/{ => impl}/Migrations.sol (100%) rename contracts/{ => impl}/MinerRegistry.sol (97%) rename contracts/{ => impl}/OrderBook.sol (93%) create mode 100644 contracts/impl/OrderRegistry.sol rename contracts/{ => impl}/TokenFactory.sol (90%) rename contracts/{ => impl}/TokenRegistry.sol (97%) rename contracts/{ => impl}/TradeDelegate.sol (95%) create mode 100644 contracts/spec/MiningSpec.sol create mode 100644 contracts/spec/OrderSpec.sol create mode 100644 contracts/spec/OrderSpecs.sol create mode 100644 contracts/spec/ParticipationSpec.sol create mode 100644 contracts/spec/RingSpecs.sol diff --git a/contracts/helper/InputsHelper.sol b/contracts/helper/InputsHelper.sol new file mode 100644 index 00000000..f938acaf --- /dev/null +++ b/contracts/helper/InputsHelper.sol @@ -0,0 +1,57 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; + + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +library InputsHelper { + + function nextAddress( + Data.Inputs inputs + ) + public + pure + returns (address) + { + return inputs.addressList[inputs.i++]; + } + + function nextUint( + Data.Inputs inputs + ) + public + pure + returns (uint) + { + return inputs.uintList[inputs.j++]; + } + + function nextBytes( + Data.Inputs inputs + ) + public + pure + returns (bytes) + { + return inputs.bytesList[inputs.k++]; + } +} \ No newline at end of file diff --git a/contracts/helper/MiningHelper.sol b/contracts/helper/MiningHelper.sol new file mode 100644 index 00000000..e5b37982 --- /dev/null +++ b/contracts/helper/MiningHelper.sol @@ -0,0 +1,79 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; +import "../lib/MultihashUtil.sol"; + + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +library MiningHelper { + + function updateMinerAndInterceptor( + Data.Mining mining, + Data.Context ctx + ) + public + view + returns (bytes32) + { + if (mining.miner == 0x0) { + mining.miner = mining.feeRecipient; + } else { + bool registered; + (registered, mining.interceptor) = ctx.minerBrokerRegistry.getBroker( + mining.feeRecipient, + mining.miner + ); + require(registered, "miner unregistered"); + } + } + + function updateHash( + Data.Mining mining + ) + public + pure + { + mining.hash = keccak256( + mining.feeRecipient, + mining.miner, + mining.hash + ); + } + function checkMinerSignature( + Data.Mining mining, + Data.Context ctx + ) + public + view + { + if (mining.sig.length == 0) { + require(tx.origin == mining.miner); + } else { + MultihashUtil.verifySignature( + mining.miner, + mining.hash, + mining.sig + ); + } + } + +} \ No newline at end of file diff --git a/contracts/helper/OrderHelper.sol b/contracts/helper/OrderHelper.sol new file mode 100644 index 00000000..d4510697 --- /dev/null +++ b/contracts/helper/OrderHelper.sol @@ -0,0 +1,196 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; +import "../iface/IBrokerInterceptor.sol"; +import "../lib/ERC20.sol"; +import "../lib/MathUint.sol"; +import "../lib/MultihashUtil.sol"; + + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +library OrderHelper { + + using MathUint for uint; + + function updateHash(Data.Order order) + public + pure + { + order.hash = keccak256( + order.owner, + order.tokenS, + order.tokenB, + order.amountS, + order.amountB, + order.lrcFee, + order.dualAuthAddr, + order.broker, + order.orderInterceptor, + order.wallet, + order.validSince, + order.validUntil, + order.limitByAmountB, + order.allOrNone + ); + } + + function updateBrokerAndInterceptor( + Data.Order order, + Data.Context ctx + ) + public + view + { + if (order.broker == address(0x0)) { + order.broker = order.owner; + } else { + bool registered; + (registered, order.brokerInterceptor) = ctx.orderBrokerRegistry.getBroker( + order.owner, + order.broker + ); + require(registered, "broker unregistered"); + } + } + + function updateStates( + Data.Order order, + Data.Context ctx + ) + public + view + { + order.maxAmountLrcFee = getSpendable( + ctx.delegate, + ctx.lrcTokenAddress, + order.owner, + order.broker, + order.brokerInterceptor + ); + + uint filled = ctx.delegate.filled(order.hash); + + if (order.limitByAmountB) { + order.maxAmountB = order.amountB.sub(filled); + order.maxAmountS = order.amountS.mul(order.maxAmountB) / order.amountB; + } else { + order.maxAmountS = order.amountS.sub(filled); + order.maxAmountB = order.amountB.mul(order.maxAmountS) / order.amountB; + } + + uint spendableS = getSpendable( + ctx.delegate, + order.tokenS, + order.owner, + order.broker, + order.brokerInterceptor + ); + + if (order.maxAmountS > spendableS) { + order.maxAmountS = spendableS; + } + + if (order.tokenS == ctx.lrcTokenAddress) { + order.sellLRC = true; + } + } + + function checkBrokerSignature( + Data.Order order, + Data.Context ctx + ) + public + view + { + if (order.sig.length == 0) { + require( + ctx.orderRegistry.isOrderHashRegistered( + order.broker, + order.hash + ), + "order unauthorized" + ); + } else { + MultihashUtil.verifySignature( + order.broker, + order.hash, + order.sig + ); + } + } + + function checkDualAuthSignature( + Data.Order order, + bytes32 miningHash + ) + public + pure + { + if (order.dualAuthSig.length != 0) { + MultihashUtil.verifySignature( + order.dualAuthAddr, + miningHash, + order.dualAuthSig + ); + } + } + + /// @return Amount of ERC20 token that can be spent by this contract. + function getSpendable( + ITradeDelegate delegate, + address tokenAddress, + address tokenOwner, + address broker, + address brokerInterceptor + ) + private + view + returns (uint spendable) + { + ERC20 token = ERC20(tokenAddress); + spendable = token.allowance( + tokenOwner, + address(delegate) + ); + if (spendable == 0) { + return; + } + uint amount = token.balanceOf(tokenOwner); + if (amount < spendable) { + spendable = amount; + if (spendable == 0) { + return; + } + } + + if (brokerInterceptor != tokenOwner) { + amount = IBrokerInterceptor(brokerInterceptor).getAllowance( + tokenOwner, + broker, + tokenAddress + ); + if (amount < spendable) { + spendable = amount; + } + } + } +} \ No newline at end of file diff --git a/contracts/helper/ParticipationHelper.sol b/contracts/helper/ParticipationHelper.sol new file mode 100644 index 00000000..b34ee835 --- /dev/null +++ b/contracts/helper/ParticipationHelper.sol @@ -0,0 +1,78 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; +import "../lib/MathUint.sol"; + + +/// @title ParticipationHelper +/// @author Daniel Wang - . +library ParticipationHelper { + using MathUint for uint; + + function adjustOrderState( + Data.Participation p + ) + public + pure + { + p.order.maxAmountS = p.order.maxAmountS.sub(p.fillAmountS); + p.order.maxAmountB = p.order.maxAmountB.sub(p.fillAmountB); + p.order.maxAmountLrcFee = p.order.maxAmountLrcFee.sub(p.lrcFee); + + if (p.order.sellLRC) { + p.order.maxAmountLrcFee = p.order.maxAmountLrcFee.sub(p.fillAmountS); + } + } + + function calculateFillAmounts( + Data.Participation p + ) + public + pure + returns (bool thisOrderIsSmaller) + { + Data.Order memory order = p.order; + + p.fillAmountB = p.fillAmountS.mul(p.rateB) / p.rateS; + + if (order.limitByAmountB) { + if (p.fillAmountB > order.maxAmountB) { + p.fillAmountB = order.maxAmountB; + p.fillAmountS = p.fillAmountB.mul(p.rateS) / p.rateB; + thisOrderIsSmaller = true; + } + p.lrcFee = order.lrcFee.mul(p.fillAmountB) / order.amountB; + } else { + p.lrcFee = order.lrcFee.mul(p.fillAmountS) / order.amountS; + } + } + + function calculateFeeAmounts( + Data.Participation p, + Data.Mining mining + ) + public + pure + { + Data.Order memory order = p.order; + + } +} \ No newline at end of file diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol new file mode 100644 index 00000000..fe78b88d --- /dev/null +++ b/contracts/helper/RingHelper.sol @@ -0,0 +1,105 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; +import "../lib/MathUint.sol"; +import "../lib/MultihashUtil.sol"; +import "./ParticipationHelper.sol"; + + +/// @title An Implementation of IOrderbook. +library RingHelper { + using MathUint for uint; + using ParticipationHelper for Data.Participation; + + function updateHash( + Data.Ring ring + ) + public + pure + { + for (uint i = 0; i < ring.size; i++) { + Data.Participation memory p = ring.participations[i]; + ring.hash = keccak256( + ring.hash, + p.order.hash, + p.marginSplitAsFee + ); + } + } + + function calculateFillAmountAndFee( + Data.Ring ring, + Data.Mining mining + ) + public + view + { + for (uint i = 0; i < ring.size; i++) { + Data.Participation memory p = ring.participations[i]; + Data.Order memory order = p.order; + p.fillAmountS = order.maxAmountS; + p.fillAmountB = order.maxAmountB; + } + + uint smallest = 0; + + for (uint i = 0; i < ring.size; i++) { + smallest = calculateOrderFillAmounts(ring, i, smallest); + } + + for (uint i = 0; i < smallest; i++) { + calculateOrderFillAmounts(ring, i, smallest); + } + + for (uint i = 0; i < ring.size; i++) { + Data.Participation memory p = ring.participations[i]; + p.calculateFeeAmounts(mining); + p.adjustOrderState(); + } + } + + function calculateOrderFillAmounts( + Data.Ring ring, + uint i, + uint smallest + ) + internal + pure + returns (uint smallest_) + { + // Default to the same smallest index + smallest_ = smallest; + + Data.Participation memory p = ring.participations[i]; + if (p.calculateFillAmounts()) { + smallest_ = i; + } + + uint j = (i + 1) % ring.size; + Data.Participation memory nextP = ring.participations[j]; + + if (p.fillAmountB < nextP.fillAmountS) { + nextP.fillAmountS = p.fillAmountB; + } else { + smallest_ = j; + } + } +} \ No newline at end of file diff --git a/contracts/IBrokerInterceptor.sol b/contracts/iface/IBrokerInterceptor.sol similarity index 100% rename from contracts/IBrokerInterceptor.sol rename to contracts/iface/IBrokerInterceptor.sol diff --git a/contracts/IBrokerRegistry.sol b/contracts/iface/IBrokerRegistry.sol similarity index 100% rename from contracts/IBrokerRegistry.sol rename to contracts/iface/IBrokerRegistry.sol diff --git a/contracts/IExchange.sol b/contracts/iface/IExchange.sol similarity index 100% rename from contracts/IExchange.sol rename to contracts/iface/IExchange.sol diff --git a/contracts/iface/IMinerInterceptor.sol b/contracts/iface/IMinerInterceptor.sol new file mode 100644 index 00000000..81c0611e --- /dev/null +++ b/contracts/iface/IMinerInterceptor.sol @@ -0,0 +1,25 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title IMinerInterceptor +contract IMinerInterceptor { + +} \ No newline at end of file diff --git a/contracts/IMinerRegistry.sol b/contracts/iface/IMinerRegistry.sol similarity index 100% rename from contracts/IMinerRegistry.sol rename to contracts/iface/IMinerRegistry.sol diff --git a/contracts/IOrderBook.sol b/contracts/iface/IOrderBook.sol similarity index 100% rename from contracts/IOrderBook.sol rename to contracts/iface/IOrderBook.sol diff --git a/contracts/IOrderInterceptor.sol b/contracts/iface/IOrderInterceptor.sol similarity index 100% rename from contracts/IOrderInterceptor.sol rename to contracts/iface/IOrderInterceptor.sol diff --git a/contracts/iface/IOrderRegistry.sol b/contracts/iface/IOrderRegistry.sol new file mode 100644 index 00000000..f7ce20ed --- /dev/null +++ b/contracts/iface/IOrderRegistry.sol @@ -0,0 +1,33 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + + +/// @title IOrderRegistry +/// @author Daniel Wang - . +contract IOrderRegistry { + + function isOrderHashRegistered( + address owner, + bytes32 hash + ) + public + view + returns (bool); +} diff --git a/contracts/IRingInterceptor.sol b/contracts/iface/IRingInterceptor.sol similarity index 100% rename from contracts/IRingInterceptor.sol rename to contracts/iface/IRingInterceptor.sol diff --git a/contracts/ITokenFactory.sol b/contracts/iface/ITokenFactory.sol similarity index 100% rename from contracts/ITokenFactory.sol rename to contracts/iface/ITokenFactory.sol diff --git a/contracts/ITokenRegistry.sol b/contracts/iface/ITokenRegistry.sol similarity index 100% rename from contracts/ITokenRegistry.sol rename to contracts/iface/ITokenRegistry.sol diff --git a/contracts/ITradeDelegate.sol b/contracts/iface/ITradeDelegate.sol similarity index 96% rename from contracts/ITradeDelegate.sol rename to contracts/iface/ITradeDelegate.sol index c477b08e..a85d091b 100644 --- a/contracts/ITradeDelegate.sol +++ b/contracts/iface/ITradeDelegate.sol @@ -85,7 +85,13 @@ contract ITradeDelegate { function addFilled( bytes32 orderHash, - uint cancelOrFillAmount + uint amount + ) + external; + + function setFilled( + bytes32 orderHash, + uint amount ) external; diff --git a/contracts/BrokerRegistry.sol b/contracts/impl/BrokerRegistry.sol similarity index 98% rename from contracts/BrokerRegistry.sol rename to contracts/impl/BrokerRegistry.sol index 10a1ebb3..d7bade78 100644 --- a/contracts/BrokerRegistry.sol +++ b/contracts/impl/BrokerRegistry.sol @@ -18,8 +18,8 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/NoDefaultFunc.sol"; -import "./IBrokerRegistry.sol"; +import "../iface/IBrokerRegistry.sol"; +import "../lib/NoDefaultFunc.sol"; /// @title An Implementation of IBrokerRegistry. diff --git a/contracts/impl/Data.sol b/contracts/impl/Data.sol new file mode 100644 index 00000000..b3a14895 --- /dev/null +++ b/contracts/impl/Data.sol @@ -0,0 +1,114 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../iface/IBrokerRegistry.sol"; +import "../iface/IOrderRegistry.sol"; +import "../iface/ITokenRegistry.sol"; +import "../iface/ITradeDelegate.sol"; +import "../iface/IMinerRegistry.sol"; + + +library Data { + + struct Inputs { + address[] addressList; + uint[] uintList; + bytes[] bytesList; + uint i; + uint j; + uint k; + } + + struct Context { + address lrcTokenAddress; + ITokenRegistry tokenRegistry; + ITradeDelegate delegate; + IBrokerRegistry orderBrokerRegistry; + IBrokerRegistry minerBrokerRegistry; + IOrderRegistry orderRegistry; + IMinerRegistry minerRegistry; + } + + struct Mining { + // required fields + address feeRecipient; + + // optional fields + address miner; + bytes sig; + + // computed fields + bytes32 hash; + address interceptor; + uint spendableLRC; + } + + struct Order { + // required fields + address owner; + address tokenS; + address tokenB; + uint amountS; + uint amountB; + uint lrcFee; + + // optional fields + address dualAuthAddr; + address broker; + address orderInterceptor; + address wallet; + uint validSince; + uint validUntil; + bytes sig; + bytes dualAuthSig; + bool limitByAmountB; + bool allOrNone; + + // computed fields + bytes32 hash; + address brokerInterceptor; + uint maxAmountLrcFee; + uint maxAmountS; + uint maxAmountB; + bool sellLRC; + } + + struct Participation { + // required fields + Order order; + bool marginSplitAsFee; + uint rateS; + uint rateB; + + // computed fields + uint splitS; + uint splitB; + uint lrcFee; + uint lrcReward; + uint fillAmountS; + uint fillAmountB; + } + + struct Ring{ + uint size; + Participation[] participations; + bytes32 hash; + } +} \ No newline at end of file diff --git a/contracts/Exchange.sol b/contracts/impl/Exchange.sol similarity index 98% rename from contracts/Exchange.sol rename to contracts/impl/Exchange.sol index 04425b0e..c8dfb4ca 100644 --- a/contracts/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -18,17 +18,17 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/AddressUtil.sol"; -import "./lib/BytesUtil.sol"; -import "./lib/ERC20.sol"; -import "./lib/MathUint.sol"; -import "./lib/MultihashUtil.sol"; -import "./lib/NoDefaultFunc.sol"; -import "./IBrokerRegistry.sol"; -import "./IBrokerInterceptor.sol"; -import "./IExchange.sol"; -import "./ITokenRegistry.sol"; -import "./ITradeDelegate.sol"; +import "../lib/AddressUtil.sol"; +import "../lib/BytesUtil.sol"; +import "../lib/ERC20.sol"; +import "../lib/MathUint.sol"; +import "../lib/MultihashUtil.sol"; +import "../lib/NoDefaultFunc.sol"; +import "../iface/IBrokerRegistry.sol"; +import "../iface/IBrokerInterceptor.sol"; +import "../iface/IExchange.sol"; +import "../iface/ITokenRegistry.sol"; +import "../iface/ITradeDelegate.sol"; /// @title An Implementation of IExchange. @@ -144,7 +144,7 @@ contract Exchange is IExchange, NoDefaultFunc { { uint size = orderHashes.length; require(size > 0 && size % 32 == 0); - + verifyAuthenticationGetInterceptor( owner, tx.origin @@ -180,7 +180,7 @@ contract Exchange is IExchange, NoDefaultFunc { uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); - + ITradeDelegate(delegateAddress).setTradingPairCutoffs( owner, tokenPair, diff --git a/contracts/impl/Exchange2.sol b/contracts/impl/Exchange2.sol new file mode 100644 index 00000000..fd2d7375 --- /dev/null +++ b/contracts/impl/Exchange2.sol @@ -0,0 +1,207 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../iface/IBrokerRegistry.sol"; +import "../iface/IBrokerInterceptor.sol"; +import "../iface/IExchange.sol"; +import "../iface/IOrderRegistry.sol"; +import "../iface/ITokenRegistry.sol"; +import "../iface/ITradeDelegate.sol"; +import "../iface/IMinerRegistry.sol"; + +import "../lib/AddressUtil.sol"; +import "../lib/BytesUtil.sol"; +import "../lib/ERC20.sol"; +import "../lib/MathUint.sol"; +import "../lib/MultihashUtil.sol"; +import "../lib/NoDefaultFunc.sol"; + +import "../spec/OrderSpecs.sol"; +import "../spec/MiningSpec.sol"; +import "../spec/RingSpecs.sol"; + +import "../helper/InputsHelper.sol"; +import "../helper/OrderHelper.sol"; +import "../helper/RingHelper.sol"; +import "../helper/MiningHelper.sol"; + +import "./Data.sol"; + + +/// @title An Implementation of IExchange. +/// @author Daniel Wang - , +/// @author Kongliang Zhong - +/// +/// Recognized contributing developers from the community: +/// https://github.com/Brechtpd +/// https://github.com/rainydio +/// https://github.com/BenjaminPrice +/// https://github.com/jonasshen +/// https://github.com/Hephyrius +contract Exchange is IExchange, NoDefaultFunc { + using AddressUtil for address; + using MathUint for uint; + using MiningSpec for uint16; + using OrderSpecs for uint16[]; + using RingSpecs for uint8[][]; + using OrderHelper for Data.Order; + using RingHelper for Data.Ring; + using InputsHelper for Data.Inputs; + using MiningHelper for Data.Mining; + + address public lrcTokenAddress = 0x0; + address public tokenRegistryAddress = 0x0; + address public delegateAddress = 0x0; + address public orderBrokerRegistryAddress = 0x0; + address public minerBrokerRegistryAddress = 0x0; + address public orderRegistryAddress = 0x0; + address public minerRegistryAddress = 0x0; + + uint64 public ringIndex = 0; + + // Exchange rate (rate) is the amount to sell or sold divided by the amount + // to buy or bought. + // + // Rate ratio is the ratio between executed rate and an order's original + // rate. + // + // To require all orders' rate ratios to have coefficient ofvariation (CV) + // smaller than 2.5%, for an example , rateRatioCVSThreshold should be: + // `(0.025 * RATE_RATIO_SCALE)^2` or 62500. + uint public rateRatioCVSThreshold = 0; + + uint public constant MAX_RING_SIZE = 8; + + uint public constant RATE_RATIO_SCALE = 10000; + + function submitRings( + uint16 miningSpec, + uint16[] orderSpecs, + uint8[][] ringSpecs, + address[] addressLists, + uint[] uintList, + bytes[] bytesList + ) + public + { + Data.Context memory ctx = Data.Context( + lrcTokenAddress, + ITokenRegistry(tokenRegistryAddress), + ITradeDelegate(delegateAddress), + IBrokerRegistry(orderBrokerRegistryAddress), + IBrokerRegistry(minerBrokerRegistryAddress), + IOrderRegistry(orderRegistryAddress), + IMinerRegistry(minerRegistryAddress) + ); + + Data.Inputs memory inputs = Data.Inputs( + addressLists, + uintList, + bytesList, + 0, 0, 0 // current indices of addressLists, uintList, and bytesList. + ); + + Data.Mining memory mining = Data.Mining( + inputs.nextAddress(), + (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), + (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), + bytes32(0x0), // hash + address(0x0), // interceptor + getSpendable( + ctx.delegate, + ctx.lrcTokenAddress, + tx.origin, // TODO(daniel): pay from msg.sender? + 0x0, // broker + 0x0 // brokerInterceptor + ) + ); + + Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); + Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); + + for (uint i = 0; i < orders.length; i++) { + orders[i].updateHash(); + orders[i].updateBrokerAndInterceptor(ctx); + orders[i].checkBrokerSignature(ctx); + } + + for (uint i = 0; i < rings.length; i++) { + rings[i].updateHash(); + mining.hash ^= rings[i].hash; + } + + mining.updateHash(); + mining.updateMinerAndInterceptor(ctx); + mining.checkMinerSignature(ctx); + + for (uint i = 0; i < orders.length; i++) { + orders[i].checkDualAuthSignature(mining.hash); + } + + for (uint i = 0; i < orders.length; i++) { + orders[i].updateStates(ctx); + } + + for (uint i = 0; i < rings.length; i++){ + rings[i].calculateFillAmountAndFee(mining); + } + } + + /// @return Amount of ERC20 token that can be spent by this contract. + // TODO(daniel): there is another getSpendable in OrderHelper. + function getSpendable( + ITradeDelegate delegate, + address tokenAddress, + address tokenOwner, + address broker, + address brokerInterceptor + ) + private + view + returns (uint spendable) + { + ERC20 token = ERC20(tokenAddress); + spendable = token.allowance( + tokenOwner, + address(delegate) + ); + if (spendable == 0) { + return; + } + uint amount = token.balanceOf(tokenOwner); + if (amount < spendable) { + spendable = amount; + if (spendable == 0) { + return; + } + } + + if (brokerInterceptor != tokenOwner) { + amount = IBrokerInterceptor(brokerInterceptor).getAllowance( + tokenOwner, + broker, + tokenAddress + ); + if (amount < spendable) { + spendable = amount; + } + } + } +} diff --git a/contracts/Migrations.sol b/contracts/impl/Migrations.sol similarity index 100% rename from contracts/Migrations.sol rename to contracts/impl/Migrations.sol diff --git a/contracts/MinerRegistry.sol b/contracts/impl/MinerRegistry.sol similarity index 97% rename from contracts/MinerRegistry.sol rename to contracts/impl/MinerRegistry.sol index 6e318f6b..8008301c 100644 --- a/contracts/MinerRegistry.sol +++ b/contracts/impl/MinerRegistry.sol @@ -18,8 +18,8 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/NoDefaultFunc.sol"; -import "./IMinerRegistry.sol"; +import "../iface/IMinerRegistry.sol"; +import "../lib/NoDefaultFunc.sol"; /// @title An Implementation of IMinerRegistry. diff --git a/contracts/OrderBook.sol b/contracts/impl/OrderBook.sol similarity index 93% rename from contracts/OrderBook.sol rename to contracts/impl/OrderBook.sol index 3d559e35..57e995a3 100644 --- a/contracts/OrderBook.sol +++ b/contracts/impl/OrderBook.sol @@ -18,8 +18,8 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/NoDefaultFunc.sol"; -import "./IOrderBook.sol"; +import "../iface/IOrderBook.sol"; +import "../lib/NoDefaultFunc.sol"; /// @title An Implementation of IOrderbook. diff --git a/contracts/impl/OrderRegistry.sol b/contracts/impl/OrderRegistry.sol new file mode 100644 index 00000000..b3b04533 --- /dev/null +++ b/contracts/impl/OrderRegistry.sol @@ -0,0 +1,41 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../iface/IOrderRegistry.sol"; +import "../lib/NoDefaultFunc.sol"; + + +/// @title An Implementation of IBrokerRegistry. +/// @author Daniel Wang - . +contract OrderRegistry is IOrderRegistry, NoDefaultFunc { + + mapping (address => mapping (bytes32 => bool)) public hashMap; + + function isOrderHashRegistered( + address owner, + bytes32 hash + ) + public + view + returns (bool) + { + return hashMap[owner][hash]; + } +} diff --git a/contracts/TokenFactory.sol b/contracts/impl/TokenFactory.sol similarity index 90% rename from contracts/TokenFactory.sol rename to contracts/impl/TokenFactory.sol index 96e8b824..0a0d1f02 100644 --- a/contracts/TokenFactory.sol +++ b/contracts/impl/TokenFactory.sol @@ -18,12 +18,12 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/AddressUtil.sol"; -import "./lib/ERC20Token.sol"; -import "./lib/NoDefaultFunc.sol"; -import "./lib/StringUtil.sol"; -import "./ITokenFactory.sol"; -import "./ITokenRegistry.sol"; +import "../iface/ITokenFactory.sol"; +import "../iface/ITokenRegistry.sol"; +import "../lib/AddressUtil.sol"; +import "../lib/ERC20Token.sol"; +import "../lib/NoDefaultFunc.sol"; +import "../lib/StringUtil.sol"; /// @title An Implementation of ITokenFactory. diff --git a/contracts/TokenRegistry.sol b/contracts/impl/TokenRegistry.sol similarity index 97% rename from contracts/TokenRegistry.sol rename to contracts/impl/TokenRegistry.sol index 7f4b8136..e5fb29e7 100644 --- a/contracts/TokenRegistry.sol +++ b/contracts/impl/TokenRegistry.sol @@ -18,10 +18,10 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/AddressUtil.sol"; -import "./lib/Claimable.sol"; -import "./lib/NoDefaultFunc.sol"; -import "./ITokenRegistry.sol"; +import "../iface/ITokenRegistry.sol"; +import "../lib/AddressUtil.sol"; +import "../lib/Claimable.sol"; +import "../lib/NoDefaultFunc.sol"; /// @title An Implementation of TokenRegistry. diff --git a/contracts/TradeDelegate.sol b/contracts/impl/TradeDelegate.sol similarity index 95% rename from contracts/TradeDelegate.sol rename to contracts/impl/TradeDelegate.sol index 1c90cf37..78fe4c0b 100644 --- a/contracts/TradeDelegate.sol +++ b/contracts/impl/TradeDelegate.sol @@ -18,12 +18,12 @@ pragma solidity 0.4.23; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; -import "./lib/Claimable.sol"; -import "./lib/ERC20.sol"; -import "./lib/MathUint.sol"; -import "./lib/NoDefaultFunc.sol"; -import "./IBrokerInterceptor.sol"; -import "./ITradeDelegate.sol"; +import "../iface/IBrokerInterceptor.sol"; +import "../iface/ITradeDelegate.sol"; +import "../lib/Claimable.sol"; +import "../lib/ERC20.sol"; +import "../lib/MathUint.sol"; +import "../lib/NoDefaultFunc.sol"; /// @title An Implementation of ITradeDelegate. @@ -290,6 +290,17 @@ contract TradeDelegate is ITradeDelegate, Claimable, NoDefaultFunc { filled[orderHash] = filled[orderHash].add(amount); } + function setFilled( + bytes32 orderHash, + uint amount + ) + onlyAuthorized + notSuspended + external + { + filled[orderHash] = amount; + } + function setCutoffs( address owner, diff --git a/contracts/spec/MiningSpec.sol b/contracts/spec/MiningSpec.sol new file mode 100644 index 00000000..f9099ca6 --- /dev/null +++ b/contracts/spec/MiningSpec.sol @@ -0,0 +1,58 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; + + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +library MiningSpec { + function hasMiner(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x2 != 0; + } + + function hasBroker(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x2 != 0; + } + + function hasMinerInterceptor(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x2 != 0; + } + + function hasSignature(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x2 != 0; + } +} \ No newline at end of file diff --git a/contracts/spec/OrderSpec.sol b/contracts/spec/OrderSpec.sol new file mode 100644 index 00000000..085eb672 --- /dev/null +++ b/contracts/spec/OrderSpec.sol @@ -0,0 +1,106 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; + + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +library OrderSpec { + function limitByAmountB(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x2 != 0; + } + + function allOrNone(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x4 != 0; + } + + function hasDualAuth(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x8 != 0; + } + + function hasSignature(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x8 != 0; + } + + function hasBroker(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x8 != 0; + } + + function hasBrokerInterceptor(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x8 != 0; + } + + function hasWallet(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x8 != 0; + } + + function hasValidSince(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x8 != 0; + } + + function hasValidUntil(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x8 != 0; + } + + function hasOrderInterceptor(uint16 spec) + public + pure + returns (bool) + { + return spec & 0x8 != 0; + } +} \ No newline at end of file diff --git a/contracts/spec/OrderSpecs.sol b/contracts/spec/OrderSpecs.sol new file mode 100644 index 00000000..d811fa4c --- /dev/null +++ b/contracts/spec/OrderSpecs.sol @@ -0,0 +1,80 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../helper/InputsHelper.sol"; +import "../impl/Data.sol"; +import "./OrderSpec.sol"; + + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +library OrderSpecs { + using OrderSpec for uint16; + using InputsHelper for Data.Inputs; + + function assembleOrders( + uint16[] specs, + Data.Inputs inputs + ) + public + pure + returns (Data.Order[] memory orders) + { + uint size = specs.length; + orders = new Data.Order[](size); + for (uint i = 0; i < size; i++) { + orders[i] = assembleOrder(specs[i], inputs); + } + } + + function assembleOrder( + uint16 spec, + Data.Inputs inputs + ) + internal + pure + returns (Data.Order memory) + { + return Data.Order( + inputs.nextAddress(), // owner + inputs.nextAddress(), // tokenS + address(0x0), // tokenB + inputs.nextUint(), // amountS + inputs.nextUint(), // amountB + inputs.nextUint(), // lrcFee + spec.hasDualAuth() ? inputs.nextAddress() : address(0x0), + spec.hasBroker() ? inputs.nextAddress() : address(0x0), + spec.hasOrderInterceptor() ? inputs.nextAddress() : address(0x0), + spec.hasWallet() ? inputs.nextAddress() : address(0x0), + spec.hasValidSince() ? inputs.nextUint() : 0, + spec.hasValidUntil() ? inputs.nextUint() : uint(0) - 1, + spec.hasSignature() ? inputs.nextBytes() : new bytes(0), + spec.hasDualAuth() ? inputs.nextBytes() : new bytes(0), + spec.limitByAmountB(), + spec.allOrNone(), + bytes32(0x0), // hash + address(0x0), // orderBrokerInterceptor + 0, // spendableLRC + 0, // maxAmountS + 0, // maxAmountB, + false // sellLRC + ); + } +} \ No newline at end of file diff --git a/contracts/spec/ParticipationSpec.sol b/contracts/spec/ParticipationSpec.sol new file mode 100644 index 00000000..cc37e903 --- /dev/null +++ b/contracts/spec/ParticipationSpec.sol @@ -0,0 +1,43 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; + + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +library ParticipationSpec { + + function orderIndex(uint8 spec) + public + pure + returns (uint) + { + return 0; + } + + function marginSplitAsFee(uint8 spec) + public + pure + returns (bool) + { + return false; + } +} \ No newline at end of file diff --git a/contracts/spec/RingSpecs.sol b/contracts/spec/RingSpecs.sol new file mode 100644 index 00000000..a212e699 --- /dev/null +++ b/contracts/spec/RingSpecs.sol @@ -0,0 +1,93 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.23; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../helper/InputsHelper.sol"; +import "../impl/Data.sol"; +import "./ParticipationSpec.sol"; + +/// @title An Implementation of IOrderbook. +/// @author Daniel Wang - . +library RingSpecs { + using ParticipationSpec for uint8; + using InputsHelper for Data.Inputs; + + function assembleRings( + uint8[][] specs, + Data.Order[] orders, + Data.Inputs inputs + ) + public + pure + returns (Data.Ring[] memory rings) + { + uint size = specs.length; + rings = new Data.Ring[](size); + for (uint i = 0; i < size; i++) { + rings[i] = assembleRing( + specs[i], + orders, + inputs + ); + } + } + + function assembleRing( + uint8[] pspecs, + Data.Order[] orders, + Data.Inputs inputs + ) + internal + pure + returns (Data.Ring memory) + { + uint size = pspecs.length; + require(size < 2 || size > 8, "bad ring size"); + + Data.Participation[] memory parts = new Data.Participation[](size); + address prevTokenS = address(0x0); + + for (uint i = 0; i < size; i++) { + uint8 pspec = pspecs[i]; + parts[i] = Data.Participation( + orders[pspec.orderIndex()], + pspec.marginSplitAsFee(), + inputs.nextUint(), + inputs.nextUint(), + 0, // splitS + 0, // splitB + 0, // lrcFee + 0, // lrcReward + 0, // fillAmountS + 0 // fillAmountB + ); + + parts[i].order.tokenB = prevTokenS; + prevTokenS = parts[i].order.tokenS; + } + + parts[0].order.tokenB = prevTokenS; + + return Data.Ring( + size, + parts, + bytes32(0x0) // hash + ); + } +} \ No newline at end of file From bc7fd31a3912c3183494b12a6eaf360e6e165e92 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Wed, 6 Jun 2018 17:35:25 +0800 Subject: [PATCH 45/68] update solidity to 0.4.24 and upgrade some dependency packages --- contracts/helper/InputsHelper.sol | 4 +- contracts/helper/MiningHelper.sol | 4 +- contracts/helper/OrderHelper.sol | 4 +- contracts/helper/ParticipationHelper.sol | 4 +- contracts/helper/RingHelper.sol | 4 +- contracts/iface/IBrokerInterceptor.sol | 4 +- contracts/iface/IBrokerRegistry.sol | 2 +- contracts/iface/IExchange.sol | 2 +- contracts/iface/IMinerInterceptor.sol | 4 +- contracts/iface/IMinerRegistry.sol | 2 +- contracts/iface/IOrderBook.sol | 2 +- contracts/iface/IOrderInterceptor.sol | 2 +- contracts/iface/IOrderRegistry.sol | 2 +- contracts/iface/IRingInterceptor.sol | 2 +- contracts/iface/ITokenFactory.sol | 2 +- contracts/iface/ITokenRegistry.sol | 2 +- contracts/iface/ITradeDelegate.sol | 2 +- contracts/impl/BrokerRegistry.sol | 2 +- contracts/impl/Data.sol | 4 +- contracts/impl/Exchange.sol | 2 +- contracts/impl/Exchange2.sol | 2 +- contracts/impl/Migrations.sol | 2 +- contracts/impl/MinerRegistry.sol | 2 +- contracts/impl/OrderBook.sol | 4 +- contracts/impl/OrderRegistry.sol | 2 +- contracts/impl/TokenFactory.sol | 2 +- contracts/impl/TokenRegistry.sol | 2 +- contracts/impl/TradeDelegate.sol | 2 +- contracts/lib/AddressUtil.sol | 2 +- contracts/lib/BytesUtil.sol | 2 +- contracts/lib/Claimable.sol | 2 +- contracts/lib/ERC20.sol | 2 +- contracts/lib/ERC20Token.sol | 2 +- contracts/lib/ITransferableMultsig.sol | 2 +- contracts/lib/MathBytes32.sol | 2 +- contracts/lib/MathUint.sol | 2 +- contracts/lib/MathUint8.sol | 2 +- contracts/lib/MultihashUtil.sol | 4 +- contracts/lib/NoDefaultFunc.sol | 2 +- contracts/lib/Ownable.sol | 2 +- contracts/lib/StringUtil.sol | 2 +- contracts/lib/TransferableMultsig.sol | 2 +- contracts/spec/MiningSpec.sol | 4 +- contracts/spec/OrderSpec.sol | 4 +- contracts/spec/OrderSpecs.sol | 4 +- contracts/spec/ParticipationSpec.sol | 4 +- contracts/spec/RingSpecs.sol | 4 +- contracts/test/DummyToken.sol | 2 +- package-lock.json | 11052 ++++++++++++--------- package.json | 8 +- 50 files changed, 6448 insertions(+), 4738 deletions(-) diff --git a/contracts/helper/InputsHelper.sol b/contracts/helper/InputsHelper.sol index f938acaf..110cc95a 100644 --- a/contracts/helper/InputsHelper.sol +++ b/contracts/helper/InputsHelper.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -54,4 +54,4 @@ library InputsHelper { { return inputs.bytesList[inputs.k++]; } -} \ No newline at end of file +} diff --git a/contracts/helper/MiningHelper.sol b/contracts/helper/MiningHelper.sol index e5b37982..e34e16fa 100644 --- a/contracts/helper/MiningHelper.sol +++ b/contracts/helper/MiningHelper.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -76,4 +76,4 @@ library MiningHelper { } } -} \ No newline at end of file +} diff --git a/contracts/helper/OrderHelper.sol b/contracts/helper/OrderHelper.sol index d4510697..9ce7e03b 100644 --- a/contracts/helper/OrderHelper.sol +++ b/contracts/helper/OrderHelper.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -193,4 +193,4 @@ library OrderHelper { } } } -} \ No newline at end of file +} diff --git a/contracts/helper/ParticipationHelper.sol b/contracts/helper/ParticipationHelper.sol index b34ee835..37608321 100644 --- a/contracts/helper/ParticipationHelper.sol +++ b/contracts/helper/ParticipationHelper.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -75,4 +75,4 @@ library ParticipationHelper { Data.Order memory order = p.order; } -} \ No newline at end of file +} diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol index fe78b88d..d710bda2 100644 --- a/contracts/helper/RingHelper.sol +++ b/contracts/helper/RingHelper.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -102,4 +102,4 @@ library RingHelper { smallest_ = j; } } -} \ No newline at end of file +} diff --git a/contracts/iface/IBrokerInterceptor.sol b/contracts/iface/IBrokerInterceptor.sol index 222f3dd8..4c58fe64 100644 --- a/contracts/iface/IBrokerInterceptor.sol +++ b/contracts/iface/IBrokerInterceptor.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -43,4 +43,4 @@ contract IBrokerInterceptor { ) public returns (bool ok); -} \ No newline at end of file +} diff --git a/contracts/iface/IBrokerRegistry.sol b/contracts/iface/IBrokerRegistry.sol index c605a385..88ea28c2 100644 --- a/contracts/iface/IBrokerRegistry.sol +++ b/contracts/iface/IBrokerRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/IExchange.sol b/contracts/iface/IExchange.sol index cd448111..7f9b1d9b 100644 --- a/contracts/iface/IExchange.sol +++ b/contracts/iface/IExchange.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/IMinerInterceptor.sol b/contracts/iface/IMinerInterceptor.sol index 81c0611e..3de0a0b8 100644 --- a/contracts/iface/IMinerInterceptor.sol +++ b/contracts/iface/IMinerInterceptor.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -22,4 +22,4 @@ pragma experimental "ABIEncoderV2"; /// @title IMinerInterceptor contract IMinerInterceptor { -} \ No newline at end of file +} diff --git a/contracts/iface/IMinerRegistry.sol b/contracts/iface/IMinerRegistry.sol index 75c69978..5239df09 100644 --- a/contracts/iface/IMinerRegistry.sol +++ b/contracts/iface/IMinerRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/IOrderBook.sol b/contracts/iface/IOrderBook.sol index 8a584668..9ac5bab4 100644 --- a/contracts/iface/IOrderBook.sol +++ b/contracts/iface/IOrderBook.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/IOrderInterceptor.sol b/contracts/iface/IOrderInterceptor.sol index a72f5dd4..36983993 100644 --- a/contracts/iface/IOrderInterceptor.sol +++ b/contracts/iface/IOrderInterceptor.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/IOrderRegistry.sol b/contracts/iface/IOrderRegistry.sol index f7ce20ed..b9fe80d6 100644 --- a/contracts/iface/IOrderRegistry.sol +++ b/contracts/iface/IOrderRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/IRingInterceptor.sol b/contracts/iface/IRingInterceptor.sol index 1f584860..d8ac1615 100644 --- a/contracts/iface/IRingInterceptor.sol +++ b/contracts/iface/IRingInterceptor.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/ITokenFactory.sol b/contracts/iface/ITokenFactory.sol index 7996611c..ca50dc0f 100644 --- a/contracts/iface/ITokenFactory.sol +++ b/contracts/iface/ITokenFactory.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/ITokenRegistry.sol b/contracts/iface/ITokenRegistry.sol index 40bef22f..dc8bb052 100644 --- a/contracts/iface/ITokenRegistry.sol +++ b/contracts/iface/ITokenRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/iface/ITradeDelegate.sol b/contracts/iface/ITradeDelegate.sol index a85d091b..b40d1078 100644 --- a/contracts/iface/ITradeDelegate.sol +++ b/contracts/iface/ITradeDelegate.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/BrokerRegistry.sol b/contracts/impl/BrokerRegistry.sol index d7bade78..fede7469 100644 --- a/contracts/impl/BrokerRegistry.sol +++ b/contracts/impl/BrokerRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/Data.sol b/contracts/impl/Data.sol index b3a14895..8e2eaace 100644 --- a/contracts/impl/Data.sol +++ b/contracts/impl/Data.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -111,4 +111,4 @@ library Data { Participation[] participations; bytes32 hash; } -} \ No newline at end of file +} diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index c8dfb4ca..338a3f89 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/Exchange2.sol b/contracts/impl/Exchange2.sol index fd2d7375..99fc10e6 100644 --- a/contracts/impl/Exchange2.sol +++ b/contracts/impl/Exchange2.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/Migrations.sol b/contracts/impl/Migrations.sol index fc7e0294..623745ac 100644 --- a/contracts/impl/Migrations.sol +++ b/contracts/impl/Migrations.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/MinerRegistry.sol b/contracts/impl/MinerRegistry.sol index 8008301c..dddc8611 100644 --- a/contracts/impl/MinerRegistry.sol +++ b/contracts/impl/MinerRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/OrderBook.sol b/contracts/impl/OrderBook.sol index 57e995a3..0dfb2f0c 100644 --- a/contracts/impl/OrderBook.sol +++ b/contracts/impl/OrderBook.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -33,4 +33,4 @@ contract OrderBook is IOrderBook, NoDefaultFunc { { } -} \ No newline at end of file +} diff --git a/contracts/impl/OrderRegistry.sol b/contracts/impl/OrderRegistry.sol index b3b04533..37f55923 100644 --- a/contracts/impl/OrderRegistry.sol +++ b/contracts/impl/OrderRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/TokenFactory.sol b/contracts/impl/TokenFactory.sol index 0a0d1f02..162a2804 100644 --- a/contracts/impl/TokenFactory.sol +++ b/contracts/impl/TokenFactory.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/TokenRegistry.sol b/contracts/impl/TokenRegistry.sol index e5fb29e7..df6e3170 100644 --- a/contracts/impl/TokenRegistry.sol +++ b/contracts/impl/TokenRegistry.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/impl/TradeDelegate.sol b/contracts/impl/TradeDelegate.sol index 78fe4c0b..38ff96cc 100644 --- a/contracts/impl/TradeDelegate.sol +++ b/contracts/impl/TradeDelegate.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/AddressUtil.sol b/contracts/lib/AddressUtil.sol index 485ad353..ef56cbba 100644 --- a/contracts/lib/AddressUtil.sol +++ b/contracts/lib/AddressUtil.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/BytesUtil.sol b/contracts/lib/BytesUtil.sol index 5c3ec22f..7da939fa 100644 --- a/contracts/lib/BytesUtil.sol +++ b/contracts/lib/BytesUtil.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/Claimable.sol b/contracts/lib/Claimable.sol index 830cf955..230515f5 100644 --- a/contracts/lib/Claimable.sol +++ b/contracts/lib/Claimable.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/ERC20.sol b/contracts/lib/ERC20.sol index d6664f09..09d89e37 100644 --- a/contracts/lib/ERC20.sol +++ b/contracts/lib/ERC20.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/ERC20Token.sol b/contracts/lib/ERC20Token.sol index 94ef9a0a..f64c3ec7 100644 --- a/contracts/lib/ERC20Token.sol +++ b/contracts/lib/ERC20Token.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/ITransferableMultsig.sol b/contracts/lib/ITransferableMultsig.sol index a0818751..ec895747 100644 --- a/contracts/lib/ITransferableMultsig.sol +++ b/contracts/lib/ITransferableMultsig.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/MathBytes32.sol b/contracts/lib/MathBytes32.sol index daa36e39..1964615e 100644 --- a/contracts/lib/MathBytes32.sol +++ b/contracts/lib/MathBytes32.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/MathUint.sol b/contracts/lib/MathUint.sol index 437d806d..180da15d 100644 --- a/contracts/lib/MathUint.sol +++ b/contracts/lib/MathUint.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/MathUint8.sol b/contracts/lib/MathUint8.sol index 238cde04..4dbe898f 100644 --- a/contracts/lib/MathUint8.sol +++ b/contracts/lib/MathUint8.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/MultihashUtil.sol b/contracts/lib/MultihashUtil.sol index 6e504223..c3cdf5c7 100644 --- a/contracts/lib/MultihashUtil.sol +++ b/contracts/lib/MultihashUtil.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -62,4 +62,4 @@ library MultihashUtil { revert("unsupported algorithm"); } } -} \ No newline at end of file +} diff --git a/contracts/lib/NoDefaultFunc.sol b/contracts/lib/NoDefaultFunc.sol index 80ce6531..c75d0b12 100644 --- a/contracts/lib/NoDefaultFunc.sol +++ b/contracts/lib/NoDefaultFunc.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/Ownable.sol b/contracts/lib/Ownable.sol index 4c82b5f7..4fd251bf 100644 --- a/contracts/lib/Ownable.sol +++ b/contracts/lib/Ownable.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/StringUtil.sol b/contracts/lib/StringUtil.sol index 9388591c..e9569851 100644 --- a/contracts/lib/StringUtil.sol +++ b/contracts/lib/StringUtil.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/lib/TransferableMultsig.sol b/contracts/lib/TransferableMultsig.sol index 7ef0542b..d4762e35 100644 --- a/contracts/lib/TransferableMultsig.sol +++ b/contracts/lib/TransferableMultsig.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/contracts/spec/MiningSpec.sol b/contracts/spec/MiningSpec.sol index f9099ca6..1fa24b2b 100644 --- a/contracts/spec/MiningSpec.sol +++ b/contracts/spec/MiningSpec.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -55,4 +55,4 @@ library MiningSpec { { return spec & 0x2 != 0; } -} \ No newline at end of file +} diff --git a/contracts/spec/OrderSpec.sol b/contracts/spec/OrderSpec.sol index 085eb672..a798d2f2 100644 --- a/contracts/spec/OrderSpec.sol +++ b/contracts/spec/OrderSpec.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -103,4 +103,4 @@ library OrderSpec { { return spec & 0x8 != 0; } -} \ No newline at end of file +} diff --git a/contracts/spec/OrderSpecs.sol b/contracts/spec/OrderSpecs.sol index d811fa4c..1b91b1c7 100644 --- a/contracts/spec/OrderSpecs.sol +++ b/contracts/spec/OrderSpecs.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -77,4 +77,4 @@ library OrderSpecs { false // sellLRC ); } -} \ No newline at end of file +} diff --git a/contracts/spec/ParticipationSpec.sol b/contracts/spec/ParticipationSpec.sol index cc37e903..6e71cb61 100644 --- a/contracts/spec/ParticipationSpec.sol +++ b/contracts/spec/ParticipationSpec.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -40,4 +40,4 @@ library ParticipationSpec { { return false; } -} \ No newline at end of file +} diff --git a/contracts/spec/RingSpecs.sol b/contracts/spec/RingSpecs.sol index a212e699..69a0ab0e 100644 --- a/contracts/spec/RingSpecs.sol +++ b/contracts/spec/RingSpecs.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; @@ -90,4 +90,4 @@ library RingSpecs { bytes32(0x0) // hash ); } -} \ No newline at end of file +} diff --git a/contracts/test/DummyToken.sol b/contracts/test/DummyToken.sol index a0b86b29..f6facc76 100644 --- a/contracts/test/DummyToken.sol +++ b/contracts/test/DummyToken.sol @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -pragma solidity 0.4.23; +pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; diff --git a/package-lock.json b/package-lock.json index 1c57f47f..a3edf977 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,39 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz", + "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==", + "dev": true + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + }, + "dependencies": { + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + } + } + }, "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", @@ -21,7 +54,7 @@ "resolved": "https://registry.npmjs.org/@types/bitwise-xor/-/bitwise-xor-0.0.30.tgz", "integrity": "sha1-mW95moABAFshbnJWC6oN+5xZwhY=", "requires": { - "@types/node": "9.3.0" + "@types/node": "*" } }, "@types/bluebird": { @@ -42,7 +75,7 @@ "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", "dev": true, "requires": { - "@types/node": "9.3.0" + "@types/node": "*" } }, "@types/lodash": { @@ -62,10 +95,10 @@ "integrity": "sha512-/KXM5oev+nNCLIgBjkwbk8VqxmzI56woD4VUxn95O+YeQ8hJzcSmIZ1IN3WexiqBb6srzDo2bdMbsXxgXNkz5Q==", "dev": true, "requires": { - "@types/caseless": "0.12.1", - "@types/form-data": "2.2.1", - "@types/node": "9.3.0", - "@types/tough-cookie": "2.3.2" + "@types/caseless": "*", + "@types/form-data": "*", + "@types/node": "*", + "@types/tough-cookie": "*" } }, "@types/request-promise-native": { @@ -74,7 +107,7 @@ "integrity": "sha512-m6PNeopPU75gjN3+dD9AeWwm7h2QIOuLnmn143+Qs0bMYFyri9/bhCgikHlgzH0gk7xR48nef82GWeRV6N3DxA==", "dev": true, "requires": { - "@types/request": "2.47.0" + "@types/request": "*" } }, "@types/tough-cookie": { @@ -83,10 +116,249 @@ "integrity": "sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA==", "dev": true }, + "@webassemblyjs/ast": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.10.tgz", + "integrity": "sha512-4BObuKRfeAnKdz5PfTp6MqSoCdj0z9EXu00PsQLzqcC55Htw5r9OXebS+sPF8T5tRTRI5/2w0CR52s/4vJ2fkw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.5.10", + "@webassemblyjs/helper-wasm-bytecode": "1.5.10", + "@webassemblyjs/wast-parser": "1.5.10", + "debug": "^3.1.0", + "mamacro": "^0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.10.tgz", + "integrity": "sha512-ns6H/06BTnk7thnN8O6MK9xMqodgaVKkjBaC8nXGLeAtX2ONHxQL2NnY4XgUzyo7yRwGVAPBxdl7yxzc0iy9Eg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.10.tgz", + "integrity": "sha512-OeWjB1Ie44sg5Nr8GVot5l+uclK4fWEQGH1b+HQ7x9GN9UxcJUIG3+u5dj2MTkthneQT1hUo09Wtpb/bY7zfXA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.10.tgz", + "integrity": "sha512-soggPYDku3gDl+zV1TVle3zLWgiU1Kli4QJdWCoeyX95RhGtF2A5tP7U3ypLlBb74SdoYYFVn3Fm7HXIWj1wzA==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.10.tgz", + "integrity": "sha512-1mNetGdoMMSW+spR7eC5kJZCA8g9aK7G0t2Mc5Q0p9Kw8p+gFgf9dO7fbThHP/+tNLHM6+SwUQ+S8s4BLhBtZQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.10" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.10.tgz", + "integrity": "sha512-ekKmiumHOJrlzZhrigZ19COsCbqNeHtnRN2wktMIaCHGobW/FW+d4Qv1svc0BetjoXo/DhSgVvhHoxaKSO3yPw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.10.tgz", + "integrity": "sha512-ce2KTWDlSCHhJZMOX+bgHGIKwYsx27MWySqffl8pqu9K+M1G4TlZCfRlN1dV85rAhn5OknOAHRBmRtceklY2/g==", + "dev": true, + "requires": { + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.10.tgz", + "integrity": "sha512-0noYMZDkkUZvHNpcOp9+ElMTwPxIyEWVc1bdjJ38qZTIX9ytCgRifs2DrF/1FfUxzI3d3xXFqrqCFfp+amAOaA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.10.tgz", + "integrity": "sha512-rXH6br9w+CYY/tN+N7MFmnUD5J/D4sBsl1K8liqKGpAXlsGp9SmEeqXy8yBWJ1wH3J3rNGaxQNbk9VR3qZgn0w==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.10", + "@webassemblyjs/helper-buffer": "1.5.10", + "@webassemblyjs/helper-wasm-bytecode": "1.5.10", + "@webassemblyjs/wasm-gen": "1.5.10", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.10.tgz", + "integrity": "sha512-WWlO5quQd3qOUT4wJiuodh5E1A8BfXYkOueuZZjEPL3budH5snqdWsPDieTqkBJnfCZGwRkRSn14OH4OPY1hsw==", + "dev": true, + "requires": { + "ieee754": "^1.1.11" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.10.tgz", + "integrity": "sha512-b+DWTy6RsRznpCKvsP3V5yNkk6YWs+7kLOJ3GU1ITyz846VIzVJda+K0mr31fgXzob/QWToWEx8ajk+PrOegkQ==", + "dev": true, + "requires": { + "leb": "^0.3.0" + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.10.tgz", + "integrity": "sha512-MQM04pZd0DoxukOPBJD4uaeVQ4iaWzRqsq7iDvJQBqcxIIEwi2iAPv+xjL2PbVwosCvwkh7FzKK3FHVQUjTlTQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.10.tgz", + "integrity": "sha512-mrMZw5A0+p6A58iquzq/d0SJej481H4pNwPO65rEjzDsHs+yykT6de26VQD2GtaCTThfSNcw3JJXWJ1biqO/+g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.10", + "@webassemblyjs/helper-buffer": "1.5.10", + "@webassemblyjs/helper-wasm-bytecode": "1.5.10", + "@webassemblyjs/helper-wasm-section": "1.5.10", + "@webassemblyjs/wasm-gen": "1.5.10", + "@webassemblyjs/wasm-opt": "1.5.10", + "@webassemblyjs/wasm-parser": "1.5.10", + "@webassemblyjs/wast-printer": "1.5.10", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.10.tgz", + "integrity": "sha512-MXYoZg7zaRGmU2h2FBa6Oo+y0etuDZycx0h7nrBD4LzVqhufenoWY4Be6K4IMU0L/fRb/GMp17Vfqg4m/J8EuQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.10", + "@webassemblyjs/helper-wasm-bytecode": "1.5.10", + "@webassemblyjs/ieee754": "1.5.10", + "@webassemblyjs/leb128": "1.5.10", + "@webassemblyjs/utf8": "1.5.10" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.10.tgz", + "integrity": "sha512-1A1rVPa1URgjCmEVZupRgrrbqwfCh6hJVkogK22JNygS+wn1gg1jgjN82Zd3NDhm738TwY61936n3y25GC+mfQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.10", + "@webassemblyjs/helper-buffer": "1.5.10", + "@webassemblyjs/wasm-gen": "1.5.10", + "@webassemblyjs/wasm-parser": "1.5.10", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.10.tgz", + "integrity": "sha512-VWSi7NWmfEuMpZ0+CTnBzz8qhxw7R17CwmbcJ+QJ0wfqReWEgP/J5yI4mN/C/lEoYuroFUF+sTWoDQqzH4FNdQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.10", + "@webassemblyjs/helper-api-error": "1.5.10", + "@webassemblyjs/helper-wasm-bytecode": "1.5.10", + "@webassemblyjs/ieee754": "1.5.10", + "@webassemblyjs/leb128": "1.5.10", + "@webassemblyjs/wasm-parser": "1.5.10" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.10.tgz", + "integrity": "sha512-RORXT40qjkFgowmFzqGFGBW3fuNd7UKJwyuYXeXLzqQOoPBySE1lsSrku0aQIcVl086dy297A+De5vPCfF/Rfg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.10", + "@webassemblyjs/floating-point-hex-parser": "1.5.10", + "@webassemblyjs/helper-api-error": "1.5.10", + "@webassemblyjs/helper-code-frame": "1.5.10", + "@webassemblyjs/helper-fsm": "1.5.10", + "long": "^3.2.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.10.tgz", + "integrity": "sha512-n4zZJmnETVc4RRs9wAZQr3dXUwC+Yyx+xwkaWdTk36NqgM89CPVLBpw8htKyKG+BX/tgk+VOXRwO+1x5Cf3J8Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.10", + "@webassemblyjs/wast-parser": "1.5.10", + "long": "^3.2.0" + } + }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", + "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", "dev": true }, "acorn-dynamic-import": { @@ -95,7 +367,7 @@ "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", "dev": true, "requires": { - "acorn": "5.5.3" + "acorn": "^5.0.0" } }, "ajv": { @@ -104,16 +376,16 @@ "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", "dev": true, "requires": { - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1", - "uri-js": "3.0.2" + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" } }, "ajv-keywords": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", - "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "ansi-escapes": { @@ -133,20 +405,14 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "any-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", - "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", - "dev": true - }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "aproba": { @@ -159,8 +425,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" }, "dependencies": { "isarray": { @@ -173,13 +439,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -187,7 +453,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -198,7 +464,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -225,7 +491,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -252,9 +518,9 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -264,6 +530,23 @@ "dev": true, "requires": { "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } } }, "assertion-error": { @@ -278,12 +561,6 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-types": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", - "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", - "dev": true - }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -297,9 +574,9 @@ "dev": true }, "atob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", - "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, "babel-code-frame": { @@ -308,44 +585,38 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" }, "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -360,14 +631,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { "jsesc": { @@ -390,9 +661,9 @@ "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -401,9 +672,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-call-delegate": { @@ -412,10 +683,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -424,10 +695,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -436,9 +707,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-explode-class": { @@ -447,10 +718,10 @@ "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", "dev": true, "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -459,11 +730,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -472,8 +743,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -482,8 +753,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -492,8 +763,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -502,9 +773,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -513,11 +784,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -526,12 +797,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -540,8 +811,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-messages": { @@ -550,7 +821,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -559,7 +830,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-async-functions": { @@ -634,9 +905,9 @@ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-async-to-generator": { @@ -645,9 +916,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-constructor-call": { @@ -656,9 +927,9 @@ "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", "dev": true, "requires": { - "babel-plugin-syntax-class-constructor-call": "6.18.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-class-properties": { @@ -667,10 +938,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-decorators": { @@ -679,11 +950,11 @@ "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", "dev": true, "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -692,7 +963,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -701,7 +972,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -710,11 +981,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -723,15 +994,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -740,8 +1011,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -750,7 +1021,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -759,8 +1030,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -769,7 +1040,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -778,9 +1049,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -789,7 +1060,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -798,9 +1069,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -809,10 +1080,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -821,9 +1092,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -832,9 +1103,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -843,8 +1114,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -853,12 +1124,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -867,8 +1138,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -877,7 +1148,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -886,9 +1157,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -897,7 +1168,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -906,7 +1177,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -915,9 +1186,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -926,9 +1197,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-export-extensions": { @@ -937,8 +1208,8 @@ "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", "dev": true, "requires": { - "babel-plugin-syntax-export-extensions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -947,8 +1218,8 @@ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -957,8 +1228,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -967,7 +1238,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -976,8 +1247,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-es2015": { @@ -986,30 +1257,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" } }, "babel-preset-stage-1": { @@ -1018,9 +1289,9 @@ "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", "dev": true, "requires": { - "babel-plugin-transform-class-constructor-call": "6.24.1", - "babel-plugin-transform-export-extensions": "6.22.0", - "babel-preset-stage-2": "6.24.1" + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" } }, "babel-preset-stage-2": { @@ -1029,10 +1300,10 @@ "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", "dev": true, "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" } }, "babel-preset-stage-3": { @@ -1041,11 +1312,11 @@ "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", "dev": true, "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" } }, "babel-register": { @@ -1054,13 +1325,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.4", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" }, "dependencies": { "source-map": { @@ -1075,7 +1346,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } } } @@ -1086,8 +1357,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.4", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1096,11 +1367,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" }, "dependencies": { "babylon": { @@ -1117,15 +1388,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.5" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" }, "dependencies": { "babylon": { @@ -1142,16 +1413,16 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "balanced-match": { @@ -1166,13 +1437,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1181,7 +1452,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1190,7 +1461,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1199,7 +1470,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1208,9 +1479,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -1266,7 +1537,7 @@ "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "bitwise-xor": { @@ -1279,7 +1550,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.5" }, "dependencies": { "isarray": { @@ -1292,13 +1563,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -1306,7 +1577,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -1327,7 +1598,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1337,9 +1608,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "brorand": { @@ -1358,11 +1629,11 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.2", - "inherits": "2.0.3" + "buffer-xor": "^1.0.2", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-cipher": { @@ -1371,9 +1642,9 @@ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.0.6", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.2" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -1382,9 +1653,9 @@ "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { @@ -1393,8 +1664,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sha3": { @@ -1402,7 +1673,7 @@ "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", "requires": { - "js-sha3": "0.3.1" + "js-sha3": "^0.3.1" }, "dependencies": { "js-sha3": { @@ -1418,13 +1689,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1433,7 +1704,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "buffer": { @@ -1442,9 +1713,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.11", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" }, "dependencies": { "isarray": { @@ -1456,9 +1727,9 @@ } }, "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", "dev": true }, "buffer-xor": { @@ -1484,19 +1755,19 @@ "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.1", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.3.0", - "unique-filename": "1.1.0", - "y18n": "4.0.0" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" }, "dependencies": { "y18n": { @@ -1513,15 +1784,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" }, "dependencies": { "isobject": { @@ -1555,6 +1826,12 @@ } } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -1567,12 +1844,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" } }, "chalk": { @@ -1581,11 +1858,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "chardet": { @@ -1606,15 +1883,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "chownr": { @@ -1633,8 +1910,8 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "class-utils": { @@ -1643,10 +1920,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -1655,7 +1932,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "isobject": { @@ -1672,7 +1949,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-spinners": { @@ -1705,7 +1982,7 @@ "dev": true, "requires": { "slice-ansi": "0.0.4", - "string-width": "1.0.2" + "string-width": "^1.0.1" } }, "cli-width": { @@ -1720,9 +1997,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone": { @@ -1743,7 +2020,7 @@ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, "requires": { - "mimic-response": "1.0.0" + "mimic-response": "^1.0.0" } }, "clone-stats": { @@ -1758,9 +2035,9 @@ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { - "inherits": "2.0.3", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.5" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" }, "dependencies": { "isarray": { @@ -1781,13 +2058,13 @@ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -1796,7 +2073,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -1818,8 +2095,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -1828,7 +2105,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -1873,10 +2150,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { "isarray": { @@ -1897,13 +2174,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -1912,7 +2189,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -1923,7 +2200,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "console-control-strings": { @@ -1949,12 +2226,12 @@ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "1.1.2", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, "copy-descriptor": { @@ -1969,12 +2246,12 @@ "integrity": "sha1-qNo6xBqiIgrim9PFi2mEKU8sWTw=", "dev": true, "requires": { - "glob": "7.1.2", - "ltcdr": "2.2.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", + "glob": "^7.0.5", + "ltcdr": "^2.2.1", + "minimatch": "^3.0.3", + "mkdirp": "^0.5.1", "noms": "0.0.0", - "through2": "2.0.3" + "through2": "^2.0.1" } }, "core-js": { @@ -1989,13 +2266,13 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "create-ecdh": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", - "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -2003,10 +2280,10 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -2014,12 +2291,12 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -2028,9 +2305,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-browserify": { @@ -2039,17 +2316,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "crypto-js": { @@ -2068,7 +2345,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "0.10.35" + "es5-ext": "^0.10.9" } }, "dargs": { @@ -2096,9 +2373,9 @@ "dev": true }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -2122,7 +2399,7 @@ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, "requires": { - "mimic-response": "1.0.0" + "mimic-response": "^1.0.0" } }, "deep-eql": { @@ -2131,22 +2408,17 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.8" + "type-detect": "^4.0.0" } }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2155,7 +2427,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2164,7 +2436,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2173,9 +2445,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -2203,8 +2475,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "detect-conflict": { @@ -2219,7 +2491,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "diff": { @@ -2234,9 +2506,36 @@ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "dirty-chai": { @@ -2256,9 +2555,9 @@ "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", "requires": { - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "create-hmac": "1.1.6" + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" } }, "duplexer3": { @@ -2268,15 +2567,15 @@ "dev": true }, "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "dev": true, "requires": { - "end-of-stream": "1.4.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, "dependencies": { "isarray": { @@ -2297,13 +2596,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -2312,7 +2611,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -2323,12 +2622,6 @@ "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", "dev": true }, - "ejs": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.8.tgz", - "integrity": "sha512-QIDZL54fyV8MDcAsO91BMH1ft2qGGaHIJsJIA/+t+7uvXol1dm413fPcUgUb4k8F/9457rx4/KFE4XfDifrQxQ==", - "dev": true - }, "elegant-spinner": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", @@ -2340,13 +2633,13 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -2360,7 +2653,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { @@ -2369,18 +2662,24 @@ "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.0.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, + "envinfo": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-5.10.0.tgz", + "integrity": "sha512-rXbzXWvnQxy+TcqZlARbWVQwgGVVouVJgFZhLVN5htjLxl1thstrP2ZGi0pXC309AbK7gVOPU+ulz/tmpCI7iw==", + "dev": true + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error": { @@ -2389,8 +2688,8 @@ "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", "dev": true, "requires": { - "string-template": "0.2.1", - "xtend": "4.0.1" + "string-template": "~0.2.1", + "xtend": "~4.0.0" } }, "error-ex": { @@ -2399,7 +2698,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es5-ext": { @@ -2407,8 +2706,8 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" } }, "es6-iterator": { @@ -2416,9 +2715,9 @@ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -2426,12 +2725,12 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-promise": { @@ -2444,7 +2743,7 @@ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "4.1.1" + "es6-promise": "^4.0.3" } }, "es6-set": { @@ -2452,11 +2751,11 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -2464,8 +2763,8 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "escape-string-regexp": { @@ -2479,8 +2778,8 @@ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { @@ -2495,7 +2794,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -2513,8 +2812,8 @@ "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", "requires": { - "bn.js": "4.11.8", - "ethereumjs-util": "4.5.0" + "bn.js": "^4.10.0", + "ethereumjs-util": "^4.3.0" }, "dependencies": { "ethereumjs-util": { @@ -2522,11 +2821,11 @@ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", "requires": { - "bn.js": "4.11.8", - "create-hash": "1.1.3", - "keccakjs": "0.2.1", - "rlp": "2.0.0", - "secp256k1": "3.3.0" + "bn.js": "^4.8.0", + "create-hash": "^1.1.2", + "keccakjs": "^0.2.0", + "rlp": "^2.0.0", + "secp256k1": "^3.0.1" } } } @@ -2536,13 +2835,13 @@ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.5.tgz", "integrity": "sha512-xPaSEATYJpMTCGowIt0oMZwFP4R1bxd6QsWgkcDvFL0JtXsr39p32WEcD14RscCjfP41YXZPCVWA4yAg0nrJmw==", "requires": { - "bn.js": "4.11.8", - "create-hash": "1.1.3", - "ethjs-util": "0.1.4", - "keccak": "1.4.0", - "rlp": "2.0.0", - "safe-buffer": "5.1.1", - "secp256k1": "3.3.0" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" } }, "ethjs-util": { @@ -2559,8 +2858,8 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "events": { @@ -2573,8 +2872,8 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.2.tgz", "integrity": "sha512-ni0r0lrm7AOzsh2qC5mi9sj8S0gmj5fLNjfFpxN05FB4tAVZEKotbkjOtLPqTCX/CXT7NsUr6juZb4IFJeNNdA==", "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -2583,13 +2882,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exit-hook": { @@ -2604,7 +2903,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -2613,7 +2912,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "expand-template": { @@ -2627,7 +2926,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "extend-shallow": { @@ -2636,8 +2935,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2646,7 +2945,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2657,9 +2956,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -2668,7 +2967,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "fast-deep-equal": { @@ -2677,392 +2976,745 @@ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.2.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "fast-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", + "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "first-chunk-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", - "dev": true, - "requires": { - "readable-stream": "2.3.5" + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.0.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } - } - } - }, - "flow-parser": { - "version": "0.69.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.69.0.tgz", - "integrity": "sha1-N4tRKNbQtVSosvFqTKPhq5ZJ8A4=", - "dev": true - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "kind-of": "^6.0.0" } - } - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "1.0.34" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.6.2", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, - "optional": true + "requires": { + "kind-of": "^6.0.0" + } }, - "ajv": { - "version": "4.11.8", - "bundled": true, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, - "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "ansi-regex": { + "is-extglob": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, - "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "is-extglob": "^2.1.1" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, - "optional": true + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, - "optional": true, "requires": { - "tweetnacl": "0.14.5" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true }, - "block-stream": { - "version": "0.0.9", - "bundled": true, + "randomatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "inherits": "2.0.3" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, - "boom": { - "version": "2.10.1", - "bundled": true, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { - "hoek": "2.16.3" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" + "safe-buffer": "~5.1.0" } - }, - "buffer-shims": { + } + } + }, + "flow-parser": { + "version": "0.69.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.69.0.tgz", + "integrity": "sha1-N4tRKNbQtVSosvFqTKPhq5ZJ8A4=", + "dev": true + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true }, "co": { "version": "4.6.0", @@ -3080,7 +3732,7 @@ "bundled": true, "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -3104,7 +3756,7 @@ "dev": true, "optional": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { @@ -3113,7 +3765,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -3156,7 +3808,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -3182,9 +3834,9 @@ "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fs.realpath": { @@ -3197,10 +3849,10 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -3209,9 +3861,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { @@ -3220,14 +3872,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "getpass": { @@ -3236,7 +3888,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -3252,12 +3904,12 @@ "bundled": true, "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-fs": { @@ -3277,8 +3929,8 @@ "dev": true, "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has-unicode": { @@ -3293,10 +3945,10 @@ "dev": true, "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -3310,9 +3962,9 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { @@ -3320,8 +3972,8 @@ "bundled": true, "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3340,7 +3992,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-typedarray": { @@ -3366,7 +4018,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "jsbn": { @@ -3387,7 +4039,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -3432,7 +4084,7 @@ "bundled": true, "dev": true, "requires": { - "mime-db": "1.27.0" + "mime-db": "~1.27.0" } }, "minimatch": { @@ -3440,7 +4092,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "1.1.7" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3468,15 +4120,15 @@ "dev": true, "optional": true, "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "^2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { @@ -3485,8 +4137,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -3495,10 +4147,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3523,7 +4175,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3544,8 +4196,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -3582,10 +4234,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3601,13 +4253,13 @@ "bundled": true, "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "request": { @@ -3616,28 +4268,28 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { @@ -3645,7 +4297,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -3677,7 +4329,7 @@ "dev": true, "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { @@ -3686,15 +4338,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -3710,9 +4362,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -3720,7 +4372,7 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "stringstream": { @@ -3734,7 +4386,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3748,9 +4400,9 @@ "bundled": true, "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -3759,14 +4411,14 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { @@ -3775,7 +4427,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -3784,7 +4436,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -3825,7 +4477,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -3841,8 +4493,8 @@ "integrity": "sha512-FdTeyk4uLRHGeFiMe+Qnh4Hc5KiTVqvRVVvLDFJEVVKC1P1yHhEgZeh9sp1KhuvxSrxToxgJS25UapYQwH4zHw==", "dev": true, "requires": { - "source-map-support": "0.5.4", - "webpack-cli": "2.0.13" + "source-map-support": "^0.5.3", + "webpack-cli": "^2.0.9" } }, "gauge": { @@ -3850,14 +4502,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "aproba": "1.1.2", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "get-caller-file": { @@ -3890,8 +4542,8 @@ "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", "dev": true, "requires": { - "got": "7.1.0", - "is-plain-obj": "1.1.0" + "got": "^7.0.0", + "is-plain-obj": "^1.1.0" }, "dependencies": { "got": { @@ -3900,20 +4552,20 @@ "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", "dev": true, "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" } }, "p-cancelable": { @@ -3928,7 +4580,7 @@ "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "dev": true, "requires": { - "p-finally": "1.0.0" + "p-finally": "^1.0.0" } }, "prepend-http": { @@ -3943,7 +4595,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } } } @@ -3959,7 +4611,7 @@ "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", "dev": true, "requires": { - "gh-got": "6.0.0" + "gh-got": "^6.0.0" } }, "glob": { @@ -3968,12 +4620,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-all": { @@ -3982,8 +4634,8 @@ "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", "dev": true, "requires": { - "glob": "7.1.2", - "yargs": "1.2.6" + "glob": "^7.0.5", + "yargs": "~1.2.6" }, "dependencies": { "minimist": { @@ -3998,7 +4650,7 @@ "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", "dev": true, "requires": { - "minimist": "0.1.0" + "minimist": "^0.1.0" } } } @@ -4009,8 +4661,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -4019,18 +4671,24 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -4039,11 +4697,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.4", - "is-windows": "1.0.2", - "which": "1.3.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -4052,71 +4710,19 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "got": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.0.tgz", - "integrity": "sha512-kBNy/S2CGwrYgDSec5KTWGKUvupwkkTVAjIsVFF2shXO13xpZdFP4d4kxa//CLX2tN/rV0aYwK8vY6UKWGn2vQ==", - "dev": true, - "requires": { - "@sindresorhus/is": "0.7.0", - "cacheable-request": "2.1.4", - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "into-stream": "3.1.0", - "is-retry-allowed": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "mimic-response": "1.0.0", - "p-cancelable": "0.4.1", - "p-timeout": "2.0.1", - "pify": "3.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "3.0.0", - "url-to-options": "1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, "grouped-queue": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "^4.17.2" } }, "growl": { @@ -4131,7 +4737,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-color": { @@ -4158,7 +4764,7 @@ "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, "requires": { - "has-symbol-support-x": "1.4.2" + "has-symbol-support-x": "^1.4.1" } }, "has-unicode": { @@ -4172,9 +4778,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -4191,8 +4797,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -4201,7 +4807,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4210,7 +4816,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4221,7 +4827,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4231,7 +4837,7 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "hash.js": { @@ -4239,8 +4845,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "he": { @@ -4254,9 +4860,9 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "home-or-tmp": { @@ -4265,8 +4871,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "homedir-polyfill": { @@ -4275,7 +4881,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -4314,19 +4920,35 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, - "indent-string": { + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexof": { @@ -4341,8 +4963,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -4361,19 +4983,19 @@ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.5", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -4388,7 +5010,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4397,9 +5019,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -4420,8 +5042,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -4430,7 +5052,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -4439,7 +5061,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4456,8 +5078,8 @@ "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "dev": true, "requires": { - "from2": "2.3.0", - "p-is-promise": "1.1.0" + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" } }, "invariant": { @@ -4466,7 +5088,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -4481,7 +5103,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -4496,7 +5118,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.10.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -4511,7 +5133,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-data-descriptor": { @@ -4520,7 +5142,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-descriptor": { @@ -4529,9 +5151,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -4554,7 +5176,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -4575,7 +5197,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -4583,7 +5205,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -4592,7 +5214,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-hex-prefixed": { @@ -4606,7 +5228,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-object": { @@ -4615,30 +5237,13 @@ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, - "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "dev": true, - "requires": { - "symbol-observable": "0.2.4" - }, - "dependencies": { - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", - "dev": true - } - } - }, "is-odd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -4661,7 +5266,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -4702,7 +5307,7 @@ "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", "dev": true, "requires": { - "scoped-regex": "1.0.0" + "scoped-regex": "^1.0.0" } }, "is-stream": { @@ -4729,6 +5334,12 @@ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4758,9 +5369,9 @@ "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", "dev": true, "requires": { - "binaryextensions": "2.1.1", - "editions": "1.3.4", - "textextensions": "2.2.0" + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" } }, "isurl": { @@ -4769,8 +5380,8 @@ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, "js-sha3": { @@ -4791,26 +5402,52 @@ "dev": true }, "jscodeshift": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.0.tgz", - "integrity": "sha512-JAcQINNMFpdzzpKJN8k5xXjF3XDuckB1/48uScSzcnNyK199iWEc9AxKL9OoX5144M2w5zEx9Qs4/E/eBZZUlw==", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "7.0.0-beta.44", - "colors": "1.2.1", - "flow-parser": "0.69.0", - "lodash": "4.17.5", - "micromatch": "2.3.11", - "neo-async": "2.5.0", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.1.tgz", + "integrity": "sha512-sRMollbhbmSDrR79JMAnhEjyZJlQQVozeeY9A6/KNuV26DNcuB3mGSCWXp0hks9dcwRNOELbNOiwraZaXXRk5Q==", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^7.0.0-beta.47", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", + "neo-async": "^2.5.0", "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.14.7", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" + "nomnom": "^1.8.1", + "recast": "^0.15.0", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" + }, + "dependencies": { + "ast-types": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.5.tgz", + "integrity": "sha512-oJjo+5e7/vEc2FBK8gUalV0pba4L3VdBIs2EKhOLHLcOd2FgQIVQN9xb0eZ9IjEWyAL7vq6fGJxOvVvdCHNyMw==", + "dev": true + }, + "babylon": { + "version": "7.0.0-beta.47", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", + "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==", + "dev": true + }, + "recast": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.15.0.tgz", + "integrity": "sha512-47C2mIxQYvFICrTNuV4+xGgBa1nAoq42ANN5oDTSBIJ50NX7jcki7gAC6HWYptnQgHmqIRTHJq8OKdi3fwgyNQ==", + "dev": true, + "requires": { + "ast-types": "0.11.5", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" + } + } } }, "jsesc": { @@ -4837,12 +5474,6 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -4855,7 +5486,7 @@ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "keccak": { @@ -4863,10 +5494,10 @@ "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", "requires": { - "bindings": "1.3.0", - "inherits": "2.0.3", - "nan": "2.6.2", - "safe-buffer": "5.1.1" + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" } }, "keccakjs": { @@ -4874,8 +5505,8 @@ "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", "requires": { - "browserify-sha3": "0.0.1", - "sha3": "1.2.0" + "browserify-sha3": "^0.0.1", + "sha3": "^1.1.0" } }, "keyv": { @@ -4893,7 +5524,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "klaw": { @@ -4902,7 +5533,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "lcid": { @@ -4911,55 +5542,15 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" - } - }, - "listr": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", - "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.4.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.8", - "stream-to-observable": "0.2.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - } + "invert-kv": "^1.0.0" } }, + "leb": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", + "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=", + "dev": true + }, "listr-silent-renderer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", @@ -4972,14 +5563,14 @@ "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" }, "dependencies": { "figures": { @@ -4988,8 +5579,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "indent-string": { @@ -5004,7 +5595,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } } } @@ -5015,10 +5606,10 @@ "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" }, "dependencies": { "cli-cursor": { @@ -5027,7 +5618,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "figures": { @@ -5036,8 +5627,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "onetime": { @@ -5052,8 +5643,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } @@ -5064,11 +5655,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "loader-runner": { @@ -5083,9 +5674,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "locate-path": { @@ -5094,8 +5685,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -5111,87 +5702,19 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "2.3.2" + "chalk": "^2.0.1" }, "dependencies": { "ansi-styles": { @@ -5200,7 +5723,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5209,9 +5732,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -5226,7 +5749,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5237,8 +5760,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" }, "dependencies": { "ansi-escapes": { @@ -5253,7 +5776,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "onetime": { @@ -5268,19 +5791,25 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lowercase-keys": { @@ -5295,8 +5824,8 @@ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "ltcdr": { @@ -5311,7 +5840,7 @@ "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -5322,6 +5851,12 @@ } } }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -5334,16 +5869,22 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" }, "dependencies": { "hash-base": { @@ -5351,8 +5892,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } } } @@ -5363,7 +5904,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "mem-fs": { @@ -5372,61 +5913,9 @@ "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", "dev": true, "requires": { - "through2": "2.0.3", - "vinyl": "1.2.0", - "vinyl-file": "2.0.0" - } - }, - "mem-fs-editor": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz", - "integrity": "sha1-3Qpuryu4prN3QAZ6pUnrUwEFr58=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "deep-extend": "0.4.2", - "ejs": "2.5.8", - "glob": "7.1.2", - "globby": "6.1.0", - "mkdirp": "0.5.1", - "multimatch": "2.1.0", - "rimraf": "2.6.2", - "through2": "2.0.3", - "vinyl": "2.1.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "dev": true, - "requires": { - "clone": "2.1.2", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" - } - } + "through2": "^2.0.0", + "vinyl": "^1.1.0", + "vinyl-file": "^2.0.0" } }, "memory-fs": { @@ -5435,8 +5924,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.5" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" }, "dependencies": { "isarray": { @@ -5457,13 +5946,13 @@ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -5472,7 +5961,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -5483,25 +5972,31 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "miller-rabin": { @@ -5510,8 +6005,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mimic-fn": { @@ -5542,7 +6037,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -5556,16 +6051,16 @@ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.5.4", - "end-of-stream": "1.4.0", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" }, "dependencies": { "pump": { @@ -5574,8 +6069,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "1.4.0", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -5586,8 +6081,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -5596,7 +6091,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -5642,7 +6137,7 @@ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -5653,12 +6148,12 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "1.1.2", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "ms": { @@ -5673,10 +6168,10 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" } }, "mute-stream": { @@ -5696,18 +6191,18 @@ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "arr-diff": { @@ -5759,28 +6254,28 @@ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.1", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -5808,13 +6303,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -5823,7 +6318,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -5834,8 +6329,8 @@ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", "dev": true, "requires": { - "chalk": "0.4.0", - "underscore": "1.6.0" + "chalk": "~0.4.0", + "underscore": "~1.6.0" }, "dependencies": { "ansi-styles": { @@ -5850,9 +6345,9 @@ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" } }, "strip-ansi": { @@ -5869,8 +6364,8 @@ "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "1.0.34" + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" } }, "noop-logger": { @@ -5884,10 +6379,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -5896,7 +6391,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-url": { @@ -5905,133 +6400,143 @@ "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, "requires": { - "prepend-http": "2.0.0", - "query-string": "5.1.1", - "sort-keys": "2.0.0" + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" } }, "npm": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-5.8.0.tgz", - "integrity": "sha512-DowXzQwtSWDtbAjuWecuEiismR0VdNEYaL3VxNTYTdW6AGkYxfGk9LUZ/rt6etEyiH4IEk95HkJeGfXE5Rz9xQ==", - "requires": { - "JSONStream": "1.3.2", - "abbrev": "1.1.1", - "ansi-regex": "3.0.0", - "ansicolors": "0.3.2", - "ansistyles": "0.1.3", - "aproba": "1.2.0", - "archy": "1.0.0", - "bin-links": "1.1.0", - "bluebird": "3.5.1", - "cacache": "10.0.4", - "call-limit": "1.1.0", - "chownr": "1.0.1", - "cli-table2": "0.2.0", - "cmd-shim": "2.0.2", - "columnify": "1.5.4", - "config-chain": "1.1.11", - "debuglog": "1.0.1", - "detect-indent": "5.0.0", - "detect-newline": "2.1.0", - "dezalgo": "1.0.3", - "editor": "1.0.0", - "find-npm-prefix": "1.0.2", - "fs-vacuum": "1.2.10", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "has-unicode": "2.0.1", - "hosted-git-info": "2.6.0", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "inflight": "1.0.6", - "inherits": "2.0.3", - "ini": "1.3.5", - "init-package-json": "1.10.3", - "is-cidr": "1.0.0", - "json-parse-better-errors": "1.0.1", - "lazy-property": "1.0.0", - "libcipm": "1.6.0", - "libnpx": "10.0.1", - "lockfile": "1.0.3", - "lodash._baseindexof": "3.1.0", - "lodash._baseuniq": "4.6.0", - "lodash._bindcallback": "3.0.1", - "lodash._cacheindexof": "3.0.2", - "lodash._createcache": "3.1.2", - "lodash._getnative": "3.9.1", - "lodash.clonedeep": "4.5.0", - "lodash.restparam": "3.6.1", - "lodash.union": "4.6.0", - "lodash.uniq": "4.5.0", - "lodash.without": "4.4.0", - "lru-cache": "4.1.1", - "meant": "1.0.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "nopt": "4.0.1", - "normalize-package-data": "2.4.0", - "npm-cache-filename": "1.0.2", - "npm-install-checks": "3.0.0", - "npm-lifecycle": "2.0.1", - "npm-package-arg": "6.0.0", - "npm-packlist": "1.1.10", - "npm-profile": "3.0.1", - "npm-registry-client": "8.5.1", - "npm-user-validate": "1.0.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "opener": "1.4.3", - "osenv": "0.1.5", - "pacote": "7.6.1", - "path-is-inside": "1.0.2", - "promise-inflight": "1.0.1", - "qrcode-terminal": "0.11.0", - "query-string": "5.1.0", - "qw": "1.0.1", - "read": "1.0.7", - "read-cmd-shim": "1.0.1", - "read-installed": "4.0.3", - "read-package-json": "2.0.13", - "read-package-tree": "5.1.6", - "readable-stream": "2.3.5", - "readdir-scoped-modules": "1.0.2", - "request": "2.83.0", - "retry": "0.10.1", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "sha": "2.0.1", - "slide": "1.1.6", - "sorted-object": "2.0.1", - "sorted-union-stream": "2.1.3", - "ssri": "5.2.4", - "strip-ansi": "4.0.0", - "tar": "4.4.0", - "text-table": "0.2.0", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.1.0.tgz", + "integrity": "sha512-e38cCtJ0lEjLXXpc4twEfj8Xw5hDLolc2Py87ueWnUhJfZ8GA/5RVIeD+XbSr1+aVRGsRsdtLdzUNO63PvQJ1w==", + "requires": { + "JSONStream": "^1.3.2", + "abbrev": "~1.1.1", + "ansi-regex": "~3.0.0", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "~1.2.0", + "archy": "~1.0.0", + "bin-links": "^1.1.2", + "bluebird": "~3.5.1", + "byte-size": "^4.0.3", + "cacache": "^11.0.2", + "call-limit": "~1.1.0", + "chownr": "~1.0.1", + "cli-columns": "^3.1.2", + "cli-table2": "~0.2.0", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.11", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.1.0", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.0.1", + "glob": "~7.1.2", + "graceful-fs": "~4.1.11", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.6.0", + "iferr": "^1.0.0", + "imurmurhash": "*", + "inflight": "~1.0.6", + "inherits": "~2.0.3", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^2.0.5", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^1.6.2", + "libnpmhook": "^4.0.1", + "libnpx": "^10.2.0", + "lock-verify": "^2.0.2", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^4.1.3", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "~0.5.1", + "move-concurrently": "^1.0.1", + "node-gyp": "^3.6.2", + "nopt": "~4.0.1", + "normalize-package-data": "~2.4.0", + "npm-audit-report": "^1.2.1", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~3.0.0", + "npm-lifecycle": "^2.0.3", + "npm-package-arg": "^6.1.0", + "npm-packlist": "~1.1.10", + "npm-pick-manifest": "^2.1.0", + "npm-profile": "^3.0.1", + "npm-registry-client": "^8.5.1", + "npm-registry-fetch": "^1.1.0", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "~1.4.3", + "osenv": "^0.1.5", + "pacote": "^8.1.5", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.1.0", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "~1.0.1", + "read-installed": "~4.0.3", + "read-package-json": "^2.0.13", + "read-package-tree": "^5.2.1", + "readable-stream": "^2.3.6", + "readdir-scoped-modules": "*", + "request": "^2.86.0", + "retry": "^0.12.0", + "rimraf": "~2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.0", + "strip-ansi": "~4.0.0", + "tar": "^4.4.1", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", "uid-number": "0.0.6", - "umask": "1.1.0", - "unique-filename": "1.1.0", - "unpipe": "1.0.0", - "update-notifier": "2.3.0", - "uuid": "3.2.1", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "3.0.0", - "which": "1.3.0", - "worker-farm": "1.5.4", - "wrappy": "1.0.2", - "write-file-atomic": "2.3.0" + "umask": "~1.1.0", + "unique-filename": "~1.1.0", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.2.1", + "validate-npm-package-license": "^3.0.3", + "validate-npm-package-name": "~3.0.0", + "which": "~1.3.0", + "worker-farm": "^1.6.0", + "wrappy": "~1.0.2", + "write-file-atomic": "^2.3.0" }, "dependencies": { "JSONStream": { "version": "1.3.2", "bundled": true, "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" }, "dependencies": { "jsonparse": { @@ -6069,172 +6574,44 @@ "bundled": true }, "bin-links": { - "version": "1.1.0", + "version": "1.1.2", "bundled": true, "requires": { - "bluebird": "3.5.1", - "cmd-shim": "2.0.2", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "graceful-fs": "4.1.11", - "slide": "1.1.6" + "bluebird": "^3.5.0", + "cmd-shim": "^2.0.2", + "gentle-fs": "^2.0.0", + "graceful-fs": "^4.1.11", + "write-file-atomic": "^2.3.0" } }, "bluebird": { "version": "3.5.1", "bundled": true }, + "byte-size": { + "version": "4.0.3", + "bundled": true + }, "cacache": { - "version": "10.0.4", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.1", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.2.4", - "unique-filename": "1.1.0", - "y18n": "4.0.0" + "version": "11.0.2", + "bundled": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" }, "dependencies": { - "mississippi": { - "version": "2.0.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.1", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.1", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.4", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, "y18n": { "version": "4.0.0", "bundled": true @@ -6249,58 +6626,102 @@ "version": "1.0.1", "bundled": true }, - "cli-table2": { - "version": "0.2.0", + "cli-columns": { + "version": "3.1.2", "bundled": true, "requires": { - "colors": "1.1.2", - "lodash": "3.10.1", - "string-width": "1.0.2" + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" }, "dependencies": { - "colors": { - "version": "1.1.2", - "bundled": true, - "optional": true - }, - "lodash": { - "version": "3.10.1", - "bundled": true - }, "string-width": { - "version": "1.0.2", + "version": "2.1.1", "bundled": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } + "version": "2.0.0", + "bundled": true }, "strip-ansi": { - "version": "3.0.1", + "version": "4.0.0", "bundled": true, "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "cli-table2": { + "version": "0.2.0", + "bundled": true, + "requires": { + "colors": "^1.1.2", + "lodash": "^3.10.1", + "string-width": "^1.0.1" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "bundled": true, + "optional": true + }, + "lodash": { + "version": "3.10.1", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { "version": "2.1.1", "bundled": true } @@ -6314,23 +6735,23 @@ "version": "2.0.2", "bundled": true, "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1" + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" } }, "columnify": { "version": "1.5.4", "bundled": true, "requires": { - "strip-ansi": "3.0.1", - "wcwidth": "1.0.1" + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" }, "dependencies": { "strip-ansi": { "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -6343,14 +6764,14 @@ "version": "1.0.1", "bundled": true, "requires": { - "defaults": "1.0.3" + "defaults": "^1.0.3" }, "dependencies": { "defaults": { "version": "1.0.3", "bundled": true, "requires": { - "clone": "1.0.2" + "clone": "^1.0.2" }, "dependencies": { "clone": { @@ -6367,8 +6788,8 @@ "version": "1.1.11", "bundled": true, "requires": { - "ini": "1.3.5", - "proto-list": "1.2.4" + "ini": "^1.3.4", + "proto-list": "~1.2.1" }, "dependencies": { "proto-list": { @@ -6393,8 +6814,8 @@ "version": "1.0.3", "bundled": true, "requires": { - "asap": "2.0.5", - "wrappy": "1.0.2" + "asap": "^2.0.0", + "wrappy": "1" }, "dependencies": { "asap": { @@ -6407,6 +6828,10 @@ "version": "1.0.0", "bundled": true }, + "figgy-pudding": { + "version": "3.1.0", + "bundled": true + }, "find-npm-prefix": { "version": "1.0.2", "bundled": true @@ -6415,45 +6840,57 @@ "version": "1.2.10", "bundled": true, "requires": { - "graceful-fs": "4.1.11", - "path-is-inside": "1.0.2", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" } }, "fs-write-stream-atomic": { "version": "1.0.10", "bundled": true, "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.5" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true + } } }, "gentle-fs": { "version": "2.0.1", "bundled": true, "requires": { - "aproba": "1.2.0", - "fs-vacuum": "1.2.10", - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "path-is-inside": "1.0.2", - "read-cmd-shim": "1.0.1", - "slide": "1.1.6" + "aproba": "^1.1.2", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true + } } }, "glob": { "version": "7.1.2", "bundled": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "dependencies": { "fs.realpath": { @@ -6464,14 +6901,14 @@ "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" }, "dependencies": { "brace-expansion": { "version": "1.1.8", "bundled": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -6506,7 +6943,7 @@ "bundled": true }, "iferr": { - "version": "0.1.5", + "version": "1.0.0", "bundled": true }, "imurmurhash": { @@ -6517,8 +6954,8 @@ "version": "1.0.6", "bundled": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -6533,40 +6970,49 @@ "version": "1.10.3", "bundled": true, "requires": { - "glob": "7.1.2", - "npm-package-arg": "6.0.0", - "promzard": "0.3.0", - "read": "1.0.7", - "read-package-json": "2.0.13", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "3.0.0" + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" }, "dependencies": { "promzard": { "version": "0.3.0", "bundled": true, "requires": { - "read": "1.0.7" + "read": "1" } } } }, "is-cidr": { - "version": "1.0.0", + "version": "2.0.5", "bundled": true, "requires": { - "cidr-regex": "1.0.6" + "cidr-regex": "^2.0.8" }, "dependencies": { "cidr-regex": { - "version": "1.0.6", - "bundled": true + "version": "2.0.8", + "bundled": true, + "requires": { + "ip-regex": "^2.1.0" + }, + "dependencies": { + "ip-regex": { + "version": "2.1.0", + "bundled": true + } + } } } }, "json-parse-better-errors": { - "version": "1.0.1", + "version": "1.0.2", "bundled": true }, "lazy-property": { @@ -6574,627 +7020,651 @@ "bundled": true }, "libcipm": { - "version": "1.6.0", - "bundled": true, - "requires": { - "bin-links": "1.1.0", - "bluebird": "3.5.1", - "find-npm-prefix": "1.0.2", - "graceful-fs": "4.1.11", - "lock-verify": "2.0.0", - "npm-lifecycle": "2.0.1", - "npm-logical-tree": "1.2.1", - "npm-package-arg": "6.0.0", - "pacote": "7.6.1", - "protoduck": "5.0.0", - "read-package-json": "2.0.13", - "rimraf": "2.6.2", - "worker-farm": "1.5.4" + "version": "1.6.2", + "bundled": true, + "requires": { + "bin-links": "^1.1.0", + "bluebird": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "lock-verify": "^2.0.0", + "npm-lifecycle": "^2.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.0.0", + "pacote": "^7.5.1", + "protoduck": "^5.0.0", + "read-package-json": "^2.0.12", + "rimraf": "^2.6.2", + "worker-farm": "^1.5.4" }, "dependencies": { - "lock-verify": { - "version": "2.0.0", - "bundled": true, - "requires": { - "npm-package-arg": "5.1.2", - "semver": "5.5.0" - }, - "dependencies": { - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.6.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - } - } - }, "npm-logical-tree": { "version": "1.2.1", "bundled": true }, - "protoduck": { - "version": "5.0.0", - "bundled": true, - "requires": { - "genfun": "4.0.1" - }, - "dependencies": { - "genfun": { - "version": "4.0.1", - "bundled": true - } - } - }, - "worker-farm": { - "version": "1.5.4", - "bundled": true, - "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" - }, - "dependencies": { - "errno": { - "version": "0.1.7", - "bundled": true, - "requires": { - "prr": "1.0.1" - }, - "dependencies": { - "prr": { - "version": "1.0.1", - "bundled": true - } - } - }, - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "libnpx": { - "version": "10.0.1", - "bundled": true, - "requires": { - "dotenv": "5.0.1", - "npm-package-arg": "6.0.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "update-notifier": "2.3.0", - "which": "1.3.0", - "y18n": "4.0.0", - "yargs": "11.0.0" - }, - "dependencies": { - "dotenv": { - "version": "5.0.1", - "bundled": true - }, - "y18n": { - "version": "4.0.0", - "bundled": true - }, - "yargs": { - "version": "11.0.0", + "pacote": { + "version": "7.6.1", "bundled": true, "requires": { - "cliui": "4.0.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" + "bluebird": "^3.5.1", + "cacache": "^10.0.4", + "get-stream": "^3.0.0", + "glob": "^7.1.2", + "lru-cache": "^4.1.1", + "make-fetch-happen": "^2.6.0", + "minimatch": "^3.0.4", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.0.0", + "npm-packlist": "^1.1.10", + "npm-pick-manifest": "^2.1.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.1", + "semver": "^5.5.0", + "ssri": "^5.2.4", + "tar": "^4.4.0", + "unique-filename": "^1.1.0", + "which": "^1.3.0" }, "dependencies": { - "cliui": { - "version": "4.0.0", + "cacache": { + "version": "10.0.4", "bundled": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" }, "dependencies": { - "wrap-ansi": { - "version": "2.1.0", + "mississippi": { + "version": "2.0.0", "bundled": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" }, "dependencies": { - "string-width": { - "version": "1.0.2", + "concat-stream": { + "version": "1.6.2", "bundled": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { - "code-point-at": { - "version": "1.1.0", + "buffer-from": { + "version": "1.0.0", "bundled": true }, - "is-fullwidth-code-point": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.4", + "bundled": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } + "bundled": true } } }, - "strip-ansi": { - "version": "3.0.1", + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "parallel-transform": { + "version": "1.1.0", "bundled": true, "requires": { - "ansi-regex": "2.1.1" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", "bundled": true } } } } + }, + "y18n": { + "version": "4.0.0", + "bundled": true } } }, - "decamelize": { - "version": "1.2.0", + "get-stream": { + "version": "3.0.0", "bundled": true }, - "find-up": { - "version": "2.1.0", + "make-fetch-happen": { + "version": "2.6.0", "bundled": true, "requires": { - "locate-path": "2.0.0" + "agentkeepalive": "^3.3.0", + "cacache": "^10.0.0", + "http-cache-semantics": "^3.8.0", + "http-proxy-agent": "^2.0.0", + "https-proxy-agent": "^2.1.0", + "lru-cache": "^4.1.1", + "mississippi": "^1.2.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^3.0.1", + "ssri": "^5.0.0" }, "dependencies": { - "locate-path": { - "version": "2.0.0", + "agentkeepalive": { + "version": "3.4.1", "bundled": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "humanize-ms": "^1.2.1" }, "dependencies": { - "p-locate": { - "version": "2.0.0", + "humanize-ms": { + "version": "1.2.1", "bundled": true, "requires": { - "p-limit": "1.2.0" + "ms": "^2.0.0" }, "dependencies": { - "p-limit": { - "version": "1.2.0", - "bundled": true, - "requires": { - "p-try": "1.0.0" - }, - "dependencies": { - "p-try": { - "version": "1.0.0", - "bundled": true - } - } + "ms": { + "version": "2.1.1", + "bundled": true } } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true } } - } - } - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.1.0", "bundled": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "agent-base": "4", + "debug": "3.1.0" }, "dependencies": { - "cross-spawn": { - "version": "5.1.0", + "agent-base": { + "version": "4.2.0", "bundled": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "es6-promisify": "^5.0.0" }, "dependencies": { - "shebang-command": { - "version": "1.2.0", + "es6-promisify": { + "version": "5.0.0", "bundled": true, "requires": { - "shebang-regex": "1.0.0" + "es6-promise": "^4.0.3" }, "dependencies": { - "shebang-regex": { - "version": "1.0.0", + "es6-promise": { + "version": "4.2.4", "bundled": true } } } } }, - "get-stream": { - "version": "3.0.0", - "bundled": true + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } }, - "is-stream": { - "version": "1.1.0", - "bundled": true + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "1.3.1", + "bundled": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^1.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "buffer-from": { + "version": "1.0.0", + "bundled": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } }, - "npm-run-path": { - "version": "2.0.2", + "duplexify": { + "version": "3.5.4", "bundled": true, "requires": { - "path-key": "2.0.1" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, "dependencies": { - "path-key": { - "version": "2.0.1", + "stream-shift": { + "version": "1.0.0", "bundled": true } } }, - "p-finally": { - "version": "1.0.0", - "bundled": true + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } }, - "signal-exit": { - "version": "3.0.2", - "bundled": true + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } }, - "strip-eof": { - "version": "1.0.0", - "bundled": true + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "1.0.3", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } } } }, - "lcid": { - "version": "1.0.0", + "node-fetch-npm": { + "version": "2.0.2", "bundled": true, "requires": { - "invert-kv": "1.0.0" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { - "invert-kv": { - "version": "1.0.0", - "bundled": true + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "~0.4.13" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "requires": { + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "safer-buffer": { + "version": "2.1.2", + "bundled": true + } + } + } + } } } }, - "mem": { - "version": "1.1.0", + "socks-proxy-agent": { + "version": "3.0.1", "bundled": true, "requires": { - "mimic-fn": "1.2.0" + "agent-base": "^4.1.0", + "socks": "^1.1.10" }, "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "bundled": true + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "bundled": true + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true + } + } } } } } }, - "require-directory": { - "version": "2.1.1", - "bundled": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "string-width": { - "version": "2.1.1", + "minimatch": { + "version": "3.0.4", "bundled": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "brace-expansion": "^1.1.7" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } } } }, - "which-module": { - "version": "2.0.0", - "bundled": true - }, - "y18n": { - "version": "3.2.1", - "bundled": true - }, - "yargs-parser": { - "version": "9.0.2", + "promise-retry": { + "version": "1.1.1", "bundled": true, "requires": { - "camelcase": "4.1.0" + "err-code": "^1.0.0", + "retry": "^0.10.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", + "err-code": { + "version": "1.1.2", + "bundled": true + }, + "retry": { + "version": "0.10.1", "bundled": true } } + }, + "ssri": { + "version": "5.3.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1" + } } } - } - } - }, - "lockfile": { - "version": "1.0.3", - "bundled": true - }, - "lodash._baseindexof": { - "version": "3.1.0", - "bundled": true - }, - "lodash._baseuniq": { - "version": "4.6.0", - "bundled": true, - "requires": { - "lodash._createset": "4.0.3", - "lodash._root": "3.0.1" - }, - "dependencies": { - "lodash._createset": { - "version": "4.0.3", - "bundled": true - }, - "lodash._root": { - "version": "3.0.1", - "bundled": true - } - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "bundled": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "bundled": true - }, - "lodash._createcache": { - "version": "3.1.2", - "bundled": true, - "requires": { - "lodash._getnative": "3.9.1" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "bundled": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "bundled": true - }, - "lodash.restparam": { - "version": "3.6.1", - "bundled": true - }, - "lodash.union": { - "version": "4.6.0", - "bundled": true - }, - "lodash.uniq": { - "version": "4.5.0", - "bundled": true - }, - "lodash.without": { - "version": "4.4.0", - "bundled": true - }, - "lru-cache": { - "version": "4.1.1", - "bundled": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - }, - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true - } - } - }, - "meant": { - "version": "1.0.1", - "bundled": true - }, - "mississippi": { - "version": "3.0.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.1", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "3.0.0", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.1", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.4", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } }, - "through2": { - "version": "2.0.3", + "protoduck": { + "version": "5.0.0", "bundled": true, "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" + "genfun": "^4.0.1" }, "dependencies": { - "xtend": { + "genfun": { "version": "4.0.1", "bundled": true } @@ -7202,304 +7672,1758 @@ } } }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - }, - "dependencies": { - "copy-concurrently": { - "version": "1.0.5", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "run-queue": { - "version": "1.0.3", - "bundled": true, - "requires": { - "aproba": "1.2.0" - } - } - } - }, - "nopt": { + "libnpmhook": { "version": "4.0.1", "bundled": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1" - }, - "dependencies": { - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "requires": { - "builtin-modules": "1.1.1" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "bundled": true - } - } - } - } - }, - "npm-cache-filename": { - "version": "1.0.2", - "bundled": true - }, - "npm-install-checks": { - "version": "3.0.0", - "bundled": true, - "requires": { - "semver": "5.5.0" - } - }, - "npm-lifecycle": { - "version": "2.0.1", - "bundled": true, - "requires": { - "byline": "5.0.0", - "graceful-fs": "4.1.11", - "node-gyp": "3.6.2", - "resolve-from": "4.0.0", - "slide": "1.1.6", - "uid-number": "0.0.6", - "umask": "1.1.0", - "which": "1.3.0" + "figgy-pudding": "^3.1.0", + "npm-registry-fetch": "^3.0.0" }, "dependencies": { - "byline": { - "version": "5.0.0", - "bundled": true - }, - "node-gyp": { - "version": "3.6.2", + "npm-registry-fetch": { + "version": "3.1.1", "bundled": true, "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.83.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.0" + "bluebird": "^3.5.1", + "figgy-pudding": "^3.1.0", + "lru-cache": "^4.1.2", + "make-fetch-happen": "^4.0.0", + "npm-package-arg": "^6.0.0" }, "dependencies": { - "fstream": { - "version": "1.0.11", + "make-fetch-happen": { + "version": "4.0.1", + "bundled": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "agentkeepalive": { + "version": "3.4.1", + "bundled": true, + "requires": { + "humanize-ms": "^1.2.1" + }, + "dependencies": { + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "^2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "~0.4.13" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "requires": { + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "safer-buffer": { + "version": "2.1.2", + "bundled": true + } + } + } + } + } + } + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "bundled": true + }, + "retry": { + "version": "0.10.1", + "bundled": true + } + } + }, + "socks-proxy-agent": { + "version": "4.0.0", + "bundled": true, + "requires": { + "agent-base": "~4.1.0", + "socks": "~2.1.6" + }, + "dependencies": { + "agent-base": { + "version": "4.1.2", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "2.1.6", + "bundled": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "bundled": true + }, + "smart-buffer": { + "version": "4.0.1", + "bundled": true + } + } + } + } + } + } + } + } + } + } + }, + "libnpx": { + "version": "10.2.0", + "bundled": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^11.0.0" + }, + "dependencies": { + "dotenv": { + "version": "5.0.1", + "bundled": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true + }, + "yargs": { + "version": "11.0.0", + "bundled": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "cliui": { + "version": "4.0.0", + "bundled": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + } + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "requires": { + "locate-path": "^2.0.0" + }, + "dependencies": { + "locate-path": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "p-locate": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-limit": "^1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.2.0", + "bundled": true, + "requires": { + "p-try": "^1.0.0" + }, + "dependencies": { + "p-try": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true + } + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "^1.0.0" + }, + "dependencies": { + "shebang-regex": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "bundled": true + } + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + } + } + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "requires": { + "invert-kv": "^1.0.0" + }, + "dependencies": { + "invert-kv": { + "version": "1.0.0", + "bundled": true + } + } + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "bundled": true + } + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + } + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "y18n": { + "version": "3.2.1", + "bundled": true + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true + } + } + } + } + } + } + }, + "lock-verify": { + "version": "2.0.2", + "bundled": true, + "requires": { + "npm-package-arg": "^5.1.2 || 6", + "semver": "^5.4.1" + } + }, + "lockfile": { + "version": "1.0.4", + "bundled": true, + "requires": { + "signal-exit": "^3.0.2" + }, + "dependencies": { + "signal-exit": { + "version": "3.0.2", + "bundled": true + } + } + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "requires": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + }, + "dependencies": { + "lodash._createset": { + "version": "4.0.3", + "bundled": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true + } + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true + }, + "lru-cache": { + "version": "4.1.3", + "bundled": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true + } + } + }, + "meant": { + "version": "1.0.1", + "bundled": true + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.1", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.4", + "bundled": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true + } + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "requires": { + "aproba": "^1.1.1" + } + } + } + }, + "node-gyp": { + "version": "3.6.2", + "bundled": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "2", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "nopt": { + "version": "3.0.6", + "bundled": true, + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + }, + "dependencies": { + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "~2.0.0" + } + } + } + } + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "requires": { + "builtin-modules": "^1.0.0" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "bundled": true + } + } + } + } + }, + "npm-audit-report": { + "version": "1.2.1", + "bundled": true, + "requires": { + "cli-table2": "^0.2.0", + "console-control-strings": "^1.1.0" + }, + "dependencies": { + "console-control-strings": { + "version": "1.1.0", + "bundled": true + } + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "requires": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-lifecycle": { + "version": "2.0.3", + "bundled": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.11", + "node-gyp": "^3.6.2", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.0" + }, + "dependencies": { + "byline": { + "version": "5.0.0", + "bundled": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true + } + } + }, + "npm-package-arg": { + "version": "6.1.0", + "bundled": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + }, + "dependencies": { + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + } + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true + } + } + }, + "npm-pick-manifest": { + "version": "2.1.0", + "bundled": true, + "requires": { + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-profile": { + "version": "3.0.1", + "bundled": true, + "requires": { + "aproba": "^1.1.2", + "make-fetch-happen": "^2.5.0" + }, + "dependencies": { + "make-fetch-happen": { + "version": "2.6.0", + "bundled": true, + "requires": { + "agentkeepalive": "^3.3.0", + "cacache": "^10.0.0", + "http-cache-semantics": "^3.8.0", + "http-proxy-agent": "^2.0.0", + "https-proxy-agent": "^2.1.0", + "lru-cache": "^4.1.1", + "mississippi": "^1.2.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^3.0.1", + "ssri": "^5.0.0" + }, + "dependencies": { + "agentkeepalive": { + "version": "3.3.0", + "bundled": true, + "requires": { + "humanize-ms": "^1.2.1" + }, + "dependencies": { + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "^2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "cacache": { + "version": "10.0.4", + "bundled": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + }, + "dependencies": { + "mississippi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "buffer-from": { + "version": "1.0.0", + "bundled": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.4", + "bundled": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "y18n": { + "version": "4.0.0", + "bundled": true + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "1.3.1", + "bundled": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^1.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "1.0.3", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "~0.4.13" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "bundled": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + } + } + }, + "promise-retry": { + "version": "1.1.1", "bundled": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "bundled": true + }, + "retry": { + "version": "0.10.1", + "bundled": true + } } }, - "minimatch": { - "version": "3.0.4", + "socks-proxy-agent": { + "version": "3.0.1", "bundled": true, "requires": { - "brace-expansion": "1.1.11" + "agent-base": "^4.1.0", + "socks": "^1.1.10" }, "dependencies": { - "brace-expansion": { - "version": "1.1.11", + "agent-base": { + "version": "4.2.0", "bundled": true, "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" + "es6-promisify": "^5.0.0" }, "dependencies": { - "balanced-match": { - "version": "1.0.0", + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + }, + "dependencies": { + "ip": { + "version": "1.1.5", "bundled": true }, - "concat-map": { - "version": "0.0.1", + "smart-buffer": { + "version": "1.1.15", "bundled": true } } } } }, - "nopt": { - "version": "3.0.6", - "bundled": true, - "requires": { - "abbrev": "1.1.1" - } - }, - "semver": { + "ssri": { "version": "5.3.0", - "bundled": true - }, - "tar": { - "version": "2.2.1", "bundled": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - }, - "dependencies": { - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - } + "safe-buffer": "^5.1.1" } } } - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true } } }, - "npm-package-arg": { - "version": "6.0.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.6.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "npm-packlist": { - "version": "1.1.10", + "npm-registry-client": { + "version": "8.5.1", "bundled": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" }, "dependencies": { - "ignore-walk": { - "version": "3.0.1", + "concat-stream": { + "version": "1.6.1", "bundled": true, "requires": { - "minimatch": "3.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } + "typedarray": { + "version": "0.0.6", + "bundled": true } } }, - "npm-bundled": { - "version": "1.0.3", + "retry": { + "version": "0.10.1", "bundled": true + }, + "ssri": { + "version": "5.3.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1" + } } } }, - "npm-profile": { - "version": "3.0.1", + "npm-registry-fetch": { + "version": "1.1.0", "bundled": true, "requires": { - "aproba": "1.2.0", - "make-fetch-happen": "2.6.0" + "bluebird": "^3.5.1", + "figgy-pudding": "^2.0.1", + "lru-cache": "^4.1.2", + "make-fetch-happen": "^3.0.0", + "npm-package-arg": "^6.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { + "figgy-pudding": { + "version": "2.0.1", + "bundled": true + }, "make-fetch-happen": { - "version": "2.6.0", + "version": "3.0.0", "bundled": true, "requires": { - "agentkeepalive": "3.3.0", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.0.0", - "https-proxy-agent": "2.1.1", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.2.4" + "agentkeepalive": "^3.4.1", + "cacache": "^10.0.4", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^3.0.1", + "ssri": "^5.2.4" }, "dependencies": { "agentkeepalive": { - "version": "3.3.0", + "version": "3.4.1", "bundled": true, "requires": { - "humanize-ms": "1.2.1" + "humanize-ms": "^1.2.1" }, "dependencies": { "humanize-ms": { "version": "1.2.1", "bundled": true, "requires": { - "ms": "2.1.1" + "ms": "^2.0.0" }, "dependencies": { "ms": { @@ -7510,236 +9434,256 @@ } } }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "2.0.0", + "cacache": { + "version": "10.0.4", "bundled": true, "requires": { - "agent-base": "4.2.0", - "debug": "2.6.9" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" }, "dependencies": { - "agent-base": { - "version": "4.2.0", + "mississippi": { + "version": "2.0.0", "bundled": true, "requires": { - "es6-promisify": "5.0.0" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" }, "dependencies": { - "es6-promisify": { - "version": "5.0.0", + "concat-stream": { + "version": "1.6.2", "bundled": true, "requires": { - "es6-promise": "4.2.4" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { - "es6-promise": { - "version": "4.2.4", + "buffer-from": { + "version": "1.0.0", + "bundled": true + }, + "typedarray": { + "version": "0.0.6", "bundled": true } } - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "https-proxy-agent": { - "version": "2.1.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", + }, + "duplexify": { + "version": "3.5.4", "bundled": true, "requires": { - "es6-promise": "4.2.4" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, "dependencies": { - "es6-promise": { - "version": "4.2.4", + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", "bundled": true } } } } }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } + "y18n": { + "version": "4.0.0", + "bundled": true } } }, - "mississippi": { - "version": "1.3.1", + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.1.0", "bundled": true, "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" + "agent-base": "4", + "debug": "3.1.0" }, "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", + "agent-base": { + "version": "4.2.0", "bundled": true, "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" + "es6-promisify": "^5.0.0" }, "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } } } }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parallel-transform": { - "version": "1.1.0", + "debug": { + "version": "3.1.0", "bundled": true, "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" + "ms": "2.0.0" }, "dependencies": { - "cyclist": { - "version": "0.2.2", + "ms": { + "version": "2.0.0", "bundled": true } } - }, - "pump": { - "version": "1.0.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", + } + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", "bundled": true, "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" + "es6-promisify": "^5.0.0" }, "dependencies": { - "pump": { - "version": "2.0.1", + "es6-promisify": { + "version": "5.0.0", "bundled": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } } } } }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", + "debug": { + "version": "3.1.0", "bundled": true, "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" + "ms": "2.0.0" }, "dependencies": { - "xtend": { - "version": "4.0.1", + "ms": { + "version": "2.0.0", "bundled": true } } @@ -7750,27 +9694,32 @@ "version": "2.0.2", "bundled": true, "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.1", - "safe-buffer": "5.1.1" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { "encoding": { "version": "0.1.12", "bundled": true, "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.13" }, "dependencies": { "iconv-lite": { - "version": "0.4.19", - "bundled": true + "version": "0.4.21", + "bundled": true, + "requires": { + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "safer-buffer": { + "version": "2.1.2", + "bundled": true + } + } } } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true } } }, @@ -7778,13 +9727,17 @@ "version": "1.1.1", "bundled": true, "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" + "err-code": "^1.0.0", + "retry": "^0.10.0" }, "dependencies": { "err-code": { "version": "1.1.2", "bundled": true + }, + "retry": { + "version": "0.10.1", + "bundled": true } } }, @@ -7792,22 +9745,22 @@ "version": "3.0.1", "bundled": true, "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" + "agent-base": "^4.1.0", + "socks": "^1.1.10" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "4.2.4" + "es6-promise": "^4.0.3" }, "dependencies": { "es6-promise": { @@ -7822,8 +9775,8 @@ "version": "1.1.10", "bundled": true, "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" }, "dependencies": { "ip": { @@ -7837,41 +9790,13 @@ } } } - } - } - } - } - }, - "npm-registry-client": { - "version": "8.5.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.1", - "graceful-fs": "4.1.11", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.0.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "request": "2.83.0", - "retry": "0.10.1", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "slide": "1.1.6", - "ssri": "5.2.4" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.1", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true + }, + "ssri": { + "version": "5.3.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1" + } } } } @@ -7885,18 +9810,18 @@ "version": "4.1.2", "bundled": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" }, "dependencies": { "are-we-there-yet": { "version": "1.1.4", "bundled": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.5" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" }, "dependencies": { "delegates": { @@ -7913,14 +9838,14 @@ "version": "2.7.4", "bundled": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" }, "dependencies": { "object-assign": { @@ -7935,9 +9860,9 @@ "version": "1.0.2", "bundled": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "dependencies": { "code-point-at": { @@ -7948,7 +9873,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" }, "dependencies": { "number-is-nan": { @@ -7963,7 +9888,7 @@ "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -7976,7 +9901,7 @@ "version": "1.1.2", "bundled": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } } } @@ -7991,7 +9916,7 @@ "version": "1.4.0", "bundled": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "opener": { @@ -8002,8 +9927,8 @@ "version": "0.1.5", "bundled": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" }, "dependencies": { "os-homedir": { @@ -8017,33 +9942,34 @@ } }, "pacote": { - "version": "7.6.1", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "cacache": "10.0.4", - "get-stream": "3.0.0", - "glob": "7.1.2", - "lru-cache": "4.1.1", - "make-fetch-happen": "2.6.0", - "minimatch": "3.0.4", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.0.0", - "npm-packlist": "1.1.10", - "npm-pick-manifest": "2.1.0", - "osenv": "0.1.5", - "promise-inflight": "1.0.1", - "promise-retry": "1.1.1", - "protoduck": "5.0.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "ssri": "5.2.4", - "tar": "4.4.0", - "unique-filename": "1.1.0", - "which": "1.3.0" + "version": "8.1.5", + "bundled": true, + "requires": { + "bluebird": "^3.5.1", + "cacache": "^11.0.2", + "get-stream": "^3.0.0", + "glob": "^7.1.2", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.10", + "npm-pick-manifest": "^2.1.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "ssri": "^6.0.0", + "tar": "4.4.1", + "unique-filename": "^1.1.0", + "which": "^1.3.0" }, "dependencies": { "get-stream": { @@ -8051,34 +9977,34 @@ "bundled": true }, "make-fetch-happen": { - "version": "2.6.0", + "version": "4.0.1", "bundled": true, "requires": { - "agentkeepalive": "3.4.0", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.1.0", - "https-proxy-agent": "2.2.0", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.2.4" + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" }, "dependencies": { "agentkeepalive": { - "version": "3.4.0", + "version": "3.4.1", "bundled": true, "requires": { - "humanize-ms": "1.2.1" + "humanize-ms": "^1.2.1" }, "dependencies": { "humanize-ms": { "version": "1.2.1", "bundled": true, "requires": { - "ms": "2.1.1" + "ms": "^2.0.0" }, "dependencies": { "ms": { @@ -8097,52 +10023,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "https-proxy-agent": { - "version": "2.2.0", - "bundled": true, - "requires": { - "agent-base": "4.2.0", + "agent-base": "4", "debug": "3.1.0" }, "dependencies": { @@ -8150,14 +10031,14 @@ "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "4.2.4" + "es6-promise": "^4.0.3" }, "dependencies": { "es6-promise": { @@ -8168,157 +10049,60 @@ } } }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "1.3.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.1", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.1", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.4", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "1.0.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", + "debug": { + "version": "3.1.0", "bundled": true, "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" + "ms": "2.0.0" }, "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } + "ms": { + "version": "2.0.0", + "bundled": true } } - }, - "stream-each": { - "version": "1.2.2", + } + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", "bundled": true, "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "es6-promisify": "^5.0.0" }, "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } } } }, - "through2": { - "version": "2.0.3", + "debug": { + "version": "3.1.0", "bundled": true, "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" + "ms": "2.0.0" }, "dependencies": { - "xtend": { - "version": "4.0.1", + "ms": { + "version": "2.0.0", "bundled": true } } @@ -8329,50 +10113,55 @@ "version": "2.0.2", "bundled": true, "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.1", - "safe-buffer": "5.1.1" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { "encoding": { "version": "0.1.12", "bundled": true, "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.13" }, "dependencies": { "iconv-lite": { - "version": "0.4.19", - "bundled": true + "version": "0.4.23", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "dependencies": { + "safer-buffer": { + "version": "2.1.2", + "bundled": true + } + } } } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true } } }, "socks-proxy-agent": { - "version": "3.0.1", + "version": "4.0.1", "bundled": true, "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" + "agent-base": "~4.2.0", + "socks": "~2.2.0" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "4.2.4" + "es6-promise": "^4.0.3" }, "dependencies": { "es6-promise": { @@ -8384,11 +10173,11 @@ } }, "socks": { - "version": "1.1.10", + "version": "2.2.0", "bundled": true, "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" }, "dependencies": { "ip": { @@ -8396,7 +10185,7 @@ "bundled": true }, "smart-buffer": { - "version": "1.1.15", + "version": "4.0.1", "bundled": true } } @@ -8409,14 +10198,14 @@ "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" }, "dependencies": { "brace-expansion": { "version": "1.1.11", "bundled": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -8432,25 +10221,35 @@ } } }, - "npm-pick-manifest": { - "version": "2.1.0", + "minipass": { + "version": "2.3.3", "bundled": true, "requires": { - "npm-package-arg": "6.0.0", - "semver": "5.5.0" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "bundled": true + } } }, "promise-retry": { "version": "1.1.1", "bundled": true, "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" + "err-code": "^1.0.0", + "retry": "^0.10.0" }, "dependencies": { "err-code": { "version": "1.1.2", "bundled": true + }, + "retry": { + "version": "0.10.1", + "bundled": true } } }, @@ -8458,7 +10257,7 @@ "version": "5.0.0", "bundled": true, "requires": { - "genfun": "4.0.1" + "genfun": "^4.0.1" }, "dependencies": { "genfun": { @@ -8478,28 +10277,23 @@ "bundled": true }, "qrcode-terminal": { - "version": "0.11.0", + "version": "0.12.0", "bundled": true }, "query-string": { - "version": "5.1.0", + "version": "6.1.0", "bundled": true, "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "decode-uri-component": "^0.2.0", + "strict-uri-encode": "^2.0.0" }, "dependencies": { "decode-uri-component": { "version": "0.2.0", "bundled": true }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, "strict-uri-encode": { - "version": "1.1.0", + "version": "2.0.0", "bundled": true } } @@ -8512,7 +10306,7 @@ "version": "1.0.7", "bundled": true, "requires": { - "mute-stream": "0.0.7" + "mute-stream": "~0.0.4" }, "dependencies": { "mute-stream": { @@ -8525,20 +10319,20 @@ "version": "1.0.1", "bundled": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.2" } }, "read-installed": { "version": "4.0.3", "bundled": true, "requires": { - "debuglog": "1.0.1", - "graceful-fs": "4.1.11", - "read-package-json": "2.0.13", - "readdir-scoped-modules": "1.0.2", - "semver": "5.5.0", - "slide": "1.1.6", - "util-extend": "1.0.3" + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" }, "dependencies": { "util-extend": { @@ -8551,11 +10345,11 @@ "version": "2.0.13", "bundled": true, "requires": { - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "json-parse-better-errors": "1.0.1", - "normalize-package-data": "2.4.0", - "slash": "1.0.0" + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" }, "dependencies": { "json-parse-better-errors": { @@ -8569,27 +10363,27 @@ } }, "read-package-tree": { - "version": "5.1.6", + "version": "5.2.1", "bundled": true, "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "once": "1.4.0", - "read-package-json": "2.0.13", - "readdir-scoped-modules": "1.0.2" + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" } }, "readable-stream": { - "version": "2.3.5", + "version": "2.3.6", "bundled": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" }, "dependencies": { "core-util-is": { @@ -8605,10 +10399,10 @@ "bundled": true }, "string_decoder": { - "version": "1.0.3", + "version": "1.1.1", "bundled": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "util-deprecate": { @@ -8621,38 +10415,37 @@ "version": "1.0.2", "bundled": true, "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "graceful-fs": "4.1.11", - "once": "1.4.0" + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" } }, "request": { - "version": "2.83.0", - "bundled": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "version": "2.86.0", + "bundled": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" }, "dependencies": { "aws-sign2": { @@ -8660,7 +10453,7 @@ "bundled": true }, "aws4": { - "version": "1.6.0", + "version": "1.7.0", "bundled": true }, "caseless": { @@ -8668,10 +10461,10 @@ "bundled": true }, "combined-stream": { - "version": "1.0.5", + "version": "1.0.6", "bundled": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" }, "dependencies": { "delayed-stream": { @@ -8689,12 +10482,12 @@ "bundled": true }, "form-data": { - "version": "2.3.1", + "version": "2.3.2", "bundled": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" }, "dependencies": { "asynckit": { @@ -8707,18 +10500,18 @@ "version": "5.0.3", "bundled": true, "requires": { - "ajv": "5.2.3", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" }, "dependencies": { "ajv": { - "version": "5.2.3", + "version": "5.5.2", "bundled": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" }, "dependencies": { "co": { @@ -8726,25 +10519,16 @@ "bundled": true }, "fast-deep-equal": { - "version": "1.0.0", + "version": "1.1.0", + "bundled": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", "bundled": true }, "json-schema-traverse": { "version": "0.3.1", "bundled": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonify": "0.0.0" - }, - "dependencies": { - "jsonify": { - "version": "0.0.0", - "bundled": true - } - } } } }, @@ -8758,44 +10542,44 @@ "version": "6.0.2", "bundled": true, "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.0.2" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" }, "dependencies": { "boom": { "version": "4.3.1", "bundled": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "cryptiles": { "version": "3.1.2", "bundled": true, "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { "version": "5.2.0", "bundled": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } } } }, "hoek": { - "version": "4.2.0", + "version": "4.2.1", "bundled": true }, "sntp": { - "version": "2.0.2", + "version": "2.1.0", "bundled": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } } } @@ -8804,9 +10588,9 @@ "version": "1.2.0", "bundled": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "dependencies": { "assert-plus": { @@ -8835,9 +10619,9 @@ "version": "1.10.0", "bundled": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" }, "dependencies": { "core-util-is": { @@ -8849,17 +10633,17 @@ } }, "sshpk": { - "version": "1.13.1", + "version": "1.14.1", "bundled": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "asn1": { @@ -8871,14 +10655,14 @@ "bundled": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "dashdash": { "version": "1.14.1", "bundled": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "ecc-jsbn": { @@ -8886,14 +10670,14 @@ "bundled": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "getpass": { "version": "0.1.7", "bundled": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "jsbn": { @@ -8923,14 +10707,14 @@ "bundled": true }, "mime-types": { - "version": "2.1.17", + "version": "2.1.18", "bundled": true, "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.33.0" }, "dependencies": { "mime-db": { - "version": "1.30.0", + "version": "1.33.0", "bundled": true } } @@ -8944,18 +10728,14 @@ "bundled": true }, "qs": { - "version": "6.5.1", - "bundled": true - }, - "stringstream": { - "version": "0.0.5", + "version": "6.5.2", "bundled": true }, "tough-cookie": { - "version": "2.3.3", + "version": "2.3.4", "bundled": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" }, "dependencies": { "punycode": { @@ -8968,24 +10748,24 @@ "version": "0.6.0", "bundled": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } } } }, "retry": { - "version": "0.10.1", + "version": "0.12.0", "bundled": true }, "rimraf": { "version": "2.6.2", "bundled": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true }, "semver": { @@ -8996,8 +10776,8 @@ "version": "2.0.1", "bundled": true, "requires": { - "graceful-fs": "4.1.11", - "readable-stream": "2.3.5" + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" } }, "slide": { @@ -9012,26 +10792,26 @@ "version": "2.1.3", "bundled": true, "requires": { - "from2": "1.3.0", - "stream-iterate": "1.2.0" + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" }, "dependencies": { "from2": { "version": "1.3.0", "bundled": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" }, "dependencies": { "readable-stream": { "version": "1.1.14", "bundled": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" }, "dependencies": { "core-util-is": { @@ -9054,8 +10834,8 @@ "version": "1.2.0", "bundled": true, "requires": { - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" }, "dependencies": { "stream-shift": { @@ -9067,17 +10847,14 @@ } }, "ssri": { - "version": "5.2.4", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } + "version": "6.0.0", + "bundled": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -9087,36 +10864,38 @@ } }, "tar": { - "version": "4.4.0", + "version": "4.4.1", "bundled": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.1", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "yallist": "3.0.2" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" }, "dependencies": { "fs-minipass": { "version": "1.2.5", "bundled": true, "requires": { - "minipass": "2.2.1" + "minipass": "^2.2.1" } }, "minipass": { - "version": "2.2.1", + "version": "2.3.1", "bundled": true, "requires": { - "yallist": "3.0.2" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, "minizlib": { "version": "1.1.0", "bundled": true, "requires": { - "minipass": "2.2.1" + "minipass": "^2.2.1" } }, "yallist": { @@ -9129,6 +10908,10 @@ "version": "0.2.0", "bundled": true }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true + }, "uid-number": { "version": "0.0.6", "bundled": true @@ -9141,14 +10924,14 @@ "version": "1.1.0", "bundled": true, "requires": { - "unique-slug": "2.0.0" + "unique-slug": "^2.0.0" }, "dependencies": { "unique-slug": { "version": "2.0.0", "bundled": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } } } @@ -9158,38 +10941,39 @@ "bundled": true }, "update-notifier": { - "version": "2.3.0", - "bundled": true, - "requires": { - "boxen": "1.2.1", - "chalk": "2.1.0", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "version": "2.5.0", + "bundled": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { "boxen": { - "version": "1.2.1", + "version": "1.3.0", "bundled": true, "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.1.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" }, "dependencies": { "ansi-align": { "version": "2.0.0", "bundled": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" } }, "camelcase": { @@ -9204,8 +10988,8 @@ "version": "2.1.1", "bundled": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -9218,36 +11002,36 @@ "version": "1.2.0", "bundled": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" }, "dependencies": { "execa": { "version": "0.7.0", "bundled": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { "cross-spawn": { "version": "5.1.0", "bundled": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "dependencies": { "shebang-command": { "version": "1.2.0", "bundled": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" }, "dependencies": { "shebang-regex": { @@ -9270,7 +11054,7 @@ "version": "2.0.2", "bundled": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" }, "dependencies": { "path-key": { @@ -9296,78 +11080,35 @@ } }, "widest-line": { - "version": "1.0.0", + "version": "2.0.0", "bundled": true, "requires": { - "string-width": "1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - } - } - } + "string-width": "^2.1.1" } } } }, "chalk": { - "version": "2.1.0", + "version": "2.4.1", "bundled": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", + "version": "3.2.1", "bundled": true, "requires": { - "color-convert": "1.9.0" + "color-convert": "^1.9.0" }, "dependencies": { "color-convert": { - "version": "1.9.0", + "version": "1.9.1", "bundled": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" }, "dependencies": { "color-name": { @@ -9383,14 +11124,14 @@ "bundled": true }, "supports-color": { - "version": "4.4.0", + "version": "5.4.0", "bundled": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^3.0.0" }, "dependencies": { "has-flag": { - "version": "2.0.0", + "version": "3.0.0", "bundled": true } } @@ -9398,22 +11139,22 @@ } }, "configstore": { - "version": "3.1.1", + "version": "3.1.2", "bundled": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { "dot-prop": { "version": "4.2.0", "bundled": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" }, "dependencies": { "is-obj": { @@ -9423,14 +11164,14 @@ } }, "make-dir": { - "version": "1.0.0", + "version": "1.2.0", "bundled": true, "requires": { - "pify": "2.3.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { - "version": "2.3.0", + "version": "3.0.0", "bundled": true } } @@ -9439,7 +11180,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" }, "dependencies": { "crypto-random-string": { @@ -9454,26 +11195,39 @@ "version": "2.1.0", "bundled": true }, + "is-ci": { + "version": "1.1.0", + "bundled": true, + "requires": { + "ci-info": "^1.0.0" + }, + "dependencies": { + "ci-info": { + "version": "1.1.3", + "bundled": true + } + } + }, "is-installed-globally": { "version": "0.1.0", "bundled": true, "requires": { - "global-dirs": "0.1.0", - "is-path-inside": "1.0.0" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" }, "dependencies": { "global-dirs": { - "version": "0.1.0", + "version": "0.1.1", "bundled": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "is-path-inside": { - "version": "1.0.0", + "version": "1.0.1", "bundled": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } } } @@ -9486,41 +11240,41 @@ "version": "3.1.0", "bundled": true, "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" }, "dependencies": { "package-json": { "version": "4.0.1", "bundled": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.5.0" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" }, "dependencies": { "got": { "version": "6.7.1", "bundled": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" }, "dependencies": { "create-error-class": { "version": "3.0.2", "bundled": true, "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" }, "dependencies": { "capture-stack-trace": { @@ -9550,7 +11304,7 @@ "bundled": true }, "lowercase-keys": { - "version": "1.0.0", + "version": "1.0.1", "bundled": true }, "timed-out": { @@ -9565,7 +11319,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" }, "dependencies": { "prepend-http": { @@ -9577,25 +11331,25 @@ } }, "registry-auth-token": { - "version": "3.3.1", + "version": "3.3.2", "bundled": true, "requires": { - "rc": "1.2.1", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" }, "dependencies": { "rc": { - "version": "1.2.1", + "version": "1.2.7", "bundled": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true }, "minimist": { @@ -9614,21 +11368,21 @@ "version": "3.1.0", "bundled": true, "requires": { - "rc": "1.2.1" + "rc": "^1.0.1" }, "dependencies": { "rc": { - "version": "1.2.1", + "version": "1.2.7", "bundled": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true }, "minimist": { @@ -9651,7 +11405,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "semver": "5.5.0" + "semver": "^5.0.3" } }, "xdg-basedir": { @@ -9665,29 +11419,44 @@ "bundled": true }, "validate-npm-package-license": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" }, "dependencies": { "spdx-correct": { - "version": "1.0.2", + "version": "3.0.0", "bundled": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" }, "dependencies": { "spdx-license-ids": { - "version": "1.2.2", + "version": "3.0.0", "bundled": true } } }, "spdx-expression-parse": { - "version": "1.0.4", - "bundled": true + "version": "3.0.0", + "bundled": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + }, + "dependencies": { + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true + }, + "spdx-license-ids": { + "version": "3.0.0", + "bundled": true + } + } } } }, @@ -9695,7 +11464,7 @@ "version": "3.0.0", "bundled": true, "requires": { - "builtins": "1.0.3" + "builtins": "^1.0.3" }, "dependencies": { "builtins": { @@ -9708,7 +11477,7 @@ "version": "1.3.0", "bundled": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" }, "dependencies": { "isexe": { @@ -9718,18 +11487,17 @@ } }, "worker-farm": { - "version": "1.5.4", + "version": "1.6.0", "bundled": true, "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" + "errno": "~0.1.7" }, "dependencies": { "errno": { "version": "0.1.7", "bundled": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" }, "dependencies": { "prr": { @@ -9737,10 +11505,6 @@ "bundled": true } } - }, - "xtend": { - "version": "4.0.1", - "bundled": true } } }, @@ -9752,9 +11516,9 @@ "version": "2.3.0", "bundled": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" }, "dependencies": { "signal-exit": { @@ -9771,7 +11535,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npmlog": { @@ -9779,10 +11543,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -9801,9 +11565,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -9812,7 +11576,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -9823,7 +11587,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -9840,8 +11604,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -9850,7 +11614,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -9866,7 +11630,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -9875,7 +11639,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "ora": { @@ -9884,10 +11648,10 @@ "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" }, "dependencies": { "cli-cursor": { @@ -9896,7 +11660,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "onetime": { @@ -9911,8 +11675,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } } } @@ -9940,7 +11704,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -9961,7 +11725,7 @@ "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, "requires": { - "p-reduce": "1.0.0" + "p-reduce": "^1.0.0" } }, "p-finally": { @@ -9994,7 +11758,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -10015,7 +11779,7 @@ "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, "requires": { - "p-finally": "1.0.0" + "p-finally": "^1.0.0" } }, "pako": { @@ -10030,9 +11794,9 @@ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" }, "dependencies": { "isarray": { @@ -10053,13 +11817,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -10068,7 +11832,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -10079,11 +11843,11 @@ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.2", - "pbkdf2": "3.0.16" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-glob": { @@ -10092,10 +11856,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -10104,7 +11868,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -10137,7 +11901,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -10164,9 +11928,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pathval": { @@ -10181,11 +11945,11 @@ "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "dev": true, "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pegjs": { @@ -10212,7 +11976,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -10221,7 +11985,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" }, "dependencies": { "find-up": { @@ -10230,7 +11994,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -10246,19 +12010,19 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.2.2.tgz", "integrity": "sha512-F46pcvDxtQhbV3B+dm+exHuKxIyJK26fVNiJRmbTW/5D7o0Z2yzc8CKeu7UWbo9XxQZoVOC88aKgySAsza+cWw==", "requires": { - "expand-template": "1.1.0", + "expand-template": "^1.0.2", "github-from-package": "0.0.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "node-abi": "2.1.0", - "noop-logger": "0.1.1", - "npmlog": "4.1.2", - "os-homedir": "1.0.2", - "pump": "1.0.2", - "rc": "1.2.1", - "simple-get": "1.4.3", - "tar-fs": "1.15.3", - "tunnel-agent": "0.6.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "node-abi": "^2.0.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "os-homedir": "^1.0.1", + "pump": "^1.0.1", + "rc": "^1.1.6", + "simple-get": "^1.4.2", + "tar-fs": "^1.13.0", + "tunnel-agent": "^0.6.0", "xtend": "4.0.1" }, "dependencies": { @@ -10281,12 +12045,6 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, - "prettier": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz", - "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==", - "dev": true - }, "pretty-bytes": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", @@ -10334,11 +12092,11 @@ "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "pump": { @@ -10346,19 +12104,19 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", "requires": { - "end-of-stream": "1.4.0", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" }, "dependencies": { "pump": { @@ -10367,8 +12125,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "1.4.0", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -10385,63 +12143,22 @@ "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true }, "randombytes": { "version": "2.0.6", @@ -10449,7 +12166,7 @@ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -10458,21 +12175,26 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -10486,8 +12208,8 @@ "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", "dev": true, "requires": { - "pify": "3.0.0", - "safe-buffer": "5.1.1" + "pify": "^3.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { "pify": { @@ -10504,9 +12226,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -10515,8 +12237,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -10525,10 +12247,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "readdirp": { @@ -10537,10 +12259,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" }, "dependencies": { "isarray": { @@ -10555,13 +12277,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -10570,30 +12292,18 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } }, - "recast": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", - "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", - "dev": true, - "requires": { - "ast-types": "0.11.3", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" - } - }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.5.0" + "resolve": "^1.1.6" } }, "regenerate": { @@ -10614,9 +12324,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -10625,7 +12335,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -10634,8 +12344,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -10644,9 +12354,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -10661,7 +12371,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } }, "remove-trailing-separator": { @@ -10688,7 +12398,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { @@ -10721,7 +12431,7 @@ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-cwd": { @@ -10730,7 +12440,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "resolve-dir": { @@ -10739,8 +12449,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -10761,7 +12471,7 @@ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "requires": { - "lowercase-keys": "1.0.1" + "lowercase-keys": "^1.0.0" } }, "restore-cursor": { @@ -10770,8 +12480,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -10786,7 +12496,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "ripemd160": { @@ -10794,8 +12504,8 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "hash-base": "^2.0.0", + "inherits": "^2.0.1" } }, "rlp": { @@ -10809,7 +12519,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "run-queue": { @@ -10818,22 +12528,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "1.1.2" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" + "aproba": "^1.1.1" } }, "rxjs": { @@ -10856,7 +12551,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "schema-utils": { @@ -10865,8 +12560,8 @@ "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", "dev": true, "requires": { - "ajv": "6.4.0", - "ajv-keywords": "3.1.0" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } }, "scoped-regex": { @@ -10880,15 +12575,15 @@ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.0.tgz", "integrity": "sha512-CbrQoeGG5V0kQ1ohEMGI+J7oKerapLTpivLICBaXR0R4HyQcN3kM9itLsV5fdpV1UR1bD14tOkJ1xughmlDIiQ==", "requires": { - "bindings": "1.3.0", - "bip66": "1.1.5", - "bn.js": "4.11.8", - "create-hash": "1.1.3", - "drbg.js": "1.0.1", - "elliptic": "6.4.0", - "nan": "2.6.2", - "prebuild-install": "2.2.2", - "safe-buffer": "5.1.1" + "bindings": "^1.2.1", + "bip66": "^1.1.3", + "bn.js": "^4.11.3", + "create-hash": "^1.1.2", + "drbg.js": "^1.0.1", + "elliptic": "^6.2.3", + "nan": "^2.2.1", + "prebuild-install": "^2.0.0", + "safe-buffer": "^5.1.0" } }, "semver": { @@ -10920,10 +12615,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -10932,7 +12627,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -10948,7 +12643,7 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "sha3": { @@ -10956,7 +12651,7 @@ "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", "requires": { - "nan": "2.6.2" + "nan": "^2.0.5" } }, "shebang-command": { @@ -10965,7 +12660,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -10980,9 +12675,9 @@ "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "signal-exit": { @@ -10995,9 +12690,9 @@ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", "requires": { - "once": "1.4.0", - "unzip-response": "1.0.2", - "xtend": "4.0.1" + "once": "^1.3.1", + "unzip-response": "^1.0.0", + "xtend": "^4.0.0" } }, "slash": { @@ -11024,14 +12719,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -11040,7 +12735,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -11049,7 +12744,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "source-map": { @@ -11066,9 +12761,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -11077,7 +12772,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -11086,7 +12781,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -11095,7 +12790,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -11104,9 +12799,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -11129,7 +12824,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sol-digger": { @@ -11145,16 +12840,16 @@ "dev": true }, "solc": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.23.tgz", - "integrity": "sha512-AT7anLHY6uIRg2It6N0UlCHeZ7YeecIkUhnlirrCgCPCUevtnoN48BxvgigN/4jJTRljv5oFhAJtI6gvHzT5DQ==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", + "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", "dev": true, "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.4.1", - "yargs": "4.8.1" + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" } }, "solium": { @@ -11163,17 +12858,17 @@ "integrity": "sha512-hCZr5cEK2H6LVC1Lr7IGPGJ8Bs4Ktif9cmwnk3BHpoZLIwTtrNE0LUtTRBxkO3/G0GGB4OdxnnJT1pbgsJ/2Uw==", "dev": true, "requires": { - "ajv": "5.5.2", - "chokidar": "1.7.0", - "colors": "1.2.1", - "commander": "2.11.0", - "js-string-escape": "1.0.1", - "lodash": "4.17.5", + "ajv": "^5.2.2", + "chokidar": "^1.6.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.14.2", "sol-digger": "0.0.2", "sol-explore": "1.6.1", "solium-plugin-security": "0.1.1", "solparse": "2.2.4", - "text-table": "0.2.0" + "text-table": "^0.2.0" }, "dependencies": { "ajv": { @@ -11182,10 +12877,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } } } @@ -11202,9 +12897,9 @@ "integrity": "sha512-Sdyk983juUaOITdTD9U5Yc+MaX8kz4pN3wFyCRILWXW3+Ff96PxY9RLBuZINYbBgCAXN1a+kThJfFMlaXG9R6A==", "dev": true, "requires": { - "mocha": "4.1.0", - "pegjs": "0.10.0", - "yargs": "10.1.2" + "mocha": "^4.0.1", + "pegjs": "^0.10.0", + "yargs": "^10.0.3" }, "dependencies": { "ansi-regex": { @@ -11225,9 +12920,9 @@ "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "find-up": { @@ -11236,7 +12931,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "is-fullwidth-code-point": { @@ -11251,9 +12946,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "string-width": { @@ -11262,8 +12957,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -11272,7 +12967,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "which-module": { @@ -11287,18 +12982,18 @@ "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "dev": true, "requires": { - "cliui": "4.0.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" } }, "yargs-parser": { @@ -11307,7 +13002,7 @@ "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -11318,7 +13013,7 @@ "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -11334,16 +13029,16 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.0", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -11352,7 +13047,7 @@ "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", "dev": true, "requires": { - "source-map": "0.6.1" + "source-map": "^0.6.0" } }, "source-map-url": { @@ -11367,7 +13062,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -11388,7 +13083,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "ssri": { @@ -11397,7 +13092,7 @@ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.1" } }, "static-extend": { @@ -11406,8 +13101,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -11416,7 +13111,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -11427,8 +13122,8 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" }, "dependencies": { "isarray": { @@ -11449,13 +13144,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -11464,7 +13159,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -11475,21 +13170,21 @@ "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", "dev": true, "requires": { - "end-of-stream": "1.4.0", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" }, "dependencies": { "isarray": { @@ -11510,13 +13205,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -11525,7 +13220,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -11536,15 +13231,6 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "stream-to-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", - "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", - "dev": true, - "requires": { - "any-observable": "0.2.0" - } - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -11562,9 +13248,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -11578,7 +13264,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -11587,7 +13273,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-bom-stream": { @@ -11596,8 +13282,8 @@ "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", "dev": true, "requires": { - "first-chunk-stream": "2.0.0", - "strip-bom": "2.0.0" + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" } }, "strip-eof": { @@ -11642,10 +13328,10 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.3.tgz", "integrity": "sha1-7M+TXpQUk9gVECjmNuUc5MPKfyA=", "requires": { - "chownr": "1.0.1", - "mkdirp": "0.5.1", - "pump": "1.0.2", - "tar-stream": "1.5.4" + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" } }, "tar-stream": { @@ -11653,10 +13339,10 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.0", - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "bl": "^1.0.0", + "end-of-stream": "^1.0.0", + "readable-stream": "^2.0.0", + "xtend": "^4.0.0" }, "dependencies": { "isarray": { @@ -11669,13 +13355,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -11683,7 +13369,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -11694,8 +13380,8 @@ "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", "dev": true, "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" }, "dependencies": { "rimraf": { @@ -11730,8 +13416,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" }, "dependencies": { "isarray": { @@ -11746,13 +13432,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -11761,7 +13447,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -11778,7 +13464,7 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmp": { @@ -11787,7 +13473,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-arraybuffer": { @@ -11808,7 +13494,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -11817,10 +13503,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -11829,8 +13515,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -11839,7 +13525,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } } } @@ -11851,86 +13537,14 @@ "dev": true }, "truffle": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.7.tgz", - "integrity": "sha512-fe6BIcD9xo6iIJvV1m6ZhOk56kmB8k38kdoWOKYnPPw7ZUUSupgojeTb2K5e+4qIpIHvEvmET4yLUjSGR+hvwA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.11.tgz", + "integrity": "sha512-VNhc6jexZeM92sNJJr4U8ln3uJ/mJEQO/0y9ZLYc4pccyIskPtl+3r4mzymgGM/Mq5v6MpoQVD6NZgHUVKX+Dw==", "dev": true, "requires": { - "mocha": "3.5.3", - "original-require": "1.0.1", - "solc": "0.4.23" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "mocha": "^4.1.0", + "original-require": "^1.0.1", + "solc": "0.4.24" } }, "tslib": { @@ -11945,17 +13559,17 @@ "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.3.0", - "commander": "2.11.0", - "diff": "3.3.1", - "glob": "7.1.2", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.4.1", - "tslib": "1.8.0", - "tsutils": "2.12.2" + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.1.0", + "commander": "^2.9.0", + "diff": "^3.2.0", + "glob": "^7.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.7.1", + "tsutils": "^2.12.1" }, "dependencies": { "ansi-styles": { @@ -11964,7 +13578,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -11973,9 +13587,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "supports-color": { @@ -11984,7 +13598,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -11995,7 +13609,7 @@ "integrity": "sha1-rVikhl0X7D3bZjG2ylO+FKVlb/M=", "dev": true, "requires": { - "tslib": "1.8.0" + "tslib": "^1.7.1" } }, "tty-browserify": { @@ -12009,7 +13623,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "type-detect": { @@ -12036,8 +13650,8 @@ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "dev": true, "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" + "commander": "~2.13.0", + "source-map": "~0.6.1" }, "dependencies": { "commander": { @@ -12054,14 +13668,14 @@ "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==", "dev": true, "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.5", - "serialize-javascript": "1.5.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.1.0", - "worker-farm": "1.6.0" + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" } }, "underscore": { @@ -12076,10 +13690,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -12088,7 +13702,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -12097,10 +13711,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -12111,7 +13725,7 @@ "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "dev": true, "requires": { - "unique-slug": "2.0.0" + "unique-slug": "^2.0.0" } }, "unique-slug": { @@ -12120,7 +13734,7 @@ "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unset-value": { @@ -12129,8 +13743,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -12139,9 +13753,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -12187,9 +13801,9 @@ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" }, "upath": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", - "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, "uri-js": { @@ -12198,7 +13812,7 @@ "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" } }, "urix": { @@ -12231,7 +13845,7 @@ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "dev": true, "requires": { - "prepend-http": "2.0.0" + "prepend-http": "^2.0.0" } }, "url-to-options": { @@ -12246,7 +13860,7 @@ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -12263,20 +13877,12 @@ "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dev": true, "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } + "inherits": "2.0.3" } }, "util-deprecate": { @@ -12284,20 +13890,14 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "v8-compile-cache": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", - "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "vinyl": { @@ -12306,8 +13906,8 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", + "clone": "^1.0.0", + "clone-stats": "^0.0.1", "replace-ext": "0.0.1" } }, @@ -12317,12 +13917,12 @@ "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0", - "strip-bom-stream": "2.0.0", - "vinyl": "1.2.0" + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" } }, "vm-browserify": { @@ -12335,14 +13935,14 @@ } }, "watchpack": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", - "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "2.0.3", - "graceful-fs": "4.1.11", - "neo-async": "2.5.0" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" }, "dependencies": { "anymatch": { @@ -12351,8 +13951,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -12373,16 +13973,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -12391,7 +13991,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12402,18 +14002,18 @@ "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.1.2", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.0.4" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.1.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" } }, "expand-brackets": { @@ -12422,13 +14022,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -12437,7 +14037,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -12446,7 +14046,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -12455,7 +14055,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12464,7 +14064,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12475,7 +14075,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12484,7 +14084,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12495,9 +14095,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -12514,14 +14114,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -12530,7 +14130,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -12539,7 +14139,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12550,10 +14150,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -12562,7 +14162,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12573,8 +14173,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -12583,7 +14183,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -12594,7 +14194,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -12603,7 +14203,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -12612,9 +14212,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -12629,7 +14229,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -12638,7 +14238,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12647,7 +14247,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12670,19 +14270,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } @@ -12693,14 +14293,15 @@ "integrity": "sha1-xU2sX8DjdzmcBMGm7LsS5FEyeNY=", "requires": { "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" }, "dependencies": { "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "from": "bignumber.js@git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" } } }, @@ -12710,34 +14311,40 @@ "integrity": "sha1-ZCcmInEpRVpqBCMzNAnPXyvoJIg=", "dev": true, "requires": { - "bignumber.js": "4.1.0" + "bignumber.js": "^4.0.2" } }, "webpack": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.6.0.tgz", - "integrity": "sha512-Fu/k/3fZeGtIhuFkiYpIy1UDHhMiGKjG4FFPVuvG+5Os2lWA1ttWpmi9Qnn6AgfZqj9MvhZW/rmj/ip+nHr06g==", - "dev": true, - "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.4.0", - "ajv-keywords": "3.1.0", - "chrome-trace-event": "0.1.3", - "enhanced-resolve": "4.0.0", - "eslint-scope": "3.7.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.5.0", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.5", - "tapable": "1.0.0", - "uglifyjs-webpack-plugin": "1.2.5", - "watchpack": "1.5.0", - "webpack-sources": "1.1.0" + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.11.1.tgz", + "integrity": "sha512-8HGSxsLm9LTVgYiyfjY849c3Rgtb0bI0fPpdQsMmO6Hg8JXUOCudGD3j6sPfo6DaAdti1icUUZNh8XpY3igHqQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.10", + "@webassemblyjs/helper-module-context": "1.5.10", + "@webassemblyjs/wasm-edit": "1.5.10", + "@webassemblyjs/wasm-opt": "1.5.10", + "@webassemblyjs/wasm-parser": "1.5.10", + "acorn": "^5.0.0", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^0.1.1", + "enhanced-resolve": "^4.0.0", + "eslint-scope": "^3.7.1", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" }, "dependencies": { "arr-diff": { @@ -12758,16 +14365,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -12776,7 +14383,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12787,13 +14394,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -12802,7 +14409,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -12811,7 +14418,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -12820,7 +14427,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12829,7 +14436,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12840,7 +14447,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12849,7 +14456,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12860,9 +14467,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -12879,14 +14486,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -12895,7 +14502,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -12904,7 +14511,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12915,10 +14522,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -12927,7 +14534,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12938,7 +14545,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -12947,7 +14554,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -12956,9 +14563,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -12967,7 +14574,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12976,7 +14583,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12999,19 +14606,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } @@ -13022,7 +14629,7 @@ "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", "dev": true, "requires": { - "jscodeshift": "0.4.1" + "jscodeshift": "^0.4.0" }, "dependencies": { "ast-types": { @@ -13043,21 +14650,21 @@ "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", "dev": true, "requires": { - "async": "1.5.2", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "6.18.0", - "colors": "1.2.1", - "flow-parser": "0.69.0", - "lodash": "4.17.5", - "micromatch": "2.3.11", + "async": "^1.5.0", + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^6.17.3", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.12.9", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" + "nomnom": "^1.8.1", + "recast": "^0.12.5", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" } }, "recast": { @@ -13067,45 +14674,46 @@ "dev": true, "requires": { "ast-types": "0.10.1", - "core-js": "2.5.4", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" + "core-js": "^2.4.1", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" } } } }, "webpack-cli": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.0.13.tgz", - "integrity": "sha512-0lnOi3yla8FsZVuMsbfnNRB/8DlfuDugKdekC+4ykydZG0+UOidMi5J5LLWN4c0VJ8PqC19yMXXkYyCq78OuqA==", - "dev": true, - "requires": { - "chalk": "2.3.2", - "cross-spawn": "6.0.5", - "diff": "3.5.0", - "enhanced-resolve": "4.0.0", - "glob-all": "3.1.0", - "global-modules": "1.0.0", - "got": "8.3.0", - "inquirer": "5.2.0", - "interpret": "1.1.0", - "jscodeshift": "0.5.0", - "listr": "0.13.0", - "loader-utils": "1.1.0", - "lodash": "4.17.5", - "log-symbols": "2.2.0", - "mkdirp": "0.5.1", - "p-each-series": "1.0.0", - "p-lazy": "1.0.0", - "prettier": "1.11.1", - "resolve-cwd": "2.0.0", - "supports-color": "5.3.0", - "v8-compile-cache": "1.1.2", - "webpack-addons": "1.1.5", - "yargs": "11.0.0", - "yeoman-environment": "2.0.6", - "yeoman-generator": "2.0.3" + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.5.tgz", + "integrity": "sha512-CiWQR+1JS77rmyiO6y1q8Kt/O+e8nUUC9YfJ25JtSmzDwbqJV7vIsh3+QKRHVTbTCa0DaVh8iY1LBiagUIDB3g==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "diff": "^3.5.0", + "enhanced-resolve": "^4.0.0", + "envinfo": "^5.7.0", + "glob-all": "^3.1.0", + "global-modules": "^1.0.0", + "got": "^8.3.1", + "import-local": "^1.0.0", + "inquirer": "^5.2.0", + "interpret": "^1.1.0", + "jscodeshift": "^0.5.0", + "listr": "^0.14.1", + "loader-utils": "^1.1.0", + "lodash": "^4.17.10", + "log-symbols": "^2.2.0", + "mkdirp": "^0.5.1", + "p-each-series": "^1.0.0", + "p-lazy": "^1.0.0", + "prettier": "^1.12.1", + "supports-color": "^5.4.0", + "v8-compile-cache": "^2.0.0", + "webpack-addons": "^1.1.5", + "yargs": "^11.1.0", + "yeoman-environment": "^2.1.1", + "yeoman-generator": "^2.0.5" }, "dependencies": { "ansi-regex": { @@ -13120,7 +14728,16 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" + } + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" } }, "camelcase": { @@ -13130,53 +14747,147 @@ "dev": true }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cliui": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", - "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" } }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" + } + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" } }, "has-flag": { @@ -13191,15 +14902,194 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "listr": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.1.tgz", + "integrity": "sha512-MSMUUVN1f8aRnPi4034RkOqdiUlpYW+FqwFE3aL0uYNPRavkt2S2SsSpDDofn8BDpqv2RNnsdOcCHWsChcq77A==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.4.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^6.1.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "mem-fs-editor": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz", + "integrity": "sha512-QHvdXLLNmwJXxKdf7x27aNUren6IoPxwcM8Sfd+S6/ddQQMcYdEtVKsh6ilpqMrU18VQuKZEaH0aCGt3JDbA0g==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "deep-extend": "^0.5.1", + "ejs": "^2.5.9", + "glob": "^7.0.3", + "globby": "^8.0.0", + "isbinaryfile": "^3.0.2", + "mkdirp": "^0.5.0", + "multimatch": "^2.0.0", + "rimraf": "^2.2.8", + "through2": "^2.0.0", + "vinyl": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "prettier": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.4.tgz", + "integrity": "sha512-emsEZ2bAigL1lq6ssgkpPm1MIBqgeTvcp90NxOP5XDqprub/V/WS2Hfgih3mS7/1dqTUvhG+sxx1Dv8crnVexA==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "rxjs": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.0.tgz", + "integrity": "sha512-qBzf5uu6eOKiCZuAE0SgZ0/Qp+l54oeVxFfC2t+mJ2SFI6IB8gmMdJHs5DUMu5kqifqcCtsKS2XHjhZu6RKvAw==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "tslib": "^1.9.0" } }, "semver": { @@ -13214,26 +15104,66 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "has-flag": "^3.0.0" } }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tslib": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", + "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", + "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, "requires": { - "has-flag": "3.0.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } }, "which-module": { @@ -13243,23 +15173,23 @@ "dev": true }, "yargs": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", - "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { - "cliui": "4.0.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" } }, "yargs-parser": { @@ -13268,7 +15198,74 @@ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" + } + }, + "yeoman-environment": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.2.0.tgz", + "integrity": "sha512-gQ+hIW8QRlUo4jGBDCm++qg01SXaIVJ7VyLrtSwk2jQG4vtvluWpsGIl7V8DqT2jGiqukdec0uEyffVEyQgaZA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "diff": "^3.3.1", + "escape-string-regexp": "^1.0.2", + "globby": "^8.0.1", + "grouped-queue": "^0.3.3", + "inquirer": "^5.2.0", + "is-scoped": "^1.0.0", + "lodash": "^4.17.10", + "log-symbols": "^2.1.0", + "mem-fs": "^1.1.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "untildify": "^3.0.2" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "yeoman-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", + "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", + "dev": true, + "requires": { + "async": "^2.6.0", + "chalk": "^2.3.0", + "cli-table": "^0.3.1", + "cross-spawn": "^6.0.5", + "dargs": "^5.1.0", + "dateformat": "^3.0.3", + "debug": "^3.1.0", + "detect-conflict": "^1.0.0", + "error": "^7.0.2", + "find-up": "^2.1.0", + "github-username": "^4.0.0", + "istextorbinary": "^2.2.1", + "lodash": "^4.17.10", + "make-dir": "^1.1.0", + "mem-fs-editor": "^4.0.0", + "minimist": "^1.2.0", + "pretty-bytes": "^4.0.2", + "read-chunk": "^2.1.0", + "read-pkg-up": "^3.0.0", + "rimraf": "^2.6.2", + "run-async": "^2.0.0", + "shelljs": "^0.8.0", + "text-table": "^0.2.0", + "through2": "^2.0.0", + "yeoman-environment": "^2.0.5" } } } @@ -13279,8 +15276,8 @@ "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, "which": { @@ -13289,7 +15286,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -13303,7 +15300,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "window-size": { @@ -13318,7 +15315,7 @@ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -13327,8 +15324,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -13342,9 +15339,9 @@ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } }, "xhr2": { @@ -13380,20 +15377,20 @@ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" } }, "yargs-parser": { @@ -13402,296 +15399,9 @@ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dev": true, "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" - } - }, - "yeoman-environment": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz", - "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==", - "dev": true, - "requires": { - "chalk": "2.3.2", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "globby": "6.1.0", - "grouped-queue": "0.3.3", - "inquirer": "3.3.0", - "is-scoped": "1.0.0", - "lodash": "4.17.5", - "log-symbols": "2.2.0", - "mem-fs": "1.1.3", - "text-table": "0.2.0", - "untildify": "3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.5", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "yeoman-generator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.3.tgz", - "integrity": "sha512-mODmrZ26a94djmGZZuIiomSGlN4wULdou29ZwcySupb2e9FdvoCl7Ps2FqHFjEHio3kOl/iBeaNqrnx3C3NwWg==", - "dev": true, - "requires": { - "async": "2.6.0", - "chalk": "2.3.2", - "cli-table": "0.3.1", - "cross-spawn": "5.1.0", - "dargs": "5.1.0", - "dateformat": "3.0.3", - "debug": "3.1.0", - "detect-conflict": "1.0.1", - "error": "7.0.2", - "find-up": "2.1.0", - "github-username": "4.1.0", - "istextorbinary": "2.2.1", - "lodash": "4.17.5", - "make-dir": "1.2.0", - "mem-fs-editor": "3.0.2", - "minimist": "1.2.0", - "pretty-bytes": "4.0.2", - "read-chunk": "2.1.0", - "read-pkg-up": "3.0.0", - "rimraf": "2.6.2", - "run-async": "2.3.0", - "shelljs": "0.8.1", - "text-table": "0.2.0", - "through2": "2.0.3", - "yeoman-environment": "2.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.5" - } - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 9c75ba36..f0a587ed 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,11 @@ "dirty-chai": "^2.0.1", "ganache-cli": "^6.1.0", "solium": "^1.1.6", - "truffle": "^4.1.7", + "truffle": "^4.1.11", "tslint": "5.8.0", "typescript": "2.7.1", "web3-typescript-typings": "0.0.3", - "webpack": "^4.0.0" + "webpack": "^4.11.1" }, "dependencies": { "@types/bitwise-xor": "0.0.30", @@ -58,7 +58,7 @@ "events": "^1.1.1", "js-sha3": "^0.7.0", "lodash": "^4.17.5", - "npm": "^5.8.0", + "npm": "^6.1.0", "web3": "0.20.2" } -} \ No newline at end of file +} From a3e66840ddd161a8c49117885f6102e56b4e3e5f Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Wed, 6 Jun 2018 19:53:33 +0800 Subject: [PATCH 46/68] fix compile error --- contracts/helper/MiningHelper.sol | 4 ++-- contracts/helper/OrderHelper.sol | 4 ++-- contracts/helper/RingHelper.sol | 4 ++-- contracts/impl/Exchange.sol | 8 ++++---- contracts/lib/MultihashUtil.sol | 4 ++-- contracts/lib/TransferableMultsig.sol | 8 ++++---- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/contracts/helper/MiningHelper.sol b/contracts/helper/MiningHelper.sol index e34e16fa..146fd2a9 100644 --- a/contracts/helper/MiningHelper.sol +++ b/contracts/helper/MiningHelper.sol @@ -52,11 +52,11 @@ library MiningHelper { public pure { - mining.hash = keccak256( + mining.hash = keccak256(abi.encodePacked( mining.feeRecipient, mining.miner, mining.hash - ); + )); } function checkMinerSignature( Data.Mining mining, diff --git a/contracts/helper/OrderHelper.sol b/contracts/helper/OrderHelper.sol index 9ce7e03b..21b866e8 100644 --- a/contracts/helper/OrderHelper.sol +++ b/contracts/helper/OrderHelper.sol @@ -35,7 +35,7 @@ library OrderHelper { public pure { - order.hash = keccak256( + order.hash = keccak256(abi.encodePacked( order.owner, order.tokenS, order.tokenB, @@ -50,7 +50,7 @@ library OrderHelper { order.validUntil, order.limitByAmountB, order.allOrNone - ); + )); } function updateBrokerAndInterceptor( diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol index d710bda2..a97b628d 100644 --- a/contracts/helper/RingHelper.sol +++ b/contracts/helper/RingHelper.sol @@ -37,11 +37,11 @@ library RingHelper { { for (uint i = 0; i < ring.size; i++) { Data.Participation memory p = ring.participations[i]; - ring.hash = keccak256( + ring.hash = keccak256(abi.encodePacked( ring.hash, p.order.hash, p.marginSplitAsFee - ); + )); } } diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index 338a3f89..eabfac6e 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -381,11 +381,11 @@ contract Exchange is IExchange, NoDefaultFunc { ctx.ringHash ^= order.orderHash; } - ctx.ringHash = keccak256( + ctx.ringHash = keccak256(abi.encodePacked( ctx.ringHash, ctx.feeRecipient, ctx.feeSelections - ); + )); } function checkOrdersNotCancelled( @@ -910,7 +910,7 @@ contract Exchange is IExchange, NoDefaultFunc { view returns (bytes32) { - return keccak256( + return keccak256(abi.encodePacked( delegateAddress, order.owner, order.broker, @@ -924,7 +924,7 @@ contract Exchange is IExchange, NoDefaultFunc { order.validUntil, order.lrcFee, order.option - ); + )); } function getTradingPairCutoffs( diff --git a/contracts/lib/MultihashUtil.sol b/contracts/lib/MultihashUtil.sol index c3cdf5c7..ee49f6bb 100644 --- a/contracts/lib/MultihashUtil.sol +++ b/contracts/lib/MultihashUtil.sol @@ -48,10 +48,10 @@ library MultihashUtil { require(size == 65, "bad multihash size"); require( signer == ecrecover( - keccak256( + keccak256(abi.encodePacked( SIG_PREFIX, plaintext - ), + )), uint8(multihash[2]), BytesUtil.bytesToBytes32(multihash, 3), BytesUtil.bytesToBytes32(multihash, 11) diff --git a/contracts/lib/TransferableMultsig.sol b/contracts/lib/TransferableMultsig.sol index d4762e35..487687c2 100644 --- a/contracts/lib/TransferableMultsig.sol +++ b/contracts/lib/TransferableMultsig.sol @@ -58,7 +58,7 @@ contract TransferableMultsig is ITransferableMultsig { { // Follows ERC191 signature scheme: // https://github.com/ethereum/EIPs/issues/191 - bytes32 txHash = keccak256( + bytes32 txHash = keccak256(abi.encodePacked( byte(0x19), byte(0), this, @@ -66,7 +66,7 @@ contract TransferableMultsig is ITransferableMultsig { destination, value, data - ); + )); verifySignatures( sigV, @@ -92,14 +92,14 @@ contract TransferableMultsig is ITransferableMultsig { { // Follows ERC191 signature scheme: // https://github.com/ethereum/EIPs/issues/191 - bytes32 txHash = keccak256( + bytes32 txHash = keccak256(abi.encodePacked( byte(0x19), byte(0), this, nonce++, _threshold, _owners - ); + )); verifySignatures( sigV, From 2a1409933224ac0f71fc0b15663c99286494ae74 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Thu, 7 Jun 2018 20:06:27 +0800 Subject: [PATCH 47/68] update migration script --- migrations/2_deploy_registries.js | 11 ++++------- migrations/3_deploy_tokens.js | 2 +- migrations/4_deploy_protocol.js | 31 ++++++++----------------------- 3 files changed, 13 insertions(+), 31 deletions(-) diff --git a/migrations/2_deploy_registries.js b/migrations/2_deploy_registries.js index 4b3e15bc..7dcee784 100644 --- a/migrations/2_deploy_registries.js +++ b/migrations/2_deploy_registries.js @@ -1,10 +1,7 @@ -var TokenRegistryImpl = artifacts.require("./TokenRegistryImpl"); -var TokenTransferDelegateImpl = artifacts.require("./TokenTransferDelegateImpl"); -var TokenFactoryImpl = artifacts.require("./TokenFactoryImpl"); +var TradeDelegate = artifacts.require("./impl/TradeDelegate"); +var TokenRegistry = artifacts.require("./impl/TokenRegistry"); module.exports = function(deployer, network, accounts) { - deployer.deploy(TokenTransferDelegateImpl); - deployer.deploy(TokenRegistryImpl).then(() => { - return deployer.deploy(TokenFactoryImpl, TokenRegistryImpl.address); - }); + deployer.deploy(TradeDelegate, 20); + deployer.deploy(TokenRegistry); }; diff --git a/migrations/3_deploy_tokens.js b/migrations/3_deploy_tokens.js index d6cbb9e4..34875b86 100644 --- a/migrations/3_deploy_tokens.js +++ b/migrations/3_deploy_tokens.js @@ -2,7 +2,7 @@ var tokenInfo = require("./config/tokens.js"); var Bluebird = require("bluebird"); var _ = require("lodash"); var DummyToken = artifacts.require("./test/DummyToken"); -var TokenRegistry = artifacts.require("./TokenRegistryImpl"); +var TokenRegistry = artifacts.require("./impl/TokenRegistry"); module.exports = function(deployer, network, accounts) { if (network === "live") { diff --git a/migrations/4_deploy_protocol.js b/migrations/4_deploy_protocol.js index 55679506..29ca17a0 100644 --- a/migrations/4_deploy_protocol.js +++ b/migrations/4_deploy_protocol.js @@ -1,42 +1,27 @@ -var TokenRegistry = artifacts.require("./TokenRegistryImpl"); -var TokenTransferDelegate = artifacts.require("./TokenTransferDelegateImpl"); -var LoopringProtocolImpl = artifacts.require("./LoopringProtocolImpl"); +var TradeDelegate = artifacts.require("./impl/TradeDelegate"); +var TokenRegistry = artifacts.require("./impl/TokenRegistry"); +var Exchange = artifacts.require("./impl/Exchange"); module.exports = function(deployer, network, accounts) { if (network === "live") { - deployer.then(() => { - return Promise.all([ - TokenRegistry.deployed(), - TokenTransferDelegate.deployed(), - ]); - }).then((contracts) => { - var lrcAddr = "0xEF68e7C694F40c8202821eDF525dE3782458639f"; - return deployer.deploy( - LoopringProtocolImpl, - lrcAddr, - TokenRegistry.address, - TokenTransferDelegate.address, - 62500, - 20); - }); + // ignore. } else { deployer.then(() => { return Promise.all([ TokenRegistry.deployed(), - TokenTransferDelegate.deployed(), + TradeDelegate.deployed(), ]); }).then((contracts) => { var [tokenRegistry] = contracts; return tokenRegistry.getAddressBySymbol("LRC"); }).then(lrcAddr => { return deployer.deploy( - LoopringProtocolImpl, + Exchange, lrcAddr, TokenRegistry.address, - TokenTransferDelegate.address, - 62500, - 20); + TradeDelegate.address + ); }); } From bb7188940f998b9249b5679bfe49b5efe241a691 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Thu, 7 Jun 2018 20:07:55 +0800 Subject: [PATCH 48/68] change function modifier from public to internal in libraries --- contracts/helper/InputsHelper.sol | 6 +- contracts/helper/MiningHelper.sol | 6 +- contracts/helper/OrderHelper.sol | 11 +- contracts/helper/ParticipationHelper.sol | 6 +- contracts/helper/RingHelper.sol | 4 +- contracts/iface/IExchange.sol | 27 +- contracts/iface/ITokenRegistry.sol | 4 +- contracts/impl/Exchange.sol | 905 +++-------------------- contracts/impl/Exchange2.sol | 207 ------ contracts/impl/TokenRegistry.sol | 5 +- contracts/lib/BytesUtil.sol | 2 +- contracts/lib/MathBytes32.sol | 2 +- contracts/lib/MathUint.sol | 10 +- contracts/lib/MathUint8.sol | 2 +- contracts/lib/MultihashUtil.sol | 2 +- contracts/lib/StringUtil.sol | 6 +- contracts/spec/MiningSpec.sol | 8 +- contracts/spec/OrderSpec.sol | 20 +- contracts/spec/OrderSpecs.sol | 2 +- contracts/spec/ParticipationSpec.sol | 4 +- contracts/spec/RingSpecs.sol | 2 +- globals.d.ts | 29 +- package.json | 1 + truffle.js | 84 +-- 24 files changed, 218 insertions(+), 1137 deletions(-) delete mode 100644 contracts/impl/Exchange2.sol diff --git a/contracts/helper/InputsHelper.sol b/contracts/helper/InputsHelper.sol index 110cc95a..6d83c399 100644 --- a/contracts/helper/InputsHelper.sol +++ b/contracts/helper/InputsHelper.sol @@ -28,7 +28,7 @@ library InputsHelper { function nextAddress( Data.Inputs inputs ) - public + internal pure returns (address) { @@ -38,7 +38,7 @@ library InputsHelper { function nextUint( Data.Inputs inputs ) - public + internal pure returns (uint) { @@ -48,7 +48,7 @@ library InputsHelper { function nextBytes( Data.Inputs inputs ) - public + internal pure returns (bytes) { diff --git a/contracts/helper/MiningHelper.sol b/contracts/helper/MiningHelper.sol index 146fd2a9..1d34ae51 100644 --- a/contracts/helper/MiningHelper.sol +++ b/contracts/helper/MiningHelper.sol @@ -30,7 +30,7 @@ library MiningHelper { Data.Mining mining, Data.Context ctx ) - public + internal view returns (bytes32) { @@ -49,7 +49,7 @@ library MiningHelper { function updateHash( Data.Mining mining ) - public + internal pure { mining.hash = keccak256(abi.encodePacked( @@ -62,7 +62,7 @@ library MiningHelper { Data.Mining mining, Data.Context ctx ) - public + internal view { if (mining.sig.length == 0) { diff --git a/contracts/helper/OrderHelper.sol b/contracts/helper/OrderHelper.sol index 21b866e8..7abbc9c2 100644 --- a/contracts/helper/OrderHelper.sol +++ b/contracts/helper/OrderHelper.sol @@ -28,11 +28,10 @@ import "../lib/MultihashUtil.sol"; /// @title An Implementation of IOrderbook. /// @author Daniel Wang - . library OrderHelper { - using MathUint for uint; function updateHash(Data.Order order) - public + internal pure { order.hash = keccak256(abi.encodePacked( @@ -57,7 +56,7 @@ library OrderHelper { Data.Order order, Data.Context ctx ) - public + internal view { if (order.broker == address(0x0)) { @@ -76,7 +75,7 @@ library OrderHelper { Data.Order order, Data.Context ctx ) - public + internal view { order.maxAmountLrcFee = getSpendable( @@ -118,7 +117,7 @@ library OrderHelper { Data.Order order, Data.Context ctx ) - public + internal view { if (order.sig.length == 0) { @@ -142,7 +141,7 @@ library OrderHelper { Data.Order order, bytes32 miningHash ) - public + internal pure { if (order.dualAuthSig.length != 0) { diff --git a/contracts/helper/ParticipationHelper.sol b/contracts/helper/ParticipationHelper.sol index 37608321..79b36391 100644 --- a/contracts/helper/ParticipationHelper.sol +++ b/contracts/helper/ParticipationHelper.sol @@ -30,7 +30,7 @@ library ParticipationHelper { function adjustOrderState( Data.Participation p ) - public + internal pure { p.order.maxAmountS = p.order.maxAmountS.sub(p.fillAmountS); @@ -45,7 +45,7 @@ library ParticipationHelper { function calculateFillAmounts( Data.Participation p ) - public + internal pure returns (bool thisOrderIsSmaller) { @@ -69,7 +69,7 @@ library ParticipationHelper { Data.Participation p, Data.Mining mining ) - public + internal pure { Data.Order memory order = p.order; diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol index a97b628d..d36b422c 100644 --- a/contracts/helper/RingHelper.sol +++ b/contracts/helper/RingHelper.sol @@ -32,7 +32,7 @@ library RingHelper { function updateHash( Data.Ring ring ) - public + internal pure { for (uint i = 0; i < ring.size; i++) { @@ -49,7 +49,7 @@ library RingHelper { Data.Ring ring, Data.Mining mining ) - public + internal view { for (uint i = 0; i < ring.size; i++) { diff --git a/contracts/iface/IExchange.sol b/contracts/iface/IExchange.sol index 7f9b1d9b..8d5b3b4d 100644 --- a/contracts/iface/IExchange.sol +++ b/contracts/iface/IExchange.sol @@ -99,28 +99,13 @@ contract IExchange { external; /// @dev Submit a order-ring for validation and settlement. - /// @param addressesList List of each order's owner, broker, tokenS, wallet, - /// authAddr, and order interceptor. - /// Note that next order's `tokenS` equals this order's - /// `tokenB`. - /// @param valuesList List of uint-type arguments in this order: - /// amountS, amountB, validSince (second), - /// validUntil (second), lrcFee, and rateAmountS. - /// @param optionList Options associated with each order. - /// @param sigList Signature lists. - /// @param feeRecipient Mineing fee recipient address. - /// @param inteceptor Ring interceptor address. - /// @param feeSelections - - /// Bits to indicate fee selections. `1` represents margin - /// split and `0` represents LRC as fee. function submitRing( - address[6][] addressesList, - uint[6][] valuesList, - uint8[] optionList, - bytes[] sigList, - address feeRecipient, - address inteceptor, - uint8 feeSelections + uint16 miningSpec, + uint16[] orderSpecs, + uint8[][] ringSpecs, + address[] addressLists, + uint[] uintList, + bytes[] bytesList ) public; } diff --git a/contracts/iface/ITokenRegistry.sol b/contracts/iface/ITokenRegistry.sol index dc8bb052..b1bc7702 100644 --- a/contracts/iface/ITokenRegistry.sol +++ b/contracts/iface/ITokenRegistry.sol @@ -90,9 +90,9 @@ contract ITokenRegistry { returns (address); function getSymbolByAddress( - string symbol + address addr ) external view - returns (address); + returns (string); } diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index eabfac6e..9d816ce3 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -18,17 +18,31 @@ pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "../iface/IBrokerRegistry.sol"; +import "../iface/IBrokerInterceptor.sol"; +import "../iface/IExchange.sol"; +import "../iface/IOrderRegistry.sol"; +import "../iface/ITokenRegistry.sol"; +import "../iface/ITradeDelegate.sol"; +import "../iface/IMinerRegistry.sol"; + import "../lib/AddressUtil.sol"; import "../lib/BytesUtil.sol"; import "../lib/ERC20.sol"; import "../lib/MathUint.sol"; import "../lib/MultihashUtil.sol"; import "../lib/NoDefaultFunc.sol"; -import "../iface/IBrokerRegistry.sol"; -import "../iface/IBrokerInterceptor.sol"; -import "../iface/IExchange.sol"; -import "../iface/ITokenRegistry.sol"; -import "../iface/ITradeDelegate.sol"; + +import "../spec/OrderSpecs.sol"; +import "../spec/MiningSpec.sol"; +import "../spec/RingSpecs.sol"; + +import "../helper/InputsHelper.sol"; +import "../helper/OrderHelper.sol"; +import "../helper/RingHelper.sol"; +import "../helper/MiningHelper.sol"; + +import "./Data.sol"; /// @title An Implementation of IExchange. @@ -42,98 +56,41 @@ import "../iface/ITradeDelegate.sol"; /// https://github.com/jonasshen /// https://github.com/Hephyrius contract Exchange is IExchange, NoDefaultFunc { - using AddressUtil for address; - using MathUint for uint; + /* using MathUint for uint; */ + /* using MiningSpec for uint16; */ + /* using OrderSpecs for uint16[]; */ + /* using RingSpecs for uint8[][]; */ + /* using OrderHelper for Data.Order; */ + /* using RingHelper for Data.Ring; */ + /* using InputsHelper for Data.Inputs; */ + /* using MiningHelper for Data.Mining; */ address public lrcTokenAddress = 0x0; address public tokenRegistryAddress = 0x0; address public delegateAddress = 0x0; - address public brokerRegistryAddress = 0x0; + address public orderBrokerRegistryAddress = 0x0; + address public minerBrokerRegistryAddress = 0x0; + address public orderRegistryAddress = 0x0; + address public minerRegistryAddress = 0x0; uint64 public ringIndex = 0; - // Exchange rate (rate) is the amount to sell or sold divided by the amount - // to buy or bought. - // - // Rate ratio is the ratio between executed rate and an order's original - // rate. - // - // To require all orders' rate ratios to have coefficient ofvariation (CV) - // smaller than 2.5%, for an example , rateRatioCVSThreshold should be: - // `(0.025 * RATE_RATIO_SCALE)^2` or 62500. - uint public rateRatioCVSThreshold = 0; - uint public constant MAX_RING_SIZE = 8; - uint public constant RATE_RATIO_SCALE = 10000; - - struct Order { - address owner; - address broker; - address tokenS; - address tokenB; - address wallet; - address authAddr; - address interceptor; - uint amountS; - uint amountB; - uint validSince; - uint validUntil; - uint lrcFee; - uint8 option; - bool optCapByAmountB; - bool optAllOrNone; - bool marginSplitAsFee; - bytes32 orderHash; - address brokerInterceptor; - uint rateS; - uint rateB; - uint fillAmountS; - uint lrcReward; - uint lrcFeeState; - uint splitS; - uint splitB; - } - - /// @dev A struct to capture parameters passed to submitRing method and - /// various of other variables used across the submitRing core logics. - struct Context { - address[6][] addressesList; - uint[6][] valuesList; - uint8[] optionList; - bytes[] sigList; - address feeRecipient; - address interceptor; - uint8 feeSelections; - uint64 ringIndex; - uint ringSize; // computed - ITradeDelegate delegate; - IBrokerRegistry brokerRegistry; - Order[] orders; - bytes32 ringHash; // computed - } - constructor( address _lrcTokenAddress, address _tokenRegistryAddress, - address _delegateAddress, - address _brokerRegistryAddress, - uint _rateRatioCVSThreshold + address _delegateAddress ) public { - require(_lrcTokenAddress.isContract()); - require(_tokenRegistryAddress.isContract()); - require(_delegateAddress.isContract()); - require(_brokerRegistryAddress.isContract()); - - require(_rateRatioCVSThreshold > 0); - - lrcTokenAddress = _lrcTokenAddress; - tokenRegistryAddress = _tokenRegistryAddress; - delegateAddress = _delegateAddress; - brokerRegistryAddress = _brokerRegistryAddress; - rateRatioCVSThreshold = _rateRatioCVSThreshold; + require(_lrcTokenAddress != 0x0); + require(_tokenRegistryAddress != 0x0); + require(_delegateAddress != 0x0); + + lrcTokenAddress = _lrcTokenAddress; + tokenRegistryAddress = _tokenRegistryAddress; + delegateAddress = _delegateAddress; } function cancelOrders( @@ -145,10 +102,10 @@ contract Exchange is IExchange, NoDefaultFunc { uint size = orderHashes.length; require(size > 0 && size % 32 == 0); - verifyAuthenticationGetInterceptor( - owner, - tx.origin - ); + /* verifyAuthenticationGetInterceptor( */ + /* owner, */ + /* tx.origin */ + /* ); */ size /= 32; bytes32[] memory hashes = new bytes32[](size); @@ -175,7 +132,7 @@ contract Exchange is IExchange, NoDefaultFunc { ) external { - verifyAuthenticationGetInterceptor(owner, tx.origin); + // verifyAuthenticationGetInterceptor(owner, tx.origin); uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; @@ -202,10 +159,10 @@ contract Exchange is IExchange, NoDefaultFunc { ) external { - verifyAuthenticationGetInterceptor( - owner, - tx.origin - ); + /* verifyAuthenticationGetInterceptor( */ + /* owner, */ + /* tx.origin */ + /* ); */ uint t = (cutoff == 0 || cutoff >= block.timestamp) ? block.timestamp : cutoff; @@ -218,635 +175,81 @@ contract Exchange is IExchange, NoDefaultFunc { ); } - function submitRing( - address[6][] addressesList, - uint[6][] valuesList, - uint8[] optionList, - bytes[] sigList, - address feeRecipient, - address interceptor, - uint8 feeSelections + function submitRings( + uint16 miningSpec, + uint16[] orderSpecs, + uint8[][] ringSpecs, + address[] addressLists, + uint[] uintList, + bytes[] bytesList ) public { - Context memory ctx = Context( - addressesList, - valuesList, - optionList, - sigList, - feeRecipient, - interceptor, - feeSelections, - ringIndex, - addressesList.length, - ITradeDelegate(delegateAddress), - IBrokerRegistry(brokerRegistryAddress), - new Order[](addressesList.length), - 0x0 // ringHash - ); - - // Check if the highest bit of ringIndex is '1'. - require((ringIndex >> 63) == 0, "reentry"); - - // Set the highest bit of ringIndex to '1'. - ringIndex |= (uint64(1) << 63); - - verifyInputDataIntegrity(ctx); - - assembleOrders(ctx); - - checkOrdersNotCancelled(ctx); - - verifyRingSignatures(ctx); - - verifyTokensRegistered(ctx); - - verifyRingHasNoSubRing(ctx); - - verifyMinerSuppliedFillRates(ctx); - - scaleOrders(ctx); - - calculateRingFillAmount(ctx); - - calculateRingFees(ctx); - - settleRing(ctx); - - ringIndex = ctx.ringIndex + 1; - } - - /// @dev verify input data's basic integrity. - function verifyInputDataIntegrity( - Context ctx - ) - private - view - { - if (ctx.feeRecipient == 0x0) { - ctx.feeRecipient = tx.origin; - } - - //Check ring size - require( - ctx.ringSize > 1 && ctx.ringSize <= MAX_RING_SIZE, - "invalid ring size" - ); - - require( - ctx.ringSize == ctx.addressesList.length, - "wrong addressesList size" - ); - - require( - ctx.ringSize == ctx.valuesList.length, - "wrong valuesList size" - ); - - require( - ctx.ringSize == ctx.optionList.length, - "wrong optionList size" - ); - - require( - (ctx.ringSize << 1) == ctx.sigList.length, - "invalid signature size" - ); - - // Validate ring-mining related arguments. - - for (uint i = 0; i < ctx.ringSize; i++) { - require(ctx.valuesList[i][5] > 0, "rateAmountS is 0"); - } - } - - /// @dev Assemble input data into structs so we can pass them to other functions. - /// This method also calculates ringHash, therefore it must be called before - /// calling `verifyRingSignatures`. - function assembleOrders( - Context ctx - ) - private - view - { - for (uint i = 0; i < ctx.ringSize; i++) { - - uint[6] memory uintArgs = ctx.valuesList[i]; - bool marginSplitAsFee = (ctx.feeSelections & (uint8(1) << i)) > 0; - - Order memory order = Order( - ctx.addressesList[i][0], - ctx.addressesList[i][1], - ctx.addressesList[i][2], - ctx.addressesList[(i + 2) % ctx.ringSize][1], - ctx.addressesList[i][3], - ctx.addressesList[i][4], - ctx.addressesList[i][5], - uintArgs[0], - uintArgs[1], - uintArgs[2], - uintArgs[3], - uintArgs[4], - ctx.optionList[i], - ctx.optionList[i] & OPTION_MASK_CAP_BY_AMOUNTB > 0 ? true : false, - ctx.optionList[i] & OPTION_MASK_ALL_OR_NONE > 0 ? true : false, - marginSplitAsFee, - 0x0, - 0x0, // brokderTracker - uintArgs[5], - uintArgs[1], - 0, // fillAmountS - 0, // lrcReward - 0, // lrcFee - 0, // splitS - 0. // splitB - ); - - validateOrder(order); - - order.orderHash = calculateOrderHash(order); - - MultihashUtil.verifySignature( - order.broker, - order.orderHash, - ctx.sigList[i] - ); - - order.brokerInterceptor = verifyAuthenticationGetInterceptor( - order.owner, - order.broker - ); - - ctx.orders[i] = order; - ctx.ringHash ^= order.orderHash; - } - - ctx.ringHash = keccak256(abi.encodePacked( - ctx.ringHash, - ctx.feeRecipient, - ctx.feeSelections - )); - } - - function checkOrdersNotCancelled( - Context ctx - ) - private - view - { - address[] memory owners = new address[](ctx.ringSize); - bytes20[] memory tradingPairs = new bytes20[](ctx.ringSize); - uint[] memory validSinceTimes = new uint[](ctx.ringSize); - - for (uint i = 0; i < ctx.ringSize; i++) { - Order memory order = ctx.orders[i]; - - require( - !ctx.delegate.cancelled(order.owner, order.orderHash), - "ordre cancelled already" - ); - - owners[i] = order.owner; - tradingPairs[i] = bytes20(order.tokenS) ^ bytes20(order.tokenB); - validSinceTimes[i] = order.validSince; - } - - ctx.delegate.checkCutoffsBatch( - owners, - tradingPairs, - validSinceTimes - ); - } - - /// @dev Verify the ringHash has been signed with each order's auth private - /// keys. - function verifyRingSignatures( - Context ctx - ) - private - pure - { - uint j; - for (uint i = 0; i < ctx.ringSize; i++) { - j = i + ctx.ringSize; - - MultihashUtil.verifySignature( - ctx.orders[i].authAddr, - ctx.ringHash, - ctx.sigList[i] - ); - } - } - - function verifyTokensRegistered( - Context ctx - ) - private - view - { - // Extract the token addresses - address[] memory tokens = new address[](ctx.ringSize); - for (uint i = 0; i < ctx.ringSize; i++) { - tokens[i] = ctx.orders[i].tokenS; - } - - // Test all token addresses at once - require( - ITokenRegistry(tokenRegistryAddress).areAllTokensRegistered(tokens), - "token not registered" - ); - } - - /// @dev Validate a ring. - function verifyRingHasNoSubRing( - Context ctx - ) - private - pure - { - // Check the ring has no sub-ring. - for (uint i = 0; i < ctx.ringSize - 1; i++) { - address tokenS = ctx.orders[i].tokenS; - for (uint j = i + 1; j < ctx.ringSize; j++) { - require(tokenS != ctx.orders[j].tokenS, "subring found"); - } - } - } - - /// @dev Exchange rates calculation are performed by ring-miners as solidity - /// cannot get power-of-1/n operation, therefore we have to verify - /// these rates are correct. - function verifyMinerSuppliedFillRates( - Context ctx - ) - private - view - { - uint[] memory rateRatios = new uint[](ctx.ringSize); - uint _rateRatioScale = RATE_RATIO_SCALE; - - for (uint i = 0; i < ctx.ringSize; i++) { - uint s1b0 = ctx.orders[i].rateS.mul(ctx.orders[i].amountB); - uint s0b1 = ctx.orders[i].amountS.mul(ctx.orders[i].rateB); - - require(s1b0 <= s0b1, "invalid discount"); - - rateRatios[i] = _rateRatioScale.mul(s1b0) / s0b1; - } - - uint cvs = MathUint.cvsquare(rateRatios, _rateRatioScale); - - require(cvs <= rateRatioCVSThreshold, "uneven discount"); - } - - /// @dev Scale down all orders based on historical fill or cancellation - /// stats but key the order's original exchange rate. - function scaleOrders( - Context ctx - ) - private - view - { - uint ringSize = ctx.ringSize; - Order[] memory orders = ctx.orders; - - for (uint i = 0; i < ringSize; i++) { - Order memory order = orders[i]; - - if (order.optAllOrNone) { - require( - ctx.delegate.filled(order.orderHash) == 0, - "AON filled or cancelled already" - ); - } else { - uint amount; - - if (order.optCapByAmountB) { - amount = order.amountB.tolerantSub( - ctx.delegate.filled(order.orderHash) - ); - - order.amountS = amount.mul(order.amountS) / order.amountB; - order.lrcFee = amount.mul(order.lrcFee) / order.amountB; - - order.amountB = amount; - } else { - amount = order.amountS.tolerantSub( - ctx.delegate.filled(order.orderHash) - ); - - order.amountB = amount.mul(order.amountB) / order.amountS; - order.lrcFee = amount.mul(order.lrcFee) / order.amountS; - - order.amountS = amount; - } - } - - require(order.amountS > 0, "amountS scaled to 0"); - require(order.amountB > 0, "amountB scaled to 0"); - - uint availableAmountS = getSpendable( - ctx.delegate, - order.tokenS, - order.owner, - order.broker, - order.brokerInterceptor - ); - - // This check is more strict than it needs to be, in case the - // `optCapByAmountB`is true. - if (order.optAllOrNone) { - require( - availableAmountS >= order.amountS, - "AON spendable" - ); - } else { - require(availableAmountS > 0, "spendable is 0"); - order.fillAmountS = ( - order.amountS < availableAmountS ? - order.amountS : availableAmountS - ); - require(order.fillAmountS > 0, "fillAmountS is 0"); - } - } - } - - /// @dev Based on the already verified exchange rate provided by ring-miners, - /// we can furthur scale down orders based on token balance and allowance, - /// then find the smallest order of the ring, then calculate each order's - /// `fillAmountS`. - function calculateRingFillAmount( - Context ctx - ) - private - pure - { - uint smallestIdx = 0; - - for (uint i = 0; i < ctx.ringSize; i++) { - uint j = (i + 1) % ctx.ringSize; - smallestIdx = calculateOrderFillAmount( - ctx.orders[i], - ctx.orders[j], - i, - j, - smallestIdx - ); - } - - for (uint i = 0; i < smallestIdx; i++) { - calculateOrderFillAmount( - ctx.orders[i], - ctx.orders[(i + 1) % ctx.ringSize], - 0, // Not needed - 0, // Not needed - 0 // Not needed - ); - } - } - - /// @dev Calculate each order's `lrcFee` and `lrcRewrard` and splict how much - /// of `fillAmountS` shall be paid to matching order or fee recipient as margin - /// split. - function calculateRingFees( - Context ctx - ) - private - view - { - uint ringSize = ctx.ringSize; - bool checkedMinerLrcSpendable = false; - uint minerLrcSpendable = 0; - uint nextFillAmountS; - - for (uint i = 0; i < ringSize; i++) { - Order memory order = ctx.orders[i]; - uint lrcReceiable = 0; - - if (order.lrcFeeState == 0) { - // When an order's LRC fee is 0 or smaller than the specified fee, - // we help miner automatically select margin-split. - order.marginSplitAsFee = true; - } else { - uint lrcSpendable = getSpendable( - ctx.delegate, - lrcTokenAddress, - order.owner, - order.broker, - order.brokerInterceptor - ); - - // If the order is selling LRC, we need to calculate how much LRC - // is left that can be used as fee. - if (order.tokenS == lrcTokenAddress) { - lrcSpendable = lrcSpendable.sub(order.fillAmountS); - } - - // If the order is buyign LRC, it will has more to pay as fee. - if (order.tokenB == lrcTokenAddress) { - nextFillAmountS = ctx.orders[(i + 1) % ringSize].fillAmountS; - lrcReceiable = nextFillAmountS; - } - - uint lrcTotal = lrcSpendable.add(lrcReceiable); - - // If order doesn't have enough LRC, set margin split to 100%. - if (lrcTotal < order.lrcFeeState) { - order.lrcFeeState = lrcTotal; - } - - if (order.lrcFeeState == 0) { - order.marginSplitAsFee = true; - } - } - - if (!order.marginSplitAsFee) { - if (lrcReceiable > 0) { - if (lrcReceiable >= order.lrcFeeState) { - order.splitB = order.lrcFeeState; - order.lrcFeeState = 0; - } else { - order.splitB = lrcReceiable; - order.lrcFeeState = order.lrcFeeState.sub(lrcReceiable); - } - } - } else { - - // Only check the available miner balance when absolutely needed - if (!checkedMinerLrcSpendable && minerLrcSpendable < order.lrcFeeState) { - checkedMinerLrcSpendable = true; - minerLrcSpendable = getSpendable( - ctx.delegate, - lrcTokenAddress, - tx.origin, - 0x0, - 0x0 - ); - } - - // Only calculate split when miner has enough LRC; - // otherwise all splits are 0. - if (minerLrcSpendable >= order.lrcFeeState) { - nextFillAmountS = ctx.orders[(i + 1) % ringSize].fillAmountS; - uint split; - if (order.optCapByAmountB) { - split = (nextFillAmountS.mul( - order.amountS - ) / order.amountB).sub( - order.fillAmountS - ) / 2; - } else { - split = nextFillAmountS.sub( - order.fillAmountS.mul( - order.amountB - ) / order.amountS - ) / 2; - } - - if (order.optCapByAmountB) { - order.splitS = split; - } else { - order.splitB = split; - } - - // This implicits order with smaller index in the ring will - // be paid LRC reward first, so the orders in the ring does - // mater. - if (split > 0) { - minerLrcSpendable = minerLrcSpendable.sub(order.lrcFeeState); - order.lrcReward = order.lrcFeeState; - } - } - - order.lrcFeeState = 0; - } - } - } - - function settleRing( - Context ctx - ) - private - { - bytes32[] memory batch = new bytes32[](ctx.ringSize * 7); - bytes32[] memory historyBatch = new bytes32[](ctx.ringSize * 2); - Fill[] memory fills = new Fill[](ctx.ringSize); - - uint p = 0; - uint q = 0; - uint prevSplitB = ctx.orders[ctx.ringSize - 1].splitB; - for (uint i = 0; i < ctx.ringSize; i++) { - Order memory order = ctx.orders[i]; - uint nextFillAmountS = ctx.orders[(i + 1) % ctx.ringSize].fillAmountS; - - // Store owner and tokenS of every order - batch[p++] = bytes32(order.owner); - batch[p++] = bytes32(order.broker); - batch[p++] = bytes32(order.brokerInterceptor); - batch[p++] = bytes32(order.tokenS); - - // Store all amounts - batch[p++] = bytes32(order.fillAmountS - prevSplitB); - batch[p++] = bytes32(prevSplitB + order.splitS); - batch[p++] = bytes32(order.lrcReward); - batch[p++] = bytes32(order.lrcFeeState); - batch[p++] = bytes32(order.wallet); - - historyBatch[q++] = order.orderHash; - historyBatch[q++] = bytes32( - order.optCapByAmountB ? nextFillAmountS : order.fillAmountS - ); - - fills[i] = Fill( - order.orderHash, - order.owner, - order.tokenS, - order.fillAmountS, - order.splitS > 0 ? int(order.splitS) : -int(order.splitB), - int(order.lrcFeeState) - int(order.lrcReward) - ); - - prevSplitB = order.splitB; - } - - ctx.delegate.batchUpdateHistoryAndTransferTokens( - lrcTokenAddress, - tx.origin, - ctx.feeRecipient, - historyBatch, - batch - ); - - emit RingMined( - ctx.ringIndex, - tx.origin, - ctx.feeRecipient, - fills - ); - } - - /// @return The smallest order's index. - function calculateOrderFillAmount( - Order order, - Order next, - uint i, - uint j, - uint smallestIdx - ) - private - pure - returns (uint newSmallestIdx) - { - // Default to the same smallest index - newSmallestIdx = smallestIdx; - - uint fillAmountB = order.fillAmountS.mul( - order.rateB - ) / order.rateS; - - if (order.optCapByAmountB) { - if (fillAmountB > order.amountB) { - fillAmountB = order.amountB; - - order.fillAmountS = fillAmountB.mul( - order.rateS - ) / order.rateB; - require(order.fillAmountS > 0, "fillAmountS is 0"); - - newSmallestIdx = i; - } - order.lrcFeeState = order.lrcFee.mul( - fillAmountB - ) / order.amountB; - } else { - order.lrcFeeState = order.lrcFee.mul( - order.fillAmountS - ) / order.amountS; - } - - // Check All-or-None orders - if (order.optAllOrNone){ - if (order.optCapByAmountB) { - require( - fillAmountB >= order.amountB, - "AON failed on amountB" - ); - } else { - require( - order.fillAmountS >= order.amountS, - "AON failed on amountS" - ); - } - } - - if (fillAmountB <= next.fillAmountS) { - next.fillAmountS = fillAmountB; - } else { - newSmallestIdx = j; - } + /* Data.Context memory ctx = Data.Context( */ + /* lrcTokenAddress, */ + /* ITokenRegistry(tokenRegistryAddress), */ + /* ITradeDelegate(delegateAddress), */ + /* IBrokerRegistry(orderBrokerRegistryAddress), */ + /* IBrokerRegistry(minerBrokerRegistryAddress), */ + /* IOrderRegistry(orderRegistryAddress), */ + /* IMinerRegistry(minerRegistryAddress) */ + /* ); */ + + /* Data.Inputs memory inputs = Data.Inputs( */ + /* addressLists, */ + /* uintList, */ + /* bytesList, */ + /* 0, 0, 0 // current indices of addressLists, uintList, and bytesList. */ + /* ); */ + + /* Data.Mining memory mining = Data.Mining( */ + /* inputs.nextAddress(), */ + /* (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), */ + /* (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), */ + /* bytes32(0x0), // hash */ + /* address(0x0), // interceptor */ + /* getSpendable( */ + /* ctx.delegate, */ + /* ctx.lrcTokenAddress, */ + /* tx.origin, // TODO(daniel): pay from msg.sender? */ + /* 0x0, // broker */ + /* 0x0 // brokerInterceptor */ + /* ) */ + /* ); */ + + /* Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); */ + /* Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); */ + + /* for (uint i = 0; i < orders.length; i++) { */ + /* orders[i].updateHash(); */ + /* orders[i].updateBrokerAndInterceptor(ctx); */ + /* orders[i].checkBrokerSignature(ctx); */ + /* } */ + + /* for (uint i = 0; i < rings.length; i++) { */ + /* rings[i].updateHash(); */ + /* mining.hash ^= rings[i].hash; */ + /* } */ + + /* mining.updateHash(); */ + /* mining.updateMinerAndInterceptor(ctx); */ + /* mining.checkMinerSignature(ctx); */ + + /* for (uint i = 0; i < orders.length; i++) { */ + /* orders[i].checkDualAuthSignature(mining.hash); */ + /* } */ + + /* for (uint i = 0; i < orders.length; i++) { */ + /* orders[i].updateStates(ctx); */ + /* } */ + + /* for (uint i = 0; i < rings.length; i++){ */ + /* rings[i].calculateFillAmountAndFee(mining); */ + /* } */ } /// @return Amount of ERC20 token that can be spent by this contract. + // TODO(daniel): there is another getSpendable in OrderHelper. function getSpendable( ITradeDelegate delegate, address tokenAddress, @@ -874,7 +277,7 @@ contract Exchange is IExchange, NoDefaultFunc { } } - if (brokerInterceptor != 0x0) { + if (brokerInterceptor != tokenOwner) { amount = IBrokerInterceptor(brokerInterceptor).getAllowance( tokenOwner, broker, @@ -886,76 +289,4 @@ contract Exchange is IExchange, NoDefaultFunc { } } - /// @dev validate order's parameters are OK. - function validateOrder( - Order order - ) - private - view - { - require(order.owner != 0x0, "invalid owner"); - require(order.tokenS != 0x0, "invalid tokenS"); - require(order.tokenB != 0x0, "nvalid tokenB"); - require(order.amountS != 0, "invalid amountS"); - require(order.amountB != 0, "invalid amountB"); - require(order.validSince <= block.timestamp, "immature"); - require(order.validUntil > block.timestamp, "expired"); - } - - /// @dev Get the Keccak-256 hash of order with specified parameters. - function calculateOrderHash( - Order order - ) - private - view - returns (bytes32) - { - return keccak256(abi.encodePacked( - delegateAddress, - order.owner, - order.broker, - order.tokenS, - order.tokenB, - order.wallet, - order.authAddr, - order.amountS, - order.amountB, - order.validSince, - order.validUntil, - order.lrcFee, - order.option - )); - } - - function getTradingPairCutoffs( - address orderOwner, - address token1, - address token2 - ) - public - view - returns (uint) - { - bytes20 tokenPair = bytes20(token1) ^ bytes20(token2); - ITradeDelegate delegate = ITradeDelegate(delegateAddress); - return delegate.tradingPairCutoffs(orderOwner, tokenPair); - } - - function verifyAuthenticationGetInterceptor( - address owner, - address signer - ) - private - view - returns (address brokerInterceptor) - { - if (signer == owner) { - brokerInterceptor = 0x0; - } else { - IBrokerRegistry brokerRegistry = IBrokerRegistry(brokerRegistryAddress); - bool authenticated; - (authenticated, brokerInterceptor) = brokerRegistry.getBroker(owner, signer); - require(authenticated, "broker unauthenticated"); - } - } } diff --git a/contracts/impl/Exchange2.sol b/contracts/impl/Exchange2.sol deleted file mode 100644 index 99fc10e6..00000000 --- a/contracts/impl/Exchange2.sol +++ /dev/null @@ -1,207 +0,0 @@ -/* - - Copyright 2017 Loopring Project Ltd (Loopring Foundation). - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -pragma solidity 0.4.24; -pragma experimental "v0.5.0"; -pragma experimental "ABIEncoderV2"; - -import "../iface/IBrokerRegistry.sol"; -import "../iface/IBrokerInterceptor.sol"; -import "../iface/IExchange.sol"; -import "../iface/IOrderRegistry.sol"; -import "../iface/ITokenRegistry.sol"; -import "../iface/ITradeDelegate.sol"; -import "../iface/IMinerRegistry.sol"; - -import "../lib/AddressUtil.sol"; -import "../lib/BytesUtil.sol"; -import "../lib/ERC20.sol"; -import "../lib/MathUint.sol"; -import "../lib/MultihashUtil.sol"; -import "../lib/NoDefaultFunc.sol"; - -import "../spec/OrderSpecs.sol"; -import "../spec/MiningSpec.sol"; -import "../spec/RingSpecs.sol"; - -import "../helper/InputsHelper.sol"; -import "../helper/OrderHelper.sol"; -import "../helper/RingHelper.sol"; -import "../helper/MiningHelper.sol"; - -import "./Data.sol"; - - -/// @title An Implementation of IExchange. -/// @author Daniel Wang - , -/// @author Kongliang Zhong - -/// -/// Recognized contributing developers from the community: -/// https://github.com/Brechtpd -/// https://github.com/rainydio -/// https://github.com/BenjaminPrice -/// https://github.com/jonasshen -/// https://github.com/Hephyrius -contract Exchange is IExchange, NoDefaultFunc { - using AddressUtil for address; - using MathUint for uint; - using MiningSpec for uint16; - using OrderSpecs for uint16[]; - using RingSpecs for uint8[][]; - using OrderHelper for Data.Order; - using RingHelper for Data.Ring; - using InputsHelper for Data.Inputs; - using MiningHelper for Data.Mining; - - address public lrcTokenAddress = 0x0; - address public tokenRegistryAddress = 0x0; - address public delegateAddress = 0x0; - address public orderBrokerRegistryAddress = 0x0; - address public minerBrokerRegistryAddress = 0x0; - address public orderRegistryAddress = 0x0; - address public minerRegistryAddress = 0x0; - - uint64 public ringIndex = 0; - - // Exchange rate (rate) is the amount to sell or sold divided by the amount - // to buy or bought. - // - // Rate ratio is the ratio between executed rate and an order's original - // rate. - // - // To require all orders' rate ratios to have coefficient ofvariation (CV) - // smaller than 2.5%, for an example , rateRatioCVSThreshold should be: - // `(0.025 * RATE_RATIO_SCALE)^2` or 62500. - uint public rateRatioCVSThreshold = 0; - - uint public constant MAX_RING_SIZE = 8; - - uint public constant RATE_RATIO_SCALE = 10000; - - function submitRings( - uint16 miningSpec, - uint16[] orderSpecs, - uint8[][] ringSpecs, - address[] addressLists, - uint[] uintList, - bytes[] bytesList - ) - public - { - Data.Context memory ctx = Data.Context( - lrcTokenAddress, - ITokenRegistry(tokenRegistryAddress), - ITradeDelegate(delegateAddress), - IBrokerRegistry(orderBrokerRegistryAddress), - IBrokerRegistry(minerBrokerRegistryAddress), - IOrderRegistry(orderRegistryAddress), - IMinerRegistry(minerRegistryAddress) - ); - - Data.Inputs memory inputs = Data.Inputs( - addressLists, - uintList, - bytesList, - 0, 0, 0 // current indices of addressLists, uintList, and bytesList. - ); - - Data.Mining memory mining = Data.Mining( - inputs.nextAddress(), - (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), - (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), - bytes32(0x0), // hash - address(0x0), // interceptor - getSpendable( - ctx.delegate, - ctx.lrcTokenAddress, - tx.origin, // TODO(daniel): pay from msg.sender? - 0x0, // broker - 0x0 // brokerInterceptor - ) - ); - - Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); - Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); - - for (uint i = 0; i < orders.length; i++) { - orders[i].updateHash(); - orders[i].updateBrokerAndInterceptor(ctx); - orders[i].checkBrokerSignature(ctx); - } - - for (uint i = 0; i < rings.length; i++) { - rings[i].updateHash(); - mining.hash ^= rings[i].hash; - } - - mining.updateHash(); - mining.updateMinerAndInterceptor(ctx); - mining.checkMinerSignature(ctx); - - for (uint i = 0; i < orders.length; i++) { - orders[i].checkDualAuthSignature(mining.hash); - } - - for (uint i = 0; i < orders.length; i++) { - orders[i].updateStates(ctx); - } - - for (uint i = 0; i < rings.length; i++){ - rings[i].calculateFillAmountAndFee(mining); - } - } - - /// @return Amount of ERC20 token that can be spent by this contract. - // TODO(daniel): there is another getSpendable in OrderHelper. - function getSpendable( - ITradeDelegate delegate, - address tokenAddress, - address tokenOwner, - address broker, - address brokerInterceptor - ) - private - view - returns (uint spendable) - { - ERC20 token = ERC20(tokenAddress); - spendable = token.allowance( - tokenOwner, - address(delegate) - ); - if (spendable == 0) { - return; - } - uint amount = token.balanceOf(tokenOwner); - if (amount < spendable) { - spendable = amount; - if (spendable == 0) { - return; - } - } - - if (brokerInterceptor != tokenOwner) { - amount = IBrokerInterceptor(brokerInterceptor).getAllowance( - tokenOwner, - broker, - tokenAddress - ); - if (amount < spendable) { - spendable = amount; - } - } - } -} diff --git a/contracts/impl/TokenRegistry.sol b/contracts/impl/TokenRegistry.sol index df6e3170..378830d9 100644 --- a/contracts/impl/TokenRegistry.sol +++ b/contracts/impl/TokenRegistry.sol @@ -28,12 +28,11 @@ import "../lib/NoDefaultFunc.sol"; /// @author Kongliang Zhong - , /// @author Daniel Wang - . contract TokenRegistry is ITokenRegistry, Claimable, NoDefaultFunc { - using AddressUtil for address; mapping (address => uint) private agencyPosMap; mapping (address => uint) private tokenPosMap; + mapping (string => address) private symbolToAddressMap; mapping (address => string) public addressToSymbolMap; - mapping (string => address) public symbolToAddressMap; function registerAgency( address agency @@ -41,7 +40,7 @@ contract TokenRegistry is ITokenRegistry, Claimable, NoDefaultFunc { onlyOwner external { - require(agency.isContract(), "bad agency"); + // require(agency.isContract(), "bad agency"); require( 0 == agencyPosMap[agency], "agency already exists" diff --git a/contracts/lib/BytesUtil.sol b/contracts/lib/BytesUtil.sol index 7da939fa..03c51f71 100644 --- a/contracts/lib/BytesUtil.sol +++ b/contracts/lib/BytesUtil.sol @@ -26,7 +26,7 @@ library BytesUtil { bytes b, uint offset ) - public + internal pure returns (bytes32 out) { diff --git a/contracts/lib/MathBytes32.sol b/contracts/lib/MathBytes32.sol index 1964615e..9655d44b 100644 --- a/contracts/lib/MathBytes32.sol +++ b/contracts/lib/MathBytes32.sol @@ -28,7 +28,7 @@ library MathBytes32 { bytes32[] arr, uint len ) - public + internal pure returns (bytes32 res) { diff --git a/contracts/lib/MathUint.sol b/contracts/lib/MathUint.sol index 180da15d..a90fc5c0 100644 --- a/contracts/lib/MathUint.sol +++ b/contracts/lib/MathUint.sol @@ -27,7 +27,7 @@ library MathUint { uint a, uint b ) - public + internal pure returns (uint c) { @@ -39,7 +39,7 @@ library MathUint { uint a, uint b ) - public + internal pure returns (uint) { @@ -51,7 +51,7 @@ library MathUint { uint a, uint b ) - public + internal pure returns (uint c) { @@ -63,7 +63,7 @@ library MathUint { uint a, uint b ) - public + internal pure returns (uint c) { @@ -76,7 +76,7 @@ library MathUint { uint[] arr, uint scale ) - public + internal pure returns (uint) { diff --git a/contracts/lib/MathUint8.sol b/contracts/lib/MathUint8.sol index 4dbe898f..80e58525 100644 --- a/contracts/lib/MathUint8.sol +++ b/contracts/lib/MathUint8.sol @@ -27,7 +27,7 @@ library MathUint8 { uint8[] arr, uint len ) - public + internal pure returns (uint8 res) { diff --git a/contracts/lib/MultihashUtil.sol b/contracts/lib/MultihashUtil.sol index ee49f6bb..7e11297b 100644 --- a/contracts/lib/MultihashUtil.sol +++ b/contracts/lib/MultihashUtil.sol @@ -36,7 +36,7 @@ library MultihashUtil { bytes32 plaintext, bytes multihash ) - public + internal pure { uint8 algorithm = uint8(multihash[0]); diff --git a/contracts/lib/StringUtil.sol b/contracts/lib/StringUtil.sol index e9569851..fb17650b 100644 --- a/contracts/lib/StringUtil.sol +++ b/contracts/lib/StringUtil.sol @@ -23,7 +23,7 @@ pragma experimental "ABIEncoderV2"; /// @author Kongliang Zhong - library StringUtil { function stringToBytes12(string str) - public + internal pure returns (bytes12 result) { @@ -33,7 +33,7 @@ library StringUtil { } function stringToBytes10(string str) - public + internal pure returns (bytes10 result) { @@ -44,7 +44,7 @@ library StringUtil { /// check length >= min && <= max function checkStringLength(string name, uint min, uint max) - public + internal pure returns (bool) { diff --git a/contracts/spec/MiningSpec.sol b/contracts/spec/MiningSpec.sol index 1fa24b2b..ae63f3d5 100644 --- a/contracts/spec/MiningSpec.sol +++ b/contracts/spec/MiningSpec.sol @@ -25,7 +25,7 @@ import "../impl/Data.sol"; /// @author Daniel Wang - . library MiningSpec { function hasMiner(uint16 spec) - public + internal pure returns (bool) { @@ -33,7 +33,7 @@ library MiningSpec { } function hasBroker(uint16 spec) - public + internal pure returns (bool) { @@ -41,7 +41,7 @@ library MiningSpec { } function hasMinerInterceptor(uint16 spec) - public + internal pure returns (bool) { @@ -49,7 +49,7 @@ library MiningSpec { } function hasSignature(uint16 spec) - public + internal pure returns (bool) { diff --git a/contracts/spec/OrderSpec.sol b/contracts/spec/OrderSpec.sol index a798d2f2..cad4cc0a 100644 --- a/contracts/spec/OrderSpec.sol +++ b/contracts/spec/OrderSpec.sol @@ -25,7 +25,7 @@ import "../impl/Data.sol"; /// @author Daniel Wang - . library OrderSpec { function limitByAmountB(uint16 spec) - public + internal pure returns (bool) { @@ -33,7 +33,7 @@ library OrderSpec { } function allOrNone(uint16 spec) - public + internal pure returns (bool) { @@ -41,7 +41,7 @@ library OrderSpec { } function hasDualAuth(uint16 spec) - public + internal pure returns (bool) { @@ -49,7 +49,7 @@ library OrderSpec { } function hasSignature(uint16 spec) - public + internal pure returns (bool) { @@ -57,7 +57,7 @@ library OrderSpec { } function hasBroker(uint16 spec) - public + internal pure returns (bool) { @@ -65,7 +65,7 @@ library OrderSpec { } function hasBrokerInterceptor(uint16 spec) - public + internal pure returns (bool) { @@ -73,7 +73,7 @@ library OrderSpec { } function hasWallet(uint16 spec) - public + internal pure returns (bool) { @@ -81,7 +81,7 @@ library OrderSpec { } function hasValidSince(uint16 spec) - public + internal pure returns (bool) { @@ -89,7 +89,7 @@ library OrderSpec { } function hasValidUntil(uint16 spec) - public + internal pure returns (bool) { @@ -97,7 +97,7 @@ library OrderSpec { } function hasOrderInterceptor(uint16 spec) - public + internal pure returns (bool) { diff --git a/contracts/spec/OrderSpecs.sol b/contracts/spec/OrderSpecs.sol index 1b91b1c7..12593d81 100644 --- a/contracts/spec/OrderSpecs.sol +++ b/contracts/spec/OrderSpecs.sol @@ -33,7 +33,7 @@ library OrderSpecs { uint16[] specs, Data.Inputs inputs ) - public + internal pure returns (Data.Order[] memory orders) { diff --git a/contracts/spec/ParticipationSpec.sol b/contracts/spec/ParticipationSpec.sol index 6e71cb61..fa9f91b2 100644 --- a/contracts/spec/ParticipationSpec.sol +++ b/contracts/spec/ParticipationSpec.sol @@ -26,7 +26,7 @@ import "../impl/Data.sol"; library ParticipationSpec { function orderIndex(uint8 spec) - public + internal pure returns (uint) { @@ -34,7 +34,7 @@ library ParticipationSpec { } function marginSplitAsFee(uint8 spec) - public + internal pure returns (bool) { diff --git a/contracts/spec/RingSpecs.sol b/contracts/spec/RingSpecs.sol index 69a0ab0e..bd279185 100644 --- a/contracts/spec/RingSpecs.sol +++ b/contracts/spec/RingSpecs.sol @@ -33,7 +33,7 @@ library RingSpecs { Data.Order[] orders, Data.Inputs inputs ) - public + internal pure returns (Data.Ring[] memory rings) { diff --git a/globals.d.ts b/globals.d.ts index d543d908..9e1eb9f2 100644 --- a/globals.d.ts +++ b/globals.d.ts @@ -1,5 +1,6 @@ declare module 'bn.js'; declare module 'ethereumjs-abi'; +declare module 'ethereumjs-util'; declare module 'es6-promisify'; // Truffle injects the following into the global scope @@ -11,31 +12,3 @@ declare var beforeEach: any; declare var describe: any; declare var it: any; declare var assert: any; - -declare module 'ethereumjs-util' { - function bufferToHex(value: Buffer): string; - function ecrecover(msgHash: Buffer, v: number, r: Buffer, s: Buffer): Buffer; - function fromRpcSig(sig: string): {v: number, r: Buffer, s: Buffer}; - function hashPersonalMessage(hash: Buffer): Buffer; - function isHexString(value: any): boolean; - function pubToAddress(pubKey: Buffer, sanitize?: boolean): Buffer; - function setLength(a: Buffer, length: number): Buffer; - function setLengthLeft(a: Buffer, length: number): Buffer; - function sha3(a: Buffer|string|number, bits?: number): Buffer; - function toBuffer(value: any): Buffer; - function isValidAddress(address: string): boolean; - - export = { - bufferToHex, - ecrecover, - fromRpcSig, - hashPersonalMessage, - isHexString, - pubToAddress, - setLength, - setLengthLeft, - sha3, - toBuffer, - isValidAddress, - }; -} diff --git a/package.json b/package.json index f0a587ed..efe147a2 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "copyfiles": "^1.2.0", "dirty-chai": "^2.0.1", "ganache-cli": "^6.1.0", + "solc": "^0.4.24", "solium": "^1.1.6", "truffle": "^4.1.11", "tslint": "5.8.0", diff --git a/truffle.js b/truffle.js index 8d58fbc1..792aff22 100644 --- a/truffle.js +++ b/truffle.js @@ -1,45 +1,45 @@ module.exports = { - solc: { - optimizer: { - enabled: true, - runs: 10000 - } + solc: { + optimizer: { + enabled: true, + runs: 10000 + } + }, + networks: { + live: { + host: "localhost", + port: 8546, + network_id: '1', // main-net + gasPrice: 5000000000 }, - networks: { - live: { - host: "localhost", - port: 8546, - network_id: '1', // main-net - gasPrice: 5000000000 - }, - testnet: { - host: "localhost", - port: 8545, - network_id: '2', // main-net - gasPrice: 21000000000 - }, - priv: { - host: "localhost", - port: 8545, - network_id: '50', // main-net - gasPrice: 5000000000, - gas: 4500000 - }, - development: { - host: "localhost", - port: 8545, - network_id: "*", // Match any network id - gasPrice: 21000000000, - gas: 4500000 - }, - docker: { - host: "testrpc", - port: 8545, - network_id: "*", // Match any network id - gasPrice: 21000000000, - gas: 4500000 - } + testnet: { + host: "localhost", + port: 8545, + network_id: '2', // main-net + gasPrice: 21000000000 }, - test_directory: 'transpiled/test', - migrations_directory: 'transpiled/migrations', -}; \ No newline at end of file + priv: { + host: "localhost", + port: 8545, + network_id: '50', // main-net + gasPrice: 5000000000, + gas: 4500000 + }, + development: { + host: "localhost", + port: 8545, + network_id: "*", // Match any network id + gasPrice: 21000000000, + gas: 5500000 + }, + docker: { + host: "testrpc", + port: 8545, + network_id: "*", // Match any network id + gasPrice: 21000000000, + gas: 4500000 + } + }, + test_directory: 'transpiled/test', + migrations_directory: 'transpiled/migrations', +}; From 6960503cd79ffc25321ed6b4a4990fca31284631 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Fri, 8 Jun 2018 10:20:02 +0800 Subject: [PATCH 49/68] fix truffle migrate failure --- contracts/iface/IExchange.sol | 2 +- contracts/impl/Exchange.sol | 120 +++++++++++++++++----------------- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/contracts/iface/IExchange.sol b/contracts/iface/IExchange.sol index 8d5b3b4d..2324a51d 100644 --- a/contracts/iface/IExchange.sol +++ b/contracts/iface/IExchange.sol @@ -99,7 +99,7 @@ contract IExchange { external; /// @dev Submit a order-ring for validation and settlement. - function submitRing( + function submitRings( uint16 miningSpec, uint16[] orderSpecs, uint8[][] ringSpecs, diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index 9d816ce3..271adf8b 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -56,14 +56,14 @@ import "./Data.sol"; /// https://github.com/jonasshen /// https://github.com/Hephyrius contract Exchange is IExchange, NoDefaultFunc { - /* using MathUint for uint; */ - /* using MiningSpec for uint16; */ - /* using OrderSpecs for uint16[]; */ - /* using RingSpecs for uint8[][]; */ - /* using OrderHelper for Data.Order; */ - /* using RingHelper for Data.Ring; */ - /* using InputsHelper for Data.Inputs; */ - /* using MiningHelper for Data.Mining; */ + using MathUint for uint; + using MiningSpec for uint16; + using OrderSpecs for uint16[]; + using RingSpecs for uint8[][]; + using OrderHelper for Data.Order; + using RingHelper for Data.Ring; + using InputsHelper for Data.Inputs; + using MiningHelper for Data.Mining; address public lrcTokenAddress = 0x0; address public tokenRegistryAddress = 0x0; @@ -185,67 +185,67 @@ contract Exchange is IExchange, NoDefaultFunc { ) public { - /* Data.Context memory ctx = Data.Context( */ - /* lrcTokenAddress, */ - /* ITokenRegistry(tokenRegistryAddress), */ - /* ITradeDelegate(delegateAddress), */ - /* IBrokerRegistry(orderBrokerRegistryAddress), */ - /* IBrokerRegistry(minerBrokerRegistryAddress), */ - /* IOrderRegistry(orderRegistryAddress), */ - /* IMinerRegistry(minerRegistryAddress) */ - /* ); */ + Data.Context memory ctx = Data.Context( + lrcTokenAddress, + ITokenRegistry(tokenRegistryAddress), + ITradeDelegate(delegateAddress), + IBrokerRegistry(orderBrokerRegistryAddress), + IBrokerRegistry(minerBrokerRegistryAddress), + IOrderRegistry(orderRegistryAddress), + IMinerRegistry(minerRegistryAddress) + ); - /* Data.Inputs memory inputs = Data.Inputs( */ - /* addressLists, */ - /* uintList, */ - /* bytesList, */ - /* 0, 0, 0 // current indices of addressLists, uintList, and bytesList. */ - /* ); */ + Data.Inputs memory inputs = Data.Inputs( + addressLists, + uintList, + bytesList, + 0, 0, 0 // current indices of addressLists, uintList, and bytesList. + ); - /* Data.Mining memory mining = Data.Mining( */ - /* inputs.nextAddress(), */ - /* (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), */ - /* (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), */ - /* bytes32(0x0), // hash */ - /* address(0x0), // interceptor */ - /* getSpendable( */ - /* ctx.delegate, */ - /* ctx.lrcTokenAddress, */ - /* tx.origin, // TODO(daniel): pay from msg.sender? */ - /* 0x0, // broker */ - /* 0x0 // brokerInterceptor */ - /* ) */ - /* ); */ + Data.Mining memory mining = Data.Mining( + inputs.nextAddress(), + (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), + (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), + bytes32(0x0), // hash + address(0x0), // interceptor + getSpendable( + ctx.delegate, + ctx.lrcTokenAddress, + tx.origin, // TODO(daniel): pay from msg.sender? + 0x0, // broker + 0x0 // brokerInterceptor + ) + ); - /* Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); */ - /* Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); */ + Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); + Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); - /* for (uint i = 0; i < orders.length; i++) { */ - /* orders[i].updateHash(); */ - /* orders[i].updateBrokerAndInterceptor(ctx); */ - /* orders[i].checkBrokerSignature(ctx); */ - /* } */ + for (uint i = 0; i < orders.length; i++) { + orders[i].updateHash(); + orders[i].updateBrokerAndInterceptor(ctx); + orders[i].checkBrokerSignature(ctx); + } - /* for (uint i = 0; i < rings.length; i++) { */ - /* rings[i].updateHash(); */ - /* mining.hash ^= rings[i].hash; */ - /* } */ + for (uint i = 0; i < rings.length; i++) { + rings[i].updateHash(); + mining.hash ^= rings[i].hash; + } - /* mining.updateHash(); */ - /* mining.updateMinerAndInterceptor(ctx); */ - /* mining.checkMinerSignature(ctx); */ + mining.updateHash(); + mining.updateMinerAndInterceptor(ctx); + mining.checkMinerSignature(ctx); - /* for (uint i = 0; i < orders.length; i++) { */ - /* orders[i].checkDualAuthSignature(mining.hash); */ - /* } */ + for (uint i = 0; i < orders.length; i++) { + orders[i].checkDualAuthSignature(mining.hash); + } - /* for (uint i = 0; i < orders.length; i++) { */ - /* orders[i].updateStates(ctx); */ - /* } */ + for (uint i = 0; i < orders.length; i++) { + orders[i].updateStates(ctx); + } - /* for (uint i = 0; i < rings.length; i++){ */ - /* rings[i].calculateFillAmountAndFee(mining); */ - /* } */ + for (uint i = 0; i < rings.length; i++){ + rings[i].calculateFillAmountAndFee(mining); + } } /// @return Amount of ERC20 token that can be spent by this contract. From 32e6806a021621644ea41aa32bc8fdcfdfc4dd67 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Fri, 8 Jun 2018 10:34:27 +0800 Subject: [PATCH 50/68] fix 'stack too deep' error --- contracts/impl/Exchange.sol | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index 271adf8b..2d9af58e 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -220,6 +220,17 @@ contract Exchange is IExchange, NoDefaultFunc { Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); + handleSubmitRings(ctx, mining, orders, rings); + } + + function handleSubmitRings( + Data.Context ctx, + Data.Mining mining, + Data.Order[] orders, + Data.Ring[] rings + ) + private + { for (uint i = 0; i < orders.length; i++) { orders[i].updateHash(); orders[i].updateBrokerAndInterceptor(ctx); From f3126c1ed4d3e240f26fe40e164fadb0e61c09e9 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Fri, 8 Jun 2018 11:03:23 +0800 Subject: [PATCH 51/68] formatting --- contracts/helper/MiningHelper.sol | 12 +++--- contracts/helper/OrderHelper.sol | 36 +++++++++--------- contracts/helper/RingHelper.sol | 12 +++--- contracts/iface/IOrderBook.sol | 4 +- contracts/impl/OrderBook.sol | 2 +- contracts/lib/MultihashUtil.sol | 10 +++-- contracts/lib/TransferableMultsig.sol | 38 ++++++++++--------- migrations/4_deploy_protocol.js | 2 +- package-lock.json | 20 +++++----- package.json | 2 +- ...Impl.ts => testLoopringProtocolImpl.ts.bk} | 0 ...ate.ts => testTokenTransferDelegate.ts.bk} | 0 12 files changed, 75 insertions(+), 63 deletions(-) rename test/{testLoopringProtocolImpl.ts => testLoopringProtocolImpl.ts.bk} (100%) rename test/{testTokenTransferDelegate.ts => testTokenTransferDelegate.ts.bk} (100%) diff --git a/contracts/helper/MiningHelper.sol b/contracts/helper/MiningHelper.sol index 1d34ae51..039e13bb 100644 --- a/contracts/helper/MiningHelper.sol +++ b/contracts/helper/MiningHelper.sol @@ -52,11 +52,13 @@ library MiningHelper { internal pure { - mining.hash = keccak256(abi.encodePacked( - mining.feeRecipient, - mining.miner, - mining.hash - )); + mining.hash = keccak256( + abi.encodePacked( + mining.feeRecipient, + mining.miner, + mining.hash + ) + ); } function checkMinerSignature( Data.Mining mining, diff --git a/contracts/helper/OrderHelper.sol b/contracts/helper/OrderHelper.sol index 7abbc9c2..dadb9df9 100644 --- a/contracts/helper/OrderHelper.sol +++ b/contracts/helper/OrderHelper.sol @@ -34,22 +34,24 @@ library OrderHelper { internal pure { - order.hash = keccak256(abi.encodePacked( - order.owner, - order.tokenS, - order.tokenB, - order.amountS, - order.amountB, - order.lrcFee, - order.dualAuthAddr, - order.broker, - order.orderInterceptor, - order.wallet, - order.validSince, - order.validUntil, - order.limitByAmountB, - order.allOrNone - )); + order.hash = keccak256( + abi.encodePacked( + order.owner, + order.tokenS, + order.tokenB, + order.amountS, + order.amountB, + order.lrcFee, + order.dualAuthAddr, + order.broker, + order.orderInterceptor, + order.wallet, + order.validSince, + order.validUntil, + order.limitByAmountB, + order.allOrNone + ) + ); } function updateBrokerAndInterceptor( @@ -67,7 +69,7 @@ library OrderHelper { order.owner, order.broker ); - require(registered, "broker unregistered"); + require(registered, "broker unregistered"); } } diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol index d36b422c..858eb759 100644 --- a/contracts/helper/RingHelper.sol +++ b/contracts/helper/RingHelper.sol @@ -37,11 +37,13 @@ library RingHelper { { for (uint i = 0; i < ring.size; i++) { Data.Participation memory p = ring.participations[i]; - ring.hash = keccak256(abi.encodePacked( - ring.hash, - p.order.hash, - p.marginSplitAsFee - )); + ring.hash = keccak256( + abi.encodePacked( + ring.hash, + p.order.hash, + p.marginSplitAsFee + ) + ); } } diff --git a/contracts/iface/IOrderBook.sol b/contracts/iface/IOrderBook.sol index 9ac5bab4..5f0f4605 100644 --- a/contracts/iface/IOrderBook.sol +++ b/contracts/iface/IOrderBook.sol @@ -25,6 +25,6 @@ contract IOrderBook { function submitOrder( address owner - ) - external; + ) + external; } diff --git a/contracts/impl/OrderBook.sol b/contracts/impl/OrderBook.sol index 0dfb2f0c..ef4eb1e2 100644 --- a/contracts/impl/OrderBook.sol +++ b/contracts/impl/OrderBook.sol @@ -27,7 +27,7 @@ import "../lib/NoDefaultFunc.sol"; contract OrderBook is IOrderBook, NoDefaultFunc { function submitOrder( - address owner + address owner ) external { diff --git a/contracts/lib/MultihashUtil.sol b/contracts/lib/MultihashUtil.sol index 7e11297b..ba363d31 100644 --- a/contracts/lib/MultihashUtil.sol +++ b/contracts/lib/MultihashUtil.sol @@ -48,10 +48,12 @@ library MultihashUtil { require(size == 65, "bad multihash size"); require( signer == ecrecover( - keccak256(abi.encodePacked( - SIG_PREFIX, - plaintext - )), + keccak256( + abi.encodePacked( + SIG_PREFIX, + plaintext + ) + ), uint8(multihash[2]), BytesUtil.bytesToBytes32(multihash, 3), BytesUtil.bytesToBytes32(multihash, 11) diff --git a/contracts/lib/TransferableMultsig.sol b/contracts/lib/TransferableMultsig.sol index 487687c2..e5800a12 100644 --- a/contracts/lib/TransferableMultsig.sol +++ b/contracts/lib/TransferableMultsig.sol @@ -58,15 +58,17 @@ contract TransferableMultsig is ITransferableMultsig { { // Follows ERC191 signature scheme: // https://github.com/ethereum/EIPs/issues/191 - bytes32 txHash = keccak256(abi.encodePacked( - byte(0x19), - byte(0), - this, - nonce++, - destination, - value, - data - )); + bytes32 txHash = keccak256( + abi.encodePacked( + byte(0x19), + byte(0), + this, + nonce++, + destination, + value, + data + ) + ); verifySignatures( sigV, @@ -92,14 +94,16 @@ contract TransferableMultsig is ITransferableMultsig { { // Follows ERC191 signature scheme: // https://github.com/ethereum/EIPs/issues/191 - bytes32 txHash = keccak256(abi.encodePacked( - byte(0x19), - byte(0), - this, - nonce++, - _threshold, - _owners - )); + bytes32 txHash = keccak256( + abi.encodePacked( + byte(0x19), + byte(0), + this, + nonce++, + _threshold, + _owners + ) + ); verifySignatures( sigV, diff --git a/migrations/4_deploy_protocol.js b/migrations/4_deploy_protocol.js index 29ca17a0..746c65dc 100644 --- a/migrations/4_deploy_protocol.js +++ b/migrations/4_deploy_protocol.js @@ -20,7 +20,7 @@ module.exports = function(deployer, network, accounts) { Exchange, lrcAddr, TokenRegistry.address, - TradeDelegate.address + TradeDelegate.address, ); }); diff --git a/package-lock.json b/package-lock.json index a3edf977..5a0ad98a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12853,9 +12853,9 @@ } }, "solium": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/solium/-/solium-1.1.6.tgz", - "integrity": "sha512-hCZr5cEK2H6LVC1Lr7IGPGJ8Bs4Ktif9cmwnk3BHpoZLIwTtrNE0LUtTRBxkO3/G0GGB4OdxnnJT1pbgsJ/2Uw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/solium/-/solium-1.1.7.tgz", + "integrity": "sha512-yYbalsrzJCU+QJ0HZvxAT4IQIqI1e6KPW2vop0NaHwdijqhQC9fJkVioCrL18NbO2Z8rdcnx8Y0JpvYJWrIjRg==", "dev": true, "requires": { "ajv": "^5.2.2", @@ -12867,7 +12867,7 @@ "sol-digger": "0.0.2", "sol-explore": "1.6.1", "solium-plugin-security": "0.1.1", - "solparse": "2.2.4", + "solparse": "2.2.5", "text-table": "^0.2.0" }, "dependencies": { @@ -12892,9 +12892,9 @@ "dev": true }, "solparse": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.4.tgz", - "integrity": "sha512-Sdyk983juUaOITdTD9U5Yc+MaX8kz4pN3wFyCRILWXW3+Ff96PxY9RLBuZINYbBgCAXN1a+kThJfFMlaXG9R6A==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", + "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", "dev": true, "requires": { "mocha": "^4.0.1", @@ -12915,9 +12915,9 @@ "dev": true }, "cliui": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", - "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", diff --git a/package.json b/package.json index efe147a2..d764f25c 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "dirty-chai": "^2.0.1", "ganache-cli": "^6.1.0", "solc": "^0.4.24", - "solium": "^1.1.6", + "solium": "^1.1.7", "truffle": "^4.1.11", "tslint": "5.8.0", "typescript": "2.7.1", diff --git a/test/testLoopringProtocolImpl.ts b/test/testLoopringProtocolImpl.ts.bk similarity index 100% rename from test/testLoopringProtocolImpl.ts rename to test/testLoopringProtocolImpl.ts.bk diff --git a/test/testTokenTransferDelegate.ts b/test/testTokenTransferDelegate.ts.bk similarity index 100% rename from test/testTokenTransferDelegate.ts rename to test/testTokenTransferDelegate.ts.bk From 2d63f99e6e3216d17839cec347753d7e8e4724c5 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Fri, 8 Jun 2018 17:53:35 +0800 Subject: [PATCH 52/68] fix test --- contracts/impl/TokenRegistry.sol | 5 +++- migrations/config/tokens.js | 8 +++--- test/testTokenRegistry.ts | 48 +++++++++++++------------------- util/artifacts.ts | 10 +++---- 4 files changed, 32 insertions(+), 39 deletions(-) diff --git a/contracts/impl/TokenRegistry.sol b/contracts/impl/TokenRegistry.sol index 378830d9..16f723ee 100644 --- a/contracts/impl/TokenRegistry.sol +++ b/contracts/impl/TokenRegistry.sol @@ -93,6 +93,7 @@ contract TokenRegistry is ITokenRegistry, Claimable, NoDefaultFunc { address addr, string symbol ) + onlyOwner external { require( @@ -116,8 +117,8 @@ contract TokenRegistry is ITokenRegistry, Claimable, NoDefaultFunc { function unregisterToken( address addr ) - external onlyOwner + external { require(addr != 0x0, "bad token address "); @@ -175,4 +176,6 @@ contract TokenRegistry is ITokenRegistry, Claimable, NoDefaultFunc { { return addressToSymbolMap[addr]; } + + } diff --git a/migrations/config/tokens.js b/migrations/config/tokens.js index a31e1372..d8c5b093 100644 --- a/migrations/config/tokens.js +++ b/migrations/config/tokens.js @@ -18,13 +18,13 @@ module.exports = { }, { decimals: 18, - name: "NEO", - symbol: "NEO", + name: "Raiden network", + symbol: "RDN", }, { decimals: 18, - name: "QTUM", - symbol: "QTUM", + name: "gifto", + symbol: "GTO", }, ], diff --git a/test/testTokenRegistry.ts b/test/testTokenRegistry.ts index 4196eb95..a849b1bc 100644 --- a/test/testTokenRegistry.ts +++ b/test/testTokenRegistry.ts @@ -9,46 +9,48 @@ contract("TokenRegistry", (accounts: string[]) => { const owner = accounts[0]; const user = accounts[1]; + const emptyAddr = "0x0000000000000000000000000000000000000000"; let tokenRegistry: any; let testTokenAddr: string; let lrcAddress: string; let eosAddress: string; - let neoAddress: string; - let qtumAddress: string; + let rdnAddress: string; + let gtoAddress: string; before(async () => { tokenRegistry = await TokenRegistry.deployed(); testTokenAddr = "0x8d01f9bcca92e63a1b2752b22d16e1962aa3c920"; + lrcAddress = await tokenRegistry.getAddressBySymbol("LRC"); eosAddress = await tokenRegistry.getAddressBySymbol("EOS"); - neoAddress = await tokenRegistry.getAddressBySymbol("NEO"); - qtumAddress = await tokenRegistry.getAddressBySymbol("QTUM"); + rdnAddress = await tokenRegistry.getAddressBySymbol("RDN"); + gtoAddress = await tokenRegistry.getAddressBySymbol("GTO"); }); describe("owner", () => { it("should be able to register a token", async () => { await tokenRegistry.registerToken(testTokenAddr, "TEST", {from: owner}); - const isRegistered = await tokenRegistry.isTokenRegistered(testTokenAddr); + const isRegistered = await tokenRegistry.areAllTokensRegistered([testTokenAddr]); assert.equal(isRegistered, true, "token should be registered"); }); it("should be able to unregister a token", async () => { - let isRegistered = await tokenRegistry.isTokenRegistered(testTokenAddr); - let isRegisteredBySymbol = await tokenRegistry.isTokenRegisteredBySymbol("TEST"); + let isRegistered = await tokenRegistry.areAllTokensRegistered([testTokenAddr]); + let addressBySymbol = await tokenRegistry.getAddressBySymbol("TEST"); assert.equal(isRegistered, true, "token should be registered on start"); - assert.equal(isRegisteredBySymbol, true, "token should be registered on start"); + assert.equal(addressBySymbol, testTokenAddr, "token should be registered on start"); - await tokenRegistry.unregisterToken(testTokenAddr, "TEST", {from: owner}); - isRegistered = await tokenRegistry.isTokenRegistered(testTokenAddr); - isRegisteredBySymbol = await tokenRegistry.isTokenRegisteredBySymbol("TEST"); + await tokenRegistry.unregisterToken(testTokenAddr, {from: owner}); + isRegistered = await tokenRegistry.areAllTokensRegistered([testTokenAddr]); + addressBySymbol = await tokenRegistry.getAddressBySymbol("TEST"); assert.equal(isRegistered, false, "token should be unregistered"); - assert.equal(isRegisteredBySymbol, false, "token should be unregistered"); + assert.equal(addressBySymbol, emptyAddr, "token should be unregistered"); }); it("should be able to check all tokens registered in array", async () => { - const tokenList = [lrcAddress, neoAddress, eosAddress, qtumAddress]; + const tokenList = [lrcAddress, rdnAddress, eosAddress, gtoAddress]; const allRegistered = await tokenRegistry.areAllTokensRegistered(tokenList); assert.equal(allRegistered, true, "all token registered in migration script."); @@ -57,24 +59,12 @@ contract("TokenRegistry", (accounts: string[]) => { assert.equal(allRegistered2, false, "not all token registered"); }); - it("should be able to getTokens with start index and count", async () => { - const allTokens = await tokenRegistry.getTokens(0, 1000); // token length < 1000. - // console.log("allTokens:", allTokens); - - const size = allTokens.length; - const tokenSlice1 = await tokenRegistry.getTokens(1, 2); // token length < 1000. - const tokenSlice2 = await tokenRegistry.getTokens(2, 2); // token length < 1000. - - assert.deepEqual(tokenSlice1, allTokens.slice(1, 3), "get tokens should return expected tokens"); - assert.deepEqual(tokenSlice2, allTokens.slice(2, 4), "get tokens should return expected tokens"); - }); - }); - describe("any user", () => { - it("should be able to check a token registered or not", async () => { - const isRegistered = await tokenRegistry.isTokenRegistered(testTokenAddr, {from: user}); - assert.equal(isRegistered, isRegistered, "any one should be able to check token registered or not "); + describe("other users", () => { + it("should not be able to register a token", async () => { + // TODO(kongliang) + assert(true); }); }); diff --git a/util/artifacts.ts b/util/artifacts.ts index b7284b93..eee1ba90 100644 --- a/util/artifacts.ts +++ b/util/artifacts.ts @@ -1,13 +1,13 @@ export class Artifacts { public TokenRegistry: any; - public LoopringProtocolImpl: any; - public TokenTransferDelegate: any; + public Exchange: any; + public TradeDelegate: any; public DummyToken: any; constructor(artifacts: any) { - this.TokenRegistry = artifacts.require("TokenRegistryImpl"); - this.LoopringProtocolImpl = artifacts.require("LoopringProtocolImpl"); - this.TokenTransferDelegate = artifacts.require("TokenTransferDelegateImpl"); + this.TokenRegistry = artifacts.require("impl/TokenRegistry"); + this.Exchange = artifacts.require("impl/Exchange"); + this.TradeDelegate = artifacts.require("impl/TradeDelegate"); this.DummyToken = artifacts.require("test/DummyToken"); } } From 53232277c34f28390c76613261a318c7d24033cf Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Fri, 8 Jun 2018 19:06:07 +0800 Subject: [PATCH 53/68] add testExchange.ts --- test/testExchange.ts | 74 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 test/testExchange.ts diff --git a/test/testExchange.ts b/test/testExchange.ts new file mode 100644 index 00000000..7f289e59 --- /dev/null +++ b/test/testExchange.ts @@ -0,0 +1,74 @@ +import { BigNumber } from "bignumber.js"; +import promisify = require("es6-promisify"); +import * as _ from "lodash"; +import { Artifacts } from "../util/artifacts"; +import { RingFactory } from "../util/ring_factory"; +import { OrderParams } from "../util/types"; + +const { + Exchange, + TokenRegistry, + TradeDelegate, + DummyToken, +} = new Artifacts(artifacts); + +contract("Exchange", (accounts: string[]) => { + let exchange: any; + let tokenRegistry: any; + let tradeDelegate: any; + + let currBlockTimeStamp: number; + let walletSplitPercentage: number; + + let ringFactory: RingFactory; + + const getTokenBalanceAsync = async (token: any, addr: string) => { + const tokenBalanceStr = await token.balanceOf(addr); + const balance = new BigNumber(tokenBalanceStr); + return balance; + }; + + const getEthBalanceAsync = async (addr: string) => { + const balanceStr = await promisify(web3.eth.getBalance)(addr); + const balance = new BigNumber(balanceStr); + return balance; + }; + + const assertNumberEqualsWithPrecision = (n1: number, n2: number, precision: number = 8) => { + const numStr1 = (n1 / 1e18).toFixed(precision); + const numStr2 = (n2 / 1e18).toFixed(precision); + + return assert.equal(Number(numStr1), Number(numStr2)); + }; + + const clear = async (tokens: any[], addresses: string[]) => { + for (const token of tokens) { + for (const address of addresses) { + await token.setBalance(address, 0); + } + } + }; + + const approve = async (tokens: any[], addresses: string[], amounts: number[]) => { + for (let i = 0; i < tokens.length; i++) { + await tokens[i].approve(TradeDelegate.address, 0, {from: addresses[i]}); + await tokens[i].approve(TradeDelegate.address, amounts[i], {from: addresses[i]}); + } + }; + + before( async () => { + [exchange, tokenRegistry, tradeDelegate] = await Promise.all([ + Exchange.deployed(), + TokenRegistry.deployed(), + TradeDelegate.deployed(), + ]); + }); + + describe("submitRing", () => { + it("should be able to fill ring with 2 orders", async () => { + assert(true); + }); + + }); + +}); From c4e7f23a47160aa21efc4284671e7c67d208404d Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Thu, 14 Jun 2018 16:17:38 +0800 Subject: [PATCH 54/68] update and delete unused util classes --- contracts/iface/IExchange.sol | 2 +- contracts/impl/Exchange.sol | 2 +- contracts/lib/MemoryUtil.sol | 5 + test/testExchange.ts | 45 ++- util/bignumber_config.ts | 12 - util/bn_util.ts | 48 ---- util/crypto.ts | 46 ---- util/order.ts | 39 ++- util/protocol_simulator.ts | 319 --------------------- util/ring.ts | 18 +- util/ring_factory.ts | 504 ---------------------------------- util/rings_generator.ts | 24 ++ util/types.ts | 39 +-- 13 files changed, 98 insertions(+), 1005 deletions(-) create mode 100644 contracts/lib/MemoryUtil.sol delete mode 100644 util/bignumber_config.ts delete mode 100644 util/bn_util.ts delete mode 100644 util/crypto.ts delete mode 100644 util/protocol_simulator.ts delete mode 100644 util/ring_factory.ts create mode 100644 util/rings_generator.ts diff --git a/contracts/iface/IExchange.sol b/contracts/iface/IExchange.sol index 2324a51d..728410a0 100644 --- a/contracts/iface/IExchange.sol +++ b/contracts/iface/IExchange.sol @@ -103,7 +103,7 @@ contract IExchange { uint16 miningSpec, uint16[] orderSpecs, uint8[][] ringSpecs, - address[] addressLists, + address[] addressList, uint[] uintList, bytes[] bytesList ) diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index 2d9af58e..e07a9d14 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -179,7 +179,7 @@ contract Exchange is IExchange, NoDefaultFunc { uint16 miningSpec, uint16[] orderSpecs, uint8[][] ringSpecs, - address[] addressLists, + address[] addressList, uint[] uintList, bytes[] bytesList ) diff --git a/contracts/lib/MemoryUtil.sol b/contracts/lib/MemoryUtil.sol new file mode 100644 index 00000000..aa993979 --- /dev/null +++ b/contracts/lib/MemoryUtil.sol @@ -0,0 +1,5 @@ +pragma solidity 0.4.24; + +library MemoryUtil { + +} diff --git a/test/testExchange.ts b/test/testExchange.ts index 7f289e59..e05a351d 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -1,9 +1,8 @@ -import { BigNumber } from "bignumber.js"; -import promisify = require("es6-promisify"); import * as _ from "lodash"; import { Artifacts } from "../util/artifacts"; -import { RingFactory } from "../util/ring_factory"; -import { OrderParams } from "../util/types"; +import { Ring } from "../util/ring"; +import { RingsGenerator } from "../util/rings_generator"; +import { RingsSubmitParams } from "../util/types"; const { Exchange, @@ -13,26 +12,13 @@ const { } = new Artifacts(artifacts); contract("Exchange", (accounts: string[]) => { + const miner = accounts[1]; + let exchange: any; let tokenRegistry: any; let tradeDelegate: any; - let currBlockTimeStamp: number; - let walletSplitPercentage: number; - - let ringFactory: RingFactory; - - const getTokenBalanceAsync = async (token: any, addr: string) => { - const tokenBalanceStr = await token.balanceOf(addr); - const balance = new BigNumber(tokenBalanceStr); - return balance; - }; - - const getEthBalanceAsync = async (addr: string) => { - const balanceStr = await promisify(web3.eth.getBalance)(addr); - const balance = new BigNumber(balanceStr); - return balance; - }; + let ringsGenerator: RingsGenerator; const assertNumberEqualsWithPrecision = (n1: number, n2: number, precision: number = 8) => { const numStr1 = (n1 / 1e18).toFixed(precision); @@ -41,14 +27,6 @@ contract("Exchange", (accounts: string[]) => { return assert.equal(Number(numStr1), Number(numStr2)); }; - const clear = async (tokens: any[], addresses: string[]) => { - for (const token of tokens) { - for (const address of addresses) { - await token.setBalance(address, 0); - } - } - }; - const approve = async (tokens: any[], addresses: string[], amounts: number[]) => { for (let i = 0; i < tokens.length; i++) { await tokens[i].approve(TradeDelegate.address, 0, {from: addresses[i]}); @@ -62,10 +40,21 @@ contract("Exchange", (accounts: string[]) => { TokenRegistry.deployed(), TradeDelegate.deployed(), ]); + + ringsGenerator = new RingsGenerator(); }); describe("submitRing", () => { it("should be able to fill ring with 2 orders", async () => { + const rings: Ring[] = ringsGenerator.generateRings(); + const params: RingsSubmitParams = ringsGenerator.toSubmitableParam(rings); + exchange.submitRings(params.miningSpec, + params.orderSpecs, + params.ringSpecs, + params.addressList, + params.uintList, + params.bytesList, + {from: miner}); assert(true); }); diff --git a/util/bignumber_config.ts b/util/bignumber_config.ts deleted file mode 100644 index 294100b0..00000000 --- a/util/bignumber_config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { BigNumber } from "bignumber.js"; - -export const bigNumberConfigs = { - configure() { - // By default BigNumber's `toString` method converts to exponential notation if the value has - // more then 20 digits. We want to avoid this behavior, so we set EXPONENTIAL_AT to a high number - BigNumber.config({ - DECIMAL_PLACES: 18, - EXPONENTIAL_AT: 1000, - }); - }, -}; diff --git a/util/bn_util.ts b/util/bn_util.ts deleted file mode 100644 index 7be926c4..00000000 --- a/util/bn_util.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BigNumber } from "bignumber.js"; -import BN = require("bn.js"); -import { bigNumberConfigs } from "./bignumber_config"; - -bigNumberConfigs.configure(); - -type BNValue = number|string|BigNumber; - -export const BNUtil = { - add(numA: BNValue, numB: BNValue): string { - const a = new BigNumber(numA); - const b = new BigNumber(numB); - const result = a.plus(b); - return result.toString(); - }, - sub(numA: BNValue, numB: BNValue): string { - const a = new BigNumber(numA); - const b = new BigNumber(numB); - const result = a.minus(b); - return result.toString(); - }, - mul(numA: BNValue, numB: BNValue): string { - const a = new BigNumber(numA); - const b = new BigNumber(numB); - const result = a.times(b); - return result.toString(); - }, - div(numA: BNValue, numB: BNValue, decimalPlaces: number = 18): string { - BigNumber.config({ - DECIMAL_PLACES: decimalPlaces, - }); - const a = new BigNumber(numA); - const b = new BigNumber(numB); - const result = a.div(b); - return result.toString(); - }, - cmp(numA: BNValue, numB: BNValue): number { - const a = new BigNumber(numA); - const b = new BigNumber(numB); - return a.comparedTo(b); - }, - toSmallestUnits(num: number, decimals: number = 18) { - const a = new BigNumber(num); - const unit = new BigNumber(10).pow(decimals); - const result = a.times(unit); - return result; - }, -}; diff --git a/util/crypto.ts b/util/crypto.ts deleted file mode 100644 index bf72e2e1..00000000 --- a/util/crypto.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { BigNumber } from "bignumber.js"; -import BN = require("bn.js"); -import ABI = require("ethereumjs-abi"); -import ethUtil = require("ethereumjs-util"); -import * as _ from "lodash"; - -export const crypto = { - /* - * We convert types from JS to Solidity as follows: - * BigNumber -> uint256 - * number -> uint8 - * string -> string - * boolean -> bool - * valid Ethereum address -> address - */ - solSHA3(args: any[]): Buffer { - const argTypes: string[] = []; - _.each(args, (arg, i) => { - const isNumber = _.isFinite(arg); - if (isNumber) { - argTypes.push("uint8"); - } else if ((arg as BigNumber.BigNumber).isBigNumber) { - argTypes.push("uint256"); - args[i] = new BN(arg.toString(10), 10); - } else if (ethUtil.isValidAddress(arg)) { - argTypes.push("address"); - } else if (_.isBuffer(arg)) { - argTypes.push("bytes"); - } else if (_.isString(arg)) { - argTypes.push("string"); - } else if (_.isBoolean(arg)) { - argTypes.push("bool"); - } else { - throw new Error(`Unable to guess arg type: ${arg}`); - } - }); - const hash = ABI.soliditySHA3(argTypes, args); - return hash; - }, - - solSHA3WithType(args: any[], argTypes: string[]): Buffer { - const hash = ABI.soliditySHA3(argTypes, args); - return hash; - }, - -}; diff --git a/util/order.ts b/util/order.ts index 88c9dd13..dd45ffb4 100644 --- a/util/order.ts +++ b/util/order.ts @@ -1,10 +1,11 @@ import { BigNumber } from "bignumber.js"; import xor = require("bitwise-xor"); +import BN = require("bn.js"); import promisify = require("es6-promisify"); +import ABI = require("ethereumjs-abi"); import ethUtil = require("ethereumjs-util"); import * as _ from "lodash"; import Web3 = require("web3"); -import { crypto } from "./crypto"; import { OrderParams } from "./types"; export class Order { @@ -60,22 +61,42 @@ export class Order { } public getOrderHash() { - const orderHash = crypto.solSHA3([ - this.params.loopringProtocol, + const args = [ + this.params.delegateContract, this.owner, this.params.tokenS, this.params.tokenB, this.params.walletAddr, this.params.authAddr, - this.params.amountS, - this.params.amountB, - this.params.validSince, - this.params.validUntil, - this.params.lrcFee, + this.toBN(this.params.amountS), + this.toBN(this.params.amountB), + this.toBN(this.params.validSince), + this.toBN(this.params.validUntil), + this.toBN(this.params.lrcFee), this.params.buyNoMoreThanAmountB, this.params.marginSplitPercentage, - ]); + ]; + const argTypes = [ + "address", + "address", + "address", + "address", + "address", + "address", + "uint256", + "uint256", + "uint256", + "uint256", + "uint256", + "bool", + "uint8", + ]; + const orderHash = ABI.soliditySHA3(argTypes, args); return orderHash; } + + private toBN(bg: BigNumber) { + return new BN(bg.toString(10), 10); + } } diff --git a/util/protocol_simulator.ts b/util/protocol_simulator.ts deleted file mode 100644 index 8b121542..00000000 --- a/util/protocol_simulator.ts +++ /dev/null @@ -1,319 +0,0 @@ -import { BigNumber } from "bignumber.js"; -import { BalanceItem, FeeItem } from "../util/types"; -import { Order } from "./order"; -import { Ring } from "./ring"; - -export class ProtocolSimulator { - public ring: Ring; - public lrcAddress: string; - public feeSelectionList: number[]; - - public availableAmountSList: number[]; - public spendableLrcFeeList: number[]; - public orderCancelled: number[]; - public orderFilled: number[]; - public walletSplitPercentage: number; - - constructor(ring: Ring, - lrcAddress: string, - feeSelectionList: number[], - walletSplitPercentage: number) { - this.ring = ring; - this.lrcAddress = lrcAddress; - this.feeSelectionList = feeSelectionList; - this.walletSplitPercentage = walletSplitPercentage; - } - - public caculateRateAmountS() { - let rate: number = 1; - const result: number[] = []; - const size = this.ring.orders.length; - for (let i = 0; i < size; i++) { - const order = this.ring.orders[i]; - rate = rate * order.params.amountS.toNumber() / order.params.amountB.toNumber(); - } - - rate = Math.pow(rate, -1 / size); - - for (let i = 0; i < size; i ++) { - const order = this.ring.orders[i]; - const rateAmountS = order.params.scaledAmountS * rate; - order.params.rateAmountS = rateAmountS; - order.params.rateAmountB = order.params.scaledAmountB; - result.push(rateAmountS); - } - - return result; - } - - public caculateRingFeesAndBalances() { - this.scaleRing(); - const rateAmountSList = this.caculateRateAmountS(); - const fillAmountSList = this.caculateFillAmountS(rateAmountSList); - - const fees = this.caculateOrderFees(fillAmountSList, rateAmountSList); - const balances = this.caculateTraderTokenBalances(fees, fillAmountSList); - const totalFees = this.sumFees(fees, balances); - - const result: any = {}; - result.fees = fees; - result.balances = balances; - result.totalFees = totalFees; - - return result; - } - - private scaleRing() { - const size = this.ring.orders.length; - - for (let i = 0; i < size; i++) { - const order = this.ring.orders[i]; - const amountS = order.params.amountS.toNumber(); - const amountB = order.params.amountB.toNumber(); - const lrcFee = order.params.lrcFee.toNumber(); - let availableAmountS = amountS; - let availableAmountB = amountB; - - if (order.params.buyNoMoreThanAmountB) { - if (this.orderFilled && this.orderFilled[i]) { - availableAmountB -= this.orderFilled[i]; - } - if (this.orderCancelled && this.orderCancelled[i]) { - availableAmountB -= this.orderCancelled[i]; - } - availableAmountS = availableAmountB * amountS / amountB; - } else { - if (this.orderFilled && this.orderFilled[i]) { - availableAmountS -= this.orderFilled[i]; - } - if (this.orderCancelled && this.orderCancelled[i]) { - availableAmountS -= this.orderCancelled[i]; - } - availableAmountB = availableAmountS * amountB / amountS; - } - - if (this.availableAmountSList && this.availableAmountSList[i] && - this.availableAmountSList[i] < availableAmountS) { - availableAmountS = this.availableAmountSList[i]; - availableAmountB = availableAmountS * amountB / amountS; - } - - if (availableAmountS <= 0 || availableAmountB <= 0) { - throw new Error("order amountS or amountB is zero"); - } - - order.params.scaledAmountS = availableAmountS; - order.params.scaledAmountB = availableAmountB; - order.params.lrcFee = new BigNumber(lrcFee.toPrecision(15)); - } - } - - private caculateFillAmountS(rateAmountSList: number[]) { - const size = this.ring.orders.length; - const fillAmountSList: number[] = rateAmountSList.slice(); - - for (let i = 0; i < size; i++) { - const nextIndex = (i + 1) % size; - const currentOrder = this.ring.orders[i]; - const currentFillAmountS = fillAmountSList[i]; - const currentRateAmountS = rateAmountSList[i]; - const nextOrder = this.ring.orders[nextIndex]; - const nextRateAmountS = rateAmountSList[nextIndex]; - - const nextFillAmountS = this.caculateNextFillAmountS(currentOrder, - currentRateAmountS, - currentFillAmountS, - nextOrder, - nextRateAmountS); - - fillAmountSList[nextIndex] = nextFillAmountS; - } - - // do it again. - for (let i = 0; i < size; i++) { - const nextIndex = (i + 1) % size; - const currentOrder = this.ring.orders[i]; - const currentFillAmountS = fillAmountSList[i]; - const currentRateAmountS = rateAmountSList[i]; - const nextOrder = this.ring.orders[nextIndex]; - const nextRateAmountS = rateAmountSList[nextIndex]; - - const nextFillAmountS = this.caculateNextFillAmountS(currentOrder, - currentRateAmountS, - currentFillAmountS, - nextOrder, - nextRateAmountS); - - fillAmountSList[nextIndex] = nextFillAmountS; - } - return fillAmountSList; - } - - private caculateNextFillAmountS(currentOrder: Order, - currentRateAmountS: number, - currentFillAmountS: number, - nextOrder: Order, - nextRateAmountS: number) { - - const currentFillAmountB = currentFillAmountS * currentOrder.params.scaledAmountB / currentRateAmountS; - - let nextFillAmountS = nextRateAmountS; - if (!nextOrder.params.buyNoMoreThanAmountB) { - nextFillAmountS = nextOrder.params.scaledAmountS; - } - - if (currentFillAmountB <= nextFillAmountS) { - return currentFillAmountB; - } else { - return nextFillAmountS; - } - } - - private sumFees(fees: FeeItem[], balances: BalanceItem[]) { - const size = this.ring.orders.length; - const feeTotals: any = {}; - for (let i = 0; i < size; i++) { - const order = this.ring.orders[i]; - const feeItem = fees[i]; - const balanceItem = balances[i]; - const tokenS = order.params.tokenS; - const tokenB = order.params.tokenB; - const walletAddr = order.params.walletAddr; - - if (walletAddr.length > 0) { - feeItem.feeLrc = feeItem.feeLrc * (100 - this.walletSplitPercentage) / 100; - feeItem.feeS = feeItem.feeS * (100 - this.walletSplitPercentage) / 100; - feeItem.feeB = feeItem.feeB * (100 - this.walletSplitPercentage) / 100; - } - - feeTotals[this.lrcAddress] = this.sumFeeItem(feeTotals, this.lrcAddress, feeItem.feeLrc); - feeTotals[this.lrcAddress] = this.sumFeeItem(feeTotals, - this.lrcAddress, - -feeItem.lrcReward); - - feeTotals[tokenS] = this.sumFeeItem(feeTotals, tokenS, feeItem.feeS); - feeTotals[tokenB] = this.sumFeeItem(feeTotals, tokenB, feeItem.feeB); - } - - feeTotals[this.lrcAddress] = this.sumFeeItem(feeTotals, this.lrcAddress, this.spendableLrcFeeList[size]); - - return feeTotals; - } - - private sumFeeItem(feeTotals: any, tokenAddress: string, itemAmount: number) { - if (feeTotals[tokenAddress]) { - return feeTotals[tokenAddress] + itemAmount; - } else { - return itemAmount; - } - } - - private caculateOrderFees(fillAmountSList: number[], rateAmountSList: number[]) { - const size = this.ring.orders.length; - const fees: FeeItem[] = []; - - let minerSpendableLrc = this.spendableLrcFeeList[size]; - // caculate fees for each order. and assemble result. - for (let i = 0; i < size; i++) { - const nextInd = (i + 1) % size; - const order = this.ring.orders[i]; - - const feeItem: FeeItem = { - feeB: 0, - feeLrc: 0, - feeS: 0, - lrcReward: 0, - fillAmountS: fillAmountSList[i], - }; - - if (order.params.lrcFee.toNumber() === 0) { - this.feeSelectionList[i] = 1; - order.params.marginSplitPercentage = 100; - } - - if (order.params.tokenB === this.lrcAddress) { - this.spendableLrcFeeList[i] += fillAmountSList[nextInd]; - } - - if (this.spendableLrcFeeList[i] === 0) { - this.feeSelectionList[i] = 1; - order.params.marginSplitPercentage = 100; - } - - let feeLrcToPay = 0; - if (order.params.buyNoMoreThanAmountB) { - const fillAmountB = fillAmountSList[i] * order.params.rateAmountB / order.params.rateAmountS; - feeLrcToPay = order.params.lrcFee.toNumber() * fillAmountB / order.params.amountB.toNumber(); - } else { - feeLrcToPay = order.params.lrcFee.toNumber() * fillAmountSList[i] / - order.params.amountS.toNumber(); - } - - if (this.spendableLrcFeeList[i] < feeLrcToPay) { - feeLrcToPay = this.spendableLrcFeeList[i]; - order.params.marginSplitPercentage = 100; - } - - if (0 === this.feeSelectionList[i]) { - feeItem.feeLrc = feeLrcToPay; - } else if (1 === this.feeSelectionList[i]) { - if (minerSpendableLrc >= feeLrcToPay) { - if (order.params.buyNoMoreThanAmountB) { - feeItem.feeS = fillAmountSList[i] * order.params.scaledAmountS / rateAmountSList[i] - - fillAmountSList[i]; - feeItem.feeS = feeItem.feeS * order.params.marginSplitPercentage / 100; - } else { - feeItem.feeB = fillAmountSList[nextInd] - - fillAmountSList[i] * order.params.amountB.toNumber() / order.params.amountS.toNumber(); - feeItem.feeB = feeItem.feeB * order.params.marginSplitPercentage / 100; - } - - if (feeItem.feeS > 0 || feeItem.feeB > 0) { - minerSpendableLrc -= feeLrcToPay; - feeItem.lrcReward = feeLrcToPay; - } - - feeItem.feeLrc = 0; - } - } else { - throw new Error("invalid fee selection value."); - } - - fees.push(feeItem); - } - - return fees; - } - - // The balance of tokenS of this.ring.orders[i].owner is this.availableAmountSList[i]. - private caculateTraderTokenBalances(fees: FeeItem[], fillAmountSList: number[]) { - const size = this.ring.orders.length; - const balances: BalanceItem[] = []; - for (let i = 0; i < size; i++) { - const order = this.ring.orders[i]; - const nextInd = (i + 1) % size; - - let balanceSBefore = order.params.amountS.toNumber(); - if (this.availableAmountSList) { - balanceSBefore = this.availableAmountSList[i]; - } - - const balanceItem: BalanceItem = { - balanceB: fillAmountSList[nextInd] - fees[i].feeB, - balanceS: balanceSBefore - fillAmountSList[i] - fees[i].feeS, - }; - - if (order.params.tokenS === this.lrcAddress && 0 === this.feeSelectionList[i]) { - balanceItem.balanceS -= fees[i].feeLrc; - } - - if (order.params.tokenB === this.lrcAddress && 0 === this.feeSelectionList[i]) { - balanceItem.balanceB -= fees[i].feeLrc; - } - - balances.push(balanceItem); - } - return balances; - } - -} diff --git a/util/ring.ts b/util/ring.ts index d88e253f..f4ebd173 100644 --- a/util/ring.ts +++ b/util/ring.ts @@ -1,9 +1,9 @@ import { BigNumber } from "bignumber.js"; import promisify = require("es6-promisify"); +import ABI = require("ethereumjs-abi"); import ethUtil = require("ethereumjs-util"); import * as _ from "lodash"; import Web3 = require("web3"); -import { crypto } from "./crypto"; import { Order } from "./order"; export class Ring { @@ -84,11 +84,17 @@ export class Ring { orderHashList.push(ethUtil.bufferToHex(orderHash)); } - const ringHash = crypto.solSHA3WithType([ - this.xorReduceStr(orderHashList), - this.owner, - this.feeSelectionListToNumber(this.feeSelections), - ], ["string", "address", "uint16"]); + const ringHash = ABI.soliditySHA3( + [ + "string", + "address", + "uint16", + ], + [ + this.xorReduceStr(orderHashList), + this.owner, + this.feeSelectionListToNumber(this.feeSelections), + ]); return ringHash; } diff --git a/util/ring_factory.ts b/util/ring_factory.ts deleted file mode 100644 index 425d4877..00000000 --- a/util/ring_factory.ts +++ /dev/null @@ -1,504 +0,0 @@ -import { BigNumber } from "bignumber.js"; -import { LoopringSubmitParams, OrderParams } from "../util/types"; -import { Order } from "./order"; -import { Ring } from "./ring"; - -export class RingFactory { - public loopringProtocolAddr: string; - public eosAddress: string; - public neoAddress: string; - public lrcAddress: string; - public qtumAddress: string; - public currBlockTimeStamp: number; - public authAddress: string; - public walletAddr: string; - - constructor(loopringProtocolAddr: string, - eosAddress: string, - neoAddress: string, - lrcAddress: string, - qtumAddress: string, - authAddress: string, - currBlockTimeStamp: number) { - this.loopringProtocolAddr = loopringProtocolAddr; - this.eosAddress = eosAddress; - this.neoAddress = neoAddress; - this.lrcAddress = lrcAddress; - this.qtumAddress = qtumAddress; - this.authAddress = authAddress; - this.currBlockTimeStamp = currBlockTimeStamp; - } - - public async generateRingForCancel(order1Owner: string, - order2Owner: string, - ringOwner: string, - feeSelections: number[]) { - const orderPrams1 = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.eosAddress, - tokenB: this.neoAddress, - amountS: new BigNumber(1000e18), - amountB: new BigNumber(100e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 110), - lrcFee: new BigNumber(1e18), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 0, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams2 = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.neoAddress, - tokenB: this.eosAddress, - amountS: new BigNumber(100e18), - amountB: new BigNumber(1000e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 120), - lrcFee: new BigNumber(1e18), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 0, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const order1 = new Order(order1Owner, orderPrams1); - const order2 = new Order(order2Owner, orderPrams2); - await order1.signAsync(); - await order2.signAsync(); - - const ring = new Ring(ringOwner, [order1, order2], feeSelections); - await ring.signAsync(); - - return ring; - } - - public async generateSize2Ring01(order1Owner: string, - order2Owner: string, - ringOwner: string, - feeSelections: number[]) { - const orderPrams1 = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.eosAddress, - tokenB: this.neoAddress, - amountS: new BigNumber(1000e18), - amountB: new BigNumber(100e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 130), - lrcFee: new BigNumber(10e18), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 0, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams2 = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.neoAddress, - tokenB: this.eosAddress, - amountS: new BigNumber(100e18), - amountB: new BigNumber(1000e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 140), - lrcFee: new BigNumber(5e18), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 0, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const order1 = new Order(order1Owner, orderPrams1); - const order2 = new Order(order2Owner, orderPrams2); - await order1.signAsync(); - await order2.signAsync(); - - const ring = new Ring(ringOwner, [order1, order2], feeSelections); - await ring.signAsync(); - - return ring; - } - - public async generateSize2Ring02(order1Owner: string, - order2Owner: string, - ringOwner: string, - feeSelections: number[]) { - - const orderPrams1 = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.eosAddress, - tokenB: this.neoAddress, - amountS: new BigNumber(1000e18), - amountB: new BigNumber(100e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 150), - lrcFee: new BigNumber(0), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 100, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams2 = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.neoAddress, - tokenB: this.eosAddress, - amountS: new BigNumber(50e18), - amountB: new BigNumber(450e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 160), - lrcFee: new BigNumber(0), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 45, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const order1 = new Order(order1Owner, orderPrams1); - const order2 = new Order(order2Owner, orderPrams2); - await order1.signAsync(); - await order2.signAsync(); - - const ring = new Ring(ringOwner, [order1, order2], feeSelections); - await ring.signAsync(); - - return ring; - } - - public async generateSize2Ring03(order1Owner: string, - order2Owner: string, - ringOwner: string, - feeSelections: number[]) { - const orderPrams1: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.eosAddress, - tokenB: this.neoAddress, - amountS: new BigNumber(1000e18), - amountB: new BigNumber(100e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 210), - lrcFee: new BigNumber(0), - buyNoMoreThanAmountB: true, - marginSplitPercentage: 65, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams2: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.neoAddress, - tokenB: this.eosAddress, - amountS: new BigNumber(50e18), - amountB: new BigNumber(450e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 211), - lrcFee: new BigNumber(5e17), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 45, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const order1 = new Order(order1Owner, orderPrams1); - const order2 = new Order(order2Owner, orderPrams2); - await order1.signAsync(); - await order2.signAsync(); - - const ring = new Ring(ringOwner, [order1, order2], feeSelections); - await ring.signAsync(); - - return ring; - } - - public async generateSize3Ring01(order1Owner: string, - order2Owner: string, - order3Owner: string, - ringOwner: string, - feeSelections: number[]) { - const orderPrams1: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.eosAddress, - tokenB: this.neoAddress, - amountS: new BigNumber(80000e18), - amountB: new BigNumber(12345e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 310), - lrcFee: new BigNumber(0), - buyNoMoreThanAmountB: true, - marginSplitPercentage: 55, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams2: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.neoAddress, - tokenB: this.qtumAddress, - amountS: new BigNumber(234e18), - amountB: new BigNumber(543e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 311), - lrcFee: new BigNumber(6e18), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 0, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams3: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.qtumAddress, - tokenB: this.eosAddress, - amountS: new BigNumber(6780e18), - amountB: new BigNumber(18100e18), - validSince: new BigNumber(this.currBlockTimeStamp), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 312), - lrcFee: new BigNumber(0), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 60, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const order1 = new Order(order1Owner, orderPrams1); - const order2 = new Order(order2Owner, orderPrams2); - const order3 = new Order(order3Owner, orderPrams3); - await order1.signAsync(); - await order2.signAsync(); - await order3.signAsync(); - - const ring = new Ring(ringOwner, [order1, order2, order3], feeSelections); - await ring.signAsync(); - - return ring; - } - - public async generateSize3Ring02(order1Owner: string, - order2Owner: string, - order3Owner: string, - ringOwner: string, - salt: number, - feeSelections: number[]) { - const orderPrams1: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.eosAddress, - tokenB: this.neoAddress, - amountS: new BigNumber(80000e18), - amountB: new BigNumber(12345e18), - validSince: new BigNumber(this.currBlockTimeStamp - salt), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 320), - lrcFee: new BigNumber(0), - buyNoMoreThanAmountB: true, - marginSplitPercentage: 55, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams2: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.neoAddress, - tokenB: this.qtumAddress, - amountS: new BigNumber(234e18), - amountB: new BigNumber(543e18), - validSince: new BigNumber(this.currBlockTimeStamp - salt), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 321), - lrcFee: new BigNumber(6e18), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 0, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams3: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.qtumAddress, - tokenB: this.eosAddress, - amountS: new BigNumber(6780e18), - amountB: new BigNumber(18100e18), - validSince: new BigNumber(this.currBlockTimeStamp - salt), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 322), - lrcFee: new BigNumber(0), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 60, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const order1 = new Order(order1Owner, orderPrams1); - const order2 = new Order(order2Owner, orderPrams2); - const order3 = new Order(order3Owner, orderPrams3); - await order1.signAsync(); - await order2.signAsync(); - await order3.signAsync(); - - const ring = new Ring(ringOwner, [order1, order2, order3], feeSelections); - await ring.signAsync(); - - return ring; - } - - public async generateSize3Ring03(order1Owner: string, - order2Owner: string, - order3Owner: string, - ringOwner: string, - salt: number, - feeSelections: number[]) { - const orderPrams1: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.eosAddress, - tokenB: this.lrcAddress, - amountS: new BigNumber(1000e18), - amountB: new BigNumber(8000e18), - validSince: new BigNumber(this.currBlockTimeStamp - salt), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 330), - lrcFee: new BigNumber(10e18), - buyNoMoreThanAmountB: true, - marginSplitPercentage: 55, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams2: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.lrcAddress, - tokenB: this.neoAddress, - amountS: new BigNumber(2000e18), - amountB: new BigNumber(10e18), - validSince: new BigNumber(this.currBlockTimeStamp - salt), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 331), - lrcFee: new BigNumber(6e18), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 0, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const orderPrams3: OrderParams = { - loopringProtocol: this.loopringProtocolAddr, - tokenS: this.neoAddress, - tokenB: this.eosAddress, - amountS: new BigNumber(20e18), - amountB: new BigNumber(450e18), - validSince: new BigNumber(this.currBlockTimeStamp - salt), - validUntil: new BigNumber((this.currBlockTimeStamp + 360000) + 332), - lrcFee: new BigNumber(1e18), - buyNoMoreThanAmountB: false, - marginSplitPercentage: 60, - authAddr: this.authAddress, - walletAddr: this.walletAddr, - }; - - const order1 = new Order(order1Owner, orderPrams1); - const order2 = new Order(order2Owner, orderPrams2); - const order3 = new Order(order3Owner, orderPrams3); - await order1.signAsync(); - await order2.signAsync(); - await order3.signAsync(); - - const ring = new Ring(ringOwner, [order1, order2, order3], feeSelections); - await ring.signAsync(); - - return ring; - } - - public caculateRateAmountS(ring: Ring) { - let rate: number = 1; - const result: BigNumber[] = []; - const size = ring.orders.length; - for (let i = 0; i < size; i++) { - const order = ring.orders[i]; - rate = rate * order.params.amountS.toNumber() / order.params.amountB.toNumber(); - } - - rate = Math.pow(rate, -1 / size); - - for (let i = 0; i < size; i ++) { - const order = ring.orders[i]; - const rateAmountS = order.params.amountS.toNumber() * rate; - const rateSBigNumber = new BigNumber(rateAmountS.toPrecision(15)); - result.push(rateSBigNumber); - } - - return result; - } - - public ringToSubmitableParams(ring: Ring, - feeSelectionList: number[], - feeRecepient: string) { - const ringSize = ring.orders.length; - const addressList: string[][] = []; - const uintArgsList: BigNumber[][] = []; - const uint8ArgsList: number[][] = []; - const buyNoMoreThanAmountBList: boolean[] = []; - const vList: number[] = []; - const rList: string[] = []; - const sList: string[] = []; - - const rateAmountSList = this.caculateRateAmountS(ring); - // console.log("rateAmountSList", rateAmountSList); - - for (let i = 0; i < ringSize; i++) { - const order = ring.orders[i]; - const addressListItem = [order.owner, - order.params.tokenS, - order.params.walletAddr, - order.params.authAddr]; - - addressList.push(addressListItem); - - const uintArgsListItem = [ - order.params.amountS, - order.params.amountB, - order.params.validSince, - order.params.validUntil, - order.params.lrcFee, - rateAmountSList[i], - ]; - uintArgsList.push(uintArgsListItem); - - const uint8ArgsListItem = [order.params.marginSplitPercentage]; - // console.log("uint8ArgsListItem", uint8ArgsListItem); - - uint8ArgsList.push(uint8ArgsListItem); - - buyNoMoreThanAmountBList.push(order.params.buyNoMoreThanAmountB); - - vList.push(order.params.v); - rList.push(order.params.r); - sList.push(order.params.s); - } - - vList.push(...ring.authV); - rList.push(...ring.authR); - sList.push(...ring.authS); - - // vList.push(ring.v); - // rList.push(ring.r); - // sList.push(ring.s); - - const submitParams = { - addressList, - uintArgsList, - uint8ArgsList, - buyNoMoreThanAmountBList, - vList, - rList, - sList, - ringOwner: ring.owner, - feeRecepient, - feeSelections: this.feeSelectionListToNumber(feeSelectionList), - }; - - return submitParams; - } - - public feeSelectionListToNumber(feeSelections: number[]) { - let res = 0; - for (let i = 0; i < feeSelections.length; i ++) { - res += feeSelections[i] << i; - } - - return res; - } - -} diff --git a/util/rings_generator.ts b/util/rings_generator.ts new file mode 100644 index 00000000..a1ad1827 --- /dev/null +++ b/util/rings_generator.ts @@ -0,0 +1,24 @@ +import { BigNumber } from "bignumber.js"; +import { RingsSubmitParams } from "../util/types"; +import { Ring } from "./ring"; + +export class RingsGenerator { + + public generateRings() { + const rings: Ring[] = []; + + return rings; + } + + public toSubmitableParam(rings: Ring[]) { + const params: RingsSubmitParams = { + miningSpec: 0, + orderSpecs: [0], + ringSpecs: [[0]], + addressList: [""], + uintList: [new BigNumber(0)], + bytesList: [""], + }; + return params; + } +} diff --git a/util/types.ts b/util/types.ts index 8dc5d594..d261d573 100644 --- a/util/types.ts +++ b/util/types.ts @@ -1,7 +1,7 @@ import { BigNumber } from "bignumber.js"; export interface OrderParams { - loopringProtocol: string; + delegateContract: string; tokenS: string; tokenB: string; amountS: BigNumber; @@ -24,34 +24,11 @@ export interface OrderParams { s?: string; } -export interface LoopringSubmitParams { - addressList: string[][]; - uintArgsList: BigNumber[][]; - uint8ArgsList: number[][]; - buyNoMoreThanAmountBList: boolean[]; - vList: number[]; - rList: string[]; - sList: string[]; - ringOwner: string; - feeRecepient: string; - feeSelections: number; -} - -export interface FeeItem { - fillAmountS: number; - feeLrc: number; - feeS: number; - feeB: number; - lrcReward: number; -} - -export interface BalanceItem { - balanceS: number; - balanceB: number; -} - -export interface SignResult { - v: number; - r: string; - s: string; +export interface RingsSubmitParams { + miningSpec: number; + orderSpecs: number[]; + ringSpecs: number[][]; + addressList: string[]; + uintList: BigNumber[]; + bytesList: string[]; } From 8d1da0542ec6b91493776e38c0a9eea70711b7da Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Fri, 15 Jun 2018 14:03:34 +0800 Subject: [PATCH 55/68] test --- contracts/impl/Exchange.sol | 53 +- package-lock.json | 2603 ++++------------------------------- package.json | 5 +- test/testExchange.ts | 39 +- util/bitstream.ts | 48 + 5 files changed, 419 insertions(+), 2329 deletions(-) create mode 100644 util/bitstream.ts diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index e07a9d14..98632f79 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -175,6 +175,57 @@ contract Exchange is IExchange, NoDefaultFunc { ); } + event LogData(address a, uint i, bytes bs); + + struct Test { + address a; + uint b; + uint8 c; + bytes32 d; // 32 * 4 = 128 + bytes h; // 42 + } + + function structCopyTest(bytes data) public { + Test memory t; + uint ptr; + assembly { + ptr := t + } + + copyStruct(0, ptr, 0, 170); + emit LogData(t.a, t.b, t.h); + } + + function copyStruct( + uint parameterIndex, + uint dst, + uint offsetInBytes, + uint numBytes + ) + internal + pure + { + assembly { + let structOffset := add(4, mul(parameterIndex, 32)) + calldatacopy(dst, add(structOffset, offsetInBytes), numBytes) + } + } + + function copyCallDataBytesInArray( + uint parameterIndex, + uint dst, + uint offsetInBytes, + uint numBytes + ) + internal + pure + { + assembly { + let parameterOffset := add(calldataload(add(4, mul(parameterIndex, 32))), 4) + calldatacopy(dst, add(add(parameterOffset, 32), offsetInBytes), numBytes) + } + } + function submitRings( uint16 miningSpec, uint16[] orderSpecs, @@ -196,7 +247,7 @@ contract Exchange is IExchange, NoDefaultFunc { ); Data.Inputs memory inputs = Data.Inputs( - addressLists, + addressList, uintList, bytesList, 0, 0, 0 // current indices of addressLists, uintList, and bytesList. diff --git a/package-lock.json b/package-lock.json index 5a0ad98a..468bece3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,260 +116,6 @@ "integrity": "sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA==", "dev": true }, - "@webassemblyjs/ast": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.10.tgz", - "integrity": "sha512-4BObuKRfeAnKdz5PfTp6MqSoCdj0z9EXu00PsQLzqcC55Htw5r9OXebS+sPF8T5tRTRI5/2w0CR52s/4vJ2fkw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.5.10", - "@webassemblyjs/helper-wasm-bytecode": "1.5.10", - "@webassemblyjs/wast-parser": "1.5.10", - "debug": "^3.1.0", - "mamacro": "^0.0.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.10.tgz", - "integrity": "sha512-ns6H/06BTnk7thnN8O6MK9xMqodgaVKkjBaC8nXGLeAtX2ONHxQL2NnY4XgUzyo7yRwGVAPBxdl7yxzc0iy9Eg==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.10.tgz", - "integrity": "sha512-OeWjB1Ie44sg5Nr8GVot5l+uclK4fWEQGH1b+HQ7x9GN9UxcJUIG3+u5dj2MTkthneQT1hUo09Wtpb/bY7zfXA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.10.tgz", - "integrity": "sha512-soggPYDku3gDl+zV1TVle3zLWgiU1Kli4QJdWCoeyX95RhGtF2A5tP7U3ypLlBb74SdoYYFVn3Fm7HXIWj1wzA==", - "dev": true, - "requires": { - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.10.tgz", - "integrity": "sha512-1mNetGdoMMSW+spR7eC5kJZCA8g9aK7G0t2Mc5Q0p9Kw8p+gFgf9dO7fbThHP/+tNLHM6+SwUQ+S8s4BLhBtZQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.5.10" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.10.tgz", - "integrity": "sha512-ekKmiumHOJrlzZhrigZ19COsCbqNeHtnRN2wktMIaCHGobW/FW+d4Qv1svc0BetjoXo/DhSgVvhHoxaKSO3yPw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.10.tgz", - "integrity": "sha512-ce2KTWDlSCHhJZMOX+bgHGIKwYsx27MWySqffl8pqu9K+M1G4TlZCfRlN1dV85rAhn5OknOAHRBmRtceklY2/g==", - "dev": true, - "requires": { - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.10.tgz", - "integrity": "sha512-0noYMZDkkUZvHNpcOp9+ElMTwPxIyEWVc1bdjJ38qZTIX9ytCgRifs2DrF/1FfUxzI3d3xXFqrqCFfp+amAOaA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.10.tgz", - "integrity": "sha512-rXH6br9w+CYY/tN+N7MFmnUD5J/D4sBsl1K8liqKGpAXlsGp9SmEeqXy8yBWJ1wH3J3rNGaxQNbk9VR3qZgn0w==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.10", - "@webassemblyjs/helper-buffer": "1.5.10", - "@webassemblyjs/helper-wasm-bytecode": "1.5.10", - "@webassemblyjs/wasm-gen": "1.5.10", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/ieee754": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.10.tgz", - "integrity": "sha512-WWlO5quQd3qOUT4wJiuodh5E1A8BfXYkOueuZZjEPL3budH5snqdWsPDieTqkBJnfCZGwRkRSn14OH4OPY1hsw==", - "dev": true, - "requires": { - "ieee754": "^1.1.11" - } - }, - "@webassemblyjs/leb128": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.10.tgz", - "integrity": "sha512-b+DWTy6RsRznpCKvsP3V5yNkk6YWs+7kLOJ3GU1ITyz846VIzVJda+K0mr31fgXzob/QWToWEx8ajk+PrOegkQ==", - "dev": true, - "requires": { - "leb": "^0.3.0" - } - }, - "@webassemblyjs/utf8": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.10.tgz", - "integrity": "sha512-MQM04pZd0DoxukOPBJD4uaeVQ4iaWzRqsq7iDvJQBqcxIIEwi2iAPv+xjL2PbVwosCvwkh7FzKK3FHVQUjTlTQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.10.tgz", - "integrity": "sha512-mrMZw5A0+p6A58iquzq/d0SJej481H4pNwPO65rEjzDsHs+yykT6de26VQD2GtaCTThfSNcw3JJXWJ1biqO/+g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.10", - "@webassemblyjs/helper-buffer": "1.5.10", - "@webassemblyjs/helper-wasm-bytecode": "1.5.10", - "@webassemblyjs/helper-wasm-section": "1.5.10", - "@webassemblyjs/wasm-gen": "1.5.10", - "@webassemblyjs/wasm-opt": "1.5.10", - "@webassemblyjs/wasm-parser": "1.5.10", - "@webassemblyjs/wast-printer": "1.5.10", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.10.tgz", - "integrity": "sha512-MXYoZg7zaRGmU2h2FBa6Oo+y0etuDZycx0h7nrBD4LzVqhufenoWY4Be6K4IMU0L/fRb/GMp17Vfqg4m/J8EuQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.10", - "@webassemblyjs/helper-wasm-bytecode": "1.5.10", - "@webassemblyjs/ieee754": "1.5.10", - "@webassemblyjs/leb128": "1.5.10", - "@webassemblyjs/utf8": "1.5.10" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.10.tgz", - "integrity": "sha512-1A1rVPa1URgjCmEVZupRgrrbqwfCh6hJVkogK22JNygS+wn1gg1jgjN82Zd3NDhm738TwY61936n3y25GC+mfQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.10", - "@webassemblyjs/helper-buffer": "1.5.10", - "@webassemblyjs/wasm-gen": "1.5.10", - "@webassemblyjs/wasm-parser": "1.5.10", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.10.tgz", - "integrity": "sha512-VWSi7NWmfEuMpZ0+CTnBzz8qhxw7R17CwmbcJ+QJ0wfqReWEgP/J5yI4mN/C/lEoYuroFUF+sTWoDQqzH4FNdQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.10", - "@webassemblyjs/helper-api-error": "1.5.10", - "@webassemblyjs/helper-wasm-bytecode": "1.5.10", - "@webassemblyjs/ieee754": "1.5.10", - "@webassemblyjs/leb128": "1.5.10", - "@webassemblyjs/wasm-parser": "1.5.10" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.10.tgz", - "integrity": "sha512-RORXT40qjkFgowmFzqGFGBW3fuNd7UKJwyuYXeXLzqQOoPBySE1lsSrku0aQIcVl086dy297A+De5vPCfF/Rfg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.10", - "@webassemblyjs/floating-point-hex-parser": "1.5.10", - "@webassemblyjs/helper-api-error": "1.5.10", - "@webassemblyjs/helper-code-frame": "1.5.10", - "@webassemblyjs/helper-fsm": "1.5.10", - "long": "^3.2.0", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.10.tgz", - "integrity": "sha512-n4zZJmnETVc4RRs9wAZQr3dXUwC+Yyx+xwkaWdTk36NqgM89CPVLBpw8htKyKG+BX/tgk+VOXRwO+1x5Cf3J8Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.10", - "@webassemblyjs/wast-parser": "1.5.10", - "long": "^3.2.0" - } - }, - "acorn": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", - "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } - }, "ajv": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", @@ -382,12 +128,6 @@ "uri-js": "^3.0.2" } }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -512,43 +252,6 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -1498,12 +1201,6 @@ } } }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -1636,38 +1333,6 @@ "inherits": "^2.0.1" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, "browserify-sha3": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", @@ -1683,55 +1348,6 @@ } } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1743,41 +1359,6 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - }, - "dependencies": { - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - } - } - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1899,12 +1480,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, - "chrome-trace-event": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz", - "integrity": "sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==", - "dev": true - }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -2144,106 +1719,27 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copyfiles": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-1.2.0.tgz", - "integrity": "sha1-qNo6xBqiIgrim9PFi2mEKU8sWTw=", + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copyfiles": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-1.2.0.tgz", + "integrity": "sha1-qNo6xBqiIgrim9PFi2mEKU8sWTw=", "dev": true, "requires": { "glob": "^7.0.5", @@ -2265,16 +1761,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, "create-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", @@ -2310,36 +1796,11 @@ "which": "^1.2.9" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "crypto-js": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -2360,12 +1821,6 @@ "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", "dev": true }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -2469,16 +1924,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "detect-conflict": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", @@ -2500,17 +1945,6 @@ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", @@ -2544,12 +1978,6 @@ "integrity": "sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w==", "dev": true }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", @@ -2566,56 +1994,6 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "editions": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", @@ -2772,31 +2150,12 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", @@ -3363,17 +2722,6 @@ } } }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -3437,54 +2785,6 @@ "integrity": "sha1-N4tRKNbQtVSosvFqTKPhq5ZJ8A4=", "dev": true }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -3570,18 +2870,6 @@ "rimraf": "^2.2.8" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4896,30 +4184,12 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, - "ieee754": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { "version": "3.3.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", @@ -4951,12 +4221,6 @@ "repeating": "^2.0.0" } }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5545,12 +4809,6 @@ "invert-kv": "^1.0.0" } }, - "leb": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", - "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=", - "dev": true - }, "listr-silent-renderer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", @@ -5662,12 +4920,6 @@ "strip-bom": "^2.0.0" } }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", @@ -5797,12 +5049,6 @@ } } }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "dev": true - }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", @@ -5851,12 +5097,6 @@ } } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -5999,16 +5239,6 @@ "regex-cache": "^0.4.2" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, "mimic-fn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", @@ -6045,36 +5275,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", @@ -6142,20 +5342,6 @@ } } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6181,9 +5367,8 @@ "dev": true }, "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" + "version": "2.10.0", + "resolved": "git+https://github.com/nodejs/nan.git#77d0fcaba3305d05176a9ad95d8e5101e8f2a283" }, "nanomatch": { "version": "1.2.9", @@ -6248,95 +5433,20 @@ "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", "dev": true }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" }, "dependencies": { - "isarray": { + "ansi-styles": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "dev": true, - "requires": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", "dev": true }, "chalk": { @@ -11687,12 +10797,6 @@ "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", "dev": true }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -11782,74 +10886,6 @@ "p-finally": "^1.0.0" } }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -11883,12 +10919,6 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -11939,19 +10969,6 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, - "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "pegjs": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", @@ -12057,23 +11074,11 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -12086,19 +11091,6 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" - } - }, "pump": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", @@ -12108,29 +11100,6 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", @@ -12148,37 +11117,6 @@ "strict-uri-encode": "^1.0.0" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -12522,15 +11460,6 @@ "is-promise": "^2.1.0" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, "rxjs": { "version": "5.5.8", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz", @@ -12554,16 +11483,6 @@ "ret": "~0.1.10" } }, - "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, "scoped-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", @@ -12592,12 +11511,6 @@ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", "dev": true }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -12632,12 +11545,6 @@ } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "sha.js": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", @@ -13016,12 +11923,6 @@ "is-plain-obj": "^1.0.0" } }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13086,15 +11987,6 @@ "extend-shallow": "^3.0.0" } }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -13116,170 +12008,55 @@ } } }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "is-utf8": "^0.2.0" } }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", - "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", "dev": true, "requires": { "first-chunk-stream": "^2.0.0", @@ -13458,15 +12235,6 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13476,12 +12244,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -13612,1017 +12374,249 @@ "tslib": "^1.7.1" } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", - "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz", - "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - } - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "untildify": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", - "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", - "dev": true - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true - }, - "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", - "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.3.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^2.0.0", - "vinyl": "^1.1.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.1.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "web3": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.2.tgz", - "integrity": "sha1-xU2sX8DjdzmcBMGm7LsS5FEyeNY=", - "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "crypto-js": "^3.1.4", - "utf8": "^2.1.1", - "xhr2": "*", - "xmlhttprequest": "*" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "from": "bignumber.js@git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" - } - } - }, - "web3-typescript-typings": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/web3-typescript-typings/-/web3-typescript-typings-0.0.3.tgz", - "integrity": "sha1-ZCcmInEpRVpqBCMzNAnPXyvoJIg=", - "dev": true, - "requires": { - "bignumber.js": "^4.0.2" - } - }, - "webpack": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.11.1.tgz", - "integrity": "sha512-8HGSxsLm9LTVgYiyfjY849c3Rgtb0bI0fPpdQsMmO6Hg8JXUOCudGD3j6sPfo6DaAdti1icUUZNh8XpY3igHqQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.10", - "@webassemblyjs/helper-module-context": "1.5.10", - "@webassemblyjs/wasm-edit": "1.5.10", - "@webassemblyjs/wasm-opt": "1.5.10", - "@webassemblyjs/wasm-parser": "1.5.10", - "acorn": "^5.0.0", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^0.1.1", - "enhanced-resolve": "^4.0.0", - "eslint-scope": "^3.7.1", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.0.0", - "uglifyjs-webpack-plugin": "^1.2.4", - "watchpack": "^1.5.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typescript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", + "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", + "dev": true + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "is-extendable": "^0.1.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "isarray": "1.0.0" } } } }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, + } + } + }, + "untildify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", + "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", + "dev": true + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } } } }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" + } + }, + "web3": { + "version": "0.20.6", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", + "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", + "requires": { + "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git" + } + } + }, + "web3-typescript-typings": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/web3-typescript-typings/-/web3-typescript-typings-0.10.2.tgz", + "integrity": "sha1-qZA4FdKooNvXP9XbN0Bw3gvTBJc=", + "dev": true, + "requires": { + "bignumber.js": "~4.1.0" + } + }, "webpack-addons": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", @@ -15270,16 +13264,6 @@ } } }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", @@ -15309,15 +13293,6 @@ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", "dev": true }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", diff --git a/package.json b/package.json index d764f25c..64cdb314 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,7 @@ "truffle": "^4.1.11", "tslint": "5.8.0", "typescript": "2.7.1", - "web3-typescript-typings": "0.0.3", - "webpack": "^4.11.1" + "web3-typescript-typings": "0.10.2" }, "dependencies": { "@types/bitwise-xor": "0.0.30", @@ -60,6 +59,6 @@ "js-sha3": "^0.7.0", "lodash": "^4.17.5", "npm": "^6.1.0", - "web3": "0.20.2" + "web3": "0.20.6" } } diff --git a/test/testExchange.ts b/test/testExchange.ts index e05a351d..bf58e25a 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -1,3 +1,6 @@ +import { BigNumber } from "bignumber.js"; +import BN = require("bn.js"); +import abi = require("ethereumjs-abi"); import * as _ from "lodash"; import { Artifacts } from "../util/artifacts"; import { Ring } from "../util/ring"; @@ -45,17 +48,31 @@ contract("Exchange", (accounts: string[]) => { }); describe("submitRing", () => { - it("should be able to fill ring with 2 orders", async () => { - const rings: Ring[] = ringsGenerator.generateRings(); - const params: RingsSubmitParams = ringsGenerator.toSubmitableParam(rings); - exchange.submitRings(params.miningSpec, - params.orderSpecs, - params.ringSpecs, - params.addressList, - params.uintList, - params.bytesList, - {from: miner}); - assert(true); + // it("should be able to fill ring with 2 orders", async () => { + // const rings: Ring[] = ringsGenerator.generateRings(); + // const params: RingsSubmitParams = ringsGenerator.toSubmitableParam(rings); + // exchange.submitRings(params.miningSpec, + // params.orderSpecs, + // params.ringSpecs, + // params.addressList, + // params.uintList, + // params.bytesList, + // {from: miner}); + // assert(true); + // }); + + it("bytes test", async () => { + const a = accounts[9]; + const bn = new BigNumber(12345); + const c = 31; + const d = "xxxbbbcc"; + const h = "ccccccccccccccccccccccccccdddddddddddddddd\ +ddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\ +xxxxxxxxxxxxxxxxxxxxfffffffffffffffffffffffff987"; + + const paramsBytes = abi.rawEncode(["address", "uint256", "uint8", "bytes32", "bytes"], + [a, new BN(bn.toString(10), 10), c, d, h]); + console.log("paramsBytes:", paramsBytes.toString("hex")); }); }); diff --git a/util/bitstream.ts b/util/bitstream.ts new file mode 100644 index 00000000..fa291923 --- /dev/null +++ b/util/bitstream.ts @@ -0,0 +1,48 @@ +import { BigNumber } from "bignumber.js"; + +export class Bitstream { + private data: string; + + constructor() { + this.data = ""; + } + + public getData() { + if (this.data.length === 0) { + return "0x0"; + } else { + return "0x" + this.data; + } + } + + public addBigNumber(x: BigNumber, numBytes = 32) { + this.data += this.padString(web3.toHex(x).slice(2), numBytes * 2); + } + + public addNumber(x: number, numBytes = 4) { + this.addBigNumber(new BigNumber(x), numBytes); + } + + public addAddress(x: string, numBytes = 20) { + this.data += this.padString(x.slice(2), numBytes * 2); + } + + public addHex(x: string) { + if (x.startsWith("0x")) { + this.data += x.slice(2); + } else { + this.data += x; + } + } + + private padString(x: string, targetLength: number) { + if (x.length > targetLength) { + throw Error("0x" + x + " is too big to fit in the requested length (" + targetLength + ")"); + } + while (x.length < targetLength) { + x = "0" + x; + } + return x; + } + +} From 97264f7a2cf316b1989cccbbab0f2d0a26ffaf29 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Wed, 20 Jun 2018 12:22:03 +0800 Subject: [PATCH 56/68] params encoding --- contracts/iface/IExchange.sol | 13 +- contracts/impl/Exchange.sol | 123 +- contracts/lib/MemoryUtil.sol | 74 + contracts/spec/EncodeSpec.sol | 86 + package-lock.json | 7998 +++++++++++++++++++++------------ package.json | 7 +- test/testExchange.ts | 118 +- util/bitstream.ts | 6 + util/ringsConfig.ts | 27 + util/rings_generator.ts | 109 +- util/types.ts | 28 +- 11 files changed, 5708 insertions(+), 2881 deletions(-) create mode 100644 contracts/spec/EncodeSpec.sol create mode 100644 util/ringsConfig.ts diff --git a/contracts/iface/IExchange.sol b/contracts/iface/IExchange.sol index 728410a0..f6cd79cd 100644 --- a/contracts/iface/IExchange.sol +++ b/contracts/iface/IExchange.sol @@ -100,12 +100,13 @@ contract IExchange { /// @dev Submit a order-ring for validation and settlement. function submitRings( - uint16 miningSpec, - uint16[] orderSpecs, - uint8[][] ringSpecs, - address[] addressList, - uint[] uintList, - bytes[] bytesList + /* uint16 miningSpec, */ + /* uint16[] orderSpecs, */ + /* // uint8[][] ringSpecs, */ + /* address[] addressList, */ + /* uint[] uintList, */ + /* bytes[] bytesList */ + bytes data ) public; } diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index 98632f79..b3f90134 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -28,6 +28,7 @@ import "../iface/IMinerRegistry.sol"; import "../lib/AddressUtil.sol"; import "../lib/BytesUtil.sol"; +import "../lib/MemoryUtil.sol"; import "../lib/ERC20.sol"; import "../lib/MathUint.sol"; import "../lib/MultihashUtil.sol"; @@ -77,6 +78,16 @@ contract Exchange is IExchange, NoDefaultFunc { uint public constant MAX_RING_SIZE = 8; + struct SubmitRingsParam { + uint16[] encodeSpecs; + uint16 miningSpec; + uint16[] orderSpecs; + uint8[][] ringSpecs; + address[] addressList; + uint[] uintList; + bytes[] bytesList; + } + constructor( address _lrcTokenAddress, address _tokenRegistryAddress, @@ -175,25 +186,27 @@ contract Exchange is IExchange, NoDefaultFunc { ); } - event LogData(address a, uint i, bytes bs); + event LogData(address a, uint i, uint i8, bytes32 bs); + event LogBytes(bytes d); struct Test { address a; uint b; - uint8 c; + uint c; bytes32 d; // 32 * 4 = 128 - bytes h; // 42 } function structCopyTest(bytes data) public { + emit LogBytes(msg.data); Test memory t; uint ptr; assembly { ptr := t } - copyStruct(0, ptr, 0, 170); - emit LogData(t.a, t.b, t.h); + MemoryUtil.copyCallDataBytesInArray(0, ptr, 0, 270); + //copyStruct(0, ptr, 0, 270); + emit LogData(t.a, t.b, t.c, t.d); } function copyStruct( @@ -206,8 +219,8 @@ contract Exchange is IExchange, NoDefaultFunc { pure { assembly { - let structOffset := add(4, mul(parameterIndex, 32)) - calldatacopy(dst, add(structOffset, offsetInBytes), numBytes) + let structOffset := add(32, add(4, mul(parameterIndex, 32))) + calldatacopy(dst, structOffset, numBytes) } } @@ -226,7 +239,36 @@ contract Exchange is IExchange, NoDefaultFunc { } } + event LogParam(uint16 miningSpec, uint16[] orderSpecs, address[] addressList, uint[] uintList); + + event Log2DArr(uint8[] uis); + event LogInt(uint16 i16); + event LogIntArr(uint16[] arr); + function submitRings( + bytes data + ) + public + { + // emit LogBytes(data); + uint16 encodeSpecsLen = uint16(MemoryUtil.bytesToUintX(data, 0, 2)); + // emit LogInt(encodeSpecsLen); + uint16[] memory encodeSpecs = new uint16[](encodeSpecsLen); + for (uint i = 0; i < encodeSpecsLen; i ++) { + uint offset = 2 + i * 2; + uint16 spec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); + encodeSpecs[i] = spec; + } + emit LogIntArr(encodeSpecs); + /* uint8[][] memory ringSpecs = new uint8[][](3); */ + /* uint8[] memory spec1 = new uint8[](2); */ + /* spec1[0] = 19; */ + /* spec1[1] = 10; */ + /* ringSpecs[0] = spec1; */ + /* emit Log2DArr(spec1); */ + } + + function submitRingsInternal( uint16 miningSpec, uint16[] orderSpecs, uint8[][] ringSpecs, @@ -234,44 +276,45 @@ contract Exchange is IExchange, NoDefaultFunc { uint[] uintList, bytes[] bytesList ) - public + internal { - Data.Context memory ctx = Data.Context( - lrcTokenAddress, - ITokenRegistry(tokenRegistryAddress), - ITradeDelegate(delegateAddress), - IBrokerRegistry(orderBrokerRegistryAddress), - IBrokerRegistry(minerBrokerRegistryAddress), - IOrderRegistry(orderRegistryAddress), - IMinerRegistry(minerRegistryAddress) - ); + emit LogParam(miningSpec, orderSpecs, addressList, uintList); + /* Data.Context memory ctx = Data.Context( */ + /* lrcTokenAddress, */ + /* ITokenRegistry(tokenRegistryAddress), */ + /* ITradeDelegate(delegateAddress), */ + /* IBrokerRegistry(orderBrokerRegistryAddress), */ + /* IBrokerRegistry(minerBrokerRegistryAddress), */ + /* IOrderRegistry(orderRegistryAddress), */ + /* IMinerRegistry(minerRegistryAddress) */ + /* ); */ - Data.Inputs memory inputs = Data.Inputs( - addressList, - uintList, - bytesList, - 0, 0, 0 // current indices of addressLists, uintList, and bytesList. - ); + /* Data.Inputs memory inputs = Data.Inputs( */ + /* addressList, */ + /* uintList, */ + /* bytesList, */ + /* 0, 0, 0 // current indices of addressLists, uintList, and bytesList. */ + /* ); */ - Data.Mining memory mining = Data.Mining( - inputs.nextAddress(), - (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), - (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), - bytes32(0x0), // hash - address(0x0), // interceptor - getSpendable( - ctx.delegate, - ctx.lrcTokenAddress, - tx.origin, // TODO(daniel): pay from msg.sender? - 0x0, // broker - 0x0 // brokerInterceptor - ) - ); + /* Data.Mining memory mining = Data.Mining( */ + /* inputs.nextAddress(), */ + /* (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), */ + /* (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), */ + /* bytes32(0x0), // hash */ + /* address(0x0), // interceptor */ + /* getSpendable( */ + /* ctx.delegate, */ + /* ctx.lrcTokenAddress, */ + /* tx.origin, // TODO(daniel): pay from msg.sender? */ + /* 0x0, // broker */ + /* 0x0 // brokerInterceptor */ + /* ) */ + /* ); */ - Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); - Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); + /* Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); */ + /* Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); */ - handleSubmitRings(ctx, mining, orders, rings); + /* handleSubmitRings(ctx, mining, orders, rings); */ } function handleSubmitRings( diff --git a/contracts/lib/MemoryUtil.sol b/contracts/lib/MemoryUtil.sol index aa993979..b0994103 100644 --- a/contracts/lib/MemoryUtil.sol +++ b/contracts/lib/MemoryUtil.sol @@ -1,5 +1,79 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + pragma solidity 0.4.24; +/// @title Utility Functions for memory related operations +/// @author Brechtpd https://github.com/Brechtpd library MemoryUtil { + function getBytes32Pointer( + bytes32[] arr, + uint offsetInWords + ) + internal + pure + returns (uint ptr) + { + assembly { + ptr := add(add(arr, 32), mul(offsetInWords, 32)) + } + } + + function copyCallDataBytesInArray( + uint parameterIndex, + uint dst, + uint offsetInBytes, + uint numBytes + ) + internal + pure + { + assembly { + let parameterOffset := add(calldataload(add(4, mul(parameterIndex, 32))), 4) + calldatacopy(dst, add(add(parameterOffset, 32), offsetInBytes), numBytes) + } + } + + function bytesToUint( + bytes b, + uint offset + ) + internal + pure + returns (uint data) + { + assembly { + data := mload(add(add(b, 0x20), offset)) + } + } + + function bytesToUintX( + bytes b, + uint offset, + uint numBytes + ) + internal + pure + returns (uint data) + { + assembly { + data := mload(add(add(b, numBytes), offset)) + } + } + } diff --git a/contracts/spec/EncodeSpec.sol b/contracts/spec/EncodeSpec.sol new file mode 100644 index 00000000..e88f8c61 --- /dev/null +++ b/contracts/spec/EncodeSpec.sol @@ -0,0 +1,86 @@ +/* + + Copyright 2017 Loopring Project Ltd (Loopring Foundation). + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +pragma solidity 0.4.24; +pragma experimental "v0.5.0"; +pragma experimental "ABIEncoderV2"; + +import "../impl/Data.sol"; + +/// encode spec: +/// len(encodeSpecs) len(orderSpecs) +/// | | +/// uint16 array: 0 1 +/// @title Encode spec for SumitRings parameters. +/// @author Kongliang - . +library EncodeSpec { + function orderSpecSize(uint spec) + internal + pure + returns (uint) + { + return 0; + } + + function ringSpecSize(uint spec) + internal + pure + returns (uint) + { + return 0; + } + + function ringSpecSizeI(uint spec, uint i) + internal + pure + returns (uint) + { + return 0; + } + + function addressListSize(uint spec) + internal + pure + returns (uint) + { + return 0; + } + + function uintListSize(uint spec) + internal + pure + returns (uint) + { + return 0; + } + + function bytesListSize(uint spec) + internal + pure + returns (uint) + { + return 0; + } + + function bytesListSizeI(uint spec, uint i) + internal + pure + returns (uint) + { + return 0; + } + +} diff --git a/package-lock.json b/package-lock.json index 468bece3..1e91c2b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" } }, "@nodelib/fs.stat": { @@ -26,7 +26,7 @@ "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", "dev": true, "requires": { - "any-observable": "^0.3.0" + "any-observable": "0.3.0" }, "dependencies": { "any-observable": { @@ -54,7 +54,7 @@ "resolved": "https://registry.npmjs.org/@types/bitwise-xor/-/bitwise-xor-0.0.30.tgz", "integrity": "sha1-mW95moABAFshbnJWC6oN+5xZwhY=", "requires": { - "@types/node": "*" + "@types/node": "9.3.0" } }, "@types/bluebird": { @@ -75,7 +75,7 @@ "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "9.3.0" } }, "@types/lodash": { @@ -95,10 +95,10 @@ "integrity": "sha512-/KXM5oev+nNCLIgBjkwbk8VqxmzI56woD4VUxn95O+YeQ8hJzcSmIZ1IN3WexiqBb6srzDo2bdMbsXxgXNkz5Q==", "dev": true, "requires": { - "@types/caseless": "*", - "@types/form-data": "*", - "@types/node": "*", - "@types/tough-cookie": "*" + "@types/caseless": "0.12.1", + "@types/form-data": "2.2.1", + "@types/node": "9.3.0", + "@types/tough-cookie": "2.3.2" } }, "@types/request-promise-native": { @@ -107,7 +107,7 @@ "integrity": "sha512-m6PNeopPU75gjN3+dD9AeWwm7h2QIOuLnmn143+Qs0bMYFyri9/bhCgikHlgzH0gk7xR48nef82GWeRV6N3DxA==", "dev": true, "requires": { - "@types/request": "*" + "@types/request": "2.47.0" } }, "@types/tough-cookie": { @@ -116,18 +116,39 @@ "integrity": "sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA==", "dev": true }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "5.7.1" + } + }, "ajv": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", "dev": true, "requires": { - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1", + "uri-js": "3.0.2" } }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -151,8 +172,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" } }, "aproba": { @@ -165,8 +186,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.3" }, "dependencies": { "isarray": { @@ -179,13 +200,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -193,7 +214,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -204,7 +225,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "arr-flatten": { @@ -231,7 +252,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "array-uniq": "1.0.3" } }, "array-uniq": { @@ -252,6 +273,43 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -288,9 +346,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" } }, "babel-core": { @@ -299,25 +357,25 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -334,14 +392,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" }, "dependencies": { "jsesc": { @@ -364,9 +422,9 @@ "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -375,9 +433,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-call-delegate": { @@ -386,10 +444,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-define-map": { @@ -398,10 +456,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" } }, "babel-helper-explode-assignable-expression": { @@ -410,9 +468,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-explode-class": { @@ -421,10 +479,10 @@ "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", "dev": true, "requires": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -433,11 +491,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -446,8 +504,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -456,8 +514,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-optimise-call-expression": { @@ -466,8 +524,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { @@ -476,9 +534,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" } }, "babel-helper-remap-async-to-generator": { @@ -487,11 +545,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { @@ -500,12 +558,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -514,8 +572,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-messages": { @@ -524,7 +582,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-check-es2015-constants": { @@ -533,7 +591,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-syntax-async-functions": { @@ -608,9 +666,9 @@ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-async-to-generator": { @@ -619,9 +677,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-class-constructor-call": { @@ -630,9 +688,9 @@ "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", "dev": true, "requires": { - "babel-plugin-syntax-class-constructor-call": "^6.18.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-class-properties": { @@ -641,10 +699,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-decorators": { @@ -653,11 +711,11 @@ "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", "dev": true, "requires": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -666,7 +724,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -675,7 +733,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -684,11 +742,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" } }, "babel-plugin-transform-es2015-classes": { @@ -697,15 +755,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -714,8 +772,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -724,7 +782,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -733,8 +791,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-for-of": { @@ -743,7 +801,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -752,9 +810,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-literals": { @@ -763,7 +821,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -772,9 +830,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -783,10 +841,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -795,9 +853,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -806,9 +864,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-object-super": { @@ -817,8 +875,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -827,12 +885,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -841,8 +899,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -851,7 +909,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -860,9 +918,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -871,7 +929,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -880,7 +938,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -889,9 +947,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -900,9 +958,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-export-extensions": { @@ -911,8 +969,8 @@ "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", "dev": true, "requires": { - "babel-plugin-syntax-export-extensions": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -921,8 +979,8 @@ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -931,8 +989,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -941,7 +999,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "^0.10.0" + "regenerator-transform": "0.10.1" } }, "babel-plugin-transform-strict-mode": { @@ -950,8 +1008,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-preset-es2015": { @@ -960,30 +1018,30 @@ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" } }, "babel-preset-stage-1": { @@ -992,9 +1050,9 @@ "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", "dev": true, "requires": { - "babel-plugin-transform-class-constructor-call": "^6.24.1", - "babel-plugin-transform-export-extensions": "^6.22.0", - "babel-preset-stage-2": "^6.24.1" + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" } }, "babel-preset-stage-2": { @@ -1003,10 +1061,10 @@ "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", "dev": true, "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" } }, "babel-preset-stage-3": { @@ -1015,11 +1073,11 @@ "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", "dev": true, "requires": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" } }, "babel-register": { @@ -1028,13 +1086,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.4", + "home-or-tmp": "2.0.0", + "lodash": "4.17.5", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" }, "dependencies": { "source-map": { @@ -1049,7 +1107,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "^0.5.6" + "source-map": "0.5.7" } } } @@ -1060,8 +1118,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "core-js": "2.5.4", + "regenerator-runtime": "0.11.1" } }, "babel-template": { @@ -1070,11 +1128,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" }, "dependencies": { "babylon": { @@ -1091,15 +1149,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.5" }, "dependencies": { "babylon": { @@ -1116,10 +1174,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" } }, "babylon": { @@ -1140,13 +1198,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -1155,7 +1213,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -1164,7 +1222,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1173,7 +1231,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1182,9 +1240,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -1201,6 +1259,12 @@ } } }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -1234,7 +1298,7 @@ "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.1" } }, "bitwise-xor": { @@ -1247,7 +1311,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", "requires": { - "readable-stream": "^2.0.5" + "readable-stream": "2.3.3" }, "dependencies": { "isarray": { @@ -1260,13 +1324,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -1274,7 +1338,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -1295,7 +1359,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1305,9 +1369,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "brorand": { @@ -1316,9 +1380,9 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "browserify-aes": { @@ -1326,11 +1390,43 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", "requires": { - "buffer-xor": "^1.0.2", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "inherits": "^2.0.1" + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.2", + "inherits": "2.0.3" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "1.0.6", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.2" + } + }, + "browserify-des": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" } }, "browserify-sha3": { @@ -1338,7 +1434,7 @@ "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", "requires": { - "js-sha3": "^0.3.1" + "js-sha3": "0.3.1" }, "dependencies": { "js-sha3": { @@ -1348,6 +1444,55 @@ } } }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.12", + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1359,21 +1504,56 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + }, + "dependencies": { + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" }, "dependencies": { "isobject": { @@ -1425,12 +1605,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" } }, "chalk": { @@ -1439,11 +1619,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "chardet": { @@ -1464,15 +1644,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.2", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" } }, "chownr": { @@ -1480,13 +1660,19 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, + "chrome-trace-event": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz", + "integrity": "sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, "class-utils": { @@ -1495,10 +1681,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -1507,7 +1693,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "isobject": { @@ -1524,7 +1710,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "2.0.0" } }, "cli-spinners": { @@ -1557,7 +1743,7 @@ "dev": true, "requires": { "slice-ansi": "0.0.4", - "string-width": "^1.0.1" + "string-width": "1.0.2" } }, "cli-width": { @@ -1572,9 +1758,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "clone": { @@ -1595,7 +1781,7 @@ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "1.0.0" } }, "clone-stats": { @@ -1610,9 +1796,9 @@ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "inherits": "2.0.3", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.5" }, "dependencies": { "isarray": { @@ -1633,13 +1819,13 @@ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -1648,7 +1834,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -1670,8 +1856,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color-convert": { @@ -1680,7 +1866,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -1719,17 +1905,96 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.1.2", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -1742,12 +2007,12 @@ "integrity": "sha1-qNo6xBqiIgrim9PFi2mEKU8sWTw=", "dev": true, "requires": { - "glob": "^7.0.5", - "ltcdr": "^2.2.1", - "minimatch": "^3.0.3", - "mkdirp": "^0.5.1", + "glob": "7.1.2", + "ltcdr": "2.2.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", "noms": "0.0.0", - "through2": "^2.0.1" + "through2": "2.0.3" } }, "core-js": { @@ -1761,15 +2026,25 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, "create-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "sha.js": "^2.4.0" + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.8" } }, "create-hmac": { @@ -1777,12 +2052,12 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.8" } }, "cross-spawn": { @@ -1791,9 +2066,28 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, "crypto-js": { @@ -1801,12 +2095,18 @@ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "0.10.35" } }, "dargs": { @@ -1821,6 +2121,12 @@ "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", "dev": true }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -1854,7 +2160,7 @@ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "1.0.0" } }, "deep-eql": { @@ -1863,7 +2169,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "^4.0.0" + "type-detect": "4.0.8" } }, "define-property": { @@ -1872,8 +2178,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1882,7 +2188,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1891,7 +2197,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1900,9 +2206,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -1924,6 +2230,16 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, "detect-conflict": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", @@ -1936,7 +2252,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "diff": { @@ -1945,14 +2261,25 @@ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", "dev": true }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "arrify": "1.0.1", + "path-type": "3.0.0" }, "dependencies": { "path-type": { @@ -1961,7 +2288,7 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "pify": { @@ -1978,14 +2305,20 @@ "integrity": "sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w==", "dev": true }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" + "browserify-aes": "1.0.6", + "create-hash": "1.1.3", + "create-hmac": "1.1.6" } }, "duplexer3": { @@ -1994,6 +2327,56 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, "editions": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", @@ -2011,13 +2394,13 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" } }, "emojis-list": { @@ -2031,7 +2414,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "enhanced-resolve": { @@ -2040,9 +2423,9 @@ "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "tapable": "1.0.0" } }, "envinfo": { @@ -2057,7 +2440,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" } }, "error": { @@ -2066,8 +2449,8 @@ "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", "dev": true, "requires": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" + "string-template": "0.2.1", + "xtend": "4.0.1" } }, "error-ex": { @@ -2076,7 +2459,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "es5-ext": { @@ -2084,8 +2467,8 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "requires": { - "es6-iterator": "~2.0.1", - "es6-symbol": "~3.1.1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "es6-iterator": { @@ -2093,9 +2476,9 @@ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" } }, "es6-map": { @@ -2103,12 +2486,12 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, "es6-promise": { @@ -2121,7 +2504,7 @@ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.1.1" } }, "es6-set": { @@ -2129,11 +2512,11 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "event-emitter": "0.3.5" } }, "es6-symbol": { @@ -2141,8 +2524,8 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.35" } }, "escape-string-regexp": { @@ -2150,12 +2533,31 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", @@ -2171,8 +2573,8 @@ "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" + "bn.js": "4.11.8", + "ethereumjs-util": "4.5.0" }, "dependencies": { "ethereumjs-util": { @@ -2180,11 +2582,11 @@ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" + "bn.js": "4.11.8", + "create-hash": "1.1.3", + "keccakjs": "0.2.1", + "rlp": "2.0.0", + "secp256k1": "3.3.0" } } } @@ -2194,13 +2596,13 @@ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.5.tgz", "integrity": "sha512-xPaSEATYJpMTCGowIt0oMZwFP4R1bxd6QsWgkcDvFL0JtXsr39p32WEcD14RscCjfP41YXZPCVWA4yAg0nrJmw==", "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" + "bn.js": "4.11.8", + "create-hash": "1.1.3", + "ethjs-util": "0.1.4", + "keccak": "1.4.0", + "rlp": "2.0.0", + "safe-buffer": "5.1.1", + "secp256k1": "3.3.0" } }, "ethjs-util": { @@ -2217,8 +2619,8 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.35" } }, "events": { @@ -2231,8 +2633,8 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.2.tgz", "integrity": "sha512-ni0r0lrm7AOzsh2qC5mi9sj8S0gmj5fLNjfFpxN05FB4tAVZEKotbkjOtLPqTCX/CXT7NsUr6juZb4IFJeNNdA==", "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" } }, "execa": { @@ -2241,13 +2643,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "exit-hook": { @@ -2262,7 +2664,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "expand-range": { @@ -2271,7 +2673,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.4" } }, "expand-template": { @@ -2285,7 +2687,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "homedir-polyfill": "1.0.1" } }, "extend-shallow": { @@ -2294,8 +2696,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -2304,7 +2706,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -2315,9 +2717,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" } }, "extglob": { @@ -2326,7 +2728,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "fast-deep-equal": { @@ -2341,12 +2743,12 @@ "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", "dev": true, "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.0.1", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.1", - "micromatch": "^3.1.10" + "@mrmlnc/readdir-enhanced": "2.2.1", + "@nodelib/fs.stat": "1.1.0", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.2", + "micromatch": "3.1.10" }, "dependencies": { "arr-diff": { @@ -2367,16 +2769,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -2385,7 +2787,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2396,13 +2798,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2411,7 +2813,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -2420,7 +2822,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -2429,7 +2831,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2438,7 +2840,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2449,7 +2851,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2458,7 +2860,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2469,9 +2871,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" } }, "kind-of": { @@ -2488,14 +2890,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2504,7 +2906,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -2513,7 +2915,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2524,10 +2926,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -2536,7 +2938,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2547,8 +2949,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" }, "dependencies": { "is-glob": { @@ -2557,7 +2959,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -2568,7 +2970,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -2577,7 +2979,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -2586,9 +2988,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "is-extglob": { @@ -2603,7 +3005,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } }, "is-number": { @@ -2612,7 +3014,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2621,7 +3023,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2644,19 +3046,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } } } @@ -2673,7 +3075,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "1.0.5" } }, "filename-regex": { @@ -2688,11 +3090,11 @@ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.0.0", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" }, "dependencies": { "kind-of": { @@ -2707,9 +3109,9 @@ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" }, "dependencies": { "is-number": { @@ -2722,14 +3124,25 @@ } } }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.2.0", + "pkg-dir": "2.0.0" + } + }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "first-chunk-stream": { @@ -2738,7 +3151,7 @@ "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "readable-stream": "2.3.5" }, "dependencies": { "isarray": { @@ -2759,13 +3172,13 @@ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -2774,7 +3187,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -2785,6 +3198,54 @@ "integrity": "sha1-N4tRKNbQtVSosvFqTKPhq5ZJ8A4=", "dev": true }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2797,7 +3258,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "fragment-cache": { @@ -2806,7 +3267,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "from2": { @@ -2815,8 +3276,8 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.5" }, "dependencies": { "isarray": { @@ -2837,13 +3298,13 @@ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -2852,7 +3313,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -2863,11 +3324,23 @@ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "1.0.34" } }, "fs.realpath": { @@ -2883,8 +3356,8 @@ "dev": true, "optional": true, "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.36" + "nan": "git+https://github.com/nodejs/nan.git#77d0fcaba3305d05176a9ad95d8e5101e8f2a283", + "node-pre-gyp": "0.6.36" }, "dependencies": { "abbrev": { @@ -2899,8 +3372,8 @@ "dev": true, "optional": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, "ansi-regex": { @@ -2920,8 +3393,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.2.9" } }, "asn1": { @@ -2965,7 +3438,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "block-stream": { @@ -2973,7 +3446,7 @@ "bundled": true, "dev": true, "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.3" } }, "boom": { @@ -2981,7 +3454,7 @@ "bundled": true, "dev": true, "requires": { - "hoek": "2.x.x" + "hoek": "2.16.3" } }, "brace-expansion": { @@ -2989,7 +3462,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "^0.4.1", + "balanced-match": "0.4.2", "concat-map": "0.0.1" } }, @@ -3020,7 +3493,7 @@ "bundled": true, "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "concat-map": { @@ -3044,7 +3517,7 @@ "dev": true, "optional": true, "requires": { - "boom": "2.x.x" + "boom": "2.10.1" } }, "dashdash": { @@ -3053,7 +3526,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" }, "dependencies": { "assert-plus": { @@ -3096,7 +3569,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "extend": { @@ -3122,9 +3595,9 @@ "dev": true, "optional": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" } }, "fs.realpath": { @@ -3137,10 +3610,10 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" } }, "fstream-ignore": { @@ -3149,9 +3622,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" } }, "gauge": { @@ -3160,14 +3633,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" } }, "getpass": { @@ -3176,7 +3649,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" }, "dependencies": { "assert-plus": { @@ -3192,12 +3665,12 @@ "bundled": true, "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "graceful-fs": { @@ -3217,8 +3690,8 @@ "dev": true, "optional": true, "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" + "ajv": "4.11.8", + "har-schema": "1.0.5" } }, "has-unicode": { @@ -3233,10 +3706,10 @@ "dev": true, "optional": true, "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" } }, "hoek": { @@ -3250,9 +3723,9 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" } }, "inflight": { @@ -3260,8 +3733,8 @@ "bundled": true, "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -3280,7 +3753,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-typedarray": { @@ -3306,7 +3779,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "jsbn": { @@ -3327,7 +3800,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "~0.0.0" + "jsonify": "0.0.0" } }, "json-stringify-safe": { @@ -3372,7 +3845,7 @@ "bundled": true, "dev": true, "requires": { - "mime-db": "~1.27.0" + "mime-db": "1.27.0" } }, "minimatch": { @@ -3380,7 +3853,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.7" } }, "minimist": { @@ -3408,15 +3881,15 @@ "dev": true, "optional": true, "requires": { - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "request": "^2.81.0", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" } }, "nopt": { @@ -3425,8 +3898,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.0", + "osenv": "0.1.4" } }, "npmlog": { @@ -3435,10 +3908,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -3463,7 +3936,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "os-homedir": { @@ -3484,8 +3957,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "path-is-absolute": { @@ -3522,10 +3995,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -3541,13 +4014,13 @@ "bundled": true, "dev": true, "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" } }, "request": { @@ -3556,28 +4029,28 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" } }, "rimraf": { @@ -3585,7 +4058,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-buffer": { @@ -3617,7 +4090,7 @@ "dev": true, "optional": true, "requires": { - "hoek": "2.x.x" + "hoek": "2.16.3" } }, "sshpk": { @@ -3626,15 +4099,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" }, "dependencies": { "assert-plus": { @@ -3650,9 +4123,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -3660,7 +4133,7 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.0.1" } }, "stringstream": { @@ -3674,7 +4147,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-json-comments": { @@ -3688,9 +4161,9 @@ "bundled": true, "dev": true, "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" } }, "tar-pack": { @@ -3699,14 +4172,14 @@ "dev": true, "optional": true, "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" } }, "tough-cookie": { @@ -3715,7 +4188,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" } }, "tunnel-agent": { @@ -3724,7 +4197,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.0.1" } }, "tweetnacl": { @@ -3765,7 +4238,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" } }, "wrappy": { @@ -3781,8 +4254,8 @@ "integrity": "sha512-FdTeyk4uLRHGeFiMe+Qnh4Hc5KiTVqvRVVvLDFJEVVKC1P1yHhEgZeh9sp1KhuvxSrxToxgJS25UapYQwH4zHw==", "dev": true, "requires": { - "source-map-support": "^0.5.3", - "webpack-cli": "^2.0.9" + "source-map-support": "0.5.4", + "webpack-cli": "2.1.5" } }, "gauge": { @@ -3790,14 +4263,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.1.2", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" } }, "get-caller-file": { @@ -3830,8 +4303,8 @@ "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", "dev": true, "requires": { - "got": "^7.0.0", - "is-plain-obj": "^1.1.0" + "got": "7.1.0", + "is-plain-obj": "1.1.0" }, "dependencies": { "got": { @@ -3840,20 +4313,20 @@ "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", "dev": true, "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.1", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" } }, "p-cancelable": { @@ -3868,7 +4341,7 @@ "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "dev": true, "requires": { - "p-finally": "^1.0.0" + "p-finally": "1.0.0" } }, "prepend-http": { @@ -3883,7 +4356,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "1.0.4" } } } @@ -3899,7 +4372,7 @@ "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", "dev": true, "requires": { - "gh-got": "^6.0.0" + "gh-got": "6.0.0" } }, "glob": { @@ -3908,12 +4381,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-all": { @@ -3922,8 +4395,8 @@ "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", "dev": true, "requires": { - "glob": "^7.0.5", - "yargs": "~1.2.6" + "glob": "7.1.2", + "yargs": "1.2.6" }, "dependencies": { "minimist": { @@ -3938,7 +4411,7 @@ "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", "dev": true, "requires": { - "minimist": "^0.1.0" + "minimist": "0.1.0" } } } @@ -3949,8 +4422,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" } }, "glob-parent": { @@ -3959,7 +4432,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "is-glob": "2.0.1" } }, "glob-to-regexp": { @@ -3974,9 +4447,9 @@ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, "global-prefix": { @@ -3985,11 +4458,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.4", + "is-windows": "1.0.2", + "which": "1.3.0" } }, "globals": { @@ -4010,13 +4483,13 @@ "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", "dev": true, "requires": { - "lodash": "^4.17.2" + "lodash": "4.17.5" } }, "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "has-ansi": { @@ -4025,7 +4498,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-color": { @@ -4052,7 +4525,7 @@ "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, "requires": { - "has-symbol-support-x": "^1.4.1" + "has-symbol-support-x": "1.4.2" } }, "has-unicode": { @@ -4066,9 +4539,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -4085,8 +4558,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "is-number": { @@ -4095,7 +4568,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4104,7 +4577,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4115,7 +4588,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4125,7 +4598,7 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", "requires": { - "inherits": "^2.0.1" + "inherits": "2.0.3" } }, "hash.js": { @@ -4133,8 +4606,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" } }, "he": { @@ -4148,9 +4621,9 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" } }, "home-or-tmp": { @@ -4159,8 +4632,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "homedir-polyfill": { @@ -4169,7 +4642,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "parse-passwd": "1.0.0" } }, "hosted-git-info": { @@ -4184,16 +4657,34 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, - "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, "import-local": { @@ -4202,8 +4693,8 @@ "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" } }, "imurmurhash": { @@ -4218,17 +4709,23 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -4247,19 +4744,19 @@ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", + "ansi-escapes": "3.1.0", + "chalk": "2.3.2", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.5", "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "run-async": "2.3.0", + "rxjs": "5.5.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" }, "dependencies": { "ansi-regex": { @@ -4274,7 +4771,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.1" } }, "chalk": { @@ -4283,9 +4780,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" } }, "has-flag": { @@ -4306,8 +4803,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -4316,7 +4813,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "supports-color": { @@ -4325,7 +4822,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -4342,8 +4839,8 @@ "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "dev": true, "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" + "from2": "2.3.0", + "p-is-promise": "1.1.0" } }, "invariant": { @@ -4352,7 +4849,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "invert-kv": { @@ -4367,7 +4864,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-arrayish": { @@ -4382,7 +4879,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "1.10.0" } }, "is-buffer": { @@ -4397,7 +4894,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-data-descriptor": { @@ -4406,7 +4903,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-descriptor": { @@ -4415,9 +4912,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -4440,7 +4937,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "is-primitive": "2.0.0" } }, "is-extendable": { @@ -4461,7 +4958,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { @@ -4469,7 +4966,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-glob": { @@ -4478,7 +4975,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "is-hex-prefixed": { @@ -4492,7 +4989,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-object": { @@ -4507,7 +5004,7 @@ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -4530,7 +5027,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -4571,7 +5068,7 @@ "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", "dev": true, "requires": { - "scoped-regex": "^1.0.0" + "scoped-regex": "1.0.0" } }, "is-stream": { @@ -4633,9 +5130,9 @@ "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", "dev": true, "requires": { - "binaryextensions": "2", - "editions": "^1.3.3", - "textextensions": "2" + "binaryextensions": "2.1.1", + "editions": "1.3.4", + "textextensions": "2.2.0" } }, "isurl": { @@ -4644,8 +5141,8 @@ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" } }, "js-sha3": { @@ -4671,21 +5168,21 @@ "integrity": "sha512-sRMollbhbmSDrR79JMAnhEjyZJlQQVozeeY9A6/KNuV26DNcuB3mGSCWXp0hks9dcwRNOELbNOiwraZaXXRk5Q==", "dev": true, "requires": { - "babel-plugin-transform-flow-strip-types": "^6.8.0", - "babel-preset-es2015": "^6.9.0", - "babel-preset-stage-1": "^6.5.0", - "babel-register": "^6.9.0", - "babylon": "^7.0.0-beta.47", - "colors": "^1.1.2", - "flow-parser": "^0.*", - "lodash": "^4.13.1", - "micromatch": "^2.3.7", - "neo-async": "^2.5.0", + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-1": "6.24.1", + "babel-register": "6.26.0", + "babylon": "7.0.0-beta.47", + "colors": "1.2.1", + "flow-parser": "0.69.0", + "lodash": "4.17.5", + "micromatch": "2.3.11", + "neo-async": "2.5.0", "node-dir": "0.1.8", - "nomnom": "^1.8.1", - "recast": "^0.15.0", - "temp": "^0.8.1", - "write-file-atomic": "^1.2.0" + "nomnom": "1.8.1", + "recast": "0.15.0", + "temp": "0.8.3", + "write-file-atomic": "1.3.4" }, "dependencies": { "ast-types": { @@ -4707,9 +5204,9 @@ "dev": true, "requires": { "ast-types": "0.11.5", - "esprima": "~4.0.0", - "private": "~0.1.5", - "source-map": "~0.6.1" + "esprima": "4.0.0", + "private": "0.1.8", + "source-map": "0.6.1" } } } @@ -4750,7 +5247,7 @@ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "4.1.11" } }, "keccak": { @@ -4758,10 +5255,10 @@ "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" + "bindings": "1.3.0", + "inherits": "2.0.3", + "nan": "git+https://github.com/nodejs/nan.git#77d0fcaba3305d05176a9ad95d8e5101e8f2a283", + "safe-buffer": "5.1.1" } }, "keccakjs": { @@ -4769,8 +5266,8 @@ "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", "requires": { - "browserify-sha3": "^0.0.1", - "sha3": "^1.1.0" + "browserify-sha3": "0.0.1", + "sha3": "1.2.0" } }, "keyv": { @@ -4788,7 +5285,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "klaw": { @@ -4797,7 +5294,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "^4.1.9" + "graceful-fs": "4.1.11" } }, "lcid": { @@ -4806,7 +5303,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "listr-silent-renderer": { @@ -4821,14 +5318,14 @@ "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "strip-ansi": "^3.0.1" + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "elegant-spinner": "1.0.1", + "figures": "1.7.0", + "indent-string": "3.2.0", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "figures": { @@ -4837,8 +5334,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" } }, "indent-string": { @@ -4853,7 +5350,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "^1.0.0" + "chalk": "1.1.3" } } } @@ -4864,10 +5361,10 @@ "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "date-fns": "1.29.0", + "figures": "1.7.0" }, "dependencies": { "cli-cursor": { @@ -4876,7 +5373,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "figures": { @@ -4885,8 +5382,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" } }, "onetime": { @@ -4901,8 +5398,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } } } @@ -4913,22 +5410,28 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } }, "locate-path": { @@ -4937,8 +5440,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" }, "dependencies": { "path-exists": { @@ -4960,13 +5463,19 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "^2.0.1" + "chalk": "2.3.2" }, "dependencies": { "ansi-styles": { @@ -4975,7 +5484,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.1" } }, "chalk": { @@ -4984,9 +5493,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" } }, "has-flag": { @@ -5001,7 +5510,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5012,8 +5521,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "^1.0.0", - "cli-cursor": "^1.0.2" + "ansi-escapes": "1.4.0", + "cli-cursor": "1.0.2" }, "dependencies": { "ansi-escapes": { @@ -5028,7 +5537,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "onetime": { @@ -5043,8 +5552,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } } } @@ -5055,7 +5564,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "lowercase-keys": { @@ -5070,8 +5579,8 @@ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "ltcdr": { @@ -5086,7 +5595,7 @@ "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" }, "dependencies": { "pify": { @@ -5109,7 +5618,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "math-random": { @@ -5123,8 +5632,8 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "3.0.4", + "inherits": "2.0.3" }, "dependencies": { "hash-base": { @@ -5132,8 +5641,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } } } @@ -5144,7 +5653,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.1.0" } }, "mem-fs": { @@ -5153,9 +5662,9 @@ "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", "dev": true, "requires": { - "through2": "^2.0.0", - "vinyl": "^1.1.0", - "vinyl-file": "^2.0.0" + "through2": "2.0.3", + "vinyl": "1.2.0", + "vinyl-file": "2.0.0" } }, "memory-fs": { @@ -5164,8 +5673,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "errno": "0.1.7", + "readable-stream": "2.3.5" }, "dependencies": { "isarray": { @@ -5186,13 +5695,13 @@ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -5201,7 +5710,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -5224,19 +5733,29 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" } }, "mimic-fn": { @@ -5267,7 +5786,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.8" } }, "minimist": { @@ -5275,14 +5794,44 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.0", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + } + } + }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -5291,7 +5840,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -5305,23 +5854,30 @@ } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", + "browser-stdout": "1.3.1", + "commander": "2.15.1", "debug": "3.1.0", - "diff": "3.3.1", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", "glob": "7.1.2", - "growl": "1.10.3", + "growl": "1.10.5", "he": "1.1.1", + "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "supports-color": "5.4.0" }, "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -5331,17 +5887,43 @@ "ms": "2.0.0" } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "3.0.0" } } } }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.1.2", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -5354,10 +5936,10 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" } }, "mute-stream": { @@ -5367,8 +5949,7 @@ "dev": true }, "nan": { - "version": "2.10.0", - "resolved": "git+https://github.com/nodejs/nan.git#77d0fcaba3305d05176a9ad95d8e5101e8f2a283" + "version": "git+https://github.com/nodejs/nan.git#77d0fcaba3305d05176a9ad95d8e5101e8f2a283" }, "nanomatch": { "version": "1.2.9", @@ -5376,18 +5957,18 @@ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "arr-diff": { @@ -5433,14 +6014,89 @@ "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", "dev": true }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.4", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, "nomnom": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", "dev": true, "requires": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" + "chalk": "0.4.0", + "underscore": "1.6.0" }, "dependencies": { "ansi-styles": { @@ -5455,9 +6111,9 @@ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, "strip-ansi": { @@ -5474,8 +6130,8 @@ "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" + "inherits": "2.0.3", + "readable-stream": "1.0.34" } }, "noop-logger": { @@ -5489,10 +6145,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" } }, "normalize-path": { @@ -5501,7 +6157,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "normalize-url": { @@ -5510,9 +6166,9 @@ "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" + "prepend-http": "2.0.0", + "query-string": "5.1.1", + "sort-keys": "2.0.0" } }, "npm": { @@ -5520,133 +6176,133 @@ "resolved": "https://registry.npmjs.org/npm/-/npm-6.1.0.tgz", "integrity": "sha512-e38cCtJ0lEjLXXpc4twEfj8Xw5hDLolc2Py87ueWnUhJfZ8GA/5RVIeD+XbSr1+aVRGsRsdtLdzUNO63PvQJ1w==", "requires": { - "JSONStream": "^1.3.2", - "abbrev": "~1.1.1", - "ansi-regex": "~3.0.0", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "~1.2.0", - "archy": "~1.0.0", - "bin-links": "^1.1.2", - "bluebird": "~3.5.1", - "byte-size": "^4.0.3", - "cacache": "^11.0.2", - "call-limit": "~1.1.0", - "chownr": "~1.0.1", - "cli-columns": "^3.1.2", - "cli-table2": "~0.2.0", - "cmd-shim": "~2.0.2", - "columnify": "~1.5.4", - "config-chain": "~1.1.11", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "~1.0.3", - "editor": "~1.0.0", - "figgy-pudding": "^3.1.0", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.0.1", - "glob": "~7.1.2", - "graceful-fs": "~4.1.11", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.6.0", - "iferr": "^1.0.0", - "imurmurhash": "*", - "inflight": "~1.0.6", - "inherits": "~2.0.3", - "ini": "^1.3.5", - "init-package-json": "^1.10.3", - "is-cidr": "^2.0.5", - "json-parse-better-errors": "^1.0.2", - "lazy-property": "~1.0.0", - "libcipm": "^1.6.2", - "libnpmhook": "^4.0.1", - "libnpx": "^10.2.0", - "lock-verify": "^2.0.2", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^4.1.3", - "meant": "~1.0.1", - "mississippi": "^3.0.0", - "mkdirp": "~0.5.1", - "move-concurrently": "^1.0.1", - "node-gyp": "^3.6.2", - "nopt": "~4.0.1", - "normalize-package-data": "~2.4.0", - "npm-audit-report": "^1.2.1", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "~3.0.0", - "npm-lifecycle": "^2.0.3", - "npm-package-arg": "^6.1.0", - "npm-packlist": "~1.1.10", - "npm-pick-manifest": "^2.1.0", - "npm-profile": "^3.0.1", - "npm-registry-client": "^8.5.1", - "npm-registry-fetch": "^1.1.0", - "npm-user-validate": "~1.0.0", - "npmlog": "~4.1.2", - "once": "~1.4.0", - "opener": "~1.4.3", - "osenv": "^0.1.5", - "pacote": "^8.1.5", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", - "qrcode-terminal": "^0.12.0", - "query-string": "^6.1.0", - "qw": "~1.0.1", - "read": "~1.0.7", - "read-cmd-shim": "~1.0.1", - "read-installed": "~4.0.3", - "read-package-json": "^2.0.13", - "read-package-tree": "^5.2.1", - "readable-stream": "^2.3.6", - "readdir-scoped-modules": "*", - "request": "^2.86.0", - "retry": "^0.12.0", - "rimraf": "~2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "sha": "~2.0.1", - "slide": "~1.1.6", - "sorted-object": "~2.0.1", - "sorted-union-stream": "~2.1.3", - "ssri": "^6.0.0", - "strip-ansi": "~4.0.0", - "tar": "^4.4.1", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", + "JSONStream": "1.3.2", + "abbrev": "1.1.1", + "ansi-regex": "3.0.0", + "ansicolors": "0.3.2", + "ansistyles": "0.1.3", + "aproba": "1.2.0", + "archy": "1.0.0", + "bin-links": "1.1.2", + "bluebird": "3.5.1", + "byte-size": "4.0.3", + "cacache": "11.0.2", + "call-limit": "1.1.0", + "chownr": "1.0.1", + "cli-columns": "3.1.2", + "cli-table2": "0.2.0", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "config-chain": "1.1.11", + "debuglog": "1.0.1", + "detect-indent": "5.0.0", + "detect-newline": "2.1.0", + "dezalgo": "1.0.3", + "editor": "1.0.0", + "figgy-pudding": "3.1.0", + "find-npm-prefix": "1.0.2", + "fs-vacuum": "1.2.10", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "has-unicode": "2.0.1", + "hosted-git-info": "2.6.0", + "iferr": "1.0.0", + "imurmurhash": "0.1.4", + "inflight": "1.0.6", + "inherits": "2.0.3", + "ini": "1.3.5", + "init-package-json": "1.10.3", + "is-cidr": "2.0.5", + "json-parse-better-errors": "1.0.2", + "lazy-property": "1.0.0", + "libcipm": "1.6.2", + "libnpmhook": "4.0.1", + "libnpx": "10.2.0", + "lock-verify": "2.0.2", + "lockfile": "1.0.4", + "lodash._baseindexof": "3.1.0", + "lodash._baseuniq": "4.6.0", + "lodash._bindcallback": "3.0.1", + "lodash._cacheindexof": "3.0.2", + "lodash._createcache": "3.1.2", + "lodash._getnative": "3.9.1", + "lodash.clonedeep": "4.5.0", + "lodash.restparam": "3.6.1", + "lodash.union": "4.6.0", + "lodash.uniq": "4.5.0", + "lodash.without": "4.4.0", + "lru-cache": "4.1.3", + "meant": "1.0.1", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "node-gyp": "3.6.2", + "nopt": "4.0.1", + "normalize-package-data": "2.4.0", + "npm-audit-report": "1.2.1", + "npm-cache-filename": "1.0.2", + "npm-install-checks": "3.0.0", + "npm-lifecycle": "2.0.3", + "npm-package-arg": "6.1.0", + "npm-packlist": "1.1.10", + "npm-pick-manifest": "2.1.0", + "npm-profile": "3.0.1", + "npm-registry-client": "8.5.1", + "npm-registry-fetch": "1.1.0", + "npm-user-validate": "1.0.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "opener": "1.4.3", + "osenv": "0.1.5", + "pacote": "8.1.5", + "path-is-inside": "1.0.2", + "promise-inflight": "1.0.1", + "qrcode-terminal": "0.12.0", + "query-string": "6.1.0", + "qw": "1.0.1", + "read": "1.0.7", + "read-cmd-shim": "1.0.1", + "read-installed": "4.0.3", + "read-package-json": "2.0.13", + "read-package-tree": "5.2.1", + "readable-stream": "2.3.6", + "readdir-scoped-modules": "1.0.2", + "request": "2.86.0", + "retry": "0.12.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "sha": "2.0.1", + "slide": "1.1.6", + "sorted-object": "2.0.1", + "sorted-union-stream": "2.1.3", + "ssri": "6.0.0", + "strip-ansi": "4.0.0", + "tar": "4.4.1", + "text-table": "0.2.0", + "tiny-relative-date": "1.3.0", "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "~1.1.0", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.2.1", - "validate-npm-package-license": "^3.0.3", - "validate-npm-package-name": "~3.0.0", - "which": "~1.3.0", - "worker-farm": "^1.6.0", - "wrappy": "~1.0.2", - "write-file-atomic": "^2.3.0" + "umask": "1.1.0", + "unique-filename": "1.1.0", + "unpipe": "1.0.0", + "update-notifier": "2.5.0", + "uuid": "3.2.1", + "validate-npm-package-license": "3.0.3", + "validate-npm-package-name": "3.0.0", + "which": "1.3.0", + "worker-farm": "1.6.0", + "wrappy": "1.0.2", + "write-file-atomic": "2.3.0" }, "dependencies": { "JSONStream": { "version": "1.3.2", "bundled": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "jsonparse": "1.3.1", + "through": "2.3.8" }, "dependencies": { "jsonparse": { @@ -5687,11 +6343,11 @@ "version": "1.1.2", "bundled": true, "requires": { - "bluebird": "^3.5.0", - "cmd-shim": "^2.0.2", - "gentle-fs": "^2.0.0", - "graceful-fs": "^4.1.11", - "write-file-atomic": "^2.3.0" + "bluebird": "3.5.1", + "cmd-shim": "2.0.2", + "gentle-fs": "2.0.1", + "graceful-fs": "4.1.11", + "write-file-atomic": "2.3.0" } }, "bluebird": { @@ -5706,20 +6362,20 @@ "version": "11.0.2", "bundled": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.1", + "chownr": "1.0.1", + "figgy-pudding": "3.1.0", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "6.0.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" }, "dependencies": { "y18n": { @@ -5740,16 +6396,16 @@ "version": "3.1.2", "bundled": true, "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" + "string-width": "2.1.1", + "strip-ansi": "3.0.1" }, "dependencies": { "string-width": { "version": "2.1.1", "bundled": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -5760,7 +6416,7 @@ "version": "4.0.0", "bundled": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -5769,7 +6425,7 @@ "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -5784,9 +6440,9 @@ "version": "0.2.0", "bundled": true, "requires": { - "colors": "^1.1.2", - "lodash": "^3.10.1", - "string-width": "^1.0.1" + "colors": "1.1.2", + "lodash": "3.10.1", + "string-width": "1.0.2" }, "dependencies": { "colors": { @@ -5802,9 +6458,9 @@ "version": "1.0.2", "bundled": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" }, "dependencies": { "code-point-at": { @@ -5815,7 +6471,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" }, "dependencies": { "number-is-nan": { @@ -5828,7 +6484,7 @@ "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -5845,23 +6501,23 @@ "version": "2.0.2", "bundled": true, "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" } }, "columnify": { "version": "1.5.4", "bundled": true, "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" }, "dependencies": { "strip-ansi": { "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -5874,14 +6530,14 @@ "version": "1.0.1", "bundled": true, "requires": { - "defaults": "^1.0.3" + "defaults": "1.0.3" }, "dependencies": { "defaults": { "version": "1.0.3", "bundled": true, "requires": { - "clone": "^1.0.2" + "clone": "1.0.2" }, "dependencies": { "clone": { @@ -5898,8 +6554,8 @@ "version": "1.1.11", "bundled": true, "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "ini": "1.3.5", + "proto-list": "1.2.4" }, "dependencies": { "proto-list": { @@ -5924,8 +6580,8 @@ "version": "1.0.3", "bundled": true, "requires": { - "asap": "^2.0.0", - "wrappy": "1" + "asap": "2.0.5", + "wrappy": "1.0.2" }, "dependencies": { "asap": { @@ -5950,19 +6606,19 @@ "version": "1.2.10", "bundled": true, "requires": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" + "graceful-fs": "4.1.11", + "path-is-inside": "1.0.2", + "rimraf": "2.6.2" } }, "fs-write-stream-atomic": { "version": "1.0.10", "bundled": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" }, "dependencies": { "iferr": { @@ -5975,14 +6631,14 @@ "version": "2.0.1", "bundled": true, "requires": { - "aproba": "^1.1.2", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" + "aproba": "1.2.0", + "fs-vacuum": "1.2.10", + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "path-is-inside": "1.0.2", + "read-cmd-shim": "1.0.1", + "slide": "1.1.6" }, "dependencies": { "iferr": { @@ -5995,12 +6651,12 @@ "version": "7.1.2", "bundled": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" }, "dependencies": { "fs.realpath": { @@ -6011,14 +6667,14 @@ "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.8" }, "dependencies": { "brace-expansion": { "version": "1.1.8", "bundled": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -6064,8 +6720,8 @@ "version": "1.0.6", "bundled": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -6080,21 +6736,21 @@ "version": "1.10.3", "bundled": true, "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" + "glob": "7.1.2", + "npm-package-arg": "6.1.0", + "promzard": "0.3.0", + "read": "1.0.7", + "read-package-json": "2.0.13", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3", + "validate-npm-package-name": "3.0.0" }, "dependencies": { "promzard": { "version": "0.3.0", "bundled": true, "requires": { - "read": "1" + "read": "1.0.7" } } } @@ -6103,14 +6759,14 @@ "version": "2.0.5", "bundled": true, "requires": { - "cidr-regex": "^2.0.8" + "cidr-regex": "2.0.8" }, "dependencies": { "cidr-regex": { "version": "2.0.8", "bundled": true, "requires": { - "ip-regex": "^2.1.0" + "ip-regex": "2.1.0" }, "dependencies": { "ip-regex": { @@ -6133,19 +6789,19 @@ "version": "1.6.2", "bundled": true, "requires": { - "bin-links": "^1.1.0", - "bluebird": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "lock-verify": "^2.0.0", - "npm-lifecycle": "^2.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.0.0", - "pacote": "^7.5.1", - "protoduck": "^5.0.0", - "read-package-json": "^2.0.12", - "rimraf": "^2.6.2", - "worker-farm": "^1.5.4" + "bin-links": "1.1.2", + "bluebird": "3.5.1", + "find-npm-prefix": "1.0.2", + "graceful-fs": "4.1.11", + "lock-verify": "2.0.2", + "npm-lifecycle": "2.0.3", + "npm-logical-tree": "1.2.1", + "npm-package-arg": "6.1.0", + "pacote": "7.6.1", + "protoduck": "5.0.0", + "read-package-json": "2.0.13", + "rimraf": "2.6.2", + "worker-farm": "1.6.0" }, "dependencies": { "npm-logical-tree": { @@ -6156,75 +6812,75 @@ "version": "7.6.1", "bundled": true, "requires": { - "bluebird": "^3.5.1", - "cacache": "^10.0.4", - "get-stream": "^3.0.0", - "glob": "^7.1.2", - "lru-cache": "^4.1.1", - "make-fetch-happen": "^2.6.0", - "minimatch": "^3.0.4", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.0.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.1", - "semver": "^5.5.0", - "ssri": "^5.2.4", - "tar": "^4.4.0", - "unique-filename": "^1.1.0", - "which": "^1.3.0" + "bluebird": "3.5.1", + "cacache": "10.0.4", + "get-stream": "3.0.0", + "glob": "7.1.2", + "lru-cache": "4.1.3", + "make-fetch-happen": "2.6.0", + "minimatch": "3.0.4", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.1.0", + "npm-packlist": "1.1.10", + "npm-pick-manifest": "2.1.0", + "osenv": "0.1.5", + "promise-inflight": "1.0.1", + "promise-retry": "1.1.1", + "protoduck": "5.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "ssri": "5.3.0", + "tar": "4.4.1", + "unique-filename": "1.1.0", + "which": "1.3.0" }, "dependencies": { "cacache": { "version": "10.0.4", "bundled": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" }, "dependencies": { "mississippi": { "version": "2.0.0", "bundled": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.2", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" }, "dependencies": { "concat-stream": { "version": "1.6.2", "bundled": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "buffer-from": { @@ -6241,10 +6897,10 @@ "version": "3.5.4", "bundled": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -6257,32 +6913,32 @@ "version": "1.4.1", "bundled": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "flush-write-stream": { "version": "1.0.3", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "from2": { "version": "2.3.0", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "parallel-transform": { "version": "1.1.0", "bundled": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "cyclist": { @@ -6295,25 +6951,25 @@ "version": "2.0.1", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { "version": "1.4.0", "bundled": true, "requires": { - "duplexify": "^3.5.3", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" } }, "stream-each": { "version": "1.2.2", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -6326,8 +6982,8 @@ "version": "2.0.3", "bundled": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" }, "dependencies": { "xtend": { @@ -6352,31 +7008,31 @@ "version": "2.6.0", "bundled": true, "requires": { - "agentkeepalive": "^3.3.0", - "cacache": "^10.0.0", - "http-cache-semantics": "^3.8.0", - "http-proxy-agent": "^2.0.0", - "https-proxy-agent": "^2.1.0", - "lru-cache": "^4.1.1", - "mississippi": "^1.2.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^3.0.1", - "ssri": "^5.0.0" + "agentkeepalive": "3.4.1", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "1.3.1", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.3.0" }, "dependencies": { "agentkeepalive": { "version": "3.4.1", "bundled": true, "requires": { - "humanize-ms": "^1.2.1" + "humanize-ms": "1.2.1" }, "dependencies": { "humanize-ms": { "version": "1.2.1", "bundled": true, "requires": { - "ms": "^2.0.0" + "ms": "2.1.1" }, "dependencies": { "ms": { @@ -6395,7 +7051,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "agent-base": "4", + "agent-base": "4.2.0", "debug": "3.1.0" }, "dependencies": { @@ -6403,14 +7059,14 @@ "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -6440,22 +7096,22 @@ "version": "2.2.1", "bundled": true, "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "4.2.0", + "debug": "3.1.0" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -6485,26 +7141,26 @@ "version": "1.3.1", "bundled": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^1.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.2", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" }, "dependencies": { "concat-stream": { "version": "1.6.2", "bundled": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "buffer-from": { @@ -6521,10 +7177,10 @@ "version": "3.5.4", "bundled": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -6537,32 +7193,32 @@ "version": "1.4.1", "bundled": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "flush-write-stream": { "version": "1.0.3", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "from2": { "version": "2.3.0", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "parallel-transform": { "version": "1.1.0", "bundled": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "cyclist": { @@ -6575,25 +7231,25 @@ "version": "1.0.3", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { "version": "1.4.0", "bundled": true, "requires": { - "duplexify": "^3.5.3", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" }, "dependencies": { "pump": { "version": "2.0.1", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } } } @@ -6602,8 +7258,8 @@ "version": "1.2.2", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -6616,8 +7272,8 @@ "version": "2.0.3", "bundled": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" }, "dependencies": { "xtend": { @@ -6632,23 +7288,23 @@ "version": "2.0.2", "bundled": true, "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.2", + "safe-buffer": "5.1.2" }, "dependencies": { "encoding": { "version": "0.1.12", "bundled": true, "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.21" }, "dependencies": { "iconv-lite": { "version": "0.4.21", "bundled": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": "2.1.2" }, "dependencies": { "safer-buffer": { @@ -6665,22 +7321,22 @@ "version": "3.0.1", "bundled": true, "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" + "agent-base": "4.2.0", + "socks": "1.1.10" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -6695,8 +7351,8 @@ "version": "1.1.10", "bundled": true, "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" + "ip": "1.1.5", + "smart-buffer": "1.1.15" }, "dependencies": { "ip": { @@ -6717,14 +7373,14 @@ "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" }, "dependencies": { "brace-expansion": { "version": "1.1.11", "bundled": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -6744,8 +7400,8 @@ "version": "1.1.1", "bundled": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "err-code": "1.1.2", + "retry": "0.10.1" }, "dependencies": { "err-code": { @@ -6762,7 +7418,7 @@ "version": "5.3.0", "bundled": true, "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } } } @@ -6771,7 +7427,7 @@ "version": "5.0.0", "bundled": true, "requires": { - "genfun": "^4.0.1" + "genfun": "4.0.1" }, "dependencies": { "genfun": { @@ -6786,50 +7442,50 @@ "version": "4.0.1", "bundled": true, "requires": { - "figgy-pudding": "^3.1.0", - "npm-registry-fetch": "^3.0.0" + "figgy-pudding": "3.1.0", + "npm-registry-fetch": "3.1.1" }, "dependencies": { "npm-registry-fetch": { "version": "3.1.1", "bundled": true, "requires": { - "bluebird": "^3.5.1", - "figgy-pudding": "^3.1.0", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^4.0.0", - "npm-package-arg": "^6.0.0" + "bluebird": "3.5.1", + "figgy-pudding": "3.1.0", + "lru-cache": "4.1.3", + "make-fetch-happen": "4.0.1", + "npm-package-arg": "6.1.0" }, "dependencies": { "make-fetch-happen": { "version": "4.0.1", "bundled": true, "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "agentkeepalive": "3.4.1", + "cacache": "11.0.2", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "4.0.0", + "ssri": "6.0.0" }, "dependencies": { "agentkeepalive": { "version": "3.4.1", "bundled": true, "requires": { - "humanize-ms": "^1.2.1" + "humanize-ms": "1.2.1" }, "dependencies": { "humanize-ms": { "version": "1.2.1", "bundled": true, "requires": { - "ms": "^2.0.0" + "ms": "2.1.1" }, "dependencies": { "ms": { @@ -6848,7 +7504,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "agent-base": "4", + "agent-base": "4.2.0", "debug": "3.1.0" }, "dependencies": { @@ -6856,14 +7512,14 @@ "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -6893,22 +7549,22 @@ "version": "2.2.1", "bundled": true, "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "4.2.0", + "debug": "3.1.0" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -6938,23 +7594,23 @@ "version": "2.0.2", "bundled": true, "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.2", + "safe-buffer": "5.1.2" }, "dependencies": { "encoding": { "version": "0.1.12", "bundled": true, "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.21" }, "dependencies": { "iconv-lite": { "version": "0.4.21", "bundled": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": "2.1.2" }, "dependencies": { "safer-buffer": { @@ -6971,8 +7627,8 @@ "version": "1.1.1", "bundled": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "err-code": "1.1.2", + "retry": "0.10.1" }, "dependencies": { "err-code": { @@ -6989,22 +7645,22 @@ "version": "4.0.0", "bundled": true, "requires": { - "agent-base": "~4.1.0", - "socks": "~2.1.6" + "agent-base": "4.1.2", + "socks": "2.1.6" }, "dependencies": { "agent-base": { "version": "4.1.2", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -7019,8 +7675,8 @@ "version": "2.1.6", "bundled": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.0.1" + "ip": "1.1.5", + "smart-buffer": "4.0.1" }, "dependencies": { "ip": { @@ -7045,14 +7701,14 @@ "version": "10.2.0", "bundled": true, "requires": { - "dotenv": "^5.0.1", - "npm-package-arg": "^6.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.0", - "update-notifier": "^2.3.0", - "which": "^1.3.0", - "y18n": "^4.0.0", - "yargs": "^11.0.0" + "dotenv": "5.0.1", + "npm-package-arg": "6.1.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "update-notifier": "2.5.0", + "which": "1.3.0", + "y18n": "4.0.0", + "yargs": "11.0.0" }, "dependencies": { "dotenv": { @@ -7067,44 +7723,44 @@ "version": "11.0.0", "bundled": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" }, "dependencies": { "cliui": { "version": "4.0.0", "bundled": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" }, "dependencies": { "wrap-ansi": { "version": "2.1.0", "bundled": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "string-width": { "version": "1.0.2", "bundled": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" }, "dependencies": { "code-point-at": { @@ -7115,7 +7771,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" }, "dependencies": { "number-is-nan": { @@ -7130,7 +7786,7 @@ "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -7151,29 +7807,29 @@ "version": "2.1.0", "bundled": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" }, "dependencies": { "locate-path": { "version": "2.0.0", "bundled": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" }, "dependencies": { "p-locate": { "version": "2.0.0", "bundled": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.2.0" }, "dependencies": { "p-limit": { "version": "1.2.0", "bundled": true, "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" }, "dependencies": { "p-try": { @@ -7200,38 +7856,38 @@ "version": "2.1.0", "bundled": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" }, "dependencies": { "execa": { "version": "0.7.0", "bundled": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" }, "dependencies": { "cross-spawn": { "version": "5.1.0", "bundled": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.0" }, "dependencies": { "shebang-command": { "version": "1.2.0", "bundled": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" }, "dependencies": { "shebang-regex": { @@ -7254,7 +7910,7 @@ "version": "2.0.2", "bundled": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" }, "dependencies": { "path-key": { @@ -7281,7 +7937,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" }, "dependencies": { "invert-kv": { @@ -7294,7 +7950,7 @@ "version": "1.1.0", "bundled": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" }, "dependencies": { "mimic-fn": { @@ -7321,8 +7977,8 @@ "version": "2.1.1", "bundled": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -7343,7 +7999,7 @@ "version": "9.0.2", "bundled": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" }, "dependencies": { "camelcase": { @@ -7360,15 +8016,15 @@ "version": "2.0.2", "bundled": true, "requires": { - "npm-package-arg": "^5.1.2 || 6", - "semver": "^5.4.1" + "npm-package-arg": "6.1.0", + "semver": "5.5.0" } }, "lockfile": { "version": "1.0.4", "bundled": true, "requires": { - "signal-exit": "^3.0.2" + "signal-exit": "3.0.2" }, "dependencies": { "signal-exit": { @@ -7385,8 +8041,8 @@ "version": "4.6.0", "bundled": true, "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" + "lodash._createset": "4.0.3", + "lodash._root": "3.0.1" }, "dependencies": { "lodash._createset": { @@ -7411,7 +8067,7 @@ "version": "3.1.2", "bundled": true, "requires": { - "lodash._getnative": "^3.0.0" + "lodash._getnative": "3.9.1" } }, "lodash._getnative": { @@ -7442,8 +8098,8 @@ "version": "4.1.3", "bundled": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" }, "dependencies": { "pseudomap": { @@ -7464,25 +8120,25 @@ "version": "3.0.0", "bundled": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.1", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "3.0.0", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" }, "dependencies": { "concat-stream": { "version": "1.6.1", "bundled": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "typedarray": { @@ -7495,10 +8151,10 @@ "version": "3.5.4", "bundled": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -7511,32 +8167,32 @@ "version": "1.4.1", "bundled": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "flush-write-stream": { "version": "1.0.2", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "from2": { "version": "2.3.0", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "parallel-transform": { "version": "1.1.0", "bundled": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "cyclist": { @@ -7549,25 +8205,25 @@ "version": "3.0.0", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { "version": "1.4.0", "bundled": true, "requires": { - "duplexify": "^3.5.3", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" }, "dependencies": { "pump": { "version": "2.0.1", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } } } @@ -7576,8 +8232,8 @@ "version": "1.2.2", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -7590,8 +8246,8 @@ "version": "2.0.3", "bundled": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" }, "dependencies": { "xtend": { @@ -7619,24 +8275,24 @@ "version": "1.0.1", "bundled": true, "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" }, "dependencies": { "copy-concurrently": { "version": "1.0.5", "bundled": true, "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" }, "dependencies": { "iferr": { @@ -7649,7 +8305,7 @@ "version": "1.0.3", "bundled": true, "requires": { - "aproba": "^1.1.1" + "aproba": "1.2.0" } } } @@ -7658,43 +8314,43 @@ "version": "3.6.2", "bundled": true, "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "2", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.86.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" }, "dependencies": { "fstream": { "version": "1.0.11", "bundled": true, "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" } }, "minimatch": { "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" }, "dependencies": { "brace-expansion": { "version": "1.1.11", "bundled": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -7714,7 +8370,7 @@ "version": "3.0.6", "bundled": true, "requires": { - "abbrev": "1" + "abbrev": "1.1.1" } }, "semver": { @@ -7725,16 +8381,16 @@ "version": "2.2.1", "bundled": true, "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" }, "dependencies": { "block-stream": { "version": "0.0.9", "bundled": true, "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.3" } } } @@ -7745,25 +8401,25 @@ "version": "4.0.1", "bundled": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "normalize-package-data": { "version": "2.4.0", "bundled": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" }, "dependencies": { "is-builtin-module": { "version": "1.0.0", "bundled": true, "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" }, "dependencies": { "builtin-modules": { @@ -7778,8 +8434,8 @@ "version": "1.2.1", "bundled": true, "requires": { - "cli-table2": "^0.2.0", - "console-control-strings": "^1.1.0" + "cli-table2": "0.2.0", + "console-control-strings": "1.1.0" }, "dependencies": { "console-control-strings": { @@ -7796,21 +8452,21 @@ "version": "3.0.0", "bundled": true, "requires": { - "semver": "^2.3.0 || 3.x || 4 || 5" + "semver": "5.5.0" } }, "npm-lifecycle": { "version": "2.0.3", "bundled": true, "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.11", - "node-gyp": "^3.6.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", + "byline": "5.0.0", + "graceful-fs": "4.1.11", + "node-gyp": "3.6.2", + "resolve-from": "4.0.0", + "slide": "1.1.6", "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.0" + "umask": "1.1.0", + "which": "1.3.0" }, "dependencies": { "byline": { @@ -7827,39 +8483,39 @@ "version": "6.1.0", "bundled": true, "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "2.6.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" } }, "npm-packlist": { "version": "1.1.10", "bundled": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" }, "dependencies": { "ignore-walk": { "version": "3.0.1", "bundled": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" }, "dependencies": { "minimatch": { "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.8" }, "dependencies": { "brace-expansion": { "version": "1.1.8", "bundled": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -7887,47 +8543,47 @@ "version": "2.1.0", "bundled": true, "requires": { - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "npm-package-arg": "6.1.0", + "semver": "5.5.0" } }, "npm-profile": { "version": "3.0.1", "bundled": true, "requires": { - "aproba": "^1.1.2", - "make-fetch-happen": "^2.5.0" + "aproba": "1.2.0", + "make-fetch-happen": "2.6.0" }, "dependencies": { "make-fetch-happen": { "version": "2.6.0", "bundled": true, "requires": { - "agentkeepalive": "^3.3.0", - "cacache": "^10.0.0", - "http-cache-semantics": "^3.8.0", - "http-proxy-agent": "^2.0.0", - "https-proxy-agent": "^2.1.0", - "lru-cache": "^4.1.1", - "mississippi": "^1.2.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^3.0.1", - "ssri": "^5.0.0" + "agentkeepalive": "3.3.0", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "1.3.1", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.3.0" }, "dependencies": { "agentkeepalive": { "version": "3.3.0", "bundled": true, "requires": { - "humanize-ms": "^1.2.1" + "humanize-ms": "1.2.1" }, "dependencies": { "humanize-ms": { "version": "1.2.1", "bundled": true, "requires": { - "ms": "^2.0.0" + "ms": "2.1.1" }, "dependencies": { "ms": { @@ -7942,45 +8598,45 @@ "version": "10.0.4", "bundled": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" }, "dependencies": { "mississippi": { "version": "2.0.0", "bundled": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.2", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" }, "dependencies": { "concat-stream": { "version": "1.6.2", "bundled": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "buffer-from": { @@ -7997,10 +8653,10 @@ "version": "3.5.4", "bundled": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -8013,32 +8669,32 @@ "version": "1.4.1", "bundled": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "flush-write-stream": { "version": "1.0.3", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "from2": { "version": "2.3.0", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "parallel-transform": { "version": "1.1.0", "bundled": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "cyclist": { @@ -8051,25 +8707,25 @@ "version": "2.0.1", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { "version": "1.4.0", "bundled": true, "requires": { - "duplexify": "^3.5.3", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" } }, "stream-each": { "version": "1.2.2", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -8082,8 +8738,8 @@ "version": "2.0.3", "bundled": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" }, "dependencies": { "xtend": { @@ -8108,7 +8764,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "agent-base": "4", + "agent-base": "4.2.0", "debug": "3.1.0" }, "dependencies": { @@ -8116,14 +8772,14 @@ "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -8153,22 +8809,22 @@ "version": "2.2.1", "bundled": true, "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "4.2.0", + "debug": "3.1.0" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -8198,25 +8854,25 @@ "version": "1.3.1", "bundled": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^1.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" }, "dependencies": { "concat-stream": { "version": "1.6.0", "bundled": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "typedarray": { @@ -8229,10 +8885,10 @@ "version": "3.5.3", "bundled": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -8245,32 +8901,32 @@ "version": "1.4.1", "bundled": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "flush-write-stream": { "version": "1.0.2", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "from2": { "version": "2.3.0", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "parallel-transform": { "version": "1.1.0", "bundled": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "cyclist": { @@ -8283,25 +8939,25 @@ "version": "1.0.3", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { "version": "1.4.0", "bundled": true, "requires": { - "duplexify": "^3.5.3", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" }, "dependencies": { "pump": { "version": "2.0.1", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } } } @@ -8310,8 +8966,8 @@ "version": "1.2.2", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -8324,8 +8980,8 @@ "version": "2.0.3", "bundled": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" }, "dependencies": { "xtend": { @@ -8340,16 +8996,16 @@ "version": "2.0.2", "bundled": true, "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.1", + "safe-buffer": "5.1.2" }, "dependencies": { "encoding": { "version": "0.1.12", "bundled": true, "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.19" }, "dependencies": { "iconv-lite": { @@ -8368,8 +9024,8 @@ "version": "1.1.1", "bundled": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "err-code": "1.1.2", + "retry": "0.10.1" }, "dependencies": { "err-code": { @@ -8386,22 +9042,22 @@ "version": "3.0.1", "bundled": true, "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" + "agent-base": "4.2.0", + "socks": "1.1.10" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -8416,8 +9072,8 @@ "version": "1.1.10", "bundled": true, "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" + "ip": "1.1.5", + "smart-buffer": "1.1.15" }, "dependencies": { "ip": { @@ -8436,7 +9092,7 @@ "version": "5.3.0", "bundled": true, "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } } } @@ -8447,27 +9103,27 @@ "version": "8.5.1", "bundled": true, "requires": { - "concat-stream": "^1.5.2", - "graceful-fs": "^4.1.6", - "normalize-package-data": "~1.0.1 || ^2.0.0", - "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "npmlog": "2 || ^3.1.0 || ^4.0.0", - "once": "^1.3.3", - "request": "^2.74.0", - "retry": "^0.10.0", - "safe-buffer": "^5.1.1", - "semver": "2 >=2.2.1 || 3.x || 4 || 5", - "slide": "^1.1.3", - "ssri": "^5.2.4" + "concat-stream": "1.6.1", + "graceful-fs": "4.1.11", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.1.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "request": "2.86.0", + "retry": "0.10.1", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "slide": "1.1.6", + "ssri": "5.3.0" }, "dependencies": { "concat-stream": { "version": "1.6.1", "bundled": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "typedarray": { @@ -8484,7 +9140,7 @@ "version": "5.3.0", "bundled": true, "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } } } @@ -8493,12 +9149,12 @@ "version": "1.1.0", "bundled": true, "requires": { - "bluebird": "^3.5.1", - "figgy-pudding": "^2.0.1", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^3.0.0", - "npm-package-arg": "^6.0.0", - "safe-buffer": "^5.1.1" + "bluebird": "3.5.1", + "figgy-pudding": "2.0.1", + "lru-cache": "4.1.3", + "make-fetch-happen": "3.0.0", + "npm-package-arg": "6.1.0", + "safe-buffer": "5.1.2" }, "dependencies": { "figgy-pudding": { @@ -8509,31 +9165,31 @@ "version": "3.0.0", "bundled": true, "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^10.0.4", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.0", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^3.0.1", - "ssri": "^5.2.4" + "agentkeepalive": "3.4.1", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.3.0" }, "dependencies": { "agentkeepalive": { "version": "3.4.1", "bundled": true, "requires": { - "humanize-ms": "^1.2.1" + "humanize-ms": "1.2.1" }, "dependencies": { "humanize-ms": { "version": "1.2.1", "bundled": true, "requires": { - "ms": "^2.0.0" + "ms": "2.1.1" }, "dependencies": { "ms": { @@ -8548,45 +9204,45 @@ "version": "10.0.4", "bundled": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" }, "dependencies": { "mississippi": { "version": "2.0.0", "bundled": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.2", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" }, "dependencies": { "concat-stream": { "version": "1.6.2", "bundled": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "buffer-from": { @@ -8603,10 +9259,10 @@ "version": "3.5.4", "bundled": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -8619,32 +9275,32 @@ "version": "1.4.1", "bundled": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "flush-write-stream": { "version": "1.0.3", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "from2": { "version": "2.3.0", "bundled": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "parallel-transform": { "version": "1.1.0", "bundled": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "cyclist": { @@ -8657,25 +9313,25 @@ "version": "2.0.1", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { "version": "1.4.0", "bundled": true, "requires": { - "duplexify": "^3.5.3", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" } }, "stream-each": { "version": "1.2.2", "bundled": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -8688,8 +9344,8 @@ "version": "2.0.3", "bundled": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" }, "dependencies": { "xtend": { @@ -8714,7 +9370,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "agent-base": "4", + "agent-base": "4.2.0", "debug": "3.1.0" }, "dependencies": { @@ -8722,14 +9378,14 @@ "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -8759,22 +9415,22 @@ "version": "2.2.1", "bundled": true, "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "4.2.0", + "debug": "3.1.0" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -8804,23 +9460,23 @@ "version": "2.0.2", "bundled": true, "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.2", + "safe-buffer": "5.1.2" }, "dependencies": { "encoding": { "version": "0.1.12", "bundled": true, "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.21" }, "dependencies": { "iconv-lite": { "version": "0.4.21", "bundled": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": "2.1.2" }, "dependencies": { "safer-buffer": { @@ -8837,8 +9493,8 @@ "version": "1.1.1", "bundled": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "err-code": "1.1.2", + "retry": "0.10.1" }, "dependencies": { "err-code": { @@ -8855,22 +9511,22 @@ "version": "3.0.1", "bundled": true, "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" + "agent-base": "4.2.0", + "socks": "1.1.10" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -8885,8 +9541,8 @@ "version": "1.1.10", "bundled": true, "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" + "ip": "1.1.5", + "smart-buffer": "1.1.15" }, "dependencies": { "ip": { @@ -8905,7 +9561,7 @@ "version": "5.3.0", "bundled": true, "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } } } @@ -8920,18 +9576,18 @@ "version": "4.1.2", "bundled": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" }, "dependencies": { "are-we-there-yet": { "version": "1.1.4", "bundled": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" }, "dependencies": { "delegates": { @@ -8948,14 +9604,14 @@ "version": "2.7.4", "bundled": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" }, "dependencies": { "object-assign": { @@ -8970,9 +9626,9 @@ "version": "1.0.2", "bundled": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" }, "dependencies": { "code-point-at": { @@ -8983,7 +9639,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" }, "dependencies": { "number-is-nan": { @@ -8998,7 +9654,7 @@ "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -9011,7 +9667,7 @@ "version": "1.1.2", "bundled": true, "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" } } } @@ -9026,7 +9682,7 @@ "version": "1.4.0", "bundled": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "opener": { @@ -9037,8 +9693,8 @@ "version": "0.1.5", "bundled": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" }, "dependencies": { "os-homedir": { @@ -9055,31 +9711,31 @@ "version": "8.1.5", "bundled": true, "requires": { - "bluebird": "^3.5.1", - "cacache": "^11.0.2", - "get-stream": "^3.0.0", - "glob": "^7.1.2", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", - "minimatch": "^3.0.4", - "minipass": "^2.3.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "ssri": "^6.0.0", + "bluebird": "3.5.1", + "cacache": "11.0.2", + "get-stream": "3.0.0", + "glob": "7.1.2", + "lru-cache": "4.1.3", + "make-fetch-happen": "4.0.1", + "minimatch": "3.0.4", + "minipass": "2.3.3", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.1.0", + "npm-packlist": "1.1.10", + "npm-pick-manifest": "2.1.0", + "osenv": "0.1.5", + "promise-inflight": "1.0.1", + "promise-retry": "1.1.1", + "protoduck": "5.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "ssri": "6.0.0", "tar": "4.4.1", - "unique-filename": "^1.1.0", - "which": "^1.3.0" + "unique-filename": "1.1.0", + "which": "1.3.0" }, "dependencies": { "get-stream": { @@ -9090,31 +9746,31 @@ "version": "4.0.1", "bundled": true, "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "agentkeepalive": "3.4.1", + "cacache": "11.0.2", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "4.0.1", + "ssri": "6.0.0" }, "dependencies": { "agentkeepalive": { "version": "3.4.1", "bundled": true, "requires": { - "humanize-ms": "^1.2.1" + "humanize-ms": "1.2.1" }, "dependencies": { "humanize-ms": { "version": "1.2.1", "bundled": true, "requires": { - "ms": "^2.0.0" + "ms": "2.1.1" }, "dependencies": { "ms": { @@ -9133,7 +9789,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "agent-base": "4", + "agent-base": "4.2.0", "debug": "3.1.0" }, "dependencies": { @@ -9141,14 +9797,14 @@ "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -9178,22 +9834,22 @@ "version": "2.2.1", "bundled": true, "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "4.2.0", + "debug": "3.1.0" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -9223,23 +9879,23 @@ "version": "2.0.2", "bundled": true, "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.2", + "safe-buffer": "5.1.2" }, "dependencies": { "encoding": { "version": "0.1.12", "bundled": true, "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.23" }, "dependencies": { "iconv-lite": { "version": "0.4.23", "bundled": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" }, "dependencies": { "safer-buffer": { @@ -9256,22 +9912,22 @@ "version": "4.0.1", "bundled": true, "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" + "agent-base": "4.2.0", + "socks": "2.2.0" }, "dependencies": { "agent-base": { "version": "4.2.0", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" }, "dependencies": { "es6-promisify": { "version": "5.0.0", "bundled": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" }, "dependencies": { "es6-promise": { @@ -9286,8 +9942,8 @@ "version": "2.2.0", "bundled": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.0.1" + "ip": "1.1.5", + "smart-buffer": "4.0.1" }, "dependencies": { "ip": { @@ -9308,14 +9964,14 @@ "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" }, "dependencies": { "brace-expansion": { "version": "1.1.11", "bundled": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -9335,8 +9991,8 @@ "version": "2.3.3", "bundled": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "safe-buffer": "5.1.2", + "yallist": "3.0.2" }, "dependencies": { "yallist": { @@ -9349,8 +10005,8 @@ "version": "1.1.1", "bundled": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "err-code": "1.1.2", + "retry": "0.10.1" }, "dependencies": { "err-code": { @@ -9367,7 +10023,7 @@ "version": "5.0.0", "bundled": true, "requires": { - "genfun": "^4.0.1" + "genfun": "4.0.1" }, "dependencies": { "genfun": { @@ -9394,8 +10050,8 @@ "version": "6.1.0", "bundled": true, "requires": { - "decode-uri-component": "^0.2.0", - "strict-uri-encode": "^2.0.0" + "decode-uri-component": "0.2.0", + "strict-uri-encode": "2.0.0" }, "dependencies": { "decode-uri-component": { @@ -9416,7 +10072,7 @@ "version": "1.0.7", "bundled": true, "requires": { - "mute-stream": "~0.0.4" + "mute-stream": "0.0.7" }, "dependencies": { "mute-stream": { @@ -9429,20 +10085,20 @@ "version": "1.0.1", "bundled": true, "requires": { - "graceful-fs": "^4.1.2" + "graceful-fs": "4.1.11" } }, "read-installed": { "version": "4.0.3", "bundled": true, "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" + "debuglog": "1.0.1", + "graceful-fs": "4.1.11", + "read-package-json": "2.0.13", + "readdir-scoped-modules": "1.0.2", + "semver": "5.5.0", + "slide": "1.1.6", + "util-extend": "1.0.3" }, "dependencies": { "util-extend": { @@ -9455,11 +10111,11 @@ "version": "2.0.13", "bundled": true, "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "json-parse-better-errors": "1.0.1", + "normalize-package-data": "2.4.0", + "slash": "1.0.0" }, "dependencies": { "json-parse-better-errors": { @@ -9476,24 +10132,24 @@ "version": "5.2.1", "bundled": true, "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "once": "^1.3.0", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0" + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "once": "1.4.0", + "read-package-json": "2.0.13", + "readdir-scoped-modules": "1.0.2" } }, "readable-stream": { "version": "2.3.6", "bundled": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" }, "dependencies": { "core-util-is": { @@ -9512,7 +10168,7 @@ "version": "1.1.1", "bundled": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "util-deprecate": { @@ -9525,37 +10181,37 @@ "version": "1.0.2", "bundled": true, "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "graceful-fs": "4.1.11", + "once": "1.4.0" } }, "request": { "version": "2.86.0", "bundled": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "hawk": "~6.0.2", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" }, "dependencies": { "aws-sign2": { @@ -9574,7 +10230,7 @@ "version": "1.0.6", "bundled": true, "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" }, "dependencies": { "delayed-stream": { @@ -9595,9 +10251,9 @@ "version": "2.3.2", "bundled": true, "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.18" }, "dependencies": { "asynckit": { @@ -9610,18 +10266,18 @@ "version": "5.0.3", "bundled": true, "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" }, "dependencies": { "ajv": { "version": "5.5.2", "bundled": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" }, "dependencies": { "co": { @@ -9652,31 +10308,31 @@ "version": "6.0.2", "bundled": true, "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" }, "dependencies": { "boom": { "version": "4.3.1", "bundled": true, "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" } }, "cryptiles": { "version": "3.1.2", "bundled": true, "requires": { - "boom": "5.x.x" + "boom": "5.2.0" }, "dependencies": { "boom": { "version": "5.2.0", "bundled": true, "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" } } } @@ -9689,7 +10345,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" } } } @@ -9698,9 +10354,9 @@ "version": "1.2.0", "bundled": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" }, "dependencies": { "assert-plus": { @@ -9729,9 +10385,9 @@ "version": "1.10.0", "bundled": true, "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" }, "dependencies": { "core-util-is": { @@ -9746,14 +10402,14 @@ "version": "1.14.1", "bundled": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" }, "dependencies": { "asn1": { @@ -9765,14 +10421,14 @@ "bundled": true, "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "dashdash": { "version": "1.14.1", "bundled": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "ecc-jsbn": { @@ -9780,14 +10436,14 @@ "bundled": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "getpass": { "version": "0.1.7", "bundled": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "jsbn": { @@ -9820,7 +10476,7 @@ "version": "2.1.18", "bundled": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" }, "dependencies": { "mime-db": { @@ -9845,7 +10501,7 @@ "version": "2.3.4", "bundled": true, "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" }, "dependencies": { "punycode": { @@ -9858,7 +10514,7 @@ "version": "0.6.0", "bundled": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } } } @@ -9871,7 +10527,7 @@ "version": "2.6.2", "bundled": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-buffer": { @@ -9886,8 +10542,8 @@ "version": "2.0.1", "bundled": true, "requires": { - "graceful-fs": "^4.1.2", - "readable-stream": "^2.0.2" + "graceful-fs": "4.1.11", + "readable-stream": "2.3.6" } }, "slide": { @@ -9902,26 +10558,26 @@ "version": "2.1.3", "bundled": true, "requires": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" + "from2": "1.3.0", + "stream-iterate": "1.2.0" }, "dependencies": { "from2": { "version": "1.3.0", "bundled": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" + "inherits": "2.0.3", + "readable-stream": "1.1.14" }, "dependencies": { "readable-stream": { "version": "1.1.14", "bundled": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" }, "dependencies": { "core-util-is": { @@ -9944,8 +10600,8 @@ "version": "1.2.0", "bundled": true, "requires": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "stream-shift": { @@ -9964,7 +10620,7 @@ "version": "4.0.0", "bundled": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" }, "dependencies": { "ansi-regex": { @@ -9977,35 +10633,35 @@ "version": "4.4.1", "bundled": true, "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.3.1", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.2" }, "dependencies": { "fs-minipass": { "version": "1.2.5", "bundled": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.1" } }, "minipass": { "version": "2.3.1", "bundled": true, "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" + "safe-buffer": "5.1.2", + "yallist": "3.0.2" } }, "minizlib": { "version": "1.1.0", "bundled": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.1" } }, "yallist": { @@ -10034,14 +10690,14 @@ "version": "1.1.0", "bundled": true, "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "2.0.0" }, "dependencies": { "unique-slug": { "version": "2.0.0", "bundled": true, "requires": { - "imurmurhash": "^0.1.4" + "imurmurhash": "0.1.4" } } } @@ -10054,36 +10710,36 @@ "version": "2.5.0", "bundled": true, "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" }, "dependencies": { "boxen": { "version": "1.3.0", "bundled": true, "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" }, "dependencies": { "ansi-align": { "version": "2.0.0", "bundled": true, "requires": { - "string-width": "^2.0.0" + "string-width": "2.1.1" } }, "camelcase": { @@ -10098,8 +10754,8 @@ "version": "2.1.1", "bundled": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -10112,36 +10768,36 @@ "version": "1.2.0", "bundled": true, "requires": { - "execa": "^0.7.0" + "execa": "0.7.0" }, "dependencies": { "execa": { "version": "0.7.0", "bundled": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" }, "dependencies": { "cross-spawn": { "version": "5.1.0", "bundled": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.0" }, "dependencies": { "shebang-command": { "version": "1.2.0", "bundled": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" }, "dependencies": { "shebang-regex": { @@ -10164,7 +10820,7 @@ "version": "2.0.2", "bundled": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" }, "dependencies": { "path-key": { @@ -10193,7 +10849,7 @@ "version": "2.0.0", "bundled": true, "requires": { - "string-width": "^2.1.1" + "string-width": "2.1.1" } } } @@ -10202,23 +10858,23 @@ "version": "2.4.1", "bundled": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "bundled": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.1" }, "dependencies": { "color-convert": { "version": "1.9.1", "bundled": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" }, "dependencies": { "color-name": { @@ -10237,7 +10893,7 @@ "version": "5.4.0", "bundled": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" }, "dependencies": { "has-flag": { @@ -10252,19 +10908,19 @@ "version": "3.1.2", "bundled": true, "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" }, "dependencies": { "dot-prop": { "version": "4.2.0", "bundled": true, "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" }, "dependencies": { "is-obj": { @@ -10277,7 +10933,7 @@ "version": "1.2.0", "bundled": true, "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" }, "dependencies": { "pify": { @@ -10290,7 +10946,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "1.0.0" }, "dependencies": { "crypto-random-string": { @@ -10309,7 +10965,7 @@ "version": "1.1.0", "bundled": true, "requires": { - "ci-info": "^1.0.0" + "ci-info": "1.1.3" }, "dependencies": { "ci-info": { @@ -10322,22 +10978,22 @@ "version": "0.1.0", "bundled": true, "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" }, "dependencies": { "global-dirs": { "version": "0.1.1", "bundled": true, "requires": { - "ini": "^1.3.4" + "ini": "1.3.5" } }, "is-path-inside": { "version": "1.0.1", "bundled": true, "requires": { - "path-is-inside": "^1.0.1" + "path-is-inside": "1.0.2" } } } @@ -10350,41 +11006,41 @@ "version": "3.1.0", "bundled": true, "requires": { - "package-json": "^4.0.0" + "package-json": "4.0.1" }, "dependencies": { "package-json": { "version": "4.0.1", "bundled": true, "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" }, "dependencies": { "got": { "version": "6.7.1", "bundled": true, "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" }, "dependencies": { "create-error-class": { "version": "3.0.2", "bundled": true, "requires": { - "capture-stack-trace": "^1.0.0" + "capture-stack-trace": "1.0.0" }, "dependencies": { "capture-stack-trace": { @@ -10429,7 +11085,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "1.0.4" }, "dependencies": { "prepend-http": { @@ -10444,18 +11100,18 @@ "version": "3.3.2", "bundled": true, "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "1.2.7", + "safe-buffer": "5.1.2" }, "dependencies": { "rc": { "version": "1.2.7", "bundled": true, "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "deep-extend": { @@ -10478,17 +11134,17 @@ "version": "3.1.0", "bundled": true, "requires": { - "rc": "^1.0.1" + "rc": "1.2.7" }, "dependencies": { "rc": { "version": "1.2.7", "bundled": true, "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "deep-extend": { @@ -10515,7 +11171,7 @@ "version": "2.1.0", "bundled": true, "requires": { - "semver": "^5.0.3" + "semver": "5.5.0" } }, "xdg-basedir": { @@ -10532,16 +11188,16 @@ "version": "3.0.3", "bundled": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" }, "dependencies": { "spdx-correct": { "version": "3.0.0", "bundled": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" }, "dependencies": { "spdx-license-ids": { @@ -10554,8 +11210,8 @@ "version": "3.0.0", "bundled": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" }, "dependencies": { "spdx-exceptions": { @@ -10574,7 +11230,7 @@ "version": "3.0.0", "bundled": true, "requires": { - "builtins": "^1.0.3" + "builtins": "1.0.3" }, "dependencies": { "builtins": { @@ -10587,7 +11243,7 @@ "version": "1.3.0", "bundled": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" }, "dependencies": { "isexe": { @@ -10600,14 +11256,14 @@ "version": "1.6.0", "bundled": true, "requires": { - "errno": "~0.1.7" + "errno": "0.1.7" }, "dependencies": { "errno": { "version": "0.1.7", "bundled": true, "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" }, "dependencies": { "prr": { @@ -10626,9 +11282,9 @@ "version": "2.3.0", "bundled": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" }, "dependencies": { "signal-exit": { @@ -10645,7 +11301,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "npmlog": { @@ -10653,10 +11309,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -10675,9 +11331,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -10686,7 +11342,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -10697,7 +11353,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -10714,8 +11370,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" } }, "object.pick": { @@ -10724,7 +11380,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -10740,7 +11396,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "onetime": { @@ -10749,7 +11405,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.1.0" } }, "ora": { @@ -10758,10 +11414,10 @@ "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "dev": true, "requires": { - "chalk": "^1.1.1", - "cli-cursor": "^1.0.2", - "cli-spinners": "^0.1.2", - "object-assign": "^4.0.1" + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-spinners": "0.1.2", + "object-assign": "4.1.1" }, "dependencies": { "cli-cursor": { @@ -10770,7 +11426,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "onetime": { @@ -10785,8 +11441,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } } } @@ -10797,6 +11453,12 @@ "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", "dev": true }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -10808,7 +11470,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "^1.0.0" + "lcid": "1.0.0" } }, "os-tmpdir": { @@ -10829,7 +11491,7 @@ "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, "requires": { - "p-reduce": "^1.0.0" + "p-reduce": "1.0.0" } }, "p-finally": { @@ -10862,7 +11524,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.1.0" } }, "p-map": { @@ -10883,7 +11545,75 @@ "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, "requires": { - "p-finally": "^1.0.0" + "p-finally": "1.0.0" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.0.6", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.2", + "pbkdf2": "3.0.16" } }, "parse-glob": { @@ -10892,10 +11622,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" } }, "parse-json": { @@ -10904,7 +11634,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.1" } }, "parse-passwd": { @@ -10919,6 +11649,12 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -10931,7 +11667,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "path-is-absolute": { @@ -10958,9 +11694,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pathval": { @@ -10969,6 +11705,19 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.8" + } + }, "pegjs": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", @@ -10993,7 +11742,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -11002,7 +11751,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "2.1.0" }, "dependencies": { "find-up": { @@ -11011,7 +11760,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } } } @@ -11027,19 +11776,19 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.2.2.tgz", "integrity": "sha512-F46pcvDxtQhbV3B+dm+exHuKxIyJK26fVNiJRmbTW/5D7o0Z2yzc8CKeu7UWbo9XxQZoVOC88aKgySAsza+cWw==", "requires": { - "expand-template": "^1.0.2", + "expand-template": "1.1.0", "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "node-abi": "^2.0.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "os-homedir": "^1.0.1", - "pump": "^1.0.1", - "rc": "^1.1.6", - "simple-get": "^1.4.2", - "tar-fs": "^1.13.0", - "tunnel-agent": "^0.6.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "node-abi": "2.1.0", + "noop-logger": "0.1.1", + "npmlog": "4.1.2", + "os-homedir": "1.0.2", + "pump": "1.0.2", + "rc": "1.2.8", + "simple-get": "1.4.3", + "tar-fs": "1.15.3", + "tunnel-agent": "0.6.0", "xtend": "4.0.1" }, "dependencies": { @@ -11074,11 +11823,23 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -11091,13 +11852,49 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" + } + }, "pump": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "3.6.0", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + } } }, "punycode": { @@ -11112,9 +11909,40 @@ "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.1" } }, "rc": { @@ -11122,10 +11950,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.6.0", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "deep-extend": { @@ -11146,8 +11974,8 @@ "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", "dev": true, "requires": { - "pify": "^3.0.0", - "safe-buffer": "^5.1.1" + "pify": "3.0.0", + "safe-buffer": "5.1.1" }, "dependencies": { "pify": { @@ -11164,9 +11992,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -11175,8 +12003,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" } }, "readable-stream": { @@ -11185,10 +12013,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "readdirp": { @@ -11197,10 +12025,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" }, "dependencies": { "isarray": { @@ -11215,13 +12043,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -11230,7 +12058,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -11241,7 +12069,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "^1.1.6" + "resolve": "1.5.0" } }, "regenerate": { @@ -11262,9 +12090,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" } }, "regex-cache": { @@ -11273,7 +12101,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "regex-not": { @@ -11282,8 +12110,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "regexpu-core": { @@ -11292,9 +12120,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, "regjsgen": { @@ -11309,7 +12137,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" } }, "remove-trailing-separator": { @@ -11336,7 +12164,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.0.2" } }, "replace-ext": { @@ -11369,7 +12197,7 @@ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.5" } }, "resolve-cwd": { @@ -11378,7 +12206,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "3.0.0" } }, "resolve-dir": { @@ -11387,8 +12215,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" } }, "resolve-from": { @@ -11409,7 +12237,7 @@ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "requires": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "1.0.1" } }, "restore-cursor": { @@ -11418,8 +12246,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "onetime": "2.0.1", + "signal-exit": "3.0.2" } }, "ret": { @@ -11434,7 +12262,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "ripemd160": { @@ -11442,8 +12270,8 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "requires": { - "hash-base": "^2.0.0", - "inherits": "^2.0.1" + "hash-base": "2.0.2", + "inherits": "2.0.3" } }, "rlp": { @@ -11457,7 +12285,16 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "^2.1.0" + "is-promise": "2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.1.2" } }, "rxjs": { @@ -11480,7 +12317,17 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" + } + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "6.4.0", + "ajv-keywords": "3.2.0" } }, "scoped-regex": { @@ -11494,15 +12341,15 @@ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.0.tgz", "integrity": "sha512-CbrQoeGG5V0kQ1ohEMGI+J7oKerapLTpivLICBaXR0R4HyQcN3kM9itLsV5fdpV1UR1bD14tOkJ1xughmlDIiQ==", "requires": { - "bindings": "^1.2.1", - "bip66": "^1.1.3", - "bn.js": "^4.11.3", - "create-hash": "^1.1.2", - "drbg.js": "^1.0.1", - "elliptic": "^6.2.3", - "nan": "^2.2.1", - "prebuild-install": "^2.0.0", - "safe-buffer": "^5.1.0" + "bindings": "1.3.0", + "bip66": "1.1.5", + "bn.js": "4.11.8", + "create-hash": "1.1.3", + "drbg.js": "1.0.1", + "elliptic": "6.4.0", + "nan": "git+https://github.com/nodejs/nan.git#77d0fcaba3305d05176a9ad95d8e5101e8f2a283", + "prebuild-install": "2.2.2", + "safe-buffer": "5.1.1" } }, "semver": { @@ -11511,6 +12358,12 @@ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", "dev": true }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -11528,10 +12381,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -11540,17 +12393,23 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, "sha.js": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", "requires": { - "inherits": "^2.0.1" + "inherits": "2.0.3" } }, "sha3": { @@ -11558,7 +12417,7 @@ "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", "requires": { - "nan": "^2.0.5" + "nan": "git+https://github.com/nodejs/nan.git#77d0fcaba3305d05176a9ad95d8e5101e8f2a283" } }, "shebang-command": { @@ -11567,7 +12426,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -11582,9 +12441,9 @@ "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" } }, "signal-exit": { @@ -11597,9 +12456,9 @@ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", "requires": { - "once": "^1.3.1", - "unzip-response": "^1.0.0", - "xtend": "^4.0.0" + "once": "1.4.0", + "unzip-response": "1.0.2", + "xtend": "4.0.1" } }, "slash": { @@ -11626,14 +12485,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" }, "dependencies": { "define-property": { @@ -11642,7 +12501,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -11651,7 +12510,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "source-map": { @@ -11668,9 +12527,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -11679,7 +12538,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -11688,7 +12547,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -11697,7 +12556,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -11706,9 +12565,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -11731,7 +12590,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" } }, "sol-digger": { @@ -11752,11 +12611,11 @@ "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", "dev": true, "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" + "fs-extra": "0.30.0", + "memorystream": "0.3.1", + "require-from-string": "1.2.1", + "semver": "5.4.1", + "yargs": "4.8.1" } }, "solium": { @@ -11765,17 +12624,17 @@ "integrity": "sha512-yYbalsrzJCU+QJ0HZvxAT4IQIqI1e6KPW2vop0NaHwdijqhQC9fJkVioCrL18NbO2Z8rdcnx8Y0JpvYJWrIjRg==", "dev": true, "requires": { - "ajv": "^5.2.2", - "chokidar": "^1.6.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.14.2", + "ajv": "5.5.2", + "chokidar": "1.7.0", + "colors": "1.2.1", + "commander": "2.11.0", + "js-string-escape": "1.0.1", + "lodash": "4.17.5", "sol-digger": "0.0.2", "sol-explore": "1.6.1", "solium-plugin-security": "0.1.1", "solparse": "2.2.5", - "text-table": "^0.2.0" + "text-table": "0.2.0" }, "dependencies": { "ajv": { @@ -11784,10 +12643,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } } } @@ -11804,9 +12663,9 @@ "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", "dev": true, "requires": { - "mocha": "^4.0.1", - "pegjs": "^0.10.0", - "yargs": "^10.0.3" + "mocha": "4.1.0", + "pegjs": "0.10.0", + "yargs": "10.1.2" }, "dependencies": { "ansi-regex": { @@ -11815,6 +12674,12 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -11827,9 +12692,18 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" } }, "find-up": { @@ -11838,24 +12712,48 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "string-width": { @@ -11864,8 +12762,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -11874,7 +12772,16 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" } }, "which-module": { @@ -11889,18 +12796,18 @@ "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" } }, "yargs-parser": { @@ -11909,7 +12816,7 @@ "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -11920,9 +12827,15 @@ "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "dev": true, "requires": { - "is-plain-obj": "^1.0.0" + "is-plain-obj": "1.1.0" } }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -11935,11 +12848,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-support": { @@ -11948,7 +12861,7 @@ "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", "dev": true, "requires": { - "source-map": "^0.6.0" + "source-map": "0.6.1" } }, "source-map-url": { @@ -11963,7 +12876,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "^1.0.2" + "spdx-license-ids": "1.2.2" } }, "spdx-expression-parse": { @@ -11984,7 +12897,16 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" } }, "static-extend": { @@ -11993,8 +12915,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -12003,31 +12925,146 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -12041,7 +13078,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -12050,7 +13087,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } }, "strip-bom-stream": { @@ -12059,8 +13096,8 @@ "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", "dev": true, "requires": { - "first-chunk-stream": "^2.0.0", - "strip-bom": "^2.0.0" + "first-chunk-stream": "2.0.0", + "strip-bom": "2.0.0" } }, "strip-eof": { @@ -12105,10 +13142,10 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.3.tgz", "integrity": "sha1-7M+TXpQUk9gVECjmNuUc5MPKfyA=", "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" + "chownr": "1.0.1", + "mkdirp": "0.5.1", + "pump": "1.0.2", + "tar-stream": "1.5.4" } }, "tar-stream": { @@ -12116,10 +13153,10 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", "requires": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" + "bl": "1.2.1", + "end-of-stream": "1.4.0", + "readable-stream": "2.3.3", + "xtend": "4.0.1" }, "dependencies": { "isarray": { @@ -12132,13 +13169,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -12146,7 +13183,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -12157,8 +13194,8 @@ "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", "dev": true, "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" + "os-tmpdir": "1.0.2", + "rimraf": "2.2.8" }, "dependencies": { "rimraf": { @@ -12193,8 +13230,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.3", + "xtend": "4.0.1" }, "dependencies": { "isarray": { @@ -12209,13 +13246,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -12224,7 +13261,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -12235,15 +13272,30 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "os-tmpdir": "1.0.2" } }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -12256,7 +13308,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "to-regex": { @@ -12265,10 +13317,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -12277,8 +13329,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" }, "dependencies": { "is-number": { @@ -12287,7 +13339,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } } } @@ -12304,9 +13356,59 @@ "integrity": "sha512-VNhc6jexZeM92sNJJr4U8ln3uJ/mJEQO/0y9ZLYc4pccyIskPtl+3r4mzymgGM/Mq5v6MpoQVD6NZgHUVKX+Dw==", "dev": true, "requires": { - "mocha": "^4.1.0", - "original-require": "^1.0.1", + "mocha": "4.1.0", + "original-require": "1.0.1", "solc": "0.4.24" + }, + "dependencies": { + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } } }, "tslib": { @@ -12321,17 +13423,17 @@ "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.1.0", - "commander": "^2.9.0", - "diff": "^3.2.0", - "glob": "^7.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.7.1", - "tsutils": "^2.12.1" + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.3.0", + "commander": "2.11.0", + "diff": "3.3.1", + "glob": "7.1.2", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.4.1", + "tslib": "1.8.0", + "tsutils": "2.12.2" }, "dependencies": { "ansi-styles": { @@ -12340,290 +13442,1581 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "tsutils": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.12.2.tgz", + "integrity": "sha1-rVikhl0X7D3bZjG2ylO+FKVlb/M=", + "dev": true, + "requires": { + "tslib": "1.8.0" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", + "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.5", + "serialize-javascript": "1.5.0", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.1.0", + "worker-farm": "1.6.0" + } + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "untildify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", + "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", + "dev": true + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0", + "strip-bom-stream": "2.0.0", + "vinyl": "1.2.0" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "2.0.4", + "graceful-fs": "4.1.11", + "neo-async": "2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.1.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "git+https://github.com/nodejs/nan.git#77d0fcaba3305d05176a9ad95d8e5101e8f2a283", + "node-pre-gyp": "0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "web3": { + "version": "0.20.6", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", + "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", + "requires": { + "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "crypto-js": "3.1.8", + "utf8": "2.1.2", + "xhr2": "0.1.4", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + } + } + }, + "web3-typescript-typings": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/web3-typescript-typings/-/web3-typescript-typings-0.10.2.tgz", + "integrity": "sha1-qZA4FdKooNvXP9XbN0Bw3gvTBJc=", + "dev": true, + "requires": { + "bignumber.js": "4.1.0" + } + }, + "webpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.0.0.tgz", + "integrity": "sha512-wnEjBERuGrbelfsBJ7QKLuGAEaLNPTGJrLgK8H0p1TPS3pUqvTU4OZKeS1OAd8xBpEkuBrFcyHpXPvi0JZVvkA==", + "dev": true, + "requires": { + "acorn": "5.7.1", + "acorn-dynamic-import": "3.0.0", + "ajv": "6.4.0", + "ajv-keywords": "3.2.0", + "chrome-trace-event": "0.1.3", + "enhanced-resolve": "4.0.0", + "eslint-scope": "3.7.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "neo-async": "2.5.0", + "node-libs-browser": "2.1.0", + "schema-utils": "0.4.5", + "tapable": "1.0.0", + "uglifyjs-webpack-plugin": "1.2.5", + "watchpack": "1.6.0", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "kind-of": "6.0.2" } - } - } - }, - "tsutils": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.12.2.tgz", - "integrity": "sha1-rVikhl0X7D3bZjG2ylO+FKVlb/M=", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", - "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", - "dev": true - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "kind-of": "6.0.2" } }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } - } - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "kind-of": "3.2.2" }, "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "isarray": "1.0.0" + "is-buffer": "1.1.6" } } } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - } - } - }, - "untildify": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", - "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", - "dev": true - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" - }, - "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } } } }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", - "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.3.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^2.0.0", - "vinyl": "^1.1.0" - } - }, - "web3": { - "version": "0.20.6", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", - "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", - "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "crypto-js": "^3.1.4", - "utf8": "^2.1.1", - "xhr2": "*", - "xmlhttprequest": "*" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git" - } - } - }, - "web3-typescript-typings": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/web3-typescript-typings/-/web3-typescript-typings-0.10.2.tgz", - "integrity": "sha1-qZA4FdKooNvXP9XbN0Bw3gvTBJc=", - "dev": true, - "requires": { - "bignumber.js": "~4.1.0" - } - }, "webpack-addons": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", "dev": true, "requires": { - "jscodeshift": "^0.4.0" + "jscodeshift": "0.4.1" }, "dependencies": { "ast-types": { @@ -12644,21 +15037,21 @@ "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", "dev": true, "requires": { - "async": "^1.5.0", - "babel-plugin-transform-flow-strip-types": "^6.8.0", - "babel-preset-es2015": "^6.9.0", - "babel-preset-stage-1": "^6.5.0", - "babel-register": "^6.9.0", - "babylon": "^6.17.3", - "colors": "^1.1.2", - "flow-parser": "^0.*", - "lodash": "^4.13.1", - "micromatch": "^2.3.7", + "async": "1.5.2", + "babel-plugin-transform-flow-strip-types": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-stage-1": "6.24.1", + "babel-register": "6.26.0", + "babylon": "6.18.0", + "colors": "1.2.1", + "flow-parser": "0.69.0", + "lodash": "4.17.5", + "micromatch": "2.3.11", "node-dir": "0.1.8", - "nomnom": "^1.8.1", - "recast": "^0.12.5", - "temp": "^0.8.1", - "write-file-atomic": "^1.2.0" + "nomnom": "1.8.1", + "recast": "0.12.9", + "temp": "0.8.3", + "write-file-atomic": "1.3.4" } }, "recast": { @@ -12668,10 +15061,10 @@ "dev": true, "requires": { "ast-types": "0.10.1", - "core-js": "^2.4.1", - "esprima": "~4.0.0", - "private": "~0.1.5", - "source-map": "~0.6.1" + "core-js": "2.5.4", + "esprima": "4.0.0", + "private": "0.1.8", + "source-map": "0.6.1" } } } @@ -12682,32 +15075,32 @@ "integrity": "sha512-CiWQR+1JS77rmyiO6y1q8Kt/O+e8nUUC9YfJ25JtSmzDwbqJV7vIsh3+QKRHVTbTCa0DaVh8iY1LBiagUIDB3g==", "dev": true, "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "diff": "^3.5.0", - "enhanced-resolve": "^4.0.0", - "envinfo": "^5.7.0", - "glob-all": "^3.1.0", - "global-modules": "^1.0.0", - "got": "^8.3.1", - "import-local": "^1.0.0", - "inquirer": "^5.2.0", - "interpret": "^1.1.0", - "jscodeshift": "^0.5.0", - "listr": "^0.14.1", - "loader-utils": "^1.1.0", - "lodash": "^4.17.10", - "log-symbols": "^2.2.0", - "mkdirp": "^0.5.1", - "p-each-series": "^1.0.0", - "p-lazy": "^1.0.0", - "prettier": "^1.12.1", - "supports-color": "^5.4.0", - "v8-compile-cache": "^2.0.0", - "webpack-addons": "^1.1.5", - "yargs": "^11.1.0", - "yeoman-environment": "^2.1.1", - "yeoman-generator": "^2.0.5" + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "diff": "3.5.0", + "enhanced-resolve": "4.0.0", + "envinfo": "5.10.0", + "glob-all": "3.1.0", + "global-modules": "1.0.0", + "got": "8.3.1", + "import-local": "1.0.0", + "inquirer": "5.2.0", + "interpret": "1.1.0", + "jscodeshift": "0.5.1", + "listr": "0.14.1", + "loader-utils": "1.1.0", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mkdirp": "0.5.1", + "p-each-series": "1.0.0", + "p-lazy": "1.0.0", + "prettier": "1.13.4", + "supports-color": "5.4.0", + "v8-compile-cache": "2.0.0", + "webpack-addons": "1.1.5", + "yargs": "11.1.0", + "yeoman-environment": "2.2.0", + "yeoman-generator": "2.0.5" }, "dependencies": { "ansi-regex": { @@ -12722,7 +15115,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.1" } }, "async": { @@ -12731,7 +15124,7 @@ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "4.17.10" } }, "camelcase": { @@ -12746,9 +15139,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "cliui": { @@ -12757,9 +15150,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" }, "dependencies": { "strip-ansi": { @@ -12768,7 +15161,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -12791,11 +15184,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" } }, "debug": { @@ -12831,8 +15224,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" } }, "find-up": { @@ -12841,7 +15234,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "globby": { @@ -12850,13 +15243,13 @@ "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.2", + "glob": "7.1.2", + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" } }, "got": { @@ -12865,23 +15258,23 @@ "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", "dev": true, "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" + "@sindresorhus/is": "0.7.0", + "cacheable-request": "2.1.4", + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "into-stream": "3.1.0", + "is-retry-allowed": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "mimic-response": "1.0.0", + "p-cancelable": "0.4.1", + "p-timeout": "2.0.1", + "pify": "3.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "url-parse-lax": "3.0.0", + "url-to-options": "1.0.1" } }, "has-flag": { @@ -12902,7 +15295,7 @@ "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", "dev": true, "requires": { - "symbol-observable": "^1.1.0" + "symbol-observable": "1.2.0" } }, "listr": { @@ -12911,22 +15304,22 @@ "integrity": "sha512-MSMUUVN1f8aRnPi4034RkOqdiUlpYW+FqwFE3aL0uYNPRavkt2S2SsSpDDofn8BDpqv2RNnsdOcCHWsChcq77A==", "dev": true, "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "cli-truncate": "^0.2.1", - "figures": "^1.7.0", - "indent-string": "^2.1.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.4.0", - "listr-verbose-renderer": "^0.4.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "ora": "^0.2.3", - "p-map": "^1.1.1", - "rxjs": "^6.1.0", - "strip-ansi": "^3.0.1" + "@samverschueren/stream-to-observable": "0.3.0", + "cli-truncate": "0.2.1", + "figures": "1.7.0", + "indent-string": "2.1.0", + "is-observable": "1.1.0", + "is-promise": "2.1.0", + "is-stream": "1.1.0", + "listr-silent-renderer": "1.1.1", + "listr-update-renderer": "0.4.0", + "listr-verbose-renderer": "0.4.1", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "ora": "0.2.3", + "p-map": "1.2.0", + "rxjs": "6.2.0", + "strip-ansi": "3.0.1" }, "dependencies": { "ansi-styles": { @@ -12941,11 +15334,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "log-symbols": { @@ -12954,7 +15347,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "^1.0.0" + "chalk": "1.1.3" } }, "supports-color": { @@ -12971,10 +15364,10 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" } }, "lodash": { @@ -12989,17 +15382,17 @@ "integrity": "sha512-QHvdXLLNmwJXxKdf7x27aNUren6IoPxwcM8Sfd+S6/ddQQMcYdEtVKsh6ilpqMrU18VQuKZEaH0aCGt3JDbA0g==", "dev": true, "requires": { - "commondir": "^1.0.1", - "deep-extend": "^0.5.1", - "ejs": "^2.5.9", - "glob": "^7.0.3", - "globby": "^8.0.0", - "isbinaryfile": "^3.0.2", - "mkdirp": "^0.5.0", - "multimatch": "^2.0.0", - "rimraf": "^2.2.8", - "through2": "^2.0.0", - "vinyl": "^2.0.1" + "commondir": "1.0.1", + "deep-extend": "0.5.1", + "ejs": "2.6.1", + "glob": "7.1.2", + "globby": "8.0.1", + "isbinaryfile": "3.0.2", + "mkdirp": "0.5.1", + "multimatch": "2.1.0", + "rimraf": "2.6.2", + "through2": "2.0.3", + "vinyl": "2.1.0" } }, "minimist": { @@ -13014,9 +15407,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "parse-json": { @@ -13025,8 +15418,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" } }, "path-type": { @@ -13035,7 +15428,7 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "pify": { @@ -13056,9 +15449,9 @@ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" } }, "read-pkg-up": { @@ -13067,8 +15460,8 @@ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "find-up": "2.1.0", + "read-pkg": "3.0.0" } }, "replace-ext": { @@ -13083,7 +15476,7 @@ "integrity": "sha512-qBzf5uu6eOKiCZuAE0SgZ0/Qp+l54oeVxFfC2t+mJ2SFI6IB8gmMdJHs5DUMu5kqifqcCtsKS2XHjhZu6RKvAw==", "dev": true, "requires": { - "tslib": "^1.9.0" + "tslib": "1.9.2" } }, "semver": { @@ -13098,8 +15491,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "strip-ansi": { @@ -13108,7 +15501,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -13125,7 +15518,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } }, "symbol-observable": { @@ -13152,12 +15545,12 @@ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" } }, "which-module": { @@ -13172,18 +15565,18 @@ "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" } }, "yargs-parser": { @@ -13192,7 +15585,7 @@ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } }, "yeoman-environment": { @@ -13201,21 +15594,21 @@ "integrity": "sha512-gQ+hIW8QRlUo4jGBDCm++qg01SXaIVJ7VyLrtSwk2jQG4vtvluWpsGIl7V8DqT2jGiqukdec0uEyffVEyQgaZA==", "dev": true, "requires": { - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "diff": "^3.3.1", - "escape-string-regexp": "^1.0.2", - "globby": "^8.0.1", - "grouped-queue": "^0.3.3", - "inquirer": "^5.2.0", - "is-scoped": "^1.0.0", - "lodash": "^4.17.10", - "log-symbols": "^2.1.0", - "mem-fs": "^1.1.0", - "strip-ansi": "^4.0.0", - "text-table": "^0.2.0", - "untildify": "^3.0.2" + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "globby": "8.0.1", + "grouped-queue": "0.3.3", + "inquirer": "5.2.0", + "is-scoped": "1.0.0", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mem-fs": "1.1.3", + "strip-ansi": "4.0.0", + "text-table": "0.2.0", + "untildify": "3.0.2" }, "dependencies": { "strip-ansi": { @@ -13224,7 +15617,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -13235,42 +15628,52 @@ "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", "dev": true, "requires": { - "async": "^2.6.0", - "chalk": "^2.3.0", - "cli-table": "^0.3.1", - "cross-spawn": "^6.0.5", - "dargs": "^5.1.0", - "dateformat": "^3.0.3", - "debug": "^3.1.0", - "detect-conflict": "^1.0.0", - "error": "^7.0.2", - "find-up": "^2.1.0", - "github-username": "^4.0.0", - "istextorbinary": "^2.2.1", - "lodash": "^4.17.10", - "make-dir": "^1.1.0", - "mem-fs-editor": "^4.0.0", - "minimist": "^1.2.0", - "pretty-bytes": "^4.0.2", - "read-chunk": "^2.1.0", - "read-pkg-up": "^3.0.0", - "rimraf": "^2.6.2", - "run-async": "^2.0.0", - "shelljs": "^0.8.0", - "text-table": "^0.2.0", - "through2": "^2.0.0", - "yeoman-environment": "^2.0.5" + "async": "2.6.1", + "chalk": "2.4.1", + "cli-table": "0.3.1", + "cross-spawn": "6.0.5", + "dargs": "5.1.0", + "dateformat": "3.0.3", + "debug": "3.1.0", + "detect-conflict": "1.0.1", + "error": "7.0.2", + "find-up": "2.1.0", + "github-username": "4.1.0", + "istextorbinary": "2.2.1", + "lodash": "4.17.10", + "make-dir": "1.2.0", + "mem-fs-editor": "4.0.2", + "minimist": "1.2.0", + "pretty-bytes": "4.0.2", + "read-chunk": "2.1.0", + "read-pkg-up": "3.0.0", + "rimraf": "2.6.2", + "run-async": "2.3.0", + "shelljs": "0.8.1", + "text-table": "0.2.0", + "through2": "2.0.3", + "yeoman-environment": "2.2.0" } } } }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + } + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -13284,7 +15687,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" } }, "window-size": { @@ -13293,14 +15696,23 @@ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", "dev": true }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" } }, "wrappy": { @@ -13314,9 +15726,9 @@ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" } }, "xhr2": { @@ -13352,20 +15764,20 @@ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "lodash.assign": "4.2.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "2.4.1" } }, "yargs-parser": { @@ -13374,8 +15786,8 @@ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dev": true, "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" + "camelcase": "3.0.0", + "lodash.assign": "4.2.0" } } } diff --git a/package.json b/package.json index 64cdb314..d41d352b 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "compile": "rm -rf build/contracts && truffle compile", "migrate": "npm run transpile && truffle migrate", "deploy": "npm run migrate --network kovan", - "testrpc": "ganache-cli" + "testrpc": "ganache-cli", + "truffle": "truffle" }, "license": "ISC", "devDependencies": { @@ -33,12 +34,14 @@ "copyfiles": "^1.2.0", "dirty-chai": "^2.0.1", "ganache-cli": "^6.1.0", + "mocha": "^5.2.0", "solc": "^0.4.24", "solium": "^1.1.7", "truffle": "^4.1.11", "tslint": "5.8.0", "typescript": "2.7.1", - "web3-typescript-typings": "0.10.2" + "web3-typescript-typings": "0.10.2", + "webpack": "^4.0.0" }, "dependencies": { "@types/bitwise-xor": "0.0.30", diff --git a/test/testExchange.ts b/test/testExchange.ts index bf58e25a..9547c248 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -1,11 +1,14 @@ import { BigNumber } from "bignumber.js"; import BN = require("bn.js"); import abi = require("ethereumjs-abi"); +import ethUtil = require("ethereumjs-util"); import * as _ from "lodash"; +import util = require("util"); import { Artifacts } from "../util/artifacts"; +import { Bitstream } from "../util/bitstream"; import { Ring } from "../util/ring"; import { RingsGenerator } from "../util/rings_generator"; -import { RingsSubmitParams } from "../util/types"; +import { RingsInfo } from "../util/types"; const { Exchange, @@ -21,8 +24,6 @@ contract("Exchange", (accounts: string[]) => { let tokenRegistry: any; let tradeDelegate: any; - let ringsGenerator: RingsGenerator; - const assertNumberEqualsWithPrecision = (n1: number, n2: number, precision: number = 8) => { const numStr1 = (n1 / 1e18).toFixed(precision); const numStr2 = (n2 / 1e18).toFixed(precision); @@ -37,6 +38,33 @@ contract("Exchange", (accounts: string[]) => { } }; + const getEventsFromContract = async (contract: any, eventName: string, fromBlock: number) => { + return new Promise((resolve, reject) => { + if (!contract[eventName]) { + throw Error("TypeError: contract[eventName] is not a function: " + eventName); + } + + const events = contract[eventName]({}, { fromBlock, toBlock: "latest" }); + events.watch(); + events.get((error: any, event: any) => { + if (!error) { + resolve(event); + } else { + throw Error("Failed to find filtered event: " + error); + } + }); + events.stopWatching(); + }); + }; + + const watchAndPrintEvent = async (contract: any, eventName: string) => { + const events: any = await getEventsFromContract(contract, eventName, 0); + + events.forEach((e: any) => { + console.log("event:", util.inspect(e.args, false, null)); + }); + }; + before( async () => { [exchange, tokenRegistry, tradeDelegate] = await Promise.all([ Exchange.deployed(), @@ -44,36 +72,66 @@ contract("Exchange", (accounts: string[]) => { TradeDelegate.deployed(), ]); - ringsGenerator = new RingsGenerator(); }); describe("submitRing", () => { - // it("should be able to fill ring with 2 orders", async () => { - // const rings: Ring[] = ringsGenerator.generateRings(); - // const params: RingsSubmitParams = ringsGenerator.toSubmitableParam(rings); - // exchange.submitRings(params.miningSpec, - // params.orderSpecs, - // params.ringSpecs, - // params.addressList, - // params.uintList, - // params.bytesList, - // {from: miner}); - // assert(true); - // }); - - it("bytes test", async () => { - const a = accounts[9]; - const bn = new BigNumber(12345); - const c = 31; - const d = "xxxbbbcc"; - const h = "ccccccccccccccccccccccccccdddddddddddddddd\ -ddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\ -xxxxxxxxxxxxxxxxxxxxfffffffffffffffffffffffff987"; - - const paramsBytes = abi.rawEncode(["address", "uint256", "uint8", "bytes32", "bytes"], - [a, new BN(bn.toString(10), 10), c, d, h]); - console.log("paramsBytes:", paramsBytes.toString("hex")); - }); + const currBlockTimeStamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp; + const ringsGenerator = new RingsGenerator(TradeDelegate.address, currBlockTimeStamp); + + const ringsList: RingsInfo[] = ringsGenerator.getRingsInfoList(); + console.log(ringsList.length); + + for (const rings of ringsList) { + // all configed testcases here: + it(rings.description, async () => { + const bs = ringsGenerator.toSubmitableParam(rings); + console.log("bs:", bs); + + await exchange.submitRings(bs, {from: miner}); + await watchAndPrintEvent(exchange, "LogIntArr"); + + // await exchange.submitRings(params.miningSpec, + // params.orderSpecs, + // // params.ringSpecs, + // params.addressList, + // params.uintList, + // // params.bytesList, + // {from: miner}); + // await watchAndPrintEvent(exchange, "LogParam"); + assert(true); + }); + } + +// it("bytes test", async () => { +// const a = accounts[9]; +// const bn = new BigNumber(12345); +// const c = 31; +// const d = "xxxbbbcc"; +// const h = "ccccccccccccccccccccccccccdddddddddddddddd\ +// ddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\ +// xxxxxxxxxxxxxxxxxxxxfffffffffffffffffffffffff987"; + +// console.log("address:", a); + +// const bs = new Bitstream(); +// bs.addAddress(a, 32); +// bs.addBigNumber(bn); +// bs.addNumber(c, 32); +// bs.addHex(web3.toHex(d)); +// // bs.addHex(web3.toHex(h)); + +// const data = bs.getData(); +// console.log("data:", data); + +// // const paramsBytes = abi.rawEncode(["address", "uint256", "uint8", "bytes32", "bytes"], +// // [a, new BN(bn.toString(10), 10), c, d, h]); +// // console.log("paramsBytes:", paramsBytes.toString("hex")); +// // console.log("paramsBytes with web3:", ethUtil.bufferToHex(paramsBytes)); +// const tx = await exchange.structCopyTest(data, {from: miner, gasLimit: 6000000}); +// // console.log("tx:", tx); +// await watchAndPrintEvent(exchange, "LogBytes"); +// await watchAndPrintEvent(exchange, "LogData"); +// }); }); diff --git a/util/bitstream.ts b/util/bitstream.ts index fa291923..2d868562 100644 --- a/util/bitstream.ts +++ b/util/bitstream.ts @@ -35,6 +35,12 @@ export class Bitstream { } } + public addRawBytes(bs: string) { + const bsHex = web3.toHex(bs); + console.log("bsHex:", bsHex); + this.data += bsHex.slice(2); + } + private padString(x: string, targetLength: number) { if (x.length > targetLength) { throw Error("0x" + x + " is too big to fit in the requested length (" + targetLength + ")"); diff --git a/util/ringsConfig.ts b/util/ringsConfig.ts new file mode 100644 index 00000000..8f38fd1a --- /dev/null +++ b/util/ringsConfig.ts @@ -0,0 +1,27 @@ +import { RingInfo, RingsInfo } from "../util/types"; + +export const ringsInfoList: RingsInfo[] = [ + { + description: "simple 2 size rings.", + ringInfoList: + [ + { + amountSList: [1e17, 300e18], + amountBList: [300e18, 1e17], + buyNoMoreThanAmountBList: [false, false], + feeSelections: [0, 0], + salt: 10, + }, + + { + amountSList: [1e17, 300e18], + amountBList: [300e18, 1e17], + buyNoMoreThanAmountBList: [false, false], + feeSelections: [0, 0], + orderFilledOrCancelledAmountList: [5e16, 0], + salt: 11, + verbose: false, + }, + ], + }, +]; diff --git a/util/rings_generator.ts b/util/rings_generator.ts index a1ad1827..4d162d9a 100644 --- a/util/rings_generator.ts +++ b/util/rings_generator.ts @@ -1,24 +1,115 @@ import { BigNumber } from "bignumber.js"; -import { RingsSubmitParams } from "../util/types"; +import { Bitstream } from "./bitstream"; +import { Order } from "./order"; import { Ring } from "./ring"; +import { ringsInfoList } from "./ringsConfig"; +import { OrderParams, RingInfo, RingsInfo, RingsSubmitParam } from "./types"; + +export interface Rings { + description?: string; + rings: Ring[]; +} export class RingsGenerator { + public delegateContractAddr: string; + public currBlockTimeStamp: number; + + constructor(delegateContractAddr: string, + currBlockTimeStamp: number) { + this.delegateContractAddr = delegateContractAddr; + this.currBlockTimeStamp = currBlockTimeStamp; + } + + public getRingsInfoList() { + return ringsInfoList; + } - public generateRings() { + public async ringsInfoToRings(ringsInfo: RingsInfo) { const rings: Ring[] = []; + for (const ringInfo of ringsInfo.ringInfoList) { + const ring = await this.generateRing(ringInfo); + rings.push(ring); + } + + const ringsObj = { + description: ringsInfo.description, + rings, + }; + + return ringsObj; + } - return rings; + public async generateRing(ringInfo: RingInfo) { + const ringSize = ringInfo.amountSList.length; + const salt = ringInfo.salt ? ringInfo.salt : 0; + + const orders: Order[] = []; + for (let i = 0; i < ringSize; i ++) { + const nextIndex = (i + 1) % ringSize; + + const orderParam: OrderParams = { + delegateContract: this.delegateContractAddr, + tokenS: ringInfo.tokenAddressList[i], + tokenB: ringInfo.tokenAddressList[nextIndex], + amountS: new BigNumber(ringInfo.amountSList[i]), + amountB: new BigNumber(ringInfo.amountBList[i]), + validSince: new BigNumber(this.currBlockTimeStamp - 60), + validUntil: new BigNumber(this.currBlockTimeStamp + 3600 + salt), + lrcFee: new BigNumber(ringInfo.lrcFeeAmountList[i]), + buyNoMoreThanAmountB: ringInfo.buyNoMoreThanAmountBList[i], + marginSplitPercentage: ringInfo.marginSplitPercentageList[i], + authAddr: ringInfo.authAddressList[i], + walletAddr: ringInfo.walletAddrList[i], + }; + + const order = new Order(ringInfo.orderOwners[i], orderParam); + await order.signAsync(); + orders.push(order); + } + + const ring = new Ring(ringInfo.miner, orders, ringInfo.feeSelections); + await ring.signAsync(); + + return ring; } - public toSubmitableParam(rings: Ring[]) { - const params: RingsSubmitParams = { - miningSpec: 0, + public toSubmitableParam(rings: RingsInfo) { + // const ringsObj = this.ringsInfoToRings(rings); + const param: RingsSubmitParam = { + miningSpec: 8, orderSpecs: [0], ringSpecs: [[0]], - addressList: [""], + addressList: ["0x17233e07c67d086464fD408148c3ABB56245FA64"], uintList: [new BigNumber(0)], - bytesList: [""], + bytesList: ["xxx", "ccc"], }; - return params; + + const encodeSpecs: number[] = []; + const len = 5 + param.ringSpecs.length + param.bytesList.length; + console.log("encode specs len:", len); + encodeSpecs.push(len); + encodeSpecs.push(param.orderSpecs.length); + encodeSpecs.push(param.ringSpecs.length); + encodeSpecs.push(param.addressList.length); + encodeSpecs.push(param.uintList.length); + encodeSpecs.push(param.bytesList.length); + param.ringSpecs.forEach((rs) => encodeSpecs.push(rs.length)); + param.bytesList.forEach((bs) => encodeSpecs.push(bs.length)); + + return this.submitParamToBytes(param, encodeSpecs); + } + + private submitParamToBytes(param: RingsSubmitParam, encodeSpecs: number[]) { + const stream = new Bitstream(); + encodeSpecs.forEach((i) => stream.addNumber(i, 2)); + stream.addNumber(param.miningSpec, 2); + param.orderSpecs.forEach((i) => stream.addNumber(i, 2)); + const ringSpecsFlattened = [].concat(...param.ringSpecs); + ringSpecsFlattened.forEach((i) => stream.addNumber(i, 1)); + param.addressList.forEach((a) => stream.addAddress(a)); + param.uintList.forEach((bn) => stream.addBigNumber(bn)); + param.bytesList.forEach((bs) => stream.addRawBytes(bs)); + + return stream.getData(); } } diff --git a/util/types.ts b/util/types.ts index d261d573..a7885d40 100644 --- a/util/types.ts +++ b/util/types.ts @@ -24,7 +24,7 @@ export interface OrderParams { s?: string; } -export interface RingsSubmitParams { +export interface RingsSubmitParam { miningSpec: number; orderSpecs: number[]; ringSpecs: number[][]; @@ -32,3 +32,29 @@ export interface RingsSubmitParams { uintList: BigNumber[]; bytesList: string[]; } + +export interface RingInfo { + amountSList: number[]; + amountBList: number[]; + lrcFeeAmountList?: number[]; + miner?: string; + orderOwners?: string[]; + tokenAddressList?: string[]; + authAddressList?: string[]; + walletAddrList?: string[]; + marginSplitPercentageList?: number[]; + buyNoMoreThanAmountBList?: boolean[]; + feeSelections?: number[]; + spendableAmountSList?: number[]; + spendableLrcFeeAmountList?: number[]; + orderFilledOrCancelledAmountList?: number[]; + description?: string; + salt?: number; + verbose?: boolean; + id?: string; +} + +export interface RingsInfo { + description?: string; + ringInfoList: RingInfo[]; +} From abd237beb8b0429cc3bd52cba9fe49f938725368 Mon Sep 17 00:00:00 2001 From: wangdong Date: Wed, 20 Jun 2018 17:08:02 +0800 Subject: [PATCH 57/68] rename doc to docs --- assets/css/style.scss | 0 {doc => docs}/LoopringProtocolAuditReport.pdf | Bin {doc => docs}/gas_consume_report_1025.md | 5 +++++ {doc => docs}/gas_consume_report_1026.md | 0 {doc => docs}/gas_consume_report_1108.md | 0 5 files changed, 5 insertions(+) create mode 100644 assets/css/style.scss rename {doc => docs}/LoopringProtocolAuditReport.pdf (100%) rename {doc => docs}/gas_consume_report_1025.md (97%) rename {doc => docs}/gas_consume_report_1026.md (100%) rename {doc => docs}/gas_consume_report_1108.md (100%) diff --git a/assets/css/style.scss b/assets/css/style.scss new file mode 100644 index 00000000..e69de29b diff --git a/doc/LoopringProtocolAuditReport.pdf b/docs/LoopringProtocolAuditReport.pdf similarity index 100% rename from doc/LoopringProtocolAuditReport.pdf rename to docs/LoopringProtocolAuditReport.pdf diff --git a/doc/gas_consume_report_1025.md b/docs/gas_consume_report_1025.md similarity index 97% rename from doc/gas_consume_report_1025.md rename to docs/gas_consume_report_1025.md index 86a4226f..dd48044d 100644 --- a/doc/gas_consume_report_1025.md +++ b/docs/gas_consume_report_1025.md @@ -1,3 +1,8 @@ +--- +--- + +@import "{{ site.theme }}"; + ## gas cost for ring with 3 orders: gas price: 21Gwei diff --git a/doc/gas_consume_report_1026.md b/docs/gas_consume_report_1026.md similarity index 100% rename from doc/gas_consume_report_1026.md rename to docs/gas_consume_report_1026.md diff --git a/doc/gas_consume_report_1108.md b/docs/gas_consume_report_1108.md similarity index 100% rename from doc/gas_consume_report_1108.md rename to docs/gas_consume_report_1108.md From 3601fe0f682a74916835c24f596c3ffcdf952ca1 Mon Sep 17 00:00:00 2001 From: wangdong Date: Wed, 20 Jun 2018 17:10:11 +0800 Subject: [PATCH 58/68] delete doxs --- docs/LoopringProtocolAuditReport.pdf | Bin 349439 -> 0 bytes docs/gas_consume_report_1025.md | 26 ---------------- docs/gas_consume_report_1026.md | 43 --------------------------- docs/gas_consume_report_1108.md | 39 ------------------------ 4 files changed, 108 deletions(-) delete mode 100755 docs/LoopringProtocolAuditReport.pdf delete mode 100644 docs/gas_consume_report_1025.md delete mode 100644 docs/gas_consume_report_1026.md delete mode 100644 docs/gas_consume_report_1108.md diff --git a/docs/LoopringProtocolAuditReport.pdf b/docs/LoopringProtocolAuditReport.pdf deleted file mode 100755 index 180a886a7ee4ced3ec4edaf35fed401a8004dbfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349439 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%0D&w9*i#3~mzM>G4D#%mgGzj_>Pi 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

X>YX7kdu(kBx0xqCfx^Xcy-7Le&Mt|ZDWy#u z|FNAiF^@MeiyLvhnAN86;-4`=<5L~nipM3 zZ>N0hX6G-SrjHU4HXa|HSR_}Q&6HgqI933y4#uDIW2kQ>&{MxG=3*HPigUH9)J`0a zGh;j$$2l1za2}s#xrSPI8S^JIs=;JI>s|s^(x0ec&6=k+r}U}Y9qxz#5~R!T@v50f zi*KaFxDc_kN6tu)Ysb%pwo$0E5T{{0QbdI8{fZTd$?m%uw55f5vEK_vESHDq|!Jxgmmz9WB zCeoCzJH$n@DD8LC^?25N6m0NOd!3qX$mloj@%`BCLI>#|ZxZL6PY?|+AX8npKlctR zuj|D!=3V2h;pfQ=@+ep&G#x~Ccjhu6t81Kok=LnwPH=L!&NFi4Xx(>21nw!JM>xZF` z^mIR#O3HZ!?Njpnuak>B7L!{w1YFpED(-H*W*Sx^hJCuDT{S5&N;G)38n7uK>cev0 z*k_%C9PR1halvHXUs~EclZnXgEiM`k8_7&qmTx*{C;_A=oL`o1w*5F)?zrzyKdric zA#lbon&&#t0l_>Z-TH$VX(ivJg1A7_M)L*Kr$52~_}h0TaYJP#I;-hJ+ZggDF;10U zmrfB6Kk5mA-2iu?1#=M4s?qnVuRRhO~O0PpcQL|O0HWS*@>FT8hcA)eMZYk^^qinupQ{#DM; z8K$%8wD=STrR#wa+rZ7x8Xb2ZH}Vcmkz3|+c$9BZ_Rv#Tu}rI8+Sv%89#UUQwrX)j zN*N*)cc~~Ux@}~KohZsXN2|{2VAq?KOk>pf8E~ARGM~K*sGFzu&BQCQ;-D4iYvW|a z7GN&hh=X{@ynUmS0xJ!o9Xj@c;^S>8B>fcEwFat1s`AVYL+fue=ha<12IB20`lyZE z!UEUpGE)9=FdvS-~qxVy@fO1n*_bBx@UTedXx#PP~NzB=9 zKbx4_CNdS&wH@q-cgbIo-mae}NmO^)Y@HWxU`8E0epthN+4L=Oq8uDQIj}Pn7$G{lU}>djOD%Q4Dr(iI;wB?KoRR(aK5=Ah|-yU5vSt(=2>g z)<~Q&y}ECT7h;;W8J;u{pV}JpsC0AHSeS!*?0x3H$0WDZQ6=_vD2C31OIcp#ws4ma z0xru1V@ z2VRDbz8Ri=wGsTAXDq#4tRE2>N8B*l{na$=Q-9x8a(?g%KJc5)J%1_#B0djaA>NEe zZ$007&!&<)3V$ueQR*wsd(C*Yr<-M*LQHWsHMw2q1JMx~uplWmJk5wPxwm+Hfu0-P zRgD~GIs@Ic?XEJ!qSggm$6o9XlvJqgcD^tQqpAx+S_UVEu$4@%Pm3@@~yX-8;UBw^CIC`=!UHGBbxx=}LgpUhYspjK=K~nR6wq z^7Rlny;8AMVcYP0h?;2KO_$A{Rdzp^7N@kce;B+T8+VW~(@-2dvmDfj5%VL8n?gXM zkb*BcH>lvh*B|>seht;UJ^W4L^XTlV`*xmE$xYz45#SI znBAk3rM?Cf08219=oEMKoML1?trP{R*i1q+dOPJe6~I--)0+9@U9qJ42c?XM?~O)7 zkIF4BJPK}bA=5{pMZg%zu6gXL?xusWhIv^q#S?A#975X#)1c*KpX68|uWj<#7)s6g zvYR#Av^DzMzan5HNi<)`&xTi{GYfVJFaV_x=$p;dbmK7b#o&*JXX3DP1`Rf7SrP~( z2g;8op%1@BEBKZ>UeT@JH=p|ZISwC*-l}@d}6VBW()mg!ply)(&AB+2n?S(0g9QCKk3lwn%1n}f`32M}) zuN_Xc8en!_0|t=@erqMQY!BJmoaX}8`G95L$akfW2ug(RZLxV+Ks%bkw)@TtQ9x6S z8ApSeF&WZ~x;jr_rcSXGF|sDqdAgJp{#cqV{uTl%(9 zl+1V$UgW6SBpbF*dTSC!nQcjE$R-zR3TggZ@%lR1dj!d0)oCa4nF2!ZX6m=btbm!j z3qoLtxL9Q%o0}kuo?ZU@3c~2Lv{3ARhOJabrH09xH8RPwif7Ue$_L=@YN!iB;bKvC zmv_K~SxJ=nfDWlG1sciyn5?P%d7U+Q&^3{JFLH&#ZRZAAL`l2wsX786!U_WJB&s|1I-E?x^rqY;a4a zzRb$XzOW~WhXjaFuxRQVZZrmS-_Du2JKBCl$UtW#u`2zIxNd<%yL6s}VM#OjNf&}d zE|R%Dg!Eow8iaqh;RRjBUrSUBkVRugKyxu$hmZ?E%EE7>tj( zC**l|AdJnE?_)rJm$hxqDd}!&#pBV+`Rz%^+8@->uC6bPbDT)${^GhpJIUF%^al`U zN+eC!Zh+6d2D{pT|rLP{w zd_)!6bf4vja6p*ekaX~gE5$ZkXW(AAir9zXiFCA>M<&11qgCQz=j(`yyTxcsaqS95 zgjCN*A_z$U<8KzRuwm}y08W<^8*lFNeM}nfF54I>Un5FZLewzw%R8?<&bxdS0rklw zq|KT|^b>&_@B)|HwrmQ@FbN_TybT?AYM^oF-aH29RKueZ>o8hs-@EC_Jmmm8rag`Y zruj4@x+sl?;{q^!GaUd5+gSMdJMMQW+3IeE)T)8shVc6a>4(GS+oJ~3+Z*A>Q6|J( zu@vHi*4CEPb$$9p-%;9H`!ZOv+mD(moP+Boq=xh0#AxYs=#u&7@kd+t?coohL@yBE zoyxyh1N`IbS`Nn>jTzz#gVY51TrZuz>=I)xu=lh(j3t50>n(v&dBWv*xd+h| zPfUr0HTpfIu`V94MoBd9lG9@|U(i@+v};I7stwH{hrXUJ20(e(qUABgJNFHhQJO^I zYY(f8C$EKTC}?Y)|Ds+wFwk+0Uzp3gZpE5))!a5F)44ZL-JoWAHyd=pxduC^z)su5 z&cIiPu=~vL*H@dUss5D2#SSs{;!gcxz`p6~q(ben>{JG5_U$@(jS~nSk`vu4MscDb zwN{pELdT1;8_=H-$4+4tXYdDy0k|`}p3~=KBqZ>t!lB+>?>t-8y5gT&C?#5q4 zk9wG?!V?Go$>b_ADb6M_@Gp7`*>+!G59MiPS|nnc;#C3GM=Ph8G*%Xt@GMCwQ|-1g zxC)>Tyieq^Ry4n2l#6oWW2ax5;JIR%pgXdD82{d&STD(7!JlAnNLHilOGLlAt=u=C z2IG8S4#1#u!apE_kUi3-U&@_qE0@CpAzMrrzq`CnnvJ<=-p2#)C)p5Alx9($_=h4d zQ)f}a!F&0A)NhmC(fF&H#x$i(W=R*Wk(v*A7vUX7i{TXzCpm^rK@D4CVD>SU-3Myq zJcqw|@tW2dgPzg2Z`{I-yo_XZIv7;>;w#dp$}hbxc9(L)^1iQfIv*5xN&J5NeuWYk z@D3b4zxg&|R@ygL0xy$G9hr+FfIWa67v_s6L{kghl)v(ozqW&{g5UW28GvcljTRt+8M57H>SaH2U( zp#NX&y#-KR&$jS+LJ|lN0tptJpb2(xm*BzOJ-E9ZGz5p>?!nz14({#_2X}Xe?~wn! z-@7yK-uvEEP0dWzyj6u%@9y5aWv}klz52I1PkknzI+mKpS1InUM7T?^@^2-vy2vb25j1lS+1f2E-25`t4PbD_JFE9lF6!RJku1*fm2OvvrO>b>YW3Ht-EcB%m z_Iils!p1)UA5*5{>qvIBI8`6RQU;(iA;{4sA-DT&M|Lp(~i;uzSf0Olixin5@?s zkk(w(fiwD6*{f3RhMDqhK$MYB2{IcA`y3^6B~KSOiQ|qpwi{g-uK~3RdMH#HC#6h# zLIbWg2dCv0!d*>oP{q(b2%q}f&T87tb2?q-o>t7W-K_wDX}^vxdV$Z@`#(xcY8PYq zj+689#nPPTwaY@vCEAmIa;9Z)yg+rS3+us`* z>6K5*5v#~=5-E22(38-2SpAXWL!h2xy&O6}mQbAzeh<6=Vk0W8V~wDjp5#2FDzZ|J z2aTY^%z=kL$6(t3=XFFn?V#RkE05PKD?zeC6H#goDi5awHhDB`8geyr>H_FAdJmVV zIq?`a2;VdM2kaXNss$?1Cj0gX3wr$`x1}Oq|i=g~0<}l@Z62Z%>o343=^H%#h~tqynf_$*9;=<}!+X z!1+B_J9MxraL&ChC`8JYMUmJLvovR3nnO#l}lA0Xo`I!G25wP(Y=6CQ_y97 z%)wft>Jj_XLaNY2!{XdE?68fxVBFY|bs7-o8?J(SU>r~TFxWxk2G)I&W>Jfo>0Z|d z`Mtil<19yEphSA2guX70nk5!g0t+Zudk6X4mrc7!5h*yV*UN>yJ@HA%8iGq^!;|7& zN9hrxDMfEF(Q5-Yi>-+>hunsYVj?FJ4;@DuX*Ai%?-X~}{W&SJH`E5AF#7CH3TQ(uf?V!~5kUJ{gknD~_iAGRZw@ zu&WSC8M;hZOw$u{3BLWEHjx228W~Jz38$syN0;(!0??8+Co*j~$v+YjY|d~_Ol;PL zHSRA4PG%=8ekph_FRRXCO5cfiq!Hihm))weM!FoPaIPQB6@>u|T_UwA?v1IhSbWQ7 z`YYs3$P1OV*I7C0`3~#emx_#RHK=z#x^q7hNLK;9e<--T#6nVnDg zF$;dWt7S3O1AGbhuq!^X>{PmsAP8eJ8HWt8(D)U#!H2ZR$Z3gmP8{^mXu7eOCNUR0 zR169dr>p0>NMWCj3Oxma3)#XvWgW;Jno_HgC31ETGp~NY1I8~JRESv(W9nvjn|@!` zOkOF-5JYbDwC%1OrXYkXtSL{#qRQC+rWKDyTN#u;)UH`J4-M`=S#n>w90R`xAFz}T zyoeoW>Q5_>Zv9leKCgZnK-PcDssRpvP_aFh4MySW*;+7WHI=U^ixyuo7m6-Wd~)12 z2%Z*nZQSpl{90aX+wa7*OX$G5yas5=oJ}lEp>IIXap7uEcVwyFH#gs!+1c#J*16Lk zm~XM|M71onW89rIbS!vG>&Tj&wSI4nVBK@~}E0 zsfPqu#@3sn(yTyLc?qcXT~VnZk>Y|>T~-klG^ofuVO+6%i_fu8>enhU-ym;B1GG?Q zm1lz-oOc^0GLp}UPwY0%Fl8)K7358N$QKLCD7C26($5PvOn>{j#g)wRcWTXVY&^`N z#lQh-U*n&rsNaLaoon`aPUUUH+*HQVd~WQ7m`aC4JBj7c=7izze#x1-xEZ>&Lq}~K z`{KIYyo-vIIaM`vkM&OJ{^G+FQv)}6^ry-UXLKH#cLB737B>bG(_eNh-(!|K8G2u+ z5Kn|~4>xbaib4ma^HJ^>#+E51;62UT#0?xZG{CYVRs_@OXoRCF3Bl`%&1vKBd!R-0 zkwSgJ#>XlMig)`P}E zuBzIo7`sN_?M_$|V)JJN{WkS+$B%-3qN>*7Y0+4@sjyDG@z8h;X)@pZVyYkv2Jm~h zMDfIBv~b#&xm;8@t4}8Hf%5vdEM*Gw!0pmH)I$8Hf|@qy-OjLLJPZRkCJ%~$9w7PO zaz9E>nV3k~``5K`!?u<9<4VKl^>?=P}2-S!qI zfxSZ)Giw7kqd~jQDeMaNkN?a(3=^-BqtFm&X2IMX5}Ieh%sM2P7p8|APynY**M~(G zk)_rlAyfIB^Z5hf_~)f{Ho&* zS$vdnN(AdMkkm`MzNg2H0>=v}UFgCQ;FxnJjR{gNA=(T&x%@#kA}k71v~mL!{8?S) z{$1i7q&)qCSmOCc*ZU|$L>`sf%A&+3JY7|r7^ILHaUt&eU-~{^2Ma5nrKcbkjYtbE zo~a~g>>tBHc&fy<4R+@Q-cbTeOuJH9ogUTcr{`;?QJ{y|nuntp*OY`YsND}ZCjHv6 zN}FYc2i@-;&QYyM(d@|rx>KbM?0FC@$+SIZ2K2;J<$s-iX}uk;)nJP|jU95eGEG*b zb>qebW)*-xikycoU;sFgFO3F~?N9EAE{jhr#HobFsY`yIU4+UVA>Yq{PHb5?5x~%+ zI)EnW%O+Dv4$Px&^8}$KnAlfG*aC#ahu zr9TR84qCC6RRCLV)5!x46_(OBan7jRd&v~m$IGzko7;xiAuZmu%?3*!K9%N0*V{a3 zvVSYbQtj1HuqW4vZR%V#H-GceLP1vjWb&eEDO?iFt|(Q! z3Z0swWtCf4$P>^YRC;I$%*0r1tS%{g z&d5_|U^TL2N*l81WgAC#;rYV?CS+Eh+VYQ#A5D_|u$C=PCR8iXo;kw=j&M8L4W1c`w&i*CW_d1HKn3{s;c19^Lsb!MK50?!w5 zjQ!kT>i&F{rW&fSbdw_TE7KGV>1+qRU;EPAhslYmih_bZGQJ`9yyrfJdoUJvM<`7nUpcD_#^PXwN7N( z&IYHvrf{dSK!iAx3DPzi-as$9Quu}5(K7Lx`8R7U^#t;XNPbh0utY8g5!Tv;g|N>l z;#Op(Z=z|TdY^HsA=Rj5B#(IlQo&^P_`u5_z{K3C5#pHGL#NfI90TQaTQ7bIhS*qB z(b3_o=FfU%uEAZXp-OTBsMrhlY##OR>5`>pAwF*Qk ztr=ig#VLCDUTAyB!o1|_JABm z79&Y|8akvRMPdDMJV8Lc71svGiN10QToY1!3Yqy_S#oY32}VLeD9Ov@@V;69oZk;0 zQD%9u<3%T9TDvuQT+*Z~1Er5<8cAgT^57g^nycmO44Ka1%~&uPjxmXO?KxOV0~0j- z^0g={lj{zirAm`nvHv-hFwC19>TCGhpW_)3zGD~tq=Q-z{j{33(>L0nfqd)==S$m3^ZR_C7q_Ww&NOWZ8Q$kx}yIIA;WT zkp+3&<~xvnJJ1B!_L*1b7Y8HJD1Q%UONp$_w(gy2xGm3+tt6u@|H75cyfV@pHG+hMO7LE ziblV$D53Snil+*J+~@#K{yH(t|I@`kcWK ztjb}!)>$=;e>BK&4LzHa7-cR^f`9Bf6)g;hBu~Y7Rm(_XJeV@s96Qy)0$o!TAu$bh z?QkabN-0_HUuBKNXS^TEqnR$LA+HPx?-j29@FE7%MNDE6{6P*S?MwI@+#$nMXXbR` zzE(L}HlS6W#7Kg_`Kd0&X&$dk{nQ(BTjY@+vnsDL1d@`rv0k{rEL({9ogfbez2k~i zg}yfDWG50tmjKD_m*G+zn1_KLCs?oN$@FoyMIJI6cUE0K^U_}yxu0V9+Qtgyh{YTW z!2k$5@Qc!f;TK)D5FJtu)0xmL`|*K{O9QLk?sE%fy+v~sAhY;Lff2i%nX}G5=>E&K zsUTXGaj+W`wnp%dp_JgTF&!tt)j(~gpaJGsf;z)!-PI(vN08fCJZ#Ck-O5HTxm<*` zF4KiHW0wUJ)_DnUM%8ilzJ3Yyu@$Q9_got2SIQKI>Hhcm;jZsB z)W~ZIgkRAQw+af!q!u$-?_<|F8TQ*4L=Su$y@OBr#M@=Wx_?y-6eT_?oK!%6z?iG3 z<+`gPo71acpzy8C)*@o)lh2d$MxLGM39{+(d$%b#5qzJ`Je$T8URQ7*dx*MGNxjJ!Br zFgWA13QyG=)~M{VpcOkOj!uknei`bK&i53>6bsfs;a>|#l6MKtU!W-JeOGjX`EqLA z=C`-G^sFKs>>~akFiFb6Jn`K8>v&h*tSRjpxrh|mP6|rcJ*SA)101Oa^UvYlZ{wGWTI0j_I+%ExF$3N`#;$mD%WL< zvTHt$CXFU^6pLFWPS&b!RMgk@uP%vOsVo*T`Dby3wSRkZra@nIX;Q@MzbGK5!p1bw z6{J}l^19hXNO$LUmBEzzEtwMVL!`2cMAb_S&p_eA)oek+bRr4TkRY%-0QIsI z>K#e$e@EH34QV2?i$v=cqyETcI93UsqC8D{KdEX++$SOF<+9o!KU=oHd9t~~65-HT5l3+HQ3&=Z`P?vs$rr??kC z%n}?K323Nw9}74R9TitSh7v&JcNV%@SE2{zFP2GfR6>Y^LWa663mP9FMuDb9+Eq0M z-HlF*Sq%YOZuw2wd4HS11MahuYwEUyK3$9mOc=31d>;h?Er{gp8|UehvfVA;xSm%u zV^H)Ztb6&PcAPf+j*47heTvgWNs$p-FZNYXHU{IsX#40_4d7nm1TfnnNWRx>K>YQ! zj|txWB3cy%BvB5d(K){=zKeRl08~qePT3`hbjZ)C?p?FdVeA%bZ^DgBfN+-*cHRHk|6rWRWc1O`cYB zbCZw)0Q448%d-i$TCYW`se{~t(P^5d^@5pl145CyF*nL*LZ=>%8n=nvkN{?RQH48< zw)FJtpYgpt8frWvm@2wf_#|8>J4P|5^`QFewLy9oT27Iyj;cD96cjC9akWr6%QmRA2R!JmgAq+@!123aUKL(f>}-$j>x zE{Gi=Jrl#9__F%8mi9Kf`nJ#IwluS}`NKr|Qwg+xXMsSe9)eDG!g6*xcKXmO!g92P ztZaWhoUj}nAwBJ1SqaP0L&N_tkDfUo&~iW{%gfUe(y={Pt}HZA+Qw2>PTx)qC@mla zl-GB%1O6d*@M{3&jCAyjEexS4KcHj^o{p^D(Kd%(R+Jszxazh=5#TuCH=ce}g-D5YZnZ>1Jbt|44!Ug~FXqwVB{EK&Kn_rpy;5fEJsN)7QVzCFl zO-7dCsD`zsb*c^q$ij}Uz6{`tN{|PXc}0QHiCx0IPLw^VM?c3zL42uIIISgHlwI{? z!wMk+)g=C|UkXMre@A#>erO2d&S-ic70*>pdYnXG(fOqe9CHQ}t-^`gtz?VmPOzxZ z<2Aa-R2WRwxH9EzTie+D@- zv3ivlnww5!Aznj8Rfhf9!`yUhjst+)Ygm|kkLzcZ!vpwX8TNoj5T4BOTVIf996dLj zNQwMv*6WvLp(axyy#1HCU)xr`PxE~sv#@ne8>M2|zt^`UIri_v=#EKZ;oOmZ|AnE4O=+y1(AgfBC7+e> z@MM*ap2S!A@zRknyAcVdYq=~cHmcsXqi3v&Cc!K--!taRV4E?uy>LLxXS@a;n707# za(}dcq7fPC|D)&s59RLv9?Bg(3nLK%At9l@ld%E2w6T-EnTmk1xxR(1v84qU5fdxz z|5X$rrX$C1^ykP^;;g(4(|asU4#iV!+E<@skc!aw1o|C#OfC;Xo<-~NP;|BLt&{~~Q_lN)XhStB{w*t67XdL+)a zdBT(xD{f|bJYW@bJu5j`ur_l&J2pS6W_wJoxjDTknR)^bEk4~x#y(Bmxy9!`Z-M~; zu{>8@N3g0xs5rCZmU4UZ=hud%Z3#GgNUD!zPqc1-;{2Dt)cZc&u?3a%K2Gt`kR0_f zR}oDTG^uvcRG+!?&8rLcaxkeQ3nrYT-w-in6g@Z$H-b6=Lg}vS%P^0JfjrtY&>Ot7 z)jTt_)l8t3kO;7C>|%xZgiJGrIGWUAb8u@sj-hwrhCo`X#QFO#H?GR!r8;LAJG zY`_gXyVBmU4TJYE3)!^XFGS4*Fm1X#588jN5g|>doa1R2cV9-`>>CGr-!zS$5hqUz zX;^7OkMA4DoyAN<^wj5H^6kwTtIDn`2&%JAfMc#rxYRQ9%tyPu=0{EPZBF;~%ZZx5 zJg!Bn;vsy=SC1~Ha}%PpB5L=EqzGqJ7u#FbvNTJ~$CrLCa+O&Cv-BF&N3dz_Am1y;j3!Mv%3a!;Z)jJHF0D$Aw$eLfE050|jP z$>h^U<9v4F&R;%larH1LCZN)3Hy8S!cAXV0m|o(Z7`&u3shxY53&fP13U6j^Xffj7 zBiR*oY@!HyGW>Z41F%AT=jqx>4~f$Q(+rL|4t&}5LLZiQ$221H!;#YkTW8vFS+*}H+3nyQq2Xt$=nGpCDw$3+Tau0_UbFbxe&Yq@nD4o!>B{Iy`=wf%wbhcM+L2{7xr&2n zWrW(;i&oGJsG|qfr$pgPs&^70vB!1YC*yvG%;nSmX0A!!va<)yBVxC~s8|j7!VL67 zHgOw# zB>1U&VPJ;(olkwpI|t!$dCZ%Ll%6zXK47Jh^nsAU$6;tl#$&NIqtoKI@o6mU3)r8c zkFQ6Li~8*~K`U`YC0T3zOirtHyr}ep z*{d`L;KkG{tn`L!!MYyMAeW2gaU|7_TCN})kOLML10Rb8Bnzr<$>RK78qtFipmbj^ z`OBBlm;-gRYYUu#MButAQiZ9x#zEQ&B8Ce+@2keX=P3(e%@@^v8em6%ew{54#Cke+ zDcy>{#ZzyC@4sa+zjsS9YO0(X6cHK5;0H~COQo;UF8uwCEn)@|D&nhq);Wb!>zzHS zNZ(;NKqBt8uNIZJ2Hk1O3{x)s#MBryzZsH(!b;!L{kAH;Vk_ax>AzU#y&vjNrv`E| zTSy)giX82|tp0h(Kb=rQ6z$)2ke5^AWWbmy@^Z=mIQXb-!#X!csZD8;+1M)aG-R9w zJq{qaUo1&5sOd;wWk&vno~+2m=P)pS6w|Y6EA(9RUakBE&sIAf9Mmb}lT%J+`q<}_ z1?63BIRuUpIaGrLnt-l0;iQWo*L4-H>2lea_I1#Km03ESSm@1Z5HX&)W|x5`HpxEN zQ&_0yB6GIFzKR6#tYMPRp@0=@$UgbX)}b0AFHpHSZu;|#tb=+POwDbOaV9&wK{_5_ z4>=aRAQ5b5+3{teOj!HWOwPlJ=wAO;J!Bmmx~B5P%UFPtCKSY-&sL?6>#znppXxIu zT~d*sP5M)%P?97MWNUIsFjL^6a;GRGi?iCa_1N{}k1kT?8(QkE3r|LEAKLpy(?VTK zHhpTNTDt=JaB?fBhfg*W^cCbGX`?#=GQa8|2WyrZYL-U!)%&=ftGm~%_79Ntpok@s zuv&Wi^8b$IIuee550A;iX|u(&?$g~p*o;BGp3`|sD=Sh<+PI6iUgaO;>oGR@`@NCF z>dQ)7O`WS7nO%M1p+iM@%3%zq)%;-b-zwqnibYG7^^m+WHs;hj$)pw5OkZt5QI*v* z-HQf|$_EFwbE@O<#&KJW!Q0@al_u17PVZZSDN07cn5w`d@mrdq553CED`9nYnf>$h zO~~V=Cdu6>Sl*Hccqir&T@zW2#Ec$&~Kxosh!nzACPp z81&3Oh!4gSQW*{qt~4trGFfRmv_y) z=L1d48>>G5iIFu+g$eXpIR+W26sVd0ePiVL(zCep3e{&DPpTELB5sW5NX0uV1f{VB z?%OAYT5a4ry?$}&jLmYhOo7@Vr$Fy?kte@-Pm_R_cXxLud1UO8B2-SAKgZz%iPL4; z)nHuHRNJTTWxdsYeE3O|ddqHB#Jh_+OOIE{Q-Sy(3qH!r3(c8|cXPQaBOn9-bP`B1 zJnE|gD_YnSyF7S0!viJt?{>I~8HXfzL_VsrTb$;XHMYH?8*yBZ;BHp>HMS5x?&b$! zH7f@UUjGPx?ZWAU;fz`4Lgo;!mo&hXsmXnzFcYNGWq9Ozo8=8+Un?0~OuSkmWeYrU zTk(4N8c?&6V+}cYvsan*lObAb6r?|7S5^>4Y@0=MfUcdD?Uje8bcC~2FFTxai;au48n@TaJ_;06tgV8z>j&rEdL>=u^hyG(KABn0pNX?a zOB$whVU)1#)`v7N@{uL?qE+wD&lmWpW7qV58R*+5weYPiDGDaP|J*b#BRtJP?ChbX zxDet)r`iX@o{-R%$Qs%ArzQ z*0p++w`_9u1(${8lYZt;e=C))-(mgByf&{pRp&XiVJ!kI8CeKlS5f3tc}kLXj_)?o zsbxb%>LTsgZ=FP>2!z1{Q6BM!r4sk}C#F=ns!@EO<`EMbg-A5>qGT_=e|Tf2hodT| zXeE&^-L+u~{%p+{sCq4P#F$5NZ?c4~@|{O%!BJJZPweR^vN(@XajYRSX?ih!yy^&y zaf5@w5@Myf27jchA)hWoF2O93f3vQ_FstO$pDxpdCwd$5J?C9B{eavS1n*N(6w@8J z^`+L-hko-IjRz+uF5ZgK_KPROW`rtzAN$Wd9X!XcU0+~xVFdA~hkZsv@M+VQ{`eNw ztL4{6udmRxrLh=U1coi}-Be?RW=-6r@i?Q1h=ZJ@y--sYYe`jWJcqNXgK_{?5rq$^ zihg2a`fC$n+>vIcqSaYt2KL990F}%%{SEQ*{PQIlPrPJ-B!2 zfqJ(TH8LZ~Dk9wxF!jYz@*3H3mX-KD`iMN?!*{by;V%&h-zHRStRDG*`~tViZcZ-G zz1G?gNG)9G5V`N1m?O?^QYCu^Hq*YsH9Epf658Ae7z|B zo>d*4!TCnv~OeQ}VvTRk6$jwo8-rK%Pa= z5w{_PGQR9h+{xHgC_&`ZNyltw0;u83pW+X2^X$!PeP(zm?VZFlpQrJ`Lxc2%@dy5Q zLr7RL!{!#cV)+HkvB)}%r?Ffy-|vG=d>e5xyX^cf1@$46XUbeE*9E^p=`9yKfopQ> zxQt@AOauLo)Og-$kxFF|70#v=qTC9Vl2g#HsOh0FQAr}rz@hz&X;5WJ&Pd#!tSn|n zWcdWUz<6-l@X$(E8cXlAv&uJ;e=~Kmb}d`+Yu&Zefl4y<+V$AwJwdwulrnGU!-aaOFLrctIyAMjz0^%_dG#C+1lJbu+!&S*X-A=|5_1ns?=9P zkEn%Ld(~wC-Uf7$NY)IPHaZf-U1|86Wk)qH^c;6tvvphc`FOTY^R563pT2h3BP6kWx7SfNRIT)~nUgF$G5NmN;Re@V zG8oAbr2L_l+l||%dy4l)0U_dh8a55q-kAJI11}G$CQSLpHw>dpf{x+omGCl#BX(K* zZyXjEV}|%sdh+w%6jP`=N@+Lo#O8k3o#6vgmH6Jz;9${KqL`%G+r0~4t;J2p8KmDG zX|>UqO6COa2!Lx1;z3N(JsXU5U2-`RiayKjhC z-P79j0qMmIAUKK93m*Mo%LTa2#;6yOr#dVQw8}g(~+%12!SzGGo6%yrkL^X z^PB?QTaHa?-KWgt7_zD+kpYe?A1Vu%!p)-r#5O~JIH9``P#Ni`@7ohtHrgfnKjQ9f z9PuSnE%9Rc?QH8|1m97z;Bir0uzwbOOahf$ym?bSf`i11@lxe<)9B!rWkEja<|O5` zLCgS{h55-Fw0L#cPOa6u99a@ZFVFqZcY=DBZ&hij@zTo!pL{cm$FC%9n=~tkU#X4kGz)KDe$^5u!CE z_-8w@S%~I&CUG@(MAuszr>IMfOZ@BTey|1rBx@LpIr?;Nna4Uk^O0F-_y zLn0a65`4n2S@eBGPq>YQqcG&uFXc+8i%m#s;vT14#XsUu^XyB{U1siN-#x&R;?3f4 z{FN#)#Ng!jr*{P+zxqY?oqqmY#y!xYEh*1>i@S$+rm6p@1wC5848CvFCRw1Z=z*KA z^6IJUWMV$n;?LXoq9T;=OMX}tdK@0bi;ZsvG0CLx2CWbvfK3$~)VhzF{8L#Xh+++B z%N{yxY-6WM=1CsQ%O+CBQ(t~x1nPFCceA=B(1u{1|LBOzUx-$dbS>W+IZK})9?GY0 zr;9-k0M$@*aFqAuU&f^(2dnNpWPE)?D;T1sL@F1BEUI0i*8{qqzTiv)HQB4v_ts4= zw7tXb5q0CQpglZzO@6Z>pYQRNE`fZ{G|;X36|sb<+po6Ppc!QnC*ph-=^l5KVbW z$O0Lo*SpF%$n*dM$ z)k$JNIFVLO2rA=Fd&HxrQFiQV4%ee`kaEwp4jCRK2n77Lq4up_<(1;ikLfbP$i;HE zbn?&FEXRc_e0=xakQ`bjYlZTbY+cCN=oTfSh9qYULj}(I;;N60n*m<@RiD8=jnBZC zp&ziT+Us*T|3#M@urW4`2AOF{2(%}rsm>OHsdExLqfkc+m1_@x{8Zz)Pqio`EG)t{ zX5_`G)(w}jHdL&TGgZ4oZ<}0dr3Dt(EphaZrM&DLRAy@m&m`uimzeunT3VJ9QSL%I zSNvv|n7fyky30N2VxlM8m#Vv=*Z#9CBNK*vr|!}>Ehh;f9!#+(f-zUtL%YO3dVyHUTSaE!bZj(PeCdU;M>)HzTwXhHm34cgkremaY%n6i@; zgN1Uu25kurbu(wT#dBqWnx_L`IT3|hl@bPBr7^|$HP-5b%ni?w>FMPYj3{=$a@!BE$1WZWm-`&U6i5Gm#3Le1>`J?=&i#@H2;; zZPzHWRtQu_n&u)7j~!oLLd6T%&UN-7o1{PVI~uB|KzI+h#8A+^fIRj`Gk>f}{4@vs zew7H^@;%gciqQ>1H>is%4OP?oU3IYsKHc1Y?b_?>BS!sonGFlwvt4|ZIjuX7a*t4` znEd6ei_lioMV;KAs@3vinEot?Z_4uo_jZ-+8m`Vv2#Y&jdaP`krp#_&uSqwIESt!B z(EnbgTi$UYKW2cMoQdz^6P6FD3qF;b1)dh7KL+Cx%27kc%OrvzxEluP)ufj6Fv>We zkMx!R=EA+H97bvCoI^q97~CXPxcB$S$@G7EA^UO60l+0^uIL>e(GN4m=t|x_R|Yet>XQq=>Omp}32+|!E2{3 zJh#}cuO&m$bk!>iBB?sly!cOG;WX?5g2WnmaTENw`FP>*%Jp)k)4sv`ym?Q*&gKyj z8QGER=n`8!e029|xwqH;QD}&KIwZf23z>As${Qr&D}+#?@zJacoZSN!^#r*A`xyJ{ ze&oVOPKb-D#4nl<5ehrVP{uf^3P)%zAxgfJcw?5}smhVEb-EA<w?Ij6$;MVlHa8w7oT>CP8qwpY>5MgJRP+hn7;a4B4u)-j zx$@H9hei)8gtqUCkj3Y1-ca3`ea2O#7!EcG$WD(EY#{5yqTf6i5hCr}25}=ID`tJ( z%JMlO>k)WtO@|t}_lz`jz-gnBEIoC?#MlPk-^0~9WuUe9a&0zUutgL#-{Rxz^n$w8 zWBUj#ayJaQr*gf>)lT%f$s-67jEflOMZNB-!yW_Dc1R?sB{?%vyawZj=Hm2YFg6Dg zt#1WNgf<5co5`JPU7^nF0C$Wmn7*Q$a9T29Pcz6!m0nf~ZArs+hnGAOKPGY4u$#N7 z9c*$)Yd^P(c2zB#>695RO9bjzgoz!QSFY`r5e;_zcUBFSK5NiMDptb#{4YlupG(OcUd`nCOb~iRysraYeaJg%WljGW~^3#&ke?e&pNRq90Vp zX>b#M$I5YU#8E3iKLsPeMlo!%LCe289dt<{s?9}yYh)acSQUl6dis1r!19M}zwVY8 z%Z*_u?F?Gc8tG<^v}KqWKrF>9B zx=+NT2;y@A++UrA$kN0Hu)yJYkr#22>I;$v%u9GjG5lg01F!q&l#nIHUP;eWiJ$5! zH;hz$)47}7drsHHa#^b&DzkAxoj)#Xx_YekxbF{goXF|=h0UZ3p|t~1R&f!tD9BRO z7#$estHfN*B0lqsn?89CE`D4*+}u}O8y00_9PhOw?A#ipEK3d(w)iM{UcNnOcQ2&^ zeVG8q8rI^$h%zI2+55)BhS|n*Y7uD`B5sD!q6&?I_)pQk7 zt7xIAmep2=<~uwb!X_$p&)(Tp$;%2nq-*rECM1I>T|)FIP*B>Q;?cjcAyvP-*OIXNTn-zM3qE4(W?xViKG!HOdh` z>4C0k1Mc@`22`^cS7oxf{r60FXj^5@oP(+t6b;SQd_`aL%sxI`Kr;sLyl|-^G}GXb zJF>u2JZfw(EK-!4k5Okh{1})nt~m0%|MTxet0(P5s*y%R$>hl_@gZG`Xh}I74N7Pk zKVgZ!y(8;}Q*|~>-`yb{DVTFz^3SuNWC3^FnyD`ww`^JUaD`p1lsP`&f^7{9x7x|W zN{*C_ANF>9qt85kAk!D(r)qwtmIzEcsu|Th`w_a217+^KBoa2dJs#xPU&N%QpT;sj zP~!hkZP;0{$z?r|;)7h-)B_$o(H1Y(X`sBnYvN@qgrnBt4q`CUl<|14Lbc%xBDluv zth3i(tjVBKL;7Ib%rPg;Gj3~tJ!GsgkgIs@us!u)n;ZiFEzOwQhX4Yl>R#K}W#Rv8JT|eOGz%c1SO}D9R+7tRy&o~^! z)TEIe8Sfu6Pbt%mp5#gmGCgtd27v}jv&b_lF#GEA`Wi-~v^tEe`u8liECrtkEEGWV z$=70`i_C3NAmf_gsR${N{lt4?0j(1QQIjsc_F0?jE*L<|)lW7eAXUJRR2xffuA}aH zp}t!n2NmrRx>AI&SA%HgoL9|J1+g6gZjYDCL10QR85cTo1NjYONYeI5aYEt!w&*7H zgoU!6rn?b=Q0X#RmiSwV4n4&8w%|!@iat{sdtWAuFEqDwUBL< z4ec&%0kp?_sQw@oWh^{t|OG0QL^&(poflu4W#^nrb_`gh^>!VLD8BPkV8&)Vo$tg!fYjdDpj6srPI_j&AQ-3v`3F? zMSl=nBF7ZSWIi+wS{BziiL);%RCmSD`N9z*M{T|0O5LE!aQ3t+gXpc1Nepg3)|uoi z{6I-IWNQv-yzA2|NPq6)WWEUPjv<~Jy;l#|D3z;0J0!;j;zrfC5X}Z*gBw*C0;^_k z-E%@Vsa_N=oX@-2*xOSyP(E-kQRt&oQ;xU#JBf+|Z{l=tQg}7LwWdfPPOL}rKho4M zfP3GnyiJa-;jWIqAPwd`B?@`;u)&FAynlHn)Os$rZto!0H%xvB-7s%@4VN8YQT*t$ z32nD@fCH1stzFa5^W%Pixw=s`_E)T7NYL%=-j^5ib}>Ki-u2m>#D2<*9Jia0IScfb z*@~pI*w|A&@)JfwaqR#HuLYKDsrACLvC6&AD_}7-jiR@#8UbgVOgfUMQHbX_yC405tW>NyHLD2`ktg!i*QDGC^p(ywG~zQ0=InNIwMSv8Onj zyNnH;lRObreIDMkO^G<;$oYhMf-2Z(>2pemLqeb)%U}UJu%{)jL4nOaCn`#;r8-`@ zHpZvZjhq#UEdKs9)|~NBNAvPi)HuX}F+;9l1S16J7Uj!R>bE&KGpqi_98lfDq{%dg zHqLpXB^MDt8feb6RSmVb#npc^~1*JQSb`}3-Q}CW!s&1;y^N2G!@bz*Omt5 zd5V$-ca_XGY}HfAf(q+&M>Tven<>0;klN|I_?O6OliFlY45f|N|4 z6Nk{iPIKbDBaPJ)$^#?x*!N2@J2X`Bj+4m9ohvA-OC zbIivSxd%fM?;lc?1P_@N)stpt9e@t=IXBuxh92dOTR$5s(`s}vA0k9Lz!$7%WLRNX zoE$bVAgknX7TxUciG#~+#<^@&{SB0@$3i%Cv6#rsWf9g9+;m4q?4E7vdR@wA?^XwJ zB%H=e1?ub=Mem=EU-e0KV^%6BMCmy@%UqYrLhd(A3o~mqa1faey`jemL*Ka6jab?@ zTF!*$2k3m{*R8VtUf;<(SF)KgOV1ji8;O|5;;p;mw#Z2Qs29hd{7d_Qeg1*al<}^f zv$j?__*b~jFTR6=3llmmF1=Sa_&sHYO{Mo8*lvp-6Uz1+rVw?(v;(vJLVP^8zr@+& zg`00A3$r78U3DPn3b#*w_o(M-pryPGu=Ox=_uWl5bl%})gl%1;bo@GvyA|^l^jtc8 z+*Q9IaH~SRAv$q(E9BY1qT)5Mmv5AW?c zo8%1c?VS!1Bub$XL1P@VtQJ@{hq%0x<0ukIJhklqd+<-t<$6l8HgxYAuuQD8>6W72 zoY&-Lf4zBpJa~3GOx;YY4M|Kb0P{XvV%FuH5v+Mfd0g#p%+I-hhwc#rnmA<#_NY_~ zFZXgR-`yaBln1B4?l%l4ZFeR-&KmEQoD}w?DhZ!6mm!X#-~sOnIFqa2qc9ysfWge1 zd5@>4(Nq^@99e6wSHR}I1f;uNxuWO!z7sezPRXE-cJjzax!qB7qx!Z zjZVL&c6V$jCKcqCq~&gYd^x!^{jj&S-Z|^C4~^9l+l{yR&_w3W9lQWaHcrk5flm@g zY%bboZq^dOoDVx>tcZtD4-r7iq9bJd^1`LDbE%ghhiRSz2y_K$G~Y;X9qCS8h1GbR z4c=)rHUXCsQ_Y^Oww4SZ;}eoJn}-R^!<8G;>10_?$cHNS^{m^wgsNH2t9jRp1BSC< z^R2FVOYf4ZrR+PcXY1zQi8lG%q-qh^ZFf?rVX`VY^kXkK5YG2B^$ac)#G_0yCuE9N zWE3+jr^Jg1!JEGe`X$FvkQ`eTx6{q_;YN>tX=fU|?SlZFICD~zOO=;Ni6k!Al297w zo?8roh3DQ*5j6gUBmSi77abdMH|jHeTfimMrLD8Bn|(Ab2xFY+<(yj@HUb4lv>1Le z;Bmxg_{ac*F5P6ZzydJ+hL^?zbH=PSqJY!tvMN9s(Kf`HwPeT)Y=z9sGY^1Q_~J03 zq;sUQd7CwV_HVTv@rk>h>3TMu6+)-q2Eh7UX;V`)Om2sl#k+l;5j-@%V&36_@>zxu zGBa$lcjOXT)WS^X!XtPn3XM=5Cyp>e&N5?f(^(TZTv;{7D-nZnKLi%;-lwA?WJdr? zY0&3W8)xY^U^DeFqNqlx2D^f?)uYakKS6$RSGWr|7zO&+o@EQ8Ckl;aS z!7aGELvV-SHVnZXGWehg1P>nEg1b9|B)Ge~yAJMm^1SE$AA9b5&sz6>xF1ffS*sbQ zyQ{jYx@y(o=#vv~OU_^GucNvq|oR>S{E z9o^x+GlVpF84@#KecA%!&~DUhrS_&bch8^wbV#4cz201%r%rTlgX!6%F%z)$>Oj)Y zuJ-xn&SaBkHRiV@Fo0q6Yl4dUJB`Vw1}=L!by>?dF63dvPeL?(#JgD|H0x*@mV-Oz z?fj7GX>UR^kP7Xqb+ojCAdQWOi^5fZcxh$;VygGOwn9C}230Gd!9nd1Lb|S!Vtd8X z3&PTij)-tcLj3-AgkEV3go^O1qep$of1OASpkVsBcRMML^6&^j$Z} z0%xL5exI>W&p^dbinGOS)x4Q`{KVM$kp_l!>}bCD=q%XP;viudJylo+GyA3cWN}=_ z$~`is*&B1ImmS`cCYdDq|VTLeco;2Qmu@1{s`W)=nr#XaVIhOs+ z+L-vQ?GzoLt*QzXytTL^t62hfS(^iA9w2jpRZOGD6qFZyI-BS$zbDm2zUB$#DuWW8 zG%XG{je#lD;e*S{IOeRkZOeSsT~<;2*~VhSx7dwGS>nc$Nbd@YiYNj&V}0fa~>u$Hw7(r(dxThjaeNLOszdW(K2_G|O15 z(vZq^q+t5Oel@aE`* z34iQ0Z5-H4ereEsLHKmfkr(xyNTjGc>|+K8sf;vPoIiucqwGh+KeMIBr_6`+hg(Za zW9t=ObbZ%N54T#?WzmzDL7|LXuG6z!o5glPIHME`jEs=aQ92VRpQ`WymSo?ILbbDd z{Y}_Hk=QmBGNRkP-ryM6c^$+5khf(>Zpv!*a$CUGakunS9p zBL}O-7c>t{C!n__Lgyfou}k0Fz=fHxW&y}fGhBOQ3Lvd(1D;F3+(pFPE@geZ;f4IS zBm&)T9sbU6hD}q`nb0vk^`jOU;TMa9l$F*T_E=EbGPV%B@PQq-bD5f;aDB12J_f?ZI)jmbiY7YiGm2b6={rf)Icf3W=VAh zSt8!s%d2mNRTHhG#D{jr<j;0mPJ}v+IYeJIa<+u#Z#`>f@Hy?e;k%P=(g>B7iliLuYnDhy3QZ-Tk2y<~+!8sTNfkeGspG^V7U_-4nfA!~(qL5`Hx0 zvQfTJkL#R1S_Y1*MAs#|bFg+96zb0t+Qdh}(ahA1R)AK#5_j7*vOG^4-2+uOPIq*dFBHrH-+M=yW^*hrk^~6#mG$|mPrEmJ{zVbnJgAY{xugr zM~P$Dp-PUnbo8Lc)HzZQ6#UfKef#>m<1v*h#yQ=Ele5|7FG)>n&bjypK0e(8?%m)$ zT-S2P!a*yx#mHu*tir&6s|Dww0pfA1g+Xb!qnwsQ+&oUO;{=wW3N9{__l9dj@IhRV z!D*5Jj16nd{cse7Bjw)S=56|!xbFV4>?g>|l>_y6`QgVh{p3Rpll*=*KPrCrNDyq! zSb6t*3e^E^sOzg3E$@))n2Sfk&4hA?#-^pax78o*H<$84_1|7tWRAT=_%vc6ap}P< z;dNIY|30TanGrzY6(SYM@=%Q%Yi1~~Uh9xo*=%guxt;{sWAPYkH7~RzoY13ko$(zt zxE@f}<}+iUajXZ7WWB-<>0ILZkp_WkKPR`oZQ4{n& zHC%=Wy56%3qDNa)?WQh^{oZGCm2>yHDEvxl&+7cHi`t%(&vXBvnx#_qDnaTr)1zpE zsm9|lkI$93Xi>nS+r?)fj+D-n442H_VXF$1NqF^6j*H$T^L+8z78x}r+2cB=Pq4pEA}Lsp;tp_`%897f+m zW2@>o+)L)j0>&IB3(DII@UY3-!#F#R5J_vgUD5j8Qo2Y6p?p-vYN3W~+T#Y3em}xT z_@crdAysDM?b*|(+a}nPSa}psZQJYKCCGZ`3UW4LOj}x(?Y|9PuX_bAkd$e4;#5vj zp@W=>WxtG>iIAQ%_G9T$lhNiwTa++iT&TT|jZ2v1O|i~7v* z1MpaBA>2iBqUK^u@d=(U&9BxNbiN>{me{yrvr=`ufZfNmbL>2|vU9@rsE-P%gs3mq zhixt-8`I=!L-5-BXaK?&Jy^8ssQ^vXA20c_jSYPl55LOOoINghbv$uopv&llJ*rFFPG6#2 z`M_-k-p|<~dfQDB4H3dMd-45wJzh{2MiFzXqh z!RMC=8@N{8>01UbPj&ZQ`j6u!B|V@7%V;5wE~Zw2&kSER&^&Xtn)4 zaK!|+eod%BsAe-aI8sfRSu3Lda`LlujiwD}$?bAB^M7eM_}3F{i{Z9a>pq{*fNMRg z@yUaR88$)#ciNAhA+YM(y_dv}wQOOpI$`YHa9INlwe^uoia_(Z#> zHil5o(9-X3O$A&j%$E-ij~<=9INssSHTJSSXwfbstSgiA6w~Qz7J0ZjH#t zj>&`aR8;3NtWrODTBseurmgT4Yaa5C-~h!&xafuYix<5Vy7%hs15z}`N1%yirA_1a zez4l9su*sDjy58oH*7wn zN4=gGZOf(JU|82kyu*$;hFY1@lN#!v-uaDOYF-c3Zh|{ZYL4%WyExZkCbZv@M>sV| zc(ADI6HfT0Q(cNoFTO+48vs+ze5yN*{gjTZ*9x;bDY%!6lLe~9`>6*~qSHF!C%#4> z)Y?;qTEYZbOf1Uv#4hwSgD5A42js;k$K@R7rshg~meF_OD0)PpF;6bwW{XxbVQ5|Dno#Je_~iGOxTPaRc}D zuHA#vehQ)OaH{vbx>5=&K@)1toP6u5k@A9>5}|nDMDuNB72S3%Gm6ULFVZ!dGJ>(B zexW_H#wEYx>DsH&v6E$cQyM|sNkzToiTer7A}00XQowV#Oq9_}cs#4-j4g7PGg$Az zYuhT3?u&O}A7A6tes_aGUG@n-es)9Cvvg7?rw@Cd!>kJkLM7Z0kYoQ%C;~Vu(cd6s38MLQh+`xAYK-q&Pp*=^9$dq^Gn!&y%AcE`hrE&U^% z^DpMc=xJ58FyU-??of@CG=~U!Wk0oGhKwBOQak*G-CLLVoMBFi@ax;X9c&7tPGWVX zkZWDkis4H3aqc*qJ&`3I|t%1Rqio%L84obw5y#^a7Rk6 zD8$g`Vc@W~Tvh4{7d7*j6+zBOI9lTc_L}G^^WS(DLXoN%?Ewz8@e+lt<21RA+FCSL zJScwKx(}5OaZ}YRRY(V7ofd9({dOhvf_<1zvtKuy z1Jm^?fsfTk$Dyhv99v%? zd=hJnzT#!FQo4O_Uo3q&i`KmIH1uk{*gNGg-}QO7a6i?=;q4KGd})gOi0I*xxi~6) zX~#{X?1lZY-CASybD`S+86kgRK=Co4*Kqx&)jPC( z=52cdw9_D{C!BY!)#m~A7?frCV{3<}U)U;)?_+L;thv(hd3%6^G@&AcY)o(A5yv)W z_u*66$S=`=otS$N;W*Ya1UER9E)3|1375xzq4D(!EVnK$EPzl-{Kc%#dWWGPQ#}}- zhJYL&k#PB-9!;IsjI#Jh^KlCjj5wXDQYAvG!W^FjD^@3^gx#GSJAjqEaSUs zXb=#N%AWNSsu#u8xO$hnq(O{HqqUxrytn&Cqw@tHOcS3HhfF(f72t(cTbJ1OOqa?M z_<>diqAFAAeWho;tT@UV)fcZ>R(mHUqI^pA#wH)X=XLt=l93w1MG zQJaQhOHY)BqU;VAnFVnbv&c(j%l@&a^`EC7WnHWD3gV`n!}ry=(R0FOssEPTj6(cP z*q0$CTO2Q5B^KS7oaXW6Qo*6ZL4qC+P1Cppygis+(aYAxx^QKFL{Lmslr{Qa>vVD& z$o5@ba`L=uSV0Rdz9%SKHh zRB8V#u_lr}sNd3(s!U5{A22bq@XA%jV$hbotC}3%-drN8e(_czh<##vUaqhy2}2E6 z@r!+F{7UwSLsY)uWRa$f0FJ}4`b$K3*g-Bbh@aJD<>e5@)DVaLfjDf>VEh=!r;8Pv z*UES%GTu4U%?&y+Js|0tSCQK;(v3{H48l<51I-q?D9n=Xqm~`(eJ( z!$4@;K)2DI8ZUg$7wi21RJG?g-bF(Ps8yNcyrmHvdZTbko7IPFZXiAaPLtjSByTP}+^N1i zA>*`*Bs0!xK{+zoa^BXe{%ChMVzI}!9o$b@YU_K_@-?HV=Wfcy;ioC_4&ET~7z`!=dvsc-b|5E^DwumD4nVb zYR2Uyo$7n5WsW9nFKfdR*~ZFE=|#t8Z0$~US*X?u``lAzvvojL<_^1Vb_evayJ7mF3ne_Y>|&zdbqr_rzK^qb*)r+~?? zb#gp&rI0br{-UV^T6pZl5A9f{sHye5@qMF^gRm(C19D^&2jEB~h zwIP5wF?amrLe$G2`JUDaE#i9$#}+adAiqFgWg#6*f4bnj&!3P{{Us*UoPl}H%x^ge zgbt$@Udd9Yqxr3fi!I!Jq$%uc>7du=*qm_v5ORgptC2T-1QgIgL-y^ zCRu}cs+OZrGlSlx;a@0F?N&1>k*8`bT3oIlqv>+KE|^{=c+1fJBgSdAGK_h4y(acx z4mj;MAs1Ws5gwnJhf5nQ9@EXlT>vHchygXxQh*Rge+dXue>(b zU*b>?0v@%U)lifU@#Bl%myTd4UI~be2 znXeCFV5BN&>Q42x`{v)7;<|2zfDkF!2_ZuFLZAkjdJ}TSaom7QQR!)04}V;Ijxel`m}q&Bdc&dCXDv>o0b|XaaG$ zszZV$0uGsLxm6&>%5(?Oo#dIY0MT5HggO#En#`Yv?K(!HN@3s2uWMV~2*x(nHB4;w z^v5Pw$$RA~=*zBC%kjBptZL->CiNVoS8Mn_qit}C^fp&{QOOVexbvLY-InBi3!f2r zlYpCOrqxcl`IKRKN$q{|^}8-cbkp4Gk6L_XR@1~P5H*g~sJjCg&c8XD#vK2~f~SdPwaGPSUf zLxlvl`aZe$)EYU_3n~hbnCTC)sP>YUodYv1(att=@f&P;>3~%UxVC!5!r_NjUT43_ z;9V+kv*uh@pZV;PA*Z7<(G#n}bxTV$cX4!VH^8;`ZRdA}G6yUG<(!5K27^5o{c>j_ zwlxT^ojj_C(L>|7jKnGvTVpAD#YD|#GHoY$!`&fvdU3zw&{TarTmvM{S}P;N(iVAi zE?P8OL*%oU>^z~75ykdi52CYyuaF>vEQNM#T90Cm&rP`KT9|zCJI)(TH}4dglX=g| z9t%|_sg1-&WbNFMlJOgbVh23D6f0j}(PR*;FktX8PG{3CE~m+?ZmpT~mfE@u5R^## zevEAXMz)xXT2{*_F>)`dDrtm{zx3lk387T#tGrE(^$rbqh z)2*u9IP@wDaBVV5$e8k-9KX-QSqUR5^x7_cxV~i7=%Wl}#>aEDK46_>bOQ z^&|5?8YKh#yIh`k=SW*tSDRh}mv(o!3&QV^^qp&6jtnVkik8~{7*PLH3i7;)khUC- z84%SQ&b{ouO^bu;!4N#fSql#D=j=jC>%*)qLtpovl`xqG|>&#fdAL&s&}@>i)>h_b)&7K_BaNUt{d=)sT2J14zBkmaa(A zax!A-622A?qI|17ge-YrWO>8c1N+Z(uL4ltoz zK*S)^OZ_pL$@sjadFy(M9<$3J_rt-Pw1@}L=fAv1QVqF|GeFy|q44-?%08Y0k`Vc% z_M|Hh(K74S%bEOB7G(}Z;y+~vDW)(#kPZ#HxEhi{hc*1pkO;7P}ryK5)ss*Z2jV{5=odH(9@XuLK5 zkIVBH#?8Z861Hci!{emA_QMW{o6gB1k~Z~4hxcC9sj}REZpeO9P5i_*1vpcnGa7bj-Wq9D5t1yzC}e^x4kl*&suEJdD1t0*{BE|NZB3mFg;D;lk$C>Mk?ftF{(s&`y#L-v z|95z?zu3(GBS<7K_x}hI3GZtE5iRzopZq&o?EeW8$;HX>@6h9?nWrNJbWu1D+Z4g% z&rpN#G>;&T@cjRz7x2GcApY5rhxiilPkQ-((koFC+mIXJnvd3gEwMa9G=B&DQfWaU&;)zmdK zwX}6~4ULRVOwG(KEUmx}j!w=lu5J+bufBfY`~w1mfFpaG8=sh*nx2`RTU}e<*xcIQ+1)!ig`J&WTwYz@ z+&;}AApa?~2*Q7dDgG@XQsn7x@QNZ&f5V0pdHNeLu__`mh}-zwy9`{&;R8vg^1|6h)V|1SWIe~n-N3efmJ97K6ox&9Ms_aBJ* zf1-B(4bb>!bpIa!8voOn`UlV`V!ba6=+0oFEh8@@i|Jme05!X#>WBrt!GG@m<}{k| zB9jV7ED%S5Eb`6i3Y9p@>jcb@jIZwmucMqybRNgK8|qr~ny=C@a(l)`N263*3>aiF z5k>#*bF+?om}Yy0w5;DXd2XHLlI1VU{^_Es8?w-+GDi3z&&%8(*5yiJr&!cpl?&P2 zR2ugb5!CI<_{p`!U7&TChdGQ4S#_nFL@hXX*cITwRcT{!(oOpvR9hpHXL!NZbbW=F zZmNlxCM4sgdYclE+a>Jsv>)Q&K4T2$|8i6|QRlq50*e6HydreCj48fPsf_suQSG5|A4bAq?L1{A z$C3x*WF%2Mc9xmb(agwcqSxhBx-X(cO>R3gHOl}<)sHp_b@#&3p)pEnUO30O)@p4^ zTuLc3sh_WWuUHAT6M6$k2yJ&ID1a_?LvMbR%$I8t))z=@{Qj!G9@y*D!tlh5tx_l| z9|jYL*7T#7=hn^D&P8nblJyLWCdogJ8sf}VreCXXw>b!^wfYs&LqunCV9+>F($d!i za20)tY6hs^Va|C9`NxKtpShiqMMSR$|6#bQxH|J)f{q`xe%2?2HA{yo=r5qUe;qx# zW>tJfQ*BTl+t3p=7&4^^?2U$vIAO=eOJO43fN&fuc8cb!aL@*_i#+yk=GcPEg+xtamMH}0vB>A=G=u6@2Jg9`;iy*sj>!>jLF zNc@DA_n|yJH)}4qLJx-ILakU=4HtR*Mi;)RJdEw`MUA%!H-wkhJD4MLAz?(}>euF_v&sml&t_)0x?)K+ z5Gj`~Ft?w~AS3cB0h$as281k}NUW7kyko#dL*D0cUZtzM4FBc)LCZQf!bhn#yNE=r zDSfkq>9rTn_Q%1}MjwsURdgdX$pVg5qc%LPcBQ23SPnoR-$x~F%Hf8y<7G3u`Z?)X zc}iqovVZ+~;vMa8JDP=_xlV(h%?F0NWQ}(HG#^j$tAED|HGkN!bcGC!xE?P3bg*!@ z$8gUc*%jfp^yI8}C|RZu9xIXDe5^w|tUIQ!Wv#C&doW!z?2I$5g_)(MeSdmNLxK;g zY2)q+xbq%&NBqpc8b_~f- z1NsR^s@%h4^Gm1;#?4nAuw43MrImlIUcdzdPf>?~0|DFJq_6-RqUa;~Bbj4{vl7V2 zj+vh}kDuUXL(Flsr3)CnLln!b44}GsDa;CJ&aHT1$!jHIX$43Mz2w?*=(PlzbR+xT z6MwO~0gqWGNiDv6W9|_2rq>Db{xD932ax>H>9UdY`=uL;*j~!pL_yom6kamQwL{7% z&#IqgBP4YKPMNbdCHEhgKAj1&Sv7*jQ@a&h=;M}#zZIS(%lBK2w(3a^HS*~80y9rj z^QTCHy`n}D+o+q$Cm5A9+i7i{I2?m_rg9x?0TGzGpRq_$&9$|Qe%bA|Wj=rm&nKE| zu63NVlk>N*7|oq5XZRO@x>TVPb|G6>#I^cWonzd^vz~f7~q0 z^shd_#-V3C6eH-%+lqeqBj#N*E@F0s%0p`qyo3@~%*1YJ@d{D87zfta*&mkB6&~sB ziMh2VCiT`X6y}0{yqlzS>K9_NrTZ>xMOzK_+#8pA0>65Q8g9uHFoC~;?!_6yx(h(K z=ejDMFV(Nk4{OCu*#d*Uj<2T?40bS2gO|!o`F%#a(CntH8Flu)m2O)w59e7=tjbjUfU*)+Ffdzj;58|&kQj3jD*V- ztymvRe82lm<9t(*FQcc+7zuHcCtSaHZFDPShOa=2ad5Pf-Wka0_-&L?b<5R1x?7!I zl&N9kvR@wVTq$G7O#TkV$sxia>q{Y||W@y|X*O#IexREe?vZP>&2WJyF6*&qFF)wY(qIRQHDlu$Ztxd@m#BbqDG zX>=0mw_RIZ)s)6$dV@R%Smg@9Q*`pgSB5_D?B&*Tmjb~9U(8koOAnWinX1s63E;2a zi+(Z=a#zo{9AM^~<2~LTt^+wc*;nz&@^ODAf=9&8n#Jvu( z-X)`Cto%J@r6{e>ARHKTS2_Wa%n!whdnCQv9M0s&_6N^kY?z;5Yv%w}lelg9E25Yf zYcap!iNq5>o^t7mX587bAhy`X~)rJJw^Cpqh|K#w8ocnwY%IwXZ$1rN>EqAO411#`#BZziRRnwmqW zDVZ_TL*;MhY^&nTesoYx>I^H3P<&?zMSUoVO$qb57~mq5DpSjWP}_K8K%bm)H~>=@FOd!Odl@ z@GiPuqRi!%7_@&nk0S@9jOVUdXvk)g^{+qCOJKRXH$B{1`)2Sq-r+8$d`qdp73DY% z^mX=Fw{59W-e8eytt~<{?dXgI>vgsxTlT3ASk}jDSO5K)bm|s?y`23z zHhA}rCLXTw^*h0mc-jlg5ZFomk=i6D!4T+?N|QIOF0b33m&Ij^vsR;bLh?`@@i|v% zs-Xv}d$_ux?EalhSoWdfM~y6Ayz0{UP!7-MZI&4IFO_pW0@RsahB@^?6bd9+v-B?; zRDl~nlA7rX)N6_^&LiaToKkAG1I z9gf+Jp<<3sNhuctcG$}eO<57-kWB~6M<0%1A^d7px|gy(b`ctWJdrPvJ1x5Nik;SL zj}tO`kg&GOO^~uro5`QjgLP@@ztynz5R7rR!l7^kgDa0uK!@2KIr`f9X81MKe7%}D zCvJ5cE~@GBjhHts6{11VD_w7x6iqbn9Gd#F7!$xZ{W$yng$Oh&XP=_-0W0XR$XuW< zV*J=s2k7Rhj0FJGOImrp2g_#OUug`8oITVtI01z-qOZQ-Y`1(ayA~Qb>WIj3B7qIb zdlTl6Rn{}UN*&|*3nlYk)~SEKew58$pfe|3!}i0{Or5)u&6Eu_U7Oq)1BG9i#EwCr zJ4Mno&}!-9BB)(70RqAYDs|w*UD{c96sgAw<}yr_a;dkpDR9!n@6GpO;a6Zo(Xw3H zn$WeiJ^E!XpT!PvwbPhYE5G;Qj!EdFB)CDt3Z7@|w^*v%57zdBj5gXMzBYH~)&@bL zQ)&IyKTwI$Hg`DUL9AWRIBHv*&RIhH4^`pzjr?p~Al8Efr3oq^UJ0ytZ52~6sXiRi zpWn;xUvE=4XLjNuGhK~FuDrn)Bnizincj%$ei_fMFU_NHxaZUqU&~si8|A8!Z)e=rx@r;xLT|ikz6KGUlc=aWRQL{oM zu5B(CQy#d*k&W4z6Cad5x#1rF9iymW;n^wpvT96bYZc3kAipOtWc2 z+-@U=?%CjM21VJT4DN4dB3L6ef9%{6b{OWNFGsw4M9g*Mo{X2rO(b)hLSSw+N;rB);Z3tT(d8huio85jJbGI!l3I!hU8>wru!6Bt+~ z&W>zkw@V%0+1ZeH`4HSJ9a>1DpMO$#q#1-NB2~5+lOArkNMG}gVNhjb-lY7#r_6`j ze)qOC%~~$cmQRtKd5;R*08@p#dNVYL0iz{M(fTD=_Wc)7%XzV3W$WY2+tKy!p>##* zW}^fQI<(vtvT3*#?_T%_9EB{2+N{#l?QH_hpxfc`b#jB|g7S57+l4)Pjl!WeK?VJs z{z3g#BNQ*n+~}B@r$KP*y*H&gusU$pyN*SuqT1qaK}}mlgP^ua2QOaf(sU>f&`C9) z!`Ub(S$%dRHILERwdB?ba0FQMQ1A(}z<|KD8ixJ0^QcSSlDrj{0{mk~yV1J>Jgp5O z8fM)_>$(lF7$2(8M|wvfu(TDvP2gTwj0)R-tm>Y&c)d#l$lAAtb;GT%CV%IP0w%Yh z*;O#7YO)$NZMJFf5+RIp2~O*`-It7anV*2kBUAO~G_|i?=r_CBOvNg|w-*CecuZz%s)NYWV+t63i9ikgVq^!#7E;7?8Oy zD|N;6x)F4Vc>Q4{{fFd9xT&OK6=#zuT$>*yRPqRPsj&+AJh+^RN-kazAXveAymhmr zZ%3_Wys~^E1;5Z6FHGz1_Mn+v$2`V(#Dg`^xKscR z#D=@!;2%oaWv9vyzW4iVmf`pe;fqfI{54Ia2$F``pq5Ha)q1*xSbXTo1jvKTT5LjJ zV|474jxU+@^QUS;yYXC~hH&8~f_s$9{n)w_Zs^HGjjme*FxbAv59%@=9CvGZmi6yF9d!7{ViBv2(hM z<4W*(3Yr8y>YNn?KN;U&Edqr(;Jb#}ICJj5r5{!jI^h!rn0#VF#|_ov%>5%np3O-` zcY;s&@@~W>V5G=T&$?a_ZwlvL%{U%3NVp-lVIyYw;eEvzGn@?6e&d9$`xR3Z9nLHvs`Ii#&Sfc3N?oh9(7jCeq2=OeJFWU7eUUsR zTgZ~%`(Y}M{7tsv4|4?e_U509u@b|fLWOt|dC+%}mphl}pbQS7qkxGUA8NING7RX9!2h|nrno)!3aM)rX<6dsW zTtLdNV`}D)FUG=bzoF3b;hjM4Cp$W8^g5)=5!ch%1y@wQ#*nA56U781~Q7x*zn zBkcq5<^B9+?4xo_Gw@;zTO+3@iVHV2M4=5&t?ao^U7pjLgWW&<)kcY z{i9YZ*y%(M%0B0$ zhsbZec?~=t4iu`ILXlzvuW}z%_AEVGmH^V0=!B+wlgD6^Dx?is##N)|3yDc8sP10k z!26m;4yK|=pU`uj&oYdup$#<6?%XAOuHqio$3<^#C-xakr^xCjY(OwdW62+EX$` z&l8$aY&+96qf(*(8fPyp)Ega<`&uVXm|CUiB&B=PJ;#1xUjmwzdytHuPD@FOJ;XTM z!fc7l8i@M8+r&3tnt<_tI8(pM11r1pr`qBzVh)C;KCPx>&ai@?C7*QmD|a7BG+BX4 zJ3=Etu2#U;G3NAZ$A}rPX*%y>uRc5N%Vp6fwVq)Pc@>Evijwrz7x&`IJ+}@`ond+s zUTu%>*bLxQV!38>aVie#-E8WZYt$AM)OBIttf+%9f9v1{`}vdQFvct_&@wk%Z-h&R z7G&~ab2A#N{b>FO^mZfDU{cXEE$NL0(2D53cco3xAo(1jz{hbL^{CFz&Meu_1y`X*0rj6? zV(n$hXMApp$(>Yd5V{R1))8l7^TSV@zGTqn9i|ulQ>7exwGvwk9~*GaZ((y$fqiQf z91TRloK)M)Eo67G5%re*^%_7qd|nRd`|S^NZ}~=)r&E$c8$~qWvc(=Rrz1Cc&hSu( z1Hb;3`;zSF;0o zkFj8~B)c*hGeZ%j9z7)O$^@*V)4cP|hQx~{+LpJnej}|8>%}ZBb5eq!izP?__)}XR zFCOLsmer-oi<5R>3>F5kkE%GyPa9X%MFpA4(_CtQb_B~+J=7d0w|>RI0&HpAQzT*e zyzK>31%+-OpXhh^+t(lEkbc5MoPAcRDAMa^mOVc(eq7gjqAC7DcnkTtaa-iQj zr8xyI+=-D24~H0srg!=0rkG{UntAe(b0INGz|5Z^QKyE)befLlSz8j1O{o3|y>r3r z`Q~)l09s()8(H6D>%#D(oV4Xbk+A`k^PRF~YWA>FG~Oe^xw&P>^|!3 z?HkAj8`*|>BHu_5eP6UR_p7h3l_gM=PZ)nx_1Kc_mghYu_!`DAMNrO24jUVkBt}%y zrDY9|e9sK*j62B9qRU={VkyTTSoU5qB~+CILgb5dMLm-1zt9f1rItJO=aTcBRn~JB z3|r5ItJ@0c;})=I5+7*BK774lScG`$AFt-o3mvzmU=W;*v9EnT8|TnzFWK>wZ5ZWG`v-Wdpla zZcAe3gYxRk4p%)J(Yil)+Y^CLvnYI%Jj#SbFeF%>Ipvp^nHX7@2AYk6^~-G^hXP$x zrE9sCv3>OOH&@%|DJbhJ5-&-Sw!LmFI3a-iC|mn$O~q5n}3whimQ&wpB~xa+`RGG@2ls zY$Emg7c@yJYo8u_*cK}WB8yFaj0L|{uJyNBnfDwNAU^{ejA-Vn1CU2nK~WJ+IiN8ox6CUCXH!%)-?9 zPG|hscY6}W9^mUt`?|Av{4T9yWGHM0{1-+1#0eRS4*z>P+cf~)z6+d6W} ztyv=PKKEJ00dwoErT?p)vxDJDlesk*)YZM4%ht*gGmIg~u+v>6+YI=;81o zmo2@pW9xF%^RFK`^6QD5i=knn;6FxFZqd%olR?(Q(_4dD&{O|o(L=jI#9Z89_qWcR zyIQ$7mj=WHfDHF;0-h@aVUJsw&Y}3;JzS^X^F*24k#pysE=UC!MYj+vsB12-KY0WU zOT6e3-mDV|>Y{x44X*q@NYgXG*{~)}tGJ9}HLVK-$pA}b*8!mbwqpae;D*bl&hB*C z_3L(=+v#!YhKEz5+k~&=@cTn4Re<4ZE|+;%nFzsJ%zMjyp-;vB6_3#_jcL%wChB-p zGZr83>;(8DL=ubt^$a(&)x_~6ER4)`<2HkF283Oldwut2XH-KsOugXQXpck2-AwANzCNZHN;Cvm*`E9Ui} zmUDQCxTZ?~I_E2?x`kZf?3Q;rjW@q%6n2XQg2<4ueyPSy5$S(lC8*XTL)q)yvBTCU zFj3F3N(wuftgU@x(g60n`$G0eroAGU?FgL8_t>9M!MuK&VM(6qisB3xPru?M?clt7 zEhhY-=XZB?1bA7~YXUS?Z>eC$`W*xGMz|v|7=yU#Cz05Pgx^95oQ4O__J6hqeey%I zGhRRnt-<56*q5Y_HJOE2((LZu`%Gl)738J4zZLWmx@;#ITsM%D#R9laP^fuL$8_f8 zn0>1+_n^b@{(yjhEUTmgG&sTw+MMyQ_-4)BBX(B601yj%I8@H+B1~WF?WEdj@01MC z7xk)-fonui>fQqWFZSL7D9&ZuA7w`%2^KsAcb~xt9^4_g4G?62!QCZ+;O-8=-Q5!` zIKkcB-R*tsz0bM#|K7Q$?*G-RSMOEbuA-Q4re*cl-K*E?wbrlWP@Vf?W_rE?OBF1) zBWCh$r;KE;2^!kqrZ#`dKrU4y#p!%`rX7Pt2ZJ6}|+yG==3;lqIo-RlX0t&R+J z*|lgy?`BaB!=99j`&api@jWA7)WNi%F{51SL(m`q98uBCYn2s5-6l(alD%aLIqQrg z^%>t$JQCXl@u)+tZvEwYG%u;8>>&kh9XZpDkFtP2s!M#Gk~EWpR%7>x!p+B3Y<}EC zR+$MDwT21b*I(5_$6ec(iAQq!tYW$Bd=G3=b?^D|RUk%pUpKlgx@+P}tP0a2*V2wf zxrQ>TimVBIWRB;iUcE5>V7o!4s3P?E1ACyHbD}lz`aw`C(9{N2B)eP)VX9WdQIvj$ zX{iiRNU)>btSfQ;X_OXwQdfcDJ>eYQ@Um@iUeUGF+LMgVYxC&elg5#tnn>HWB&v*+O7k>dF z!t10sQqmJ6tr`yw2j1)yEh_=^wD{P7ixAm)qo-g~ZzhjAAW{G)hdJT9j7Xqn$+W1# z+c#3@yB!pEnRPc3WR7nM_1T=!`vZGfn&cIP3&MWJ8i^at(2qt^U1#m_KORBwb9f_S z7bPLld8oWuk$Fq~EDmTc%bj)d1+?6_%ROGBVC6#}j>5xvG02{_w~EAbjxwC6G(gX7 zd6O6#9ZAylvIH!q>ee0QAj=SUs!Lbkqt-L3MZV)zHPGDAS#DSE0S%~$td#`zvbx3vP3tvVc6cew56wE?zAXucaEXTF8BgmP zRr3iK=sLT#_3<5K?Qv=dTzIm`o$d}9mp%XX5tSGu$=clLeTvuVBUYCvQW{lI4l0%$ zdm~fu(p+X)&;fUwUhoczu5eb|nO%bcmMgff@EF!=eiigRFx?|QqEp1b{VcAy}<4Ro;lDAUU#XsG+61oy=A z#rIK1t(W#ID=$~N_q!y%p6&8J`tjpnzD#zcLn z&X-`G=cN4%yE;xIF`>(Gf%g;yY8nY=EY~%Th}QD@F*74);Jk1AukAIYl{s2~^S!y$ z7uLsK0OqtvJ`ODe*`@k&+A7+Rqd=LKGS08dJrWa>mW)(R;b zh10dhQB8W?Shhy~TY9wd#8Sn`j$Qz~=ZjdT<@?bHwp5BYeb~e=Lz|^bsQN>7FNy}L zyJ%I0-X-P`Xm%B5{nYaIIdjb!W;$%1t79z+MdMdSnq=qlg(726rA&wShZ+s0T-al0 zWh4isKcfLoSoXg@+In%2461N-g(?aoA;dNe>pq(av0XR_;B8CGRwPbrg3T%aMe$^9}Hx9(6h33R(`Ao z)ehR#!v^eqiZpm;aG#E8I=`<}w3f?Cs6Dp^9?Jp-0C_I4O#M+`MFJw~8ExRFZ`-EY zkjCG8v5_m24M52Qc*C?rjfY85Lm2r3SNM}YVQE{xnRm>tdV>NH*;-szBNuRV0^*%J zZZT*@rF7z3csifX>v;Y+p7~bo&Ucw}}K_LW^|?9 zM|L#0N%{Wr&c59a=4{=#*qEkc?td`ky?Z)ib3-h`iTkb;zy^LBhkMHT;MlL5Ryw|L zD7N1iW=8^KSmX&B@*cFeJaVoX?%UV8EZSW-k#ft>cj)Km4#EOLg#W9wbo-;a>MV#A z7FMIrw0@|(I6c$CGiEZ|6nJe=>xvE(`-U$CgqCj~tT5F?jXFsUn9*f(To|kEpFy~X zg-!8IlT@Kw^N4!aDzd=q`f+L&sT4DUb?+w^L!{e^Ai1i8i@gH;pxIHBN1lJ7RhpPF zJsy)|f-pup!&=tYbruwS#337a61|#~@5CnCJ9ib<>W7l`DY7sgb_mffx!jl=bXS5E z45Jyno-RV!R{+`UH5b^$nb~pjTAkZ~CPpd_^6-*{(FFWEQ|#8u_P=_PTCN6+96o2WCccL9Q8|u6g^?aL2H_8NJ!@pj#O_9V zzPjoqIXmH{IF}>p&EsOk{EIGIZtx#$`Z= zYH#^SCpCW+@C5sWuz6=+>Q<&_8SqwgkBv)1t}RxWLl3sZtzlIuE-O+1^z>V zLTQXiRzA&zCf^F@LPUjKjy>#{A~YM()sV_4#LPlRW=}v~KWMFA0yEAmeC?&A;7o2j z7A@$aS4+==?#~_WyMLwib)8?Guw2~?CMrNZM?he>M+63ns)kVNn|_Pcytgyz%5Asn zZt51*K@ZKHBG8Ntb0LUzbea@D?E;mIBI;l=Yu=^Ig}8EJA;I!ruOw$7&t2)ZE!Aq#G_XhWin ztsJd9GV7?ZtUnv2)Eza*E#xJFcX8%BSb!PGLQ)wy^x7d;G^&feuL71^A=JUT-k5OsU^!1^X=^j>6i%N3!H{LkOEC`(A|p& zJxTHKcrTFQF%p24Ey;L79Txk#|8Sw6W%bThZ&o<1Y7rHu{<6RRGSwDmb9Wf!Olv-W z+0vdB>#HpKHdiG}xp85lDkPq(|EylQglga!FKx0eAMSiAXY(+jEJR5^yCU8;Bwzy! zI?Z||!E3E!EzgbRn&}vu@s)xv(okksB}mw~NdQ3AKa^DkZ*U&^#b@FspptZc(_gEY zL=c_EPIi#x86L2(hV52}h*r!oOg-F5J=^@?+~>bP*$K@_{veBj=;CCQCdIOS z`JxXS#wkI~r8JE~DuiVzJNrKK+V|LFPhh=Q&EHSZI7?705NenV7UMw>w@j&Q<==7E z12mwqx<^ThN^YS5JKL}U1f}2{U&i@jGJb$m(;xFmTV%a0&Am;*9t~xX)iXt5TmQar z6UCAr_+zt%s~VJ1d#)~_&8q3YTBJ%TDS$G&zJXFzV`^vhldvXUkLG&*IKqMHdb1fN zn)CX82NCxdrX>LM7MzEpR|gb?e;c8cy+;T7Hh3QAFXPT78g}Y-=`_Tr?JizS`?Ry} zLd)y!W{J~QvJv~1$Uu(XcCb<-E+lRdJshxWzN2q$=jSZk#YO9OyezC1n)>g+UAh6u5ALi277 z9&I>{N-VL_h7ak36fhva1c#^#t%P`2)K-HuK2~_57@BzITrLd*x4tzJHO_ zC_0ruo7^b2=R64p69h}oS$4DOnWD6W72>^o&4^nx^REGRiMr)Xh ztCu!8&kh!da=^>7qI%FQM%Rgi=~e!Oi#|XGf>=yYR!dJoJ9`qJMNdev1Y{2u8qJae z-dWM2g9G-AD+XQVTDDY8jY#tKpc^~N_3W0M@d{kNenf5w6~Cz2XG9y3`GNQN>u29k zts(w&u>{!_vmY>Ooht6BDVTzy`E`}=$-xQQm2J9_S4X-eai!{APzzO81{$eB`6%vZ z%@q6ow8S#=;yy96yoiHd$vTJq(FMX}bLg`|e)!iG>6YRd3YI9wRc@4;m6otH)hT)R zaRv}oJ~?L~B4Y7i#{)|7SCvP#?}ue6RxgRuQeWw&BA!y^23p%|SGYpl$+6#mWRT0? zI(7$EnUh+Ra&4Um9sg~&(&yz@>r>c+RcaW9{L@UaZq$a=uP-oI3sBhfE#t#DYryv0 z0ck9#IPJ;z7fYjZ zoGFuy1ssBPIf9A{SFmb5_Z+Z2%~pTZX{Favo%A-tnDwL#%h42by09$*81|6EdPRMP zz6}WHFe{V(G%nSc{zd^3YY=uAh|MHD*%&!SNu0=Kc2v8B|AdiWQ={ysSJ6>=)?u{z z8utLOcYYCD(za%LR82}%tkq=h&_K6mPl?byqf93oC~BWm5md3*i<{}}9L$@PwHSWG zsd3|As5*8{a}dmOvv!~2bJKnf+DE3TC<(@}WwwF;VPoL#S3o2pho^`u zso*@aNW#Faw~&$24XKo#Vo45|z{>!DYl{4cu;a>SLt?-~pJ$kC-gDMW(tt1yFM395 zSzH%mBerrOUsp(97%ijYOt^<5mud=yZ;YK3ib1<<^zaYS7nCwOUZnJ$$Q^HgmkL5qVf){*XB+Nbv!&P_c~2 zo(*NDLL8z&^Am3$0y+D2T=ogVOyUSvZ0MTPO16t@*(;%%37BpRmnS>3Nv#YNcGVH) zw$^!j9@u}?Q0zX}@(m5{@%_Lt6G(fhn9|pDv19IY+1ij+_l{sRq(v>+hs1NjucNCu z0E~%4X%x_;=k_jDeb{DDQ*;xzf`{7ic}I3j-)z+Tl+ErFv+sTiyf!uAfLyNNp#@>B zyrXnLtakf4FnjZ8q~cd!>|Hp@qQZkpuD}rTcn9&H(A@BhE*_IJHRLsT`H0ZrgXBS_ z*k`1N*zmeT=^g+Uh7p$kBK9rPjw_%63MpH8bM~7$*$)UR_#SS zgRTx(6!y;p{SZp#rkNf2EFrPmOh81xz$b1j1*^5~IR$>qJt%|3BhPLsuf|UBpaA`Z4Xc=Td_1;{n` zD=UIbS;@Jdwg6|RgG~GAHzQQSpmc)ZDfat6(vevBO|)dpT;@?VM%AXpN4K29K!6wj zP}INM8?Zf`y0b&8+T@aP`%l|o6Y1j=A#g+j_k}pGPFN~LBrUf#Fy0l{87H76EDqW^ zwTc$$`t>L8`+6AQ-dPOm8t)(dp^I+bkt_BsZ z)4CV1T=Ce_LGD6nB%tn_BdoZ(NxAx#viEN-H`_eLkslH?23Ppl3KF^Q`6z^-7Pqc+ zy?|rckHqv9bOyG&R{LJ z;jY*Kux@^M`hFRNc8>|)Xq0$Jl-JkV>UODS3!Yc}*dRzs;g^l$&z*+UYpMfILvRy_ zSaDa6i7ksci!Ex2Cl{x2Ki5rj&>XBuwB<)Pr;~7cTTl1z8ta=c?~fG$G2^fFFyt{^ zRTGhAjqkQF>h?Aw?DO3p-%z=@-0e2=@Lj=lm|jOnUc>1KUr|PMvxMleXApGX8ipe* z6N_q>p}5C)i4%L11(SxW!L~nI+AG`JpPTM2sY%>D%KPmUkcQgPZ#9;yToG~`*<}eH(ce& zENyz~=rh%y)-MJWSj3fvXxBU#_rRQLWle3hD2ij{HpqZEd5EM6xlmlBVKOIvLQ5DC z$HBQMIgUE#*PspP8}Ov95SULckG=SHX>&d8SC#uDcMu_}@?9*X4DbzRu^QP+<1Bbu z@fXVnd9>Jht*l_TxSL1KQI!Z+UHPsXmAosiXLO(Gx&o>;`+79{EyrEuvf;wyaq-Y+ zTdLM%=(T^}+<1;?5bhLFsqZ9Z&zPtEZNwt2MQy86nxQyQswRXEbW7EqwUg9ywCVWh zc03VBNOfi7Op>p#9;P^9!Y^9p_NRWI8ASB=RRm6MfAj0?8CmO$5fHH+oaI|)6lCX%%Co|y+L!4RGDlgg;LHO2eUo11oEejPD{ z(}NZiDWdV^ARA*j51QSd)2i7P_7VCnQ;k0Y?YB6`5>d797WVvdE{JircZX`}6!ZJg z`ELBabFB-G{x769C&`%@Q8IP{wwiqn^dyaJ-DDY}`q6~!ecJjIh=mwz%oWubCf8#p zGl_aTONR2bC|a#rrFxvnCCHESRGE>sTBCC+2jL>RXk*8N8=~!g{{8a+yN#T8&RiLk zm3uYG$L#yTT5s1?K-bG3j?Z{M9m8fzdZs#vs+lvcv3fS0AFQc6kXv~nZY>nLyrf;3 z>)sw$@j~KieEafTk9w?=es|aeR#YUj4hQA!`l@Mp!CM6>A(kLaWBrcY#o6NKQ6fSY{TOKo(q6)RZ%Ve6poK8+Bn_F%Mqu};hozDee`Y`(PXl{q0?P-Bh=Mx-T^_l>b;qhr zg}Qi2c)D6kQPIl%Da929fz>~3?$5()@&cOudTE>QJ+n-NRcT<%S(!x%Wpm0TtzCC zzufOF6m6FY3(0CzQWbZ*!TI2zCw=q*mMv7ReP<6>O9HBQ`4Kb$-2UM!VQE zTrro2OXZeWQDDy@x10@Co`iU_mCi$|eR#Py6id@{pUKiW(Za55yj!u65ckl>#F!`95prR- z#$l6N55vflU22`N$G45T)5_|$a^2omYYmxg!&8gwR-A0-KM-5%@^Sbg@@3;{jeWYU zxUx@&l?Tc$#1QsjyWb#UPN>UyTMR);;cbV7myu)1md6RIhvlvhrs4@2az?Alsm#2i zOANXO1osj}9i4i2P6IL=W1OsY;nh7ww!#rvO-m<|Ld?Yy;g0Yn(Bsrr2W*D(W1EjU zLt`jSd>oJh_ZAAz1_!bpK^DNh4Q*{#^UgBZG?!wg4uY$lBKV%e392II1rKsU)*pYg z^=T#R7k{twzcuHx(@jP7BGoLD_?+IO-JrTvfyV=VOv$VBAM7vaYD-Zc*lhAk=l^ya z)E6GqcQ&R)X$!NgQ+4=x%3slf$OpR^YyLJVQ`*yIVq&IsMR^Q*w-v`zw4i`tC?9}?}?U8)H?*-1{`FOUmDjC1%e8#7Wi zQ@Y`g6!@Tf60^kFbO~8f@^*f?MJ@VaQ4`&(u_ooMzaoW^zZeY~b!J!ZdYE)x1U6He zo${@;srBcq3n_nNi-o0yP7TZzoPM^E63W0=?hhK)tCzrtYY#QBaNXpUhx7;a^#!3x zZG00JVIeWL?D#Iog5gpBn|L)ys)m5O5fuw3_If2QsG=QoJ(!2?@yBaYCfm;Ja6Tao zL+MOm>vWkJ)rXO7+yiBU26TeA`f@YyG+NoAbU&RZAG5|c!xHHjJYx^G z3E_r9h61I;nOzcZ)UA8=JG!GVUbh8a+E^RjFPU2{`!=q85nC*uO)kw!TO)%=^UekqS5(GEs7lOe zS85ruLPMmkOGALPQg9u4(Zf|$Y}7)oJmAB04-uBsQznG78j1_D`F=SF|2~ABe0=aQ z*}%HoxQfcJ%F{!g?~^d~XY+FxN2>*W=g0$N&6tgGp=Qe}b05Ou6=RrZ9~P{>!&Gzi6yVF~^hk z4Xgts+CHwEBYLy&&1SEbU$GI0*LE$&yfO9>p zSUzrAqvj!<%?aJxo+X}9hAZgX(<8>91If1SY-Vky#^-$kF0lLs7DRFVl`j@I-1%$? zx2>dZV+O2ii7_oYL`<dX<0HL7Iukavj3L{CIt)3!3 z1_-bOO;yO9)^LvqJlB4~7yRK5e?+#I^jOcA6RwIRU?z~#$H`9#pt2w^c=6VK!Q3`b z%c}m2+Wdm)b2?&XlrlDj;01v8O)isY{%KUBmB_|P!UNnR)pxt$to4n%w7v79fx~EK zaa>cod|Y+HN>eytidZgQmWbpES)9t?CH=?wFb<~La0$s~*%l1?AFfB1P z1D%r#76iV|dlGW#vJ1uihP2=2_YXwv6s^<~gC%|@p$nxIUaN*-gjuyEF>^SYM~kV& zlRSD_6WOavg>|}71sI?T43MzvW7OrdNz;rU8G&kApXI2}njY0ort}}-GeKCVvZVZu zXGDYFJlwg>TVD(7Y2r0J)6!_zRo|?B;b8&yC4bq?qwt~DdMKfkOTVf8 z_Z*+pi~`AeI@U8fHn=Y|4nnO_raH5my(H#~q37@{_@LNIC-r&Y(uxFU0(HO_Tsr^O zBFXU0e913f#~#E=e2`-tl$q=F&_|y*oXEI5xwjaQ=>ATh3nUOCm2el|nj(0CL&O}DwtiMny~C@jvl(<~=`-Xge(4-T$BBg-oPV7*(tB4Y1* zNIgO48^0h|H;TUZRhC`zDMlgD@PHl_#c?D^Qn$XvnLALaU=&v=xI97?5)#_zpMN-w zHd;&HTrK+k@cnyU3u9of8Gg!&l3JMmpv9!11<9n*+ z2||pCjp;uM3)t8RS~_Vmf`AHvKQ>M_5Hklm@ds8W&<9Q}u%HpZOJ_wwCrb`cPXQ z9w)<6l*YDKZ1! z{|O=jln@2_0c2KEVkBnbd;&#L0KWWWW2vtQwbKND5*7t3L7nWt66U%_P$4a_qOq<4 z%)$sLp=kV6J=@T77>SX>$o zma!kJWpraF5JRKkj*CP<36AIq@NCp>UbPXHie`Xrh0ASey_$G47c6~=UhvTDv+25} z)mEQ>K?z26^iIN=n$B;S&t0^_dZqXoey}LG;<-%P1HxGJl(2)p{THKU~uz3%dwz*!ZsuRqnoJM3W>Nx z@7FB>>88+#7I9hUqMxzfF>QmBbfwVAWznV#k)#R9oySN`(S_qrxy~r^$o&K}92qEg zIbJ{wtBPLJD;Q3E;9Lu{(avB-WVXIyoO~GissEJ+mj@-CE#B_N6$toyy!t5bOjxOD zDwIH`W=FH-h(bu&?!!~q0Qz#CqFYLk%?M@Gp;HA_2VpW+#ugDK6i%pX+ArQL+$vly zWn7-`Wz3TpkMHl^L~V~h(g%*(H0F(Ar~K~yY=h3f)#3V@OAkpqyH-o8X{(ZW2K^;6 z35!$2b*QPs#1e;v+E;L?@k3y5;Q;0`gQOiD<>%4|M^ep(FTClO2{ly$y<5}8ub6j} zyPMJpD?5#q5oUEArkE>+UUSK>i-FjM`~?$fc?^`-xaMGHY0W6W%~V)9jP)tVDlx?m z1h^v&;VB_Bp!emU(vj67p@tZRe8blSF*+E%feksY#b`dz`V@pd3iULnuPKdjS$_De)V|#@F@hue z+T24fpOdO^KS7@M@=S-p0YlQW#TYwOFrFm?OLTLi6z(}3K8|1Hzv7EeYy0o{|Mz5P zVPyp?{*AGwCL{e9OOydH{0wvf96vr=I~%C3Ir1Bxe`5RnjV|cKORD<>v&Lm%%k>2L z2PP%{GmD)mFX^B7Ys6|YpNNGlZJ@+#Aa(|QCRP?=4o(oj*_fFa=>ayw!~tgf0A^xh zU}EHA{=fzBg1-~#6RhChsDght20ZbS8r#`fae={(j*cKl7LcWl5g1@aoM1*~Ff%g) zkb}Y2*}_iOiNV5_?5T>s>JWz7>f6Aq>|mA_#7}kV>is_t!N>R~>LSz$X2|sk<^(lU z7lxTbEdY(mf|rzygZ+OOCy|Zye+KFQ`-AkfrTx8<{w*@te-9^-^96=ncv3V+h{4-x4JCy_U3M;h;!E`NC1Pq{K>Ns0Oz*r<}w! z?SPB3M1c^M#V?5ZN4e91v{@8F5ox@^9v=dSDscFciYBj?-#s*jJcS?qOuN>YmXYYc zSq;Xd@EGzwnmNS3tharWtISTSyxXUExfY~OrN%@8!o@k7W&!cll>pzh!!5XB3+y4R zQ(I)`&j*n{4k*fG;%yNSj5otJMSIY`^)o%B3F0eeSBh$W9}Ih+PEhf!BYxG2s7ExO zzWc_o%G($9AXy3m@6tyPVt2AKZ+K6XGY@kgFRWs~*ee)&dw46&^y-r(llx&%oDb9? z>yy}~bV^3hepMr3h~+kRjp=VuvP*ixR&M?n6w19G`(;cSsy-|=mWDAL{G$O;ej=T_ zF1mu9RRlCmMXsV)kCbk%w5F`@YkB zU3NBT81nmoAnzin{_L7^N`OjnZFmb*VTQa;uJha9aqQ(>30~>c42>tGpKq#R^P^;K zRm=k(K|&TYl2(W(W~_Nj$1|0X%_kKrK;_16* z$`?x2wJ{ewHGbAKhN)G44*>+D1hN-IJ#qge>RqxkFMhlNFko9va*+B{)0*FpQ3`{D zi0h)}9YS=fGXmGWydFW@TzEQs%3G6bsMse{5jByq?CX*sZMr_h(im6O*wvM&Z&N-u z_+Khm`16#V#@?b7{xGQ?-!3Q~Gn7-ltvSI~Ox1^yF$VRJB!q?O7!jHSaDJv0dOlZe`p{1Ip0_oAl;4kwFFmZMFe>*QhG|LD2PG=oi&=AV{YFyr;AgirE*yAxEBZt{?q?XOE4*XwRX;FD=&gs&hrWw~-E zKyt9)+9J>VUbcovNw}~^uiS*RK;iVZv>ZP($bGVG&L*o)t?9x{oq<=*OFu{Dr^YVxdqLC?1vB{AvO)`;jSNo1wQC}2xB+H7^0H=mInQ+|10D#Ys}AzbAB)2 z6#T-{?BN=rNsPrWs^(c}PU;;OH@}@hQzp2{p1C~~xEh2idL|q8x_jIZZuOEXYtkr> zlST9EsdcKa1?4A}j(-^cBW)_s!DvIJ+wJre=)9-X;i)caDF5E;Fn{Ld5Bs@36%mB= z-aRZs3wDw!q!681xn}V81nh9d1lFW-h2jjW8gQ>OoPgtG{Q6*CQQCQ72 zapn{uh@zAlg?$=BEcV~j=VZA=Xih{@im!6CwH7ZX(u_*8F79tf-k7s7PEiNkoro6C z;e!9_<}Nue(M99=MZAZRSyiyN^HEAVTT~bVvm+C#Y|M4;JUhf!zN(ogVNh!lK7sP* zEonTs&G_E4^PFazM#Fq{;6d;4vI2*p{WGBoYKhHM(Q{@q-0_1`OXjeD2S3b-_4x1rE4XB!Wf-EG?Xse7F4 zXTZeVtg;Khe+jV5UmT19W;Hz2no5Fwi^d*TJ@;}3h?#gw+@hC>JC6KS)wauap6av! zn{jv`)+DhGRi&XhdoRtS*<1W!-YeO{)9TT*Dy9{T^~wvv{h3ZTahf4>-s}>gW$y%j z!Jy@mu-IWVUIa4QWZ{QI#_)6J1w&>!#{rXvch+)&n1-bwjg_h_$1Y=Sw3E2WW)|9!N5YOHcd2cB$Z(D!ds%2-DNf-SCs`) zhUL&;6*njQ)G>x1Dodjxe>500)+L^pmQ5I+3Px#1PSX?Qd>f)PZ{2*acRG&V;-M(b zTK92#ah?m0KfFTV&2f;-dmQ_rLUtVzsHXJyVS|u^ljzd9_rr=DtoAtd_Puw7Zy64` zdQ2Mgg>(nFlo(Rt_ebItRVV|x-1>Qmc+|f#P8!vHrt4=Wrs4>H^FqJ^RhRCr%QZes zeB33y6gAvSZB7_COaUYNy?!-Z_1!dFFe6xgUVtMvw?0!c5Cp&Hc`lxQ`Nk`nf&@!* zR#Uas7u)u2q}OBv^{4MJ1T^2|?&QJjm{qUn`;-s%nW*|T^pVpD3`xC^2E)Rl?2Jv~ z(;Q=(Qy)<|!?=*`=oPylRTuWoYx4G&nmr?ssGwP7lCT)vXbHFi&v9Q^PY&~7eTn7Dak?PEMWf5K39SkR=pD(F*WOqFR;xggtKNo~xm_)9Nh4*0x4TD84R zOT+4#6Gj#IoHNk9^ufsV)mK{ICb-dvOFQ*qHib*cA-`i=v4SXTbt6g5*&VhAeCBd{ zx+rve>?j$rTqdXA>rJBpWETZD!crtn!=`Ykb;h3yG$hZ|52z@Vu%G3W^!6PhqBPoX zrZb#h*!b?6ug5-(!vI{tvxASE3d%74feH;xc?dC~hLUaDHx&oPec8BzSD;J|R!=eR zUwhM${sFINtz}Xf;Zs&D*CJhOL~(W5)ZZTU>+>G8B!ct0xVRmL9} z{8se5r7)KxMRjS$DZTt2r}V5~6)T20Jh}-7G%ifioKK}qw?n@>eD22+{Gr&)9gVHTP9K8VBPM<>F5xQ3*0dwdSt zZD;N*n2G!4=`N`H(Es`+)5`X2#^^|Pg7#pU9^Kp}j;GZVRj?7{`yNYG78=ZoLOZf- zH(>>BY1^!ev!wdeqxz7RBFdzXvSUfHT*D?N8B&X>rZuUF=e2XwL1dG6e)l%2=JV5S zAJ)F!A$dGg1$p=8DHqCSq0uPSy?p`c2pOLWd5^(Jlk7bN@2w^5gNL=S^o6PG9evqH zpFv30@Yae{(J0Xg z4#b~EpyLQO->{1PK-(px1xcqd;tk>~DE1-?%S%0PncBB$?MDN;q()SnENYxrhj|^_ zS?xzk%Zm-?*L9q+{!hx%KOP@Sw|VTjiUW}w160VrKi2qP@*#T^_`~=q zg7DiP*+zCGPfPO0suNo4^)@XE=Pl}0rI99DoJ%9d2Dq~i2TRld@2?+BYWBrWhPO_` zZ2rq`FMMc(LVABPhi(pWp%Rv!qPd3MHoHRyWuRT92aw##s?xy%X)PYWd-IE_uDvop z^Sg5SOp`!#7Ik@(F$?w^n=h`5JS22(#wXl`>!4AZ{ps70!P0Q7plo(+%C^dc1}aOS z6F(-6Q|SkrP{bmsZt&5=?pp#zEjo=cU6F@hMnj?JCc`vZttNQWqzg%f6Ux~+7do~Y z80I)GLKH&n+XcjQ54RtSX(VN6q$AW+3bJ|>4nuPf8;b` zqDU1yLR1`fnXVn1WXYy>S2A^I=x(&+y+h4tF0CF%s;>$)Fob#rV^|e>_tUk^Lr7a#>XvU}I{RU3D?Kre2nhDH2(ckyP-4_Z z8s$(S#6$61_TgG$${$U~QV!rtmQ)`ejQOQ5MfL~51Tq@?A;C#Ob<>LMMQV7=K#~kz z-lXtt+x2&1AN;W5rl2qzP<7|M)MQqJgtD&4JsYKaYi~Isf03yY} z00FIre_!hnU_P`m%_5pDxT8)8?T8Y)5g3%(--+?i7#cmHHt5VZ(i1?++(nq|mErgwHouYDX7c$5af~e3| ze!HDtN|4=?c0B${XcB%dVBHui-Sk(p{=Lr0$m1y!^s%(GV%?HWgc$lwp_z+92b`32 zH)!gwFD1ghM?Z_CDS8%Gn~)Y`A@d?SbtQeH2pVs;imv-MMOwz+ZHD`|s3AoIyvJRy zXem9NXz@Ey1B&<&&G#jUekR%;PlLz?qEXp4a#NA#Oei|CfA4-#E~Cm#Nf(qVa5pGc z4tx8uzKGkVb|j8+23Ar@@ab6;d_|8}k|U`wMp#bl9`5dZ{2PjWIi(n2f;ALYeqrJ3G!ZTa3 zM<2!9nfj}j7G$Ur*Hcj0e5Nwxm@0IIR5+`96~g$l*AR55X9C9TqIg-%aU)}#O>=lc z5ygU}Diq!pMU+qiUK5WWi>$7nTFViaf*#AK8e-`dogf;h2h?JygJrvWEq1chm2QX8 zaYv8CTW5w!PR(q&4W36)#o#RW%rd4>)S}C*4&&NKb>hTm2{&PE)6c6YxO#kuN<_0B z`lLWnqBzjNxPW=GfC%(^SF)PPh1{cz3OGV&Xgvii1s~S(hgSf16mmGGk*Cs zhar{|_knewVK_Lw9I)YJoDQ@YFs8$`2#@62i9N7xt0!+CE~(l2xPTD(7q^+ zv#wjTa_ziJx)fGanf*LbnXkp2O&^q+pc?K!WoQ|Z<@C;~R6;-4k_U)9{E|kNd?_)& z(a>`A>YCaP_Y`Nw#VoX>ik6L1DJ!;rXRIfYy&A=K1tKgq0W@$FS82zfu=%`)EbHrg zWGcL=(12W)dF7IJ!+dX7b(Lp&t_UWuZH2MA%9d5)CxX5nwWD>WW%gFsG`&P(-xRf05VRTmRZkw%h>=MdFl)c3l#KsO#=8V+%RA5PjuGb$GM7~YH~ zEUr07sF3r)Dl3ClBTD?o;XSV0H-TX|(ii^ueHTTCs-w!36L#bog3$c+QNkq%>zJFU zo{}t{3%X4rXQZ(wlGi%C={uY~V=yAVKl>Drx76Az+B!)&yO%QY=;HUT#DewEZuwH< zy(Nc%pr^rhtdmj>O^pTeJu%S+x@UaJ;eP&d>z0@%9`GJK>Ckq;NDq3G`JgKV6JY&F z!l@=VgZ((eYVM6=CU-azVtU0loU zSZRD8T1@&@|M0Z21U%fSXuc#K>|N-VX~87a`4pqPQT@KX?B}7Q1Fnx(cOpF`RcD$j zks{0;$6m3~Qb5rZpqn*1ZuAulV#)u;G7VmQ9@l5P*?Uj64&}z2&K^Ijp!BPm*pS6X3^jIzKLVj3L5Fao3?D} zU-2p`q7rinf1@4{HIo#3d@il+cE?Rq?B-g)%DQN1+xf;vig;*aDw~k!0oLrCD>M3I zh+<`^^>Mt%VmpA)c8=L*mxGzpicOg?up*P9q76^FaubI=Bj!NTsjkH!?U}3G9habr zQ}Ah)(eyNGZ~4xNx&K1!!`u6kf%}Wn`SMmG5bjC!?Y0q;tMY1c(QoMZW0?+nvAMn} zzF&zE8&OBqBJtYuZ}d&lO~Howpz(ot2z(TFyVLT|C7N0Q<^=<{z$7JA1&qdS{!;JWJm(ZUdGt&TLPHEl)1*HYR3w-* zzWTB4F!l2pT$ySf9ObwgTzTt}i&TfSqQPC!m^8Ru<&Cr@N0#k<$0eHMYMv4i{@RLf zDumd}R^;L2K#x>11bl^^Q1C8GKE2q$B`^+3CmomPG}D6fc3;mhG3|R9DoFUgmR+Z9 zy3B$(H0@XH5Ej9jx)xhOHd>+>)A6M}*aoG$+OnJczJ7J7GG(`4vYUFXSFpy|F<*Go z{~SC(7zeSS>(3m=zccH}dMK$)?E0bpZS?Ohz!r98Ne5n<# zd-V`Qaztx#oz!cX3%cpM;~$*7oGNlYMQ`$gI`u@~YVsz$5;jCZ|KS3Pob=x$Hq@=O zkQxlARPR@4{*mwO?GX!Jd-IdF6W!b#g@uJ`_@O_s&C$hCGk+1@@&jN@VV zY+?_jYY5xB$m{#E%q8ngSduIu=LM!_0JKy<@0~?#BH;Tg2Y;_RVaY5Kplf#ypl6rv zt|<_h$o8w)(SnOGv0|J9abgsaW~PcIwfJ6fuQ~_+c&2y6&5}^5YuHgor)m8RM?5;- zfeFH=+@`WN)!*}BqV{Yjm97vAE3QE>y6O8_BoOW>E+^7zri-?*>?13K%HvxX5zInT zH6+N7CG&VtgDxt58=l85I-?ue&w4JB<-s5D90_5eUFB}D!zhlmIBEX_5W{ovRf?@F zHLq48=hN;jfpJ7A=KX{}44{+In2jz)+)b%k%Hmgs@0QILWwxy{cVlL8_eiC&2HJj% z3Ef>mY1!w&LOmLqg18LJEn71Y$;(nVn`r8=lI+veUiIlZn26ar@u-T12Hh(1$-Hzo zrzwl2X<$BZp8m$YdoytOlwPi;2PfkCo+r9k4VnLC)H6>Y5)Y=!{7y>sj3wi)xLkk2 ze=JO;>E(V+j6>#h({fvD&Wd8EoQ!}_o-uWKb@JynfjaE{1VwjTlE~`*mgL;2H;Fqu z8t24(Wggn&++^T<%Opnc#@6DgGxi1a!gwuqKiNHeVdv<~TftF>4izuVb~0K?LruhA z-8B<6b5;5zpDbfsYzzY8KQtQd64nUne6!$6&v159vdfUo9u=^%vNbFr=V|-_B@-(8m>4^QPnlk`C@^_E(bb&X0EWb!(4vmhNHPn=aaX>G~w2_!pRt8p-KMHkgoeMObtm|e>(YmP}uB5fgU_= z{@S57acF(jLu{VKa|AuNxw80*4rRlPuH@~<4i%smKg(64G^fnzR_aA^kWt@WCMbb- z+|vOW=hnb^wim%uTH8yMW4a?c7KRe>?x)H``<2pO8sD(wo>4u^=(;#Uf_9Cot;;Ce zdAC&o=iny_j)jkNYKki=J6W9xwL=)~Km}C9uH6zlMG4#&4 z7tv|oyE&bVS4!gx8&tR(tkF#bwkwwvSetrcOV@w3+aSlj%V~qxpjJ>9FN!yz%VgD* zAat6wb823?O;|+b{#btY>~dKX10_MNvLgp;kYTDt)KqeL!8i{#3H0E?uTkTDtuGVn zyzpp0>p*$^LPoSMZ0TXQvqM|NNDwfd+|h*VBO&)m#y{_TkLLuxSyDKU+9YOb>>qVX zcifR2zd=5+IA0VObS@-HocjFYtaIcw$^`!VjVZ}_jv4xa?UAZIzu<38c6eYeP4dO- z6ty8E;F6IWHKoQ@qC1Lr`nxSsL7N+!;L%^#dVnNxAVJ4)2-iXy9ZU{j3@k~&X3xZ z-`_86=kW8h45e#z^y>95w(~44M;VyCToFGbI>nrPJX=}UJh#>ZL?pPD4-QjrG#rd~ zFNYTKD-a;YQpR)w_lOTax=dPcgisc*WRiHz0Y70lC&@Y;e;>A#H$(AVUMhsGgDBaOR5 z5`w$CyEM=Z-M9t!AdPEqcemI4_mREN*yp}|$Gh*1_u5-T1kAALuFp3<6LD~R``0N5Nv2V?{3Z%5rzwF~y^>79*oadv42 zw=dIg{=~aOknqeLy%HC2c~m!b``dU(h4(D-)aSUZUhoFOvY_cP^MDpVP*ofd959>Z z!GxSKv+YbUXW*u1|{ybhseoIG&4ODfRi)3a%Ek{WNlyDtHG#-uAyt7dj`& z#eiQUrLYtE1+k2eG1}##`54l-tw!F&#Kcx5pQJde7*5mb-xKXC%yor?X6Y542FF8h z9KTU!SoM5zO9>MyMIv*)W~^kas>o=j%sEigSQO8-{Wkn|9m<)};EPI0sU^DIH?`c| ziCDVArp)>MaV2&&K+gMH?vT(YfM)+YWSbtm%MHZUn(x5GdF>QuvF7!}wo?=(jHLxI zZE8GWa^f#IDqRDuo@Ct%vU;{`Jy(GRi*u!V=xEmzY7SZwqF-wjv;FdjC6&t*>&$>d zqE>l^##MFGc_xevt!gT~kt;EOjQzU%9dewM+MndT7)Y!yox#zsi1=_>SVOJb&{Lt$ z7j;OxTFS2Zo--}WTuY=4QzKjMRGbA*R*iXtT#ZYkaSqasS<@NLi+1+fp3u|^Qv8~` zwAt_*|BiVW=K^;c7euVx(32v^vg}M6FO^`gQRWql z8=_87a2UENc9C@q>0`X>+168SkSR!YKfS+$38gKlFn zF?L#|GJ=2%n(#jr5JLhmpK0My#)u#GHs`b}j?KU&)>UdD#iu5-Lzkswt=AP~wXj!n z-wno$hq-tl*8OI=y@BQ3ME%J)H!rP#5~`YA??`@p&RMK&*^W9;mh8DyQTq(XmpiWk zA4s#l^EuLq+ZV<>EAf=}Mpkg-WA(29jI8d;lu8m@3hL|CswCx5-*B~#@yyDBgx6}U z^HvthC2Sp38p7>kiJSEK-mk-hncKbNcjO5KUjht)v$Cvx*0@}!cy~khmHM1aAY-IX zTUy!cQlp*Z`J@Nc3~D=dxTid`1qA1Re7gDaSItM)O+V)R)##ccJ#JyjR!qaljW6|u zV!^+E{7`R?FPWt;{4#f}?6jp3e`Zlfvw0sO;@~;xpht9f@1Cs1n|)8=5CU#b11*0# zqT?}=yeiw)q^h$Nq|Hek-3kWsNhh^N)~q>e2kCHDA8{{v@P<&CZ(||no$6GBFRCho z+9U#G!v_4eCowI`nhq=DWq?}TvHL14uUP2`p3bQwEOUILJ#`ei4bP^@Hiy9f47lISm6<=i&xx*^H;^1LDrSpAE`mQPdM#HtL?DI1VrXa-7J zMt4Y(3Yl(idDR!MfyZxBDq|p$nljn@@FqncRYutmc>^PJ6%{yfgk1*vCVDWf!v=u3 zK>&db-9vuUr9RN`Z60h#)UMo&!79M9k>F{$6@wc6H)mPG1Rzb~FD!>B@K62ak?**d z2f3$s_>EE&GAv~rVv+l_r9$WnONI}x6Gb<@b3MrS~I`-3J0kBF+pq>!0rCaADh^kTB zjFVUE*Mi?YWqUr@Iifs&&10U*(vL`yHwuSJ$2PITScT<~5m_LDaRDHYil(>4b=~i( z(| z$fpPzakk@?u`0kbsl*N-+S(st9z>c?D!yMzk^3n)8Zzu)D+i(O{+-7TvU|43x!!EY z)SOvv=RWJ{@kyE+#zxAp8*W>&BJV=gmGM36w5JbJ?KM_q+`4+|-~JCdYrD0A2!`i9 z;Tqgkal`s4-4C#LfobDWRNwa0ENzYbF6YMDE7g^@;qvreoPn2k%9@h#wNlxe1` z7z(yS3ibMOBami1^HsKrj#>R&;6q8<4?w`t!s}+G&5eQMg>;NA&EK{f;2Vl0r8|+d zp{=`1&yc^Qa?q3^gE)_4Ory(XuTUuX^>cke0S^-Qu9jo@`&_56qpp(v`U-QOow=zz zWbu)1S(bjU8ea>B`4%W?UvkosHWEHVuM~=FhYjTWx~8PkJ8Q07TW?y+%7$L>A*q=G5~QYs!-b^t<;-t1vE z@ZX2sffaOn01YEEam0`@L)$9Cb#J8FwPj*_+S{B^+1@U?W#aw%sxGF8 z=Zb~#e_>Z53qA5qs;Xb8cFnYKA9C`z3sIIt--L#gf1FPl@XBh2J1iaiBB#_v}06B7UQH^Hb-C_p7AKtUw zShQLEeg>i(ACw14J&QM{7#%ll4boND4#1@?6n5Le5Cq$$$m zb4yN}&@l@OWtRoZw!eZi1oV+e9{dUhJOk@xET=1=`33gzha*vp+^^+==B^+ z)6imbHyI)!3h?KtCFy#KWHkiZ@k^{!eWH{`PD-OU1G6%JN`+v)_01scX$@!*KU14WW2D z-44nlyWt%7*s;0I(EUE=j1z?C!V@G5sJZ)7Ei|xx=t_(td7o%jfC*X} zP5n9CK?~Puz{!$IDN||U6syMvN?9T2P`b}-)nzB9hU_d@PtHSWvjFUuSau1r>H|Pi+d+vtmZ?VBg#$p5CJ6tE~4+E}3V2}LM1Jie>;S}&i8cmx74-ce% zjBdbIn3@!i%f5%X9LHEaQE1m%n(A-AH+^R+sBYv`nXOl*HLL-7V_%wIt^{tM#$fTR zl65k#B+)rG)OO1a*-Wv_%TT8@eU9v#p+%U1iOm6@G5(xKGVn{@INRfQbE!`oc?0{??(y z2hc^j<6|Omor&;GLzRLY-+oM-a+^$3Vig>+oFiz6c$!0g>q+SvRfIR;Z*N03k$@}^1kCd>K+QOv&y)o+vhkm#i~xf7W06!R?0m> zSpy1}a_d^m8wtRO!{hF?Q2herT)q^fzuBD*Fp*fmjvFz(SIa{#-C7w)Ya>M-Us-Tm zV6k?_LQ!A$qE#L}QN{;E;#QByVPaW|VGW@r@9tVb^l`V{g3Ee zr096{T0c;{E4I0h;P8AbaqsaNUe4(47Y&zo6Ln70dVg#jd#XdX^2aDm>a1yf_fam= z<2*(j=d9<=Yf)xJnkqN$&SL3XDmN`?^Z-r-XJt<;K69n6cp~*gWa2&{%3?tDx)p_H z(khL^`Pv(XEUT?exg^Hza+CV#N9`Ejv}ru&o%;xe?LpmjJMKCscaQ|l-@IpAcHj+p z=no^#m@cH((j=+&(A1uq815-9(?{{xF$1}Qrum80D-Nq6GC0&H&B{Fk?dj}>ZsD`8 zC%W!kO@pzEP4=tK8#&)cB5+Hb2rUK6&TkGGJX)Feb$9IrChwZer_#>t3sCFMYYnrT zyQJCnZr4yga)?0e<8hgAxd6ts)izVkYu=?kJI#fY0Chw?TyRGtp+I-7snlkjD4SHp zG?Uz9rs(>Xc#~i*)Iobwi+|WIHnM!q$Bw@9L<_daEA%DAkPGzF~~6z zn@eG)*%J=K7E3=`>o~xmku`U8Pmts1rpi)Y3k#LEdJnj=u}(QkP&`du^#-!y>CWzG z#(O8))xmvLm^(gJ?s@?~G9Z@InT)7}N>LJ!MTZdvxaHN1^Wbl#CWG!&CNTtGDE8V7g>c)y#nrf_LosJ^4Gdp#`ZQn`d_9Gpe=6eWM9S3@e4xX3@~6WBg-L!aS!$UBuW!};ZWWJp0%?T>(`eKp-w zDnYnDwu?B99TRHx+$)XMjav7?8cGaF4I#fl2sPn`tt*u=9+m_%fat1MmyfzhUUOG_ zp?XnS>q2WpT>A#ft_^20HxBH!!_Elht8^0=U@WP&Xm{V{5~wf(Xe*UBy7r#^Omi-C z)O@#Cq%Dj5TpQzh%6()?bLAUSzI&}0PsPosHe7f7)P30zoTuk>OP8gg)C~R;8tb8I zfbAJaJELW?;Zh@CdSR66Nf%E11ZDKF5n}HajT5&Vf8V+6NPjO(3M?O)+DUm)eW~1J zWv4#|{jM@``EzZ6sjRDs9PlS%!NcaA!(@0MZi!xOhDOiy8yD2?2Je4)J^D5o*CMHhP$AiP;*N2V5`j|z3IcVH0Vr4`!*9bf+Dylcgyrn zFd>VYUYdh`(`ln)WvkVQ<#~gg#CPu^ZSTwlL0S`c?p!B9O6qaLZKAamk10EMgpEZl zEBJlJ8|`~*G$6ZYzuB%l7_F(E&s>{-<^-(7y4v=7&o?KpOaS|wo3OR~uL2&Sczbg+ zj#vX&c$a(vi0Ztjigg{`pMU`hI>c82bqH`Q0|L}`hewa+)Mr+$9VRnc=iVvWR)4^j zoj>8&=$uBU4hoq|PdgKLQj@1g*ymm2URThsg7QiOwA2DU_lF*#G^ZX|Z3n#2<+n!b zt8LyH@E}03U4G4AfKEUQ)#>-3La}{=jI+WqaDEeBi4)ULp}7(dfqVH^9}R zsUkgfjGyfkoiU9(n+rzI2#tfd%u|$EVi)h`&&8tD@@(yiD_w)3@n|SDJgKiWuY0B1 zF;Kp;(*OWn=P9TxWTMWLQFDluZINob_W7?&wuU(A1~OzEi|Bq#&FV{L3b z#ljL@p2F|DnQ#ooB|FwaX<=Gk`L&fOZ^Ui)vRbzzSc&DSM?yNa*z#0{#e^&a^86=q zfGS?DU@X(R5=+^uuHZiRb9MPJL2j;IKQ$#tev>mwi^6)ahFkO@X@b8s1K<;bLxFXj zh;jW{mbF*3dSc#sUTe9n_M>kz`@J*00LTH{zHlqM$~eMDTPcjl&vH`)fY=_K4J2&7 zo|$RBa^RW=n8N8$S{k@b@1~Ij>ye9*1a-kv*hu6>tu?akZTEC^EFBOe4(sQuTlhZq zd#g5j?^Xpl3!4ACt#f6zClUe~-W>aC$UPV6R^)`bfrB2nDBrZRO&!IO&L1Yi|DG;Z zKj38#`)xF+KSHUYVmJJ+Q@C#>s@R*8bM^dpF)LszI`;#(}Io z5orWW*eJFR+~m-+xR^j(lom7j($esKE-XEPz#Val`jVcB0PE#1rLlTsg^#9UTw0UH zO}*r*1hwW}ladCfAE5}Qp+gK|SZVY1GWFPM*d3dPMjclAXY?TJJ53*HtxV?J49qTR303D4Z^H%;<~QxNZS1Qar2LKrgo74j{U8ODZ?#FU8HCcD z)ja;>iC@5ReBv!{jof{=$w&h`D_P<%%QxRL2&}=7mD1VchhRH+}Fj%TJZ8Kt7E=%?ClvNCSl?=~lvMn#XQ` z_1Ki3Kg_*R7K5TF8AM-bkx4M$jUgtaG|}zuFLEQ#5;C}Qw$<-Kt_QpxRxLpS}KT%J-3V9Y)k;nM{^+c4msUipqw?%!1ka|~Pg zy=|(Ew-M-F@$$cJ`mpPBci2{txu1g7=_~hOC*a28UT+>OoK5`+I)Yvf9^*-p_%~VC z-1V)RdfFYr%YShW`M4Y0;5q^Bjwx|-1~Woz1pm9+q(=EjC2tG{|SJ^_QJO@N;MCd&}-HmFh(RHV=GQS)CZ;w-3c-njQ zR75|_s(hfc_KWmc|A4p5VLH^lh3>U_y)i-y>PooMc)0d{?VkE7&v8~Z=`p zm7Ib`Xh!Ipob579LZd*h;{ zil^5hXC`KziY#5SX&jq1RPcsx;U}|!7kQ$DDKX62CGtN6i84qnibT4QjB4MNS2Ura z_K5e+gd%;~VFZ0toYvE7mWs(>#gt&2c&^R2l98*`%46HYhlzShl6lIYZ22hM`@nE@ zD+2Fv`H;{ew)!Sm2oAWoaiVdS`NLa;3{NepXR&O8a%nGcCSm)Da&o0rLzUIHmmL)P z#Qm;3@6pTyBH5j~b-ac+6cM%2!>njxkl&dL8!Dm8RuCh8Z!P(9SSMzEsnu4V!$yB>nA0oFqEi3NM8No8{YJZo4dI zFGl{nY9kL3Z=d0*%r|Dnrf)tF^l`0dt$2m{_}uip=n$T=(`}sSR71o{*+i)$&PR>I z+(M$8c^!P8{!xHaObiBFC+-#yP0S>(q_tbQjb`%v)?~HIe5@47dzx$$Bme!mCdt4Y znCf*OEi);4h-Zjr$&~?JuKpKgU`Nt>bc=|{Zca(IE^>s293ckpiR<@hhag?QP-OKy zj((0fojvpWmb|oKo?s@3M$y}Lt4K9fi{xiN8viY;j9HXw2j8dzw=N_LP zLz3gW=9*$32eBqHFbPkS>B+rfn6{N)?tHZczMA}zR{F;{kLRWD`qomWNutaY^L1}< zHECC>;QsIA??0z=9=>}udQ=&_@}0cBNVl8O!ISopmL0IgC=t-efG zp1&z0Xl1P{qK{M!NJX3{elzU}ey5LptNds7$+!J>RoYg@ap1D81(g3QO~{n zOyvCwQ*s*6rR)aQtIp^WJ-R0O;peod*1tEEI^7Z})d12#q4fS#I?z1mpLO=E_mL8$ z$@5#`>03PA-}Tccb&R`rxEC}um(rD0si3+Vnn6E8hlZL2!^7Fq;bG!SKT-(^I^B4X zK@9TTR~I(Be>;z;Iw!198vy-qg)AmN%tvd>9!U+-PID5>e37k;N&TEO;fkf%qv>UX zrMdJoed-KpTXyc1&c)9ABt-&Z&ol1B_*0f+d)dyadPS!@R;BG17dN)xsh}D4>ytx# zX+=63?JF%+Vjg3@A|M6ZXJDR^d4)nfm)upQHXyV-I5mC9t$r89|cz(evnh%%l=BRor9(lEy{p z4$*l+xDWv4{UE01@FB#ZA^&twUX%6IPK0svs7#e2NGp`=cvh23mXcH8WPX^Ql^V67 zRC4G-Hl(Ci4_^AAby_vGPUkS1C!~|2atCpvz%PAatpkt_#V$DnkZuD;GSZ-btelL` z*wS0h<8TwqEwdv5*^$%k&2w9c)*nyic&#z0M*5jAp~4gj@9Wn5CgNM^34y;s&hsUD z^X4DCh^iDW(bySY!MM);80#`C_k98^Sp0$1ec~#~38v`=Wz7GW!9cOyiNpnm8;fxe zA8AsX-c|BxCb<;f$sC)=_YyrD>qoB?yr5||Hdu5laNIkk9smW*Ui?oKya%Uyw`bWNbx5a#*t>G zoRz4932p500FRi#pQCr7EP5CPl>R=!@lh-u>cP_SfP^cT895rQ7D!e+HUBdAmCUe` z(0g#1u8tA|a%O79Lg=EP88q_#I#m4xtxuwpxHrh{8O*RjC$g^S&KAlh9}{PM0tNc{ z@KVN@{|cxonQ8s)=X%1-d#U@wLo~T`#nob)UR~aD)e`w-W&+w>c|5pQ43$?gc9rEqeqNTlH*W!_8oU+kXfsU(rj|Qn-tT@f#KTY7^*)&c_=+ z`!uN={oZbodW?kte0b}-JSp*R4SUs)tM!Z6-{l+p#1A0j2fDI6nYZm$CsIoaa-dBt zP91_W8sttocU2|YKSUT_m=+n`y%#~fy$ve-uI+4guY5{3Z>=Se%7{d3?e^()sQ}(9`>Ew z@w_Hc@=gGr5ro@+{$BcU%jQ>2H>V-__YZp97v4+g5#a)G<9ILUdkCebre|^GE3GT~ zoh|5U-ge60l%~at*P5C>n&89$)zfK~o9W&F!JG44d|$MuWkJTzaPPLmwwrHl+SuQl z_|znktDNfpzD`-%K^uLTqLIe0A6}y|yaMYlRNxbcc%?*5_&c&_nIvQ z^|Mp@EM>0KKbjyHqQ23*tOXk*>U@~ACieAiZ+_4ZKF5`)j(Z~>y48FxSw3u2Za?;* z0lNNL>6R`aK@QGS!G zEr%iUHTW$qthu}W4)Q|VmTR{RjM98KVH@w29YUe%SYVF zHV-4W)(kB-YtR*YRcIF)eE1CJwu8(o@(=37bcG)P>p^ERb@vt@B=T`lT)lW8Y+HD$ zyoINlAD6z7B;{GqE|BI667IxVpK2|Ka=7&p#kAC^#xQ zCN?fUAu%aAD?2AQFTbF$s2BpRtb)O-YijFSf3>xDbar+3^bU`Vjv>Y;Ca0#C{w%Mo zuB~ruZXFyR9iN<@onKsD-A|*SJ(OAyrTN>x7y3Vb1@C|V)1$-x^ytVxJ^D|0J1Bzp zWB>G8#6LYc{!foi{L`cVQ{IQh`=9##TNnO+umAotI@4b`)qiCi{eMDddKmfsS9GR- zarour=4AhSI@5zP^`GOfoPmP{5*7Owfc9UYGyVN&{6J?aiO%cA@pmJi|4y@r{@aWZ zPokZbb_~58eN375?Q>sxUm;>cir4R+YQKM-iYBiHoU19_OGkJ}ocFKLP~$oE^h)R7 zXUv`}KyEl9$#xGWZq|yyx5Hc|(z~B22zK~)ZRHr!_on*6; zc~himbnrx78?|p>kw!|Vsi#&G&OS~u?Cbf_^xVNouWp3T?4DKA1PE+ZL(|udR6v9&2MY8S4l;smmqRWQ;nK+(c0D79|lg&=qwU^>IU0RbrKJ( z+3Nc4sYH2xgI_4Hqj+MZhGIlN1TX}g((V%o=ABN*$x!5dNrMd9XK(0k@PU^-4r(p(8cf2#=&9(Q%b zs26PCa^_>}6u&I1&-9u^y5D!2=xA|H{rOYvsG^?Cluo_g)ab2$b%(|jK7*IEf zrD$mStwHUSEsL9l(X^xfL;efLCmLncaVT=JT&6EE5Xd<&cF`))qx4`{$@1xwhp z#brK0Utmxec7yfvMBwG66Jk_b5=2xn7g;tb!o2R zffLO(z^xQl)r_Jr=+n;IE4#C4;b#IvfxZvb=Ym}6uAK%~DKkx{Jk`dcls!LJlBB(_ z*8eKK;leUN{c0#40ruF^s-88OG-3ReqrZf0(gO|X6bFT`b!G*R#cqfA+0@0ksE};} zL>Dsf-UqZwsY;fTG0Z9H+1UAL4}-wz4k`g}D6FQ^il`@!D%WkU1)xh6KfZ*1K)PEX z5o%BJvQHVsW2g7ktEai%9YXQaQ`)_#e@#e8%OromXfbhDZh7kz#>wA~j8LvR0JXkO z(-vZ>=#@y!!(@w{E>FI!P!c`2cj#*c&&Fui7F<=Jt^&4pyl9~K+L)J<1;T08`Zb2}cv*U8bLq>Oh5gyBv#9gW zzP)=@N-*nN_GfGog8Lh)^kn7>5YK+FwbG@rct#y>jtbX0C*ljt-!E=QShwY7Txo4rnxc4M?8tyb%00=~rn`}q zjBzSZJu`>B*{X&4K`MwhMpa*IS^z&m&sNQ=SA+6RO8<=ZyZ0;poOEwuP&Wk$jazS| zb6ShoHB!sP$Pd5-5}uQ1_r+L?g^nf^Saa+@hoaG=NlZajKa|>p&8fUZ9giD!qX0`J zjx0Q`AV*f$l$CUd60!BFjaYgQk0e9+&%Zj55$San>*Z5!%ww|t(k4l`J5k`mirrnjx0 z3k;Lsic3T+1?9Ur&&=nOZb%($3~WMPGWF#zuaG2ZZV+-|vvp9`a+Lt`^PD4BQa^;ZXYFsS zkY5Z%AGs`vML6j$M%#TlOv0A82{0%9d@*NJPGYz+o$nHVa*07!eD!a6=y!ngd4KT5 z#iut-k_Z?#m*+8zmX!JiRKwWG0|u8j|IoDh;3;mm<;3hjr&yIQV-2@y_iGU)xc(uo zo%@1SztDc%gniTIiO<(I@V{*}slE6UMtD}RqeZO~J|2I2n~*~g7Krv96MmCbf!O?j zHGp2bzh(v>40kEYb0Q^?P+t;}@~Ot4 zL_2aaR_&M>igRN>2Ix^*j!rz~4 zjEc1t`iih=7T^xWw=z*WXdOYRLk?RN3?)b=NO`dYQZBU)BKXj+PdbvUfk&Gd`&;)d zHUI$ghQ9lf=r za-Sblv%Cjr$#{6bj_7z=oBZZIzN)oa?S1wcC7@7fGyeCWr)WFSPy)F0DH&$Rc$x1+Sn@7 z+gkzcYLZ6U~8W5F0+jfc)Sn70Ob4_Y$KGj#ZM*_MG93>@QRnH2kRtH*$9`3zjyMoj{BekaC~y`igVG*$~j_&WmOt@Ldi5 za}-ZJ2^gV0K*T@CxMJGyX`F58WB}Jay9uutgD-(H>Xo2gft>}w@aO{@lfLEHIJEPw zmkiRleC3A77z3&1?tLlF<9o{>CC=Rki-lqN(^T2ty@vJb>I$IGSU|Ixwr21ehIIW- zDSxorw$W1i(jMH(z8y+elMKKbQ;XH)b^ql3_^zY8e$#WvY4VzE4;OSg`$DiB(0uvg z35o!=9>3)FuL2h}T}HJ&7aJz^f~0Um8|%pA}yi02@UgXl?On_bD^Iu zI&4<2<*NP3p6F~XV0j23Q{J1gcgtc49$g#qF+j!_6&Io{!Jn(kXYPgW&fiQ;Rm;ts zJB^a!cQ()9mRLq*kx3K0@{NROfe3j)%Ko63z3r425Y{bSNV=J=HnKE)DFNYLC%EDTrK zx9)K9;SiGoUnkN}mBaE9uwtmB3Z0O>S6YDzzTG?j);;V%@?O#vD(xR1%_|iV>^6tQ zUM@j9em$4U?Ug(EKX*bFY>``!FGycTd=6>PHyo41157&!tTn2w723mwh{I$>jSQI`~A67^WSi|Q`|z{i4)$E?eqK7 z1SDK(zx6%F5sBB{2%hieQ>H|d5Ai>>^1?e&A$dowy0rq11V8LHF1~H*(X-fLFM*sY zj$@7!X-*=fuQ!pl}<%A=F}+A8@&;0JaYy|?Lu3=Iu_88;pIn`uQPeW{R@ji z^KGYY!SCrVI_W=N=+->dKLeCEARV7QvGno)4QC@-<%Lk)JwW?}4}(>0Xy@Dtj&2ub z$nIdYGouW-9FgksY~IOB0~q5;5jT&`Ml`^3OXKBroAR-_F<4!PLa^H-3*i1fpZ++f zc*=AKkEa?7_LaOFzf=A1Ffr;!aPPO(%eM3TH+?#gI_`uv7x&dH5 zsF*wXKL4Q~aeY;_rtL~wC~{N@O@k=q&aZ#hQp%tI4cCds-vwMtGZHwzFRxjH4q#v? z&pG*QV+=55PVZselNX`G-R+9{8iK&P`~h+yvLjtEcBk0`7^CCmSvC<6=H8Zv{EEM2 zNMvA>6vM-ViWBz|GF%@V^%q6khzdS1KtHT3-&GDhtd$bKn-PvG3>XqXBANa^wV1}B zhU3Sf8sS{Qtx)Zp?a90*$Yso@_yT#HIh^cg^D~U=Z8n3m6Xj`%NaCi`1q6{fmMf&- z6e+UnvxW7NLOyaFdW$u`B+%X(?CGoJXWtmZ@-%rhp2?9Ex2#Z$1P**-`9i7@k}U~Z zwHW(-)T7bcOA(@uJKX5albU_TnAu0e*IHpcp;N5mR}jKYty}H=YZX~S&u4t|DCTQI z;6wzriZ<<-YSj0%Di4L_*KmvhxgFY9P8iaA`?&lBFa4_9jX{&1H-FuP?WtQ-XTFwQ zS%moFLD&4&8u<0Ki~?0Bjj!-l-pe9HbQ@_Xg@DDV=aj?(10^yW+b%sYFWWJd+?GRv zMt4JB{P&ho=CNLW0ST$Uh>7)l2m7XCmiYV zyO?MCkZpicVW(J96rLzdrpZ4SN{aJ=8{TDU))JWilQ z(pg12ER;DhfKOJLw&ZKb#Y) zzv_Xx`3;-TTk$8Xvm>t@fXn_bg7SQ^hKrOt$#wuCM$jA!qFX8Z%+6yT1^vXL-L>%n zsk>5dvytabHa=90W5g6_M`>S5sbgVv^G@S~V>=2}hw zq#>ZLPghxGOm>0h<(wWy{Rjzr7TVUW3C7K?W?su

?@{WvOAj&89ZrZ8Z;QG|8`v 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 C;^^c6 diff --git a/docs/gas_consume_report_1025.md b/docs/gas_consume_report_1025.md deleted file mode 100644 index dd48044d..00000000 --- a/docs/gas_consume_report_1025.md +++ /dev/null @@ -1,26 +0,0 @@ ---- ---- - -@import "{{ site.theme }}"; - -## gas cost for ring with 3 orders: - gas price: 21Gwei - -| Function | ETH | -| ------ | ------ | -| code before verifyInputDataIntegrity | 0.001742391000006656 | -| Verifyinputdataintegrity | 0.002311238999998464 | -| verifyTokensRegistered | 0.00281586900000768 | -| calculateRinghash | 0.003747051000004608 | -| check ringhashRegistry.canSubmit | 0.003839093999992832 | -| verifySignature for ring | 0.003971372999999488 | -| assembleOrders | 0.006713952 | -| handleRing-verifyRingHasNoSubRing | 0.006886088999993344 | -| handleRing-verifyMinerSuppliedFillRates | 0.007175867999993856 | -| handleRing-scaleRingBasedOnHistoricalRecords | 0.007673106000003072 | -| handleRing-calculateRingFillAmount | 0.00777247800000512 | -| handleRing-calculateRingFees | 0.008277926999998464 | -| handleRing-settleRing | 0.013680218999996416 | -| RingMined event | 0.013910337000013824 | -| total | 0.013910337000013824 | - \ No newline at end of file diff --git a/docs/gas_consume_report_1026.md b/docs/gas_consume_report_1026.md deleted file mode 100644 index 94eb2d85..00000000 --- a/docs/gas_consume_report_1026.md +++ /dev/null @@ -1,43 +0,0 @@ -## gas cost for ring with 2 orders: - gas price: 21Gwei - -| Function | ETH | -| ------ | ------ | -| code before verifyInputDataIntegrity | 0.001422435000008704 | -| Verifyinputdataintegrity | 0.001468109999996928 | -| verifyTokensRegistered | 0.001697177999998976 | -| calculateRinghash | 0.002285702999998464 | -| check ringhashRegistry.canSubmit | 0.002342087999995904 | -| verifySignature for ring | 0.002436 | -| assembleOrders | 0.003235365000003584 | -| handleRing-verifyRingHasNoSubRing | 0.003260627999997952 | -| handleRing-verifyMinerSuppliedFillRates | 0.003361364999995392 | -| handleRing-scaleRingBasedOnHistoricalRecords | 0.003469178999996416 | -| handleRing-calculateRingFillAmount | 0.003518256000008192 | -| handleRing-calculateRingFees | 0.004114298999996416 | -| handleRing-settleRing | 0.008177547000004608 | -| RingMined event | 0.008721321000009727 | -| total | 0.008721321000009727 | - - -## gas cost for ring with 3 orders: - gas price: 21Gwei - -| Function | ETH | -| ------ | ------ | -| code before verifyInputDataIntegrity | 0.00166460700000256 | -| Verifyinputdataintegrity | 0.001716623999991808 | -| verifyTokensRegistered | 0.00209993699999744 | -| calculateRinghash | 0.00318345300000768 | -| check ringhashRegistry.canSubmit | 0.003237149999988736 | -| verifySignature for ring | 0.003335094000009216 | -| assembleOrders | 0.004525751999987712 | -| handleRing-verifyRingHasNoSubRing | 0.00457401000001536 | -| handleRing-verifyMinerSuppliedFillRates | 0.004705386000007168 | -| handleRing-scaleRingBasedOnHistoricalRecords | 0.004853897999990784 | -| handleRing-calculateRingFillAmount | 0.00495423600001024 | -| handleRing-calculateRingFees | 0.005421338999996416 | -| handleRing-settleRing | 0.010511991000006656 | -| RingMined event | 0.01074076500000768 | -| total | 0.01074076500000768 | - \ No newline at end of file diff --git a/docs/gas_consume_report_1108.md b/docs/gas_consume_report_1108.md deleted file mode 100644 index 11fcd637..00000000 --- a/docs/gas_consume_report_1108.md +++ /dev/null @@ -1,39 +0,0 @@ -## gas cost for ring with 2 orders: - -| Function or Code Segment | GAS | -| ------ | ------ | -| code before verifyInputDataIntegrity | 82451 | -| Verifyinputdataintegrity | 83140 | -| verifyTokensRegistered | 87117 | -| computeAndGetRinghashInfo | 93385 | -| verifySignature for ring | 97858 | -| assembleOrders | 128653 | -| handleRing-verifyRingHasNoSubRing | 129157 | -| handleRing-verifyMinerSuppliedFillRates | 133143 | -| handleRing-scaleRingBasedOnHistoricalRecords | 136692 | -| handleRing-calculateRingFillAmount | 139947 | -| handleRing-calculateRingFees | 164508 | -| handleRing-settleRing | 366630 | -| RingMined event | 369718 | -| total | 369718 | - - -## gas cost for ring with 3 orders: - -| Function or Code Segment | GAS | -| ------ | ------ | -| code before verifyInputDataIntegrity | 63790 | -| Verifyinputdataintegrity | 64769 | -| verifyTokensRegistered | 69499 | -| computeAndGetRinghashInfo | 76334 | -| verifySignature for ring | 80743 | -| assembleOrders | 126341 | -| handleRing-verifyRingHasNoSubRing | 127446 | -| handleRing-verifyMinerSuppliedFillRates | 133036 | -| handleRing-scaleRingBasedOnHistoricalRecords | 137770 | -| handleRing-calculateRingFillAmount | 141900 | -| handleRing-calculateRingFees | 174817 | -| handleRing-settleRing | 409617 | -| RingMined event | 412897 | -| total | 412897 | - From 47609675c46e6ab76cb860db611386caf0499d82 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Thu, 21 Jun 2018 17:53:43 +0800 Subject: [PATCH 59/68] encode spec impl --- contracts/impl/Data.sol | 2 +- contracts/impl/Exchange.sol | 158 +++++++++++++----------------- contracts/spec/EncodeSpec.sol | 76 ++++++++++----- contracts/spec/MiningSpec.sol | 33 ++++--- test/testExchange.ts | 78 ++++++--------- util/order.ts | 99 ------------------- util/ring.ts | 139 --------------------------- util/rings.ts | 23 +++++ util/ringsConfig.ts | 27 ------ util/rings_config.ts | 41 ++++++++ util/rings_generator.ts | 174 ++++++++++++++++++++-------------- util/types.ts | 104 +++++++++++++------- 12 files changed, 409 insertions(+), 545 deletions(-) create mode 100644 util/rings.ts delete mode 100644 util/ringsConfig.ts create mode 100644 util/rings_config.ts diff --git a/contracts/impl/Data.sol b/contracts/impl/Data.sol index 8e2eaace..379acc3c 100644 --- a/contracts/impl/Data.sol +++ b/contracts/impl/Data.sol @@ -57,7 +57,7 @@ library Data { // computed fields bytes32 hash; address interceptor; - uint spendableLRC; + /* uint spendableLRC; */ // no lrc reward, so this field is unused. } struct Order { diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index b3f90134..419d0bce 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -34,6 +34,7 @@ import "../lib/MathUint.sol"; import "../lib/MultihashUtil.sol"; import "../lib/NoDefaultFunc.sol"; +import "../spec/EncodeSpec.sol"; import "../spec/OrderSpecs.sol"; import "../spec/MiningSpec.sol"; import "../spec/RingSpecs.sol"; @@ -59,6 +60,7 @@ import "./Data.sol"; contract Exchange is IExchange, NoDefaultFunc { using MathUint for uint; using MiningSpec for uint16; + using EncodeSpec for uint16[]; using OrderSpecs for uint16[]; using RingSpecs for uint8[][]; using OrderHelper for Data.Order; @@ -186,63 +188,11 @@ contract Exchange is IExchange, NoDefaultFunc { ); } - event LogData(address a, uint i, uint i8, bytes32 bs); - event LogBytes(bytes d); + /* event LogParam(uint16 miningSpec, uint16[] orderSpecs, address[] addressList, uint[] uintList); */ - struct Test { - address a; - uint b; - uint c; - bytes32 d; // 32 * 4 = 128 - } - - function structCopyTest(bytes data) public { - emit LogBytes(msg.data); - Test memory t; - uint ptr; - assembly { - ptr := t - } - - MemoryUtil.copyCallDataBytesInArray(0, ptr, 0, 270); - //copyStruct(0, ptr, 0, 270); - emit LogData(t.a, t.b, t.c, t.d); - } - - function copyStruct( - uint parameterIndex, - uint dst, - uint offsetInBytes, - uint numBytes - ) - internal - pure - { - assembly { - let structOffset := add(32, add(4, mul(parameterIndex, 32))) - calldatacopy(dst, structOffset, numBytes) - } - } - - function copyCallDataBytesInArray( - uint parameterIndex, - uint dst, - uint offsetInBytes, - uint numBytes - ) - internal - pure - { - assembly { - let parameterOffset := add(calldataload(add(4, mul(parameterIndex, 32))), 4) - calldatacopy(dst, add(add(parameterOffset, 32), offsetInBytes), numBytes) - } - } - - event LogParam(uint16 miningSpec, uint16[] orderSpecs, address[] addressList, uint[] uintList); + /* event Log2DArr(uint8[] uis); */ - event Log2DArr(uint8[] uis); - event LogInt(uint16 i16); + event LogInt16(uint16 i16); event LogIntArr(uint16[] arr); function submitRings( @@ -253,13 +203,37 @@ contract Exchange is IExchange, NoDefaultFunc { // emit LogBytes(data); uint16 encodeSpecsLen = uint16(MemoryUtil.bytesToUintX(data, 0, 2)); // emit LogInt(encodeSpecsLen); - uint16[] memory encodeSpecs = new uint16[](encodeSpecsLen); - for (uint i = 0; i < encodeSpecsLen; i ++) { - uint offset = 2 + i * 2; + uint16[] memory encodeSpecs = new uint16[](encodeSpecsLen + 1); + encodeSpecs[0] = encodeSpecsLen; + uint offset = 2; + for (uint i = 1; i < encodeSpecsLen + 1; i ++) { uint16 spec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); encodeSpecs[i] = spec; + offset += 2; + } + + uint16 miningSpec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); + emit LogInt16(miningSpec); + offset += 2; + + uint orderSpecsLen = encodeSpecs.orderSpecSize(); + uint16[] memory orderSpecs = new uint16[](orderSpecsLen); + for (uint i = 0; i < orderSpecsLen; i++) { + uint16 orderSpec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); + orderSpecs[i] = orderSpec; + offset += 2; } - emit LogIntArr(encodeSpecs); + + // no ring specs for now. + + uint addressListSize = encodeSpecs.addressListSize(); + + + uint uintListSize = encodeSpecs.uintListSize(); + uint bytesListSize = encodeSpecs.bytesListSize(); + + /* emit LogIntArr(encodeSpecs); */ + /* emit LogIntArr(orderSpecs); */ /* uint8[][] memory ringSpecs = new uint8[][](3); */ /* uint8[] memory spec1 = new uint8[](2); */ /* spec1[0] = 19; */ @@ -278,43 +252,43 @@ contract Exchange is IExchange, NoDefaultFunc { ) internal { - emit LogParam(miningSpec, orderSpecs, addressList, uintList); - /* Data.Context memory ctx = Data.Context( */ - /* lrcTokenAddress, */ - /* ITokenRegistry(tokenRegistryAddress), */ - /* ITradeDelegate(delegateAddress), */ - /* IBrokerRegistry(orderBrokerRegistryAddress), */ - /* IBrokerRegistry(minerBrokerRegistryAddress), */ - /* IOrderRegistry(orderRegistryAddress), */ - /* IMinerRegistry(minerRegistryAddress) */ - /* ); */ + // emit LogParam(miningSpec, orderSpecs, addressList, uintList); + Data.Context memory ctx = Data.Context( + lrcTokenAddress, + ITokenRegistry(tokenRegistryAddress), + ITradeDelegate(delegateAddress), + IBrokerRegistry(orderBrokerRegistryAddress), + IBrokerRegistry(minerBrokerRegistryAddress), + IOrderRegistry(orderRegistryAddress), + IMinerRegistry(minerRegistryAddress) + ); - /* Data.Inputs memory inputs = Data.Inputs( */ - /* addressList, */ - /* uintList, */ - /* bytesList, */ - /* 0, 0, 0 // current indices of addressLists, uintList, and bytesList. */ - /* ); */ + Data.Inputs memory inputs = Data.Inputs( + addressList, + uintList, + bytesList, + 0, 0, 0 // current indices of addressLists, uintList, and bytesList. + ); - /* Data.Mining memory mining = Data.Mining( */ - /* inputs.nextAddress(), */ - /* (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), */ - /* (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), */ - /* bytes32(0x0), // hash */ - /* address(0x0), // interceptor */ - /* getSpendable( */ - /* ctx.delegate, */ - /* ctx.lrcTokenAddress, */ - /* tx.origin, // TODO(daniel): pay from msg.sender? */ - /* 0x0, // broker */ - /* 0x0 // brokerInterceptor */ - /* ) */ - /* ); */ + Data.Mining memory mining = Data.Mining( + inputs.nextAddress(), + (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), + (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), + bytes32(0x0), // hash + address(0x0) // interceptor + /* getSpendable( */ + /* ctx.delegate, */ + /* ctx.lrcTokenAddress, */ + /* tx.origin, // TODO(daniel): pay from msg.sender? */ + /* 0x0, // broker */ + /* 0x0 // brokerInterceptor */ + /* ) */ + ); - /* Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); */ - /* Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); */ + Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); + Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); - /* handleSubmitRings(ctx, mining, orders, rings); */ + handleSubmitRings(ctx, mining, orders, rings); } function handleSubmitRings( diff --git a/contracts/spec/EncodeSpec.sol b/contracts/spec/EncodeSpec.sol index e88f8c61..574e5813 100644 --- a/contracts/spec/EncodeSpec.sol +++ b/contracts/spec/EncodeSpec.sol @@ -20,67 +20,93 @@ pragma experimental "ABIEncoderV2"; import "../impl/Data.sol"; -/// encode spec: -/// len(encodeSpecs) len(orderSpecs) -/// | | -/// uint16 array: 0 1 +/// encode spec expanlation: +/// uint16[]: +/// ------------------------------ +/// | index | field | +/// ------------------------------ +/// | 0 | encodeSpecs length | +/// ------------------------------ +/// | 1 | orderSpecs length | +/// ------------------------------ +/// | 2 | ringSpecs length | +/// ------------------------------ +/// | 3 | addressList length | +/// ------------------------------ +/// | 4 | uintList length | +/// ------------------------------ +/// | 5 | bytesList length | +/// ------------------------------ +/// | 6 | ringSpecs i length | +/// ------------------------------ +/// | 6 | bytes[i] length | +/// ------------------------------ /// @title Encode spec for SumitRings parameters. /// @author Kongliang - . library EncodeSpec { - function orderSpecSize(uint spec) + function orderSpecSize(uint16[] spec) internal pure - returns (uint) + returns (uint16) { - return 0; + return spec[1]; } - function ringSpecSize(uint spec) + function ringSpecSize(uint16[] spec) internal pure - returns (uint) + returns (uint16) { - return 0; + return spec[2]; } - function ringSpecSizeI(uint spec, uint i) + /// i: index of ringSpecs[i], starts from 0. + function ringSpecSizeI(uint16[] spec, uint i) internal pure - returns (uint) + returns (uint16) { - return 0; + uint ringSize = ringSpecSize(spec); + require(i < ringSize); + uint ind = 6 + i; + return spec[ind]; } - function addressListSize(uint spec) + function addressListSize(uint16[] spec) internal pure - returns (uint) + returns (uint16) { - return 0; + return spec[3]; } - function uintListSize(uint spec) + function uintListSize(uint16[] spec) internal pure - returns (uint) + returns (uint16) { - return 0; + return spec[4]; } - function bytesListSize(uint spec) + function bytesListSize(uint16[] spec) internal pure - returns (uint) + returns (uint16) { - return 0; + return spec[5]; } - function bytesListSizeI(uint spec, uint i) + function bytesListSizeI(uint16[] spec, uint i) internal pure - returns (uint) + returns (uint16) { - return 0; + uint bytesListSize = bytesListSize(spec); + require(i < bytesListSize); + + uint ringSize = ringSpecSize(spec); + uint ind = 6 + ringSize + i; + return spec[ind]; } } diff --git a/contracts/spec/MiningSpec.sol b/contracts/spec/MiningSpec.sol index ae63f3d5..5373cb3e 100644 --- a/contracts/spec/MiningSpec.sol +++ b/contracts/spec/MiningSpec.sol @@ -24,23 +24,15 @@ import "../impl/Data.sol"; /// @title An Implementation of IOrderbook. /// @author Daniel Wang - . library MiningSpec { - function hasMiner(uint16 spec) - internal - pure - returns (bool) - { - return spec & 0x2 != 0; - } - - function hasBroker(uint16 spec) + function hasFeeRecipient(uint16 spec) internal pure returns (bool) { - return spec & 0x2 != 0; + return spec & 0x1 != 0; } - function hasMinerInterceptor(uint16 spec) + function hasMiner(uint16 spec) internal pure returns (bool) @@ -53,6 +45,23 @@ library MiningSpec { pure returns (bool) { - return spec & 0x2 != 0; + return spec & 0x4 != 0; } + + /* function hasBroker(uint16 spec) */ + /* internal */ + /* pure */ + /* returns (bool) */ + /* { */ + /* return spec & 0x2 != 0; */ + /* } */ + + /* function hasMinerInterceptor(uint16 spec) */ + /* internal */ + /* pure */ + /* returns (bool) */ + /* { */ + /* return spec & 0x2 != 0; */ + /* } */ + } diff --git a/test/testExchange.ts b/test/testExchange.ts index 9547c248..159be991 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -7,8 +7,9 @@ import util = require("util"); import { Artifacts } from "../util/artifacts"; import { Bitstream } from "../util/bitstream"; import { Ring } from "../util/ring"; +import { ringsInfoList } from "../util/rings_config"; import { RingsGenerator } from "../util/rings_generator"; -import { RingsInfo } from "../util/types"; +import { OrderInfo, RingsInfo } from "../util/types"; const { Exchange, @@ -19,11 +20,14 @@ const { contract("Exchange", (accounts: string[]) => { const miner = accounts[1]; + const orderOwners = [accounts[5], accounts[6], accounts[7]]; // 5 ~ 7 let exchange: any; let tokenRegistry: any; let tradeDelegate: any; + const tokenSymbolAddrMap = new Map(); + const assertNumberEqualsWithPrecision = (n1: number, n2: number, precision: number = 8) => { const numStr1 = (n1 / 1e18).toFixed(precision); const numStr2 = (n2 / 1e18).toFixed(precision); @@ -71,68 +75,48 @@ contract("Exchange", (accounts: string[]) => { TokenRegistry.deployed(), TradeDelegate.deployed(), ]); - }); + const setupOrder = async (order: OrderInfo, index: number) => { + const ownerIndex = index === 0 ? index : orderOwners.length % index; + const owner = orderOwners[ownerIndex]; + + const symbolS = order.tokenS; + const symbolB = order.tokenB; + const addrS = await tokenRegistry.getAddressBySymbol(symbolS); + const addrB = await tokenRegistry.getAddressBySymbol(symbolB); + + order.owner = owner; + order.delegateContract = TradeDelegate.address; + order.tokenS = addrS; + order.tokenB = addrB; + if (!order.lrcFee) { + order.lrcFee = 1e18; + } + }; + describe("submitRing", () => { const currBlockTimeStamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp; const ringsGenerator = new RingsGenerator(TradeDelegate.address, currBlockTimeStamp); - const ringsList: RingsInfo[] = ringsGenerator.getRingsInfoList(); - console.log(ringsList.length); - - for (const rings of ringsList) { + for (const ringsInfo of ringsInfoList) { // all configed testcases here: - it(rings.description, async () => { - const bs = ringsGenerator.toSubmitableParam(rings); + it(ringsInfo.description, async () => { + for (const [i, order] of ringsInfo.orders.entries()) { + await setupOrder(order, i); + } + + const bs = ringsGenerator.toSubmitableParam(ringsInfo); console.log("bs:", bs); await exchange.submitRings(bs, {from: miner}); await watchAndPrintEvent(exchange, "LogIntArr"); + await watchAndPrintEvent(exchange, "LogInt16"); - // await exchange.submitRings(params.miningSpec, - // params.orderSpecs, - // // params.ringSpecs, - // params.addressList, - // params.uintList, - // // params.bytesList, - // {from: miner}); - // await watchAndPrintEvent(exchange, "LogParam"); assert(true); }); } -// it("bytes test", async () => { -// const a = accounts[9]; -// const bn = new BigNumber(12345); -// const c = 31; -// const d = "xxxbbbcc"; -// const h = "ccccccccccccccccccccccccccdddddddddddddddd\ -// ddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\ -// xxxxxxxxxxxxxxxxxxxxfffffffffffffffffffffffff987"; - -// console.log("address:", a); - -// const bs = new Bitstream(); -// bs.addAddress(a, 32); -// bs.addBigNumber(bn); -// bs.addNumber(c, 32); -// bs.addHex(web3.toHex(d)); -// // bs.addHex(web3.toHex(h)); - -// const data = bs.getData(); -// console.log("data:", data); - -// // const paramsBytes = abi.rawEncode(["address", "uint256", "uint8", "bytes32", "bytes"], -// // [a, new BN(bn.toString(10), 10), c, d, h]); -// // console.log("paramsBytes:", paramsBytes.toString("hex")); -// // console.log("paramsBytes with web3:", ethUtil.bufferToHex(paramsBytes)); -// const tx = await exchange.structCopyTest(data, {from: miner, gasLimit: 6000000}); -// // console.log("tx:", tx); -// await watchAndPrintEvent(exchange, "LogBytes"); -// await watchAndPrintEvent(exchange, "LogData"); -// }); - }); }); diff --git a/util/order.ts b/util/order.ts index dd45ffb4..08a7a900 100644 --- a/util/order.ts +++ b/util/order.ts @@ -1,102 +1,3 @@ -import { BigNumber } from "bignumber.js"; -import xor = require("bitwise-xor"); -import BN = require("bn.js"); -import promisify = require("es6-promisify"); -import ABI = require("ethereumjs-abi"); -import ethUtil = require("ethereumjs-util"); -import * as _ from "lodash"; -import Web3 = require("web3"); -import { OrderParams } from "./types"; - export class Order { - public owner: string; - public params: OrderParams; - - public web3Instance: Web3; - - constructor(owner: string, params: OrderParams) { - this.owner = owner; - this.params = params; - - try { - if (web3) { - this.web3Instance = web3; - } - } catch (err) { - // ignore. - } - } - - public isValidSignature() { - const { v, r, s } = this.params; - if (_.isUndefined(v) || _.isUndefined(r) || _.isUndefined(s)) { - throw new Error("Cannot call isValidSignature on unsigned order"); - } - const orderHash = this.getOrderHash(); - // console.log("hash len:", orderHash.length.toString()); - const msgHash = ethUtil.hashPersonalMessage(orderHash); - // console.log("msgHash:", ethUtil.bufferToHex(msgHash)); - try { - const pubKey = ethUtil.ecrecover(msgHash, v, ethUtil.toBuffer(r), ethUtil.toBuffer(s)); - const recoveredAddress = ethUtil.bufferToHex(ethUtil.pubToAddress(pubKey)); - return recoveredAddress === this.owner; - } catch (err) { - return false; - } - } - - public async signAsync() { - const orderHash = this.getOrderHash(); - // console.log("order owner:", this.owner); - // console.log("order hash:", ethUtil.bufferToHex(orderHash)); - - const signature = await promisify(this.web3Instance.eth.sign)(this.owner, ethUtil.bufferToHex(orderHash)); - const { v, r, s } = ethUtil.fromRpcSig(signature); - this.params = _.assign(this.params, { - orderHashHex: ethUtil.bufferToHex(orderHash), - r: ethUtil.bufferToHex(r), - s: ethUtil.bufferToHex(s), - v, - }); - } - - public getOrderHash() { - const args = [ - this.params.delegateContract, - this.owner, - this.params.tokenS, - this.params.tokenB, - this.params.walletAddr, - this.params.authAddr, - this.toBN(this.params.amountS), - this.toBN(this.params.amountB), - this.toBN(this.params.validSince), - this.toBN(this.params.validUntil), - this.toBN(this.params.lrcFee), - this.params.buyNoMoreThanAmountB, - this.params.marginSplitPercentage, - ]; - - const argTypes = [ - "address", - "address", - "address", - "address", - "address", - "address", - "uint256", - "uint256", - "uint256", - "uint256", - "uint256", - "bool", - "uint8", - ]; - const orderHash = ABI.soliditySHA3(argTypes, args); - return orderHash; - } - private toBN(bg: BigNumber) { - return new BN(bg.toString(10), 10); - } } diff --git a/util/ring.ts b/util/ring.ts index f4ebd173..43d719e6 100644 --- a/util/ring.ts +++ b/util/ring.ts @@ -1,142 +1,3 @@ -import { BigNumber } from "bignumber.js"; -import promisify = require("es6-promisify"); -import ABI = require("ethereumjs-abi"); -import ethUtil = require("ethereumjs-util"); -import * as _ from "lodash"; -import Web3 = require("web3"); -import { Order } from "./order"; - export class Ring { - public owner: string; - public orders: Order[]; - - public feeSelections: number[]; - - public v: number; - public r: string; - public s: string; - - public authV: number[] = []; - public authR: string[] = []; - public authS: string[] = []; - - public web3Instance: Web3; - - constructor(owner: string, - orders: Order[], - feeSelections: number[]) { - this.owner = owner; - this.orders = orders; - this.feeSelections = feeSelections; - - try { - if (web3) { - this.web3Instance = web3; - } - } catch (err) { - // ignore. - } - } - - public isValidSignature() { - if (_.isUndefined(this.v) || _.isUndefined(this.r) || _.isUndefined(this.s)) { - throw new Error("Cannot call isValidSignature on unsigned order"); - } - const ringHash = this.getRingHash(); - const msgHash = ethUtil.hashPersonalMessage(ringHash); - try { - const pubKey = ethUtil.ecrecover(msgHash, this.v, - ethUtil.toBuffer(this.r), - ethUtil.toBuffer(this.s)); - const recoveredAddress = ethUtil.bufferToHex(ethUtil.pubToAddress(pubKey)); - return recoveredAddress === this.owner; - } catch (err) { - return false; - } - } - - public async signAsync() { - const ringHash = this.getRingHash(); - // console.log("ring hash: ", ethUtil.bufferToHex(ringHash)); - - const signer = promisify(this.web3Instance.eth.sign); - const signature = await signer(this.owner, ethUtil.bufferToHex(ringHash)); - const { v, r, s } = ethUtil.fromRpcSig(signature); - this.v = v; - this.r = ethUtil.bufferToHex(r); - this.s = ethUtil.bufferToHex(s); - - for (const order of this.orders) { - const authSig = await signer(order.params.authAddr, ethUtil.bufferToHex(ringHash)); - const sigRes = ethUtil.fromRpcSig(authSig); - - this.authV.push(sigRes.v); - this.authR.push(ethUtil.bufferToHex(sigRes.r)); - this.authS.push(ethUtil.bufferToHex(sigRes.s)); - } - } - - public getRingHash() { - const orderHashList: string[] = []; - - for (const order of this.orders) { - const orderHash = order.getOrderHash(); - orderHashList.push(ethUtil.bufferToHex(orderHash)); - } - - const ringHash = ABI.soliditySHA3( - [ - "string", - "address", - "uint16", - ], - [ - this.xorReduceStr(orderHashList), - this.owner, - this.feeSelectionListToNumber(this.feeSelections), - ]); - - return ringHash; - } - - public feeSelectionListToNumber(feeSelections: number[]) { - let res: number = 0; - for (let i = 0; i < feeSelections.length; i ++) { - res += feeSelections[i] << i; - } - - return res; - } - - public getRingHashHex() { - const ringHash = this.getRingHash(); - const ringHashHex = ethUtil.bufferToHex(ringHash); - return ringHashHex; - } - - private xorReduce(numberArr: number[]) { - const n0 = numberArr[0]; - const tail = numberArr.slice(1); - const intRes = tail.reduce((n1: number, n2: number) => n1 ^ n2, n0); - return intRes; - } - - private xorReduceStr(strArr: string[]) { - const s0 = strArr[0]; - const tail = strArr.slice(1); - const strXor = (s1: string, s2: string) => { - const buf1 = Buffer.from(s1.slice(2), "hex"); - const buf2 = Buffer.from(s2.slice(2), "hex"); - const res = Buffer.alloc(32); - for (let i = 0; i < 32; i++) { - res[i] = buf1[i] ^ buf2[i]; - } - - const strRes = ethUtil.bufferToHex(res); - return strRes; - }; - const reduceRes = tail.reduce((a, b) => strXor(a, b), s0); - return Buffer.from(reduceRes.slice(2), "hex"); - } } diff --git a/util/rings.ts b/util/rings.ts new file mode 100644 index 00000000..af5cf92d --- /dev/null +++ b/util/rings.ts @@ -0,0 +1,23 @@ +import { BigNumber } from "bignumber.js"; +import promisify = require("es6-promisify"); +import ABI = require("ethereumjs-abi"); +import ethUtil = require("ethereumjs-util"); +import * as _ from "lodash"; +import Web3 = require("web3"); +import { Order } from "./order"; +import { RingsInfo } from "./types"; + +export class Rings { + public ringsInfo: RingsInfo; + + constructor(ringsInfo: RingsInfo) { + this.ringsInfo = ringsInfo; + } + + public getRingHash() { + const hash = "xxx"; + + return hash; + } + +} diff --git a/util/ringsConfig.ts b/util/ringsConfig.ts deleted file mode 100644 index 8f38fd1a..00000000 --- a/util/ringsConfig.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { RingInfo, RingsInfo } from "../util/types"; - -export const ringsInfoList: RingsInfo[] = [ - { - description: "simple 2 size rings.", - ringInfoList: - [ - { - amountSList: [1e17, 300e18], - amountBList: [300e18, 1e17], - buyNoMoreThanAmountBList: [false, false], - feeSelections: [0, 0], - salt: 10, - }, - - { - amountSList: [1e17, 300e18], - amountBList: [300e18, 1e17], - buyNoMoreThanAmountBList: [false, false], - feeSelections: [0, 0], - orderFilledOrCancelledAmountList: [5e16, 0], - salt: 11, - verbose: false, - }, - ], - }, -]; diff --git a/util/rings_config.ts b/util/rings_config.ts new file mode 100644 index 00000000..f15c8743 --- /dev/null +++ b/util/rings_config.ts @@ -0,0 +1,41 @@ +import tokenInfos = require("../migrations/config/tokens.js"); +import { RingsInfo } from "../util/types"; + +const tokenSymbols = tokenInfos.development.map((t) => t.symbol); + +export const ringsInfoList: RingsInfo[] = [ + { + description: "simple 2 size rings.", + rings: [[0, 1], [2, 3]], + orders: [ + { + id: 0, + tokenS: tokenSymbols[0], // use symbol for address, while replace with actual address later. + tokenB: tokenSymbols[1], + amountS: 3e18, + amountB: 1e18, + }, + { + id: 1, + tokenS: tokenSymbols[1], + tokenB: tokenSymbols[0], + amountS: 1e18, + amountB: 3e18, + }, + { + id: 2, + tokenS: tokenSymbols[1], + tokenB: tokenSymbols[2], + amountS: 2e17, + amountB: 1e18, + }, + { + id: 3, + tokenS: tokenSymbols[2], + tokenB: tokenSymbols[1], + amountS: 1e18, + amountB: 2e17, + }, + ], + }, +]; diff --git a/util/rings_generator.ts b/util/rings_generator.ts index 4d162d9a..2a35c4ae 100644 --- a/util/rings_generator.ts +++ b/util/rings_generator.ts @@ -2,13 +2,7 @@ import { BigNumber } from "bignumber.js"; import { Bitstream } from "./bitstream"; import { Order } from "./order"; import { Ring } from "./ring"; -import { ringsInfoList } from "./ringsConfig"; -import { OrderParams, RingInfo, RingsInfo, RingsSubmitParam } from "./types"; - -export interface Rings { - description?: string; - rings: Ring[]; -} +import { OrderInfo, RingsInfo, RingsSubmitParam } from "./types"; export class RingsGenerator { public delegateContractAddr: string; @@ -20,73 +14,11 @@ export class RingsGenerator { this.currBlockTimeStamp = currBlockTimeStamp; } - public getRingsInfoList() { - return ringsInfoList; - } - - public async ringsInfoToRings(ringsInfo: RingsInfo) { - const rings: Ring[] = []; - for (const ringInfo of ringsInfo.ringInfoList) { - const ring = await this.generateRing(ringInfo); - rings.push(ring); - } - - const ringsObj = { - description: ringsInfo.description, - rings, - }; - - return ringsObj; - } - - public async generateRing(ringInfo: RingInfo) { - const ringSize = ringInfo.amountSList.length; - const salt = ringInfo.salt ? ringInfo.salt : 0; - - const orders: Order[] = []; - for (let i = 0; i < ringSize; i ++) { - const nextIndex = (i + 1) % ringSize; - - const orderParam: OrderParams = { - delegateContract: this.delegateContractAddr, - tokenS: ringInfo.tokenAddressList[i], - tokenB: ringInfo.tokenAddressList[nextIndex], - amountS: new BigNumber(ringInfo.amountSList[i]), - amountB: new BigNumber(ringInfo.amountBList[i]), - validSince: new BigNumber(this.currBlockTimeStamp - 60), - validUntil: new BigNumber(this.currBlockTimeStamp + 3600 + salt), - lrcFee: new BigNumber(ringInfo.lrcFeeAmountList[i]), - buyNoMoreThanAmountB: ringInfo.buyNoMoreThanAmountBList[i], - marginSplitPercentage: ringInfo.marginSplitPercentageList[i], - authAddr: ringInfo.authAddressList[i], - walletAddr: ringInfo.walletAddrList[i], - }; - - const order = new Order(ringInfo.orderOwners[i], orderParam); - await order.signAsync(); - orders.push(order); - } - - const ring = new Ring(ringInfo.miner, orders, ringInfo.feeSelections); - await ring.signAsync(); - - return ring; - } - public toSubmitableParam(rings: RingsInfo) { - // const ringsObj = this.ringsInfoToRings(rings); - const param: RingsSubmitParam = { - miningSpec: 8, - orderSpecs: [0], - ringSpecs: [[0]], - addressList: ["0x17233e07c67d086464fD408148c3ABB56245FA64"], - uintList: [new BigNumber(0)], - bytesList: ["xxx", "ccc"], - }; + const param = this.ringsToParam(rings); const encodeSpecs: number[] = []; const len = 5 + param.ringSpecs.length + param.bytesList.length; - console.log("encode specs len:", len); encodeSpecs.push(len); encodeSpecs.push(param.orderSpecs.length); encodeSpecs.push(param.ringSpecs.length); @@ -99,14 +31,114 @@ export class RingsGenerator { return this.submitParamToBytes(param, encodeSpecs); } + private ringsToParam(ringsInfo: RingsInfo) { + const param: RingsSubmitParam = { + miningSpec: 0, + orderSpecs: [], + ringSpecs: [], + addressList: [], + uintList: [], + bytesList: [], + }; + + this.calculateMiningSepc(ringsInfo, param); + ringsInfo.orders.map((o) => this.calculateOrderSpec(o, param)); + return param; + } + + private calculateMiningSepc(ringsInfo: RingsInfo, param: RingsSubmitParam) { + let miningSpec = 0; + if (ringsInfo.feeRecipient) { + miningSpec += 1; + param.addressList.push(ringsInfo.feeRecipient); + } + + if (ringsInfo.miner) { + miningSpec += 1 << 1; + param.addressList.push(ringsInfo.miner); + } + + if (ringsInfo.sig) { + miningSpec += 1 << 2; + param.bytesList.push(ringsInfo.sig); + } + + param.miningSpec = miningSpec; + } + + private calculateOrderSpec(order: OrderInfo, param: RingsSubmitParam) { + param.addressList.push(order.owner); + param.addressList.push(order.delegateContract); + param.addressList.push(order.tokenS); + param.addressList.push(order.tokenB); + param.uintList.push(new BigNumber(order.amountS)); + param.uintList.push(new BigNumber(order.amountB)); + param.uintList.push(new BigNumber(order.lrcFee)); + + let spec = 0; + if (order.dualAuthAddr) { + spec += 1; + param.addressList.push(order.dualAuthAddr); + } + if (order.broker) { + spec += 1 << 1; + param.addressList.push(order.broker); + } + if (order.orderInterceptor) { + spec += 1 << 2; + param.addressList.push(order.orderInterceptor); + } + if (order.walletAddr) { + spec += 1 << 3; + param.addressList.push(order.walletAddr); + } + + if (order.validSince) { + spec += 1 << 4; + param.uintList.push(new BigNumber(order.validSince)); + } + if (order.validUntil) { + spec += 1 << 5; + param.uintList.push(new BigNumber(order.validUntil)); + } + if (order.buyNoMoreThanAmountB) { + spec += 1 << 6; + param.uintList.push(new BigNumber(1)); + } + if (order.allOrNone) { + spec += 1 << 7; + param.uintList.push(new BigNumber(1)); + } + + if (order.sig) { + spec += 1 << 8; + param.bytesList.push(order.sig); + } + if (order.dualAuthSig) { + spec += 1 << 9; + param.bytesList.push(order.dualAuthSig); + } + + console.log("order spec:", spec); + param.orderSpecs.push(spec); + } + + private calculateRingSpec(ring: number[]) { + // TODO + return [1, 1]; + } + private submitParamToBytes(param: RingsSubmitParam, encodeSpecs: number[]) { + console.log("encodeSpecs:", encodeSpecs); + console.log("param.orderSpecs:", param.orderSpecs); + const stream = new Bitstream(); encodeSpecs.forEach((i) => stream.addNumber(i, 2)); stream.addNumber(param.miningSpec, 2); param.orderSpecs.forEach((i) => stream.addNumber(i, 2)); const ringSpecsFlattened = [].concat(...param.ringSpecs); ringSpecsFlattened.forEach((i) => stream.addNumber(i, 1)); - param.addressList.forEach((a) => stream.addAddress(a)); + param.addressList.forEach((a) => stream.addAddress(a, 32)); param.uintList.forEach((bn) => stream.addBigNumber(bn)); param.bytesList.forEach((bs) => stream.addRawBytes(bs)); diff --git a/util/types.ts b/util/types.ts index a7885d40..8c084750 100644 --- a/util/types.ts +++ b/util/types.ts @@ -1,18 +1,51 @@ import { BigNumber } from "bignumber.js"; -export interface OrderParams { - delegateContract: string; +// export interface OrderParams { +// delegateContract: string; +// tokenS: string; +// tokenB: string; +// amountS: BigNumber; +// amountB: BigNumber; +// validSince: BigNumber; +// validUntil: BigNumber; +// lrcFee: BigNumber; +// buyNoMoreThanAmountB: boolean; +// marginSplitPercentage: number; +// authAddr: string; +// walletAddr: string; +// scaledAmountS?: number; +// scaledAmountB?: number; +// rateAmountS?: number; +// rateAmountB?: number; +// fillAmountS?: number; +// orderHashHex?: string; +// v?: number; +// r?: string; +// s?: string; +// } + +export interface OrderInfo { + // required fields in contract + owner?: string; tokenS: string; tokenB: string; - amountS: BigNumber; - amountB: BigNumber; - validSince: BigNumber; - validUntil: BigNumber; - lrcFee: BigNumber; - buyNoMoreThanAmountB: boolean; - marginSplitPercentage: number; - authAddr: string; - walletAddr: string; + amountS: number; + amountB: number; + lrcFee?: number; + + // optional fields + dualAuthAddr?: string; // spec value 1 + broker?: string; // spec value 1 << 1 + orderInterceptor?: string; // spec value 1 << 2 + walletAddr?: string; // spec value 1 << 3 + validSince?: number; // spec value 1 << 4 + validUntil?: number; // spec value 1 << 5 + buyNoMoreThanAmountB?: boolean; // spec value 1 << 6 + allOrNone?: boolean; // spec value 1 << 7 + sig?: string; // spec value 1 << 8 + dualAuthSig?: string; // spec value 1 << 9 + + // helper field scaledAmountS?: number; scaledAmountB?: number; rateAmountS?: number; @@ -22,6 +55,9 @@ export interface OrderParams { v?: number; r?: string; s?: string; + + id?: number; + delegateContract?: string; } export interface RingsSubmitParam { @@ -33,28 +69,32 @@ export interface RingsSubmitParam { bytesList: string[]; } -export interface RingInfo { - amountSList: number[]; - amountBList: number[]; - lrcFeeAmountList?: number[]; - miner?: string; - orderOwners?: string[]; - tokenAddressList?: string[]; - authAddressList?: string[]; - walletAddrList?: string[]; - marginSplitPercentageList?: number[]; - buyNoMoreThanAmountBList?: boolean[]; - feeSelections?: number[]; - spendableAmountSList?: number[]; - spendableLrcFeeAmountList?: number[]; - orderFilledOrCancelledAmountList?: number[]; - description?: string; - salt?: number; - verbose?: boolean; - id?: string; -} +// export interface RingInfo { +// amountSList: number[]; +// amountBList: number[]; +// lrcFeeAmountList?: number[]; +// miner?: string; +// orderOwners?: string[]; +// tokenAddressList?: string[]; +// authAddressList?: string[]; +// walletAddrList?: string[]; +// marginSplitPercentageList?: number[]; +// buyNoMoreThanAmountBList?: boolean[]; +// feeSelections?: number[]; +// spendableAmountSList?: number[]; +// spendableLrcFeeAmountList?: number[]; +// orderFilledOrCancelledAmountList?: number[]; +// description?: string; +// salt?: number; +// verbose?: boolean; +// id?: string; +// } export interface RingsInfo { description?: string; - ringInfoList: RingInfo[]; + feeRecipient?: string; // spec value: 1 + miner?: string; // spec value: 1 << 1 + sig?: string; // spec value: 1 << 2 + rings: number[][]; + orders: OrderInfo[]; } From a9375b8adbd5719e36a94e7eca81ba14904c72e1 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 21 Jun 2018 19:04:25 +0800 Subject: [PATCH 60/68] Update README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dddd3ea8..a1408aab 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,6 @@ npm install npm run compile ``` -## Deployment on Ethereum Mainnet: -- LRC - https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md#protocol-token---lrc -- Protocol deployments: https://github.com/Loopring/token-listing/blob/master/ethereum/deployment.md#protocol - ## Run Unit Tests * run `npm run testrpc` from project's root directory in terminal. * run `npm run test` from project's root directory in another terminal window. @@ -40,3 +36,6 @@ docker-compose logs -f test ``` The logs command is optional but will give you an easy to read output of the tests without the output from testrpc mixed in (though the combination of both is good for debugging and is why they're not being silenced.) + +## More +For more information, please check out https://loopring.github.io/protocol. From cfec894d3567d3ec8b39312408739ec0cecce6b9 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Fri, 22 Jun 2018 16:01:04 +0800 Subject: [PATCH 61/68] parse address --- contracts/impl/Exchange.sol | 82 ++++++++++++++++++++---------------- contracts/lib/BytesUtil.sol | 23 ++++++++++ contracts/lib/MemoryUtil.sol | 13 ++++++ test/testExchange.ts | 7 ++- util/rings_generator.ts | 8 ++-- 5 files changed, 92 insertions(+), 41 deletions(-) diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index 419d0bce..7a1823d1 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -59,6 +59,7 @@ import "./Data.sol"; /// https://github.com/Hephyrius contract Exchange is IExchange, NoDefaultFunc { using MathUint for uint; + using BytesUtil for bytes; using MiningSpec for uint16; using EncodeSpec for uint16[]; using OrderSpecs for uint16[]; @@ -192,54 +193,63 @@ contract Exchange is IExchange, NoDefaultFunc { /* event Log2DArr(uint8[] uis); */ + event LogInt(uint i); event LogInt16(uint16 i16); + event LogBytes(bytes bs); event LogIntArr(uint16[] arr); + event LogAddrArr(address[] addrArr); + + function bar(bytes bs) public { + emit LogBytes(msg.data); + bytes memory copy; + uint ptr; + assembly { + ptr := copy + let len := sub(calldatasize, 68) + calldatacopy(ptr, 36, add(32, len)) + } + emit LogBytes(copy); + } function submitRings( bytes data ) public { - // emit LogBytes(data); + // emit LogBytes(msg.data); uint16 encodeSpecsLen = uint16(MemoryUtil.bytesToUintX(data, 0, 2)); - // emit LogInt(encodeSpecsLen); - uint16[] memory encodeSpecs = new uint16[](encodeSpecsLen + 1); - encodeSpecs[0] = encodeSpecsLen; uint offset = 2; - for (uint i = 1; i < encodeSpecsLen + 1; i ++) { - uint16 spec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); - encodeSpecs[i] = spec; - offset += 2; - } - + uint16[] memory encodeSpecs = data.copyToUint16Array(offset, encodeSpecsLen); + offset += 2 * encodeSpecsLen; uint16 miningSpec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); - emit LogInt16(miningSpec); offset += 2; - - uint orderSpecsLen = encodeSpecs.orderSpecSize(); - uint16[] memory orderSpecs = new uint16[](orderSpecsLen); - for (uint i = 0; i < orderSpecsLen; i++) { - uint16 orderSpec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); - orderSpecs[i] = orderSpec; - offset += 2; - } - - // no ring specs for now. - - uint addressListSize = encodeSpecs.addressListSize(); - - - uint uintListSize = encodeSpecs.uintListSize(); - uint bytesListSize = encodeSpecs.bytesListSize(); - - /* emit LogIntArr(encodeSpecs); */ - /* emit LogIntArr(orderSpecs); */ - /* uint8[][] memory ringSpecs = new uint8[][](3); */ - /* uint8[] memory spec1 = new uint8[](2); */ - /* spec1[0] = 19; */ - /* spec1[1] = 10; */ - /* ringSpecs[0] = spec1; */ - /* emit Log2DArr(spec1); */ + uint16[] memory orderSpecs = data.copyToUint16Array( + offset, + encodeSpecs.orderSpecSize() + ); + offset += 2 * encodeSpecs.orderSpecSize(); + // emit LogIntArr(encodeSpecs); + + address[] memory addressList = data.copyToAddressArray(offset, encodeSpecs.addressListSize()); + emit LogAddrArr(addressList); + + /* // no ring specs for now. */ + + /* uint addressListSize = encodeSpecs.addressListSize(); */ + /* emit LogInt(addressListSize); */ + /* // address[] memory addrList = new address[](addressListSize); */ + /* bytes memory tmpBs; */ + /* uint addrListPtr; */ + /* uint parameterOffset; */ + /* assembly { */ + /* addrListPtr := tmpBs */ + /* parameterOffset := 36 */ + /* // dataSize := mul(32, addressListSize) */ + /* //calldatacopy(addrListPtr, parameterOffset, 95) */ + /* } */ + // MemoryUtil.copyCallDataBytesInArray(0, addrListPtr, offset, 64); + // emit LogAddrArr(addrList); + // emit LogBytes(tmpBs); } function submitRingsInternal( diff --git a/contracts/lib/BytesUtil.sol b/contracts/lib/BytesUtil.sol index 03c51f71..01551718 100644 --- a/contracts/lib/BytesUtil.sol +++ b/contracts/lib/BytesUtil.sol @@ -18,6 +18,7 @@ pragma solidity 0.4.24; pragma experimental "v0.5.0"; pragma experimental "ABIEncoderV2"; +import "./MemoryUtil.sol"; /// @title Utility Functions for bytes /// @author Daniel Wang - @@ -37,4 +38,26 @@ library BytesUtil { } return temp; } + + function copyToUint16Array(bytes b, uint offset, uint arraySize) + internal + pure + returns (uint16[]) { + uint16[] memory resultArray = new uint16[](arraySize); + for (uint i = 0; i < arraySize; i++) { + resultArray[i] = uint16(MemoryUtil.bytesToUintX(b, offset + i * 2, 2)); + } + return resultArray; + } + + function copyToAddressArray(bytes b, uint offset, uint arraySize) + internal + pure + returns (address[]) { + address[] memory resultArray = new address[](arraySize); + for (uint i = 0; i < arraySize; i++) { + resultArray[i] = MemoryUtil.bytesToAddress(b, offset + i * 20); + } + return resultArray; + } } diff --git a/contracts/lib/MemoryUtil.sol b/contracts/lib/MemoryUtil.sol index b0994103..20d895bc 100644 --- a/contracts/lib/MemoryUtil.sol +++ b/contracts/lib/MemoryUtil.sol @@ -76,4 +76,17 @@ library MemoryUtil { } } + function bytesToAddress( + bytes b, + uint offset + ) + internal + pure + returns (address addr) + { + assembly { + addr := mload(add(add(b, 20), offset)) + } + } + } diff --git a/test/testExchange.ts b/test/testExchange.ts index 159be991..3b61f309 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -111,7 +111,12 @@ contract("Exchange", (accounts: string[]) => { await exchange.submitRings(bs, {from: miner}); await watchAndPrintEvent(exchange, "LogIntArr"); - await watchAndPrintEvent(exchange, "LogInt16"); + + // await exchange.bar("ab".repeat(16) + "xy".repeat(10), {from: miner}); + + await watchAndPrintEvent(exchange, "LogBytes"); + await watchAndPrintEvent(exchange, "LogAddrArr"); + // await watchAndPrintEvent(exchange, "LogInt16"); assert(true); }); diff --git a/util/rings_generator.ts b/util/rings_generator.ts index 2a35c4ae..2ea782c7 100644 --- a/util/rings_generator.ts +++ b/util/rings_generator.ts @@ -119,7 +119,6 @@ export class RingsGenerator { param.bytesList.push(order.dualAuthSig); } - console.log("order spec:", spec); param.orderSpecs.push(spec); } @@ -131,14 +130,15 @@ export class RingsGenerator { private submitParamToBytes(param: RingsSubmitParam, encodeSpecs: number[]) { console.log("encodeSpecs:", encodeSpecs); console.log("param.orderSpecs:", param.orderSpecs); + console.log("addrList:", param.addressList); const stream = new Bitstream(); encodeSpecs.forEach((i) => stream.addNumber(i, 2)); stream.addNumber(param.miningSpec, 2); param.orderSpecs.forEach((i) => stream.addNumber(i, 2)); - const ringSpecsFlattened = [].concat(...param.ringSpecs); - ringSpecsFlattened.forEach((i) => stream.addNumber(i, 1)); - param.addressList.forEach((a) => stream.addAddress(a, 32)); + // const ringSpecsFlattened = [].concat(...param.ringSpecs); + // ringSpecsFlattened.forEach((i) => stream.addNumber(i, 1)); + param.addressList.forEach((a) => stream.addAddress(a)); param.uintList.forEach((bn) => stream.addBigNumber(bn)); param.bytesList.forEach((bs) => stream.addRawBytes(bs)); From f94c8140e6f14e1abcc61de9695854e6412cc199 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Fri, 22 Jun 2018 16:30:44 +0800 Subject: [PATCH 62/68] fix a bug in EncodeSpec --- contracts/impl/Exchange.sol | 3 ++- contracts/spec/EncodeSpec.sol | 46 +++++++++++++++++------------------ 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index 7a1823d1..c2b7bee0 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -221,6 +221,8 @@ contract Exchange is IExchange, NoDefaultFunc { uint offset = 2; uint16[] memory encodeSpecs = data.copyToUint16Array(offset, encodeSpecsLen); offset += 2 * encodeSpecsLen; + emit LogIntArr(encodeSpecs); + uint16 miningSpec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); offset += 2; uint16[] memory orderSpecs = data.copyToUint16Array( @@ -228,7 +230,6 @@ contract Exchange is IExchange, NoDefaultFunc { encodeSpecs.orderSpecSize() ); offset += 2 * encodeSpecs.orderSpecSize(); - // emit LogIntArr(encodeSpecs); address[] memory addressList = data.copyToAddressArray(offset, encodeSpecs.addressListSize()); emit LogAddrArr(addressList); diff --git a/contracts/spec/EncodeSpec.sol b/contracts/spec/EncodeSpec.sol index 574e5813..9f2f2476 100644 --- a/contracts/spec/EncodeSpec.sol +++ b/contracts/spec/EncodeSpec.sol @@ -22,25 +22,23 @@ import "../impl/Data.sol"; /// encode spec expanlation: /// uint16[]: -/// ------------------------------ -/// | index | field | -/// ------------------------------ -/// | 0 | encodeSpecs length | -/// ------------------------------ -/// | 1 | orderSpecs length | -/// ------------------------------ -/// | 2 | ringSpecs length | -/// ------------------------------ -/// | 3 | addressList length | -/// ------------------------------ -/// | 4 | uintList length | -/// ------------------------------ -/// | 5 | bytesList length | -/// ------------------------------ -/// | 6 | ringSpecs i length | -/// ------------------------------ -/// | 6 | bytes[i] length | -/// ------------------------------ +/// -------------------------------- +/// | index | field | +/// -------------------------------- +/// | 0 | orderSpecs length | +/// -------------------------------- +/// | 1 | ringSpecs length | +/// -------------------------------- +/// | 2 | addressList length| +/// -------------------------------- +/// | 3 | uintList length | +/// -------------------------------- +/// | 4 | bytesList length | +/// -------------------------------- +/// | 5 ~ 4+i | ringSpecs i length| +/// -------------------------------- +/// | 4+i ~ | bytes[i] length | +/// -------------------------------- /// @title Encode spec for SumitRings parameters. /// @author Kongliang - . library EncodeSpec { @@ -49,7 +47,7 @@ library EncodeSpec { pure returns (uint16) { - return spec[1]; + return spec[0]; } function ringSpecSize(uint16[] spec) @@ -57,7 +55,7 @@ library EncodeSpec { pure returns (uint16) { - return spec[2]; + return spec[1]; } /// i: index of ringSpecs[i], starts from 0. @@ -77,7 +75,7 @@ library EncodeSpec { pure returns (uint16) { - return spec[3]; + return spec[2]; } function uintListSize(uint16[] spec) @@ -85,7 +83,7 @@ library EncodeSpec { pure returns (uint16) { - return spec[4]; + return spec[3]; } function bytesListSize(uint16[] spec) @@ -93,7 +91,7 @@ library EncodeSpec { pure returns (uint16) { - return spec[5]; + return spec[4]; } function bytesListSizeI(uint16[] spec, uint i) From 5611ab322169930fc36a4862b6c0e063581af2d1 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Tue, 26 Jun 2018 16:18:53 +0800 Subject: [PATCH 63/68] update --- contracts/helper/ParticipationHelper.sol | 28 ++--- contracts/helper/RingHelper.sol | 16 +-- contracts/impl/Data.sol | 16 +-- contracts/impl/Exchange.sol | 128 ++++++++++++----------- contracts/lib/BytesUtil.sol | 29 +++++ contracts/spec/EncodeSpec.sol | 24 +++++ contracts/spec/ParticipationSpec.sol | 16 +-- contracts/spec/RingSpecs.sol | 18 ++-- test/testExchange.ts | 1 + util/rings_config.ts | 10 +- util/rings_generator.ts | 8 +- 11 files changed, 179 insertions(+), 115 deletions(-) diff --git a/contracts/helper/ParticipationHelper.sol b/contracts/helper/ParticipationHelper.sol index 79b36391..a96efddb 100644 --- a/contracts/helper/ParticipationHelper.sol +++ b/contracts/helper/ParticipationHelper.sol @@ -34,7 +34,7 @@ library ParticipationHelper { pure { p.order.maxAmountS = p.order.maxAmountS.sub(p.fillAmountS); - p.order.maxAmountB = p.order.maxAmountB.sub(p.fillAmountB); + /* p.order.maxAmountB = p.order.maxAmountB.sub(p.fillAmountB); */ p.order.maxAmountLrcFee = p.order.maxAmountLrcFee.sub(p.lrcFee); if (p.order.sellLRC) { @@ -49,20 +49,22 @@ library ParticipationHelper { pure returns (bool thisOrderIsSmaller) { - Data.Order memory order = p.order; + thisOrderIsSmaller = true; - p.fillAmountB = p.fillAmountS.mul(p.rateB) / p.rateS; + /* Data.Order memory order = p.order; */ - if (order.limitByAmountB) { - if (p.fillAmountB > order.maxAmountB) { - p.fillAmountB = order.maxAmountB; - p.fillAmountS = p.fillAmountB.mul(p.rateS) / p.rateB; - thisOrderIsSmaller = true; - } - p.lrcFee = order.lrcFee.mul(p.fillAmountB) / order.amountB; - } else { - p.lrcFee = order.lrcFee.mul(p.fillAmountS) / order.amountS; - } + /* p.fillAmountB = p.fillAmountS.mul(p.rateB) / p.rateS; */ + + /* if (order.limitByAmountB) { */ + /* if (p.fillAmountB > order.maxAmountB) { */ + /* p.fillAmountB = order.maxAmountB; */ + /* p.fillAmountS = p.fillAmountB.mul(p.rateS) / p.rateB; */ + /* thisOrderIsSmaller = true; */ + /* } */ + /* p.lrcFee = order.lrcFee.mul(p.fillAmountB) / order.amountB; */ + /* } else { */ + /* p.lrcFee = order.lrcFee.mul(p.fillAmountS) / order.amountS; */ + /* } */ } function calculateFeeAmounts( diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol index 858eb759..b50c7d82 100644 --- a/contracts/helper/RingHelper.sol +++ b/contracts/helper/RingHelper.sol @@ -40,8 +40,8 @@ library RingHelper { ring.hash = keccak256( abi.encodePacked( ring.hash, - p.order.hash, - p.marginSplitAsFee + p.order.hash + // p.marginSplitAsFee ) ); } @@ -58,7 +58,7 @@ library RingHelper { Data.Participation memory p = ring.participations[i]; Data.Order memory order = p.order; p.fillAmountS = order.maxAmountS; - p.fillAmountB = order.maxAmountB; + // p.fillAmountB = order.maxAmountB; } uint smallest = 0; @@ -98,10 +98,10 @@ library RingHelper { uint j = (i + 1) % ring.size; Data.Participation memory nextP = ring.participations[j]; - if (p.fillAmountB < nextP.fillAmountS) { - nextP.fillAmountS = p.fillAmountB; - } else { - smallest_ = j; - } + /* if (p.fillAmountB < nextP.fillAmountS) { */ + /* nextP.fillAmountS = p.fillAmountB; */ + /* } else { */ + /* smallest_ = j; */ + /* } */ } } diff --git a/contracts/impl/Data.sol b/contracts/impl/Data.sol index 379acc3c..b89e8c3b 100644 --- a/contracts/impl/Data.sol +++ b/contracts/impl/Data.sol @@ -93,17 +93,17 @@ library Data { struct Participation { // required fields Order order; - bool marginSplitAsFee; - uint rateS; - uint rateB; + /* bool marginSplitAsFee; */ + /* uint rateS; */ + /* uint rateB; */ - // computed fields - uint splitS; - uint splitB; + /* // computed fields */ + /* uint splitS; */ + /* uint splitB; */ uint lrcFee; - uint lrcReward; + // uint lrcReward; uint fillAmountS; - uint fillAmountB; + // uint fillAmountB; } struct Ring{ diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index c2b7bee0..d9e77558 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -196,7 +196,8 @@ contract Exchange is IExchange, NoDefaultFunc { event LogInt(uint i); event LogInt16(uint16 i16); event LogBytes(bytes bs); - event LogIntArr(uint16[] arr); + event LogInt16Arr(uint16[] arr); + event LogIntArr(uint[] arr); event LogAddrArr(address[] addrArr); function bar(bytes bs) public { @@ -221,7 +222,7 @@ contract Exchange is IExchange, NoDefaultFunc { uint offset = 2; uint16[] memory encodeSpecs = data.copyToUint16Array(offset, encodeSpecsLen); offset += 2 * encodeSpecsLen; - emit LogIntArr(encodeSpecs); + // emit LogInt16Arr(encodeSpecs); uint16 miningSpec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); offset += 2; @@ -231,26 +232,24 @@ contract Exchange is IExchange, NoDefaultFunc { ); offset += 2 * encodeSpecs.orderSpecSize(); + uint8[][] memory ringSpecs = data.copyToUint8ArrayList(offset, encodeSpecs.ringSpecSizeArray()); + offset += 1 * encodeSpecs.ringSpecsDataLen(); + address[] memory addressList = data.copyToAddressArray(offset, encodeSpecs.addressListSize()); - emit LogAddrArr(addressList); - - /* // no ring specs for now. */ - - /* uint addressListSize = encodeSpecs.addressListSize(); */ - /* emit LogInt(addressListSize); */ - /* // address[] memory addrList = new address[](addressListSize); */ - /* bytes memory tmpBs; */ - /* uint addrListPtr; */ - /* uint parameterOffset; */ - /* assembly { */ - /* addrListPtr := tmpBs */ - /* parameterOffset := 36 */ - /* // dataSize := mul(32, addressListSize) */ - /* //calldatacopy(addrListPtr, parameterOffset, 95) */ - /* } */ - // MemoryUtil.copyCallDataBytesInArray(0, addrListPtr, offset, 64); - // emit LogAddrArr(addrList); - // emit LogBytes(tmpBs); + offset += 20 * encodeSpecs.addressListSize(); + + uint[] memory uintList = data.copyToUintArray(offset, encodeSpecs.uintListSize()); + offset += 32 * encodeSpecs.uintListSize(); + // emit LogIntArr(uintList); + + submitRingsInternal( + miningSpec, + orderSpecs, + ringSpecs, + addressList, + uintList, + new bytes[](0) + ); } function submitRingsInternal( @@ -297,11 +296,18 @@ contract Exchange is IExchange, NoDefaultFunc { ); Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); + Data.Order memory o = orders[0]; + // emit LogOrder(orders[0]); + emit LogOrderFields(o.owner, o.tokenS, o.amountS, o.lrcFee); + Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); handleSubmitRings(ctx, mining, orders, rings); } + event LogOrder(Data.Order order); + event LogOrderFields(address owner, address tokenS, uint amountS, uint lrcFee); + function handleSubmitRings( Data.Context ctx, Data.Mining mining, @@ -338,45 +344,45 @@ contract Exchange is IExchange, NoDefaultFunc { } } - /// @return Amount of ERC20 token that can be spent by this contract. - // TODO(daniel): there is another getSpendable in OrderHelper. - function getSpendable( - ITradeDelegate delegate, - address tokenAddress, - address tokenOwner, - address broker, - address brokerInterceptor - ) - private - view - returns (uint spendable) - { - ERC20 token = ERC20(tokenAddress); - spendable = token.allowance( - tokenOwner, - address(delegate) - ); - if (spendable == 0) { - return; - } - uint amount = token.balanceOf(tokenOwner); - if (amount < spendable) { - spendable = amount; - if (spendable == 0) { - return; - } - } - - if (brokerInterceptor != tokenOwner) { - amount = IBrokerInterceptor(brokerInterceptor).getAllowance( - tokenOwner, - broker, - tokenAddress - ); - if (amount < spendable) { - spendable = amount; - } - } - } + /* /// @return Amount of ERC20 token that can be spent by this contract. */ + /* // TODO(daniel): there is another getSpendable in OrderHelper. */ + /* function getSpendable( */ + /* ITradeDelegate delegate, */ + /* address tokenAddress, */ + /* address tokenOwner, */ + /* address broker, */ + /* address brokerInterceptor */ + /* ) */ + /* private */ + /* view */ + /* returns (uint spendable) */ + /* { */ + /* ERC20 token = ERC20(tokenAddress); */ + /* spendable = token.allowance( */ + /* tokenOwner, */ + /* address(delegate) */ + /* ); */ + /* if (spendable == 0) { */ + /* return; */ + /* } */ + /* uint amount = token.balanceOf(tokenOwner); */ + /* if (amount < spendable) { */ + /* spendable = amount; */ + /* if (spendable == 0) { */ + /* return; */ + /* } */ + /* } */ + + /* if (brokerInterceptor != tokenOwner) { */ + /* amount = IBrokerInterceptor(brokerInterceptor).getAllowance( */ + /* tokenOwner, */ + /* broker, */ + /* tokenAddress */ + /* ); */ + /* if (amount < spendable) { */ + /* spendable = amount; */ + /* } */ + /* } */ + /* } */ } diff --git a/contracts/lib/BytesUtil.sol b/contracts/lib/BytesUtil.sol index 01551718..55bcd715 100644 --- a/contracts/lib/BytesUtil.sol +++ b/contracts/lib/BytesUtil.sol @@ -50,6 +50,23 @@ library BytesUtil { return resultArray; } + function copyToUint8ArrayList(bytes b, uint offset, uint[] innerArraySizeList) + internal + pure + returns (uint8[][]) { + uint arraySize = innerArraySizeList.length; + uint8[][] memory resultArray = new uint8[][](arraySize); + for (uint i = 0; i < arraySize; i++) { + uint len = innerArraySizeList[i]; + uint8[] memory innerArray = new uint8[](len); + for (uint j = 0; j < len; j++) { + innerArray[j] = uint8(MemoryUtil.bytesToUintX(b, offset + j * (i + 1), 1)); + } + resultArray[i] = innerArray; + } + return resultArray; + } + function copyToAddressArray(bytes b, uint offset, uint arraySize) internal pure @@ -60,4 +77,16 @@ library BytesUtil { } return resultArray; } + + function copyToUintArray(bytes b, uint offset, uint arraySize) + internal + pure + returns (uint[]) { + uint[] memory resultArray = new uint[](arraySize); + for (uint i = 0; i < arraySize; i++) { + resultArray[i] = MemoryUtil.bytesToUint(b, offset + i * 32); + } + return resultArray; + } + } diff --git a/contracts/spec/EncodeSpec.sol b/contracts/spec/EncodeSpec.sol index 9f2f2476..9b4596f4 100644 --- a/contracts/spec/EncodeSpec.sol +++ b/contracts/spec/EncodeSpec.sol @@ -70,6 +70,30 @@ library EncodeSpec { return spec[ind]; } + function ringSpecSizeArray(uint16[] spec) + internal + pure + returns (uint[]) { + uint arrayLen = ringSpecSize(spec); + uint[] memory sizeArray = new uint[](arrayLen); + for (uint i = 0; i < arrayLen; i++) { + sizeArray[i] = ringSpecSizeI(spec, i); + } + return sizeArray; + } + + function ringSpecsDataLen(uint16[] spec) + internal + pure + returns (uint) { + uint arrayLen = ringSpecSize(spec); + uint dataLen = 0; + for (uint i = 0; i < arrayLen; i++) { + dataLen += ringSpecSizeI(spec,i); + } + return dataLen; + } + function addressListSize(uint16[] spec) internal pure diff --git a/contracts/spec/ParticipationSpec.sol b/contracts/spec/ParticipationSpec.sol index fa9f91b2..3463e212 100644 --- a/contracts/spec/ParticipationSpec.sol +++ b/contracts/spec/ParticipationSpec.sol @@ -30,14 +30,14 @@ library ParticipationSpec { pure returns (uint) { - return 0; + return spec; } - function marginSplitAsFee(uint8 spec) - internal - pure - returns (bool) - { - return false; - } + /* function marginSplitAsFee(uint8 spec) */ + /* internal */ + /* pure */ + /* returns (bool) */ + /* { */ + /* return false; */ + /* } */ } diff --git a/contracts/spec/RingSpecs.sol b/contracts/spec/RingSpecs.sol index bd279185..ce179c3f 100644 --- a/contracts/spec/RingSpecs.sol +++ b/contracts/spec/RingSpecs.sol @@ -67,15 +67,15 @@ library RingSpecs { uint8 pspec = pspecs[i]; parts[i] = Data.Participation( orders[pspec.orderIndex()], - pspec.marginSplitAsFee(), - inputs.nextUint(), - inputs.nextUint(), - 0, // splitS - 0, // splitB - 0, // lrcFee - 0, // lrcReward - 0, // fillAmountS - 0 // fillAmountB + /* pspec.marginSplitAsFee(), */ + /* inputs.nextUint(), */ + /* inputs.nextUint(), */ + /* 0, // splitS */ + /* 0, // splitB */ + inputs.nextUint(), // lrcFee + /* 0, // lrcReward */ + 0 // fillAmountS + // 0 // fillAmountB ); parts[i].order.tokenB = prevTokenS; diff --git a/test/testExchange.ts b/test/testExchange.ts index 3b61f309..c1bb026b 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -116,6 +116,7 @@ contract("Exchange", (accounts: string[]) => { await watchAndPrintEvent(exchange, "LogBytes"); await watchAndPrintEvent(exchange, "LogAddrArr"); + await watchAndPrintEvent(exchange, "LogOrderFields"); // await watchAndPrintEvent(exchange, "LogInt16"); assert(true); diff --git a/util/rings_config.ts b/util/rings_config.ts index f15c8743..bb0dcf11 100644 --- a/util/rings_config.ts +++ b/util/rings_config.ts @@ -5,32 +5,32 @@ const tokenSymbols = tokenInfos.development.map((t) => t.symbol); export const ringsInfoList: RingsInfo[] = [ { - description: "simple 2 size rings.", + description: "simple size 2 2-size rings.", rings: [[0, 1], [2, 3]], orders: [ { - id: 0, + index: 0, tokenS: tokenSymbols[0], // use symbol for address, while replace with actual address later. tokenB: tokenSymbols[1], amountS: 3e18, amountB: 1e18, }, { - id: 1, + index: 1, tokenS: tokenSymbols[1], tokenB: tokenSymbols[0], amountS: 1e18, amountB: 3e18, }, { - id: 2, + index: 2, tokenS: tokenSymbols[1], tokenB: tokenSymbols[2], amountS: 2e17, amountB: 1e18, }, { - id: 3, + index: 3, tokenS: tokenSymbols[2], tokenB: tokenSymbols[1], amountS: 1e18, diff --git a/util/rings_generator.ts b/util/rings_generator.ts index 2ea782c7..1194f545 100644 --- a/util/rings_generator.ts +++ b/util/rings_generator.ts @@ -42,6 +42,7 @@ export class RingsGenerator { }; this.calculateMiningSepc(ringsInfo, param); + param.ringSpecs = ringsInfo.rings; ringsInfo.orders.map((o) => this.calculateOrderSpec(o, param)); return param; } @@ -70,7 +71,7 @@ export class RingsGenerator { param.addressList.push(order.owner); param.addressList.push(order.delegateContract); param.addressList.push(order.tokenS); - param.addressList.push(order.tokenB); + // param.addressList.push(order.tokenB); param.uintList.push(new BigNumber(order.amountS)); param.uintList.push(new BigNumber(order.amountB)); param.uintList.push(new BigNumber(order.lrcFee)); @@ -131,13 +132,14 @@ export class RingsGenerator { console.log("encodeSpecs:", encodeSpecs); console.log("param.orderSpecs:", param.orderSpecs); console.log("addrList:", param.addressList); + console.log("uintList:", param.uintList); const stream = new Bitstream(); encodeSpecs.forEach((i) => stream.addNumber(i, 2)); stream.addNumber(param.miningSpec, 2); param.orderSpecs.forEach((i) => stream.addNumber(i, 2)); - // const ringSpecsFlattened = [].concat(...param.ringSpecs); - // ringSpecsFlattened.forEach((i) => stream.addNumber(i, 1)); + const ringSpecsFlattened = [].concat(...param.ringSpecs); + ringSpecsFlattened.forEach((i) => stream.addNumber(i, 1)); param.addressList.forEach((a) => stream.addAddress(a)); param.uintList.forEach((bn) => stream.addBigNumber(bn)); param.bytesList.forEach((bs) => stream.addRawBytes(bs)); From b50e5eae3bfeb18d1abc86c006e1122014fe0a82 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Thu, 28 Jun 2018 12:33:58 +0800 Subject: [PATCH 64/68] fix a bug in EncodeSpec --- contracts/helper/RingHelper.sol | 4 +- contracts/impl/Exchange.sol | 66 ++++++++++++++++++--------------- contracts/lib/BytesUtil.sol | 18 ++++----- contracts/spec/EncodeSpec.sol | 12 +++--- test/testExchange.ts | 10 +++-- util/rings_generator.ts | 12 +++--- util/types.ts | 2 +- 7 files changed, 65 insertions(+), 59 deletions(-) diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol index b50c7d82..3dff8be8 100644 --- a/contracts/helper/RingHelper.sol +++ b/contracts/helper/RingHelper.sol @@ -95,8 +95,8 @@ library RingHelper { smallest_ = i; } - uint j = (i + 1) % ring.size; - Data.Participation memory nextP = ring.participations[j]; + // uint j = (i + 1) % ring.size; + // Data.Participation memory nextP = ring.participations[j]; /* if (p.fillAmountB < nextP.fillAmountS) { */ /* nextP.fillAmountS = p.fillAmountB; */ diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index d9e77558..3a2bbc9a 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -199,9 +199,10 @@ contract Exchange is IExchange, NoDefaultFunc { event LogInt16Arr(uint16[] arr); event LogIntArr(uint[] arr); event LogAddrArr(address[] addrArr); + event LogUint8ArrList(uint8[][] al); function bar(bytes bs) public { - emit LogBytes(msg.data); + // emit LogBytes(msg.data); bytes memory copy; uint ptr; assembly { @@ -222,7 +223,7 @@ contract Exchange is IExchange, NoDefaultFunc { uint offset = 2; uint16[] memory encodeSpecs = data.copyToUint16Array(offset, encodeSpecsLen); offset += 2 * encodeSpecsLen; - // emit LogInt16Arr(encodeSpecs); + emit LogInt16Arr(encodeSpecs); uint16 miningSpec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); offset += 2; @@ -232,24 +233,29 @@ contract Exchange is IExchange, NoDefaultFunc { ); offset += 2 * encodeSpecs.orderSpecSize(); - uint8[][] memory ringSpecs = data.copyToUint8ArrayList(offset, encodeSpecs.ringSpecSizeArray()); - offset += 1 * encodeSpecs.ringSpecsDataLen(); + emit LogInt16Arr(orderSpecs); - address[] memory addressList = data.copyToAddressArray(offset, encodeSpecs.addressListSize()); - offset += 20 * encodeSpecs.addressListSize(); + uint[] memory _arr = encodeSpecs.ringSpecSizeArray(); + emit LogIntArr(_arr); + // uint8[][] memory ringSpecs = data.copyToUint8ArrayList(offset, encodeSpecs.ringSpecSizeArray()); + /* emit LogUint8ArrList(ringSpecs); */ + /* offset += 1 * encodeSpecs.ringSpecsDataLen(); */ - uint[] memory uintList = data.copyToUintArray(offset, encodeSpecs.uintListSize()); - offset += 32 * encodeSpecs.uintListSize(); - // emit LogIntArr(uintList); + /* address[] memory addressList = data.copyToAddressArray(offset, encodeSpecs.addressListSize()); */ + /* offset += 20 * encodeSpecs.addressListSize(); */ - submitRingsInternal( - miningSpec, - orderSpecs, - ringSpecs, - addressList, - uintList, - new bytes[](0) - ); + /* uint[] memory uintList = data.copyToUintArray(offset, encodeSpecs.uintListSize()); */ + /* offset += 32 * encodeSpecs.uintListSize(); */ + /* // emit LogIntArr(uintList); */ + + /* submitRingsInternal( */ + /* miningSpec, */ + /* orderSpecs, */ + /* ringSpecs, */ + /* addressList, */ + /* uintList, */ + /* new bytes[](0) */ + /* ); */ } function submitRingsInternal( @@ -302,7 +308,7 @@ contract Exchange is IExchange, NoDefaultFunc { Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); - handleSubmitRings(ctx, mining, orders, rings); + // handleSubmitRings(ctx, mining, orders, rings); } event LogOrder(Data.Order order); @@ -327,21 +333,21 @@ contract Exchange is IExchange, NoDefaultFunc { mining.hash ^= rings[i].hash; } - mining.updateHash(); - mining.updateMinerAndInterceptor(ctx); - mining.checkMinerSignature(ctx); + /* mining.updateHash(); */ + /* mining.updateMinerAndInterceptor(ctx); */ + /* mining.checkMinerSignature(ctx); */ - for (uint i = 0; i < orders.length; i++) { - orders[i].checkDualAuthSignature(mining.hash); - } + /* for (uint i = 0; i < orders.length; i++) { */ + /* orders[i].checkDualAuthSignature(mining.hash); */ + /* } */ - for (uint i = 0; i < orders.length; i++) { - orders[i].updateStates(ctx); - } + /* for (uint i = 0; i < orders.length; i++) { */ + /* orders[i].updateStates(ctx); */ + /* } */ - for (uint i = 0; i < rings.length; i++){ - rings[i].calculateFillAmountAndFee(mining); - } + /* for (uint i = 0; i < rings.length; i++){ */ + /* rings[i].calculateFillAmountAndFee(mining); */ + /* } */ } /* /// @return Amount of ERC20 token that can be spent by this contract. */ diff --git a/contracts/lib/BytesUtil.sol b/contracts/lib/BytesUtil.sol index 55bcd715..ad92bc15 100644 --- a/contracts/lib/BytesUtil.sol +++ b/contracts/lib/BytesUtil.sol @@ -53,17 +53,17 @@ library BytesUtil { function copyToUint8ArrayList(bytes b, uint offset, uint[] innerArraySizeList) internal pure - returns (uint8[][]) { + returns (uint8[][] memory) { uint arraySize = innerArraySizeList.length; uint8[][] memory resultArray = new uint8[][](arraySize); - for (uint i = 0; i < arraySize; i++) { - uint len = innerArraySizeList[i]; - uint8[] memory innerArray = new uint8[](len); - for (uint j = 0; j < len; j++) { - innerArray[j] = uint8(MemoryUtil.bytesToUintX(b, offset + j * (i + 1), 1)); - } - resultArray[i] = innerArray; - } + /* for (uint i = 0; i < arraySize; i++) { */ + /* uint len = innerArraySizeList[i]; */ + /* uint8[] memory innerArray = new uint8[](len); */ + /* for (uint j = 0; j < len; j++) { */ + /* // innerArray[j] = uint8(MemoryUtil.bytesToUintX(b, offset + j * (i + 1), 1)); */ + /* } */ + /* resultArray[i] = innerArray; */ + /* } */ return resultArray; } diff --git a/contracts/spec/EncodeSpec.sol b/contracts/spec/EncodeSpec.sol index 9b4596f4..759b03e8 100644 --- a/contracts/spec/EncodeSpec.sol +++ b/contracts/spec/EncodeSpec.sol @@ -35,9 +35,9 @@ import "../impl/Data.sol"; /// -------------------------------- /// | 4 | bytesList length | /// -------------------------------- -/// | 5 ~ 4+i | ringSpecs i length| +/// | 5 ~ 5+i | ringSpecs i length| /// -------------------------------- -/// | 4+i ~ | bytes[i] length | +/// | 5+i+j ~ | bytes[j] length | /// -------------------------------- /// @title Encode spec for SumitRings parameters. /// @author Kongliang - . @@ -66,18 +66,18 @@ library EncodeSpec { { uint ringSize = ringSpecSize(spec); require(i < ringSize); - uint ind = 6 + i; + uint ind = 5 + i; return spec[ind]; } function ringSpecSizeArray(uint16[] spec) internal pure - returns (uint[]) { - uint arrayLen = ringSpecSize(spec); + returns (uint[] memory) { + uint arrayLen = spec[1]; uint[] memory sizeArray = new uint[](arrayLen); for (uint i = 0; i < arrayLen; i++) { - sizeArray[i] = ringSpecSizeI(spec, i); + sizeArray[i] = uint(spec[5 + i]); } return sizeArray; } diff --git a/test/testExchange.ts b/test/testExchange.ts index c1bb026b..4c9028b8 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -107,16 +107,18 @@ contract("Exchange", (accounts: string[]) => { } const bs = ringsGenerator.toSubmitableParam(ringsInfo); - console.log("bs:", bs); + // console.log("bs:", bs); await exchange.submitRings(bs, {from: miner}); + await watchAndPrintEvent(exchange, "LogInt16Arr"); await watchAndPrintEvent(exchange, "LogIntArr"); // await exchange.bar("ab".repeat(16) + "xy".repeat(10), {from: miner}); - await watchAndPrintEvent(exchange, "LogBytes"); - await watchAndPrintEvent(exchange, "LogAddrArr"); - await watchAndPrintEvent(exchange, "LogOrderFields"); + // await watchAndPrintEvent(exchange, "LogUint8ArrList"); + // await watchAndPrintEvent(exchange, "LogIntArr"); + // await watchAndPrintEvent(exchange, "LogAddrArr"); + // await watchAndPrintEvent(exchange, "LogOrderFields"); // await watchAndPrintEvent(exchange, "LogInt16"); assert(true); diff --git a/util/rings_generator.ts b/util/rings_generator.ts index 1194f545..8b0d74ac 100644 --- a/util/rings_generator.ts +++ b/util/rings_generator.ts @@ -123,22 +123,20 @@ export class RingsGenerator { param.orderSpecs.push(spec); } - private calculateRingSpec(ring: number[]) { - // TODO - return [1, 1]; - } - private submitParamToBytes(param: RingsSubmitParam, encodeSpecs: number[]) { console.log("encodeSpecs:", encodeSpecs); + // console.log("param.orderSpecs:", param.orderSpecs); + // console.log("addrList:", param.addressList); + // console.log("uintList:", param.uintList); console.log("param.orderSpecs:", param.orderSpecs); - console.log("addrList:", param.addressList); - console.log("uintList:", param.uintList); + console.log("param.ringSpecs:", param.ringSpecs); const stream = new Bitstream(); encodeSpecs.forEach((i) => stream.addNumber(i, 2)); stream.addNumber(param.miningSpec, 2); param.orderSpecs.forEach((i) => stream.addNumber(i, 2)); const ringSpecsFlattened = [].concat(...param.ringSpecs); + console.log("ringSpecsFlattened:", ringSpecsFlattened); ringSpecsFlattened.forEach((i) => stream.addNumber(i, 1)); param.addressList.forEach((a) => stream.addAddress(a)); param.uintList.forEach((bn) => stream.addBigNumber(bn)); diff --git a/util/types.ts b/util/types.ts index 8c084750..240c39bc 100644 --- a/util/types.ts +++ b/util/types.ts @@ -56,7 +56,7 @@ export interface OrderInfo { r?: string; s?: string; - id?: number; + index?: number; delegateContract?: string; } From 028408e189a339424517f6c60e85ed0487c949c3 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Thu, 28 Jun 2018 17:27:15 +0800 Subject: [PATCH 65/68] fix a bug in RingSpecs.sol --- contracts/impl/Exchange.sol | 55 ++++++++++++++++++++---------------- contracts/lib/BytesUtil.sol | 17 +++++------ contracts/spec/OrderSpec.sol | 20 ++++++------- contracts/spec/RingSpecs.sol | 6 ++-- test/testExchange.ts | 12 ++++---- util/artifacts.ts | 2 ++ util/rings_generator.ts | 15 ++++++---- 7 files changed, 70 insertions(+), 57 deletions(-) diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index 3a2bbc9a..fce1b5f6 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -199,7 +199,7 @@ contract Exchange is IExchange, NoDefaultFunc { event LogInt16Arr(uint16[] arr); event LogIntArr(uint[] arr); event LogAddrArr(address[] addrArr); - event LogUint8ArrList(uint8[][] al); + event LogUint8Arr(uint8[] al); function bar(bytes bs) public { // emit LogBytes(msg.data); @@ -223,7 +223,7 @@ contract Exchange is IExchange, NoDefaultFunc { uint offset = 2; uint16[] memory encodeSpecs = data.copyToUint16Array(offset, encodeSpecsLen); offset += 2 * encodeSpecsLen; - emit LogInt16Arr(encodeSpecs); + // emit LogInt16Arr(encodeSpecs); uint16 miningSpec = uint16(MemoryUtil.bytesToUintX(data, offset, 2)); offset += 2; @@ -233,29 +233,33 @@ contract Exchange is IExchange, NoDefaultFunc { ); offset += 2 * encodeSpecs.orderSpecSize(); - emit LogInt16Arr(orderSpecs); + // emit LogInt16Arr(orderSpecs); - uint[] memory _arr = encodeSpecs.ringSpecSizeArray(); - emit LogIntArr(_arr); - // uint8[][] memory ringSpecs = data.copyToUint8ArrayList(offset, encodeSpecs.ringSpecSizeArray()); - /* emit LogUint8ArrList(ringSpecs); */ - /* offset += 1 * encodeSpecs.ringSpecsDataLen(); */ + // uint[] memory _arr = encodeSpecs.ringSpecSizeArray(); + // emit LogIntArr(_arr); + uint8[][] memory ringSpecs = data.copyToUint8ArrayList(offset, encodeSpecs.ringSpecSizeArray()); - /* address[] memory addressList = data.copyToAddressArray(offset, encodeSpecs.addressListSize()); */ - /* offset += 20 * encodeSpecs.addressListSize(); */ + for (uint i = 0; i < ringSpecs.length; i++) { + emit LogUint8Arr(ringSpecs[i]); + } + offset += 1 * encodeSpecs.ringSpecsDataLen(); - /* uint[] memory uintList = data.copyToUintArray(offset, encodeSpecs.uintListSize()); */ - /* offset += 32 * encodeSpecs.uintListSize(); */ - /* // emit LogIntArr(uintList); */ + address[] memory addressList = data.copyToAddressArray(offset, encodeSpecs.addressListSize()); + offset += 20 * encodeSpecs.addressListSize(); + // emit LogAddrArr(addressList); - /* submitRingsInternal( */ - /* miningSpec, */ - /* orderSpecs, */ - /* ringSpecs, */ - /* addressList, */ - /* uintList, */ - /* new bytes[](0) */ - /* ); */ + uint[] memory uintList = data.copyToUintArray(offset, encodeSpecs.uintListSize()); + offset += 32 * encodeSpecs.uintListSize(); + // emit LogIntArr(uintList); + + submitRingsInternal( + miningSpec, + orderSpecs, + ringSpecs, + addressList, + uintList, + new bytes[](0) + ); } function submitRingsInternal( @@ -287,7 +291,7 @@ contract Exchange is IExchange, NoDefaultFunc { ); Data.Mining memory mining = Data.Mining( - inputs.nextAddress(), + (miningSpec.hasFeeRecipient() ? inputs.nextAddress() : tx.origin), (miningSpec.hasMiner() ? inputs.nextAddress() : address(0x0)), (miningSpec.hasSignature() ? inputs.nextBytes() : new bytes(0)), bytes32(0x0), // hash @@ -302,9 +306,10 @@ contract Exchange is IExchange, NoDefaultFunc { ); Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); - Data.Order memory o = orders[0]; - // emit LogOrder(orders[0]); - emit LogOrderFields(o.owner, o.tokenS, o.amountS, o.lrcFee); + /* Data.Order memory o = orders[0]; */ + /* // emit LogOrder(orders[0]); */ + /* emit LogOrderFields(o.owner, o.tokenS, o.amountS, o.lrcFee); */ + // emit LogInt(orders.length); Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); diff --git a/contracts/lib/BytesUtil.sol b/contracts/lib/BytesUtil.sol index ad92bc15..c7cc1a49 100644 --- a/contracts/lib/BytesUtil.sol +++ b/contracts/lib/BytesUtil.sol @@ -56,14 +56,15 @@ library BytesUtil { returns (uint8[][] memory) { uint arraySize = innerArraySizeList.length; uint8[][] memory resultArray = new uint8[][](arraySize); - /* for (uint i = 0; i < arraySize; i++) { */ - /* uint len = innerArraySizeList[i]; */ - /* uint8[] memory innerArray = new uint8[](len); */ - /* for (uint j = 0; j < len; j++) { */ - /* // innerArray[j] = uint8(MemoryUtil.bytesToUintX(b, offset + j * (i + 1), 1)); */ - /* } */ - /* resultArray[i] = innerArray; */ - /* } */ + for (uint i = 0; i < arraySize; i++) { + uint len = innerArraySizeList[i]; + uint8[] memory innerArray = new uint8[](len); + for (uint j = 0; j < len; j++) { + innerArray[j] = uint8(MemoryUtil.bytesToUintX(b, offset + j, 1)); + } + resultArray[i] = innerArray; + offset += len; + } return resultArray; } diff --git a/contracts/spec/OrderSpec.sol b/contracts/spec/OrderSpec.sol index cad4cc0a..438014b2 100644 --- a/contracts/spec/OrderSpec.sol +++ b/contracts/spec/OrderSpec.sol @@ -29,7 +29,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x2 != 0; + return spec & (1 << 6) != 0; } function allOrNone(uint16 spec) @@ -37,7 +37,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x4 != 0; + return spec & (1 << 7) != 0; } function hasDualAuth(uint16 spec) @@ -45,7 +45,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x8 != 0; + return spec & 0x1 != 0; } function hasSignature(uint16 spec) @@ -53,7 +53,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x8 != 0; + return spec & (1 << 8) != 0; } function hasBroker(uint16 spec) @@ -61,7 +61,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x8 != 0; + return spec & (1 << 1) != 0; } function hasBrokerInterceptor(uint16 spec) @@ -69,7 +69,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x8 != 0; + return spec & (1 << 10) != 0; } function hasWallet(uint16 spec) @@ -77,7 +77,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x8 != 0; + return spec & (1 << 3) != 0; } function hasValidSince(uint16 spec) @@ -85,7 +85,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x8 != 0; + return spec & (1 << 4) != 0; } function hasValidUntil(uint16 spec) @@ -93,7 +93,7 @@ library OrderSpec { pure returns (bool) { - return spec & 0x8 != 0; + return spec & (1 << 5) != 0; } function hasOrderInterceptor(uint16 spec) @@ -101,6 +101,6 @@ library OrderSpec { pure returns (bool) { - return spec & 0x8 != 0; + return spec & (1 << 2) != 0; } } diff --git a/contracts/spec/RingSpecs.sol b/contracts/spec/RingSpecs.sol index ce179c3f..1495e152 100644 --- a/contracts/spec/RingSpecs.sol +++ b/contracts/spec/RingSpecs.sol @@ -34,7 +34,7 @@ library RingSpecs { Data.Inputs inputs ) internal - pure + // pure returns (Data.Ring[] memory rings) { uint size = specs.length; @@ -54,11 +54,11 @@ library RingSpecs { Data.Inputs inputs ) internal - pure + // pure returns (Data.Ring memory) { uint size = pspecs.length; - require(size < 2 || size > 8, "bad ring size"); + require(size > 1 && size <= 8, "bad ring size"); Data.Participation[] memory parts = new Data.Participation[](size); address prevTokenS = address(0x0); diff --git a/test/testExchange.ts b/test/testExchange.ts index 4c9028b8..15902017 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -16,6 +16,7 @@ const { TokenRegistry, TradeDelegate, DummyToken, + RingSpecs, } = new Artifacts(artifacts); contract("Exchange", (accounts: string[]) => { @@ -109,17 +110,18 @@ contract("Exchange", (accounts: string[]) => { const bs = ringsGenerator.toSubmitableParam(ringsInfo); // console.log("bs:", bs); - await exchange.submitRings(bs, {from: miner}); - await watchAndPrintEvent(exchange, "LogInt16Arr"); - await watchAndPrintEvent(exchange, "LogIntArr"); + const tx = await exchange.submitRings(bs, {from: miner}); + // console.log("tx:", tx); + // await watchAndPrintEvent(exchange, "LogInt16Arr"); + // await watchAndPrintEvent(exchange, "LogIntArr"); // await exchange.bar("ab".repeat(16) + "xy".repeat(10), {from: miner}); - // await watchAndPrintEvent(exchange, "LogUint8ArrList"); + // await watchAndPrintEvent(exchange, "LogUint8Arr"); // await watchAndPrintEvent(exchange, "LogIntArr"); // await watchAndPrintEvent(exchange, "LogAddrArr"); // await watchAndPrintEvent(exchange, "LogOrderFields"); - // await watchAndPrintEvent(exchange, "LogInt16"); + await watchAndPrintEvent(exchange, "LogInt"); assert(true); }); diff --git a/util/artifacts.ts b/util/artifacts.ts index eee1ba90..63bca3f3 100644 --- a/util/artifacts.ts +++ b/util/artifacts.ts @@ -4,10 +4,12 @@ export class Artifacts { public Exchange: any; public TradeDelegate: any; public DummyToken: any; + public RingSpecs: any; constructor(artifacts: any) { this.TokenRegistry = artifacts.require("impl/TokenRegistry"); this.Exchange = artifacts.require("impl/Exchange"); this.TradeDelegate = artifacts.require("impl/TradeDelegate"); this.DummyToken = artifacts.require("test/DummyToken"); + this.RingSpecs = artifacts.require("spec/RingSpecs"); } } diff --git a/util/rings_generator.ts b/util/rings_generator.ts index 8b0d74ac..dda123f4 100644 --- a/util/rings_generator.ts +++ b/util/rings_generator.ts @@ -44,6 +44,8 @@ export class RingsGenerator { this.calculateMiningSepc(ringsInfo, param); param.ringSpecs = ringsInfo.rings; ringsInfo.orders.map((o) => this.calculateOrderSpec(o, param)); + + ringsInfo.orders.forEach((o) => console.log(o)); return param; } @@ -69,13 +71,14 @@ export class RingsGenerator { private calculateOrderSpec(order: OrderInfo, param: RingsSubmitParam) { param.addressList.push(order.owner); - param.addressList.push(order.delegateContract); param.addressList.push(order.tokenS); // param.addressList.push(order.tokenB); param.uintList.push(new BigNumber(order.amountS)); param.uintList.push(new BigNumber(order.amountB)); param.uintList.push(new BigNumber(order.lrcFee)); + // param.addressList.push(order.delegateContract); + let spec = 0; if (order.dualAuthAddr) { spec += 1; @@ -124,12 +127,12 @@ export class RingsGenerator { } private submitParamToBytes(param: RingsSubmitParam, encodeSpecs: number[]) { - console.log("encodeSpecs:", encodeSpecs); + // console.log("encodeSpecs:", encodeSpecs); + // console.log("param.orderSpecs:", param.orderSpecs); + console.log("addrList:", param.addressList); + console.log("uintList:", param.uintList); // console.log("param.orderSpecs:", param.orderSpecs); - // console.log("addrList:", param.addressList); - // console.log("uintList:", param.uintList); - console.log("param.orderSpecs:", param.orderSpecs); - console.log("param.ringSpecs:", param.ringSpecs); + // console.log("param.ringSpecs:", param.ringSpecs); const stream = new Bitstream(); encodeSpecs.forEach((i) => stream.addNumber(i, 2)); From 6cbbb5fe8831c2819e01c13949fb39c7d4e766b4 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Thu, 28 Jun 2018 18:50:38 +0800 Subject: [PATCH 66/68] update --- contracts/impl/Exchange.sol | 24 ++++++++++++++---------- contracts/spec/RingSpecs.sol | 6 +++--- test/testExchange.ts | 2 +- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index fce1b5f6..afe92a9c 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -313,11 +313,14 @@ contract Exchange is IExchange, NoDefaultFunc { Data.Ring[] memory rings = ringSpecs.assembleRings(orders, inputs); - // handleSubmitRings(ctx, mining, orders, rings); + // emit LogInt(rings.length); + + handleSubmitRings(ctx, mining, orders, rings); } event LogOrder(Data.Order order); event LogOrderFields(address owner, address tokenS, uint amountS, uint lrcFee); + event LogHash(bytes32 hash); function handleSubmitRings( Data.Context ctx, @@ -329,14 +332,15 @@ contract Exchange is IExchange, NoDefaultFunc { { for (uint i = 0; i < orders.length; i++) { orders[i].updateHash(); - orders[i].updateBrokerAndInterceptor(ctx); - orders[i].checkBrokerSignature(ctx); + /* orders[i].updateBrokerAndInterceptor(ctx); */ + /* orders[i].checkBrokerSignature(ctx); */ + emit LogHash(orders[i].hash); } - for (uint i = 0; i < rings.length; i++) { - rings[i].updateHash(); - mining.hash ^= rings[i].hash; - } + /* for (uint i = 0; i < rings.length; i++) { */ + /* rings[i].updateHash(); */ + /* mining.hash ^= rings[i].hash; */ + /* } */ /* mining.updateHash(); */ /* mining.updateMinerAndInterceptor(ctx); */ @@ -346,9 +350,9 @@ contract Exchange is IExchange, NoDefaultFunc { /* orders[i].checkDualAuthSignature(mining.hash); */ /* } */ - /* for (uint i = 0; i < orders.length; i++) { */ - /* orders[i].updateStates(ctx); */ - /* } */ + for (uint i = 0; i < orders.length; i++) { + orders[i].updateStates(ctx); + } /* for (uint i = 0; i < rings.length; i++){ */ /* rings[i].calculateFillAmountAndFee(mining); */ diff --git a/contracts/spec/RingSpecs.sol b/contracts/spec/RingSpecs.sol index 1495e152..a3534a48 100644 --- a/contracts/spec/RingSpecs.sol +++ b/contracts/spec/RingSpecs.sol @@ -34,7 +34,7 @@ library RingSpecs { Data.Inputs inputs ) internal - // pure + pure returns (Data.Ring[] memory rings) { uint size = specs.length; @@ -54,7 +54,7 @@ library RingSpecs { Data.Inputs inputs ) internal - // pure + pure returns (Data.Ring memory) { uint size = pspecs.length; @@ -72,7 +72,7 @@ library RingSpecs { /* inputs.nextUint(), */ /* 0, // splitS */ /* 0, // splitB */ - inputs.nextUint(), // lrcFee + orders[pspec.orderIndex()].lrcFee, // lrcFee /* 0, // lrcReward */ 0 // fillAmountS // 0 // fillAmountB diff --git a/test/testExchange.ts b/test/testExchange.ts index 15902017..9d3a81e9 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -121,7 +121,7 @@ contract("Exchange", (accounts: string[]) => { // await watchAndPrintEvent(exchange, "LogIntArr"); // await watchAndPrintEvent(exchange, "LogAddrArr"); // await watchAndPrintEvent(exchange, "LogOrderFields"); - await watchAndPrintEvent(exchange, "LogInt"); + await watchAndPrintEvent(exchange, "LogHash"); assert(true); }); From 6830bb6a5f12c6ff41c45db7fb5e27f04477e14d Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Mon, 2 Jul 2018 17:12:59 +0800 Subject: [PATCH 67/68] bug fix in orderHelper --- contracts/helper/OrderHelper.sol | 2 +- contracts/helper/ParticipationHelper.sol | 26 +++++----- contracts/helper/RingHelper.sol | 12 ++--- contracts/impl/Data.sol | 2 +- contracts/impl/Exchange.sol | 12 ++--- contracts/spec/RingSpecs.sol | 4 +- contracts/test/DummyToken.sol | 12 +++++ migrations/3_deploy_tokens.js | 2 +- package-lock.json | 6 +-- package.json | 3 +- test/testExchange.ts | 61 ++++++++++++++++-------- util/artifacts.ts | 2 - 12 files changed, 87 insertions(+), 57 deletions(-) diff --git a/contracts/helper/OrderHelper.sol b/contracts/helper/OrderHelper.sol index dadb9df9..c7d17fa7 100644 --- a/contracts/helper/OrderHelper.sol +++ b/contracts/helper/OrderHelper.sol @@ -183,7 +183,7 @@ library OrderHelper { } } - if (brokerInterceptor != tokenOwner) { + if (brokerInterceptor != 0x0 && brokerInterceptor != tokenOwner) { amount = IBrokerInterceptor(brokerInterceptor).getAllowance( tokenOwner, broker, diff --git a/contracts/helper/ParticipationHelper.sol b/contracts/helper/ParticipationHelper.sol index a96efddb..a68776c2 100644 --- a/contracts/helper/ParticipationHelper.sol +++ b/contracts/helper/ParticipationHelper.sol @@ -34,7 +34,7 @@ library ParticipationHelper { pure { p.order.maxAmountS = p.order.maxAmountS.sub(p.fillAmountS); - /* p.order.maxAmountB = p.order.maxAmountB.sub(p.fillAmountB); */ + p.order.maxAmountB = p.order.maxAmountB.sub(p.fillAmountB); p.order.maxAmountLrcFee = p.order.maxAmountLrcFee.sub(p.lrcFee); if (p.order.sellLRC) { @@ -51,20 +51,20 @@ library ParticipationHelper { { thisOrderIsSmaller = true; - /* Data.Order memory order = p.order; */ + Data.Order memory order = p.order; - /* p.fillAmountB = p.fillAmountS.mul(p.rateB) / p.rateS; */ + p.fillAmountB = p.fillAmountS.mul(order.amountB) / order.amountS; - /* if (order.limitByAmountB) { */ - /* if (p.fillAmountB > order.maxAmountB) { */ - /* p.fillAmountB = order.maxAmountB; */ - /* p.fillAmountS = p.fillAmountB.mul(p.rateS) / p.rateB; */ - /* thisOrderIsSmaller = true; */ - /* } */ - /* p.lrcFee = order.lrcFee.mul(p.fillAmountB) / order.amountB; */ - /* } else { */ - /* p.lrcFee = order.lrcFee.mul(p.fillAmountS) / order.amountS; */ - /* } */ + if (order.limitByAmountB) { + if (p.fillAmountB > order.maxAmountB) { + p.fillAmountB = order.maxAmountB; + p.fillAmountS = p.fillAmountB.mul(order.amountS) / order.amountB; + thisOrderIsSmaller = true; + } + p.lrcFee = order.lrcFee.mul(p.fillAmountB) / order.amountB; + } else { + p.lrcFee = order.lrcFee.mul(p.fillAmountS) / order.amountS; + } } function calculateFeeAmounts( diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol index 3dff8be8..2dff515e 100644 --- a/contracts/helper/RingHelper.sol +++ b/contracts/helper/RingHelper.sol @@ -58,7 +58,7 @@ library RingHelper { Data.Participation memory p = ring.participations[i]; Data.Order memory order = p.order; p.fillAmountS = order.maxAmountS; - // p.fillAmountB = order.maxAmountB; + p.fillAmountB = order.maxAmountB; } uint smallest = 0; @@ -73,7 +73,7 @@ library RingHelper { for (uint i = 0; i < ring.size; i++) { Data.Participation memory p = ring.participations[i]; - p.calculateFeeAmounts(mining); + // p.calculateFeeAmounts(mining); p.adjustOrderState(); } } @@ -90,10 +90,10 @@ library RingHelper { // Default to the same smallest index smallest_ = smallest; - Data.Participation memory p = ring.participations[i]; - if (p.calculateFillAmounts()) { - smallest_ = i; - } + /* Data.Participation memory p = ring.participations[i]; */ + /* if (p.calculateFillAmounts()) { */ + /* smallest_ = i; */ + /* } */ // uint j = (i + 1) % ring.size; // Data.Participation memory nextP = ring.participations[j]; diff --git a/contracts/impl/Data.sol b/contracts/impl/Data.sol index b89e8c3b..5ed85238 100644 --- a/contracts/impl/Data.sol +++ b/contracts/impl/Data.sol @@ -103,7 +103,7 @@ library Data { uint lrcFee; // uint lrcReward; uint fillAmountS; - // uint fillAmountB; + uint fillAmountB; } struct Ring{ diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index afe92a9c..bb18c9f7 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -307,7 +307,7 @@ contract Exchange is IExchange, NoDefaultFunc { Data.Order[] memory orders = orderSpecs.assembleOrders(inputs); /* Data.Order memory o = orders[0]; */ - /* // emit LogOrder(orders[0]); */ + /* // Emit Logorder(orders[0]); */ /* emit LogOrderFields(o.owner, o.tokenS, o.amountS, o.lrcFee); */ // emit LogInt(orders.length); @@ -318,8 +318,7 @@ contract Exchange is IExchange, NoDefaultFunc { handleSubmitRings(ctx, mining, orders, rings); } - event LogOrder(Data.Order order); - event LogOrderFields(address owner, address tokenS, uint amountS, uint lrcFee); + event LogOrderFields(uint maxAmountS, uint maxLrcFee); event LogHash(bytes32 hash); function handleSubmitRings( @@ -352,11 +351,12 @@ contract Exchange is IExchange, NoDefaultFunc { for (uint i = 0; i < orders.length; i++) { orders[i].updateStates(ctx); + emit LogOrderFields(orders[i].maxAmountS, orders[i].maxAmountLrcFee); } - /* for (uint i = 0; i < rings.length; i++){ */ - /* rings[i].calculateFillAmountAndFee(mining); */ - /* } */ + for (uint i = 0; i < rings.length; i++){ + rings[i].calculateFillAmountAndFee(mining); + } } /* /// @return Amount of ERC20 token that can be spent by this contract. */ diff --git a/contracts/spec/RingSpecs.sol b/contracts/spec/RingSpecs.sol index a3534a48..5349744a 100644 --- a/contracts/spec/RingSpecs.sol +++ b/contracts/spec/RingSpecs.sol @@ -74,8 +74,8 @@ library RingSpecs { /* 0, // splitB */ orders[pspec.orderIndex()].lrcFee, // lrcFee /* 0, // lrcReward */ - 0 // fillAmountS - // 0 // fillAmountB + 0, // fillAmountS + 0 // fillAmountB ); parts[i].order.tokenB = prevTokenS; diff --git a/contracts/test/DummyToken.sol b/contracts/test/DummyToken.sol index f6facc76..760b3c85 100644 --- a/contracts/test/DummyToken.sol +++ b/contracts/test/DummyToken.sol @@ -57,4 +57,16 @@ contract DummyToken is ERC20Token { balances[_target] = _value; } + function addBalance( + address _target, + uint _value + ) + public + { + uint currBalance = balanceOf(_target); + require(_value + currBalance >= currBalance); + totalSupply_ = totalSupply_.add(_value); + balances[_target] = currBalance.add(_value); + } + } diff --git a/migrations/3_deploy_tokens.js b/migrations/3_deploy_tokens.js index 34875b86..8c223085 100644 --- a/migrations/3_deploy_tokens.js +++ b/migrations/3_deploy_tokens.js @@ -13,7 +13,7 @@ module.exports = function(deployer, network, accounts) { deployer.then(() => { return TokenRegistry.deployed(); }).then((tokenRegistry) => { - return Bluebird.each(devTokenInfos.map(token => DummyToken.new( + return Bluebird.each(devTokenInfos.map(token => DummyToken.new( token.name, token.symbol, token.decimals, diff --git a/package-lock.json b/package-lock.json index 1e91c2b5..11ed3a73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13351,9 +13351,9 @@ "dev": true }, "truffle": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.11.tgz", - "integrity": "sha512-VNhc6jexZeM92sNJJr4U8ln3uJ/mJEQO/0y9ZLYc4pccyIskPtl+3r4mzymgGM/Mq5v6MpoQVD6NZgHUVKX+Dw==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.13.tgz", + "integrity": "sha1-vydYaYi0/4RWPt+/MrR5QUCKdq0=", "dev": true, "requires": { "mocha": "4.1.0", diff --git a/package.json b/package.json index d41d352b..435f46f5 100644 --- a/package.json +++ b/package.json @@ -35,9 +35,8 @@ "dirty-chai": "^2.0.1", "ganache-cli": "^6.1.0", "mocha": "^5.2.0", - "solc": "^0.4.24", "solium": "^1.1.7", - "truffle": "^4.1.11", + "truffle": "4.1.13", "tslint": "5.8.0", "typescript": "2.7.1", "web3-typescript-typings": "0.10.2", diff --git a/test/testExchange.ts b/test/testExchange.ts index 9d3a81e9..81a81817 100644 --- a/test/testExchange.ts +++ b/test/testExchange.ts @@ -1,9 +1,11 @@ import { BigNumber } from "bignumber.js"; import BN = require("bn.js"); +import promisify = require("es6-promisify"); import abi = require("ethereumjs-abi"); import ethUtil = require("ethereumjs-util"); import * as _ from "lodash"; import util = require("util"); +import tokenInfos = require("../migrations/config/tokens.js"); import { Artifacts } from "../util/artifacts"; import { Bitstream } from "../util/bitstream"; import { Ring } from "../util/ring"; @@ -16,18 +18,20 @@ const { TokenRegistry, TradeDelegate, DummyToken, - RingSpecs, } = new Artifacts(artifacts); contract("Exchange", (accounts: string[]) => { - const miner = accounts[1]; - const orderOwners = [accounts[5], accounts[6], accounts[7]]; // 5 ~ 7 + const miner = accounts[0]; + const orderOwners = accounts.slice(5, 8); // 5 ~ 7 let exchange: any; let tokenRegistry: any; let tradeDelegate: any; + let lrcAddress: string; const tokenSymbolAddrMap = new Map(); + const tokenInstanceMap = new Map(); + const allTokenSymbols = tokenInfos.development.map((t) => t.symbol); const assertNumberEqualsWithPrecision = (n1: number, n2: number, precision: number = 8) => { const numStr1 = (n1 / 1e18).toFixed(precision); @@ -36,12 +40,12 @@ contract("Exchange", (accounts: string[]) => { return assert.equal(Number(numStr1), Number(numStr2)); }; - const approve = async (tokens: any[], addresses: string[], amounts: number[]) => { - for (let i = 0; i < tokens.length; i++) { - await tokens[i].approve(TradeDelegate.address, 0, {from: addresses[i]}); - await tokens[i].approve(TradeDelegate.address, amounts[i], {from: addresses[i]}); - } - }; + // const approve = async (tokens: any[], addresses: string[], amounts: number[]) => { + // for (let i = 0; i < tokens.length; i++) { + // await tokens[i].approve(TradeDelegate.address, 0, {from: addresses[i]}); + // await tokens[i].approve(TradeDelegate.address, amounts[i], {from: addresses[i]}); + // } + // }; const getEventsFromContract = async (contract: any, eventName: string, fromBlock: number) => { return new Promise((resolve, reject) => { @@ -70,16 +74,8 @@ contract("Exchange", (accounts: string[]) => { }); }; - before( async () => { - [exchange, tokenRegistry, tradeDelegate] = await Promise.all([ - Exchange.deployed(), - TokenRegistry.deployed(), - TradeDelegate.deployed(), - ]); - }); - const setupOrder = async (order: OrderInfo, index: number) => { - const ownerIndex = index === 0 ? index : orderOwners.length % index; + const ownerIndex = index === 0 ? index : index % orderOwners.length; const owner = orderOwners[ownerIndex]; const symbolS = order.tokenS; @@ -94,8 +90,33 @@ contract("Exchange", (accounts: string[]) => { if (!order.lrcFee) { order.lrcFee = 1e18; } + + // setup amount: + const orderTokenS = await DummyToken.at(addrS); + await orderTokenS.addBalance(order.owner, order.amountS); + const lrcToken = await DummyToken.at(lrcAddress); + await lrcToken.addBalance(order.owner, order.lrcFee); }; + before( async () => { + [exchange, tokenRegistry, tradeDelegate] = await Promise.all([ + Exchange.deployed(), + TokenRegistry.deployed(), + TradeDelegate.deployed(), + ]); + lrcAddress = await tokenRegistry.getAddressBySymbol("LRC"); + + for (const sym of allTokenSymbols) { + const addr = await tokenRegistry.getAddressBySymbol(sym); + tokenSymbolAddrMap.set(sym, addr); + const token = await DummyToken.at(addr); + // approve once for all orders: + for (const orderOwner of orderOwners) { + await token.approve(TradeDelegate.address, 1e27, {from: orderOwner}); + } + } + }); + describe("submitRing", () => { const currBlockTimeStamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp; const ringsGenerator = new RingsGenerator(TradeDelegate.address, currBlockTimeStamp); @@ -120,8 +141,8 @@ contract("Exchange", (accounts: string[]) => { // await watchAndPrintEvent(exchange, "LogUint8Arr"); // await watchAndPrintEvent(exchange, "LogIntArr"); // await watchAndPrintEvent(exchange, "LogAddrArr"); - // await watchAndPrintEvent(exchange, "LogOrderFields"); - await watchAndPrintEvent(exchange, "LogHash"); + await watchAndPrintEvent(exchange, "LogOrderFields"); + // await watchAndPrintEvent(exchange, "LogHash"); assert(true); }); diff --git a/util/artifacts.ts b/util/artifacts.ts index 63bca3f3..eee1ba90 100644 --- a/util/artifacts.ts +++ b/util/artifacts.ts @@ -4,12 +4,10 @@ export class Artifacts { public Exchange: any; public TradeDelegate: any; public DummyToken: any; - public RingSpecs: any; constructor(artifacts: any) { this.TokenRegistry = artifacts.require("impl/TokenRegistry"); this.Exchange = artifacts.require("impl/Exchange"); this.TradeDelegate = artifacts.require("impl/TradeDelegate"); this.DummyToken = artifacts.require("test/DummyToken"); - this.RingSpecs = artifacts.require("spec/RingSpecs"); } } From 4289adb6f9f6f698e1e436e71e175e19e1c638e0 Mon Sep 17 00:00:00 2001 From: kongliangzhong Date: Tue, 10 Jul 2018 20:18:35 +0800 Subject: [PATCH 68/68] update --- contracts/helper/ParticipationHelper.sol | 19 +++++-------- contracts/helper/RingHelper.sol | 35 ++++++++++++++---------- contracts/impl/Data.sol | 4 +-- contracts/impl/Exchange.sol | 6 ++-- contracts/spec/RingSpecs.sol | 4 +-- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/contracts/helper/ParticipationHelper.sol b/contracts/helper/ParticipationHelper.sol index a68776c2..8232affd 100644 --- a/contracts/helper/ParticipationHelper.sol +++ b/contracts/helper/ParticipationHelper.sol @@ -49,22 +49,17 @@ library ParticipationHelper { pure returns (bool thisOrderIsSmaller) { - thisOrderIsSmaller = true; + thisOrderIsSmaller = false; Data.Order memory order = p.order; - p.fillAmountB = p.fillAmountS.mul(order.amountB) / order.amountS; - - if (order.limitByAmountB) { - if (p.fillAmountB > order.maxAmountB) { - p.fillAmountB = order.maxAmountB; - p.fillAmountS = p.fillAmountB.mul(order.amountS) / order.amountB; - thisOrderIsSmaller = true; - } - p.lrcFee = order.lrcFee.mul(p.fillAmountB) / order.amountB; - } else { - p.lrcFee = order.lrcFee.mul(p.fillAmountS) / order.amountS; + if (p.fillAmountS > order.maxAmountS) { + p.fillAmountS = order.maxAmountS; + thisOrderIsSmaller = true; } + + p.fillAmountB = p.fillAmountS.mul(order.amountB) / order.amountS; + p.lrcFee = order.lrcFee.mul(p.fillAmountS) / order.amountS; } function calculateFeeAmounts( diff --git a/contracts/helper/RingHelper.sol b/contracts/helper/RingHelper.sol index 2dff515e..039f727b 100644 --- a/contracts/helper/RingHelper.sol +++ b/contracts/helper/RingHelper.sol @@ -58,16 +58,20 @@ library RingHelper { Data.Participation memory p = ring.participations[i]; Data.Order memory order = p.order; p.fillAmountS = order.maxAmountS; - p.fillAmountB = order.maxAmountB; + // p.fillAmountB = order.maxAmountB; } uint smallest = 0; for (uint i = 0; i < ring.size; i++) { - smallest = calculateOrderFillAmounts(ring, i, smallest); + if (i == ring.size - 1 && smallest == 0) { + smallest = calculateOrderFillAmounts(ring, i, smallest, true); + } else { + smallest = calculateOrderFillAmounts(ring, i, smallest, false); + } } - for (uint i = 0; i < smallest; i++) { + for (uint i = 0; i < smallest ; i++) { calculateOrderFillAmounts(ring, i, smallest); } @@ -81,7 +85,8 @@ library RingHelper { function calculateOrderFillAmounts( Data.Ring ring, uint i, - uint smallest + uint smallest, + bool last ) internal pure @@ -90,18 +95,18 @@ library RingHelper { // Default to the same smallest index smallest_ = smallest; - /* Data.Participation memory p = ring.participations[i]; */ - /* if (p.calculateFillAmounts()) { */ - /* smallest_ = i; */ - /* } */ + Data.Participation memory p = ring.participations[i]; + if (p.calculateFillAmounts()) { + smallest_ = i; + } - // uint j = (i + 1) % ring.size; - // Data.Participation memory nextP = ring.participations[j]; + uint j = (i + 1) % ring.size; + Data.Participation memory nextP = ring.participations[j]; - /* if (p.fillAmountB < nextP.fillAmountS) { */ - /* nextP.fillAmountS = p.fillAmountB; */ - /* } else { */ - /* smallest_ = j; */ - /* } */ + if (p.fillAmountB < nextP.fillAmountS) { + nextP.fillAmountS = p.fillAmountB; + } else { + smallest_ = j; + } } } diff --git a/contracts/impl/Data.sol b/contracts/impl/Data.sol index 5ed85238..dd0c4a19 100644 --- a/contracts/impl/Data.sol +++ b/contracts/impl/Data.sol @@ -98,8 +98,8 @@ library Data { /* uint rateB; */ /* // computed fields */ - /* uint splitS; */ - /* uint splitB; */ + uint splitS; + uint splitB; uint lrcFee; // uint lrcReward; uint fillAmountS; diff --git a/contracts/impl/Exchange.sol b/contracts/impl/Exchange.sol index bb18c9f7..a4fe740c 100644 --- a/contracts/impl/Exchange.sol +++ b/contracts/impl/Exchange.sol @@ -354,9 +354,9 @@ contract Exchange is IExchange, NoDefaultFunc { emit LogOrderFields(orders[i].maxAmountS, orders[i].maxAmountLrcFee); } - for (uint i = 0; i < rings.length; i++){ - rings[i].calculateFillAmountAndFee(mining); - } + /* for (uint i = 0; i < rings.length; i++){ */ + /* rings[i].calculateFillAmountAndFee(mining); */ + /* } */ } /* /// @return Amount of ERC20 token that can be spent by this contract. */ diff --git a/contracts/spec/RingSpecs.sol b/contracts/spec/RingSpecs.sol index 5349744a..fb6ba4db 100644 --- a/contracts/spec/RingSpecs.sol +++ b/contracts/spec/RingSpecs.sol @@ -70,8 +70,8 @@ library RingSpecs { /* pspec.marginSplitAsFee(), */ /* inputs.nextUint(), */ /* inputs.nextUint(), */ - /* 0, // splitS */ - /* 0, // splitB */ + 0, // splitS + 0, // splitB orders[pspec.orderIndex()].lrcFee, // lrcFee /* 0, // lrcReward */ 0, // fillAmountS