diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 67630ef..fd45f75 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -![alt text](https://raw.githubusercontent.com/navcoindev/navcoin-media/master/logo/logo-extended.png "Logo text 2") - -# NAVTECH +# SOFTNODE ## Client Settings @@ -14,7 +12,7 @@ ## RECOMMENDED SPECIFICATIONS -- To start up a NAVTech cluster, you will need a minimum of 2 servers with the following specifications each with their own IP Adddress and have the correct ports open for the API. +- To start up a SOFTNode cluster, you will need a minimum of 2 servers with the following specifications each with their own IP Adddress and have the correct ports open for the API. | Component | Value | |:-----|:-----| @@ -26,43 +24,43 @@ ## SETUP STEPS -### SETUP NAVCOIN AND SUBCHAIN +### SETUP SOFTCOIN AND SUBCHAIN -- Download and compile both the navcoind & subchaind daemons. These each have their own setup steps and you will need to refer to their individual readme files. +- Download and compile both the softcoind & subchaind daemons. These each have their own setup steps and you will need to refer to their individual readme files. -https://github.com/navcoindev/navcoin2/tree/master +https://github.com/softcoindev/softcoin2/tree/master -https://github.com/navcoindev/subchain/tree/master +https://github.com/softcoindev/subchain/tree/master -- Stop navcoind and navajoanonsubchaind if they are running +- Stop softcoind and softajoanonsubchaind if they are running ``` -./navcoind stop -./navajoanonsubchaind stop +./softcoind stop +./softajoanonsubchaind stop ``` -- Configure your navcoin conf file to have valid rpc credentials. Passwords should be a-z, A-Z and 0-9. The use of some symbols causes the RPC connection to fail so it is recommended to avoid them all together. +- Configure your softcoin conf file to have valid rpc credentials. Passwords should be a-z, A-Z and 0-9. The use of some symbols causes the RPC connection to fail so it is recommended to avoid them all together. ``` sh -vi ~/.navcoin2/navcoin.conf +vi ~/.softcoin2/softcoin.conf ``` ``` -rpcuser= -rpcpassword= +rpcuser= +rpcpassword= ``` -- Configure your navajoanonsubchain conf file to have valid rpc credentials. Passwords should be a-z, A-Z and 0-9. The use of some symbols causes the RPC connection to fail so it is recommended to avoid them all together. +- Configure your softajoanonsubchain conf file to have valid rpc credentials. Passwords should be a-z, A-Z and 0-9. The use of some symbols causes the RPC connection to fail so it is recommended to avoid them all together. ``` sh -vi ~/.navajoanonsubchain/navajoanonsubchain.conf +vi ~/.softajoanonsubchain/softajoanonsubchain.conf ``` ``` rpcuser= rpcpassword= ``` -- Start navcoind and navajoanonsubchaind back up again with the new rpc details +- Start softcoind and softajoanonsubchaind back up again with the new rpc details ``` -./navcoind -./navajoanonsubchaind +./softcoind +./softajoanonsubchaind ``` -- Make sure that both Nav Coin and the Subchain are fully synced before attempting the setup steps. +- Make sure that both Soft Coin and the Subchain are fully synced before attempting the setup steps. ### INSTALL TOOLS AND DOWNLOAD SOURCE - If you don't have git or npm installed, please install them. @@ -80,16 +78,16 @@ The node -v command should show v6.3.1 if this doesnt work, please consult the n - Clone the crypto-anonymizer ropo into the folder you want to run the code from with the command ``` sh -git clone https://github.com/navcoindev/navtech.git +git clone https://github.com/softcoindev/softnode.git ``` ### SETUP INCOMING SERVER - On the incoming server open the config folder and copy the incoming settings example to what will be your local settings file and open it ``` sh -cd navtech/config +cd softnode/config cp example-incoming.default.json default.json vi default.json ``` -- This file determines all the settings necessary to operate your incoming NAVTech Server. You will need to configure this to your own settings. +- This file determines all the settings necessary to operate your incoming SOFTNode Server. You will need to configure this to your own settings. Here are the detailed explaination of what the settings control and their defaults: @@ -97,8 +95,8 @@ Here are the detailed explaination of what the settings control and their defaul |:-----|:-----|:-----|:-----|:-----| | `GLOBAL` | `object` | true | `none` | contains the global settings which control how your server operates | | `GLOBAL.serverType` | `string` | true | `INCOMING` | determines if your server is of incoming or outgoing type | -| `GLOBAL.encryptedWallet` | `boolean` | true | `false` | flag for if the NavCoin and Subchain wallets are encrypted | -| `GLOBAL.preventSend` | `boolean` | false | `false` | flag to prevent sending of NAV & SUB for testing purposes | +| `GLOBAL.encryptedWallet` | `boolean` | true | `false` | flag for if the SoftCoin and Subchain wallets are encrypted | +| `GLOBAL.preventSend` | `boolean` | false | `false` | flag to prevent sending of SOFT & SUB for testing purposes | | `GLOBAL.maintenance` | `boolean` | false | `false` | flag to turn your wallet to maintenance mode and restrict IP access | | `GLOBAL.allowedIps` | `array` | false | `none` | array of allowed ip addresses when server is in maintenance mode | | `GLOBAL.allowedIps[n]` | `object` | true | `none` | contains the address information of a single user allowed while in maintenance | @@ -122,17 +120,17 @@ Here are the detailed explaination of what the settings control and their defaul | `INCOMING.smtp.user` | `string` | true | `none` | username for sending mail via smtp | | `INCOMING.smtp.pass` | `string` | true | `none` | password for sending mail via smtp | | `INCOMING.smtp.server` | `string` | true | `none` | server for sending mail via smtp | -| `INCOMING.navCoin` | `object` | true | `none` | contains the settings for the navcoin daemon | -| `INCOMING.navCoin.user` | `string` | true | `none` | rpcusername set in the navcoin.conf file | -| `INCOMING.navCoin.pass` | `string` | true | `none` | rpcpassword set in the navcoin.conf file | -| `INCOMING.navCoin.ip` | `string` | true | '127.0.0.1' | ip address where navcoind is running | -| `INCOMING.navCoin.port` | `string` | true | '44444' | port navcoind is running on | -| `INCOMING.navCoin.walletPassphrase` | `string` | `encryptedWallet` | `none` | walletpassphrase to use to unlock the wallet for transactions. If the wallet is unencrypted, this will be used to encrypt it during setup | +| `INCOMING.softCoin` | `object` | true | `none` | contains the settings for the softcoin daemon | +| `INCOMING.softCoin.user` | `string` | true | `none` | rpcusername set in the softcoin.conf file | +| `INCOMING.softCoin.pass` | `string` | true | `none` | rpcpassword set in the softcoin.conf file | +| `INCOMING.softCoin.ip` | `string` | true | '127.0.0.1' | ip address where softcoind is running | +| `INCOMING.softCoin.port` | `string` | true | '44444' | port softcoind is running on | +| `INCOMING.softCoin.walletPassphrase` | `string` | `encryptedWallet` | `none` | walletpassphrase to use to unlock the wallet for transactions. If the wallet is unencrypted, this will be used to encrypt it during setup | | `INCOMING.subChain` | `object` | true | `none` | contains the settings for the subchain daemon | -| `INCOMING.subChain.user` | `string` | true | `none` | rpcusername set in the navajoanonsubchain.conf file | -| `INCOMING.subChain.pass` | `string` | true | `none` | rpcpassword set in the navajoanonsubchain.conf file | -| `INCOMING.subChain.ip` | `string` | true | '127.0.0.1' | ip address where navajoanonsubchain is running | -| `INCOMING.subChain.port` | `string` | true | '44444' | port navajoanonsubchaind is running on | +| `INCOMING.subChain.user` | `string` | true | `none` | rpcusername set in the softajoanonsubchain.conf file | +| `INCOMING.subChain.pass` | `string` | true | `none` | rpcpassword set in the softajoanonsubchain.conf file | +| `INCOMING.subChain.ip` | `string` | true | '127.0.0.1' | ip address where softajoanonsubchain is running | +| `INCOMING.subChain.port` | `string` | true | '44444' | port softajoanonsubchaind is running on | | `INCOMING.subChain.walletPassphrase` | `string` | `encryptedWallet` | `none` | walletpassphrase to use to unlock the wallet for transactions. If the wallet is unencrypted, this will be used to encrypt it during setup | | `INCOMING.secretOptions` | `object` | true | `none` | contains the options for creating the shared secret | | `INCOMING.secretOptions.salt` | `string` | true | `none` | any string to create randomness in the secret, recommended 20 characters | @@ -140,7 +138,7 @@ Here are the detailed explaination of what the settings control and their defaul | `INCOMING.secret` | `string` | true | `none` | this is the secret shared between the incoming and outgoing server pair. This will be generated during the setup process | | `OUTGOING` | `boolean` | true | `false` | explicit flag to confirm that this is not an outgoing server | -- Please note that it is not recommended to run using an encrypted Nav Coin or Subchain wallet. During testing this cause some errors to be thrown when processing high volume transactions. +- Please note that it is not recommended to run using an encrypted Soft Coin or Subchain wallet. During testing this cause some errors to be thrown when processing high volume transactions. ## RUNNING THE INCOMING SETUP SCRIPTS @@ -160,15 +158,15 @@ mkdir keys keys/private keys/public ``` sh npm run setup ``` - * If your navcoin wallet was unencrypted and you've set the global encryptedWallet flag to `true` it will encrypt the wallet with the walletpassphrase you set in the incoming settings file and ask you to restart navcoind. Then run the setup again + * If your softcoin wallet was unencrypted and you've set the global encryptedWallet flag to `true` it will encrypt the wallet with the walletpassphrase you set in the incoming settings file and ask you to restart softcoind. Then run the setup again ``` sh npm run setup ``` - * If your subchain wallet was unencrypted and you've set the global encryptedWallet flag to `true` it will encrypt the wallet with the walletpassphrase you set in the incoming settings file and ask you to restart navajoanonsubchaind. Then run the setup again + * If your subchain wallet was unencrypted and you've set the global encryptedWallet flag to `true` it will encrypt the wallet with the walletpassphrase you set in the incoming settings file and ask you to restart softajoanonsubchaind. Then run the setup again ``` sh npm run setup ``` -- If your navcoin and subchain were already encrypted or they were encrypted using the steps above, your wallet will now begin to generate a pool of Nav Coin and Subchain addresses to use for transactions. You should see status messages appear with wallet addresses. Wait for this process to complete. +- If your softcoin and subchain were already encrypted or they were encrypted using the steps above, your wallet will now begin to generate a pool of Soft Coin and Subchain addresses to use for transactions. You should see status messages appear with wallet addresses. Wait for this process to complete. - After generating the addresses, it should also output the generated secret and let you know that the operation was successful. Please copy the secret, re-open the incoming settings file and paste it as the value for the property `secret` eg. ``` sh @@ -179,63 +177,63 @@ vi config/default.js secret: '$2a$10$u17OImuiUFGuhkvkeEV/3.5Npk3djKdxce0', ... ``` -- You have the option of running the compiled version of NAVTech which we release or building your own. If you are happy to run what we have distributed then skip this step otherwise, run the following command to build your version: +- You have the option of running the compiled version of SOFTNode which we release or building your own. If you are happy to run what we have distributed then skip this step otherwise, run the following command to build your version: ``` sh npm run build ``` -- This should generate 2 files in the /dist directory: navtech.js and vendor.js +- This should generate 2 files in the /dist directory: softnode.js and vendor.js -- The vendor file links to all the included libraries while the navtech file is the compressed and uglified version of the navtech anon processing scripts. +- The vendor file links to all the included libraries while the softnode file is the compressed and uglified version of the softnode anon processing scripts. -- We recommend using a service called forever js to manage the navtech server for you. It will restart the application if it were to crash and also consolidate and version any error logs which are produced. +- We recommend using a service called forever js to manage the softnode server for you. It will restart the application if it were to crash and also consolidate and version any error logs which are produced. ``` sh npm install -g forever ``` - Start the incoming server and check there were no problems ``` sh -forever start dist/navtech.js +forever start dist/softnode.js ``` - This should send a test email to your selected notification email address to make sure that is working. Then check the logs. ``` sh forever logs 0 ``` -- The logs which are displayed should simply let you know the server has started. If this is the first server you have setup it will also report it was unable to contact an outgoing server. You can test the server is running by opening your browser and navigating to your server's IP address and port eg. https://95.183.53.184:3000 +- The logs which are displayed should simply let you know the server has started. If this is the first server you have setup it will also report it was unable to contact an outgoing server. You can test the server is running by opening your browser and softigating to your server's IP address and port eg. https://95.183.53.184:3000 - We use generated unsigned SSL certificates, so proceed past the invalid SSL certificate and you should see a response like: ``` {"status":200,"type":"SUCCESS","message":"server is running!", "anonhash": "e0396962abef360221920beec1c08c18"} ``` -- If you see this message, your incoming server is ready to accept transactions. The anonhash parameter is what you need to enter into your navcoin.conf file before trying to send anon transactions to this server. This hash will change as new versions of the software are released, so it will not be exactly what is listed in here. This is what the server sends to your wallet to confirm validty of the code it is running. +- If you see this message, your incoming server is ready to accept transactions. The anonhash parameter is what you need to enter into your softcoin.conf file before trying to send anon transactions to this server. This hash will change as new versions of the software are released, so it will not be exactly what is listed in here. This is what the server sends to your wallet to confirm validty of the code it is running. ``` anonhash=e0396962abef360221920beec1c08c18 ``` - Now we need to send the incoming server subchain coins to send to the outgoing server. First, get an account address ``` -./navajoanonsubchaind getaccountaddress incomingAccount +./softajoanonsubchaind getaccountaddress incomingAccount ``` - And send subchain coins to the echoed address split into 1000 SUB transactions. The reason why we split it up is because a wallet can only spend (and receive change from) a transaction once per block. So if we had all our SUB in 1 transaction to start with the server would have trouble processing more than 1 transaction at a time. ``` -./navajoanonsubchaind sendtoaddress SgYPEy3RndRgdPVAWT7FiAkFEyjekLgaeb 1000 +./softajoanonsubchaind sendtoaddress SgYPEy3RndRgdPVAWT7FiAkFEyjekLgaeb 1000 ``` ### SETUP OUTGOING SERVER Setting up the outgoing server is much the same process as the incoming server but with some different settings. -- Repeat the steps under headings: `SETUP NAVCOIN AND SUBCHAIN` and `INSTALL TOOLS AND DOWNLOAD SOURCE` +- Repeat the steps under headings: `SETUP SOFTCOIN AND SUBCHAIN` and `INSTALL TOOLS AND DOWNLOAD SOURCE` - On the outgoing server open the config folder and copy the outgoing settings example to what will be your local settings file and open it ``` sh -cd navtech/config +cd softnode/config cp example-outgoing.default.json default.json vi default.json ``` -- This file determines all the settings necessary to operate your outgoing NAVTech Server. You will need to configure this to your own settings. +- This file determines all the settings necessary to operate your outgoing SOFTNode Server. You will need to configure this to your own settings. Here are the detailed explaination of what the settings control and their defaults: @@ -243,7 +241,7 @@ Here are the detailed explaination of what the settings control and their defaul |:-----|:-----|:-----|:-----|:-----| | `GLOBAL` | `object` | true | `none` | contains the global settings which control how your server operates | | `GLOBAL.serverType` | `string` | true | `INCOMING` | determines if your server is of incoming or outgoing type | -| `GLOBAL.encryptedWallet` | `boolean` | true | `false` | flag for if the NavCoin and Subchain wallets are encrypted | +| `GLOBAL.encryptedWallet` | `boolean` | true | `false` | flag for if the SoftCoin and Subchain wallets are encrypted | | `OUTGOING.local` | `object` | true | `none` | contains the address information of the local (outgoing) server | | `OUTGOING.local.ipAddress` | `string` | true | `none` | IP address of the local server | | `OUTGOING.local.port` | `string` | true | 3000 | port of the local server | @@ -256,25 +254,25 @@ Here are the detailed explaination of what the settings control and their defaul | `OUTGOING.scriptInterval` | `int` | true | 120000 | time in milliseconds between each transaction processing cycle | | `OUTGOING.minAmount` | `int` | true | 10 | minimum transaction size the server will accept | | `OUTGOING.maxAmount` | `int` | true | 10000 | maximum transaction size the server will accept | -| `OUTGOING.navPoolAmount` | `int` | true | 50000 | the size of the NAV pool, all funds exceeding this value get sent to the NAVTech fee address | +| `OUTGOING.softPoolAmount` | `int` | true | 50000 | the size of the SOFT pool, all funds exceeding this value get sent to the SOFTNode fee address | | `OUTGOING.txFeePayoutMin` | `int` | true | 100 | the minimum fee amount to accrue before sending a payout to the anonTxFeeAddress | -| `OUTGOING.anonTxFeeAddress` | `string` | true | `none` | NAV address used to collect the server processing fee. | +| `OUTGOING.anonTxFeeAddress` | `string` | true | `none` | SOFT address used to collect the server processing fee. | | `OUTGOING.notificationEmail` | `string` | true | `none` | email address error notifications will be sent to | | `OUTGOING.smtp` | `object` | true | `none` | contains the settings to send notification emails via smtp | | `OUTGOING.smtp.user` | `string` | true | `none` | username for sending mail via smtp | | `OUTGOING.smtp.pass` | `string` | true | `none` | password for sending mail via smtp | | `OUTGOING.smtp.server` | `string` | true | `none` | server for sending mail via smtp | -| `OUTGOING.navCoin` | `object` | true | `none` | contains the settings for the navcoin daemon | -| `OUTGOING.navCoin.user` | `string` | true | `none` | rpcusername set in the navcoin.conf file | -| `OUTGOING.navCoin.pass` | `string` | true | `none` | rpcpassword set in the navcoin.conf file | -| `OUTGOING.navCoin.ip` | `string` | true | '127.0.0.1' | ip address where navcoind is running | -| `OUTGOING.navCoin.port` | `string` | true | '44444' | port navcoind is running on | -| `OUTGOING.navCoin.walletPassphrase` | `string` | `encryptedWallet` | `none` | walletpassphrase to use to unlock the wallet for transactions. If the wallet is unencrypted, this will be used to encrypt it during setup | +| `OUTGOING.softCoin` | `object` | true | `none` | contains the settings for the softcoin daemon | +| `OUTGOING.softCoin.user` | `string` | true | `none` | rpcusername set in the softcoin.conf file | +| `OUTGOING.softCoin.pass` | `string` | true | `none` | rpcpassword set in the softcoin.conf file | +| `OUTGOING.softCoin.ip` | `string` | true | '127.0.0.1' | ip address where softcoind is running | +| `OUTGOING.softCoin.port` | `string` | true | '44444' | port softcoind is running on | +| `OUTGOING.softCoin.walletPassphrase` | `string` | `encryptedWallet` | `none` | walletpassphrase to use to unlock the wallet for transactions. If the wallet is unencrypted, this will be used to encrypt it during setup | | `OUTGOING.subChain` | `object` | true | `none` | contains the settings for the subchain daemon | -| `OUTGOING.subChain.user` | `string` | true | `none` | rpcusername set in the navajoanonsubchain.conf file | -| `OUTGOING.subChain.pass` | `string` | true | `none` | rpcpassword set in the navajoanonsubchain.conf file | -| `OUTGOING.subChain.ip` | `string` | true | '127.0.0.1' | ip address where navajoanonsubchain is running | -| `OUTGOING.subChain.port` | `string` | true | '44444' | port navajoanonsubchaind is running on | +| `OUTGOING.subChain.user` | `string` | true | `none` | rpcusername set in the softajoanonsubchain.conf file | +| `OUTGOING.subChain.pass` | `string` | true | `none` | rpcpassword set in the softajoanonsubchain.conf file | +| `OUTGOING.subChain.ip` | `string` | true | '127.0.0.1' | ip address where softajoanonsubchain is running | +| `OUTGOING.subChain.port` | `string` | true | '44444' | port softajoanonsubchaind is running on | | `OUTGOING.subChain.walletPassphrase` | `string` | `encryptedWallet` | `none` | walletpassphrase to use to unlock the wallet for transactions. If the wallet is unencrypted, this will be used to encrypt it during setup | | `OUTGOING.secret` | `string` | true | `none` | this is the secret shared between the incoming and outgoing server pair. This needs to match the sercret used in the incoming server settings that was generated by running 'npm run setup' on the incoming server | | `INCOMING` | `boolean` | true | `false` | explicit flag to confirm that this is not an incoming server | @@ -299,40 +297,40 @@ mkdir keys keys/private keys/public ``` sh npm run setup ``` - * If your navcoin wallet was unencrypted and you've set the global encryptedWallet flag to `true` it will encrypt the wallet with the walletpassphrase you set in the incoming settings file and ask you to restart navcoind. Then run the setup again + * If your softcoin wallet was unencrypted and you've set the global encryptedWallet flag to `true` it will encrypt the wallet with the walletpassphrase you set in the incoming settings file and ask you to restart softcoind. Then run the setup again ``` sh npm run setup ``` - * If your subchain wallet was unencrypted and you've set the global encryptedWallet flag to `true` it will encrypt the wallet with the walletpassphrase you set in the incoming settings file and ask you to restart navajoanonsubchaind. Then run the setup again + * If your subchain wallet was unencrypted and you've set the global encryptedWallet flag to `true` it will encrypt the wallet with the walletpassphrase you set in the incoming settings file and ask you to restart softajoanonsubchaind. Then run the setup again ``` sh npm run setup ``` -- If your navcoin and subchain were already encrypted or they were encrypted using the steps above, your wallet will now begin to generate a pool of Nav Coin and Subchain addresses to use for transactions. You should see status messages appear with wallet addresses. Wait for this process to complete. +- If your softcoin and subchain were already encrypted or they were encrypted using the steps above, your wallet will now begin to generate a pool of Soft Coin and Subchain addresses to use for transactions. You should see status messages appear with wallet addresses. Wait for this process to complete. - After generating the addresses, it should let you know that the operation was successful. -- You have the option of running the compiled version of NAVTech which we release or building your own. If you are happy to run what we have distributed then skip this step otherwise, run the following command to build your version: +- You have the option of running the compiled version of SOFTNode which we release or building your own. If you are happy to run what we have distributed then skip this step otherwise, run the following command to build your version: ``` sh npm run build ``` -This should generate 2 files in the /dist directory: navtech.js and vendor.js +This should generate 2 files in the /dist directory: softnode.js and vendor.js -The vendor file links to all the included libraries while the navtech file is the compressed and uglified version of the navtech anon processing scripts. +The vendor file links to all the included libraries while the softnode file is the compressed and uglified version of the softnode anon processing scripts. -- We recommend using a service called forever js to manage the navtech server for you. It will restart the application if it were to crash and also consolidate and version any error logs which are produced. +- We recommend using a service called forever js to manage the softnode server for you. It will restart the application if it were to crash and also consolidate and version any error logs which are produced. ``` sh npm install -g forever ``` - Start the outgoing server and check there were no problems ``` sh -forever start dist/navtech.js +forever start dist/softnode.js ``` - This should send a test email to your selected notification email address to make sure that is working. Then check the logs. ``` sh forever logs 0 ``` -- The logs which are displayed should simply let you know the server has started. If this is the first server you have setup it will also report it was unable to contact an outgoing server. You can test the server is running by opening your browser and navigating to your server's IP address and port eg. https://5.230.146.212:3000 +- The logs which are displayed should simply let you know the server has started. If this is the first server you have setup it will also report it was unable to contact an outgoing server. You can test the server is running by opening your browser and softigating to your server's IP address and port eg. https://5.230.146.212:3000 - We use generated unsigned SSL certificates, so proceed past the invalid SSL certificate and you should see a response like: ``` @@ -340,23 +338,23 @@ forever logs 0 ``` If you see this message, your outgoing server is ready to accept transactions. -- Now we need to send the outgoing server Nav Coins to send to the outgoing server. First, get an account address +- Now we need to send the outgoing server Soft Coins to send to the outgoing server. First, get an account address ``` -./navcoind getaccountaddress outgoingAccount +./softcoind getaccountaddress outgoingAccount ``` -- And send NAV to the echoed address split into 1000 NAV transactions to the maximum value of the pool size you specified. The reason why we split it up is because a wallet can only spend (and receive change from) a transaction once per block. So if we had all our NAV in 1 transaction to start with the server would have trouble processing more than 1 transaction at a time. +- And send SOFT to the echoed address split into 1000 SOFT transactions to the maximum value of the pool size you specified. The reason why we split it up is because a wallet can only spend (and receive change from) a transaction once per block. So if we had all our SOFT in 1 transaction to start with the server would have trouble processing more than 1 transaction at a time. ``` -./navcoind sendtoaddress NgzWzvQBk6o18nsEFoh6Ub53U6eg1qvtFu 1000 +./softcoind sendtoaddress NgzWzvQBk6o18nsEFoh6Ub53U6eg1qvtFu 1000 ``` # ADDITIONAL NOTES -Now you have both servers setup, it is time to send some test transactions. Make sure you put the correct IP addresses, port number and anonhash parameter into your navcoin.conf file and send some small value test transactions though your NAVTech servers. +Now you have both servers setup, it is time to send some test transactions. Make sure you put the correct IP addresses, port number and anonhash parameter into your softcoin.conf file and send some small value test transactions though your SOFTNode servers. If you are happy with your configuration and transactions are processing successfully you will want to remove the GLOBAL.maintenance and GLOBAL.allowedIps settings from your config/default.js file so the servers are open for public use. -Then head along to http://reddit.com/r/NAVTechAnon and submit your servers for public use. +Then head along to http://reddit.com/r/SOFTNodeAnon and submit your servers for public use. ## MULTIPLE INCOMING AND OUTGOING SERVERS @@ -364,7 +362,7 @@ If you want to setup multiple incoming and outgoing servers in your cluster the ## RESTARTING SERVERS -There should be some caution taken when restarting the NAVTech service or restarting the server. The chances are very small because the transaction cycle completes pretty quickly, but it is not recommended to shut the server down while it is in the act of processing transactions. I have created an endpoint to see the server status so you can choose a time between cycles to stop the service +There should be some caution taken when restarting the SOFTNode service or restarting the server. The chances are very small because the transaction cycle completes pretty quickly, but it is not recommended to shut the server down while it is in the act of processing transactions. I have created an endpoint to see the server status so you can choose a time between cycles to stop the service https://95.183.53.184:3000/api/status diff --git a/config/example-incoming.default.json b/config/example-incoming.default.json old mode 100644 new mode 100755 index 8141642..3401120 --- a/config/example-incoming.default.json +++ b/config/example-incoming.default.json @@ -31,12 +31,12 @@ "pass": "SMTP_EMAIL_PASSWORD", "server": "smtp.gmail.com" }, - "navCoin": { + "softCoin": { "user": "RPC_USERNAME", "pass": "RPC_PASSWORD", "ip": "127.0.0.1", "port": "44444", - "walletPassphrase": "NAVCOIN_WALLET_PASSPHRASE" + "walletPassphrase": "SOFTCOIN_WALLET_PASSPHRASE" }, "subChain": { "user": "RPC_USERNAME", diff --git a/config/example-outgoing.default.json b/config/example-outgoing.default.json old mode 100644 new mode 100755 index 3702afb..0aec3e0 --- a/config/example-outgoing.default.json +++ b/config/example-outgoing.default.json @@ -20,21 +20,21 @@ "scriptInterval": 120000, "minAmount": 10, "maxAmount": 10000, - "navPoolAmount": 50000, + "softPoolAmount": 50000, "txFeePayoutMin": 100, - "anonTxFeeAddress": "NAVCOIN_TX_FEE_ADDRESS", + "anonTxFeeAddress": "SOFTCOIN_TX_FEE_ADDRESS", "notificationEmail": "youremail@gmail.com", "smtp": { "user": "yoursmtp@gmail.com", "pass": "SMTP_EMAIL_PASSWORD", "server": "smtp.gmail.com" }, - "navCoin": { + "softCoin": { "user": "RPC_USERNAME", "pass": "RPC_PASSWORD", "ip": "127.0.0.1", "port": "44444", - "walletPassphrase": "NAVCOIN_WALLET_PASSPHRASE" + "walletPassphrase": "SOFTCOIN_WALLET_PASSPHRASE" }, "subChain": { "user": "RPC_USERNAME", diff --git a/dist/navtech.js b/dist/navtech.js deleted file mode 100644 index c178966..0000000 --- a/dist/navtech.js +++ /dev/null @@ -1,3 +0,0 @@ -!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function r(e){e?i():T.writeLog("APP_002","invalid server settings",k)}function i(){w.navClient=new s({username:k.navCoin.user,password:k.navCoin.pass,port:k.navCoin.port,host:k.navCoin.host}),w.subClient=new s({username:k.subChain.user,password:k.subChain.pass,port:k.subChain.port,host:k.subChain.host}),k.ssl?d.exists(k.ssl.key,function(e){d.exists(k.ssl.crt,function(t){if(!e||!t)return void T.writeLog("APP_003","unable to find user defined ssl certificate",k.ssl);var n={key:d.readFileSync(k.ssl.key),cert:d.readFileSync(k.ssl.crt),requestCert:!1,rejectUnauthorized:!1};P.use(c.json()),P.use(c.urlencoded({extended:!0})),o.createServer(n,P).listen(k.local.port,function(){S()})})}):u.createCertificate({days:1,selfSigned:!0},function(e,t){var n={key:t.serviceKey,cert:t.certificate,requestCert:!1,rejectUnauthorized:!1};P.use(c.json()),P.use(c.urlencoded({extended:!0})),o.createServer(n,P).listen(k.local.port,function(){S()})})}var s=n(1),a=n(2),o=n(3),u=n(4),c=n(5),d=n(6),l=n(7),g=n(8),p=n(9),m=n(33),v=n(38),f=n(17),h=n(19),y=n(21),b=n(11),T=n(13),A=n(15),C=l.get("GLOBAL"),k=!1;"INCOMING"===C.serverType&&(k=l.get("INCOMING")),"OUTGOING"===C.serverType&&(k=l.get("OUTGOING")),T.writeLog("SYS_001","Server Starting",{memes:["harambe","rustled jimmies"]},!0);var P=a(),w={};k?v.validateSettings({settings:k},r):T.writeLog("APP_001","invalid global server type",C.serverType);var S=function(){"INCOMING"===C.serverType?(p.init(),L()):"OUTGOING"===C.serverType&&(m.init(),L())},L=function(){P.get("/",function(e,t){g("dist/navtech.js",function(e,n){return e?void t.send(JSON.stringify({status:200,type:"FAILURE",message:"error generating md5 hash",serverType:C.serverType,error:e})):void t.send(JSON.stringify({status:200,type:"SUCCESS",message:"server is running!",serverType:C.serverType,anonhash:n}))})}),P.post("/api/test-decryption",function(e,t){return w.runtime={},w.runtime.req=e,w.runtime.res=t,e.body&&e.body.encrypted_data?void h.decryptData({encryptedData:w.runtime.req.body.encrypted_data},w.checkDecrypted):(T.writeLog("APP_004","failed to receive params",{body:e.body}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_004",message:"failed to receive params"})))}),w.checkDecrypted=function(e,t){return e&&t&&t.decrypted?void w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",message:"decryption test successful"})):(T.writeLog("APP_005","unable to derypt the data",{success:e,data:t,body:w.runtime.req.body}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_005",message:"ERROR: unable to decrypt the data"})))},P.post("/api/get-addresses",function(e,t){return w.runtime={},w.runtime.req=e,w.runtime.res=t,w.runtime.req.body&&w.runtime.req.body.num_addresses&&w.runtime.req.body.type&&w.runtime.req.body.account?(w.runtime.accountToUse=A.account[w.runtime.req.body.account],w.runtime.accountToUse||w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_006A",message:"ERROR: invalid account",body:w.runtime.req.body})),"OUTGOING"===C.serverType?void w.checkIpAddress({allowedIps:k.remote},w.getAddresses):void w.getAddresses()):(T.writeLog("APP_006","failed to receive params",{body:e.body}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_006",message:"ERROR: invalid params",body:w.runtime.req.body})))}),w.getAddresses=function(){w.runtime.numAddresses=parseInt(w.runtime.req.body.num_addresses,10),"SUBCHAIN"===w.runtime.req.body.type?w.runtime.clientToUse=w.subClient:w.runtime.clientToUse=w.navClient,y.getRandomAccountAddresses({client:w.runtime.clientToUse,accountName:w.runtime.accountToUse,numAddresses:w.runtime.numAddresses},w.returnAddresses)},w.returnAddresses=function(e,t){return e&&t&&t.pickedAddresses?void w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:{addresses:t.pickedAddresses}})):(T.writeLog("APP_008","failed to pick random addresses",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_008",message:"failed to pick random addresses"})))},P.get("/api/get-nav-balance",function(e,t){w.runtime={},w.runtime.req=e,w.runtime.res=t,w.navClient.getBalance().then(function(e){w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:{nav_balance:e}}))}).catch(function(e){T.writeLog("APP_009","failed to get the NAV balance",{error:e}),w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_009",message:"failed to get the NAV balance"}))})}),w.checkIpAddress=function(e,t){for(var n=w.runtime.req.connection.remoteAddress||w.runtime.req.socket.remoteAddress,r=!1,i=0;i0){var r=!0,i=!1,s=void 0;try{for(var a,o=t.currentPending[Symbol.iterator]();!(r=(a=o.next()).done);r=!0){var u=a.value;u.confirmations>n&&(n=u.confirmations)}}catch(e){i=!0,s=e}finally{try{!r&&o.return&&o.return()}finally{if(i)throw s}}if(n>A.maxQueue)return T.writeLog("APP_030B","the queue is too long",{highestConf:n},!0),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_030B",message:"the queue is too long"}))}b.getEncryptionKeys({},w.testKeyPair)},w.testKeyPair=function(e,t){return e&&t&&t.privKeyFile&&t.pubKeyFile?void b.testKeyPair({pubKeyFile:t.pubKeyFile,privKeyFile:t.privKeyFile},w.testedKeypair):(T.writeLog("APP_031","failed to get the current keys",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_031",message:"failed to get the current keys"})))},w.testedKeypair=function(e,t){return e&&t&&t.publicKey?(w.runtime.publicKey=t.publicKey,void y.getRandomAccountAddresses({client:w.navClient,accountName:A.account[C.serverType],numAddresses:w.runtime.numAddresses},w.hasRandomAddresses)):(T.writeLog("APP_032","failed to encrypt with selected keypair",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_032",message:"failed to encrypt with selected keypair"})))},w.hasRandomAddresses=function(e,t){return e&&t&&t.pickedAddresses?(w.runtime.navAddresses=t.pickedAddresses,void w.getHash()):(T.writeLog("APP_033","failed to retrieve nav addresses",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_033",message:"failed to retrieve nav addresses"})))},w.hasRandomSubAddresses=function(e,t){return e&&t&&t.pickedAddresses?(w.runtime.subAddresses=t.pickedAddresses,void w.getHash()):(T.writeLog("APP_034","failed to retrieve subchain addresses",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_034",message:"failed to retrieve subchain addresses"})))},w.getHash=function(){g("dist/navtech.js",function(e,t){return e?(T.writeLog("APP_035A","error generating md5 hash",{err:e,hash:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAILURE",message:"error generating md5 hash",serverType:C.serverType,error:e}))):void w.returnCheckedNode(t)})},w.returnCheckedNode=function(e){var t=k.local.host?k.local.host:k.local.ipAddress,n={nav_balance:w.runtime.navBalance,sub_balance:w.runtime.subBalance,public_key:w.runtime.publicKey,server_type:C.serverType,min_amount:k.minAmount,max_amount:k.maxAmount,transaction_fee:k.anonFeePercent,server:t,server_port:k.local.port?k.local.port:443,md5:e};n.nav_addresses=w.runtime.navAddresses,w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:n}))},P.get("/api/status",function(e,t){if(w.runtime={},w.runtime.req=e,w.runtime.res=t,"INCOMING"===C.serverType){var n=new Date,r=n-p.runtime.cycleStart,i=k.scriptInterval-r;w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:{processing:p.processing,paused:p.paused,nextCycleStart:Math.round(i/1e3)+" seconds"}}))}else if("OUTGOING"===C.serverType){var s=new Date,a=s-m.runtime.cycleStart,o=k.scriptInterval-a;w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:{processing:m.processing,paused:m.paused,nextCycleStart:Math.round(o/1e3)+" seconds"}}))}})}},function(e,t){e.exports=require("bitcoin-core")},function(e,t){e.exports=require("express")},function(e,t){e.exports=require("https")},function(e,t){e.exports=require("pem")},function(e,t){e.exports=require("body-parser")},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("config")},function(e,t){e.exports=require("md5-file")},function(e,t,n){"use strict";var r=n(1),i=n(7),s=n(10),a=n(11),o=n(13),u=n(16),c=n(18),d=n(22),l=n(24),g=n(26),p=n(29),m=n(30),v=n(32),f=i.get("INCOMING"),h={processing:!1,paused:!1,runtime:{}};h.init=function(){h.navClient=new r({username:f.navCoin.user,password:f.navCoin.pass,port:f.navCoin.port,host:f.navCoin.host}),h.subClient=new r({username:f.subChain.user,password:f.subChain.pass,port:f.subChain.port,host:f.subChain.host}),o.writeLog("INC_000","server starting"),a.findKeysToRemove({type:"private"},h.startProcessing),h.cron=setInterval(function(){h.paused===!1?a.findKeysToRemove({type:"private"},h.startProcessing):(clearInterval(h.cron),o.writeLog("INC_001","processing paused",{paused:h.paused}))},f.scriptInterval)},h.startProcessing=function(){return h.processing?void o.writeLog("INC_002","server still processing",{processing:h.processing}):(h.processing=!0,h.runtime={},h.runtime.cycleStart=new Date,void u.run({navClient:h.navClient,subClient:h.subClient,settings:f},h.preFlightComplete))},h.preFlightComplete=function(e,t){return e?(h.runtime.navBalance=t.navBalance,h.runtime.subBalance=t.subBalance,void c.run({navClient:h.navClient},h.holdingProcessed)):(o.writeLog("INC_003","preflight checks failed",{success:e,data:t},!0),void(h.processing=!1))},h.holdingProcessed=function(e,t){return e?void d.run({settings:f,navClient:h.navClient},h.outgoingSelected):(o.writeLog("INC_004","failed to process the holding account",{success:e,data:t},!0),h.processing=!1,void(h.paused=!0))},h.outgoingSelected=function(e,t){return e?t.returnAllToSenders?(t.pause&&(h.paused=!0),void l.run({navClient:h.navClient},h.allPendingReturned)):(h.runtime.chosenOutgoing=t.chosenOutgoing,h.runtime.outgoingNavBalance=t.outgoingNavBalance,h.runtime.holdingEncrypted=t.holdingEncrypted,h.runtime.outgoingPubKey=t.outgoingPubKey,void g.run({navClient:h.navClient,outgoingNavBalance:t.outgoingNavBalance,subBalance:h.runtime.subBalance,settings:f},h.currentBatchPrepared)):(o.writeLog("INC_005","failed to find outgoing server",{success:e,data:t},!0),void(h.processing=!1))},h.allPendingReturned=function(e,t){return e?(o.writeLog("INC_007","returned all pending to sender",{success:e,data:t},!0),void(h.processing=!1)):(o.writeLog("INC_006","failed to return all pending to sender",{success:e,data:t},!0),h.processing=!1,void(h.paused=!0))},h.currentBatchPrepared=function(e,t){return e&&t&&(t.currentBatch&&t.currentFlattened&&t.numFlattened||t.pendingToReturn)?(h.runtime.currentBatch=t.currentBatch,h.runtime.currentFlattened=t.currentFlattened,h.runtime.numFlattened=t.numFlattened,h.runtime.pendingToReturn=t.pendingToReturn,h.runtime.pendingToReturn&&h.runtime.pendingToReturn.length>0?(o.writeLog("INC_011","failed to process some transactions",{success:e,data:t},!0),void l.fromList({navClient:h.navClient,transactionsToReturn:h.runtime.pendingToReturn},h.pendingFailedReturned)):h.runtime.currentBatch&&0!==s.size(h.runtime.currentBatch)?void p.run({subClient:h.subClient,chosenOutgoing:h.runtime.chosenOutgoing,numAddresses:h.runtime.numFlattened},h.retrievedSubchainAddresses):(o.writeLog("INC_011B","no currentBatch to process",{currentBatch:h.runtime.currentBatch}),void(h.processing=!1))):(o.writeLog("INC_011D","prepareIncoming returned bad data",{success:e,data:t}),void(h.processing=!1))},h.pendingFailedReturned=function(e,t){return e||(o.writeLog("INC_011A","failed to return failed pending to sender",{success:e,data:t},!0),h.paused=!0,l.run({navClient:h.navClient},h.allPendingReturned)),h.runtime.currentBatch&&0!==s.size(h.runtime.currentBatch)?void p.run({subClient:h.subClient,chosenOutgoing:h.runtime.chosenOutgoing,numAddresses:h.runtime.numFlattened},h.retrievedSubchainAddresses):(o.writeLog("INC_011C","no currentBatch to process",{currentBatch:h.runtime.currentBatch}),void(h.processing=!1))},h.retrievedSubchainAddresses=function(e,t){return e&&t&&t.subAddresses?void m.run({currentBatch:h.runtime.currentBatch,currentFlattened:h.runtime.currentFlattened,outgoingPubKey:h.runtime.outgoingPubKey,subClient:h.subClient,navClient:h.navClient,subAddresses:t.subAddresses,settings:f},h.transactionsProcessed):(o.writeLog("INC_009","failed to retrieve subchain addresses",{success:e,data:t},!0),void l.run({navClient:h.navClient},h.allPendingReturned))},h.transactionsProcessed=function(e,t){if(!e||!t)return t&&t.partialFailure?(o.writeLog("INC_010A","failed part way through processing subchain transactions",{success:e,data:t},!0),h.paused=!0,void(h.processing=!1)):(o.writeLog("INC_010","failed to process transactions",{success:e,data:t},!0),h.paused=!0,void l.run({navClient:h.navClient},h.allPendingReturned));if(h.runtime.successfulTxGroups=t.successfulTxGroups,h.runtime.txGroupsToReturn=t.txGroupsToReturn,h.runtime.transactionsToReturn=[],h.runtime.txGroupsToReturn&&h.runtime.txGroupsToReturn.length>0){o.writeLog("INC_011","failed to process some transactions",{success:e,data:t},!0);for(var n=0;nu.keyPeriod&&a.push(r[c])}a.length>0?d.removeKeys({forRemoval:a,type:e.type},t):"private"===e.type?d.findKeysToRemove({type:"public"},t):t(!0,{message:"nothing to remove"})})},d.removeKeys=function(e,t){0===e.forRemoval.length?"private"===e.type?d.findKeysToRemove({type:"public"},t):t(!0,{message:"all keys removed"}):r.exists(u.keyFolders[e.type].path+e.forRemoval[0],function(n){n?r.unlink(u.keyFolders[e.type].path+e.forRemoval[0],function(n){n&&o.writeLog("ENC_010","failed to remove the key",{error:n,key:e.forRemoval}),d.removeKeys({forRemoval:e.forRemoval.slice(1),type:e.type},t)}):d.removeKeys({forRemoval:e.forRemoval.slice(1),type:e.type},t)})},d.getMidnight=function(e){return parseInt(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()),10)},e.exports=d},function(e,t){e.exports=require("ursa")},function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=n(14),s=n(7),a=s.get("GLOBAL"),o=!1;"INCOMING"===a.serverType&&(o=s.get("INCOMING")),"OUTGOING"===a.serverType&&(o=s.get("OUTGOING"));var u=n(15),c=u.version.major+"."+u.version.minor+"."+u.version.patch,d=encodeURIComponent(o.smtp.user)+":"+encodeURIComponent(o.smtp.pass),l={};l.transporter=i.createTransport("smtps://"+d+"@"+o.smtp.server);var g=new Date,p="\r\n";p+="Version: "+c+"\r\n",p+="Date: "+g+"\r\n",p+="\r\n-----------------------------------------------------------\r\n",console.log(p),l.writeLog=function(e,t,n,i){i&&l.sendMail(e,t,n);var s=new Date,a="\r\n";a+="Date: "+s+"\r\n",a+="Error Code: "+e+"\r\n",a+="Error Message: "+t+"\r\n";for(var o in n)if(n.hasOwnProperty(o)){var u=n[o];"object"===r(n[o])&&(u=JSON.stringify(n[o])),a+=o+": "+u+"\r\n"}a+="\r\n-----------------------------------------------------------\r\n",console.log(a)},l.sendMail=function(e,t,n){var r={from:'"Navtech System" <'+o.smtp.user+">",to:o.notificationEmail,subject:"Navtech System Message - "+o.local.ipAddress+" ("+a.serverType+") "+e,text:e+" - "+t,attachments:[{filename:"data.json",content:JSON.stringify(n)}]};l.transporter.sendMail(r,function(e,t){return e?console.log("nodemail error",e):console.log("nodemail success: "+t.response)})},e.exports=l},function(e,t){e.exports=require("nodemailer")},function(e,t){e.exports={version:{major:1,minor:2,patch:0},keyFolders:{private:{path:"./keys/private/",suffix:"_private.pem"},public:{path:"./keys/public/",suffix:"_public.pub"}},keyPeriod:6048e5,minKeyStamp:14647392e5,account:{INCOMING:"incomingAccount",OUTGOING:"outgoingAccount",HOLDING:"holdingAccount"},maxAddresses:1e3,maxHolding:200,minNavTransactions:3,maxNavTransactions:8,txFee:1e-4,maxEncryptionAttempts:10,encryptionStrength:{INCOMING:2048,OUTGOING:1024},encryptionOutput:{INCOMING:344,OUTGOING:172},subCoinsPerTx:1,subChainTxFee:1e-4,minConfs:1,maxConfs:60,maxQueue:120,blockThreshold:{checking:5,processing:3}}},function(e,t,n){"use strict";var r=n(10),i=n(15),s=n(13),a=n(17),o={};o.run=function(e,t){var n=["navClient","subClient","settings"];return r.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("PRE_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to Preflight.checkNavBlocks"})):(o.runtime={callback:t,navClient:e.navClient,subClient:e.subClient,settings:e.settings},void a.checkBlockHeight({client:o.runtime.navClient,blockThreshold:i.blockThreshold.processing},o.navBlocksChecked))},o.navBlocksChecked=function(e,t){return e&&t?(o.runtime.navBalance=t.balance,void o.runtime.navClient.setTxFee(parseFloat(i.txFee)).then(function(){a.checkBlockHeight({client:o.runtime.subClient,blockThreshold:i.blockThreshold.processing},o.subBlocksChecked)}).catch(function(e){s.writeLog("PRE_003","failed to set NAV tx fee",{err:e}),o.runtime.callback(!1,{message:"failed to set NAV tx fee"})})):(s.writeLog("PRE_002","navClient block check failed",{status:e,data:t}),void o.runtime.callback(!1,{message:"navClient block check failed"}))},o.subBlocksChecked=function(e,t){return e&&t?(o.runtime.subBalance=t.balance,void a.unlockWallet({settings:o.runtime.settings,client:o.runtime.navClient,type:"navCoin"},o.navClientUnlocked)):(s.writeLog("PRE_004","subClient block check failed",{status:e,data:t}),void o.runtime.callback(!1,{message:"subClient block check failed"}))},o.navClientUnlocked=function(e,t){return e?void a.unlockWallet({settings:o.runtime.settings,client:o.runtime.subClient,type:"subChain"},o.subClientUnlocked):(s.writeLog("PRE_005","navClient failed to unlock",{status:e,data:t}),void o.runtime.callback(!1,{message:"navClient failed to unlock"}))},o.subClientUnlocked=function(e,t){return e?void o.runtime.subClient.setTxFee(parseFloat(i.subChainTxFee)).then(function(){o.runtime.callback(!0,{navBalance:o.runtime.navBalance,subBalance:o.runtime.subBalance})}).catch(function(e){s.writeLog("PRE_003","failed to set SUB tx fee",{err:e}),o.runtime.callback(!1,{message:"failed to set SUB tx fee"})}):(s.writeLog("PRE_006","subClient failed to unlock",{status:e,data:t}),void o.runtime.callback(!1,{message:"subClient failed to unlock"}))},e.exports=o},function(e,t,n){"use strict";var r=n(7),i=n(10),s=n(13),a=r.get("GLOBAL"),o={};o.unlockWallet=function(e,t){var n=["settings","client","type"];if(i.intersection(Object.keys(e),n).length!==n.length)return s.writeLog("NAV_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to NavCoin.unlockWallet"});if(a.encryptedWallet===!1)return void t(!0);var r=e.settings.scriptInterval/1e3;e.client.walletPassphrase(e.settings[e.type].walletPassphrase,r).then(function(){t(!0)}).catch(function(n){switch(n.code){case-17:t(!0);break;default:return t(!1,{message:"failed to unlock"}),void s.writeLog("NAV_002","failed to unlock "+e.type+" wallet",{error:n})}})},o.lockWallet=function(e,t){var n=["type","client"];return i.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("NAV_003","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to NavCoin.lockWallet"})):void e.client.walletLock().then(function(){s.writeLog("NAV_004","locked the "+e.type+" wallet",e),o.unlockWallet(e,t)}).catch(function(n){t(!1,{message:"failed to lock"}),s.writeLog("NAV_005","failed to lock "+e.type+" wallet",{error:n})})},o.filterUnspent=function(e,t){var n=["unspent","client","accountName"];if(i.intersection(Object.keys(e),n).length!==n.length)return s.writeLog("NAV_006","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to NavCoin.filterUnspent"});try{e.client.getAddressesByAccount(e.accountName).then(function(n){var r=!1,i=[],s=!0,a=!1,o=void 0;try{for(var u,c=e.unspent[Symbol.iterator]();!(s=(u=c.next()).done);s=!0){var d=u.value;n.indexOf(d.address)!==-1&&(r=!0,i.push(d))}}catch(e){a=!0,o=e}finally{try{!s&&c.return&&c.return()}finally{if(a)throw o}}return r?void t(!0,{currentPending:i}):void t(!0)}).catch(function(n){s.writeLog("NAV_007","failed to get address by account",{error:n,options:e}),t(!1)})}catch(t){s.writeLog("NAV_008","failed to filter",{error:t,options:e})}},o.checkBlockHeight=function(e,t){var n=["client","blockThreshold"];return i.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("NAV_009","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to NavCoin.checkBlockHeight"})):void e.client.getInfo().then(function(n){e.client.getBlockCount().then(function(r){return parseInt(r,10)-e.blockThreshold>parseInt(n.blocks,10)?(s.writeLog("NAV_010","client is not synced with the latest blocks",{walletInfo:n,blockCount:r}),void t(!1,{message:"client is not synced with the latest blocks"})):void t(!0,{balance:n.balance})}).catch(function(n){s.writeLog("NAV_011","failed to get block count",{error:n,options:e}),t(!1,{message:"failed to get block count"})})}).catch(function(n){s.writeLog("NAV_012","failed to get info",{error:n,options:e}),t(!1,{message:"failed to get info"})})},o.validateAddresses=function(e,t){var n=["client","addresses"];return i.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("NAV_013","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to NavCoin.validateAddresses"})):0===e.addresses.length?void t(!0):void e.client.validateAddress(e.addresses[0]).then(function(n){return n.isvalid!==!0?(s.writeLog("NAV_014","provided address is invalid",{address:e.addresses[0]}),void t(!1,{message:"provided address is invalid"})):void o.validateAddresses({addresses:e.addresses.slice(1),client:e.client},t)}).catch(function(n){s.writeLog("NAV_015","failed to validate address",{error:n,options:e}),t(!1,{message:"failed to validate address"})})},e.exports=o},function(e,t,n){"use strict";var r=n(10),i=n(15),s=n(13),a=n(17),o=n(19),u=n(20),c=n(21),d={};d.run=function(e,t){var n=["navClient"];return r.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("RFL_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RefillOutgoing.checkHoldingAccount"})):(d.runtime={callback:t,navClient:e.navClient},void d.getUnspent())},d.getUnspent=function(){d.runtime.navClient.listUnspent().then(function(e){return e.length<1?(s.writeLog("RFL_002","no unspent in holding account",{unspent:e}),void d.runtime.callback(!0,{message:"no unspent in holding account"})):void a.filterUnspent({unspent:e,client:d.runtime.navClient,accountName:i.account.HOLDING},d.holdingFiltered)}).catch(function(e){s.writeLog("RFL_003","failed to list unspent",{error:e}),d.runtime.callback(!1,{message:"failed to list unspent"})})},d.holdingFiltered=function(e,t){return!e||!t||!t.currentPending||t.currentPending.length<1?void d.runtime.callback(!0,{message:"no pending to clear from account"}):(d.runtime.currentHolding=t.currentPending,void d.processHolding())},d.processHolding=function(){return d.runtime.currentHolding.length<1?(s.writeLog("RFL_005","all holding processed",{currentHolding:d.runtime.currentHolding}),void d.runtime.callback(!0,{message:"all holding processed"})):void d.checkIfHoldingIsSpendable()},d.checkIfHoldingIsSpendable=function(){return d.runtime.currentHolding[0].confirmations>i.minConfs?void o.getEncrypted({transaction:d.runtime.currentHolding[0],client:d.runtime.navClient},d.holdingDecrypted):(s.writeLog("RFL_006","holding account transaction not spendable",{currentHolding:d.runtime.currentHolding}),d.runtime.currentHolding.splice(0,1),void d.processHolding())},d.holdingDecrypted=function(e,t){if(!(e&&t&&t.decrypted&&t.transaction))return s.writeLog("RFL_007","failed to decrypt holding transaction data",{success:e,data:t}),d.runtime.currentHolding.splice(0,1),void d.processHolding();if(d.runtime.holdingTransaction=t.transaction,t.decrypted.constructor!==Array)return s.writeLog("RFL_007A","decrypted data not an array",{currentHolding:d.runtime.currentHolding}),d.runtime.currentHolding.splice(0,1),void d.processHolding();var n=t.decrypted.slice(0);if(n.constructor!==Array)return s.writeLog("RFL_007A","decrypted data not an array of addresses",{currentHolding:d.runtime.currentHolding}),d.runtime.currentHolding.splice(0,1),void d.processHolding();for(var r=Math.ceil(Math.random()*(n.length-(i.minNavTransactions-1)))+(i.minNavTransactions-1),a=[];a.length=10?void c.runtime.callback(!1,{error:e}):(s.writeLog("RAW_007","retrying",{error:e,counter:c.runtime.counter}),void setTimeout(function(){c.runtime.counter+=1,c.create()},c.runtime.retryDelay))},e.exports=c},function(e,t,n){"use strict";var r=n(10),i=n(13),s=n(15),a={};a.incoming=function(e,t){var n=["totalToSend","addresses"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("RND_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RandomizeTransactions.incoming"})):(a.runtime={callback:t,totalToSend:e.totalToSend,addresses:e.addresses,transactions:{}},void a.randomizeIncoming())},a.randomizeIncoming=function(){for(var e=1e8,t=a.runtime.totalToSend*e,n=s.txFee*e,r=n*a.runtime.addresses.length,i=t-r,o=0,u=i/a.runtime.addresses.length,c=Math.floor(1.5*u*e),d=Math.floor(.5*u*e),l=0;li-o||l===a.runtime.addresses.length-1){var m=Math.round(i-o);a.runtime.transactions[a.runtime.addresses[l]]=m/e,o+=m}else a.runtime.transactions[a.runtime.addresses[l]]=p/e,o+=p}a.runtime.callback(!0,{transactions:a.runtime.transactions})},a.outgoing=function(e,t){var n=["transaction","address","amount"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("RND_002","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RandomizeTransactions.outgoing"})):(a.runtime={callback:t,transaction:e.transaction,address:e.address,amount:e.amount,transactions:[]},void a.randomizeOutgoing())},a.randomizeOutgoing=function(){for(var e=Math.ceil(Math.random()*(s.maxNavTransactions-s.minNavTransactions))+s.minNavTransactions,t=a.runtime.amount,n=1e8,r=t*n,i=0,o=r/e,u=Math.floor(1.5*o*n),c=Math.floor(.5*o*n),d=0;dr-i||d===e-1){var p=Math.round(r-i);a.runtime.transactions.push(p/n),i+=p}else a.runtime.transactions.push(g/n),i+=g}a.runtime.callback(!0,{partialTransactions:a.runtime.transactions})},a.getRandomAccountAddresses=function(e,t){var n=["client","accountName","numAddresses"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("RND_003","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RandomizeTransactions.getRandomAccountAddresses"})):void e.client.getAddressesByAccount(e.accountName).then(function(n){a.chooseRandomAddresses({accountName:e.accountName,numAddresses:e.numAddresses,addresses:n},t)}).catch(function(n){i.writeLog("RND_004","get account address failed",{options:e,error:n}),t(!1,{message:"get account address failed"})})},a.chooseRandomAddresses=function(e,t){var n=["addresses","accountName","numAddresses"];if(r.intersection(Object.keys(e),n).length!==n.length)return i.writeLog("RND_005","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RandomizeTransactions.chooseRandomAddresses"});for(var s=[],a=0;s.length=a.maxAddresses?void l.runtime.callback(!0,{currentBatch:l.runtime.currentBatch,currentFlattened:l.runtime.currentFlattened,numFlattened:l.runtime.numFlattened,pendingToReturn:l.runtime.transactionsToReturn}):(l.runtime.numFlattened+=t.flattened.length,l.runtime.currentFlattened[l.runtime.remainingToFlatten[0].unique]=t.flattened,l.runtime.remainingToFlatten.splice(0,1),0===l.runtime.remainingToFlatten.length?void l.runtime.callback(!0,{currentBatch:l.runtime.currentBatch,currentFlattened:l.runtime.currentFlattened,numFlattened:l.runtime.numFlattened,pendingToReturn:l.runtime.transactionsToReturn}):void c.incoming({amountToFlatten:l.runtime.remainingToFlatten[0].amount,anonFeePercent:l.runtime.settings.anonFeePercent},l.flattened)):(o.writeLog("PREPI_004","failed to flatten transactions",{success:e,data:t,runtime:l.runtime}),l.runtime.remainingToFlatten.splice(0,1),0===l.runtime.remainingToFlatten.length?void l.runtime.callback(!0,{currentBatch:l.runtime.currentBatch,currentFlattened:l.runtime.currentFlattened,numFlattened:l.runtime.numFlattened,pendingToReturn:l.runtime.transactionsToReturn}):void c.incoming({amountToFlatten:l.runtime.remainingToFlatten[0].amount,anonFeePercent:l.runtime.settings.anonFeePercent},l.flattened))},e.exports=l},function(e,t,n){"use strict";var r=n(10),i=n(13),s={};s.incoming=function(e,t){var n=["amountToFlatten","anonFeePercent"];if(r.intersection(Object.keys(e),n).length!==n.length)return i.writeLog("FLT_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to FlattenTransactions.incoming"});var a=e.amountToFlatten/(1+e.anonFeePercent/100);s.runtime={callback:t,amountToFlatten:s.satoshiParser(a)},s.flattenIncoming()},s.flattenIncoming=function(){for(var e=Math.floor(s.runtime.amountToFlatten),t=e.toString(),n=s.runtime.amountToFlatten-e,a=s.satoshiParser(n),o=[],u=0;u0&&r.sum(o)===e-c?o.push(s.satoshiParser(parseInt(c,10)+a)):o.push(parseInt(c,10));if(1===o.length){o=[];for(var g=0;g<10;g++)a>0&&9===g?o.push(s.satoshiParser(e/10+a)):o.push(e/10)}var p=o.reduce(function(e,t){return t+e},0),m=s.satoshiParser(p);return m!==s.runtime.amountToFlatten?(i.writeLog("FLT_002","unable to correctly flatten amount",{runtime:s.runtime,flattened:o}),void s.runtime.callback(!1,{flattened:o})):void s.runtime.callback(!0,{flattened:o})},s.satoshiParser=function(e){var t=1e8;return Math.round(e*t)/t},e.exports=s},function(e,t,n){"use strict";var r=n(10),i=n(13),s=n(19),a=n(15),o={};o.run=function(e,t){var n=["currentPending","client"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("GRP_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to GroupPartials.run"})):(o.runtime={client:e.client,currentPending:e.currentPending,remainingToDecrypt:e.currentPending,transactionsToReturn:[],readyToProcess:{},partials:{},callback:t},void o.getDecryptedData())},o.getDecryptedData=function(){return o.runtime.remainingToDecrypt.length<1?void o.checkPartials():void s.getEncrypted({transaction:o.runtime.remainingToDecrypt[0],client:o.runtime.client},o.checkDecrypted)},o.partialFailed=function(e){var t=r.findIndex(o.runtime.transactionsToReturn,function(t){return t.txid===e.txid});t===-1&&o.runtime.transactionsToReturn.push(e),o.runtime.remainingToDecrypt.splice(0,1),o.getDecryptedData()},o.checkDecrypted=function(e,t){return e&&t&&t.decrypted&&t.transaction?t.decrypted.n&&t.decrypted.t&&t.decrypted.p&&t.decrypted.o&&t.decrypted.u?void o.runtime.client.validateAddress(t.decrypted.n).then(function(n){return n.isvalid!==!0?(i.writeLog("GRP_003A","encrypted address invalid",{success:e,data:t}),void o.partialFailed(t.transaction)):void o.groupPartials(t.decrypted,t.transaction)}).catch(function(n){i.writeLog("GRP_003B","failed to decrypt transaction data",{success:e,error:n}),o.partialFailed(t.transaction)}):(i.writeLog("GRP_003","failed to receive correct encrypted params",{n:!!t.decrypted.n,t:t.decrypted.t,p:t.decrypted.p,o:t.decrypted.o,u:t.decrypted.u,data:t}),void o.partialFailed(t.transaction)):(i.writeLog("GRP_002","failed to decrypt transaction data",{success:e}),void o.partialFailed(o.runtime.remainingToDecrypt[0]))},o.groupPartials=function(e,t){if(o.runtime.partials[e.u]||(o.runtime.partials[e.u]={destination:e.n,unique:e.u,timeDelay:parseInt(e.t,10),parts:parseInt(e.o,10),partsSum:0,amount:0,transactions:{},readyToProcess:!1}),o.runtime.partials[e.u].readyToProcess===!0)return i.writeLog("GRP_006","this partial group is already flagged as completed",{partials:o.runtime.partials[e.u],transaction:t,n:!!e.n,t:e.t,p:e.p,o:e.o,u:e.u}),void o.partialFailed(t);if(o.runtime.partials[e.u].destination!==e.n)return i.writeLog("GRP_004","decrypted address different from other partials",{partials:o.runtime.partials[e.u],transaction:t}),void o.partialFailed(t);if(o.runtime.partials[e.u].transactions[t.txid])return i.writeLog("GRP_005","txid already processed",{partials:o.runtime.partials[e.u],transaction:t}),void o.partialFailed(t);var n=Math.round(1e8*o.runtime.partials[e.u].amount),s=Math.round(1e8*t.amount),a=(n+s)/1e8;o.runtime.partials[e.u].amount=a,o.runtime.partials[e.u].partsSum+=parseInt(e.p,10),o.runtime.partials[e.u].transactions[t.txid]={txid:t.txid,amount:t.amount,confirmations:t.confirmations,vout:t.vout,vin:t.vin,part:e.p};var u=o.runtime.partials[e.u].parts,c=r.size(o.runtime.partials[e.u].transactions);c===u&&u*(u+1)/2===o.runtime.partials[e.u].partsSum&&(o.runtime.partials[e.u].readyToProcess=!0,o.runtime.readyToProcess[e.u]=o.runtime.partials[e.u]),o.runtime.remainingToDecrypt.splice(0,1),o.getDecryptedData()},o.checkPartials=function(){r.forEach(o.runtime.partials,function(e){e.readyToProcess||r.forEach(e.transactions,function(e){var t=r.findIndex(o.runtime.transactionsToReturn,function(t){return t.txid===e.txid});t===-1&&e.confirmations>a.maxConfs&&o.runtime.transactionsToReturn.push(e)})}),o.runtime.callback(!0,{readyToProcess:o.runtime.readyToProcess,transactionsToReturn:o.runtime.transactionsToReturn})},e.exports=o},function(e,t,n){"use strict";var r=n(10),i=n(23),s=n(13),a=n(17),o={};o.run=function(e,t){var n=["subClient","chosenOutgoing","numAddresses"];return r.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("RSC_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RetrieveSubchainAddresses.run"})):(o.runtime={callback:t,subClient:e.subClient,chosenOutgoing:e.chosenOutgoing,numAddresses:e.numAddresses},void o.getSubAddresses())},o.getSubAddresses=function(){var e=o.runtime.chosenOutgoing,t=e.port?e.ipAddress+":"+e.port:e.ipAddress;o.runtime.outgoingAddress=t;var n={uri:"https://"+t+"/api/get-addresses",method:"POST",timeout:6e4,rejectUnauthorized:!1,requestCert:!0,agent:!1,form:{type:"SUBCHAIN",account:"OUTGOING",num_addresses:o.runtime.numAddresses}};i(n,o.requestResponse)},o.requestResponse=function(e,t,n){return e?(s.writeLog("RSC_004","failed to query outgoing server",{error:e,outgoingAddress:o.runtime.outgoingAddress}),void o.runtime.callback(!1,{message:"failed to query outgoing server"})):void o.checkOutgoingCanTransact(n,o.runtime.outgoingAddress)},o.checkOutgoingCanTransact=function(e,t){try{var n=JSON.parse(e);if("SUCCESS"!==n.type)return s.writeLog("RSC_005","outgoing server returned failure",{body:n,outgoingAddress:t}),void o.runtime.callback(!1,{message:"outgoing server returned failure"});if(!n.data||!n.data.addresses||n.data.addresses.constructor!==Array)return s.writeLog("RSC_006","outgoing server returned incorrect params",{body:n,outgoingAddress:t}),void o.runtime.callback(!1,{message:"outgoing server returned failure"});o.checkSubAddresses(n.data.addresses)}catch(n){return s.writeLog("RSC_005A","outgoing server returned non json response",{body:e,error:n,outgoingAddress:t}),void o.runtime.callback(!1,{message:"outgoing server returned non json response"})}},o.checkSubAddresses=function(e){return e.length<1?(s.writeLog("RSC_007","outgoing server must provide at least one sub address",{subAddresses:e}),void o.runtime.callback(!1,{message:"outgoing server must provide at least one sub address"})):e.lengthu.runtime.remainingFlattened.length?(s.writeLog("PROI_009","partial subchain transaction failure",{ -txGroup:e,runtime:u.runtime}),void u.runtime.callback(!1,{partialFailure:!0})):(s.writeLog("PROI_009A","complete group failure",{txGroup:e,runtime:u.runtime}),u.runtime.txGroupsToReturn.push(t),u.runtime.remainingTxGroups.splice(0,1),void u.processPending())},u.reEncryptAddress=function(e,t,n,r,o){try{var c={n:e,v:r,s:u.runtime.settings.secret,t:u.runtime.currentBlockHeight+Math.round(Math.random()*t)},d=u.runtime.outgoingPubKey.encrypt(JSON.stringify(c),"utf8","base64",i.RSA_PKCS1_PADDING);if(d.length!==a.encryptionOutput.OUTGOING&&o=a.maxEncryptionAttempts)return s.writeLog("PROI_006","max public key encryption failures",{txGroup:n,counter:o,encrypted:d}),void u.partialFailed(n);u.makeSubchainTx(d,n)}catch(e){return s.writeLog("PROI_007","encrypted address invalid",{txGroup:n,error:e}),void u.partialFailed(n)}},u.makeSubchainTx=function(e,t){o.send({client:u.runtime.subClient,address:u.runtime.subAddresses[0],amount:a.subCoinsPerTx,transaction:t,encrypted:e},u.sentSubToOutgoing)},u.sentSubToOutgoing=function(e,t){return e&&t&&t.sendOutcome?(u.runtime.subAddresses.splice(0,1),u.runtime.remainingFlattened.splice(0,1),void u.processPartial()):(s.writeLog("PROI_008","failed subClient send to address",{transaction:t.transaction,error:t.error}),void u.partialFailed())},e.exports=u},function(e,t,n){"use strict";var r=n(7),i=n(10),s=n(13),a=n(17),o=r.get("GLOBAL"),u=!1;"INCOMING"===o.serverType&&(u=r.get("INCOMING")),"OUTGOING"===o.serverType&&(u=r.get("OUTGOING"));var c={};c.send=function(e,t){var n=["client","address","amount","transaction"];if(i.intersection(Object.keys(e),n).length!==n.length)return s.writeLog("STA_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SelectOutgoing.run"});if(o.preventSend)return s.writeLog("STA_TEST_001","preventSend triggered",{options:e}),void t(!0,{sendOutcome:"dummy-tx-id",transaction:e.transaction});if(c.runtime={},e.counter&&e.counter>7)return s.writeLog("STA_002","max send attempts reached",{transaction:e.transaction,counter:e.counter}),void t(!1,{transaction:e.transaction,error:"max send attempts reached"});var r=1e8,d=Math.round(e.amount*r),l=d/r;e.client.sendToAddress(e.address,l,null,null,e.encrypted).then(function(n){if(n)return void t(!0,{sendOutcome:n,transaction:e.transaction})}).catch(function(n){if(n.code===-13&&!e.triedToUnlock){c.runtime.options=e,c.runtime.callback=t;var r=e.client.port===u.navCoin.port?"navCoin":"subChain";return void a.unlockWallet({settings:u,client:e.client,type:r},c.walletUnlocked)}s.writeLog("STA_003","failed send to address",{transaction:e.transaction,error:n}),setTimeout(function(){var n=e.counter?e.counter+1:1,r={client:e.client,address:e.address,amount:e.amount,transaction:e.transaction,encrypted:e.encrypted,counter:n,triedToUnlock:!1};c.send(r,t)},3e4)})},c.walletUnlocked=function(e,t){if(!e)return s.writeLog("STA_004","unable to unlock wallet",{success:e,data:t}),void c.runtime.callback(!1,{transaction:c.runtime.options.transaction,error:t});var n={client:c.runtime.options.client,address:c.runtime.options.address,amount:c.runtime.options.amount,transaction:c.runtime.options.transaction,encrypted:c.runtime.options.encrypted,counter:c.runtime.options.counter,triedToUnlock:!0};c.send(n,c.runtime.callback)},e.exports=c},function(e,t,n){"use strict";var r=n(10),i=n(13),s=n(21),a=n(15),o=n(20),u={};u.run=function(e,t){var n=["successfulSubTransactions","holdingEncrypted","navClient"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("STH_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SpendToHolding.run"})):(u.runtime={callback:t,successfulSubTransactions:e.successfulSubTransactions,holdingEncrypted:e.holdingEncrypted,navClient:e.navClient},void s.getRandomAccountAddresses({client:u.runtime.navClient,accountName:a.account.HOLDING,numAddresses:1},u.createHoldingTransactions))},u.createHoldingTransactions=function(e,t){if(!e)return i.writeLog("STH_002","could not retrieve holding addresses",{success:e,data:t}),void u.runtime.callback(!1,{message:"could not retrieve holding addresses"});var n=1e8,r=0,s=!0,c=!1,d=void 0;try{for(var l,g=u.runtime.successfulSubTransactions[Symbol.iterator]();!(s=(l=g.next()).done);s=!0){var p=l.value;r+=Math.round(p.amount*n)-Math.round(a.txFee*n)}}catch(e){c=!0,d=e}finally{try{!s&&g.return&&g.return()}finally{if(c)throw d}}for(var m=r/n,v=[],f=0;f0&&i.writeLog("OUT_003A","failed to prepare some subtransactions",{success:e,data:t},!0),void(p.processing=!1))},p.transactionsProcessed=function(e,t){return e&&t?!t.successfulTransactions||t.successfulTransactions.length<1?(i.writeLog("OUT_005","all transactions failed",t,!0),p.processing=!1,void(p.paused=!0)):(t.failedTransactions&&t.failedTransactions.length>0&&i.writeLog("OUT_005A","failed to send send some transactions",{success:e,data:t},!0),p.runtime.successfulTransactions=t.successfulTransactions,void d.run({transactions:p.runtime.successfulTransactions,subClient:p.subClient,settings:g},p.subnavReturned)):(i.writeLog("OUT_004","failed to process transactions",{success:e,data:t},!0),p.processing=!1,void(p.paused=!0))},p.subnavReturned=function(e,t){return e?void(p.processing=!1):(i.writeLog("OUT_007","unable to return subnav to incoming server",{transactions:p.runtime.successfulTransactions,data:t},!0),p.paused=!0,void(p.processing=!1))},e.exports=p},function(e,t,n){"use strict";var r=n(10),i=n(7),s=i.get("GLOBAL"),a=n(13),o=n(17),u=n(19),c=n(15),d={};d.run=function(e,t){var n=["navClient","subClient","navBalance","settings"];return r.intersection(Object.keys(e),n).length!==n.length?(a.writeLog("PREPO_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to ReturnAllToSenders.run"})):(d.runtime={callback:t,navClient:e.navClient,subClient:e.subClient,navBalance:e.navBalance,settings:e.settings,failedSubTransactions:[],currentBatch:[],sumPending:0},void d.runtime.navClient.getBlockCount().then(function(e){d.runtime.currentBlockHeight=e,d.getUnspent()}).catch(function(e){a.writeLog("PREPO_001A","failed to get the current blockheight",{error:e}),t(!1,{message:"failed to get the current blockheight"})}))},d.getUnspent=function(){d.runtime.subClient.listUnspent().then(function(e){return e.length<1?void d.runtime.callback(!1,{message:"no unspent transactions found"}):void o.filterUnspent({unspent:e,client:d.runtime.subClient,accountName:c.account[s.serverType]},d.unspentFiltered)}).catch(function(e){a.writeLog("PREPO_002","failed to list unspent",e),d.runtime.callback(!1,{message:"failed to list unspent"})})},d.unspentFiltered=function(e,t){return!e||!t||!t.currentPending||t.currentPending.length<1?(a.writeLog("PREPO_003","no current pending to return",t),void d.runtime.callback(!1,{message:"no current pending to return"})):(d.runtime.currentPending=t.currentPending,void d.processTransaction())},d.processTransaction=function(){return d.runtime.currentPending.length<1?void d.runtime.callback(!0,{failedSubTransactions:d.runtime.failedSubTransactions,currentBatch:d.runtime.currentBatch}):void u.getEncrypted({transaction:d.runtime.currentPending[0],client:d.runtime.subClient},d.checkDecrypted)},d.failedTransaction=function(){d.runtime.failedSubTransactions.push(d.runtime.currentPending[0]),d.runtime.currentPending.splice(0,1),d.processTransaction()},d.checkDecrypted=function(e,t){if(!(e&&t&&t.decrypted&&t.transaction))return a.writeLog("PREPO_004","failed to decrypt transaction",{success:e}),void d.failedTransaction();if(!t.decrypted.n||!t.decrypted.v||!t.decrypted.s)return a.writeLog("PREPO_005","transaction has invalid params",{success:e}),void d.failedTransaction();if(parseFloat(t.decrypted.v)>d.runtime.settings.maxAmount)return a.writeLog("PREPO_006","decrypted amount is larger than maxAmount",{success:e}),void d.failedTransaction();t.decrypted.s!==d.runtime.settings.secret&&(a.writeLog("PREPO_007","secret mismatch",{success:e}),d.failedTransaction());var n=t.decrypted;n.t||(n.t=0),d.testDecrypted(n,t.transaction)},d.testDecrypted=function(e,t){d.runtime.navClient.validateAddress(e.n).then(function(n){return n.isvalid!==!0?(a.writeLog("PREPO_008","recipient address is invalid",{transaction:t}),void d.failedTransaction()):e.t>d.runtime.currentBlockHeight?(d.runtime.currentPending.splice(0,1),void d.processTransaction()):d.runtime.navBalance>d.runtime.sumPending+parseFloat(e.v)?(d.runtime.sumPending=d.runtime.sumPending+parseFloat(e.v),d.runtime.currentBatch.push({decrypted:e,transaction:t}),d.runtime.currentPending.splice(0,1),void d.processTransaction()):void d.runtime.callback(!0,{failedSubTransactions:d.runtime.failedSubTransactions,currentBatch:d.runtime.currentBatch})}).catch(function(n){a.writeLog("PREPO_009","navClient failed validate address",{decrypted:e,transaction:t,error:n}),d.failedTransaction()})},e.exports=d},function(e,t,n){"use strict";var r=n(10),i=n(13),s=(n(21),n(31)),a={};a.run=function(e,t){var n=["currentBatch","settings","navClient"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("PROO_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to ProcessOutgoing.run"})):(a.runtime={callback:t,currentBatch:e.currentBatch,settings:e.settings,navClient:e.navClient,successfulTransactions:[],failedTransactions:[]},a.runtime.remainingTransactions=e.currentBatch,void a.processPending())},a.processPending=function(){return a.runtime.remainingTransactions.length<1?void a.runtime.callback(!0,{successfulTransactions:a.runtime.successfulTransactions,failedTransactions:a.runtime.failedTransactions}):void s.send({client:a.runtime.navClient,address:a.runtime.remainingTransactions[0].decrypted.n,amount:a.runtime.remainingTransactions[0].decrypted.v,transaction:a.runtime.remainingTransactions[0]},a.sentNav)},a.transactionFailed=function(){a.runtime.failedTransactions.push(a.runtime.remainingTransactions[0]),a.runtime.remainingTransactions.splice(0,1),a.processPending()},a.mockSend=function(){i.writeLog("PROO_003A","mock nav sent",{transaction:a.runtime.remainingTransactions[0]}),a.runtime.successfulTransactions.push({transaction:a.runtime.remainingTransactions[0].transaction}),a.runtime.remainingTransactions.splice(0,1),a.processPending()},a.sentNav=function(e,t){e&&t&&t.sendOutcome?a.runtime.successfulTransactions.push(a.runtime.remainingTransactions[0]):(i.writeLog("PROO_004","failed nav send to address",t,!0),a.runtime.failedTransactions.push(a.runtime.remainingTransactions[0])),a.runtime.remainingTransactions.splice(0,1),a.processPending()},e.exports=a},function(e,t,n){"use strict";var r=n(10),i=n(13),s=n(31),a=n(15),o={};o.run=function(e,t){var n=["settings","navClient"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("PAY_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to PayoutFee.run"})):(o.runtime={callback:t,settings:e.settings,navClient:e.navClient},void o.send())},o.send=function(){o.runtime.navClient.listUnspent(200).then(function(e){var t=0,n=1e8,r=!0,u=!1,c=void 0;try{for(var d,l=e[Symbol.iterator]();!(r=(d=l.next()).done);r=!0){var g=d.value;t+=Math.round(g.amount*n)}}catch(e){u=!0,c=e}finally{try{!r&&l.return&&l.return()}finally{if(u)throw c}}var p=t/n;if(p65535)&&(C.errors.push("PORT_OUT_OF_RANGE for "+n+", must be between 1 and 65535 "),!0)}function u(e,t,n){var r=parseInt(e,10);return t.min&&rt.max)||(C.errors.push("INT_TOO_LARGE for "+n+", must be smaller than "+t.max),!1)}function c(e,t,n){var r=parseFloat(e);if(t.min&&rt.max)return C.errors.push("FLOAT_TOO_LARGE for "+n+", must be smaller than "+t.max),!1;if(t.decimals&&2===t.decimals){var i=e.toString().search(A)>=0;if(!i)return C.errors.push("FLOAT_INCORRECT_FORMAT for "+n+", must have a maximum of 2 decimal places "),!1}return!0}function d(e,t,n){return!!f.isEmail(e)||(C.errors.push("INVALID_DOMAIN for "+n+", must be a valid fully qualified domain name"),!1)}function l(e,t,n){return 34===e.length||"N"===e.charAt(0)||(C.errors.push("INVALID_NAV_ADDRESSS for "+n+", must be 34 characters and starting with N"),!1)}function g(e,t,n){return!t.length||e.length===t.length||(C.errors.push("INCORRECT_LENGTH for "+n+", must be "+t.length+" characters"+e.length+" provided"),!1)}function p(e,t,n){return e===t.value||(C.errors.push("INCORRECT_VALUE for "+n+", must equal "+t.value),!1)}var m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},v=n(7),f=n(39),h=n(13),y=v.get("GLOBAL"),b=n(40),T=n(41),A=/^(\d+)?([.]?\d{0,2})?$/,C={errors:[]};C.validateSettings=function(e,t){if(C.errors=[],"INCOMING"===y.serverType)r(e.settings,e.ignore,b);else{if("OUTGOING"!==y.serverType)return h.writeLog("VAL_001","invalid server type",{options:e}),void t(!1);r(e.settings,e.ignore,T)}C.errors.length<1?t(!0):(h.writeLog("VAL_002","invalid settings",{errors:C.errors}),t(!1))},e.exports=C},function(e,t){e.exports=require("validator")},function(e,t){e.exports={local:{ipAddress:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"PORT"}},remote:{host:{required:!1,type:"DOMAIN"},ipAddress:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"PORT"}},scriptInterval:{required:!0,type:"INT",min:3e4},minAmount:{required:!0,type:"INT",min:1},maxAmount:{required:!0,type:"INT",min:10},anonFeePercent:{required:!0,type:"FLOAT",min:0,max:99,decimals:2},notificationEmail:{required:!0,type:"EMAIL"},smtp:{user:{required:!0,type:"EMAIL"},pass:{required:!0,type:"STRING"},server:{required:!0,type:"DOMAIN"}},navCoin:{user:{required:!0,type:"STRING"},pass:{required:!0,type:"STRING"},ip:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"VALUE",value:"44444"},walletPassphrase:{required:{conditional:"GLOBAL.encryptedWallet"},type:"STRING"}},subChain:{user:{required:!0,type:"STRING"},pass:{required:!0,type:"STRING"},ip:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"VALUE",value:"33333"},walletPassphrase:{required:{conditional:"GLOBAL.encryptedWallet"},type:"STRING"}},secretOptions:{salt:{required:!0,type:"STRING",length:32},saltRounds:{required:!0,type:"INT",min:1,max:20}},secret:{required:!0,type:"STRING",length:32}}},function(e,t){e.exports={local:{ipAddress:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"PORT"}},remote:{host:{required:!1,type:"DOMAIN"},ipAddress:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"PORT"}},scriptInterval:{required:!0,type:"INT",min:12e4},minAmount:{required:!0,type:"INT",min:1},maxAmount:{required:!0,type:"INT",min:10},navPoolAmount:{required:!0,type:"INT",min:5e4},txFeePayoutMin:{required:!0,type:"INT",min:1},anonTxFeeAddress:{required:!0,type:"NAV_ADDRESS"},notificationEmail:{required:!0,type:"EMAIL"},smtp:{user:{required:!0,type:"EMAIL"},pass:{required:!0,type:"STRING"},server:{required:!0,type:"DOMAIN"}},navCoin:{user:{required:!0,type:"STRING"},pass:{required:!0,type:"STRING"},ip:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"VALUE",value:"44444"},walletPassphrase:{required:{conditional:"GLOBAL.encryptedWallet"},type:"STRING"}},subChain:{user:{required:!0,type:"STRING"},pass:{required:!0,type:"STRING"},ip:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"VALUE",value:"33333"},walletPassphrase:{required:{conditional:"GLOBAL.encryptedWallet"},type:"STRING"}},secret:{required:!0,type:"STRING",length:32}}}]); \ No newline at end of file diff --git a/dist/softnode.js b/dist/softnode.js new file mode 100755 index 0000000..2e22fbb --- /dev/null +++ b/dist/softnode.js @@ -0,0 +1,3 @@ +!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function r(e){e?i():T.writeLog("APP_002","invalid server settings",k)}function i(){w.softClient=new s({username:k.softCoin.user,password:k.softCoin.pass,port:k.softCoin.port,host:k.softCoin.host}),w.subClient=new s({username:k.subChain.user,password:k.subChain.pass,port:k.subChain.port,host:k.subChain.host}),k.ssl?d.exists(k.ssl.key,function(e){d.exists(k.ssl.crt,function(t){if(!e||!t)return void T.writeLog("APP_003","unable to find user defined ssl certificate",k.ssl);var n={key:d.readFileSync(k.ssl.key),cert:d.readFileSync(k.ssl.crt),requestCert:!1,rejectUnauthorized:!1};P.use(c.json()),P.use(c.urlencoded({extended:!0})),o.createServer(n,P).listen(k.local.port,function(){S()})})}):u.createCertificate({days:1,selfSigned:!0},function(e,t){var n={key:t.serviceKey,cert:t.certificate,requestCert:!1,rejectUnauthorized:!1};P.use(c.json()),P.use(c.urlencoded({extended:!0})),o.createServer(n,P).listen(k.local.port,function(){S()})})}var s=n(1),a=n(2),o=n(3),u=n(4),c=n(5),d=n(6),l=n(7),g=n(8),p=n(9),m=n(33),v=n(38),f=n(17),h=n(19),y=n(21),b=n(11),T=n(13),A=n(15),C=l.get("GLOBAL"),k=!1;"INCOMING"===C.serverType&&(k=l.get("INCOMING")),"OUTGOING"===C.serverType&&(k=l.get("OUTGOING")),T.writeLog("SYS_001","Server Starting",{memes:["harambe","rustled jimmies"]},!0);var P=a(),w={};k?v.validateSettings({settings:k},r):T.writeLog("APP_001","invalid global server type",C.serverType);var S=function(){"INCOMING"===C.serverType?(p.init(),L()):"OUTGOING"===C.serverType&&(m.init(),L())},L=function(){P.get("/",function(e,t){g("dist/softnode.js",function(e,n){return e?void t.send(JSON.stringify({status:200,type:"FAILURE",message:"error generating md5 hash",serverType:C.serverType,error:e})):void t.send(JSON.stringify({status:200,type:"SUCCESS",message:"server is running!",serverType:C.serverType,anonhash:n}))})}),P.post("/api/test-decryption",function(e,t){return w.runtime={},w.runtime.req=e,w.runtime.res=t,e.body&&e.body.encrypted_data?void h.decryptData({encryptedData:w.runtime.req.body.encrypted_data},w.checkDecrypted):(T.writeLog("APP_004","failed to receive params",{body:e.body}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_004",message:"failed to receive params"})))}),w.checkDecrypted=function(e,t){return e&&t&&t.decrypted?void w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",message:"decryption test successful"})):(T.writeLog("APP_005","unable to derypt the data",{success:e,data:t,body:w.runtime.req.body}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_005",message:"ERROR: unable to decrypt the data"})))},P.post("/api/get-addresses",function(e,t){return w.runtime={},w.runtime.req=e,w.runtime.res=t,w.runtime.req.body&&w.runtime.req.body.num_addresses&&w.runtime.req.body.type&&w.runtime.req.body.account?(w.runtime.accountToUse=A.account[w.runtime.req.body.account],w.runtime.accountToUse||w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_006A",message:"ERROR: invalid account",body:w.runtime.req.body})),"OUTGOING"===C.serverType?void w.checkIpAddress({allowedIps:k.remote},w.getAddresses):void w.getAddresses()):(T.writeLog("APP_006","failed to receive params",{body:e.body}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_006",message:"ERROR: invalid params",body:w.runtime.req.body})))}),w.getAddresses=function(){w.runtime.numAddresses=parseInt(w.runtime.req.body.num_addresses,10),"SUBCHAIN"===w.runtime.req.body.type?w.runtime.clientToUse=w.subClient:w.runtime.clientToUse=w.softClient,y.getRandomAccountAddresses({client:w.runtime.clientToUse,accountName:w.runtime.accountToUse,numAddresses:w.runtime.numAddresses},w.returnAddresses)},w.returnAddresses=function(e,t){return e&&t&&t.pickedAddresses?void w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:{addresses:t.pickedAddresses}})):(T.writeLog("APP_008","failed to pick random addresses",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_008",message:"failed to pick random addresses"})))},P.get("/api/get-soft-balance",function(e,t){w.runtime={},w.runtime.req=e,w.runtime.res=t,w.softClient.getBalance().then(function(e){w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:{soft_balance:e}}))}).catch(function(e){T.writeLog("APP_009","failed to get the SOFT balance",{error:e}),w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_009",message:"failed to get the SOFT balance"}))})}),w.checkIpAddress=function(e,t){for(var n=w.runtime.req.connection.remoteAddress||w.runtime.req.socket.remoteAddress,r=!1,i=0;i0){var r=!0,i=!1,s=void 0;try{for(var a,o=t.currentPending[Symbol.iterator]();!(r=(a=o.next()).done);r=!0){var u=a.value;u.confirmations>n&&(n=u.confirmations)}}catch(e){i=!0,s=e}finally{try{!r&&o.return&&o.return()}finally{if(i)throw s}}if(n>A.maxQueue)return T.writeLog("APP_030B","the queue is too long",{highestConf:n},!0),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_030B",message:"the queue is too long"}))}b.getEncryptionKeys({},w.testKeyPair)},w.testKeyPair=function(e,t){return e&&t&&t.privKeyFile&&t.pubKeyFile?void b.testKeyPair({pubKeyFile:t.pubKeyFile,privKeyFile:t.privKeyFile},w.testedKeypair):(T.writeLog("APP_031","failed to get the current keys",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_031",message:"failed to get the current keys"})))},w.testedKeypair=function(e,t){return e&&t&&t.publicKey?(w.runtime.publicKey=t.publicKey,void y.getRandomAccountAddresses({client:w.softClient,accountName:A.account[C.serverType],numAddresses:w.runtime.numAddresses},w.hasRandomAddresses)):(T.writeLog("APP_032","failed to encrypt with selected keypair",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_032",message:"failed to encrypt with selected keypair"})))},w.hasRandomAddresses=function(e,t){return e&&t&&t.pickedAddresses?(w.runtime.softAddresses=t.pickedAddresses,void w.getHash()):(T.writeLog("APP_033","failed to retrieve soft addresses",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_033",message:"failed to retrieve soft addresses"})))},w.hasRandomSubAddresses=function(e,t){return e&&t&&t.pickedAddresses?(w.runtime.subAddresses=t.pickedAddresses,void w.getHash()):(T.writeLog("APP_034","failed to retrieve subchain addresses",{success:e,data:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAIL",code:"APP_034",message:"failed to retrieve subchain addresses"})))},w.getHash=function(){g("dist/softnode.js",function(e,t){return e?(T.writeLog("APP_035A","error generating md5 hash",{err:e,hash:t}),void w.runtime.res.send(JSON.stringify({status:200,type:"FAILURE",message:"error generating md5 hash",serverType:C.serverType,error:e}))):void w.returnCheckedNode(t)})},w.returnCheckedNode=function(e){var t=k.local.host?k.local.host:k.local.ipAddress,n={soft_balance:w.runtime.softBalance,sub_balance:w.runtime.subBalance,public_key:w.runtime.publicKey,server_type:C.serverType,min_amount:k.minAmount,max_amount:k.maxAmount,transaction_fee:k.anonFeePercent,server:t,server_port:k.local.port?k.local.port:443,md5:e};n.soft_addresses=w.runtime.softAddresses,w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:n}))},P.get("/api/status",function(e,t){if(w.runtime={},w.runtime.req=e,w.runtime.res=t,"INCOMING"===C.serverType){var n=new Date,r=n-p.runtime.cycleStart,i=k.scriptInterval-r;w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:{processing:p.processing,paused:p.paused,nextCycleStart:Math.round(i/1e3)+" seconds"}}))}else if("OUTGOING"===C.serverType){var s=new Date,a=s-m.runtime.cycleStart,o=k.scriptInterval-a;w.runtime.res.send(JSON.stringify({status:200,type:"SUCCESS",data:{processing:m.processing,paused:m.paused,nextCycleStart:Math.round(o/1e3)+" seconds"}}))}})}},function(e,t){e.exports=require("bitcoin-core")},function(e,t){e.exports=require("express")},function(e,t){e.exports=require("https")},function(e,t){e.exports=require("pem")},function(e,t){e.exports=require("body-parser")},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("config")},function(e,t){e.exports=require("md5-file")},function(e,t,n){"use strict";var r=n(1),i=n(7),s=n(10),a=n(11),o=n(13),u=n(16),c=n(18),d=n(22),l=n(24),g=n(26),p=n(29),m=n(30),v=n(32),f=i.get("INCOMING"),h={processing:!1,paused:!1,runtime:{}};h.init=function(){h.softClient=new r({username:f.softCoin.user,password:f.softCoin.pass,port:f.softCoin.port,host:f.softCoin.host}),h.subClient=new r({username:f.subChain.user,password:f.subChain.pass,port:f.subChain.port,host:f.subChain.host}),o.writeLog("INC_000","server starting"),a.findKeysToRemove({type:"private"},h.startProcessing),h.cron=setInterval(function(){h.paused===!1?a.findKeysToRemove({type:"private"},h.startProcessing):(clearInterval(h.cron),o.writeLog("INC_001","processing paused",{paused:h.paused}))},f.scriptInterval)},h.startProcessing=function(){return h.processing?void o.writeLog("INC_002","server still processing",{processing:h.processing}):(h.processing=!0,h.runtime={},h.runtime.cycleStart=new Date,void u.run({softClient:h.softClient,subClient:h.subClient,settings:f},h.preFlightComplete))},h.preFlightComplete=function(e,t){return e?(h.runtime.softBalance=t.softBalance,h.runtime.subBalance=t.subBalance,void c.run({softClient:h.softClient},h.holdingProcessed)):(o.writeLog("INC_003","preflight checks failed",{success:e,data:t},!0),void(h.processing=!1))},h.holdingProcessed=function(e,t){return e?void d.run({settings:f,softClient:h.softClient},h.outgoingSelected):(o.writeLog("INC_004","failed to process the holding account",{success:e,data:t},!0),h.processing=!1,void(h.paused=!0))},h.outgoingSelected=function(e,t){return e?t.returnAllToSenders?(t.pause&&(h.paused=!0),void l.run({softClient:h.softClient},h.allPendingReturned)):(h.runtime.chosenOutgoing=t.chosenOutgoing,h.runtime.outgoingSoftBalance=t.outgoingSoftBalance,h.runtime.holdingEncrypted=t.holdingEncrypted,h.runtime.outgoingPubKey=t.outgoingPubKey,void g.run({softClient:h.softClient,outgoingSoftBalance:t.outgoingSoftBalance,subBalance:h.runtime.subBalance,settings:f},h.currentBatchPrepared)):(o.writeLog("INC_005","failed to find outgoing server",{success:e,data:t},!0),void(h.processing=!1))},h.allPendingReturned=function(e,t){return e?(o.writeLog("INC_007","returned all pending to sender",{success:e,data:t},!0),void(h.processing=!1)):(o.writeLog("INC_006","failed to return all pending to sender",{success:e,data:t},!0),h.processing=!1,void(h.paused=!0))},h.currentBatchPrepared=function(e,t){return e&&t&&(t.currentBatch&&t.currentFlattened&&t.numFlattened||t.pendingToReturn)?(h.runtime.currentBatch=t.currentBatch,h.runtime.currentFlattened=t.currentFlattened,h.runtime.numFlattened=t.numFlattened,h.runtime.pendingToReturn=t.pendingToReturn,h.runtime.pendingToReturn&&h.runtime.pendingToReturn.length>0?(o.writeLog("INC_011","failed to process some transactions",{success:e,data:t},!0),void l.fromList({softClient:h.softClient,transactionsToReturn:h.runtime.pendingToReturn},h.pendingFailedReturned)):h.runtime.currentBatch&&0!==s.size(h.runtime.currentBatch)?void p.run({subClient:h.subClient,chosenOutgoing:h.runtime.chosenOutgoing,numAddresses:h.runtime.numFlattened},h.retrievedSubchainAddresses):(o.writeLog("INC_011B","no currentBatch to process",{currentBatch:h.runtime.currentBatch}),void(h.processing=!1))):(o.writeLog("INC_011D","prepareIncoming returned bad data",{success:e,data:t}),void(h.processing=!1))},h.pendingFailedReturned=function(e,t){return e||(o.writeLog("INC_011A","failed to return failed pending to sender",{success:e,data:t},!0),h.paused=!0,l.run({softClient:h.softClient},h.allPendingReturned)),h.runtime.currentBatch&&0!==s.size(h.runtime.currentBatch)?void p.run({subClient:h.subClient,chosenOutgoing:h.runtime.chosenOutgoing,numAddresses:h.runtime.numFlattened},h.retrievedSubchainAddresses):(o.writeLog("INC_011C","no currentBatch to process",{currentBatch:h.runtime.currentBatch}),void(h.processing=!1))},h.retrievedSubchainAddresses=function(e,t){return e&&t&&t.subAddresses?void m.run({currentBatch:h.runtime.currentBatch,currentFlattened:h.runtime.currentFlattened,outgoingPubKey:h.runtime.outgoingPubKey,subClient:h.subClient,softClient:h.softClient,subAddresses:t.subAddresses,settings:f},h.transactionsProcessed):(o.writeLog("INC_009","failed to retrieve subchain addresses",{success:e,data:t},!0),void l.run({softClient:h.softClient},h.allPendingReturned))},h.transactionsProcessed=function(e,t){if(!e||!t)return t&&t.partialFailure?(o.writeLog("INC_010A","failed part way through processing subchain transactions",{success:e,data:t},!0),h.paused=!0,void(h.processing=!1)):(o.writeLog("INC_010","failed to process transactions",{success:e,data:t},!0),h.paused=!0,void l.run({softClient:h.softClient},h.allPendingReturned));if(h.runtime.successfulTxGroups=t.successfulTxGroups,h.runtime.txGroupsToReturn=t.txGroupsToReturn,h.runtime.transactionsToReturn=[],h.runtime.txGroupsToReturn&&h.runtime.txGroupsToReturn.length>0){o.writeLog("INC_011","failed to process some transactions",{success:e,data:t},!0);for(var n=0;nu.keyPeriod&&a.push(r[c])}a.length>0?d.removeKeys({forRemoval:a,type:e.type},t):"private"===e.type?d.findKeysToRemove({type:"public"},t):t(!0,{message:"nothing to remove"})})},d.removeKeys=function(e,t){0===e.forRemoval.length?"private"===e.type?d.findKeysToRemove({type:"public"},t):t(!0,{message:"all keys removed"}):r.exists(u.keyFolders[e.type].path+e.forRemoval[0],function(n){n?r.unlink(u.keyFolders[e.type].path+e.forRemoval[0],function(n){n&&o.writeLog("ENC_010","failed to remove the key",{error:n,key:e.forRemoval}),d.removeKeys({forRemoval:e.forRemoval.slice(1),type:e.type},t)}):d.removeKeys({forRemoval:e.forRemoval.slice(1),type:e.type},t)})},d.getMidnight=function(e){return parseInt(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()),10)},e.exports=d},function(e,t){e.exports=require("ursa")},function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=n(14),s=n(7),a=s.get("GLOBAL"),o=!1;"INCOMING"===a.serverType&&(o=s.get("INCOMING")),"OUTGOING"===a.serverType&&(o=s.get("OUTGOING"));var u=n(15),c=u.version.major+"."+u.version.minor+"."+u.version.patch,d=encodeURIComponent(o.smtp.user)+":"+encodeURIComponent(o.smtp.pass),l={};l.transporter=i.createTransport("smtps://"+d+"@"+o.smtp.server);var g=new Date,p="\r\n";p+="Version: "+c+"\r\n",p+="Date: "+g+"\r\n",p+="\r\n-----------------------------------------------------------\r\n",console.log(p),l.writeLog=function(e,t,n,i){i&&l.sendMail(e,t,n);var s=new Date,a="\r\n";a+="Date: "+s+"\r\n",a+="Error Code: "+e+"\r\n",a+="Error Message: "+t+"\r\n";for(var o in n)if(n.hasOwnProperty(o)){var u=n[o];"object"===r(n[o])&&(u=JSON.stringify(n[o])),a+=o+": "+u+"\r\n"}a+="\r\n-----------------------------------------------------------\r\n",console.log(a)},l.sendMail=function(e,t,n){var r={from:'"Softnode System" <'+o.smtp.user+">",to:o.notificationEmail,subject:"Softnode System Message - "+o.local.ipAddress+" ("+a.serverType+") "+e,text:e+" - "+t,attachments:[{filename:"data.json",content:JSON.stringify(n)}]};l.transporter.sendMail(r,function(e,t){return e?console.log("nodemail error",e):console.log("nodemail success: "+t.response)})},e.exports=l},function(e,t){e.exports=require("nodemailer")},function(e,t){e.exports={version:{major:1,minor:2,patch:0},keyFolders:{private:{path:"./keys/private/",suffix:"_private.pem"},public:{path:"./keys/public/",suffix:"_public.pub"}},keyPeriod:6048e5,minKeyStamp:14647392e5,account:{INCOMING:"incomingAccount",OUTGOING:"outgoingAccount",HOLDING:"holdingAccount"},maxAddresses:1e3,maxHolding:200,minSoftTransactions:3,maxSoftTransactions:8,txFee:1e-4,maxEncryptionAttempts:10,encryptionStrength:{INCOMING:2048,OUTGOING:1024},encryptionOutput:{INCOMING:344,OUTGOING:172},subCoinsPerTx:1,subChainTxFee:1e-4,minConfs:1,maxConfs:60,maxQueue:120,blockThreshold:{checking:5,processing:3}}},function(e,t,n){"use strict";var r=n(10),i=n(15),s=n(13),a=n(17),o={};o.run=function(e,t){var n=["softClient","subClient","settings"];return r.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("PRE_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to Preflight.checkSoftBlocks"})):(o.runtime={callback:t,softClient:e.softClient,subClient:e.subClient,settings:e.settings},void a.checkBlockHeight({client:o.runtime.softClient,blockThreshold:i.blockThreshold.processing},o.softBlocksChecked))},o.softBlocksChecked=function(e,t){return e&&t?(o.runtime.softBalance=t.balance,void o.runtime.softClient.setTxFee(parseFloat(i.txFee)).then(function(){a.checkBlockHeight({client:o.runtime.subClient,blockThreshold:i.blockThreshold.processing},o.subBlocksChecked)}).catch(function(e){s.writeLog("PRE_003","failed to set SOFT tx fee",{err:e}),o.runtime.callback(!1,{message:"failed to set SOFT tx fee"})})):(s.writeLog("PRE_002","softClient block check failed",{status:e,data:t}),void o.runtime.callback(!1,{message:"softClient block check failed"}))},o.subBlocksChecked=function(e,t){return e&&t?(o.runtime.subBalance=t.balance,void a.unlockWallet({settings:o.runtime.settings,client:o.runtime.softClient,type:"softCoin"},o.softClientUnlocked)):(s.writeLog("PRE_004","subClient block check failed",{status:e,data:t}),void o.runtime.callback(!1,{message:"subClient block check failed"}))},o.softClientUnlocked=function(e,t){return e?void a.unlockWallet({settings:o.runtime.settings,client:o.runtime.subClient,type:"subChain"},o.subClientUnlocked):(s.writeLog("PRE_005","softClient failed to unlock",{status:e,data:t}),void o.runtime.callback(!1,{message:"softClient failed to unlock"}))},o.subClientUnlocked=function(e,t){return e?void o.runtime.subClient.setTxFee(parseFloat(i.subChainTxFee)).then(function(){o.runtime.callback(!0,{softBalance:o.runtime.softBalance,subBalance:o.runtime.subBalance})}).catch(function(e){s.writeLog("PRE_003","failed to set SUB tx fee",{err:e}),o.runtime.callback(!1,{message:"failed to set SUB tx fee"})}):(s.writeLog("PRE_006","subClient failed to unlock",{status:e,data:t}),void o.runtime.callback(!1,{message:"subClient failed to unlock"}))},e.exports=o},function(e,t,n){"use strict";var r=n(7),i=n(10),s=n(13),a=r.get("GLOBAL"),o={};o.unlockWallet=function(e,t){var n=["settings","client","type"];if(i.intersection(Object.keys(e),n).length!==n.length)return s.writeLog("SOFT_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SoftCoin.unlockWallet"});if(a.encryptedWallet===!1)return void t(!0);var r=e.settings.scriptInterval/1e3;e.client.walletPassphrase(e.settings[e.type].walletPassphrase,r).then(function(){t(!0)}).catch(function(n){switch(n.code){case-17:t(!0);break;default:return t(!1,{message:"failed to unlock"}),void s.writeLog("SOFT_002","failed to unlock "+e.type+" wallet",{error:n})}})},o.lockWallet=function(e,t){var n=["type","client"];return i.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("SOFT_003","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SoftCoin.lockWallet"})):void e.client.walletLock().then(function(){s.writeLog("SOFT_004","locked the "+e.type+" wallet",e),o.unlockWallet(e,t)}).catch(function(n){t(!1,{message:"failed to lock"}),s.writeLog("SOFT_005","failed to lock "+e.type+" wallet",{error:n})})},o.filterUnspent=function(e,t){var n=["unspent","client","accountName"];if(i.intersection(Object.keys(e),n).length!==n.length)return s.writeLog("SOFT_006","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SoftCoin.filterUnspent"});try{e.client.getAddressesByAccount(e.accountName).then(function(n){var r=!1,i=[],s=!0,a=!1,o=void 0;try{for(var u,c=e.unspent[Symbol.iterator]();!(s=(u=c.next()).done);s=!0){var d=u.value;n.indexOf(d.address)!==-1&&(r=!0,i.push(d))}}catch(e){a=!0,o=e}finally{try{!s&&c.return&&c.return()}finally{if(a)throw o}}return r?void t(!0,{currentPending:i}):void t(!0)}).catch(function(n){s.writeLog("SOFT_007","failed to get address by account",{error:n,options:e}),t(!1)})}catch(t){s.writeLog("SOFT_008","failed to filter",{error:t,options:e})}},o.checkBlockHeight=function(e,t){var n=["client","blockThreshold"];return i.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("SOFT_009","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SoftCoin.checkBlockHeight"})):void e.client.getInfo().then(function(n){e.client.getBlockCount().then(function(r){return parseInt(r,10)-e.blockThreshold>parseInt(n.blocks,10)?(s.writeLog("SOFT_010","client is not synced with the latest blocks",{walletInfo:n,blockCount:r}),void t(!1,{message:"client is not synced with the latest blocks"})):void t(!0,{balance:n.balance})}).catch(function(n){s.writeLog("SOFT_011","failed to get block count",{error:n,options:e}),t(!1,{message:"failed to get block count"})})}).catch(function(n){s.writeLog("SOFT_012","failed to get info",{error:n,options:e}),t(!1,{message:"failed to get info"})})},o.validateAddresses=function(e,t){var n=["client","addresses"];return i.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("SOFT_013","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SoftCoin.validateAddresses"})):0===e.addresses.length?void t(!0):void e.client.validateAddress(e.addresses[0]).then(function(n){return n.isvalid!==!0?(s.writeLog("SOFT_014","provided address is invalid",{address:e.addresses[0]}),void t(!1,{message:"provided address is invalid"})):void o.validateAddresses({addresses:e.addresses.slice(1),client:e.client},t)}).catch(function(n){s.writeLog("SOFT_015","failed to validate address",{error:n,options:e}),t(!1,{message:"failed to validate address"})})},e.exports=o},function(e,t,n){"use strict";var r=n(10),i=n(15),s=n(13),a=n(17),o=n(19),u=n(20),c=n(21),d={};d.run=function(e,t){var n=["softClient"];return r.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("RFL_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RefillOutgoing.checkHoldingAccount"})):(d.runtime={callback:t,softClient:e.softClient},void d.getUnspent())},d.getUnspent=function(){d.runtime.softClient.listUnspent().then(function(e){return e.length<1?(s.writeLog("RFL_002","no unspent in holding account",{unspent:e}),void d.runtime.callback(!0,{message:"no unspent in holding account"})):void a.filterUnspent({unspent:e,client:d.runtime.softClient,accountName:i.account.HOLDING},d.holdingFiltered)}).catch(function(e){s.writeLog("RFL_003","failed to list unspent",{error:e}),d.runtime.callback(!1,{message:"failed to list unspent"})})},d.holdingFiltered=function(e,t){return!e||!t||!t.currentPending||t.currentPending.length<1?void d.runtime.callback(!0,{message:"no pending to clear from account"}):(d.runtime.currentHolding=t.currentPending,void d.processHolding())},d.processHolding=function(){return d.runtime.currentHolding.length<1?(s.writeLog("RFL_005","all holding processed",{currentHolding:d.runtime.currentHolding}),void d.runtime.callback(!0,{message:"all holding processed"})):void d.checkIfHoldingIsSpendable()},d.checkIfHoldingIsSpendable=function(){return d.runtime.currentHolding[0].confirmations>i.minConfs?void o.getEncrypted({transaction:d.runtime.currentHolding[0],client:d.runtime.softClient},d.holdingDecrypted):(s.writeLog("RFL_006","holding account transaction not spendable",{currentHolding:d.runtime.currentHolding}),d.runtime.currentHolding.splice(0,1),void d.processHolding())},d.holdingDecrypted=function(e,t){if(!(e&&t&&t.decrypted&&t.transaction))return s.writeLog("RFL_007","failed to decrypt holding transaction data",{success:e,data:t}),d.runtime.currentHolding.splice(0,1),void d.processHolding();if(d.runtime.holdingTransaction=t.transaction,t.decrypted.constructor!==Array)return s.writeLog("RFL_007A","decrypted data not an array",{currentHolding:d.runtime.currentHolding}),d.runtime.currentHolding.splice(0,1),void d.processHolding();var n=t.decrypted.slice(0);if(n.constructor!==Array)return s.writeLog("RFL_007A","decrypted data not an array of addresses",{currentHolding:d.runtime.currentHolding}),d.runtime.currentHolding.splice(0,1),void d.processHolding();for(var r=Math.ceil(Math.random()*(n.length-(i.minSoftTransactions-1)))+(i.minSoftTransactions-1),a=[];a.length=10?void c.runtime.callback(!1,{error:e}):(s.writeLog("RAW_007","retrying",{error:e,counter:c.runtime.counter}),void setTimeout(function(){c.runtime.counter+=1,c.create()},c.runtime.retryDelay))},e.exports=c},function(e,t,n){"use strict";var r=n(10),i=n(13),s=n(15),a={};a.incoming=function(e,t){var n=["totalToSend","addresses"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("RND_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RandomizeTransactions.incoming"})):(a.runtime={callback:t,totalToSend:e.totalToSend,addresses:e.addresses,transactions:{}},void a.randomizeIncoming())},a.randomizeIncoming=function(){for(var e=1e8,t=a.runtime.totalToSend*e,n=s.txFee*e,r=n*a.runtime.addresses.length,i=t-r,o=0,u=i/a.runtime.addresses.length,c=Math.floor(1.5*u*e),d=Math.floor(.5*u*e),l=0;li-o||l===a.runtime.addresses.length-1){var m=Math.round(i-o);a.runtime.transactions[a.runtime.addresses[l]]=m/e,o+=m}else a.runtime.transactions[a.runtime.addresses[l]]=p/e,o+=p}a.runtime.callback(!0,{transactions:a.runtime.transactions})},a.outgoing=function(e,t){var n=["transaction","address","amount"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("RND_002","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RandomizeTransactions.outgoing"})):(a.runtime={callback:t,transaction:e.transaction,address:e.address,amount:e.amount,transactions:[]},void a.randomizeOutgoing())},a.randomizeOutgoing=function(){for(var e=Math.ceil(Math.random()*(s.maxSoftTransactions-s.minSoftTransactions))+s.minSoftTransactions,t=a.runtime.amount,n=1e8,r=t*n,i=0,o=r/e,u=Math.floor(1.5*o*n),c=Math.floor(.5*o*n),d=0;dr-i||d===e-1){var p=Math.round(r-i);a.runtime.transactions.push(p/n),i+=p}else a.runtime.transactions.push(g/n),i+=g}a.runtime.callback(!0,{partialTransactions:a.runtime.transactions})},a.getRandomAccountAddresses=function(e,t){var n=["client","accountName","numAddresses"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("RND_003","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RandomizeTransactions.getRandomAccountAddresses"})):void e.client.getAddressesByAccount(e.accountName).then(function(n){a.chooseRandomAddresses({accountName:e.accountName,numAddresses:e.numAddresses,addresses:n},t)}).catch(function(n){i.writeLog("RND_004","get account address failed",{options:e,error:n}),t(!1,{message:"get account address failed"})})},a.chooseRandomAddresses=function(e,t){var n=["addresses","accountName","numAddresses"];if(r.intersection(Object.keys(e),n).length!==n.length)return i.writeLog("RND_005","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RandomizeTransactions.chooseRandomAddresses"});for(var s=[],a=0;s.length=a.maxAddresses?void l.runtime.callback(!0,{currentBatch:l.runtime.currentBatch,currentFlattened:l.runtime.currentFlattened,numFlattened:l.runtime.numFlattened,pendingToReturn:l.runtime.transactionsToReturn}):(l.runtime.numFlattened+=t.flattened.length,l.runtime.currentFlattened[l.runtime.remainingToFlatten[0].unique]=t.flattened,l.runtime.remainingToFlatten.splice(0,1),0===l.runtime.remainingToFlatten.length?void l.runtime.callback(!0,{currentBatch:l.runtime.currentBatch,currentFlattened:l.runtime.currentFlattened,numFlattened:l.runtime.numFlattened,pendingToReturn:l.runtime.transactionsToReturn}):void c.incoming({amountToFlatten:l.runtime.remainingToFlatten[0].amount,anonFeePercent:l.runtime.settings.anonFeePercent},l.flattened)):(o.writeLog("PREPI_004","failed to flatten transactions",{success:e,data:t,runtime:l.runtime}),l.runtime.remainingToFlatten.splice(0,1),0===l.runtime.remainingToFlatten.length?void l.runtime.callback(!0,{currentBatch:l.runtime.currentBatch,currentFlattened:l.runtime.currentFlattened,numFlattened:l.runtime.numFlattened,pendingToReturn:l.runtime.transactionsToReturn}):void c.incoming({amountToFlatten:l.runtime.remainingToFlatten[0].amount,anonFeePercent:l.runtime.settings.anonFeePercent},l.flattened))},e.exports=l},function(e,t,n){"use strict";var r=n(10),i=n(13),s={};s.incoming=function(e,t){var n=["amountToFlatten","anonFeePercent"];if(r.intersection(Object.keys(e),n).length!==n.length)return i.writeLog("FLT_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to FlattenTransactions.incoming"});var a=e.amountToFlatten/(1+e.anonFeePercent/100);s.runtime={callback:t,amountToFlatten:s.satoshiParser(a)},s.flattenIncoming()},s.flattenIncoming=function(){for(var e=Math.floor(s.runtime.amountToFlatten),t=e.toString(),n=s.runtime.amountToFlatten-e,a=s.satoshiParser(n),o=[],u=0;u0&&r.sum(o)===e-c?o.push(s.satoshiParser(parseInt(c,10)+a)):o.push(parseInt(c,10));if(1===o.length){o=[];for(var g=0;g<10;g++)a>0&&9===g?o.push(s.satoshiParser(e/10+a)):o.push(e/10)}var p=o.reduce(function(e,t){return t+e},0),m=s.satoshiParser(p);return m!==s.runtime.amountToFlatten?(i.writeLog("FLT_002","unable to correctly flatten amount",{runtime:s.runtime,flattened:o}),void s.runtime.callback(!1,{flattened:o})):void s.runtime.callback(!0,{flattened:o})},s.satoshiParser=function(e){var t=1e8;return Math.round(e*t)/t},e.exports=s},function(e,t,n){"use strict";var r=n(10),i=n(13),s=n(19),a=n(15),o={};o.run=function(e,t){var n=["currentPending","client"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("GRP_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to GroupPartials.run"})):(o.runtime={client:e.client,currentPending:e.currentPending,remainingToDecrypt:e.currentPending,transactionsToReturn:[],readyToProcess:{},partials:{},callback:t},void o.getDecryptedData())},o.getDecryptedData=function(){return o.runtime.remainingToDecrypt.length<1?void o.checkPartials():void s.getEncrypted({transaction:o.runtime.remainingToDecrypt[0],client:o.runtime.client},o.checkDecrypted)},o.partialFailed=function(e){var t=r.findIndex(o.runtime.transactionsToReturn,function(t){return t.txid===e.txid});t===-1&&o.runtime.transactionsToReturn.push(e),o.runtime.remainingToDecrypt.splice(0,1),o.getDecryptedData()},o.checkDecrypted=function(e,t){return e&&t&&t.decrypted&&t.transaction?t.decrypted.n&&t.decrypted.t&&t.decrypted.p&&t.decrypted.o&&t.decrypted.u?void o.runtime.client.validateAddress(t.decrypted.n).then(function(n){return n.isvalid!==!0?(i.writeLog("GRP_003A","encrypted address invalid",{success:e,data:t}),void o.partialFailed(t.transaction)):void o.groupPartials(t.decrypted,t.transaction)}).catch(function(n){i.writeLog("GRP_003B","failed to decrypt transaction data",{success:e,error:n}),o.partialFailed(t.transaction)}):(i.writeLog("GRP_003","failed to receive correct encrypted params",{n:!!t.decrypted.n,t:t.decrypted.t,p:t.decrypted.p,o:t.decrypted.o,u:t.decrypted.u,data:t}),void o.partialFailed(t.transaction)):(i.writeLog("GRP_002","failed to decrypt transaction data",{success:e}),void o.partialFailed(o.runtime.remainingToDecrypt[0]))},o.groupPartials=function(e,t){if(o.runtime.partials[e.u]||(o.runtime.partials[e.u]={destination:e.n,unique:e.u,timeDelay:parseInt(e.t,10),parts:parseInt(e.o,10),partsSum:0,amount:0,transactions:{},readyToProcess:!1}),o.runtime.partials[e.u].readyToProcess===!0)return i.writeLog("GRP_006","this partial group is already flagged as completed",{partials:o.runtime.partials[e.u],transaction:t,n:!!e.n,t:e.t,p:e.p,o:e.o,u:e.u}),void o.partialFailed(t);if(o.runtime.partials[e.u].destination!==e.n)return i.writeLog("GRP_004","decrypted address different from other partials",{partials:o.runtime.partials[e.u],transaction:t}),void o.partialFailed(t);if(o.runtime.partials[e.u].transactions[t.txid])return i.writeLog("GRP_005","txid already processed",{partials:o.runtime.partials[e.u],transaction:t}),void o.partialFailed(t);var n=Math.round(1e8*o.runtime.partials[e.u].amount),s=Math.round(1e8*t.amount),a=(n+s)/1e8;o.runtime.partials[e.u].amount=a,o.runtime.partials[e.u].partsSum+=parseInt(e.p,10),o.runtime.partials[e.u].transactions[t.txid]={txid:t.txid,amount:t.amount,confirmations:t.confirmations,vout:t.vout,vin:t.vin,part:e.p};var u=o.runtime.partials[e.u].parts,c=r.size(o.runtime.partials[e.u].transactions);c===u&&u*(u+1)/2===o.runtime.partials[e.u].partsSum&&(o.runtime.partials[e.u].readyToProcess=!0,o.runtime.readyToProcess[e.u]=o.runtime.partials[e.u]),o.runtime.remainingToDecrypt.splice(0,1),o.getDecryptedData()},o.checkPartials=function(){r.forEach(o.runtime.partials,function(e){e.readyToProcess||r.forEach(e.transactions,function(e){var t=r.findIndex(o.runtime.transactionsToReturn,function(t){return t.txid===e.txid});t===-1&&e.confirmations>a.maxConfs&&o.runtime.transactionsToReturn.push(e)})}),o.runtime.callback(!0,{readyToProcess:o.runtime.readyToProcess,transactionsToReturn:o.runtime.transactionsToReturn})},e.exports=o},function(e,t,n){"use strict";var r=n(10),i=n(23),s=n(13),a=n(17),o={};o.run=function(e,t){var n=["subClient","chosenOutgoing","numAddresses"];return r.intersection(Object.keys(e),n).length!==n.length?(s.writeLog("RSC_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to RetrieveSubchainAddresses.run"})):(o.runtime={callback:t,subClient:e.subClient,chosenOutgoing:e.chosenOutgoing,numAddresses:e.numAddresses},void o.getSubAddresses())},o.getSubAddresses=function(){var e=o.runtime.chosenOutgoing,t=e.port?e.ipAddress+":"+e.port:e.ipAddress;o.runtime.outgoingAddress=t;var n={uri:"https://"+t+"/api/get-addresses",method:"POST",timeout:6e4,rejectUnauthorized:!1,requestCert:!0,agent:!1,form:{type:"SUBCHAIN",account:"OUTGOING",num_addresses:o.runtime.numAddresses}};i(n,o.requestResponse)},o.requestResponse=function(e,t,n){return e?(s.writeLog("RSC_004","failed to query outgoing server",{error:e,outgoingAddress:o.runtime.outgoingAddress}),void o.runtime.callback(!1,{message:"failed to query outgoing server"})):void o.checkOutgoingCanTransact(n,o.runtime.outgoingAddress)},o.checkOutgoingCanTransact=function(e,t){try{var n=JSON.parse(e);if("SUCCESS"!==n.type)return s.writeLog("RSC_005","outgoing server returned failure",{body:n,outgoingAddress:t}),void o.runtime.callback(!1,{message:"outgoing server returned failure"});if(!n.data||!n.data.addresses||n.data.addresses.constructor!==Array)return s.writeLog("RSC_006","outgoing server returned incorrect params",{body:n,outgoingAddress:t}),void o.runtime.callback(!1,{message:"outgoing server returned failure"});o.checkSubAddresses(n.data.addresses)}catch(n){return s.writeLog("RSC_005A","outgoing server returned non json response",{body:e,error:n,outgoingAddress:t}),void o.runtime.callback(!1,{message:"outgoing server returned non json response"})}},o.checkSubAddresses=function(e){return e.length<1?(s.writeLog("RSC_007","outgoing server must provide at least one sub address",{subAddresses:e}),void o.runtime.callback(!1,{message:"outgoing server must provide at least one sub address"})):e.lengthu.runtime.remainingFlattened.length?(s.writeLog("PROI_009","partial subchain transaction failure",{ +txGroup:e,runtime:u.runtime}),void u.runtime.callback(!1,{partialFailure:!0})):(s.writeLog("PROI_009A","complete group failure",{txGroup:e,runtime:u.runtime}),u.runtime.txGroupsToReturn.push(t),u.runtime.remainingTxGroups.splice(0,1),void u.processPending())},u.reEncryptAddress=function(e,t,n,r,o){try{var c={n:e,v:r,s:u.runtime.settings.secret,t:u.runtime.currentBlockHeight+Math.round(Math.random()*t)},d=u.runtime.outgoingPubKey.encrypt(JSON.stringify(c),"utf8","base64",i.RSA_PKCS1_PADDING);if(d.length!==a.encryptionOutput.OUTGOING&&o=a.maxEncryptionAttempts)return s.writeLog("PROI_006","max public key encryption failures",{txGroup:n,counter:o,encrypted:d}),void u.partialFailed(n);u.makeSubchainTx(d,n)}catch(e){return s.writeLog("PROI_007","encrypted address invalid",{txGroup:n,error:e}),void u.partialFailed(n)}},u.makeSubchainTx=function(e,t){o.send({client:u.runtime.subClient,address:u.runtime.subAddresses[0],amount:a.subCoinsPerTx,transaction:t,encrypted:e},u.sentSubToOutgoing)},u.sentSubToOutgoing=function(e,t){return e&&t&&t.sendOutcome?(u.runtime.subAddresses.splice(0,1),u.runtime.remainingFlattened.splice(0,1),void u.processPartial()):(s.writeLog("PROI_008","failed subClient send to address",{transaction:t.transaction,error:t.error}),void u.partialFailed())},e.exports=u},function(e,t,n){"use strict";var r=n(7),i=n(10),s=n(13),a=n(17),o=r.get("GLOBAL"),u=!1;"INCOMING"===o.serverType&&(u=r.get("INCOMING")),"OUTGOING"===o.serverType&&(u=r.get("OUTGOING"));var c={};c.send=function(e,t){var n=["client","address","amount","transaction"];if(i.intersection(Object.keys(e),n).length!==n.length)return s.writeLog("STA_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SelectOutgoing.run"});if(o.preventSend)return s.writeLog("STA_TEST_001","preventSend triggered",{options:e}),void t(!0,{sendOutcome:"dummy-tx-id",transaction:e.transaction});if(c.runtime={},e.counter&&e.counter>7)return s.writeLog("STA_002","max send attempts reached",{transaction:e.transaction,counter:e.counter}),void t(!1,{transaction:e.transaction,error:"max send attempts reached"});var r=1e8,d=Math.round(e.amount*r),l=d/r;e.client.sendToAddress(e.address,l,null,null,e.encrypted).then(function(n){if(n)return void t(!0,{sendOutcome:n,transaction:e.transaction})}).catch(function(n){if(n.code===-13&&!e.triedToUnlock){c.runtime.options=e,c.runtime.callback=t;var r=e.client.port===u.softCoin.port?"softCoin":"subChain";return void a.unlockWallet({settings:u,client:e.client,type:r},c.walletUnlocked)}s.writeLog("STA_003","failed send to address",{transaction:e.transaction,error:n}),setTimeout(function(){var n=e.counter?e.counter+1:1,r={client:e.client,address:e.address,amount:e.amount,transaction:e.transaction,encrypted:e.encrypted,counter:n,triedToUnlock:!1};c.send(r,t)},3e4)})},c.walletUnlocked=function(e,t){if(!e)return s.writeLog("STA_004","unable to unlock wallet",{success:e,data:t}),void c.runtime.callback(!1,{transaction:c.runtime.options.transaction,error:t});var n={client:c.runtime.options.client,address:c.runtime.options.address,amount:c.runtime.options.amount,transaction:c.runtime.options.transaction,encrypted:c.runtime.options.encrypted,counter:c.runtime.options.counter,triedToUnlock:!0};c.send(n,c.runtime.callback)},e.exports=c},function(e,t,n){"use strict";var r=n(10),i=n(13),s=n(21),a=n(15),o=n(20),u={};u.run=function(e,t){var n=["successfulSubTransactions","holdingEncrypted","softClient"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("STH_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to SpendToHolding.run"})):(u.runtime={callback:t,successfulSubTransactions:e.successfulSubTransactions,holdingEncrypted:e.holdingEncrypted,softClient:e.softClient},void s.getRandomAccountAddresses({client:u.runtime.softClient,accountName:a.account.HOLDING,numAddresses:1},u.createHoldingTransactions))},u.createHoldingTransactions=function(e,t){if(!e)return i.writeLog("STH_002","could not retrieve holding addresses",{success:e,data:t}),void u.runtime.callback(!1,{message:"could not retrieve holding addresses"});var n=1e8,r=0,s=!0,c=!1,d=void 0;try{for(var l,g=u.runtime.successfulSubTransactions[Symbol.iterator]();!(s=(l=g.next()).done);s=!0){var p=l.value;r+=Math.round(p.amount*n)-Math.round(a.txFee*n)}}catch(e){c=!0,d=e}finally{try{!s&&g.return&&g.return()}finally{if(c)throw d}}for(var m=r/n,v=[],f=0;f0&&i.writeLog("OUT_003A","failed to prepare some subtransactions",{success:e,data:t},!0),void(p.processing=!1))},p.transactionsProcessed=function(e,t){return e&&t?!t.successfulTransactions||t.successfulTransactions.length<1?(i.writeLog("OUT_005","all transactions failed",t,!0),p.processing=!1,void(p.paused=!0)):(t.failedTransactions&&t.failedTransactions.length>0&&i.writeLog("OUT_005A","failed to send send some transactions",{success:e,data:t},!0),p.runtime.successfulTransactions=t.successfulTransactions,void d.run({transactions:p.runtime.successfulTransactions,subClient:p.subClient,settings:g},p.subsoftReturned)):(i.writeLog("OUT_004","failed to process transactions",{success:e,data:t},!0),p.processing=!1,void(p.paused=!0))},p.subsoftReturned=function(e,t){return e?void(p.processing=!1):(i.writeLog("OUT_007","unable to return subsoft to incoming server",{transactions:p.runtime.successfulTransactions,data:t},!0),p.paused=!0,void(p.processing=!1))},e.exports=p},function(e,t,n){"use strict";var r=n(10),i=n(7),s=i.get("GLOBAL"),a=n(13),o=n(17),u=n(19),c=n(15),d={};d.run=function(e,t){var n=["softClient","subClient","softBalance","settings"];return r.intersection(Object.keys(e),n).length!==n.length?(a.writeLog("PREPO_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to ReturnAllToSenders.run"})):(d.runtime={callback:t,softClient:e.softClient,subClient:e.subClient,softBalance:e.softBalance,settings:e.settings,failedSubTransactions:[],currentBatch:[],sumPending:0},void d.runtime.softClient.getBlockCount().then(function(e){d.runtime.currentBlockHeight=e,d.getUnspent()}).catch(function(e){a.writeLog("PREPO_001A","failed to get the current blockheight",{error:e}),t(!1,{message:"failed to get the current blockheight"})}))},d.getUnspent=function(){d.runtime.subClient.listUnspent().then(function(e){return e.length<1?void d.runtime.callback(!1,{message:"no unspent transactions found"}):void o.filterUnspent({unspent:e,client:d.runtime.subClient,accountName:c.account[s.serverType]},d.unspentFiltered)}).catch(function(e){a.writeLog("PREPO_002","failed to list unspent",e),d.runtime.callback(!1,{message:"failed to list unspent"})})},d.unspentFiltered=function(e,t){return!e||!t||!t.currentPending||t.currentPending.length<1?(a.writeLog("PREPO_003","no current pending to return",t),void d.runtime.callback(!1,{message:"no current pending to return"})):(d.runtime.currentPending=t.currentPending,void d.processTransaction())},d.processTransaction=function(){return d.runtime.currentPending.length<1?void d.runtime.callback(!0,{failedSubTransactions:d.runtime.failedSubTransactions,currentBatch:d.runtime.currentBatch}):void u.getEncrypted({transaction:d.runtime.currentPending[0],client:d.runtime.subClient},d.checkDecrypted)},d.failedTransaction=function(){d.runtime.failedSubTransactions.push(d.runtime.currentPending[0]),d.runtime.currentPending.splice(0,1),d.processTransaction()},d.checkDecrypted=function(e,t){if(!(e&&t&&t.decrypted&&t.transaction))return a.writeLog("PREPO_004","failed to decrypt transaction",{success:e}),void d.failedTransaction();if(!t.decrypted.n||!t.decrypted.v||!t.decrypted.s)return a.writeLog("PREPO_005","transaction has invalid params",{success:e}),void d.failedTransaction();if(parseFloat(t.decrypted.v)>d.runtime.settings.maxAmount)return a.writeLog("PREPO_006","decrypted amount is larger than maxAmount",{success:e}),void d.failedTransaction();t.decrypted.s!==d.runtime.settings.secret&&(a.writeLog("PREPO_007","secret mismatch",{success:e}),d.failedTransaction());var n=t.decrypted;n.t||(n.t=0),d.testDecrypted(n,t.transaction)},d.testDecrypted=function(e,t){d.runtime.softClient.validateAddress(e.n).then(function(n){return n.isvalid!==!0?(a.writeLog("PREPO_008","recipient address is invalid",{transaction:t}),void d.failedTransaction()):e.t>d.runtime.currentBlockHeight?(d.runtime.currentPending.splice(0,1),void d.processTransaction()):d.runtime.softBalance>d.runtime.sumPending+parseFloat(e.v)?(d.runtime.sumPending=d.runtime.sumPending+parseFloat(e.v),d.runtime.currentBatch.push({decrypted:e,transaction:t}),d.runtime.currentPending.splice(0,1),void d.processTransaction()):void d.runtime.callback(!0,{failedSubTransactions:d.runtime.failedSubTransactions,currentBatch:d.runtime.currentBatch})}).catch(function(n){a.writeLog("PREPO_009","softClient failed validate address",{decrypted:e,transaction:t,error:n}),d.failedTransaction()})},e.exports=d},function(e,t,n){"use strict";var r=n(10),i=n(13),s=(n(21),n(31)),a={};a.run=function(e,t){var n=["currentBatch","settings","softClient"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("PROO_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to ProcessOutgoing.run"})):(a.runtime={callback:t,currentBatch:e.currentBatch,settings:e.settings,softClient:e.softClient,successfulTransactions:[],failedTransactions:[]},a.runtime.remainingTransactions=e.currentBatch,void a.processPending())},a.processPending=function(){return a.runtime.remainingTransactions.length<1?void a.runtime.callback(!0,{successfulTransactions:a.runtime.successfulTransactions,failedTransactions:a.runtime.failedTransactions}):void s.send({client:a.runtime.softClient,address:a.runtime.remainingTransactions[0].decrypted.n,amount:a.runtime.remainingTransactions[0].decrypted.v,transaction:a.runtime.remainingTransactions[0]},a.sentSoft)},a.transactionFailed=function(){a.runtime.failedTransactions.push(a.runtime.remainingTransactions[0]),a.runtime.remainingTransactions.splice(0,1),a.processPending()},a.mockSend=function(){i.writeLog("PROO_003A","mock soft sent",{transaction:a.runtime.remainingTransactions[0]}),a.runtime.successfulTransactions.push({transaction:a.runtime.remainingTransactions[0].transaction}),a.runtime.remainingTransactions.splice(0,1),a.processPending()},a.sentSoft=function(e,t){e&&t&&t.sendOutcome?a.runtime.successfulTransactions.push(a.runtime.remainingTransactions[0]):(i.writeLog("PROO_004","failed soft send to address",t,!0),a.runtime.failedTransactions.push(a.runtime.remainingTransactions[0])),a.runtime.remainingTransactions.splice(0,1),a.processPending()},e.exports=a},function(e,t,n){"use strict";var r=n(10),i=n(13),s=n(31),a=n(15),o={};o.run=function(e,t){var n=["settings","softClient"];return r.intersection(Object.keys(e),n).length!==n.length?(i.writeLog("PAY_001","invalid options",{options:e,required:n}),void t(!1,{message:"invalid options provided to PayoutFee.run"})):(o.runtime={callback:t,settings:e.settings,softClient:e.softClient},void o.send())},o.send=function(){o.runtime.softClient.listUnspent(200).then(function(e){var t=0,n=1e8,r=!0,u=!1,c=void 0;try{for(var d,l=e[Symbol.iterator]();!(r=(d=l.next()).done);r=!0){var g=d.value;t+=Math.round(g.amount*n)}}catch(e){u=!0,c=e}finally{try{!r&&l.return&&l.return()}finally{if(u)throw c}}var p=t/n;if(p65535)&&(C.errors.push("PORT_OUT_OF_RANGE for "+n+", must be between 1 and 65535 "),!0)}function u(e,t,n){var r=parseInt(e,10);return t.min&&rt.max)||(C.errors.push("INT_TOO_LARGE for "+n+", must be smaller than "+t.max),!1)}function c(e,t,n){var r=parseFloat(e);if(t.min&&rt.max)return C.errors.push("FLOAT_TOO_LARGE for "+n+", must be smaller than "+t.max),!1;if(t.decimals&&2===t.decimals){var i=e.toString().search(A)>=0;if(!i)return C.errors.push("FLOAT_INCORRECT_FORMAT for "+n+", must have a maximum of 2 decimal places "),!1}return!0}function d(e,t,n){return!!f.isEmail(e)||(C.errors.push("INVALID_DOMAIN for "+n+", must be a valid fully qualified domain name"),!1)}function l(e,t,n){return 34===e.length||"N"===e.charAt(0)||(C.errors.push("INVALID_SOFT_ADDRESSS for "+n+", must be 34 characters and starting with N"),!1)}function g(e,t,n){return!t.length||e.length===t.length||(C.errors.push("INCORRECT_LENGTH for "+n+", must be "+t.length+" characters"+e.length+" provided"),!1)}function p(e,t,n){return e===t.value||(C.errors.push("INCORRECT_VALUE for "+n+", must equal "+t.value),!1)}var m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},v=n(7),f=n(39),h=n(13),y=v.get("GLOBAL"),b=n(40),T=n(41),A=/^(\d+)?([.]?\d{0,2})?$/,C={errors:[]};C.validateSettings=function(e,t){if(C.errors=[],"INCOMING"===y.serverType)r(e.settings,e.ignore,b);else{if("OUTGOING"!==y.serverType)return h.writeLog("VAL_001","invalid server type",{options:e}),void t(!1);r(e.settings,e.ignore,T)}C.errors.length<1?t(!0):(h.writeLog("VAL_002","invalid settings",{errors:C.errors}),t(!1))},e.exports=C},function(e,t){e.exports=require("validator")},function(e,t){e.exports={local:{ipAddress:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"PORT"}},remote:{host:{required:!1,type:"DOMAIN"},ipAddress:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"PORT"}},scriptInterval:{required:!0,type:"INT",min:3e4},minAmount:{required:!0,type:"INT",min:1},maxAmount:{required:!0,type:"INT",min:10},anonFeePercent:{required:!0,type:"FLOAT",min:0,max:99,decimals:2},notificationEmail:{required:!0,type:"EMAIL"},smtp:{user:{required:!0,type:"EMAIL"},pass:{required:!0,type:"STRING"},server:{required:!0,type:"DOMAIN"}},softCoin:{user:{required:!0,type:"STRING"},pass:{required:!0,type:"STRING"},ip:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"VALUE",value:"44444"},walletPassphrase:{required:{conditional:"GLOBAL.encryptedWallet"},type:"STRING"}},subChain:{user:{required:!0,type:"STRING"},pass:{required:!0,type:"STRING"},ip:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"VALUE",value:"33333"},walletPassphrase:{required:{conditional:"GLOBAL.encryptedWallet"},type:"STRING"}},secretOptions:{salt:{required:!0,type:"STRING",length:32},saltRounds:{required:!0,type:"INT",min:1,max:20}},secret:{required:!0,type:"STRING",length:32}}},function(e,t){e.exports={local:{ipAddress:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"PORT"}},remote:{host:{required:!1,type:"DOMAIN"},ipAddress:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"PORT"}},scriptInterval:{required:!0,type:"INT",min:12e4},minAmount:{required:!0,type:"INT",min:1},maxAmount:{required:!0,type:"INT",min:10},softPoolAmount:{required:!0,type:"INT",min:5e4},txFeePayoutMin:{required:!0,type:"INT",min:1},anonTxFeeAddress:{required:!0,type:"SOFT_ADDRESS"},notificationEmail:{required:!0,type:"EMAIL"},smtp:{user:{required:!0,type:"EMAIL"},pass:{required:!0,type:"STRING"},server:{required:!0,type:"DOMAIN"}},softCoin:{user:{required:!0,type:"STRING"},pass:{required:!0,type:"STRING"},ip:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"VALUE",value:"44444"},walletPassphrase:{required:{conditional:"GLOBAL.encryptedWallet"},type:"STRING"}},subChain:{user:{required:!0,type:"STRING"},pass:{required:!0,type:"STRING"},ip:{required:!0,type:"IP_ADDRESS"},port:{required:!0,type:"VALUE",value:"33333"},walletPassphrase:{required:{conditional:"GLOBAL.encryptedWallet"},type:"STRING"}},secret:{required:!0,type:"STRING",length:32}}}]); diff --git a/dist/vendor.js b/dist/vendor.js old mode 100644 new mode 100755 diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json old mode 100644 new mode 100755 index 96f54e7..b0154c3 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,2309 +1,3321 @@ { "name": "crypto-anonymizer", "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, "dependencies": { "abbrev": { "version": "1.0.9", - "from": "abbrev@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, "accepts": { "version": "1.3.3", - "from": "accepts@>=1.3.3 <1.4.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz" + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "requires": { + "mime-types": "2.1.13", + "negotiator": "0.6.1" + } }, "acorn": { "version": "4.0.4", - "from": "acorn@4.0.4", "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz", + "integrity": "sha1-F6jWp6bE71OLgU7Jq6wneSk78wo=", "dev": true }, "acorn-jsx": { "version": "3.0.1", - "from": "acorn-jsx@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, + "requires": { + "acorn": "3.3.0" + }, "dependencies": { "acorn": { "version": "3.3.0", - "from": "acorn@>=3.0.4 <4.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true } } }, "addressparser": { "version": "1.0.1", - "from": "addressparser@1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=" }, "ajv": { "version": "4.11.5", - "from": "ajv@>=4.7.0 <5.0.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.5.tgz", - "dev": true + "integrity": "sha1-tu50ZXuZOgHc5Et5RNVvSFgo1b0=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } }, "ajv-keywords": { "version": "1.5.1", - "from": "ajv-keywords@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, "align-text": { "version": "0.1.4", - "from": "align-text@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "dev": true + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.1.0", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } }, "amdefine": { "version": "1.0.1", - "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, "ansi-escapes": { "version": "1.4.0", - "from": "ansi-escapes@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", "dev": true }, "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" }, "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "anymatch": { "version": "1.3.0", - "from": "anymatch@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "dev": true + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11" + } }, "argparse": { "version": "1.0.9", - "from": "argparse@>=1.0.7 <2.0.0", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "dev": true + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } }, "arr-diff": { "version": "2.0.0", - "from": "arr-diff@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "dev": true + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.0.1" + } }, "arr-flatten": { "version": "1.0.1", - "from": "arr-flatten@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", + "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", "dev": true }, "array-flatten": { "version": "1.1.1", - "from": "array-flatten@1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-union": { "version": "1.0.2", - "from": "array-union@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "dev": true + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } }, "array-uniq": { "version": "1.0.3", - "from": "array-uniq@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, "array-unique": { "version": "0.2.1", - "from": "array-unique@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, "arrify": { "version": "1.0.1", - "from": "arrify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "asn1": { "version": "0.2.3", - "from": "asn1@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "assert": { "version": "1.4.1", - "from": "assert@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "dev": true + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } }, "assert-plus": { "version": "0.2.0", - "from": "assert-plus@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, "assertion-error": { "version": "1.0.2", - "from": "assertion-error@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, "assign": { "version": "0.1.7", - "from": "assign@>=0.1.7", "resolved": "https://registry.npmjs.org/assign/-/assign-0.1.7.tgz", + "integrity": "sha1-5jv+Ooh7hjCRPCdmPkzJv/Hd0l8=", "dev": true, + "requires": { + "fusing": "0.4.0" + }, "dependencies": { "fusing": { "version": "0.4.0", - "from": "fusing@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/fusing/-/fusing-0.4.0.tgz", - "dev": true + "integrity": "sha1-yZBo9Uyj4R3AEYkCFSq/Nnq6Sk0=", + "dev": true, + "requires": { + "emits": "1.0.2", + "predefine": "0.1.2" + } } } }, "ast-types": { "version": "0.9.6", - "from": "ast-types@0.9.6", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", "dev": true }, "async": { "version": "1.5.2", - "from": "async@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, "async-each": { "version": "1.0.1", - "from": "async-each@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, "asynckit": { "version": "0.4.0", - "from": "asynckit@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "aws-sign2": { "version": "0.6.0", - "from": "aws-sign2@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" }, "aws4": { "version": "1.5.0", - "from": "aws4@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.5.0.tgz" + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.5.0.tgz", + "integrity": "sha1-Cin/t5wxyecS7rCH6OemS0pW11U=" }, "babel": { "version": "6.5.2", - "from": "babel@>=6.5.2 <7.0.0", - "resolved": "https://registry.npmjs.org/babel/-/babel-6.5.2.tgz" + "resolved": "https://registry.npmjs.org/babel/-/babel-6.5.2.tgz", + "integrity": "sha1-WRQGB0OCcJIAR/9W8CsthjDC0Sk=" }, "babel-cli": { "version": "6.24.0", - "from": "babel-cli@>=6.18.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.24.0.tgz", + "integrity": "sha1-oF/9IQ3KDCiKJtUxnFrIZpomWtA=", "dev": true, + "requires": { + "babel-core": "6.24.0", + "babel-polyfill": "6.23.0", + "babel-register": "6.24.0", + "babel-runtime": "6.23.0", + "chokidar": "1.6.1", + "commander": "2.9.0", + "convert-source-map": "1.4.0", + "fs-readdir-recursive": "1.0.0", + "glob": "7.1.1", + "lodash": "4.17.2", + "output-file-sync": "1.1.2", + "path-is-absolute": "1.0.1", + "slash": "1.0.0", + "source-map": "0.5.6", + "v8flags": "2.0.11" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-code-frame": { "version": "6.22.0", - "from": "babel-code-frame@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "dev": true + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.1" + } }, "babel-core": { "version": "6.24.0", - "from": "babel-core@>=6.18.2 <7.0.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.0.tgz", + "integrity": "sha1-jzagp39cFVrtb5ILhE0julZ0KgI=", "dev": true, + "requires": { + "babel-code-frame": "6.22.0", + "babel-generator": "6.24.0", + "babel-helpers": "6.23.0", + "babel-messages": "6.23.0", + "babel-register": "6.24.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0", + "babel-traverse": "6.23.1", + "babel-types": "6.23.0", + "babylon": "6.16.1", + "convert-source-map": "1.4.0", + "debug": "2.2.0", + "json5": "0.5.1", + "lodash": "4.17.2", + "minimatch": "3.0.3", + "path-is-absolute": "1.0.1", + "private": "0.1.7", + "slash": "1.0.0", + "source-map": "0.5.6" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-eslint": { "version": "6.1.2", - "from": "babel-eslint@>=6.0.4 <7.0.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-6.1.2.tgz", - "dev": true + "integrity": "sha1-UpNBn+NnLWZZjTJ9qWlFZ7pqXy8=", + "dev": true, + "requires": { + "babel-traverse": "6.23.1", + "babel-types": "6.23.0", + "babylon": "6.16.1", + "lodash.assign": "4.2.0", + "lodash.pickby": "4.6.0" + } }, "babel-generator": { "version": "6.24.0", - "from": "babel-generator@>=6.24.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.0.tgz", + "integrity": "sha1-66JwqMxM5uCaYb5DRl18YsH4fFY=", "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.23.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.2", + "source-map": "0.5.6", + "trim-right": "1.0.1" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helper-call-delegate": { "version": "6.22.0", - "from": "babel-helper-call-delegate@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz", + "integrity": "sha1-EZkhtWEg8X6drj90tPXMe8wbN+8=", "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.22.0", + "babel-runtime": "6.23.0", + "babel-traverse": "6.23.1", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helper-define-map": { "version": "6.23.0", - "from": "babel-helper-define-map@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz", + "integrity": "sha1-FET5YMlpHWmiztaiBTFfj9AIBOc=", "dev": true, + "requires": { + "babel-helper-function-name": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.23.0", + "lodash": "4.17.2" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helper-function-name": { "version": "6.23.0", - "from": "babel-helper-function-name@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz", + "integrity": "sha1-JXQtZxdciQPb5LbLnZ4fy43PI6Y=", "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.22.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0", + "babel-traverse": "6.23.1", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helper-get-function-arity": { "version": "6.22.0", - "from": "babel-helper-get-function-arity@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz", + "integrity": "sha1-C+tGStadxzR0EKxq3p8DpQY09c4=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helper-hoist-variables": { "version": "6.22.0", - "from": "babel-helper-hoist-variables@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz", + "integrity": "sha1-Pqy/cx2AcFhF3S6XGPYAz7m0unI=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helper-optimise-call-expression": { "version": "6.23.0", - "from": "babel-helper-optimise-call-expression@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz", + "integrity": "sha1-8+5+7TVbQoITizPQK3g2nkcGIvU=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helper-regex": { "version": "6.22.0", - "from": "babel-helper-regex@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz", + "integrity": "sha1-efUyvhZHsfDuNHS19cPaWAAdJH0=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.23.0", + "lodash": "4.17.2" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helper-replace-supers": { "version": "6.23.0", - "from": "babel-helper-replace-supers@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz", + "integrity": "sha1-7q+K2bWOxDN8qUIjus3KH42bS/0=", "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.23.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0", + "babel-traverse": "6.23.1", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-helpers": { "version": "6.23.0", - "from": "babel-helpers@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.23.0.tgz", + "integrity": "sha1-T48uCS0LaogIpL3nnCfx4uzw2ZI=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-template": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-loader": { "version": "6.4.1", - "from": "babel-loader@>=6.2.8 <7.0.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "dev": true + "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "dev": true, + "requires": { + "find-cache-dir": "0.1.1", + "loader-utils": "0.2.17", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } }, "babel-messages": { "version": "6.23.0", - "from": "babel-messages@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-check-es2015-constants": { "version": "6.22.0", - "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-block-scoping": { "version": "6.23.0", - "from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz", + "integrity": "sha1-5IiVzws3W+FIzXyIebQicHoFO1E=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-template": "6.23.0", + "babel-traverse": "6.23.1", + "babel-types": "6.23.0", + "lodash": "4.17.2" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-classes": { "version": "6.23.0", - "from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz", + "integrity": "sha1-SbU/MmICov0bO7ql4u3YpPeGQ8E=", "dev": true, + "requires": { + "babel-helper-define-map": "6.23.0", + "babel-helper-function-name": "6.23.0", + "babel-helper-optimise-call-expression": "6.23.0", + "babel-helper-replace-supers": "6.23.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0", + "babel-traverse": "6.23.1", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz", + "integrity": "sha1-fDg+lim7pIIMEbBCW91ikPfwV+c=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-template": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", - "from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-duplicate-keys": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz", + "integrity": "sha1-ZyOXAxwhYQ1y3Su7C6n7Ynfhw2s=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", - "from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-function-name": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-function-name@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz", + "integrity": "sha1-9fzIsJCT+aI8dqw9njksPsS3cQQ=", "dev": true, + "requires": { + "babel-helper-function-name": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-modules-amd": { "version": "6.24.0", - "from": "babel-plugin-transform-es2015-modules-amd@>=6.24.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz", + "integrity": "sha1-oZEfubfsfgWkOmPFmVAHVXvPai4=", "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.24.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.24.0", - "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.24.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz", + "integrity": "sha1-6SGu+3LCzCbLA9EHYmFWQTIiE08=", "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.22.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-modules-systemjs": { "version": "6.23.0", - "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz", + "integrity": "sha1-rjRpIn/6w5sDENkP7HO/3E9jF7A=", "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.22.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-modules-umd": { "version": "6.24.0", - "from": "babel-plugin-transform-es2015-modules-umd@>=6.24.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz", + "integrity": "sha1-/V+mNSHK6NJzknw5WK/XwGdzNFA=", "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-object-super": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz", + "integrity": "sha1-2qYOEUoELqdp3VP+Uo/IIxHrmPw=", "dev": true, + "requires": { + "babel-helper-replace-supers": "6.23.0", + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-parameters": { "version": "6.23.0", - "from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz", + "integrity": "sha1-OiqrtwyK+UXVzjhvGkJQYlqDrjs=", "dev": true, + "requires": { + "babel-helper-call-delegate": "6.22.0", + "babel-helper-get-function-arity": "6.22.0", + "babel-runtime": "6.23.0", + "babel-template": "6.23.0", + "babel-traverse": "6.23.1", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz", + "integrity": "sha1-i6d24K/6pgv/IekhQDuKZSov9yM=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-sticky-regex": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz", + "integrity": "sha1-qzFoKehm7j9LnrlpOXV9GaW8RZM=", "dev": true, + "requires": { + "babel-helper-regex": "6.22.0", + "babel-runtime": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-typeof-symbol": { "version": "6.23.0", - "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-es2015-unicode-regex": { "version": "6.22.0", - "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz", + "integrity": "sha1-jZzCfn7h3s/mVFT7mGRSoEphPSA=", "dev": true, + "requires": { + "babel-helper-regex": "6.22.0", + "babel-runtime": "6.23.0", + "regexpu-core": "2.0.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-regenerator": { "version": "6.22.0", - "from": "babel-plugin-transform-regenerator@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz", - "dev": true + "integrity": "sha1-ZXQFk6MZxEUiFXU41pC4QJRhfqY=", + "dev": true, + "requires": { + "regenerator-transform": "0.9.8" + } }, "babel-plugin-transform-runtime": { "version": "6.23.0", - "from": "babel-plugin-transform-runtime@>=6.15.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, + "requires": { + "babel-runtime": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-plugin-transform-strict-mode": { "version": "6.22.0", - "from": "babel-plugin-transform-strict-mode@>=6.22.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz", + "integrity": "sha1-4AjfATQP3IfpWdplmRt+BZcMjHw=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-types": "6.23.0" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-polyfill": { "version": "6.23.0", - "from": "babel-polyfill@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-preset-es2015": { "version": "6.24.0", - "from": "babel-preset-es2015@>=6.18.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.0.tgz", - "dev": true + "integrity": "sha1-wWLWixkyaW4DbNMRDcHM0wPSZzo=", + "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.23.0", + "babel-plugin-transform-es2015-classes": "6.23.0", + "babel-plugin-transform-es2015-computed-properties": "6.22.0", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.22.0", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.22.0", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.0", + "babel-plugin-transform-es2015-modules-commonjs": "6.24.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.23.0", + "babel-plugin-transform-es2015-modules-umd": "6.24.0", + "babel-plugin-transform-es2015-object-super": "6.22.0", + "babel-plugin-transform-es2015-parameters": "6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "6.22.0", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.22.0", + "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.22.0", + "babel-plugin-transform-regenerator": "6.22.0" + } }, "babel-register": { "version": "6.24.0", - "from": "babel-register@>=6.24.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.0.tgz", + "integrity": "sha1-Xon4RjuplwNW0C6wfavjMIsIDP0=", "dev": true, + "requires": { + "babel-core": "6.24.0", + "babel-runtime": "6.23.0", + "core-js": "2.4.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.2", + "mkdirp": "0.5.1", + "source-map-support": "0.4.13" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-runtime": { "version": "6.18.0", - "from": "babel-runtime@latest", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.18.0.tgz" + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.18.0.tgz", + "integrity": "sha1-D0F3/9mEku8Tufgj6ZlKAlhMkHg=", + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.9.6" + } }, "babel-template": { "version": "6.23.0", - "from": "babel-template@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz", + "integrity": "sha1-BNTycK27OqcEqBQ64m+qUpI45jg=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-traverse": "6.23.1", + "babel-types": "6.23.0", + "babylon": "6.16.1", + "lodash": "4.17.2" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-traverse": { "version": "6.23.1", - "from": "babel-traverse@>=6.23.1 <7.0.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz", + "integrity": "sha1-08tZAQ7NBql9gTEAZflmtpnhT0g=", "dev": true, + "requires": { + "babel-code-frame": "6.22.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.23.0", + "babylon": "6.16.1", + "debug": "2.2.0", + "globals": "9.16.0", + "invariant": "2.2.2", + "lodash": "4.17.2" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babel-types": { "version": "6.23.0", - "from": "babel-types@>=6.23.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz", + "integrity": "sha1-uxcXnXU4utOM0MnhFdNA935+ms8=", "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "esutils": "2.0.2", + "lodash": "4.17.2", + "to-fast-properties": "1.0.2" + }, "dependencies": { "babel-runtime": { "version": "6.23.0", - "from": "babel-runtime@^6.22.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "dev": true + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.3" + } }, "regenerator-runtime": { "version": "0.10.3", - "from": "regenerator-runtime@^0.10.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz", + "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=", "dev": true } } }, "babylon": { "version": "6.16.1", - "from": "babylon@>=6.11.0 <7.0.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.16.1.tgz", + "integrity": "sha1-MMWiL0gZeKnn+M399JaxHZS0BNM=", "dev": true }, "back": { "version": "1.0.1", - "from": "back@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/back/-/back-1.0.1.tgz", - "dev": true + "integrity": "sha1-cE+KI9p641t9R7ZI+aef0qJVcOM=", + "dev": true, + "requires": { + "xtend": "4.0.1" + } }, "balanced-match": { "version": "0.4.2", - "from": "balanced-match@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true }, "base64-js": { "version": "1.2.0", - "from": "base64-js@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", "dev": true }, "bcrypt": { "version": "0.8.7", - "from": "bcrypt@>=0.8.7 <0.9.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-0.8.7.tgz" + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-0.8.7.tgz", + "integrity": "sha1-vDh1qa/Qp7LNIxpqfyGKXOFWsJM=", + "requires": { + "bindings": "1.2.1", + "nan": "2.3.5" + } }, "bcrypt-pbkdf": { "version": "1.0.0", - "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz", - "optional": true + "integrity": "sha1-PKdrhSQccXC/fZcD57mqdGMAQNQ=", + "optional": true, + "requires": { + "tweetnacl": "0.14.3" + } }, "big.js": { "version": "3.1.3", - "from": "big.js@>=3.1.3 <4.0.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", + "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", "dev": true }, "binary-extensions": { "version": "1.8.0", - "from": "binary-extensions@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", + "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", "dev": true }, "bindings": { "version": "1.2.1", - "from": "bindings@1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" }, "bitcoin-core": { "version": "1.1.0", - "from": "bitcoin-core@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/bitcoin-core/-/bitcoin-core-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/bitcoin-core/-/bitcoin-core-1.1.0.tgz", + "integrity": "sha1-AJ/dnkLscAwqVeDnZBgPkBwhAqI=", + "requires": { + "bluebird": "3.4.6", + "lodash": "4.17.2", + "request": "2.79.0", + "semver": "5.3.0", + "standard-error": "1.1.0" + } }, "bluebird": { "version": "3.4.6", - "from": "bluebird@>=3.4.1 <4.0.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.6.tgz" + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.6.tgz", + "integrity": "sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8=" }, "body-parser": { "version": "1.15.2", - "from": "body-parser@>=1.15.2 <2.0.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.2.tgz", + "integrity": "sha1-11eM9PHRHV9uqATO813Hp/9trmc=", + "requires": { + "bytes": "2.4.0", + "content-type": "1.0.2", + "debug": "2.2.0", + "depd": "1.1.0", + "http-errors": "1.5.1", + "iconv-lite": "0.4.13", + "on-finished": "2.3.0", + "qs": "6.2.0", + "raw-body": "2.1.7", + "type-is": "1.6.14" + }, "dependencies": { "qs": { "version": "6.2.0", - "from": "qs@6.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", + "integrity": "sha1-O3hIwDwt7OaalSKw+ujEEm10Xzs=" } } }, "boom": { "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } }, "brace-expansion": { "version": "1.1.6", - "from": "brace-expansion@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "dev": true + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } }, "braces": { "version": "1.8.5", - "from": "braces@>=1.8.2 <2.0.0", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "dev": true + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } }, "browser-stdout": { "version": "1.3.0", - "from": "browser-stdout@1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, "browserify-aes": { "version": "0.4.0", - "from": "browserify-aes@0.4.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", - "dev": true + "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } }, "browserify-zlib": { "version": "0.1.4", - "from": "browserify-zlib@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "dev": true + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } }, "buffer": { "version": "4.9.1", - "from": "buffer@>=4.9.0 <5.0.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "dev": true + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.0", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } }, "buffer-shims": { "version": "1.0.0", - "from": "buffer-shims@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", "dev": true }, "buildmail": { "version": "3.10.0", - "from": "buildmail@3.10.0", - "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-3.10.0.tgz" + "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-3.10.0.tgz", + "integrity": "sha1-xoJtcW55RbtvaxQ0tTmF4CmgMVk=", + "requires": { + "addressparser": "1.0.1", + "libbase64": "0.1.0", + "libmime": "2.1.0", + "libqp": "1.1.0", + "nodemailer-fetch": "1.6.0", + "nodemailer-shared": "1.1.0" + } }, "builtin-modules": { "version": "1.1.1", - "from": "builtin-modules@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "builtin-status-codes": { "version": "3.0.0", - "from": "builtin-status-codes@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, "bytes": { "version": "2.4.0", - "from": "bytes@2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz" + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" }, "caller-path": { "version": "0.1.0", - "from": "caller-path@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "dev": true + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } }, "callsites": { "version": "0.2.0", - "from": "callsites@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, "camel-case": { "version": "3.0.0", - "from": "camel-case@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "dev": true + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.1", + "upper-case": "1.1.3" + } }, "camelcase": { "version": "1.2.1", - "from": "camelcase@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, "caseless": { "version": "0.11.0", - "from": "caseless@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" }, "center-align": { "version": "0.1.3", - "from": "center-align@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "dev": true + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } }, "chai": { "version": "3.5.0", - "from": "chai@>=3.5.0 <4.0.0", "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "dev": true + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } }, "chalk": { "version": "1.1.3", - "from": "chalk@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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" + } }, "chokidar": { "version": "1.6.1", - "from": "chokidar@>=1.6.1 <2.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", - "dev": true + "integrity": "sha1-L0RHq16W5Q+z14n9kNTHLg5McMI=", + "dev": true, + "requires": { + "anymatch": "1.3.0", + "async-each": "1.0.1", + "fsevents": "1.1.1", + "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" + } }, "circular-json": { "version": "0.3.1", - "from": "circular-json@>=0.3.1 <0.4.0", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", + "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", "dev": true }, "clean-css": { "version": "4.0.9", - "from": "clean-css@>=4.0.0 <4.1.0", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.0.9.tgz", - "dev": true + "integrity": "sha1-Y/9FCz+TlQjMDNKYm7nartyYMz4=", + "dev": true, + "requires": { + "source-map": "0.5.6" + } }, "cli-cursor": { "version": "1.0.2", - "from": "cli-cursor@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "dev": true + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } }, "cli-width": { "version": "2.1.0", - "from": "cli-width@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", "dev": true }, "cliui": { "version": "2.1.0", - "from": "cliui@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, "dependencies": { "wordwrap": { "version": "0.0.2", - "from": "wordwrap@0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true } } }, "clone": { "version": "1.0.2", - "from": "clone@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", "dev": true }, "co": { "version": "4.6.0", - "from": "co@>=4.6.0 <5.0.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, "code-point-at": { "version": "1.1.0", - "from": "code-point-at@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "color": { "version": "0.8.0", - "from": "color@>=0.8.0 <0.9.0", "resolved": "https://registry.npmjs.org/color/-/color-0.8.0.tgz", - "dev": true + "integrity": "sha1-iQwHw/1OZJU3Y4kRz2keVFi2/KU=", + "dev": true, + "requires": { + "color-convert": "0.5.3", + "color-string": "0.3.0" + } }, "color-convert": { "version": "0.5.3", - "from": "color-convert@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", "dev": true }, "color-name": { "version": "1.1.2", - "from": "color-name@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz", + "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=", "dev": true }, "color-string": { "version": "0.3.0", - "from": "color-string@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "dev": true + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "1.1.2" + } }, "colornames": { "version": "0.0.2", - "from": "colornames@0.0.2", "resolved": "https://registry.npmjs.org/colornames/-/colornames-0.0.2.tgz", + "integrity": "sha1-2BH9bIT1kClJmorEQ2ICk1uSvjE=", "dev": true }, "colorspace": { "version": "1.0.1", - "from": "colorspace@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.0.1.tgz", - "dev": true + "integrity": "sha1-yZx5btMRKLmHalLh7l7gOkpxl0k=", + "dev": true, + "requires": { + "color": "0.8.0", + "text-hex": "0.0.0" + } }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@>=1.0.5 <1.1.0", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } }, "commander": { "version": "2.9.0", - "from": "commander@>=2.9.0 <3.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": "1.0.1" + } }, "commondir": { "version": "1.0.1", - "from": "commondir@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", - "from": "concat-map@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.0", - "from": "concat-stream@>=1.4.6 <2.0.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "dev": true + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.2.6", + "typedarray": "0.0.6" + } }, "config": { "version": "1.24.0", - "from": "config@latest", "resolved": "https://registry.npmjs.org/config/-/config-1.24.0.tgz", + "integrity": "sha1-VTvE13Y31mMKMFtSwzy22iufQvA=", + "requires": { + "json5": "0.4.0" + }, "dependencies": { "json5": { "version": "0.4.0", - "from": "json5@0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz" + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" } } }, "console-browserify": { "version": "1.1.0", - "from": "console-browserify@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "dev": true + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } }, "constants-browserify": { "version": "1.0.0", - "from": "constants-browserify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, "contains-path": { "version": "0.1.0", - "from": "contains-path@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, "content-disposition": { "version": "0.5.1", - "from": "content-disposition@0.5.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz" + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz", + "integrity": "sha1-h0dsamfI2qh+Muh2Ft+IO6f7Bxs=" }, "content-type": { "version": "1.0.2", - "from": "content-type@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" }, "convert-source-map": { "version": "1.4.0", - "from": "convert-source-map@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.4.0.tgz", + "integrity": "sha1-49rRlb9hv+E6ejxz6YduwUoCaPM=", "dev": true }, "cookie": { "version": "0.3.1", - "from": "cookie@0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-signature": { "version": "1.0.6", - "from": "cookie-signature@1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-js": { "version": "2.4.1", - "from": "core-js@>=2.4.0 <3.0.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz" + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" }, "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.10.1" + } }, "crypto-browserify": { "version": "3.3.0", - "from": "crypto-browserify@3.3.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", - "dev": true + "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", + "dev": true, + "requires": { + "browserify-aes": "0.4.0", + "pbkdf2-compat": "2.0.1", + "ripemd160": "0.2.0", + "sha.js": "2.2.6" + } }, "d": { "version": "0.1.1", - "from": "d@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "dev": true + "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", + "dev": true, + "requires": { + "es5-ext": "0.10.14" + } }, "damerau-levenshtein": { "version": "1.0.3", - "from": "damerau-levenshtein@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.3.tgz", + "integrity": "sha1-rk9M4LYqyuEP9joBuwj2UvUhOvI=", "dev": true }, "dashdash": { "version": "1.14.1", - "from": "dashdash@>=1.12.0 <2.0.0", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", - "from": "assert-plus@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" } } }, "date-now": { "version": "0.1.4", - "from": "date-now@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, "debug": { "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } }, "decamelize": { "version": "1.2.0", - "from": "decamelize@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "deep-eql": { "version": "0.1.3", - "from": "deep-eql@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", "dev": true, + "requires": { + "type-detect": "0.1.1" + }, "dependencies": { "type-detect": { "version": "0.1.1", - "from": "type-detect@0.1.1", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", "dev": true } } }, "deep-is": { "version": "0.1.3", - "from": "deep-is@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "define-properties": { "version": "1.1.2", - "from": "define-properties@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "dev": true + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } }, "del": { "version": "2.2.2", - "from": "del@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "dev": true + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.1" + } }, "delayed-stream": { "version": "1.0.0", - "from": "delayed-stream@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "1.1.0", - "from": "depd@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" }, "destroy": { "version": "1.0.4", - "from": "destroy@>=1.0.4 <1.1.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", - "from": "detect-indent@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "dev": true + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } }, "diagnostics": { "version": "1.0.1", - "from": "diagnostics@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.0.1.tgz", - "dev": true + "integrity": "sha1-rM2wgMgrsl0N1zQwqeaof7tDFUE=", + "dev": true, + "requires": { + "colorspace": "1.0.1", + "enabled": "1.0.2", + "kuler": "0.0.0" + } }, "diff": { "version": "1.4.0", - "from": "diff@1.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", "dev": true }, "doctrine": { "version": "1.5.0", - "from": "doctrine@>=1.2.2 <2.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "dev": true - }, + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, "domain-browser": { "version": "1.1.7", - "from": "domain-browser@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", "dev": true }, "ecc-jsbn": { "version": "0.1.1", - "from": "ecc-jsbn@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "optional": true + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.0" + } }, "ee-first": { "version": "1.1.1", - "from": "ee-first@1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "emits": { "version": "1.0.2", - "from": "emits@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/emits/-/emits-1.0.2.tgz", + "integrity": "sha1-2yDsZmgyUHHDE0QeMM/ipp6nOFk=", "dev": true }, "emojis-list": { "version": "2.1.0", - "from": "emojis-list@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, "enabled": { "version": "1.0.2", - "from": "enabled@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "dev": true + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "dev": true, + "requires": { + "env-variable": "0.0.3" + } }, "encodeurl": { "version": "1.0.1", - "from": "encodeurl@>=1.0.1 <1.1.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, "enhanced-resolve": { "version": "0.9.1", - "from": "enhanced-resolve@>=0.9.0 <0.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.2.0", + "tapable": "0.1.10" + }, "dependencies": { "memory-fs": { "version": "0.2.0", - "from": "memory-fs@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", "dev": true } } }, "env-variable": { "version": "0.0.3", - "from": "env-variable@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.3.tgz", + "integrity": "sha1-uGwWQb5WECZ9UG8YBx6nbXBwl8s=", "dev": true }, "errno": { "version": "0.1.4", - "from": "errno@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "dev": true + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "0.0.0" + } }, "es-abstract": { "version": "1.7.0", - "from": "es-abstract@>=1.6.1 <2.0.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", - "dev": true + "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.0", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } }, "es-to-primitive": { "version": "1.1.1", - "from": "es-to-primitive@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "dev": true + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } }, "es5-ext": { "version": "0.10.14", - "from": "es5-ext@>=0.10.11 <0.11.0", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.14.tgz", - "dev": true + "integrity": "sha1-YlvJq5ysD2+53CcVJYI9GACz02A=", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } }, "es6-iterator": { "version": "2.0.1", - "from": "es6-iterator@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.14", + "es6-symbol": "3.1.1" + }, "dependencies": { "d": { "version": "1.0.0", - "from": "d@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "dev": true + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.14" + } } } }, "es6-map": { "version": "0.1.4", - "from": "es6-map@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.4.tgz", - "dev": true + "integrity": "sha1-o0sUe+IkdzpNfagHJ5TO+jYyuJc=", + "dev": true, + "requires": { + "d": "0.1.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-set": { "version": "0.1.5", - "from": "es6-set@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.14", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + }, "dependencies": { "d": { "version": "1.0.0", - "from": "d@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "dev": true + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.14" + } } } }, "es6-symbol": { "version": "3.1.1", - "from": "es6-symbol@>=3.1.0 <3.2.0", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.14" + }, "dependencies": { "d": { "version": "1.0.0", - "from": "d@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "dev": true + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.14" + } } } }, "es6-templates": { "version": "0.2.3", - "from": "es6-templates@>=0.2.2 <0.3.0", "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "dev": true + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "0.11.23", + "through": "2.3.8" + } }, "es6-weak-map": { "version": "2.0.2", - "from": "es6-weak-map@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.14", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + }, "dependencies": { "d": { "version": "1.0.0", - "from": "d@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "dev": true + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.14" + } } } }, "escape-html": { "version": "1.0.3", - "from": "escape-html@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.8.1", - "from": "escodegen@>=1.8.0 <1.9.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, "dependencies": { "esprima": { "version": "2.7.3", - "from": "esprima@>=2.7.1 <3.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "estraverse": { "version": "1.9.3", - "from": "estraverse@>=1.9.1 <2.0.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", "dev": true }, "source-map": { "version": "0.2.0", - "from": "source-map@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", "dev": true, - "optional": true + "optional": true, + "requires": { + "amdefine": "1.0.1" + } } } }, "escope": { "version": "3.6.0", - "from": "escope@>=3.6.0 <4.0.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "dev": true + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.4", + "es6-weak-map": "2.0.2", + "esrecurse": "4.1.0", + "estraverse": "4.2.0" + } }, "eslint": { "version": "2.13.1", - "from": "eslint@>=2.8.0 <3.0.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", "dev": true, + "requires": { + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.2.0", + "doctrine": "1.5.0", + "es6-map": "0.1.4", + "escope": "3.6.0", + "espree": "3.4.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "1.3.1", + "glob": "7.1.1", + "globals": "9.16.0", + "ignore": "3.2.6", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.15.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.8.2", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.2", + "mkdirp": "0.5.1", + "optionator": "0.8.2", + "path-is-absolute": "1.0.1", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.6.1", + "strip-json-comments": "1.0.4", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, "dependencies": { "user-home": { "version": "2.0.0", - "from": "user-home@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "dev": true + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } } } }, "eslint-config-airbnb": { "version": "8.0.0", - "from": "eslint-config-airbnb@>=8.0.0 <9.0.0", "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-8.0.0.tgz", - "dev": true + "integrity": "sha1-LlOYJiYuY2dSWWDVoNU9MrJjr5A=", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "1.0.4" + } }, "eslint-config-airbnb-base": { "version": "1.0.4", - "from": "eslint-config-airbnb-base@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-1.0.4.tgz", + "integrity": "sha1-vFQgiQvGRCzxUnfJpKKB/BMX+KY=", "dev": true }, "eslint-import-resolver-node": { "version": "0.2.3", - "from": "eslint-import-resolver-node@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "dev": true + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "dev": true, + "requires": { + "debug": "2.2.0", + "object-assign": "4.1.1", + "resolve": "1.3.2" + } }, "eslint-plugin-import": { "version": "1.16.0", - "from": "eslint-plugin-import@>=1.6.1 <2.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz", + "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=", "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.2.0", + "doctrine": "1.3.0", + "es6-map": "0.1.4", + "es6-set": "0.1.5", + "eslint-import-resolver-node": "0.2.3", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "lodash.endswith": "4.2.1", + "lodash.find": "4.6.0", + "lodash.findindex": "4.6.0", + "minimatch": "3.0.3", + "object-assign": "4.1.1", + "pkg-dir": "1.0.0", + "pkg-up": "1.0.0" + }, "dependencies": { "doctrine": { "version": "1.3.0", - "from": "doctrine@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.3.0.tgz", - "dev": true + "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } } } }, "eslint-plugin-jsx-a11y": { "version": "1.5.5", - "from": "eslint-plugin-jsx-a11y@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-1.5.5.tgz", - "dev": true + "integrity": "sha1-2ihKAWwYiec2mBgCF+LrmIqYurU=", + "dev": true, + "requires": { + "damerau-levenshtein": "1.0.3", + "jsx-ast-utils": "1.4.0", + "object-assign": "4.1.1" + } }, "eslint-plugin-react": { "version": "5.2.2", - "from": "eslint-plugin-react@>=5.0.1 <6.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-5.2.2.tgz", - "dev": true + "integrity": "sha1-fbBo4fVIf2hx5N7vNqOBwwPqwWE=", + "dev": true, + "requires": { + "doctrine": "1.5.0", + "jsx-ast-utils": "1.4.0" + } }, "espree": { "version": "3.4.0", - "from": "espree@>=3.1.6 <4.0.0", "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.0.tgz", - "dev": true + "integrity": "sha1-QWVvpWKOBCh4Al70Z+ePEly4bh0=", + "dev": true, + "requires": { + "acorn": "4.0.4", + "acorn-jsx": "3.0.1" + } }, "esprima": { "version": "3.1.3", - "from": "esprima@>=3.1.1 <4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true }, "esrecurse": { "version": "4.1.0", - "from": "esrecurse@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", + "integrity": "sha1-RxO2U2rffyrE8yfVWed1a/9kgiA=", "dev": true, + "requires": { + "estraverse": "4.1.1", + "object-assign": "4.1.1" + }, "dependencies": { "estraverse": { "version": "4.1.1", - "from": "estraverse@>=4.1.0 <4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", + "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", "dev": true } } }, "estraverse": { "version": "4.2.0", - "from": "estraverse@>=4.2.0 <5.0.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, "esutils": { "version": "2.0.2", - "from": "esutils@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "etag": { "version": "1.7.0", - "from": "etag@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" }, "event-emitter": { "version": "0.3.5", - "from": "event-emitter@>=0.3.4 <0.4.0", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.14" + }, "dependencies": { "d": { "version": "1.0.0", - "from": "d@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "dev": true + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.14" + } } } }, "eventemitter3": { "version": "0.1.6", - "from": "eventemitter3@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-0.1.6.tgz", + "integrity": "sha1-jHrES4e6q1XNUMgo3Dh3jqwFLqU=", "dev": true }, "events": { "version": "1.1.1", - "from": "events@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, "exit-hook": { "version": "1.1.1", - "from": "exit-hook@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", "dev": true }, "expand-brackets": { "version": "0.1.5", - "from": "expand-brackets@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "dev": true + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } }, "expand-range": { "version": "1.8.2", - "from": "expand-range@>=1.8.1 <2.0.0", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "dev": true + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } }, "expect": { "version": "1.20.2", - "from": "expect@>=1.20.2 <2.0.0", "resolved": "https://registry.npmjs.org/expect/-/expect-1.20.2.tgz", - "dev": true + "integrity": "sha1-1Fj+TFYAQDa64yMkFqP2Nh8E+WU=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "has": "1.0.1", + "is-equal": "1.5.5", + "is-regex": "1.0.4", + "object-inspect": "1.2.1", + "object-keys": "1.0.11", + "tmatch": "2.0.1" + } }, "express": { "version": "4.14.0", - "from": "express@>=4.14.0 <5.0.0", "resolved": "https://registry.npmjs.org/express/-/express-4.14.0.tgz", + "integrity": "sha1-we4/Qs3Ikfs9xlCoki1R7IR9DWY=", + "requires": { + "accepts": "1.3.3", + "array-flatten": "1.1.1", + "content-disposition": "0.5.1", + "content-type": "1.0.2", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.2.0", + "depd": "1.1.0", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.7.0", + "finalhandler": "0.5.0", + "fresh": "0.3.0", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.1", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.2", + "qs": "6.2.0", + "range-parser": "1.2.0", + "send": "0.14.1", + "serve-static": "1.11.1", + "type-is": "1.6.14", + "utils-merge": "1.0.0", + "vary": "1.1.0" + }, "dependencies": { "qs": { "version": "6.2.0", - "from": "qs@6.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", + "integrity": "sha1-O3hIwDwt7OaalSKw+ujEEm10Xzs=" } } }, "extend": { "version": "3.0.0", - "from": "extend@>=3.0.0 <3.1.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" }, "extendible": { "version": "0.1.1", - "from": "extendible@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/extendible/-/extendible-0.1.1.tgz", + "integrity": "sha1-4qN+2HEp+0+VM+io11BiMKU5yQU=", "dev": true }, "extglob": { "version": "0.3.2", - "from": "extglob@>=0.3.1 <0.4.0", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "dev": true + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } }, "extract-github": { "version": "0.0.5", - "from": "extract-github@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/extract-github/-/extract-github-0.0.5.tgz", + "integrity": "sha1-9UJTbbjBm5g6O+yduW0u8qX/GoY=", "dev": true }, "extsprintf": { "version": "1.0.2", - "from": "extsprintf@1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "fast-levenshtein": { "version": "2.0.6", - "from": "fast-levenshtein@>=2.0.4 <2.1.0", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "fastparse": { "version": "1.1.1", - "from": "fastparse@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", "dev": true }, "figures": { "version": "1.7.0", - "from": "figures@>=1.3.5 <2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "dev": true + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } }, "file-entry-cache": { "version": "1.3.1", - "from": "file-entry-cache@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", - "dev": true + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "dev": true, + "requires": { + "flat-cache": "1.2.2", + "object-assign": "4.1.1" + } }, "filename-regex": { "version": "2.0.0", - "from": "filename-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", + "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", "dev": true }, "fill-range": { "version": "2.2.3", - "from": "fill-range@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "dev": true + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.6", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } }, "finalhandler": { "version": "0.5.0", - "from": "finalhandler@0.5.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz" + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", + "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", + "requires": { + "debug": "2.2.0", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } }, "find-cache-dir": { "version": "0.1.1", - "from": "find-cache-dir@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "dev": true + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } }, "find-up": { "version": "1.1.2", - "from": "find-up@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "dev": true + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } }, "findhit-class": { "version": "0.1.1", - "from": "findhit-class@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/findhit-class/-/findhit-class-0.1.1.tgz" + "resolved": "https://registry.npmjs.org/findhit-class/-/findhit-class-0.1.1.tgz", + "integrity": "sha1-G3OgqaVeri3ax2bSGX4WBnkKxW4=", + "requires": { + "findhit-util": "0.2.9" + } }, "findhit-util": { "version": "0.2.9", - "from": "findhit-util@>=0.2.7 <0.3.0", - "resolved": "https://registry.npmjs.org/findhit-util/-/findhit-util-0.2.9.tgz" + "resolved": "https://registry.npmjs.org/findhit-util/-/findhit-util-0.2.9.tgz", + "integrity": "sha1-swIh7MrLlbBHejJsB8YDf3wG/68=" }, "flat-cache": { "version": "1.2.2", - "from": "flat-cache@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "dev": true + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true, + "requires": { + "circular-json": "0.3.1", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } }, "for-in": { "version": "1.0.2", - "from": "for-in@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "for-own": { "version": "0.1.5", - "from": "for-own@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "dev": true + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } }, "foreach": { "version": "2.0.5", - "from": "foreach@>=2.0.5 <3.0.0", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@>=0.6.1 <0.7.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.1.2", - "from": "form-data@>=2.1.1 <2.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz" + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", + "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.13" + } }, "formatio": { "version": "1.1.1", - "from": "formatio@1.1.1", "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "dev": true + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "1.1.2" + } }, "forwarded": { "version": "0.1.0", - "from": "forwarded@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" }, "fresh": { "version": "0.3.0", - "from": "fresh@0.3.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" }, "fs": { "version": "0.0.1-security", - "from": "fs@0.0.1-security", "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", "dev": true }, "fs-readdir-recursive": { "version": "1.0.0", - "from": "fs-readdir-recursive@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", + "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", "dev": true }, "fs.realpath": { "version": "1.0.0", - "from": "fs.realpath@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { "version": "1.1.1", - "from": "fsevents@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.1.tgz", + "integrity": "sha1-8Z/Sj0Pur3YWgOUZogPE0LPTGv8=", "dev": true, "optional": true, + "requires": { + "nan": "2.3.5", + "node-pre-gyp": "0.6.33" + }, "dependencies": { "abbrev": { "version": "1.1.0", - "from": "abbrev@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true, "optional": true }, "aproba": { "version": "1.1.1", - "from": "aproba@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.2", - "from": "are-we-there-yet@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", + "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", "dev": true, - "optional": true + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.2" + } }, "asn1": { "version": "0.2.3", - "from": "asn1@>=0.2.3 <0.3.0", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "dev": true, "optional": true }, "assert-plus": { "version": "0.2.0", - "from": "assert-plus@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true, "optional": true }, "asynckit": { "version": "0.4.0", - "from": "asynckit@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true, "optional": true }, "aws-sign2": { "version": "0.6.0", - "from": "aws-sign2@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "dev": true, "optional": true }, "aws4": { "version": "1.6.0", - "from": "aws4@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "dev": true, "optional": true }, "balanced-match": { "version": "0.4.2", - "from": "balanced-match@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.1", - "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "dev": true, - "optional": true + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } }, "block-stream": { "version": "0.0.9", - "from": "block-stream@*", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "dev": true + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } }, "boom": { "version": "2.10.1", - "from": "boom@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "dev": true + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } }, "brace-expansion": { "version": "1.1.6", - "from": "brace-expansion@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "dev": true + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } }, "buffer-shims": { "version": "1.0.0", - "from": "buffer-shims@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", "dev": true }, "caseless": { "version": "0.11.0", - "from": "caseless@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", "dev": true, "optional": true }, "chalk": { "version": "1.1.3", - "from": "chalk@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true + "optional": 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" + } }, "code-point-at": { "version": "1.1.0", - "from": "code-point-at@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "dev": true + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } }, "commander": { "version": "2.9.0", - "from": "commander@>=2.9.0 <3.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, - "optional": true + "optional": true, + "requires": { + "graceful-readlink": "1.0.1" + } }, "concat-map": { "version": "0.0.1", - "from": "concat-map@0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-control-strings": { "version": "1.1.0", - "from": "console-control-strings@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "core-util-is": { "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, - "optional": true + "optional": true, + "requires": { + "boom": "2.10.1" + } }, "dashdash": { "version": "1.14.1", - "from": "dashdash@>=1.12.0 <2.0.0", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", - "from": "assert-plus@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, "optional": true } @@ -2311,123 +3323,161 @@ }, "debug": { "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, - "optional": true + "optional": true, + "requires": { + "ms": "0.7.1" + } }, "deep-extend": { "version": "0.4.1", - "from": "deep-extend@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=", "dev": true, "optional": true }, "delayed-stream": { "version": "1.0.0", - "from": "delayed-stream@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", - "from": "delegates@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "ecc-jsbn": { "version": "0.1.1", - "from": "ecc-jsbn@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "dev": true, - "optional": true + "optional": true, + "requires": { + "jsbn": "0.1.1" + } }, "escape-string-regexp": { "version": "1.0.5", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, "optional": true }, "extend": { "version": "3.0.0", - "from": "extend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", "dev": true, "optional": true }, "extsprintf": { "version": "1.0.2", - "from": "extsprintf@1.0.2", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", "dev": true }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true, "optional": true }, "form-data": { "version": "2.1.2", - "from": "form-data@>=2.1.1 <2.2.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", + "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=", "dev": true, - "optional": true + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.14" + } }, "fs.realpath": { "version": "1.0.0", - "from": "fs.realpath@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fstream": { "version": "1.0.10", - "from": "fstream@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", - "dev": true + "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.5.4" + } }, "fstream-ignore": { "version": "1.0.5", - "from": "fstream-ignore@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "dev": true, - "optional": true + "optional": true, + "requires": { + "fstream": "1.0.10", + "inherits": "2.0.3", + "minimatch": "3.0.3" + } }, "gauge": { "version": "2.7.3", - "from": "gauge@>=2.7.1 <2.8.0", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.3.tgz", + "integrity": "sha1-HCOFX5YvF7OtPQ3HRD8wRULt/gk=", "dev": true, - "optional": 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.0" + } }, "generate-function": { "version": "2.0.0", - "from": "generate-function@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", "dev": true, "optional": true }, "generate-object-property": { "version": "1.2.0", - "from": "generate-object-property@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, - "optional": true + "optional": true, + "requires": { + "is-property": "1.0.2" + } }, "getpass": { "version": "0.1.6", - "from": "getpass@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", + "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", "dev": true, "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", - "from": "assert-plus@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, "optional": true } @@ -2435,300 +3485,390 @@ }, "glob": { "version": "7.1.1", - "from": "glob@>=7.0.5 <8.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "dev": true + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } }, "graceful-fs": { "version": "4.1.11", - "from": "graceful-fs@>=4.1.2 <5.0.0", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true, "optional": true }, "har-validator": { "version": "2.0.6", - "from": "har-validator@>=2.0.6 <2.1.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, - "optional": true + "optional": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.9.0", + "is-my-json-valid": "2.15.0", + "pinkie-promise": "2.0.1" + } }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, - "optional": true + "optional": true, + "requires": { + "ansi-regex": "2.1.1" + } }, "has-unicode": { "version": "2.0.1", - "from": "has-unicode@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "hawk": { "version": "3.1.3", - "from": "hawk@>=3.1.3 <3.2.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, - "optional": true + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } }, "hoek": { "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, "http-signature": { "version": "1.1.1", - "from": "http-signature@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, - "optional": true + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.3.1", + "sshpk": "1.10.2" + } }, "inflight": { "version": "1.0.6", - "from": "inflight@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "dev": true + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } }, "inherits": { "version": "2.0.3", - "from": "inherits@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.4", - "from": "ini@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "dev": true + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } }, "is-my-json-valid": { "version": "2.15.0", - "from": "is-my-json-valid@>=2.12.4 <3.0.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", + "integrity": "sha1-k27do8o8IR/ZjzstPgjaQ/eykVs=", "dev": true, - "optional": true + "optional": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } }, "is-property": { "version": "1.0.2", - "from": "is-property@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true, "optional": true }, "is-typedarray": { "version": "1.0.0", - "from": "is-typedarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true, "optional": true }, "isarray": { "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true, "optional": true }, "jodid25519": { "version": "1.0.2", - "from": "jodid25519@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "dev": true, - "optional": true + "optional": true, + "requires": { + "jsbn": "0.1.1" + } }, "jsbn": { "version": "0.1.1", - "from": "jsbn@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true, "optional": true }, "json-schema": { "version": "0.2.3", - "from": "json-schema@0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true, "optional": true }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.1 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true, "optional": true }, "jsonpointer": { "version": "4.0.1", - "from": "jsonpointer@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true, "optional": true }, "jsprim": { "version": "1.3.1", - "from": "jsprim@>=1.2.2 <2.0.0", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", + "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", "dev": true, - "optional": true + "optional": true, + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + } }, "mime-db": { "version": "1.26.0", - "from": "mime-db@>=1.26.0 <1.27.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz", + "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8=", "dev": true }, "mime-types": { "version": "2.1.14", - "from": "mime-types@>=2.1.7 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz", - "dev": true + "integrity": "sha1-9+99l1g/yvO30oK2+LVnnaselO4=", + "dev": true, + "requires": { + "mime-db": "1.26.0" + } }, "minimatch": { "version": "3.0.3", - "from": "minimatch@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "dev": true + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + } }, "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "dev": true + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } }, "ms": { "version": "0.7.1", - "from": "ms@0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true, "optional": true }, "node-pre-gyp": { "version": "0.6.33", - "from": "node-pre-gyp@>=0.6.29 <0.7.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz", + "integrity": "sha1-ZArFUZj2qSWXLgwWxKwmoDTV7Mk=", "dev": true, - "optional": true + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.0.2", + "rc": "1.1.7", + "request": "2.79.0", + "rimraf": "2.5.4", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.3.0" + } }, "nopt": { "version": "3.0.6", - "from": "nopt@>=3.0.6 <3.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, - "optional": true + "optional": true, + "requires": { + "abbrev": "1.1.0" + } }, "npmlog": { "version": "4.0.2", - "from": "npmlog@>=4.0.1 <5.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", + "integrity": "sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518=", "dev": true, - "optional": 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" + } }, "number-is-nan": { "version": "1.0.1", - "from": "number-is-nan@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.8.2", - "from": "oauth-sign@>=0.8.1 <0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "from": "object-assign@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "dev": true + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } }, "path-is-absolute": { "version": "1.0.1", - "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true, "optional": true }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, - "optional": true + "optional": true, + "requires": { + "pinkie": "2.0.4" + } }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "punycode": { "version": "1.4.1", - "from": "punycode@>=1.4.1 <2.0.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true, "optional": true }, "qs": { "version": "6.3.1", - "from": "qs@>=6.3.0 <6.4.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.1.tgz", + "integrity": "sha1-kYwLO802Z5dyuvE1say0wWUe150=", "dev": true, "optional": true }, "rc": { "version": "1.1.7", - "from": "rc@>=1.1.6 <1.2.0", "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", + "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", "dev": true, "optional": true, + "requires": { + "deep-extend": "0.4.1", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, "dependencies": { "minimist": { "version": "1.2.0", - "from": "minimist@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true } @@ -2736,201 +3876,293 @@ }, "readable-stream": { "version": "2.2.2", - "from": "readable-stream@>=2.0.0 <3.0.0||>=1.1.13 <2.0.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz", + "integrity": "sha1-qeb+w8fdqF+LsbO6cChgRVb8gl4=", "dev": true, - "optional": true + "optional": 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": "0.10.31", + "util-deprecate": "1.0.2" + } }, "request": { "version": "2.79.0", - "from": "request@>=2.79.0 <3.0.0", "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, - "optional": true + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.0", + "forever-agent": "0.6.1", + "form-data": "2.1.2", + "har-validator": "2.0.6", + "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.14", + "oauth-sign": "0.8.2", + "qs": "6.3.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.4.3", + "uuid": "3.0.1" + } }, "rimraf": { "version": "2.5.4", - "from": "rimraf@>=2.5.4 <2.6.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "dev": true + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", + "dev": true, + "requires": { + "glob": "7.1.1" + } }, "semver": { "version": "5.3.0", - "from": "semver@>=5.3.0 <5.4.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "from": "set-blocking@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "from": "signal-exit@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "sntp": { "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, - "optional": true + "optional": true, + "requires": { + "hoek": "2.16.3" + } }, "sshpk": { "version": "1.10.2", - "from": "sshpk@>=1.7.0 <2.0.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.2.tgz", + "integrity": "sha1-1agEziJpVRVjjnmNviMnPeBwpfo=", "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.6", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, "dependencies": { "assert-plus": { "version": "1.0.0", - "from": "assert-plus@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, "optional": true } } }, - "string_decoder": { - "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "dev": true - }, "string-width": { "version": "1.0.2", - "from": "string-width@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "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 }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "dev": true, "optional": true }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "dev": true + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } }, "strip-json-comments": { "version": "2.0.1", - "from": "strip-json-comments@>=2.0.1 <2.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true, "optional": true }, "tar": { "version": "2.2.1", - "from": "tar@>=2.2.1 <2.3.0", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "dev": true + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.10", + "inherits": "2.0.3" + } }, "tar-pack": { "version": "3.3.0", - "from": "tar-pack@>=3.3.0 <3.4.0", "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.3.0.tgz", + "integrity": "sha1-MJMYFkGPVa/E0hd1r91nIM7kXa4=", "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.5", + "rimraf": "2.5.4", + "tar": "2.2.1", + "uid-number": "0.0.6" + }, "dependencies": { "once": { "version": "1.3.3", - "from": "once@>=1.3.3 <1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "dev": true, - "optional": true + "optional": true, + "requires": { + "wrappy": "1.0.2" + } }, "readable-stream": { "version": "2.1.5", - "from": "readable-stream@>=2.1.4 <2.2.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", "dev": true, - "optional": true + "optional": 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": "0.10.31", + "util-deprecate": "1.0.2" + } } } }, "tough-cookie": { "version": "2.3.2", - "from": "tough-cookie@>=2.3.0 <2.4.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "dev": true, - "optional": true + "optional": true, + "requires": { + "punycode": "1.4.1" + } }, "tunnel-agent": { "version": "0.4.3", - "from": "tunnel-agent@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", "dev": true, "optional": true }, "tweetnacl": { "version": "0.14.5", - "from": "tweetnacl@>=0.14.0 <0.15.0", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true, "optional": true }, "uid-number": { "version": "0.0.6", - "from": "uid-number@>=0.0.6 <0.1.0", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "dev": true, "optional": true }, "util-deprecate": { "version": "1.0.2", - "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "uuid": { "version": "3.0.1", - "from": "uuid@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", "dev": true, "optional": true }, "verror": { "version": "1.3.6", - "from": "verror@1.3.6", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "dev": true, - "optional": true + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } }, "wide-align": { "version": "1.1.0", - "from": "wide-align@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", + "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", "dev": true, - "optional": true + "optional": true, + "requires": { + "string-width": "1.0.2" + } }, "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true, "optional": true } @@ -2938,1952 +4170,2688 @@ }, "function-bind": { "version": "1.1.0", - "from": "function-bind@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", "dev": true }, "fusing": { "version": "0.2.3", - "from": "fusing@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/fusing/-/fusing-0.2.3.tgz", - "dev": true + "integrity": "sha1-0O76+YXSuv3tRK+LGFMW9uQp4ds=", + "dev": true, + "requires": { + "predefine": "0.1.2" + } }, "generate-function": { "version": "2.0.0", - "from": "generate-function@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" }, "generate-object-property": { "version": "1.2.0", - "from": "generate-object-property@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "requires": { + "is-property": "1.0.2" + } }, "getpass": { "version": "0.1.6", - "from": "getpass@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", + "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", + "requires": { + "assert-plus": "1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", - "from": "assert-plus@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" } } }, "githulk": { "version": "0.0.7", - "from": "githulk@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/githulk/-/githulk-0.0.7.tgz", + "integrity": "sha1-2Wyinw7EMRfFOOUh1mNWbqhLTv8=", "dev": true, + "requires": { + "debug": "0.7.4", + "extract-github": "0.0.5", + "mana": "0.1.41" + }, "dependencies": { "debug": { "version": "0.7.4", - "from": "debug@>=0.7.0 <0.8.0", "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", "dev": true } } }, "glob": { "version": "7.1.1", - "from": "glob@>=7.0.0 <8.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "dev": true + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } }, "glob-base": { "version": "0.3.0", - "from": "glob-base@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "dev": true + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } }, "glob-parent": { "version": "2.0.0", - "from": "glob-parent@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "dev": true + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } }, "globals": { "version": "9.16.0", - "from": "globals@>=9.0.0 <10.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.16.0.tgz", + "integrity": "sha1-Y+kDZYFx7C2fUbHTHeXiuNwB+4A=", "dev": true }, "globby": { "version": "5.0.0", - "from": "globby@>=5.0.0 <6.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "dev": true + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } }, "graceful-fs": { "version": "4.1.11", - "from": "graceful-fs@>=4.1.2 <5.0.0", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, "growl": { "version": "1.9.2", - "from": "growl@1.9.2", "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, "handlebars": { "version": "4.0.6", - "from": "handlebars@>=4.0.1 <5.0.0", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.6.tgz", + "integrity": "sha1-LORISFBTf5yXqAJtU5m5NcTtTtc=", "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.13" + }, "dependencies": { "source-map": { "version": "0.4.4", - "from": "source-map@>=0.4.4 <0.5.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "dev": true + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } } } }, "har-validator": { "version": "2.0.6", - "from": "har-validator@>=2.0.6 <2.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz" + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "requires": { + "chalk": "1.1.3", + "commander": "2.9.0", + "is-my-json-valid": "2.15.0", + "pinkie-promise": "2.0.1" + } }, "has": { "version": "1.0.1", - "from": "has@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "dev": true + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + } }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.0.0" + } }, "has-flag": { "version": "1.0.0", - "from": "has-flag@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, "hawk": { "version": "3.1.3", - "from": "hawk@>=3.1.3 <3.2.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } }, "he": { "version": "1.1.1", - "from": "he@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, "hoek": { "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "home-or-tmp": { "version": "2.0.0", - "from": "home-or-tmp@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "dev": true + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } }, "html-loader": { "version": "0.4.5", - "from": "html-loader@>=0.4.4 <0.5.0", "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz", + "integrity": "sha1-X7zYfNY6XEmn/OL+VvQl4Fcpxow=", "dev": true, + "requires": { + "es6-templates": "0.2.3", + "fastparse": "1.1.1", + "html-minifier": "3.4.1", + "loader-utils": "1.1.0", + "object-assign": "4.1.1" + }, "dependencies": { "loader-utils": { "version": "1.1.0", - "from": "loader-utils@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "dev": true + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.1.3", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } } } }, "html-minifier": { "version": "3.4.1", - "from": "html-minifier@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.4.1.tgz", - "dev": true + "integrity": "sha1-C/PFTX8RbVALeMUfxCRgOZItwlA=", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.0.9", + "commander": "2.9.0", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.0", + "relateurl": "0.2.7", + "uglify-js": "2.8.13" + } }, "http-errors": { "version": "1.5.1", - "from": "http-errors@>=1.5.0 <1.6.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz" + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", + "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", + "requires": { + "inherits": "2.0.3", + "setprototypeof": "1.0.2", + "statuses": "1.3.1" + } }, "http-signature": { "version": "1.1.1", - "from": "http-signature@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.3.1", + "sshpk": "1.10.1" + } }, "httpntlm": { "version": "1.6.1", - "from": "httpntlm@1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz" + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "requires": { + "httpreq": "0.4.22", + "underscore": "1.7.0" + } }, "httpreq": { "version": "0.4.22", - "from": "httpreq@>=0.4.22", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.22.tgz" + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.22.tgz", + "integrity": "sha1-Jwl8itleqWeRkFMMnA9muMeq+xg=" }, "https-browserify": { "version": "0.0.1", - "from": "https-browserify@0.0.1", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", "dev": true }, "iconv-lite": { "version": "0.4.13", - "from": "iconv-lite@0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" }, "ieee754": { "version": "1.1.8", - "from": "ieee754@>=1.1.4 <2.0.0", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", "dev": true }, "ignore": { "version": "3.2.6", - "from": "ignore@>=3.1.2 <4.0.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.6.tgz", + "integrity": "sha1-JujaBkS+C7TLOVFvbHnw4PT/5Iw=", "dev": true }, "imurmurhash": { "version": "0.1.4", - "from": "imurmurhash@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "indexof": { "version": "0.0.1", - "from": "indexof@0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, "inflight": { "version": "1.0.6", - "from": "inflight@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "dev": true + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } }, "inherits": { "version": "2.0.3", - "from": "inherits@2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { "version": "0.12.0", - "from": "inquirer@>=0.12.0 <0.13.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "dev": true + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.0.0", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.1.0", + "figures": "1.7.0", + "lodash": "4.17.2", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } }, "interpret": { "version": "0.6.6", - "from": "interpret@>=0.6.4 <0.7.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", + "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=", "dev": true }, "invariant": { "version": "2.2.2", - "from": "invariant@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "dev": true + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } }, "ip": { "version": "1.1.4", - "from": "ip@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.4.tgz" + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.4.tgz", + "integrity": "sha1-3oJH/++UBFGDJVD7ooSUXm4Dm/s=" }, "ipaddr.js": { "version": "1.1.1", - "from": "ipaddr.js@1.1.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.1.1.tgz", + "integrity": "sha1-x5HZX1KynBJH1d+AraObinNkcjA=" }, "is-arrow-function": { "version": "2.0.3", - "from": "is-arrow-function@>=2.0.3 <3.0.0", "resolved": "https://registry.npmjs.org/is-arrow-function/-/is-arrow-function-2.0.3.tgz", - "dev": true + "integrity": "sha1-Kb4sLY2UUIUri7r7Y1unuNjofsI=", + "dev": true, + "requires": { + "is-callable": "1.1.3" + } }, "is-binary-path": { "version": "1.0.1", - "from": "is-binary-path@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "dev": true + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.8.0" + } }, "is-boolean-object": { "version": "1.0.0", - "from": "is-boolean-object@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", "dev": true }, "is-buffer": { "version": "1.1.5", - "from": "is-buffer@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", "dev": true }, "is-callable": { "version": "1.1.3", - "from": "is-callable@>=1.1.3 <2.0.0", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", "dev": true }, "is-date-object": { "version": "1.0.1", - "from": "is-date-object@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-dotfile": { "version": "1.0.2", - "from": "is-dotfile@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", "dev": true }, "is-equal": { "version": "1.5.5", - "from": "is-equal@>=1.5.1 <2.0.0", "resolved": "https://registry.npmjs.org/is-equal/-/is-equal-1.5.5.tgz", - "dev": true + "integrity": "sha1-XoXxlX4FKIMkf+s4aWWju6Ffuz0=", + "dev": true, + "requires": { + "has": "1.0.1", + "is-arrow-function": "2.0.3", + "is-boolean-object": "1.0.0", + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-generator-function": "1.0.6", + "is-number-object": "1.0.3", + "is-regex": "1.0.4", + "is-string": "1.0.4", + "is-symbol": "1.0.1", + "object.entries": "1.0.4" + } }, "is-equal-shallow": { "version": "0.1.3", - "from": "is-equal-shallow@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "dev": true + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } }, "is-extendable": { "version": "0.1.1", - "from": "is-extendable@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-extglob": { "version": "1.0.0", - "from": "is-extglob@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, "is-finite": { "version": "1.0.2", - "from": "is-finite@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "dev": true + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } }, "is-fullwidth-code-point": { "version": "1.0.0", - "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "dev": true + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } }, "is-generator-function": { "version": "1.0.6", - "from": "is-generator-function@>=1.0.6 <2.0.0", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.6.tgz", + "integrity": "sha1-nnFlPNFf/zQcecQVFGChMdMen8Q=", "dev": true }, "is-glob": { "version": "2.0.1", - "from": "is-glob@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "dev": true + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } }, "is-my-json-valid": { "version": "2.15.0", - "from": "is-my-json-valid@>=2.12.4 <3.0.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz" + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", + "integrity": "sha1-k27do8o8IR/ZjzstPgjaQ/eykVs=", + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.0", + "xtend": "4.0.1" + } }, "is-number": { "version": "2.1.0", - "from": "is-number@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "dev": true + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.1.0" + } }, "is-number-object": { "version": "1.0.3", - "from": "is-number-object@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", "dev": true }, "is-path-cwd": { "version": "1.0.0", - "from": "is-path-cwd@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", "dev": true }, "is-path-in-cwd": { "version": "1.0.0", - "from": "is-path-in-cwd@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "dev": true + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } }, "is-path-inside": { "version": "1.0.0", - "from": "is-path-inside@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "dev": true + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } }, "is-posix-bracket": { "version": "0.1.1", - "from": "is-posix-bracket@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", "dev": true }, "is-primitive": { "version": "2.0.0", - "from": "is-primitive@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, "is-property": { "version": "1.0.2", - "from": "is-property@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, "is-regex": { "version": "1.0.4", - "from": "is-regex@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "dev": true + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } }, "is-resolvable": { "version": "1.0.0", - "from": "is-resolvable@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "dev": true + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } }, "is-string": { "version": "1.0.4", - "from": "is-string@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", "dev": true }, "is-symbol": { "version": "1.0.1", - "from": "is-symbol@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, "is-typedarray": { "version": "1.0.0", - "from": "is-typedarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "isarray": { "version": "1.0.0", - "from": "isarray@1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "1.1.2", - "from": "isexe@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=" }, "isobject": { "version": "2.1.0", - "from": "isobject@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "dev": true + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.2 <0.2.0", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul": { "version": "0.4.5", - "from": "istanbul@>=0.4.5 <0.5.0", "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.6", + "js-yaml": "3.8.2", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.2.12", + "wordwrap": "1.0.0" + }, "dependencies": { "esprima": { "version": "2.7.3", - "from": "esprima@>=2.7.0 <2.8.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "glob": { "version": "5.0.15", - "from": "glob@>=5.0.15 <6.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "dev": true + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } }, "resolve": { "version": "1.1.7", - "from": "resolve@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, "supports-color": { "version": "3.2.3", - "from": "supports-color@>=3.1.0 <4.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "dev": true + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } } } }, "jodid25519": { "version": "1.0.2", - "from": "jodid25519@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "optional": true + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "0.1.0" + } }, "js-tokens": { "version": "3.0.1", - "from": "js-tokens@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", + "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", "dev": true }, "js-yaml": { "version": "3.8.2", - "from": "js-yaml@>=3.5.1 <4.0.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.2.tgz", - "dev": true + "integrity": "sha1-AtPiwPa+qyAkjUEsNSIDgn14ZyE=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "3.1.3" + } }, "jsbn": { "version": "0.1.0", - "from": "jsbn@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", + "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", "optional": true }, "jsesc": { "version": "1.3.0", - "from": "jsesc@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, "json-loader": { "version": "0.5.4", - "from": "json-loader@>=0.5.4 <0.6.0", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz", + "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=", "dev": true }, "json-schema": { "version": "0.2.3", - "from": "json-schema@0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-stable-stringify": { "version": "1.0.1", - "from": "json-stable-stringify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "dev": true + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.1 <5.1.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { "version": "3.3.2", - "from": "json3@3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, "json5": { "version": "0.5.1", - "from": "json5@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, "jsonify": { "version": "0.0.0", - "from": "jsonify@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, "jsonpointer": { "version": "4.0.0", - "from": "jsonpointer@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.0.tgz" + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.0.tgz", + "integrity": "sha1-ZmHhYdL8RF8Z+YQwIxNDci4fy9U=" }, "jsprim": { "version": "1.3.1", - "from": "jsprim@>=1.2.2 <2.0.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz" + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", + "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + } }, "jsx-ast-utils": { "version": "1.4.0", - "from": "jsx-ast-utils@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.0.tgz", - "dev": true + "integrity": "sha1-Wv44ho9WvIzHrq7wEAuox1vRJZE=", + "dev": true, + "requires": { + "object-assign": "4.1.1" + } }, "kind-of": { "version": "3.1.0", - "from": "kind-of@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz", - "dev": true + "integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } }, "kuler": { "version": "0.0.0", - "from": "kuler@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-0.0.0.tgz", - "dev": true + "integrity": "sha1-tmu0a5NOVQ9Z2BiEjgq7pPf1VTw=", + "dev": true, + "requires": { + "colornames": "0.0.2" + } }, "lazy-cache": { "version": "1.0.4", - "from": "lazy-cache@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, "levn": { "version": "0.3.0", - "from": "levn@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "dev": true + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } }, "libbase64": { "version": "0.1.0", - "from": "libbase64@0.1.0", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz" + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", + "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=" }, "libmime": { "version": "2.1.0", - "from": "libmime@2.1.0", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz" + "resolved": "https://registry.npmjs.org/libmime/-/libmime-2.1.0.tgz", + "integrity": "sha1-Ubx23iKDFh65BRxLyArtcT5P0c0=", + "requires": { + "iconv-lite": "0.4.13", + "libbase64": "0.1.0", + "libqp": "1.1.0" + } }, "libqp": { "version": "1.1.0", - "from": "libqp@1.1.0", - "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" }, "licenses": { "version": "0.0.20", - "from": "licenses@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/licenses/-/licenses-0.0.20.tgz", + "integrity": "sha1-8YpXsmp46vKKhz4qN4oz6B9Z0TY=", "dev": true, + "requires": { + "async": "0.6.2", + "debug": "0.8.1", + "fusing": "0.2.3", + "githulk": "0.0.7", + "npm-registry": "0.1.13" + }, "dependencies": { "async": { "version": "0.6.2", - "from": "async@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/async/-/async-0.6.2.tgz", + "integrity": "sha1-Qf0DijgSwKi8GELs8IumPrA5K+8=", "dev": true }, "debug": { "version": "0.8.1", - "from": "debug@0.8.x", "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", "dev": true } } }, "loader-utils": { "version": "0.2.17", - "from": "loader-utils@>=0.2.16 <0.3.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "dev": true + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.1.3", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } }, "lodash": { "version": "4.17.2", - "from": "lodash@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz", + "integrity": "sha1-NKMFW6vgTOQkZ7YH1wAHLH/2v0I=" }, "lodash._baseassign": { "version": "3.2.0", - "from": "lodash._baseassign@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "dev": true + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } }, "lodash._basecopy": { "version": "3.0.1", - "from": "lodash._basecopy@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", "dev": true }, "lodash._basecreate": { "version": "3.0.3", - "from": "lodash._basecreate@>=3.0.0 <4.0.0", "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", - "from": "lodash._getnative@>=3.0.0 <4.0.0", "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", - "from": "lodash._isiterateecall@>=3.0.0 <4.0.0", "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", - "from": "lodash.assign@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, "lodash.cond": { "version": "4.5.2", - "from": "lodash.cond@>=4.3.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, "lodash.create": { "version": "3.1.1", - "from": "lodash.create@3.1.1", "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "dev": true + "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.endswith": { "version": "4.2.1", - "from": "lodash.endswith@>=4.0.1 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", + "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=", "dev": true }, "lodash.find": { "version": "4.6.0", - "from": "lodash.find@>=4.3.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", "dev": true }, "lodash.findindex": { "version": "4.6.0", - "from": "lodash.findindex@>=4.3.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", + "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=", "dev": true }, "lodash.isarguments": { "version": "3.1.0", - "from": "lodash.isarguments@>=3.0.0 <4.0.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", - "from": "lodash.isarray@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, "lodash.keys": { "version": "3.1.2", - "from": "lodash.keys@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "dev": true + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } }, "lodash.pickby": { "version": "4.6.0", - "from": "lodash.pickby@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=", "dev": true }, "lolex": { "version": "1.3.2", - "from": "lolex@1.3.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", "dev": true }, "longest": { "version": "1.0.1", - "from": "longest@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, "loose-envify": { "version": "1.3.1", - "from": "loose-envify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "dev": true + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.1" + } }, "lower-case": { "version": "1.1.4", - "from": "lower-case@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", "dev": true }, "mailcomposer": { "version": "3.12.0", - "from": "mailcomposer@3.12.0", - "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-3.12.0.tgz" + "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-3.12.0.tgz", + "integrity": "sha1-nF4RiKqOHGLsi4a9Q0aBArY56Pk=", + "requires": { + "buildmail": "3.10.0", + "libmime": "2.1.0" + } }, "mana": { "version": "0.1.41", - "from": "mana@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/mana/-/mana-0.1.41.tgz", + "integrity": "sha1-fLE/cyGGaGVCKWNcT8Wxfib5O30=", "dev": true, + "requires": { + "assign": "0.1.7", + "back": "1.0.1", + "diagnostics": "1.0.1", + "eventemitter3": "1.2.0", + "fusing": "1.0.0", + "millisecond": "0.1.2", + "request": "2.79.0" + }, "dependencies": { "emits": { "version": "3.0.0", - "from": "emits@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/emits/-/emits-3.0.0.tgz", + "integrity": "sha1-MnUrupXhcHshlWI4Srm7ix/WL3A=", "dev": true }, "eventemitter3": { "version": "1.2.0", - "from": "eventemitter3@>=1.2.0 <1.3.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", "dev": true }, "fusing": { "version": "1.0.0", - "from": "fusing@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/fusing/-/fusing-1.0.0.tgz", - "dev": true + "integrity": "sha1-VQwV12r5Jld4qgUezkTUAAoJjUU=", + "dev": true, + "requires": { + "emits": "3.0.0", + "predefine": "0.1.2" + } } } }, "markdown-loader": { "version": "0.1.7", - "from": "markdown-loader@>=0.1.7 <0.2.0", "resolved": "https://registry.npmjs.org/markdown-loader/-/markdown-loader-0.1.7.tgz", + "integrity": "sha1-KrZhb9F2UqfL/mZUB4G1Xk8Z4mc=", "dev": true, + "requires": { + "loader-utils": "0.2.17", + "marked": "0.3.6", + "object-assign": "2.1.1" + }, "dependencies": { "object-assign": { "version": "2.1.1", - "from": "object-assign@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", "dev": true } } }, "marked": { "version": "0.3.6", - "from": "marked@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", "dev": true }, "md5-file": { "version": "3.1.1", - "from": "md5-file@latest", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.1.1.tgz" + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.1.1.tgz", + "integrity": "sha1-2zySwJu9pcLeiD+lSQ3XEf3burk=" }, "media-typer": { "version": "0.3.0", - "from": "media-typer@0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memory-fs": { "version": "0.3.0", - "from": "memory-fs@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "dev": true + "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", + "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.2.6" + } }, "merge-descriptors": { "version": "1.0.1", - "from": "merge-descriptors@1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "methods": { "version": "1.1.2", - "from": "methods@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "2.3.11", - "from": "micromatch@>=2.1.5 <3.0.0", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "dev": true + "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.0", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.1.0", + "normalize-path": "2.0.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + } }, "millisecond": { "version": "0.1.2", - "from": "millisecond@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/millisecond/-/millisecond-0.1.2.tgz", + "integrity": "sha1-bMWtOGJByrjniv+WT4cCjuyS2sU=", "dev": true }, "mime": { "version": "1.3.4", - "from": "mime@1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" }, "mime-db": { "version": "1.25.0", - "from": "mime-db@>=1.25.0 <1.26.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz" + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz", + "integrity": "sha1-wY29fHOl2/b0SgJNwNFloeexw5I=" }, "mime-types": { "version": "2.1.13", - "from": "mime-types@>=2.1.7 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz" + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz", + "integrity": "sha1-4HqqnGxrmnyjASxpADrSWjnpKog=", + "requires": { + "mime-db": "1.25.0" + } }, "minimatch": { "version": "3.0.3", - "from": "minimatch@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "dev": true + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + } }, "minimist": { "version": "0.0.8", - "from": "minimist@0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "dev": true + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } }, "mocha": { "version": "3.2.0", - "from": "mocha@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.2.0.tgz", + "integrity": "sha1-fcT0XlCIB1FxpoiWgU5q6et6heM=", "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.5", + "glob": "7.0.5", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, "dependencies": { "glob": { "version": "7.0.5", - "from": "glob@7.0.5", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "dev": true + "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } }, "supports-color": { "version": "3.1.2", - "from": "supports-color@3.1.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "dev": true + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } } } }, "ms": { "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" }, "mute-stream": { "version": "0.0.5", - "from": "mute-stream@0.0.5", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, "nan": { "version": "2.3.5", - "from": "nan@2.3.5", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz" + "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz", + "integrity": "sha1-gioNwmYpDOTNOhIoLKPn42Rmigg=" }, "ncname": { "version": "1.0.0", - "from": "ncname@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "dev": true + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } }, "negotiator": { "version": "0.6.1", - "from": "negotiator@0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "no-case": { "version": "2.3.1", - "from": "no-case@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", - "dev": true + "integrity": "sha1-euuhxzpSGEJlVUt9wDuvcg34AIE=", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } }, "node-libs-browser": { "version": "0.7.0", - "from": "node-libs-browser@>=0.7.0 <0.8.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", - "dev": true + "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.1.4", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.3.0", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "0.0.1", + "os-browserify": "0.2.1", + "path-browserify": "0.0.0", + "process": "0.11.9", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.2.6", + "stream-browserify": "2.0.1", + "stream-http": "2.6.3", + "string_decoder": "0.10.31", + "timers-browserify": "2.0.2", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + } }, "nodemailer": { "version": "2.6.4", - "from": "nodemailer@>=2.6.4 <3.0.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.6.4.tgz" + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.6.4.tgz", + "integrity": "sha1-ViBwfFX6xnS24uXkJXCLmtXGttY=", + "requires": { + "libmime": "2.1.0", + "mailcomposer": "3.12.0", + "nodemailer-direct-transport": "3.3.2", + "nodemailer-shared": "1.1.0", + "nodemailer-smtp-pool": "2.8.2", + "nodemailer-smtp-transport": "2.7.2", + "socks": "1.1.9" + } }, "nodemailer-direct-transport": { "version": "3.3.2", - "from": "nodemailer-direct-transport@3.3.2", - "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz" + "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", + "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", + "requires": { + "nodemailer-shared": "1.1.0", + "smtp-connection": "2.12.0" + } }, "nodemailer-fetch": { "version": "1.6.0", - "from": "nodemailer-fetch@1.6.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz" + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=" }, "nodemailer-shared": { "version": "1.1.0", - "from": "nodemailer-shared@1.1.0", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "requires": { + "nodemailer-fetch": "1.6.0" + } }, "nodemailer-smtp-pool": { "version": "2.8.2", - "from": "nodemailer-smtp-pool@2.8.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz" + "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", + "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } }, "nodemailer-smtp-transport": { "version": "2.7.2", - "from": "nodemailer-smtp-transport@2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz" + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", + "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } }, "nodemailer-wellknown": { "version": "0.1.10", - "from": "nodemailer-wellknown@0.1.10", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz" + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=" }, "nopt": { "version": "3.0.6", - "from": "nopt@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "dev": true + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } }, "normalize-path": { "version": "2.0.1", - "from": "normalize-path@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", + "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", "dev": true }, "npm-registry": { "version": "0.1.13", - "from": "npm-registry@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/npm-registry/-/npm-registry-0.1.13.tgz", + "integrity": "sha1-nl2LL9/Bq1mQ1H99674jHXmp6CI=", "dev": true, + "requires": { + "debug": "0.8.1", + "extract-github": "0.0.5", + "licenses": "0.0.20", + "mana": "0.1.41", + "semver": "2.2.1" + }, "dependencies": { "debug": { "version": "0.8.1", - "from": "debug@0.8.x", "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", "dev": true }, "semver": { "version": "2.2.1", - "from": "semver@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz", + "integrity": "sha1-eUEYKz/8xYC/8cF5QqzfeVHA0hM=", "dev": true } } }, "number-is-nan": { "version": "1.0.1", - "from": "number-is-nan@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.8.2", - "from": "oauth-sign@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { "version": "4.1.1", - "from": "object-assign@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-inspect": { "version": "1.2.1", - "from": "object-inspect@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.2.1.tgz", + "integrity": "sha1-O2Iibrj21EF1HH2PIqIP+ArJ3D8=", "dev": true }, "object-keys": { "version": "1.0.11", - "from": "object-keys@>=1.0.9 <2.0.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", "dev": true }, "object.entries": { "version": "1.0.4", - "from": "object.entries@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "dev": true + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.7.0", + "function-bind": "1.1.0", + "has": "1.0.1" + } }, "object.omit": { "version": "2.0.1", - "from": "object.omit@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "dev": true + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } }, "on-finished": { "version": "2.3.0", - "from": "on-finished@>=2.3.0 <2.4.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } }, "once": { "version": "1.4.0", - "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "dev": true + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } }, "onetime": { "version": "1.1.0", - "from": "onetime@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + }, "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true } } }, "optionator": { "version": "0.8.2", - "from": "optionator@>=0.8.1 <0.9.0", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "dev": true + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } }, "os-browserify": { "version": "0.2.1", - "from": "os-browserify@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", "dev": true }, "os-homedir": { "version": "1.0.2", - "from": "os-homedir@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { "version": "1.0.2", - "from": "os-tmpdir@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "output-file-sync": { "version": "1.1.2", - "from": "output-file-sync@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "dev": true + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } }, "pako": { "version": "0.2.9", - "from": "pako@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", "dev": true }, "param-case": { "version": "2.1.0", - "from": "param-case@>=2.1.0 <2.2.0", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.0.tgz", - "dev": true + "integrity": "sha1-Jhn5D9bIKe0LlY8chO0Dp0Wm1wo=", + "dev": true, + "requires": { + "no-case": "2.3.1" + } }, "parse-glob": { "version": "3.0.4", - "from": "parse-glob@>=3.0.4 <4.0.0", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "dev": true + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.2", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } }, "parseurl": { "version": "1.3.1", - "from": "parseurl@>=1.3.1 <1.4.0", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" }, "path-browserify": { "version": "0.0.0", - "from": "path-browserify@0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, "path-exists": { "version": "2.1.0", - "from": "path-exists@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "dev": true + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } }, "path-is-absolute": { "version": "1.0.1", - "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-is-inside": { "version": "1.0.2", - "from": "path-is-inside@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, "path-parse": { "version": "1.0.5", - "from": "path-parse@>=1.0.5 <2.0.0", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, "path-to-regexp": { "version": "0.1.7", - "from": "path-to-regexp@0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "pbkdf2-compat": { "version": "2.0.1", - "from": "pbkdf2-compat@2.0.1", "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", + "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=", "dev": true }, "pem": { "version": "1.8.3", - "from": "pem@>=1.8.3 <2.0.0", - "resolved": "https://registry.npmjs.org/pem/-/pem-1.8.3.tgz" + "resolved": "https://registry.npmjs.org/pem/-/pem-1.8.3.tgz", + "integrity": "sha1-54/GVGlpjH6F5NYt0QGJJu2J870=", + "requires": { + "os-tmpdir": "1.0.2", + "which": "1.2.12" + } }, "pify": { "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pinkie": { "version": "2.0.4", - "from": "pinkie@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", - "from": "pinkie-promise@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } }, "pkg-dir": { "version": "1.0.0", - "from": "pkg-dir@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "dev": true + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } }, "pkg-up": { "version": "1.0.0", - "from": "pkg-up@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "dev": true + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } }, "pluralize": { "version": "1.2.1", - "from": "pluralize@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, "predefine": { "version": "0.1.2", - "from": "predefine@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/predefine/-/predefine-0.1.2.tgz", - "dev": true + "integrity": "sha1-KqkrRJa8H4VU5DpF92v75Q0z038=", + "dev": true, + "requires": { + "extendible": "0.1.1" + } }, "prelude-ls": { "version": "1.1.2", - "from": "prelude-ls@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "preserve": { "version": "0.2.0", - "from": "preserve@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, "private": { "version": "0.1.7", - "from": "private@>=0.1.6 <0.2.0", "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", "dev": true }, "process": { "version": "0.11.9", - "from": "process@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/process/-/process-0.11.9.tgz", + "integrity": "sha1-e9WtIapiU+fahoImTx4R0RwDGME=", "dev": true }, "process-nextick-args": { "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "progress": { "version": "1.1.8", - "from": "progress@>=1.1.8 <2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, "proxy-addr": { "version": "1.1.2", - "from": "proxy-addr@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz" + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz", + "integrity": "sha1-tMxfImENlTWCTBI675089zxAujc=", + "requires": { + "forwarded": "0.1.0", + "ipaddr.js": "1.1.1" + } }, "prr": { "version": "0.0.0", - "from": "prr@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", "dev": true }, "punycode": { "version": "1.4.1", - "from": "punycode@>=1.4.1 <2.0.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "q": { "version": "1.4.1", - "from": "q@>=1.4.1 <2.0.0", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "dev": true }, "qs": { "version": "6.3.0", - "from": "qs@>=6.3.0 <6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz" + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz", + "integrity": "sha1-9AOyZPI7wBIox0ExtAfxjV6l1EI=" }, "querystring": { "version": "0.2.0", - "from": "querystring@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", - "from": "querystring-es3@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, "randomatic": { "version": "1.1.6", - "from": "randomatic@>=1.1.3 <2.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", - "dev": true + "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "kind-of": "3.1.0" + } }, "range-parser": { "version": "1.2.0", - "from": "range-parser@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { "version": "2.1.7", - "from": "raw-body@>=2.1.7 <2.2.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz" + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + } }, "readable-stream": { "version": "2.2.6", - "from": "readable-stream@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.6.tgz", - "dev": true + "integrity": "sha1-i0Ou125xSDk40SqNRsbPGgCx+BY=", + "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": "0.10.31", + "util-deprecate": "1.0.2" + } }, "readdirp": { "version": "2.1.0", - "from": "readdirp@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "dev": true + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.3", + "readable-stream": "2.2.6", + "set-immediate-shim": "1.0.1" + } }, "readline2": { "version": "1.0.1", - "from": "readline2@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "dev": true + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } }, "recast": { "version": "0.11.23", - "from": "recast@>=0.11.12 <0.12.0", "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "dev": true + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "3.1.3", + "private": "0.1.7", + "source-map": "0.5.6" + } }, "regenerate": { "version": "1.3.2", - "from": "regenerate@>=1.2.1 <2.0.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", "dev": true }, "regenerator-runtime": { "version": "0.9.6", - "from": "regenerator-runtime@>=0.9.5 <0.10.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", + "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=" }, "regenerator-transform": { "version": "0.9.8", - "from": "regenerator-transform@0.9.8", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.8.tgz", - "dev": true + "integrity": "sha1-D4i7K8A5Mt23trcxLmgHjwECbWw=", + "dev": true, + "requires": { + "babel-runtime": "6.18.0", + "babel-types": "6.23.0", + "private": "0.1.7" + } }, "regex-cache": { "version": "0.4.3", - "from": "regex-cache@>=0.4.2 <0.5.0", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "dev": true + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + } }, "regexpu-core": { "version": "2.0.0", - "from": "regexpu-core@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "dev": true + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.2", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } }, "regjsgen": { "version": "0.2.0", - "from": "regjsgen@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", "dev": true }, "regjsparser": { "version": "0.1.5", - "from": "regjsparser@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, + "requires": { + "jsesc": "0.5.0" + }, "dependencies": { "jsesc": { "version": "0.5.0", - "from": "jsesc@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } } }, "relateurl": { "version": "0.2.7", - "from": "relateurl@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, "repeat-element": { "version": "1.1.2", - "from": "repeat-element@>=1.1.2 <2.0.0", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", "dev": true }, "repeat-string": { "version": "1.6.1", - "from": "repeat-string@>=1.5.2 <2.0.0", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "repeating": { "version": "2.0.1", - "from": "repeating@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "dev": true + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } }, "request": { "version": "2.79.0", - "from": "request@>=2.74.0 <3.0.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz" + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.5.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.0", + "forever-agent": "0.6.1", + "form-data": "2.1.2", + "har-validator": "2.0.6", + "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.13", + "oauth-sign": "0.8.2", + "qs": "6.3.0", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.4.3", + "uuid": "3.0.0" + } }, "require-uncached": { "version": "1.0.3", - "from": "require-uncached@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "dev": true + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } }, "resolve": { "version": "1.3.2", - "from": "resolve@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.2.tgz", - "dev": true + "integrity": "sha1-HwRCyeDLuBNuh7kwX5MvRsfygjU=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } }, "resolve-from": { "version": "1.0.1", - "from": "resolve-from@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, "restore-cursor": { "version": "1.0.1", - "from": "restore-cursor@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "dev": true + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } }, "rewire": { "version": "2.5.2", - "from": "rewire@>=2.5.2 <3.0.0", "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", + "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", "dev": true }, "right-align": { "version": "0.1.3", - "from": "right-align@>=0.1.1 <0.2.0", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "dev": true + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } }, "rimraf": { "version": "2.6.1", - "from": "rimraf@>=2.2.8 <3.0.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "dev": true + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.1" + } }, "ripemd160": { "version": "0.2.0", - "from": "ripemd160@0.2.0", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", + "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=", "dev": true }, "run-async": { "version": "0.1.0", - "from": "run-async@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "dev": true + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } }, "rx-lite": { "version": "3.1.2", - "from": "rx-lite@>=3.1.2 <4.0.0", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, "samsam": { "version": "1.1.2", - "from": "samsam@1.1.2", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", "dev": true }, "semver": { "version": "5.3.0", - "from": "semver@>=5.1.0 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" }, "send": { "version": "0.14.1", - "from": "send@0.14.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.14.1.tgz" + "resolved": "https://registry.npmjs.org/send/-/send-0.14.1.tgz", + "integrity": "sha1-qVSYQyU5L1FTKndgdg5FlZjIn3o=", + "requires": { + "debug": "2.2.0", + "depd": "1.1.0", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.7.0", + "fresh": "0.3.0", + "http-errors": "1.5.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + } }, "serve-static": { "version": "1.11.1", - "from": "serve-static@>=1.11.1 <1.12.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz" + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz", + "integrity": "sha1-1sznaTUF9zPHWd5Xvvwa92wPCAU=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.1", + "send": "0.14.1" + } }, "set-immediate-shim": { "version": "1.0.1", - "from": "set-immediate-shim@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, "setimmediate": { "version": "1.0.5", - "from": "setimmediate@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, "setprototypeof": { "version": "1.0.2", - "from": "setprototypeof@1.0.2", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", + "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=" }, "sha.js": { "version": "2.2.6", - "from": "sha.js@2.2.6", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", + "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=", "dev": true }, "shelljs": { "version": "0.6.1", - "from": "shelljs@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", "dev": true }, "shrinkwrap": { "version": "0.4.0", - "from": "shrinkwrap@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/shrinkwrap/-/shrinkwrap-0.4.0.tgz", + "integrity": "sha1-kcSTGPxmWhS7ZDJN6CEBzQK8WbI=", "dev": true, + "requires": { + "debug": "0.8.1", + "eventemitter3": "0.1.6", + "fusing": "0.2.3", + "npm-registry": "0.1.13" + }, "dependencies": { "debug": { "version": "0.8.1", - "from": "debug@>=0.8.0 <0.9.0", "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", "dev": true } } }, "sinon": { "version": "1.17.7", - "from": "sinon@>=1.17.5 <2.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "dev": true + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": "0.10.3" + } }, "slash": { "version": "1.0.0", - "from": "slash@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, "slice-ansi": { "version": "0.0.4", - "from": "slice-ansi@0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, "smart-buffer": { "version": "1.0.11", - "from": "smart-buffer@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.0.11.tgz" + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.0.11.tgz", + "integrity": "sha1-MFAzcJio5M3wNQ/vY90UYEn/lAo=" }, "smtp-connection": { "version": "2.12.0", - "from": "smtp-connection@2.12.0", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz" + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", + "requires": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" + } }, "sntp": { "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.16.3" + } }, "socks": { "version": "1.1.9", - "from": "socks@1.1.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz" + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", + "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", + "requires": { + "ip": "1.1.4", + "smart-buffer": "1.0.11" + } }, "source-list-map": { "version": "0.1.8", - "from": "source-list-map@>=0.1.7 <0.2.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", "dev": true }, "source-map": { "version": "0.5.6", - "from": "source-map@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", "dev": true }, "source-map-support": { "version": "0.4.13", - "from": "source-map-support@>=0.4.2 <0.5.0", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.13.tgz", - "dev": true + "integrity": "sha1-l4Lm9960JNXxczJ6GHnrRkU73NQ=", + "dev": true, + "requires": { + "source-map": "0.5.6" + } }, "sprintf-js": { "version": "1.0.3", - "from": "sprintf-js@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { "version": "1.10.1", - "from": "sshpk@>=1.7.0 <2.0.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz", + "integrity": "sha1-MOGl0ykkSXShr2FREznVla9mOLA=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.0", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.6", + "jodid25519": "1.0.2", + "jsbn": "0.1.0", + "tweetnacl": "0.14.3" + }, "dependencies": { "assert-plus": { "version": "1.0.0", - "from": "assert-plus@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" } } }, "standard-error": { "version": "1.1.0", - "from": "standard-error@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz", + "integrity": "sha1-I+UWj6HAggGJ5YEnAaeQWFENDTQ=" }, "statuses": { "version": "1.3.1", - "from": "statuses@>=1.3.1 <2.0.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz" + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" }, "stream-browserify": { "version": "2.0.1", - "from": "stream-browserify@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "dev": true + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.2.6" + } }, "stream-http": { "version": "2.6.3", - "from": "stream-http@>=2.3.1 <3.0.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.6.3.tgz", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "dev": true + "integrity": "sha1-TD3b+WNZaOos/U5I1D3l3vJiWsM=", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.2.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } }, "string-width": { "version": "1.0.2", - "from": "string-width@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "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 }, "stringstream": { "version": "0.0.5", - "from": "stringstream@>=0.0.4 <0.1.0", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.0.0" + } }, "strip-json-comments": { "version": "1.0.4", - "from": "strip-json-comments@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "table": { "version": "3.8.3", - "from": "table@>=3.7.8 <4.0.0", "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, + "requires": { + "ajv": "4.11.5", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.2", + "slice-ansi": "0.0.4", + "string-width": "2.0.0" + }, "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", - "from": "is-fullwidth-code-point@>=2.0.0 <3.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.0.0", - "from": "string-width@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "dev": true + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "3.0.1" + } } } }, "tapable": { "version": "0.1.10", - "from": "tapable@>=0.1.8 <0.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", "dev": true }, "text-hex": { "version": "0.0.0", - "from": "text-hex@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-0.0.0.tgz", + "integrity": "sha1-V4+8haapJjbkLdF7QdAhjM6esrM=", "dev": true }, "text-table": { "version": "0.2.0", - "from": "text-table@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { "version": "2.3.8", - "from": "through@>=2.3.6 <3.0.0", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "timers-browserify": { "version": "2.0.2", - "from": "timers-browserify@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", - "dev": true + "integrity": "sha1-q0iDz1l9zVCvIRNJoA+8pWrIa4Y=", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } }, "tmatch": { "version": "2.0.1", - "from": "tmatch@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz", + "integrity": "sha1-DFYkbzPzDaG409colauvFmYPOM8=", "dev": true }, "to-arraybuffer": { "version": "1.0.1", - "from": "to-arraybuffer@>=1.0.0 <2.0.0", "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.2", - "from": "to-fast-properties@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", + "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", "dev": true }, "token-generator": { "version": "1.0.0", - "from": "token-generator@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/token-generator/-/token-generator-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/token-generator/-/token-generator-1.0.0.tgz", + "integrity": "sha1-eX2pzWetdMU+EFMOKHzs/4WlMFw=", + "requires": { + "debug": "2.2.0", + "findhit-class": "0.1.1", + "findhit-util": "0.2.9" + } }, "tough-cookie": { "version": "2.3.2", - "from": "tough-cookie@>=2.3.0 <2.4.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz" + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "requires": { + "punycode": "1.4.1" + } }, "trim-right": { "version": "1.0.1", - "from": "trim-right@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, "tryit": { "version": "1.0.3", - "from": "tryit@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, "tty-browserify": { "version": "0.0.0", - "from": "tty-browserify@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.4.3", - "from": "tunnel-agent@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" }, "tweetnacl": { "version": "0.14.3", - "from": "tweetnacl@>=0.14.0 <0.15.0", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz", + "integrity": "sha1-PaOC9nDyXe1417PReSEZvKC3Ey0=", "optional": true }, "type-check": { "version": "0.3.2", - "from": "type-check@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "dev": true + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } }, "type-detect": { "version": "1.0.0", - "from": "type-detect@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", "dev": true }, "type-is": { "version": "1.6.14", - "from": "type-is@>=1.6.13 <1.7.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.14.tgz" + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.14.tgz", + "integrity": "sha1-4hljnBfe0coHiQkt1UoDgmuBfLI=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.13" + } }, "typedarray": { "version": "0.0.6", - "from": "typedarray@>=0.0.6 <0.0.7", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, "uglify-js": { "version": "2.8.13", - "from": "uglify-js@>=2.8.0 <2.9.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.13.tgz", - "dev": true + "integrity": "sha1-0M3wLzxmFIT6xgG35yMge3NaN0w=", + "dev": true, + "requires": { + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } }, "uglify-to-browserify": { "version": "1.0.2", - "from": "uglify-to-browserify@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "dev": true }, "underscore": { "version": "1.7.0", - "from": "underscore@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" }, "unpipe": { "version": "1.0.0", - "from": "unpipe@1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "upper-case": { "version": "1.1.3", - "from": "upper-case@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", "dev": true }, "url": { "version": "0.11.0", - "from": "url@>=0.11.0 <0.12.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", - "from": "punycode@1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true } } }, "ursa": { "version": "0.9.4", - "from": "ursa@>=0.9.4 <0.10.0", - "resolved": "https://registry.npmjs.org/ursa/-/ursa-0.9.4.tgz" + "resolved": "https://registry.npmjs.org/ursa/-/ursa-0.9.4.tgz", + "integrity": "sha1-Ciq/t9xCZ/czsPjy/H8siV1ApBM=", + "requires": { + "bindings": "1.2.1", + "nan": "2.3.5" + } }, "user-home": { "version": "1.1.1", - "from": "user-home@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, "util": { "version": "0.10.3", - "from": "util@>=0.10.3 <1.0.0", "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", - "from": "inherits@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", - "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "utils-merge": { "version": "1.0.0", - "from": "utils-merge@1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" }, "uuid": { "version": "3.0.0", - "from": "uuid@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz" + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", + "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=" }, "v8flags": { "version": "2.0.11", - "from": "v8flags@>=2.0.10 <3.0.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz", - "dev": true + "integrity": "sha1-vKjzDw1tYGEswsAGQeaWLUKuaIE=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } }, "validator": { "version": "5.7.0", - "from": "validator@>=5.7.0 <6.0.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-5.7.0.tgz" + "resolved": "https://registry.npmjs.org/validator/-/validator-5.7.0.tgz", + "integrity": "sha1-eoelgUa2laxIYHEUHAxJ1n2gXlw=" }, "vary": { "version": "1.1.0", - "from": "vary@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz", + "integrity": "sha1-4eWv+70WrnaN0mdDlLmtMCJlMUA=" }, "verror": { "version": "1.3.6", - "from": "verror@1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "requires": { + "extsprintf": "1.0.2" + } }, "vm-browserify": { "version": "0.0.4", - "from": "vm-browserify@0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "dev": true + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } }, "watchpack": { "version": "0.2.9", - "from": "watchpack@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", + "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", "dev": true, + "requires": { + "async": "0.9.2", + "chokidar": "1.6.1", + "graceful-fs": "4.1.11" + }, "dependencies": { "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", "dev": true } } }, "webpack": { "version": "1.14.0", - "from": "webpack@>=1.13.3 <2.0.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.14.0.tgz", + "integrity": "sha1-VPH/uSBRoyilsgV9auM8KJRiyCM=", "dev": true, + "requires": { + "acorn": "3.3.0", + "async": "1.5.2", + "clone": "1.0.2", + "enhanced-resolve": "0.9.1", + "interpret": "0.6.6", + "loader-utils": "0.2.17", + "memory-fs": "0.3.0", + "mkdirp": "0.5.1", + "node-libs-browser": "0.7.0", + "optimist": "0.6.1", + "supports-color": "3.2.3", + "tapable": "0.1.10", + "uglify-js": "2.7.5", + "watchpack": "0.2.9", + "webpack-core": "0.6.9" + }, "dependencies": { "acorn": { "version": "3.3.0", - "from": "acorn@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true }, "supports-color": { "version": "3.2.3", - "from": "supports-color@^3.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "dev": true + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } }, "uglify-js": { "version": "2.7.5", - "from": "uglify-js@>=2.7.3 <2.8.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", + "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.6 <0.3.0", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", "dev": true } } @@ -4892,69 +6860,88 @@ }, "webpack-core": { "version": "0.6.9", - "from": "webpack-core@>=0.6.9 <0.7.0", "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.4.4" + }, "dependencies": { "source-map": { "version": "0.4.4", - "from": "source-map@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "dev": true + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } } } }, "webpack-node-externals": { "version": "1.5.4", - "from": "webpack-node-externals@>=1.5.4 <2.0.0", "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.5.4.tgz", + "integrity": "sha1-6gW6FxCKI+d2w1xC57sOhsIlvgA=", "dev": true }, "which": { "version": "1.2.12", - "from": "which@>=1.2.4 <2.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.12.tgz" + "resolved": "https://registry.npmjs.org/which/-/which-1.2.12.tgz", + "integrity": "sha1-3me15FAmnxlJCe8j7OTr5Bb6EZI=", + "requires": { + "isexe": "1.1.2" + } }, "window-size": { "version": "0.1.0", - "from": "window-size@0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true }, "wordwrap": { "version": "1.0.0", - "from": "wordwrap@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrappy": { "version": "1.0.2", - "from": "wrappy@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write": { "version": "0.2.1", - "from": "write@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "dev": true + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } }, "xml-char-classes": { "version": "1.0.0", - "from": "xml-char-classes@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", "dev": true }, "xtend": { "version": "4.0.1", - "from": "xtend@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "yargs": { "version": "3.10.0", - "from": "yargs@>=3.10.0 <3.11.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "dev": true + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } } } } diff --git a/package.json b/package.json old mode 100644 new mode 100755 diff --git a/src/app.js b/src/app.js old mode 100644 new mode 100755 index 2fd5c3f..68b4c3f --- a/src/app.js +++ b/src/app.js @@ -12,7 +12,7 @@ const md5File = require('md5-file') const IncomingServer = require('./incoming') const OutgoingServer = require('./outgoing') const SettingsValidator = require('./lib/SettingsValidator.js') -const NavCoin = require('./lib/NavCoin.js') +const SoftCoin = require('./lib/SoftCoin.js') const EncryptedData = require('./lib/EncryptedData.js') const RandomizeTransactions = require('./lib/RandomizeTransactions.js') const EncryptionKeys = require('./lib/EncryptionKeys.js') @@ -35,7 +35,7 @@ Logger.writeLog('SYS_001', 'Server Starting', { const app = express() -const NavtechApi = {} +const SoftnodeApi = {} if (settings) { SettingsValidator.validateSettings({ settings }, canInit) @@ -52,14 +52,14 @@ function canInit(settingsValid) { } function initServer() { - NavtechApi.navClient = new Client({ - username: settings.navCoin.user, - password: settings.navCoin.pass, - port: settings.navCoin.port, - host: settings.navCoin.host, + SoftnodeApi.softClient = new Client({ + username: settings.softCoin.user, + password: settings.softCoin.pass, + port: settings.softCoin.port, + host: settings.softCoin.host, }) - NavtechApi.subClient = new Client({ + SoftnodeApi.subClient = new Client({ username: settings.subChain.user, password: settings.subChain.pass, port: settings.subChain.port, @@ -120,7 +120,7 @@ const setupServer = () => { const apiInit = () => { app.get('/', (req, res) => { - md5File('dist/navtech.js', (err, hash) => { + md5File('dist/softnode.js', (err, hash) => { if (err) { res.send(JSON.stringify({ status: 200, @@ -142,12 +142,12 @@ const apiInit = () => { }) app.post('/api/test-decryption', (req, res) => { - NavtechApi.runtime = {} - NavtechApi.runtime.req = req - NavtechApi.runtime.res = res + SoftnodeApi.runtime = {} + SoftnodeApi.runtime.req = req + SoftnodeApi.runtime.res = res if (!req.body || !req.body.encrypted_data) { Logger.writeLog('APP_004', 'failed to receive params', { body: req.body }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_004', @@ -156,14 +156,14 @@ const apiInit = () => { return } EncryptedData.decryptData({ - encryptedData: NavtechApi.runtime.req.body.encrypted_data, - }, NavtechApi.checkDecrypted) + encryptedData: SoftnodeApi.runtime.req.body.encrypted_data, + }, SoftnodeApi.checkDecrypted) }) - NavtechApi.checkDecrypted = (success, data) => { + SoftnodeApi.checkDecrypted = (success, data) => { if (!success || !data || !data.decrypted) { - Logger.writeLog('APP_005', 'unable to derypt the data', { success, data, body: NavtechApi.runtime.req.body }) - NavtechApi.runtime.res.send(JSON.stringify({ + Logger.writeLog('APP_005', 'unable to derypt the data', { success, data, body: SoftnodeApi.runtime.req.body }) + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_005', @@ -171,73 +171,73 @@ const apiInit = () => { })) return } - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'SUCCESS', message: 'decryption test successful', })) } - // ----------- GET NAV ADDRESSES --------------------------------------------------------------------------------------------------------- + // ----------- GET SOFT ADDRESSES --------------------------------------------------------------------------------------------------------- app.post('/api/get-addresses', (req, res) => { - NavtechApi.runtime = {} - NavtechApi.runtime.req = req - NavtechApi.runtime.res = res - - if (!NavtechApi.runtime.req.body || - !NavtechApi.runtime.req.body.num_addresses || - !NavtechApi.runtime.req.body.type || - !NavtechApi.runtime.req.body.account) { + SoftnodeApi.runtime = {} + SoftnodeApi.runtime.req = req + SoftnodeApi.runtime.res = res + + if (!SoftnodeApi.runtime.req.body || + !SoftnodeApi.runtime.req.body.num_addresses || + !SoftnodeApi.runtime.req.body.type || + !SoftnodeApi.runtime.req.body.account) { Logger.writeLog('APP_006', 'failed to receive params', { body: req.body }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_006', message: 'ERROR: invalid params', - body: NavtechApi.runtime.req.body, + body: SoftnodeApi.runtime.req.body, })) return } - NavtechApi.runtime.accountToUse = privateSettings.account[NavtechApi.runtime.req.body.account] + SoftnodeApi.runtime.accountToUse = privateSettings.account[SoftnodeApi.runtime.req.body.account] - if (!NavtechApi.runtime.accountToUse) { - NavtechApi.runtime.res.send(JSON.stringify({ + if (!SoftnodeApi.runtime.accountToUse) { + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_006A', message: 'ERROR: invalid account', - body: NavtechApi.runtime.req.body, + body: SoftnodeApi.runtime.req.body, })) } if (globalSettings.serverType === 'OUTGOING') { - NavtechApi.checkIpAddress({ allowedIps: settings.remote }, NavtechApi.getAddresses) + SoftnodeApi.checkIpAddress({ allowedIps: settings.remote }, SoftnodeApi.getAddresses) return } - NavtechApi.getAddresses() + SoftnodeApi.getAddresses() }) - NavtechApi.getAddresses = () => { - NavtechApi.runtime.numAddresses = parseInt(NavtechApi.runtime.req.body.num_addresses, 10) - if (NavtechApi.runtime.req.body.type === 'SUBCHAIN') { - NavtechApi.runtime.clientToUse = NavtechApi.subClient + SoftnodeApi.getAddresses = () => { + SoftnodeApi.runtime.numAddresses = parseInt(SoftnodeApi.runtime.req.body.num_addresses, 10) + if (SoftnodeApi.runtime.req.body.type === 'SUBCHAIN') { + SoftnodeApi.runtime.clientToUse = SoftnodeApi.subClient } else { - NavtechApi.runtime.clientToUse = NavtechApi.navClient + SoftnodeApi.runtime.clientToUse = SoftnodeApi.softClient } RandomizeTransactions.getRandomAccountAddresses({ - client: NavtechApi.runtime.clientToUse, - accountName: NavtechApi.runtime.accountToUse, - numAddresses: NavtechApi.runtime.numAddresses, - }, NavtechApi.returnAddresses) + client: SoftnodeApi.runtime.clientToUse, + accountName: SoftnodeApi.runtime.accountToUse, + numAddresses: SoftnodeApi.runtime.numAddresses, + }, SoftnodeApi.returnAddresses) } - NavtechApi.returnAddresses = (success, data) => { + SoftnodeApi.returnAddresses = (success, data) => { if (!success || !data || !data.pickedAddresses) { Logger.writeLog('APP_008', 'failed to pick random addresses', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_008', @@ -246,7 +246,7 @@ const apiInit = () => { return } // Logger.writeLog('APP_TEST_001', 'success get-addresses', { data }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'SUCCESS', data: { @@ -255,37 +255,37 @@ const apiInit = () => { })) } - // ----------- GET NAV BALANCE ----------------------------------------------------------------------------------------------------------- + // ----------- GET SOFT BALANCE ----------------------------------------------------------------------------------------------------------- - app.get('/api/get-nav-balance', (req, res) => { - NavtechApi.runtime = {} - NavtechApi.runtime.req = req - NavtechApi.runtime.res = res + app.get('/api/get-soft-balance', (req, res) => { + SoftnodeApi.runtime = {} + SoftnodeApi.runtime.req = req + SoftnodeApi.runtime.res = res - NavtechApi.navClient.getBalance().then((navBalance) => { - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.softClient.getBalance().then((softBalance) => { + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'SUCCESS', data: { - nav_balance: navBalance, + soft_balance: softBalance, }, })) }) .catch((err) => { - Logger.writeLog('APP_009', 'failed to get the NAV balance', { error: err }) - NavtechApi.runtime.res.send(JSON.stringify({ + Logger.writeLog('APP_009', 'failed to get the SOFT balance', { error: err }) + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_009', - message: 'failed to get the NAV balance', + message: 'failed to get the SOFT balance', })) }) }) // ------------------ CHECK AUTHORIZED IP ------------------------------------------- - NavtechApi.checkIpAddress = (options, callback) => { - const remoteIpAddress = NavtechApi.runtime.req.connection.remoteAddress || NavtechApi.runtime.req.socket.remoteAddress + SoftnodeApi.checkIpAddress = (options, callback) => { + const remoteIpAddress = SoftnodeApi.runtime.req.connection.remoteAddress || SoftnodeApi.runtime.req.socket.remoteAddress let authorized = false for (let i = 0; i < options.allowedIps.length; i++) { if (remoteIpAddress === options.allowedIps[i].ipAddress || remoteIpAddress === '::ffff:' + options.allowedIps[i].ipAddress) { @@ -297,7 +297,7 @@ const apiInit = () => { callback() } else { Logger.writeLog('APP_025', 'unauthorized access attempt', { remoteIpAddress, remote: options.allowedIps }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_025', @@ -309,14 +309,14 @@ const apiInit = () => { // ------------------ CHECK NODE --------------------------------------------------------------------------------------------------------- app.post('/api/check-node', (req, res) => { - NavtechApi.runtime = {} - NavtechApi.runtime.req = req - NavtechApi.runtime.res = res + SoftnodeApi.runtime = {} + SoftnodeApi.runtime.req = req + SoftnodeApi.runtime.res = res - if (!NavtechApi.runtime.req.body || !NavtechApi.runtime.req.body.num_addresses) { + if (!SoftnodeApi.runtime.req.body || !SoftnodeApi.runtime.req.body.num_addresses) { Logger.writeLog('APP_026', 'failed to receive params', { body: req.body }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_026', @@ -328,7 +328,7 @@ const apiInit = () => { if (globalSettings.serverType === 'INCOMING' && IncomingServer.paused || globalSettings.serverType === 'OUTGOING' && OutgoingServer.paused) { Logger.writeLog('APP_026A', 'this server is paused for manual recovery', { body: req.body }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_026A', @@ -337,49 +337,49 @@ const apiInit = () => { return } - NavtechApi.runtime.numAddresses = parseInt(NavtechApi.runtime.req.body.num_addresses, 10) + SoftnodeApi.runtime.numAddresses = parseInt(SoftnodeApi.runtime.req.body.num_addresses, 10) if (globalSettings.serverType === 'INCOMING') { if (globalSettings.maintenance) { - NavtechApi.checkIpAddress({ allowedIps: globalSettings.allowedIps }, NavtechApi.checkNavBlocks) + SoftnodeApi.checkIpAddress({ allowedIps: globalSettings.allowedIps }, SoftnodeApi.checkSoftBlocks) return } - NavtechApi.checkNavBlocks() + SoftnodeApi.checkSoftBlocks() return } - NavtechApi.checkIpAddress({ allowedIps: settings.remote }, NavtechApi.checkNavBlocks) + SoftnodeApi.checkIpAddress({ allowedIps: settings.remote }, SoftnodeApi.checkSoftBlocks) return }) - NavtechApi.checkNavBlocks = () => { - NavCoin.checkBlockHeight({ - client: NavtechApi.navClient, + SoftnodeApi.checkSoftBlocks = () => { + SoftCoin.checkBlockHeight({ + client: SoftnodeApi.softClient, blockThreshold: privateSettings.blockThreshold.checking }, - NavtechApi.navBlocksChecked) + SoftnodeApi.softBlocksChecked) } - NavtechApi.navBlocksChecked = (success, data) => { + SoftnodeApi.softBlocksChecked = (success, data) => { if (!success || !data) { - Logger.writeLog('APP_027', 'navClient block check failed', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + Logger.writeLog('APP_027', 'softClient block check failed', { success, data }) + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_027', - message: 'navClient block check failed', + message: 'softClient block check failed', })) return } - NavtechApi.runtime.navBalance = data.balance - NavCoin.checkBlockHeight({ - client: NavtechApi.subClient, + SoftnodeApi.runtime.softBalance = data.balance + SoftCoin.checkBlockHeight({ + client: SoftnodeApi.subClient, blockThreshold: privateSettings.blockThreshold.checking, - }, NavtechApi.subBlocksChecked) + }, SoftnodeApi.subBlocksChecked) } - NavtechApi.subBlocksChecked = (success, data) => { + SoftnodeApi.subBlocksChecked = (success, data) => { if (!success || !data) { Logger.writeLog('APP_028', 'subClient block check failed', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_028', @@ -387,28 +387,28 @@ const apiInit = () => { })) return } - NavtechApi.runtime.subBalance = data.balance - NavCoin.unlockWallet({ settings, client: NavtechApi.navClient, type: 'navCoin' }, NavtechApi.unlockSubchain) + SoftnodeApi.runtime.subBalance = data.balance + SoftCoin.unlockWallet({ settings, client: SoftnodeApi.softClient, type: 'softCoin' }, SoftnodeApi.unlockSubchain) } - NavtechApi.unlockSubchain = (success, data) => { + SoftnodeApi.unlockSubchain = (success, data) => { if (!success) { - Logger.writeLog('APP_029', 'navClient failed to unlock', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + Logger.writeLog('APP_029', 'softClient failed to unlock', { success, data }) + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_029', - message: 'navClient failed to unlock', + message: 'softClient failed to unlock', })) return } - NavCoin.unlockWallet({ settings, client: NavtechApi.subClient, type: 'subChain' }, NavtechApi.getUnspent) + SoftCoin.unlockWallet({ settings, client: SoftnodeApi.subClient, type: 'subChain' }, SoftnodeApi.getUnspent) } - NavtechApi.getUnspent = (success, data) => { + SoftnodeApi.getUnspent = (success, data) => { if (!success) { Logger.writeLog('APP_030', 'subClient failed to unlock', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_030', @@ -418,37 +418,37 @@ const apiInit = () => { } if (globalSettings.serverType === 'OUTGOING') { - EncryptionKeys.getEncryptionKeys({}, NavtechApi.testKeyPair) + EncryptionKeys.getEncryptionKeys({}, SoftnodeApi.testKeyPair) return } - NavtechApi.navClient.listUnspent().then((unspent) => { + SoftnodeApi.softClient.listUnspent().then((unspent) => { if (unspent.length < 1) { - EncryptionKeys.getEncryptionKeys({}, NavtechApi.testKeyPair) + EncryptionKeys.getEncryptionKeys({}, SoftnodeApi.testKeyPair) return } - NavCoin.filterUnspent({ + SoftCoin.filterUnspent({ unspent, - client: NavtechApi.navClient, + client: SoftnodeApi.softClient, accountName: privateSettings.account[globalSettings.serverType], }, - NavtechApi.processFiltered) + SoftnodeApi.processFiltered) }).catch((err) => { - Logger.writeLog('APP_030A', 'failed to get unspent from the navClient', { error: err }) - NavtechApi.runtime.res.send(JSON.stringify({ + Logger.writeLog('APP_030A', 'failed to get unspent from the softClient', { error: err }) + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_030A', - message: 'failed to get unspent from the navClient', + message: 'failed to get unspent from the softClient', })) return }) } - NavtechApi.processFiltered = (success, data) => { + SoftnodeApi.processFiltered = (success, data) => { if (!success) { Logger.writeLog('APP_030C', 'failed to filter the unspent', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_030C', @@ -467,7 +467,7 @@ const apiInit = () => { } if (highestConf > privateSettings.maxQueue) { Logger.writeLog('APP_030B', 'the queue is too long', { highestConf }, true) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_030B', @@ -476,14 +476,14 @@ const apiInit = () => { return } } - EncryptionKeys.getEncryptionKeys({}, NavtechApi.testKeyPair) + EncryptionKeys.getEncryptionKeys({}, SoftnodeApi.testKeyPair) } - NavtechApi.testKeyPair = (success, data) => { + SoftnodeApi.testKeyPair = (success, data) => { if (!success || !data || !data.privKeyFile || !data.pubKeyFile) { Logger.writeLog('APP_031', 'failed to get the current keys', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_031', @@ -495,13 +495,13 @@ const apiInit = () => { EncryptionKeys.testKeyPair({ pubKeyFile: data.pubKeyFile, privKeyFile: data.privKeyFile, - }, NavtechApi.testedKeypair) + }, SoftnodeApi.testedKeypair) } - NavtechApi.testedKeypair = (success, data) => { + SoftnodeApi.testedKeypair = (success, data) => { if (!success || !data || !data.publicKey) { Logger.writeLog('APP_032', 'failed to encrypt with selected keypair', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_032', @@ -510,34 +510,34 @@ const apiInit = () => { return } - NavtechApi.runtime.publicKey = data.publicKey + SoftnodeApi.runtime.publicKey = data.publicKey RandomizeTransactions.getRandomAccountAddresses({ - client: NavtechApi.navClient, + client: SoftnodeApi.softClient, accountName: privateSettings.account[globalSettings.serverType], - numAddresses: NavtechApi.runtime.numAddresses, - }, NavtechApi.hasRandomAddresses) + numAddresses: SoftnodeApi.runtime.numAddresses, + }, SoftnodeApi.hasRandomAddresses) } - NavtechApi.hasRandomAddresses = (success, data) => { + SoftnodeApi.hasRandomAddresses = (success, data) => { if (!success || !data || !data.pickedAddresses) { - Logger.writeLog('APP_033', 'failed to retrieve nav addresses', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + Logger.writeLog('APP_033', 'failed to retrieve soft addresses', { success, data }) + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_033', - message: 'failed to retrieve nav addresses', + message: 'failed to retrieve soft addresses', })) return } - NavtechApi.runtime.navAddresses = data.pickedAddresses - NavtechApi.getHash() + SoftnodeApi.runtime.softAddresses = data.pickedAddresses + SoftnodeApi.getHash() } - NavtechApi.hasRandomSubAddresses = (success, data) => { + SoftnodeApi.hasRandomSubAddresses = (success, data) => { if (!success || !data || !data.pickedAddresses) { Logger.writeLog('APP_034', 'failed to retrieve subchain addresses', { success, data }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAIL', code: 'APP_034', @@ -545,15 +545,15 @@ const apiInit = () => { })) return } - NavtechApi.runtime.subAddresses = data.pickedAddresses - NavtechApi.getHash() + SoftnodeApi.runtime.subAddresses = data.pickedAddresses + SoftnodeApi.getHash() } - NavtechApi.getHash = () => { - md5File('dist/navtech.js', (err, hash) => { + SoftnodeApi.getHash = () => { + md5File('dist/softnode.js', (err, hash) => { if (err) { Logger.writeLog('APP_035A', 'error generating md5 hash', { err, hash }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'FAILURE', message: 'error generating md5 hash', @@ -562,17 +562,17 @@ const apiInit = () => { })) return } - NavtechApi.returnCheckedNode(hash) + SoftnodeApi.returnCheckedNode(hash) }) } - NavtechApi.returnCheckedNode = (hash) => { + SoftnodeApi.returnCheckedNode = (hash) => { const localHost = settings.local.host ? settings.local.host : settings.local.ipAddress const returnData = { - nav_balance: NavtechApi.runtime.navBalance, - sub_balance: NavtechApi.runtime.subBalance, - public_key: NavtechApi.runtime.publicKey, + soft_balance: SoftnodeApi.runtime.softBalance, + sub_balance: SoftnodeApi.runtime.subBalance, + public_key: SoftnodeApi.runtime.publicKey, server_type: globalSettings.serverType, min_amount: settings.minAmount, max_amount: settings.maxAmount, @@ -582,14 +582,14 @@ const apiInit = () => { md5: hash, } - returnData.nav_addresses = NavtechApi.runtime.navAddresses + returnData.soft_addresses = SoftnodeApi.runtime.softAddresses // Logger.writeLog('APP_TEST_002', 'success check-node', { // returnData, - // request: NavtechApi.runtime.req.body, + // request: SoftnodeApi.runtime.req.body, // }) - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'SUCCESS', data: returnData, @@ -601,16 +601,16 @@ const apiInit = () => { // -------------- CHECK IF SERVER IS PROCESSING ------------------------------------------------------------------------------------------ app.get('/api/status', (req, res) => { - NavtechApi.runtime = {} - NavtechApi.runtime.req = req - NavtechApi.runtime.res = res + SoftnodeApi.runtime = {} + SoftnodeApi.runtime.req = req + SoftnodeApi.runtime.res = res if (globalSettings.serverType === 'INCOMING') { const now = new Date() const diff = now - IncomingServer.runtime.cycleStart const timeRemaining = settings.scriptInterval - diff - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'SUCCESS', data: { @@ -624,7 +624,7 @@ const apiInit = () => { const diff = now - OutgoingServer.runtime.cycleStart const timeRemaining = settings.scriptInterval - diff - NavtechApi.runtime.res.send(JSON.stringify({ + SoftnodeApi.runtime.res.send(JSON.stringify({ status: 200, type: 'SUCCESS', data: { diff --git a/src/incoming.js b/src/incoming.js old mode 100644 new mode 100755 index 4d30ba9..f246a0a --- a/src/incoming.js +++ b/src/incoming.js @@ -26,11 +26,11 @@ const IncomingServer = { } IncomingServer.init = () => { - IncomingServer.navClient = new Client({ - username: settings.navCoin.user, - password: settings.navCoin.pass, - port: settings.navCoin.port, - host: settings.navCoin.host, + IncomingServer.softClient = new Client({ + username: settings.softCoin.user, + password: settings.softCoin.pass, + port: settings.softCoin.port, + host: settings.softCoin.host, }) IncomingServer.subClient = new Client({ @@ -61,7 +61,7 @@ IncomingServer.startProcessing = () => { IncomingServer.runtime = {} IncomingServer.runtime.cycleStart = new Date() PreFlight.run({ - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, subClient: IncomingServer.subClient, settings, }, IncomingServer.preFlightComplete) @@ -73,9 +73,9 @@ IncomingServer.preFlightComplete = (success, data) => { IncomingServer.processing = false return } - IncomingServer.runtime.navBalance = data.navBalance + IncomingServer.runtime.softBalance = data.softBalance IncomingServer.runtime.subBalance = data.subBalance - RefillOutgoing.run({ navClient: IncomingServer.navClient }, IncomingServer.holdingProcessed) + RefillOutgoing.run({ softClient: IncomingServer.softClient }, IncomingServer.holdingProcessed) } IncomingServer.holdingProcessed = (success, data) => { @@ -87,7 +87,7 @@ IncomingServer.holdingProcessed = (success, data) => { } SelectOutgoing.run({ settings, - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, }, IncomingServer.outgoingSelected) } @@ -103,19 +103,19 @@ IncomingServer.outgoingSelected = (success, data) => { IncomingServer.paused = true } ReturnAllToSenders.run({ - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, }, IncomingServer.allPendingReturned) return } IncomingServer.runtime.chosenOutgoing = data.chosenOutgoing - IncomingServer.runtime.outgoingNavBalance = data.outgoingNavBalance + IncomingServer.runtime.outgoingSoftBalance = data.outgoingSoftBalance IncomingServer.runtime.holdingEncrypted = data.holdingEncrypted IncomingServer.runtime.outgoingPubKey = data.outgoingPubKey PrepareIncoming.run({ - navClient: IncomingServer.navClient, - outgoingNavBalance: data.outgoingNavBalance, + softClient: IncomingServer.softClient, + outgoingSoftBalance: data.outgoingSoftBalance, subBalance: IncomingServer.runtime.subBalance, settings, }, IncomingServer.currentBatchPrepared) @@ -148,7 +148,7 @@ IncomingServer.currentBatchPrepared = (success, data) => { if (IncomingServer.runtime.pendingToReturn && IncomingServer.runtime.pendingToReturn.length > 0) { Logger.writeLog('INC_011', 'failed to process some transactions', { success, data }, true) ReturnAllToSenders.fromList({ - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, transactionsToReturn: IncomingServer.runtime.pendingToReturn, }, IncomingServer.pendingFailedReturned) return @@ -171,7 +171,7 @@ IncomingServer.pendingFailedReturned = (success, data) => { Logger.writeLog('INC_011A', 'failed to return failed pending to sender', { success, data }, true) IncomingServer.paused = true ReturnAllToSenders.run({ - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, }, IncomingServer.allPendingReturned) } if (!IncomingServer.runtime.currentBatch || lodash.size(IncomingServer.runtime.currentBatch) === 0) { @@ -190,7 +190,7 @@ IncomingServer.retrievedSubchainAddresses = (success, data) => { if (!success || !data || !data.subAddresses) { Logger.writeLog('INC_009', 'failed to retrieve subchain addresses', { success, data }, true) ReturnAllToSenders.run({ - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, }, IncomingServer.allPendingReturned) return } @@ -200,7 +200,7 @@ IncomingServer.retrievedSubchainAddresses = (success, data) => { currentFlattened: IncomingServer.runtime.currentFlattened, outgoingPubKey: IncomingServer.runtime.outgoingPubKey, subClient: IncomingServer.subClient, - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, subAddresses: data.subAddresses, settings, }, IncomingServer.transactionsProcessed) @@ -217,7 +217,7 @@ IncomingServer.transactionsProcessed = (success, data) => { Logger.writeLog('INC_010', 'failed to process transactions', { success, data }, true) IncomingServer.paused = true ReturnAllToSenders.run({ - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, }, IncomingServer.allPendingReturned) return } @@ -238,7 +238,7 @@ IncomingServer.transactionsProcessed = (success, data) => { } ReturnAllToSenders.fromList({ - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, transactionsToReturn: IncomingServer.runtime.transactionsToReturn, }, IncomingServer.failedTransactionsReturned) return @@ -263,7 +263,7 @@ IncomingServer.failedTransactionsReturned = (success, data) => { SpendToHolding.run({ successfulSubTransactions: IncomingServer.runtime.successfulSubTransactions, holdingEncrypted: IncomingServer.runtime.holdingEncrypted, - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, }, IncomingServer.spentToHolding) } diff --git a/src/lib/AddressGenerator.js b/src/lib/AddressGenerator.js old mode 100644 new mode 100755 diff --git a/src/lib/EncryptedData.js b/src/lib/EncryptedData.js old mode 100644 new mode 100755 diff --git a/src/lib/EncryptionKeys.js b/src/lib/EncryptionKeys.js old mode 100644 new mode 100755 diff --git a/src/lib/FlattenTransactions.js b/src/lib/FlattenTransactions.js old mode 100644 new mode 100755 diff --git a/src/lib/GroupPartials.js b/src/lib/GroupPartials.js old mode 100644 new mode 100755 diff --git a/src/lib/Logger.js b/src/lib/Logger.js old mode 100644 new mode 100755 index 2199406..7376d60 --- a/src/lib/Logger.js +++ b/src/lib/Logger.js @@ -50,9 +50,9 @@ Logger.writeLog = (errorCode, errorMessage, data, email) => { Logger.sendMail = (errorCode, errorMessage, data) => { const mailOptions = { - from: '"Navtech System" <' + settings.smtp.user + '>', + from: '"Softnode System" <' + settings.smtp.user + '>', to: settings.notificationEmail, - subject: 'Navtech System Message - ' + settings.local.ipAddress + ' (' + globalSettings.serverType + ') ' + errorCode, + subject: 'Softnode System Message - ' + settings.local.ipAddress + ' (' + globalSettings.serverType + ') ' + errorCode, text: errorCode + ' - ' + errorMessage, attachments: [ { diff --git a/src/lib/PayoutFee.js b/src/lib/PayoutFee.js old mode 100644 new mode 100755 index 459f681..37a7065 --- a/src/lib/PayoutFee.js +++ b/src/lib/PayoutFee.js @@ -7,7 +7,7 @@ const privateSettings = require('../settings/private.settings.json') const PayoutFee = {} PayoutFee.run = (options, callback) => { - const required = ['settings', 'navClient'] + const required = ['settings', 'softClient'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('PAY_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to PayoutFee.run' }) @@ -16,35 +16,35 @@ PayoutFee.run = (options, callback) => { PayoutFee.runtime = { callback, settings: options.settings, - navClient: options.navClient, + softClient: options.softClient, } PayoutFee.send() } PayoutFee.send = () => { - PayoutFee.runtime.navClient.listUnspent(200).then((unspent) => { - let navBalanceSat = 0 + PayoutFee.runtime.softClient.listUnspent(200).then((unspent) => { + let softBalanceSat = 0 const satoshiFactor = 100000000 for (const pending of unspent) { - navBalanceSat += Math.round(pending.amount * satoshiFactor) + softBalanceSat += Math.round(pending.amount * satoshiFactor) } - const navBalance = navBalanceSat / satoshiFactor - if (navBalance < PayoutFee.runtime.settings.navPoolAmount) { - Logger.writeLog('PAY_002', 'nav pool balance less than expected', { - navPoolAmount: PayoutFee.runtime.settings.navPoolAmount, - navBalance, + const softBalance = softBalanceSat / satoshiFactor + if (softBalance < PayoutFee.runtime.settings.softPoolAmount) { + Logger.writeLog('PAY_002', 'soft pool balance less than expected', { + softPoolAmount: PayoutFee.runtime.settings.softPoolAmount, + softBalance, }) - PayoutFee.runtime.callback(false, { message: 'nav pool balance less than expected' }) + PayoutFee.runtime.callback(false, { message: 'soft pool balance less than expected' }) return } - const txFeeAccrued = (navBalance - PayoutFee.runtime.settings.navPoolAmount) - privateSettings.txFee + const txFeeAccrued = (softBalance - PayoutFee.runtime.settings.softPoolAmount) - privateSettings.txFee if (txFeeAccrued < PayoutFee.runtime.settings.txFeePayoutMin) { PayoutFee.runtime.callback(false, { message: 'fee accrued less than payout minimum' }) return } SendToAddress.send({ - client: PayoutFee.runtime.navClient, + client: PayoutFee.runtime.softClient, address: PayoutFee.runtime.settings.anonTxFeeAddress, amount: txFeeAccrued, transaction: { txid: 'TX_FEE_PAYOUT' }, diff --git a/src/lib/PreFlight.js b/src/lib/PreFlight.js old mode 100644 new mode 100755 index ba9d22f..38d2b1b --- a/src/lib/PreFlight.js +++ b/src/lib/PreFlight.js @@ -2,47 +2,47 @@ const lodash = require('lodash') const privateSettings = require('../settings/private.settings.json') let Logger = require('./Logger.js') // eslint-disable-line -let NavCoin = require('./NavCoin.js') // eslint-disable-line +let SoftCoin = require('./SoftCoin.js') // eslint-disable-line const PreFlight = {} PreFlight.run = (options, callback) => { - const required = ['navClient', 'subClient', 'settings'] + const required = ['softClient', 'subClient', 'settings'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('PRE_001', 'invalid options', { options, required }) - callback(false, { message: 'invalid options provided to Preflight.checkNavBlocks' }) + callback(false, { message: 'invalid options provided to Preflight.checkSoftBlocks' }) return } PreFlight.runtime = { callback, - navClient: options.navClient, + softClient: options.softClient, subClient: options.subClient, settings: options.settings, } - NavCoin.checkBlockHeight({ - client: PreFlight.runtime.navClient, + SoftCoin.checkBlockHeight({ + client: PreFlight.runtime.softClient, blockThreshold: privateSettings.blockThreshold.processing, - }, PreFlight.navBlocksChecked) + }, PreFlight.softBlocksChecked) } -PreFlight.navBlocksChecked = (status, data) => { +PreFlight.softBlocksChecked = (status, data) => { if (!status || !data) { - Logger.writeLog('PRE_002', 'navClient block check failed', { status, data }) - PreFlight.runtime.callback(false, { message: 'navClient block check failed' }) + Logger.writeLog('PRE_002', 'softClient block check failed', { status, data }) + PreFlight.runtime.callback(false, { message: 'softClient block check failed' }) return } - PreFlight.runtime.navBalance = data.balance - PreFlight.runtime.navClient.setTxFee(parseFloat(privateSettings.txFee)).then(() => { - NavCoin.checkBlockHeight({ + PreFlight.runtime.softBalance = data.balance + PreFlight.runtime.softClient.setTxFee(parseFloat(privateSettings.txFee)).then(() => { + SoftCoin.checkBlockHeight({ client: PreFlight.runtime.subClient, blockThreshold: privateSettings.blockThreshold.processing, }, PreFlight.subBlocksChecked) }) .catch((err) => { - Logger.writeLog('PRE_003', 'failed to set NAV tx fee', { err }) - PreFlight.runtime.callback(false, { message: 'failed to set NAV tx fee' }) + Logger.writeLog('PRE_003', 'failed to set SOFT tx fee', { err }) + PreFlight.runtime.callback(false, { message: 'failed to set SOFT tx fee' }) return }) } @@ -54,20 +54,20 @@ PreFlight.subBlocksChecked = (status, data) => { return } PreFlight.runtime.subBalance = data.balance - NavCoin.unlockWallet({ + SoftCoin.unlockWallet({ settings: PreFlight.runtime.settings, - client: PreFlight.runtime.navClient, - type: 'navCoin', - }, PreFlight.navClientUnlocked) + client: PreFlight.runtime.softClient, + type: 'softCoin', + }, PreFlight.softClientUnlocked) } -PreFlight.navClientUnlocked = (status, data) => { +PreFlight.softClientUnlocked = (status, data) => { if (!status) { - Logger.writeLog('PRE_005', 'navClient failed to unlock', { status, data }) - PreFlight.runtime.callback(false, { message: 'navClient failed to unlock' }) + Logger.writeLog('PRE_005', 'softClient failed to unlock', { status, data }) + PreFlight.runtime.callback(false, { message: 'softClient failed to unlock' }) return } - NavCoin.unlockWallet({ + SoftCoin.unlockWallet({ settings: PreFlight.runtime.settings, client: PreFlight.runtime.subClient, type: 'subChain', @@ -82,7 +82,7 @@ PreFlight.subClientUnlocked = (status, data) => { } PreFlight.runtime.subClient.setTxFee(parseFloat(privateSettings.subChainTxFee)).then(() => { PreFlight.runtime.callback(true, { - navBalance: PreFlight.runtime.navBalance, + softBalance: PreFlight.runtime.softBalance, subBalance: PreFlight.runtime.subBalance, }) }) diff --git a/src/lib/PrepareIncoming.js b/src/lib/PrepareIncoming.js old mode 100644 new mode 100755 index bb2b228..2e9ab79 --- a/src/lib/PrepareIncoming.js +++ b/src/lib/PrepareIncoming.js @@ -5,14 +5,14 @@ const globalSettings = config.get('GLOBAL') let privateSettings = require('../settings/private.settings.json') // eslint-disable-line let Logger = require('./Logger.js') // eslint-disable-line -let NavCoin = require('./NavCoin.js') // eslint-disable-line +let SoftCoin = require('./SoftCoin.js') // eslint-disable-line let FlattenTransactions = require('./FlattenTransactions.js') // eslint-disable-line let GroupPartials = require('./GroupPartials.js') // eslint-disable-line const PrepareIncoming = {} PrepareIncoming.run = (options, callback) => { - const required = ['navClient', 'outgoingNavBalance', 'subBalance', 'settings'] + const required = ['softClient', 'outgoingSoftBalance', 'subBalance', 'settings'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('PREPI_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to ReturnAllToSenders.run' }) @@ -20,8 +20,8 @@ PrepareIncoming.run = (options, callback) => { } PrepareIncoming.runtime = { callback, - navClient: options.navClient, - outgoingNavBalance: options.outgoingNavBalance, + softClient: options.softClient, + outgoingSoftBalance: options.outgoingSoftBalance, subBalance: options.subBalance, currentFlattened: {}, currentBatch: [], @@ -33,14 +33,14 @@ PrepareIncoming.run = (options, callback) => { } PrepareIncoming.getUnspent = () => { - PrepareIncoming.runtime.navClient.listUnspent().then((unspent) => { + PrepareIncoming.runtime.softClient.listUnspent().then((unspent) => { if (unspent.length < 1) { PrepareIncoming.runtime.callback(false, { message: 'no unspent transactions found' }) return } - NavCoin.filterUnspent({ + SoftCoin.filterUnspent({ unspent, - client: PrepareIncoming.runtime.navClient, + client: PrepareIncoming.runtime.softClient, accountName: privateSettings.account[globalSettings.serverType], }, PrepareIncoming.unspentFiltered) @@ -60,7 +60,7 @@ PrepareIncoming.unspentFiltered = (success, data) => { PrepareIncoming.runtime.currentPending = data.currentPending GroupPartials.run({ currentPending: data.currentPending, - client: PrepareIncoming.runtime.navClient, + client: PrepareIncoming.runtime.softClient, }, PrepareIncoming.partialsGrouped) } @@ -84,9 +84,9 @@ PrepareIncoming.partialsGrouped = (success, data) => { PrepareIncoming.pruneUnspent({ readyToProcess: data.readyToProcess, - client: PrepareIncoming.runtime.navClient, + client: PrepareIncoming.runtime.softClient, subBalance: PrepareIncoming.runtime.subBalance, - maxAmount: PrepareIncoming.runtime.outgoingNavBalance, + maxAmount: PrepareIncoming.runtime.outgoingSoftBalance, }, PrepareIncoming.unspentPruned) } diff --git a/src/lib/PrepareOutgoing.js b/src/lib/PrepareOutgoing.js old mode 100644 new mode 100755 index b5ed750..a79cd7b --- a/src/lib/PrepareOutgoing.js +++ b/src/lib/PrepareOutgoing.js @@ -4,14 +4,14 @@ const config = require('config') const globalSettings = config.get('GLOBAL') let Logger = require('./Logger.js') //eslint-disable-line -let NavCoin = require('./NavCoin.js') //eslint-disable-line +let SoftCoin = require('./SoftCoin.js') //eslint-disable-line let EncryptedData = require('./EncryptedData.js') //eslint-disable-line const privateSettings = require('../settings/private.settings.json') const PrepareOutgoing = {} PrepareOutgoing.run = (options, callback) => { - const required = ['navClient', 'subClient', 'navBalance', 'settings'] + const required = ['softClient', 'subClient', 'softBalance', 'settings'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('PREPO_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to ReturnAllToSenders.run' }) @@ -19,15 +19,15 @@ PrepareOutgoing.run = (options, callback) => { } PrepareOutgoing.runtime = { callback, - navClient: options.navClient, + softClient: options.softClient, subClient: options.subClient, - navBalance: options.navBalance, + softBalance: options.softBalance, settings: options.settings, failedSubTransactions: [], currentBatch: [], sumPending: 0, } - PrepareOutgoing.runtime.navClient.getBlockCount().then((blockHeight) => { + PrepareOutgoing.runtime.softClient.getBlockCount().then((blockHeight) => { PrepareOutgoing.runtime.currentBlockHeight = blockHeight PrepareOutgoing.getUnspent() }).catch((err) => { @@ -43,7 +43,7 @@ PrepareOutgoing.getUnspent = () => { PrepareOutgoing.runtime.callback(false, { message: 'no unspent transactions found' }) return } - NavCoin.filterUnspent({ + SoftCoin.filterUnspent({ unspent, client: PrepareOutgoing.runtime.subClient, accountName: privateSettings.account[globalSettings.serverType], @@ -115,7 +115,7 @@ PrepareOutgoing.checkDecrypted = (success, data) => { } PrepareOutgoing.testDecrypted = (decrypted, transaction) => { - PrepareOutgoing.runtime.navClient.validateAddress(decrypted.n).then((addressInfo) => { + PrepareOutgoing.runtime.softClient.validateAddress(decrypted.n).then((addressInfo) => { if (addressInfo.isvalid !== true) { Logger.writeLog('PREPO_008', 'recipient address is invalid', { transaction }) PrepareOutgoing.failedTransaction() @@ -127,7 +127,7 @@ PrepareOutgoing.testDecrypted = (decrypted, transaction) => { PrepareOutgoing.processTransaction() return } - if (PrepareOutgoing.runtime.navBalance > PrepareOutgoing.runtime.sumPending + parseFloat(decrypted.v)) { + if (PrepareOutgoing.runtime.softBalance > PrepareOutgoing.runtime.sumPending + parseFloat(decrypted.v)) { PrepareOutgoing.runtime.sumPending = PrepareOutgoing.runtime.sumPending + parseFloat(decrypted.v) PrepareOutgoing.runtime.currentBatch.push({ decrypted, transaction }) PrepareOutgoing.runtime.currentPending.splice(0, 1) @@ -135,7 +135,7 @@ PrepareOutgoing.testDecrypted = (decrypted, transaction) => { return } - // max possible nav to send reached + // max possible soft to send reached // @TODO possibly continue to loop through the rest of the transactions to see if any smaller ones can jump ahead PrepareOutgoing.runtime.callback(true, { failedSubTransactions: PrepareOutgoing.runtime.failedSubTransactions, @@ -143,7 +143,7 @@ PrepareOutgoing.testDecrypted = (decrypted, transaction) => { }) return }).catch((err) => { - Logger.writeLog('PREPO_009', 'navClient failed validate address', { decrypted, transaction, error: err }) + Logger.writeLog('PREPO_009', 'softClient failed validate address', { decrypted, transaction, error: err }) PrepareOutgoing.failedTransaction() }) } diff --git a/src/lib/ProcessIncoming.js b/src/lib/ProcessIncoming.js old mode 100644 new mode 100755 index 1e49a36..550af22 --- a/src/lib/ProcessIncoming.js +++ b/src/lib/ProcessIncoming.js @@ -8,7 +8,7 @@ let SendToAddress = require('./SendToAddress.js') // eslint-disable-line const ProcessIncoming = {} ProcessIncoming.run = (options, callback) => { - const required = ['currentBatch', 'settings', 'subClient', 'outgoingPubKey', 'subAddresses', 'navClient', 'currentFlattened'] + const required = ['currentBatch', 'settings', 'subClient', 'outgoingPubKey', 'subAddresses', 'softClient', 'currentFlattened'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('PROI_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to ProcessIncoming.run' }) @@ -21,14 +21,14 @@ ProcessIncoming.run = (options, callback) => { currentFlattened: options.currentFlattened, settings: options.settings, subClient: options.subClient, - navClient: options.navClient, + softClient: options.softClient, outgoingPubKey: options.outgoingPubKey, subAddresses: options.subAddresses, txGroupsToReturn: [], successfulTxGroups: [], } - ProcessIncoming.runtime.navClient.getBlockCount().then((blockHeight) => { + ProcessIncoming.runtime.softClient.getBlockCount().then((blockHeight) => { ProcessIncoming.runtime.currentBlockHeight = blockHeight ProcessIncoming.processPending() }).catch((err) => { @@ -87,7 +87,7 @@ ProcessIncoming.partialFailed = (txGroup) => { ProcessIncoming.reEncryptAddress = (destination, maxDelay, txGroup, flattened, counter) => { try { const dataToEncrypt = { - n: destination, // nav + n: destination, // soft v: flattened, // value s: ProcessIncoming.runtime.settings.secret, // secret t: ProcessIncoming.runtime.currentBlockHeight + Math.round(Math.random() * maxDelay), // time diff --git a/src/lib/ProcessOutgoing.js b/src/lib/ProcessOutgoing.js old mode 100644 new mode 100755 index c27cb3e..f324353 --- a/src/lib/ProcessOutgoing.js +++ b/src/lib/ProcessOutgoing.js @@ -7,7 +7,7 @@ let SendToAddress = require('./SendToAddress.js') // eslint-disable-line const ProcessOutgoing = {} ProcessOutgoing.run = (options, callback) => { - const required = ['currentBatch', 'settings', 'navClient'] + const required = ['currentBatch', 'settings', 'softClient'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('PROO_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to ProcessOutgoing.run' }) @@ -17,7 +17,7 @@ ProcessOutgoing.run = (options, callback) => { callback, currentBatch: options.currentBatch, settings: options.settings, - navClient: options.navClient, + softClient: options.softClient, successfulTransactions: [], failedTransactions: [], } @@ -37,11 +37,11 @@ ProcessOutgoing.processPending = () => { // ProcessOutgoing.mockSend() SendToAddress.send({ - client: ProcessOutgoing.runtime.navClient, + client: ProcessOutgoing.runtime.softClient, address: ProcessOutgoing.runtime.remainingTransactions[0].decrypted.n, amount: ProcessOutgoing.runtime.remainingTransactions[0].decrypted.v, transaction: ProcessOutgoing.runtime.remainingTransactions[0], - }, ProcessOutgoing.sentNav) + }, ProcessOutgoing.sentSoft) } ProcessOutgoing.transactionFailed = () => { @@ -51,7 +51,7 @@ ProcessOutgoing.transactionFailed = () => { } ProcessOutgoing.mockSend = () => { - Logger.writeLog('PROO_003A', 'mock nav sent', { transaction: ProcessOutgoing.runtime.remainingTransactions[0] }) + Logger.writeLog('PROO_003A', 'mock soft sent', { transaction: ProcessOutgoing.runtime.remainingTransactions[0] }) ProcessOutgoing.runtime.successfulTransactions.push({ transaction: ProcessOutgoing.runtime.remainingTransactions[0].transaction, }) @@ -59,9 +59,9 @@ ProcessOutgoing.mockSend = () => { ProcessOutgoing.processPending() } -ProcessOutgoing.sentNav = (success, data) => { +ProcessOutgoing.sentSoft = (success, data) => { if (!success || !data || !data.sendOutcome) { - Logger.writeLog('PROO_004', 'failed nav send to address', data, true) + Logger.writeLog('PROO_004', 'failed soft send to address', data, true) ProcessOutgoing.runtime.failedTransactions.push(ProcessOutgoing.runtime.remainingTransactions[0]) } else { ProcessOutgoing.runtime.successfulTransactions.push(ProcessOutgoing.runtime.remainingTransactions[0]) diff --git a/src/lib/RandomizeTransactions.js b/src/lib/RandomizeTransactions.js old mode 100644 new mode 100755 index b5b9d3c..58b73cd --- a/src/lib/RandomizeTransactions.js +++ b/src/lib/RandomizeTransactions.js @@ -74,8 +74,8 @@ RandomizeTransactions.outgoing = (options, callback) => { RandomizeTransactions.randomizeOutgoing = () => { const numTransactions = Math.ceil( - Math.random() * (privateSettings.maxNavTransactions - privateSettings.minNavTransactions) - ) + privateSettings.minNavTransactions + Math.random() * (privateSettings.maxSoftTransactions - privateSettings.minSoftTransactions) + ) + privateSettings.minSoftTransactions const sumPending = RandomizeTransactions.runtime.amount const satoshiFactor = 100000000 const sumPendingSatoshi = sumPending * satoshiFactor diff --git a/src/lib/RefillOutgoing.js b/src/lib/RefillOutgoing.js old mode 100644 new mode 100755 index b98ba0f..9a3ce00 --- a/src/lib/RefillOutgoing.js +++ b/src/lib/RefillOutgoing.js @@ -2,7 +2,7 @@ const lodash = require('lodash') const privateSettings = require('../settings/private.settings.json') let Logger = require('./Logger.js') // eslint-disable-line -let NavCoin = require('./NavCoin.js') // eslint-disable-line +let SoftCoin = require('./SoftCoin.js') // eslint-disable-line let EncryptedData = require('./EncryptedData.js') // eslint-disable-line let SendRawTransaction = require('./SendRawTransaction.js') // eslint-disable-line let RandomizeTransactions = require('./RandomizeTransactions.js') // eslint-disable-line @@ -10,7 +10,7 @@ let RandomizeTransactions = require('./RandomizeTransactions.js') // eslint-disa const RefillOutgoing = {} RefillOutgoing.run = (options, callback) => { - const required = ['navClient'] + const required = ['softClient'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('RFL_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to RefillOutgoing.checkHoldingAccount' }) @@ -19,22 +19,22 @@ RefillOutgoing.run = (options, callback) => { RefillOutgoing.runtime = { callback, - navClient: options.navClient, + softClient: options.softClient, } RefillOutgoing.getUnspent() } RefillOutgoing.getUnspent = () => { - RefillOutgoing.runtime.navClient.listUnspent().then((unspent) => { + RefillOutgoing.runtime.softClient.listUnspent().then((unspent) => { if (unspent.length < 1) { Logger.writeLog('RFL_002', 'no unspent in holding account', { unspent }) RefillOutgoing.runtime.callback(true, { message: 'no unspent in holding account' }) return } - NavCoin.filterUnspent({ + SoftCoin.filterUnspent({ unspent, - client: RefillOutgoing.runtime.navClient, + client: RefillOutgoing.runtime.softClient, accountName: privateSettings.account.HOLDING, }, RefillOutgoing.holdingFiltered) @@ -68,7 +68,7 @@ RefillOutgoing.checkIfHoldingIsSpendable = () => { if (RefillOutgoing.runtime.currentHolding[0].confirmations > privateSettings.minConfs) { EncryptedData.getEncrypted({ transaction: RefillOutgoing.runtime.currentHolding[0], - client: RefillOutgoing.runtime.navClient, + client: RefillOutgoing.runtime.softClient, }, RefillOutgoing.holdingDecrypted) return } @@ -107,8 +107,8 @@ RefillOutgoing.holdingDecrypted = (success, data) => { // @TODO check if addresses are valid? const numTransactions = Math.ceil( - Math.random() * (addresses.length - (privateSettings.minNavTransactions - 1)) - ) + (privateSettings.minNavTransactions - 1) + Math.random() * (addresses.length - (privateSettings.minSoftTransactions - 1)) + ) + (privateSettings.minSoftTransactions - 1) const randAddresses = [] while (randAddresses.length < numTransactions) { @@ -142,7 +142,7 @@ RefillOutgoing.sendRawRefillTransaction = (outgoingTransactions) => { SendRawTransaction.createRaw({ outgoingTransactions, spentTransactions, - client: RefillOutgoing.runtime.navClient, + client: RefillOutgoing.runtime.softClient, }, RefillOutgoing.refillSent) } diff --git a/src/lib/RetrieveSubchainAddresses.js b/src/lib/RetrieveSubchainAddresses.js old mode 100644 new mode 100755 index 5943b46..9e34523 --- a/src/lib/RetrieveSubchainAddresses.js +++ b/src/lib/RetrieveSubchainAddresses.js @@ -2,7 +2,7 @@ const lodash = require('lodash') let request = require('request') //eslint-disable-line let Logger = require('./Logger.js') //eslint-disable-line -let NavCoin = require('./NavCoin.js') //eslint-disable-line +let SoftCoin = require('./SoftCoin.js') //eslint-disable-line const RetrieveSubchainAddresses = {} @@ -94,7 +94,7 @@ RetrieveSubchainAddresses.checkSubAddresses = (outgoingSubAddresses) => { return } RetrieveSubchainAddresses.runtime.outgoingSubAddresses = outgoingSubAddresses - NavCoin.validateAddresses({ + SoftCoin.validateAddresses({ client: RetrieveSubchainAddresses.runtime.subClient, addresses: outgoingSubAddresses, }, RetrieveSubchainAddresses.subAddressesValid) diff --git a/src/lib/ReturnAllToSenders.js b/src/lib/ReturnAllToSenders.js old mode 100644 new mode 100755 index a7eb640..e28afe3 --- a/src/lib/ReturnAllToSenders.js +++ b/src/lib/ReturnAllToSenders.js @@ -3,14 +3,14 @@ const config = require('config') const globalSettings = config.get('GLOBAL') let Logger = require('./Logger.js') //eslint-disable-line -let NavCoin = require('./NavCoin.js') //eslint-disable-line +let SoftCoin = require('./SoftCoin.js') //eslint-disable-line const privateSettings = require('../settings/private.settings.json') let ReturnToSender = require('./ReturnToSender.js')//eslint-disable-line const ReturnAllToSenders = {} ReturnAllToSenders.run = (options, callback) => { - const required = ['navClient'] + const required = ['softClient'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('RATS_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to ReturnAllToSenders.run' }) @@ -18,21 +18,21 @@ ReturnAllToSenders.run = (options, callback) => { } ReturnAllToSenders.runtime = { callback, - navClient: options.navClient, + softClient: options.softClient, } ReturnAllToSenders.getUnspent() } ReturnAllToSenders.fromList = (options, callback) => { - const required = ['navClient', 'transactionsToReturn'] + const required = ['softClient', 'transactionsToReturn'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('RATS_001A', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to ReturnAllToSenders.fromList' }) } ReturnAllToSenders.runtime = { callback, - navClient: options.navClient, + softClient: options.softClient, transactionsToReturn: options.transactionsToReturn, } @@ -40,14 +40,14 @@ ReturnAllToSenders.fromList = (options, callback) => { } ReturnAllToSenders.getUnspent = () => { - ReturnAllToSenders.runtime.navClient.listUnspent().then((unspent) => { + ReturnAllToSenders.runtime.softClient.listUnspent().then((unspent) => { if (unspent.length < 1) { ReturnAllToSenders.runtime.callback(false, { message: 'no unspent transactions found' }) return } - NavCoin.filterUnspent({ + SoftCoin.filterUnspent({ unspent, - client: ReturnAllToSenders.runtime.navClient, + client: ReturnAllToSenders.runtime.softClient, accountName: privateSettings.account[globalSettings.serverType], }, ReturnAllToSenders.unspentFiltered) @@ -75,7 +75,7 @@ ReturnAllToSenders.returnToSender = () => { return } ReturnToSender.send({ - client: ReturnAllToSenders.runtime.navClient, + client: ReturnAllToSenders.runtime.softClient, transaction: ReturnAllToSenders.runtime.transactionsToReturn[0] }, ReturnAllToSenders.returnedToSender) } diff --git a/src/lib/ReturnSubnav.js b/src/lib/ReturnSubnav.js deleted file mode 100644 index 2bb95d6..0000000 --- a/src/lib/ReturnSubnav.js +++ /dev/null @@ -1,50 +0,0 @@ -const lodash = require('lodash') - -let Logger = require('./Logger.js') //eslint-disable-line -let ReturnToSender = require('./ReturnToSender.js') //eslint-disable-line - -const ReturnSubnav = {} - -ReturnSubnav.run = (options, callback) => { - const required = ['settings', 'subClient', 'transactions'] - if (lodash.intersection(Object.keys(options), required).length !== required.length) { - Logger.writeLog('RSN_001', 'invalid options', { options, required }) - callback(false, { message: 'invalid options provided to ReturnSubnav.run' }) - return - } - ReturnSubnav.runtime = { - callback, - settings: options.settings, - subClient: options.subClient, - transactions: options.transactions, - } - - ReturnSubnav.runtime.remainingTransactions = options.transactions - ReturnSubnav.sendToIncoming() -} - -ReturnSubnav.sendToIncoming = () => { - if (ReturnSubnav.runtime.remainingTransactions.constructor !== Array || ReturnSubnav.runtime.remainingTransactions.length < 1) { - ReturnSubnav.runtime.callback(true, { message: 'all subnav returned to incoming server' }) - return - } - ReturnToSender.send({ - client: ReturnSubnav.runtime.subClient, - transaction: ReturnSubnav.runtime.remainingTransactions[0].transaction, - }, ReturnSubnav.sent) -} - -ReturnSubnav.sent = (success, data) => { - if (!success || !data || !data.rawOutcome) { - Logger.writeLog('RSN_002', 'unable to return subnav to incoming server', { - remaining: ReturnSubnav.runtime.remainingTransactions, success, data, - }, true) - ReturnSubnav.runtime.callback(false, { message: 'failed to return subnav' }) - return - } - ReturnSubnav.runtime.remainingTransactions.splice(0, 1) - ReturnSubnav.sendToIncoming() - return -} - -module.exports = ReturnSubnav diff --git a/src/lib/ReturnSubsoft.js b/src/lib/ReturnSubsoft.js new file mode 100755 index 0000000..b0ee7c8 --- /dev/null +++ b/src/lib/ReturnSubsoft.js @@ -0,0 +1,50 @@ +const lodash = require('lodash') + +let Logger = require('./Logger.js') //eslint-disable-line +let ReturnToSender = require('./ReturnToSender.js') //eslint-disable-line + +const ReturnSubsoft = {} + +ReturnSubsoft.run = (options, callback) => { + const required = ['settings', 'subClient', 'transactions'] + if (lodash.intersection(Object.keys(options), required).length !== required.length) { + Logger.writeLog('RSN_001', 'invalid options', { options, required }) + callback(false, { message: 'invalid options provided to ReturnSubsoft.run' }) + return + } + ReturnSubsoft.runtime = { + callback, + settings: options.settings, + subClient: options.subClient, + transactions: options.transactions, + } + + ReturnSubsoft.runtime.remainingTransactions = options.transactions + ReturnSubsoft.sendToIncoming() +} + +ReturnSubsoft.sendToIncoming = () => { + if (ReturnSubsoft.runtime.remainingTransactions.constructor !== Array || ReturnSubsoft.runtime.remainingTransactions.length < 1) { + ReturnSubsoft.runtime.callback(true, { message: 'all subsoft returned to incoming server' }) + return + } + ReturnToSender.send({ + client: ReturnSubsoft.runtime.subClient, + transaction: ReturnSubsoft.runtime.remainingTransactions[0].transaction, + }, ReturnSubsoft.sent) +} + +ReturnSubsoft.sent = (success, data) => { + if (!success || !data || !data.rawOutcome) { + Logger.writeLog('RSN_002', 'unable to return subsoft to incoming server', { + remaining: ReturnSubsoft.runtime.remainingTransactions, success, data, + }, true) + ReturnSubsoft.runtime.callback(false, { message: 'failed to return subsoft' }) + return + } + ReturnSubsoft.runtime.remainingTransactions.splice(0, 1) + ReturnSubsoft.sendToIncoming() + return +} + +module.exports = ReturnSubsoft diff --git a/src/lib/ReturnToSender.js b/src/lib/ReturnToSender.js old mode 100644 new mode 100755 diff --git a/src/lib/SelectOutgoing.js b/src/lib/SelectOutgoing.js old mode 100644 new mode 100755 index 93ab8a6..5441481 --- a/src/lib/SelectOutgoing.js +++ b/src/lib/SelectOutgoing.js @@ -5,13 +5,13 @@ let fs = require('fs')//eslint-disable-line let privateSettings = require('../settings/private.settings.json') //eslint-disable-line let Logger = require('./Logger.js') //eslint-disable-line -let NavCoin = require('./NavCoin.js') //eslint-disable-line +let SoftCoin = require('./SoftCoin.js') //eslint-disable-line let EncryptionKeys = require('./EncryptionKeys.js') //eslint-disable-line const SelectOutgoing = {} SelectOutgoing.run = (options, callback) => { - const required = ['settings', 'navClient'] + const required = ['settings', 'softClient'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('SEL_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to SelectOutgoing.run' }) @@ -28,7 +28,7 @@ SelectOutgoing.run = (options, callback) => { callback, remoteCluster: JSON.parse(JSON.stringify(options.settings.remote)), settings: options.settings, - navClient: options.navClient, + softClient: options.softClient, } SelectOutgoing.pickServer() @@ -88,7 +88,7 @@ SelectOutgoing.checkOutgoingCanTransact = (body, outgoingAddress) => { return } - if (!bodyJson.data || !bodyJson.data.nav_addresses || !bodyJson.data.nav_balance || !bodyJson.data.public_key) { + if (!bodyJson.data || !bodyJson.data.soft_addresses || !bodyJson.data.soft_balance || !bodyJson.data.public_key) { Logger.writeLog('SEL_006', 'outgoing server returned incorrect params', { body: bodyJson, outgoingAddress }) SelectOutgoing.runtime.remoteCluster.splice(SelectOutgoing.runtime.chosenOutgoingIndex, 1) SelectOutgoing.pickServer() @@ -96,7 +96,7 @@ SelectOutgoing.checkOutgoingCanTransact = (body, outgoingAddress) => { } SelectOutgoing.runtime.outgoingServerData = bodyJson.data - SelectOutgoing.runtime.outgoingNavBalance = bodyJson.data.nav_balance + SelectOutgoing.runtime.outgoingSoftBalance = bodyJson.data.soft_balance if (SelectOutgoing.runtime.outgoingServerData.server_type !== 'OUTGOING') { Logger.writeLog('SEL_007', 'outgoing server is of the wrong type', { body: SelectOutgoing.runtime.outgoingServerData }) @@ -128,7 +128,7 @@ SelectOutgoing.checkPublicKey = (dataToEncrypt) => { SelectOutgoing.pickServer() return } - SelectOutgoing.hasNavAddresses() + SelectOutgoing.hasSoftAddresses() } catch (err) { Logger.writeLog('SEL_009', 'bad public key provided by outgoing server', { error: err, @@ -139,8 +139,8 @@ SelectOutgoing.checkPublicKey = (dataToEncrypt) => { } } -SelectOutgoing.hasNavAddresses = () => { - if (SelectOutgoing.runtime.outgoingServerData.nav_addresses.length < 1) { +SelectOutgoing.hasSoftAddresses = () => { + if (SelectOutgoing.runtime.outgoingServerData.soft_addresses.length < 1) { Logger.writeLog('SEL_010', 'outgoing server did not provide at least 1 address', { body: SelectOutgoing.runtime.outgoingServerData, }) @@ -148,15 +148,15 @@ SelectOutgoing.hasNavAddresses = () => { SelectOutgoing.pickServer() return } - NavCoin.validateAddresses({ - client: SelectOutgoing.runtime.navClient, - addresses: SelectOutgoing.runtime.outgoingServerData.nav_addresses, - }, SelectOutgoing.navAddressesValid) + SoftCoin.validateAddresses({ + client: SelectOutgoing.runtime.softClient, + addresses: SelectOutgoing.runtime.outgoingServerData.soft_addresses, + }, SelectOutgoing.softAddressesValid) } -SelectOutgoing.navAddressesValid = (addressesValid) => { +SelectOutgoing.softAddressesValid = (addressesValid) => { if (!addressesValid) { - Logger.writeLog('SEL_011', 'invalid nav addresses sent from the outgoing server', { addressesValid }) + Logger.writeLog('SEL_011', 'invalid soft addresses sent from the outgoing server', { addressesValid }) SelectOutgoing.runtime.remoteCluster.splice(SelectOutgoing.runtime.chosenOutgoingIndex, 1) SelectOutgoing.pickServer() return @@ -172,18 +172,18 @@ SelectOutgoing.encryptOutgoingAddresses = (success, data) => { try { const crt = ursa.createPublicKey(fs.readFileSync(data.pubKeyFile)) const encrypted = crt.encrypt( - JSON.stringify(SelectOutgoing.runtime.outgoingServerData.nav_addresses), 'utf8', 'base64', ursa.RSA_PKCS1_PADDING + JSON.stringify(SelectOutgoing.runtime.outgoingServerData.soft_addresses), 'utf8', 'base64', ursa.RSA_PKCS1_PADDING ) const key = ursa.createPrivateKey(fs.readFileSync(data.privKeyFile)) const decrypted = key.decrypt(encrypted, 'base64', 'utf8', ursa.RSA_PKCS1_PADDING) - if (decrypted !== JSON.stringify(SelectOutgoing.runtime.outgoingServerData.nav_addresses)) { + if (decrypted !== JSON.stringify(SelectOutgoing.runtime.outgoingServerData.soft_addresses)) { Logger.writeLog('SEL_013', 'failed to encrypt with local key', { success, data, encrypted, decrypted }) SelectOutgoing.runtime.callback(false, { returnAllToSenders: true }) return } SelectOutgoing.runtime.callback(true, { chosenOutgoing: SelectOutgoing.runtime.chosenOutgoing, - outgoingNavBalance: SelectOutgoing.runtime.outgoingNavBalance, + outgoingSoftBalance: SelectOutgoing.runtime.outgoingSoftBalance, outgoingPubKey: SelectOutgoing.runtime.outgoingPubKey, holdingEncrypted: encrypted, returnAllToSenders: false, @@ -194,7 +194,7 @@ SelectOutgoing.encryptOutgoingAddresses = (success, data) => { success, data, error: err, - encrypting: SelectOutgoing.runtime.outgoingServerData.nav_addresses, + encrypting: SelectOutgoing.runtime.outgoingServerData.soft_addresses, }) SelectOutgoing.runtime.callback(false, { returnAllToSenders: true }) } diff --git a/src/lib/SendRawTransaction.js b/src/lib/SendRawTransaction.js old mode 100644 new mode 100755 index 8955040..6ebe5d8 --- a/src/lib/SendRawTransaction.js +++ b/src/lib/SendRawTransaction.js @@ -4,7 +4,7 @@ const config = require('config') const lodash = require('lodash') let Logger = require('./Logger.js') //eslint-disable-line -let NavCoin = require('./NavCoin.js') //eslint-disable-line +let SoftCoin = require('./SoftCoin.js') //eslint-disable-line let globalSettings = config.get('GLOBAL') //eslint-disable-line @@ -75,8 +75,8 @@ SendRawTransaction.signRaw = (rawTrans) => { }).catch((err) => { if (err.code === -13 && !SendRawTransaction.runtime.triedToUnlock) { SendRawTransaction.runtime.rawTrans = rawTrans - const type = (SendRawTransaction.runtime.client.port === settings.navCoin.port) ? 'navCoin' : 'subChain' - NavCoin.unlockWallet({ settings, client: SendRawTransaction.runtime.client, type }, SendRawTransaction.walletUnlocked) + const type = (SendRawTransaction.runtime.client.port === settings.softCoin.port) ? 'softCoin' : 'subChain' + SoftCoin.unlockWallet({ settings, client: SendRawTransaction.runtime.client, type }, SendRawTransaction.walletUnlocked) return } Logger.writeLog('RAW_004', 'unable to sign raw transaction', { diff --git a/src/lib/SendToAddress.js b/src/lib/SendToAddress.js old mode 100644 new mode 100755 index f7d680b..eeea882 --- a/src/lib/SendToAddress.js +++ b/src/lib/SendToAddress.js @@ -4,7 +4,7 @@ const config = require('config') const lodash = require('lodash') let Logger = require('./Logger.js') //eslint-disable-line -let NavCoin = require('./NavCoin.js') //eslint-disable-line +let SoftCoin = require('./SoftCoin.js') //eslint-disable-line let globalSettings = config.get('GLOBAL') //eslint-disable-line @@ -49,8 +49,8 @@ SendToAddress.send = (options, callback) => { if (err.code === -13 && !options.triedToUnlock) { SendToAddress.runtime.options = options SendToAddress.runtime.callback = callback - const type = (options.client.port === settings.navCoin.port) ? 'navCoin' : 'subChain' - NavCoin.unlockWallet({ settings, client: options.client, type }, SendToAddress.walletUnlocked) + const type = (options.client.port === settings.softCoin.port) ? 'softCoin' : 'subChain' + SoftCoin.unlockWallet({ settings, client: options.client, type }, SendToAddress.walletUnlocked) return } // @NOTE not able to test because timeout is longer than the tests will allow diff --git a/src/lib/SettingsValidator.js b/src/lib/SettingsValidator.js old mode 100644 new mode 100755 index 0bb55b0..3253cec --- a/src/lib/SettingsValidator.js +++ b/src/lib/SettingsValidator.js @@ -102,8 +102,8 @@ function eachField(value, ignoreList, validation, currentKey) { case 'EMAIL': validateEmail(value, validation, currentKey) break - case 'NAV_ADDRESS': - validateNavAddress(value, validation, currentKey) + case 'SOFT_ADDRESS': + validateSoftAddress(value, validation, currentKey) break case 'STRING': validateString(value, validation, currentKey) @@ -182,9 +182,9 @@ function validateEmail(value, validation, key) { return true } -function validateNavAddress(value, validation, key) { +function validateSoftAddress(value, validation, key) { if (value.length !== 34 && value.charAt(0) !== 'N') { - SettingsValidator.errors.push('INVALID_NAV_ADDRESSS for ' + key + ', must be 34 characters and starting with N') + SettingsValidator.errors.push('INVALID_SOFT_ADDRESSS for ' + key + ', must be 34 characters and starting with N') return false } return true diff --git a/src/lib/NavCoin.js b/src/lib/SoftCoin.js old mode 100644 new mode 100755 similarity index 60% rename from src/lib/NavCoin.js rename to src/lib/SoftCoin.js index 9dd58e6..2e2795e --- a/src/lib/NavCoin.js +++ b/src/lib/SoftCoin.js @@ -7,13 +7,13 @@ const Logger = require('./Logger.js') let globalSettings = config.get('GLOBAL') // eslint-disable-line -const NavCoin = {} +const SoftCoin = {} -NavCoin.unlockWallet = (options, callback) => { +SoftCoin.unlockWallet = (options, callback) => { const required = ['settings', 'client', 'type'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { - Logger.writeLog('NAV_001', 'invalid options', { options, required }) - callback(false, { message: 'invalid options provided to NavCoin.unlockWallet' }) + Logger.writeLog('SOFT_001', 'invalid options', { options, required }) + callback(false, { message: 'invalid options provided to SoftCoin.unlockWallet' }) return } @@ -32,34 +32,34 @@ NavCoin.unlockWallet = (options, callback) => { break default: callback(false, { message: 'failed to unlock' }) - Logger.writeLog('NAV_002', 'failed to unlock ' + options.type + ' wallet', { error: err }) + Logger.writeLog('SOFT_002', 'failed to unlock ' + options.type + ' wallet', { error: err }) return } }) } -NavCoin.lockWallet = (options, callback) => { +SoftCoin.lockWallet = (options, callback) => { const required = ['type', 'client'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { - Logger.writeLog('NAV_003', 'invalid options', { options, required }) - callback(false, { message: 'invalid options provided to NavCoin.lockWallet' }) + Logger.writeLog('SOFT_003', 'invalid options', { options, required }) + callback(false, { message: 'invalid options provided to SoftCoin.lockWallet' }) return } options.client.walletLock().then(() => { - Logger.writeLog('NAV_004', 'locked the ' + options.type + ' wallet', options) - NavCoin.unlockWallet(options, callback) + Logger.writeLog('SOFT_004', 'locked the ' + options.type + ' wallet', options) + SoftCoin.unlockWallet(options, callback) }).catch((err) => { callback(false, { message: 'failed to lock' }) - Logger.writeLog('NAV_005', 'failed to lock ' + options.type + ' wallet', { error: err }) + Logger.writeLog('SOFT_005', 'failed to lock ' + options.type + ' wallet', { error: err }) return }) } -NavCoin.filterUnspent = (options, callback) => { +SoftCoin.filterUnspent = (options, callback) => { const required = ['unspent', 'client', 'accountName'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { - Logger.writeLog('NAV_006', 'invalid options', { options, required }) - callback(false, { message: 'invalid options provided to NavCoin.filterUnspent' }) + Logger.writeLog('SOFT_006', 'invalid options', { options, required }) + callback(false, { message: 'invalid options provided to SoftCoin.filterUnspent' }) return } try { @@ -79,48 +79,48 @@ NavCoin.filterUnspent = (options, callback) => { callback(true) return }).catch((err) => { - Logger.writeLog('NAV_007', 'failed to get address by account', { error: err, options }) + Logger.writeLog('SOFT_007', 'failed to get address by account', { error: err, options }) callback(false) return }) } catch (err) { - Logger.writeLog('NAV_008', 'failed to filter', { error: err, options }) + Logger.writeLog('SOFT_008', 'failed to filter', { error: err, options }) } } -NavCoin.checkBlockHeight = (options, callback) => { +SoftCoin.checkBlockHeight = (options, callback) => { const required = ['client', 'blockThreshold'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { - Logger.writeLog('NAV_009', 'invalid options', { options, required }) - callback(false, { message: 'invalid options provided to NavCoin.checkBlockHeight' }) + Logger.writeLog('SOFT_009', 'invalid options', { options, required }) + callback(false, { message: 'invalid options provided to SoftCoin.checkBlockHeight' }) return } options.client.getInfo().then((walletInfo) => { options.client.getBlockCount().then((blockCount) => { if (parseInt(blockCount, 10) - options.blockThreshold > parseInt(walletInfo.blocks, 10)) { - Logger.writeLog('NAV_010', 'client is not synced with the latest blocks', { walletInfo, blockCount }) + Logger.writeLog('SOFT_010', 'client is not synced with the latest blocks', { walletInfo, blockCount }) callback(false, { message: 'client is not synced with the latest blocks' }) return } callback(true, { balance: walletInfo.balance }) return }).catch((err) => { - Logger.writeLog('NAV_011', 'failed to get block count', { error: err, options }) + Logger.writeLog('SOFT_011', 'failed to get block count', { error: err, options }) callback(false, { message: 'failed to get block count' }) return }) }).catch((err) => { - Logger.writeLog('NAV_012', 'failed to get info', { error: err, options }) + Logger.writeLog('SOFT_012', 'failed to get info', { error: err, options }) callback(false, { message: 'failed to get info' }) return }) } -NavCoin.validateAddresses = (options, callback) => { +SoftCoin.validateAddresses = (options, callback) => { const required = ['client', 'addresses'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { - Logger.writeLog('NAV_013', 'invalid options', { options, required }) - callback(false, { message: 'invalid options provided to NavCoin.validateAddresses' }) + Logger.writeLog('SOFT_013', 'invalid options', { options, required }) + callback(false, { message: 'invalid options provided to SoftCoin.validateAddresses' }) return } if (options.addresses.length === 0) { @@ -129,20 +129,20 @@ NavCoin.validateAddresses = (options, callback) => { } options.client.validateAddress(options.addresses[0]).then((addressInfo) => { if (addressInfo.isvalid !== true) { - Logger.writeLog('NAV_014', 'provided address is invalid', { address: options.addresses[0] }) + Logger.writeLog('SOFT_014', 'provided address is invalid', { address: options.addresses[0] }) callback(false, { message: 'provided address is invalid' }) return } - NavCoin.validateAddresses({ + SoftCoin.validateAddresses({ addresses: options.addresses.slice(1), client: options.client, }, callback) return }).catch((err) => { - Logger.writeLog('NAV_015', 'failed to validate address', { error: err, options }) + Logger.writeLog('SOFT_015', 'failed to validate address', { error: err, options }) callback(false, { message: 'failed to validate address' }) return }) } -module.exports = NavCoin +module.exports = SoftCoin diff --git a/src/lib/SpendToHolding.js b/src/lib/SpendToHolding.js old mode 100644 new mode 100755 index cc5d80f..3c40375 --- a/src/lib/SpendToHolding.js +++ b/src/lib/SpendToHolding.js @@ -8,7 +8,7 @@ let SendRawTransaction = require('./SendRawTransaction.js') //eslint-disable-lin const SpendToHolding = {} SpendToHolding.run = (options, callback) => { - const required = ['successfulSubTransactions', 'holdingEncrypted', 'navClient'] + const required = ['successfulSubTransactions', 'holdingEncrypted', 'softClient'] if (lodash.intersection(Object.keys(options), required).length !== required.length) { Logger.writeLog('STH_001', 'invalid options', { options, required }) callback(false, { message: 'invalid options provided to SpendToHolding.run' }) @@ -18,10 +18,10 @@ SpendToHolding.run = (options, callback) => { callback, successfulSubTransactions: options.successfulSubTransactions, holdingEncrypted: options.holdingEncrypted, - navClient: options.navClient, + softClient: options.softClient, } RandomizeTransactions.getRandomAccountAddresses({ - client: SpendToHolding.runtime.navClient, + client: SpendToHolding.runtime.softClient, accountName: privateSettings.account.HOLDING, numAddresses: 1, }, SpendToHolding.createHoldingTransactions) @@ -57,7 +57,7 @@ SpendToHolding.createHoldingTransactions = (success, data) => { SendRawTransaction.createRaw({ outgoingTransactions, spentTransactions, - client: SpendToHolding.runtime.navClient, + client: SpendToHolding.runtime.softClient, encrypted: SpendToHolding.runtime.holdingEncrypted, }, SpendToHolding.sentToHolding) } diff --git a/src/outgoing.js b/src/outgoing.js old mode 100644 new mode 100755 index 2a3ab95..b9c5ffa --- a/src/outgoing.js +++ b/src/outgoing.js @@ -8,7 +8,7 @@ let PreFlight = require('./lib/PreFlight.js') //eslint-disable-line let PrepareOutgoing = require('./lib/PrepareOutgoing.js') //eslint-disable-line let ProcessOutgoing = require('./lib/ProcessOutgoing.js') //eslint-disable-line let PayoutFee = require('./lib/PayoutFee') //eslint-disable-line -let ReturnSubnav = require('./lib/ReturnSubnav') //eslint-disable-line +let ReturnSubsoft = require('./lib/ReturnSubsoft') //eslint-disable-line const config = require('config') @@ -25,11 +25,11 @@ const OutgoingServer = { // --------- Client Initialisation --------------------------------------------- OutgoingServer.init = () => { - OutgoingServer.navClient = new Client({ - username: settings.navCoin.user, - password: settings.navCoin.pass, - port: settings.navCoin.port, - host: settings.navCoin.host, + OutgoingServer.softClient = new Client({ + username: settings.softCoin.user, + password: settings.softCoin.pass, + port: settings.softCoin.port, + host: settings.softCoin.host, }) OutgoingServer.subClient = new Client({ @@ -59,7 +59,7 @@ OutgoingServer.startProcessing = () => { OutgoingServer.runtime = {} OutgoingServer.runtime.cycleStart = new Date() PreFlight.run({ - navClient: OutgoingServer.navClient, + softClient: OutgoingServer.softClient, subClient: OutgoingServer.subClient, settings, }, OutgoingServer.preFlightComplete) @@ -71,28 +71,28 @@ OutgoingServer.preFlightComplete = (success, data) => { OutgoingServer.processing = false return } - OutgoingServer.runtime.navBalance = data.navBalance + OutgoingServer.runtime.softBalance = data.softBalance OutgoingServer.runtime.subBalance = data.subBalance PayoutFee.run({ - navClient: OutgoingServer.navClient, + softClient: OutgoingServer.softClient, settings, }, OutgoingServer.feePaid) } OutgoingServer.feePaid = (success, data) => { if (!success) { - Logger.writeLog('OUT_006', 'failed nav send to txfee address', { data, success }) + Logger.writeLog('OUT_006', 'failed soft send to txfee address', { data, success }) } - OutgoingServer.navClient.getBalance().then((navBalance) => { - OutgoingServer.runtime.navBalance = navBalance + OutgoingServer.softClient.getBalance().then((softBalance) => { + OutgoingServer.runtime.softBalance = softBalance PrepareOutgoing.run({ - navClient: OutgoingServer.navClient, + softClient: OutgoingServer.softClient, subClient: OutgoingServer.subClient, - navBalance, + softBalance, settings, }, OutgoingServer.currentBatchPrepared) }).catch((err) => { - Logger.writeLog('OUT_006A', 'failed nav send to getbalance after sending tx-fee', { data, err }) + Logger.writeLog('OUT_006A', 'failed soft send to getbalance after sending tx-fee', { data, err }) OutgoingServer.processing = false return }) @@ -112,7 +112,7 @@ OutgoingServer.currentBatchPrepared = (success, data) => { ProcessOutgoing.run({ currentBatch: OutgoingServer.runtime.currentBatch, - navClient: OutgoingServer.navClient, + softClient: OutgoingServer.softClient, settings, }, OutgoingServer.transactionsProcessed) } @@ -138,16 +138,16 @@ OutgoingServer.transactionsProcessed = (success, data) => { OutgoingServer.runtime.successfulTransactions = data.successfulTransactions - ReturnSubnav.run({ + ReturnSubsoft.run({ transactions: OutgoingServer.runtime.successfulTransactions, subClient: OutgoingServer.subClient, settings, - }, OutgoingServer.subnavReturned) + }, OutgoingServer.subsoftReturned) } -OutgoingServer.subnavReturned = (success, data) => { +OutgoingServer.subsoftReturned = (success, data) => { if (!success) { - Logger.writeLog('OUT_007', 'unable to return subnav to incoming server', { + Logger.writeLog('OUT_007', 'unable to return subsoft to incoming server', { transactions: OutgoingServer.runtime.successfulTransactions, data, }, true) diff --git a/src/settings/private.settings.json b/src/settings/private.settings.json old mode 100644 new mode 100755 index a2925b4..0c4870e --- a/src/settings/private.settings.json +++ b/src/settings/private.settings.json @@ -23,8 +23,8 @@ }, "maxAddresses": 1000, "maxHolding": 200, - "minNavTransactions": 3, - "maxNavTransactions": 8, + "minSoftTransactions": 3, + "maxSoftTransactions": 8, "txFee": 0.0001, "maxEncryptionAttempts": 10, "encryptionStrength": { diff --git a/src/setup.js b/src/setup.js old mode 100644 new mode 100755 index 17a361d..fc255ba --- a/src/setup.js +++ b/src/setup.js @@ -20,7 +20,7 @@ if (globalSettings.serverType === 'OUTGOING') settings = config.get('OUTGOING') // -------------- INIT SETTINGS AND DAEMONS ------------------------------------ -let navClient +let softClient let subClient if (settings) { @@ -38,11 +38,11 @@ function canInit(settingsValid) { } function initServer() { - navClient = new Client({ - username: settings.navCoin.user, - password: settings.navCoin.pass, - port: settings.navCoin.port, - host: settings.navCoin.host, + softClient = new Client({ + username: settings.softCoin.user, + password: settings.softCoin.pass, + port: settings.softCoin.port, + host: settings.softCoin.host, }) subClient = new Client({ @@ -55,14 +55,14 @@ function initServer() { createKeyPair() return } - unlockNavWallet() + unlockSoftWallet() } // -------------- MAIN FUNCTIONS ----------------------------------------------- -function unlockNavWallet() { - navClient.walletPassphrase(settings.navCoin.walletPassphrase, 600).then(() => { - console.log('STATUS: nav wallet unlock successful') +function unlockSoftWallet() { + softClient.walletPassphrase(settings.softCoin.walletPassphrase, 600).then(() => { + console.log('STATUS: soft wallet unlock successful') unlockSubWallet() }).catch((err) => { switch (err.code) { @@ -70,24 +70,24 @@ function unlockNavWallet() { encryptWallet() break case -17: - navClient.walletLock().then(() => { - unlockNavWallet() + softClient.walletLock().then(() => { + unlockSoftWallet() }).catch(() => { - console.log('ERROR: failed navClient.walletPassphrase', err) + console.log('ERROR: failed softClient.walletPassphrase', err) }) break default: - console.log('ERROR: failed navClient.walletPassphrase', err) + console.log('ERROR: failed softClient.walletPassphrase', err) } }) } const encryptWallet = () => { - navClient.encryptWallet(settings.navCoin.walletPassphrase).then(() => { - console.log('STATUS: nav wallet encrypted with passphrase "' + settings.navCoin.walletPassphrase + '"') - console.log('SUCCESS: please restart navcoind and re-run this script') + softClient.encryptWallet(settings.softCoin.walletPassphrase).then(() => { + console.log('STATUS: soft wallet encrypted with passphrase "' + settings.softCoin.walletPassphrase + '"') + console.log('SUCCESS: please restart softcoind and re-run this script') }).catch((err) => { - console.log('ERROR: failed navClient.encryptWallet', err) + console.log('ERROR: failed softClient.encryptWallet', err) }) } @@ -174,7 +174,7 @@ const testKeyPair = (privKeyFile, pubKeyFile) => { const decrypted = key.decrypt(encrypted, 'base64', 'utf8', ursa.RSA_PKCS1_PADDING) if (decrypted === JSON.stringify(dataToEncrypt)) { console.log('STATUS: encryption test passed', JSON.stringify(dataToEncrypt)) - generateNavAddresses() + generateSoftAddresses() } else { console.log('ERROR: failed to decrypt', dataToEncrypt, encrypted, decrypted) } @@ -185,18 +185,18 @@ const testKeyPair = (privKeyFile, pubKeyFile) => { // -------------- GENERATE ADDRESS BANKS --------------------------------------- -const generateNavAddresses = () => { +const generateSoftAddresses = () => { AddressGenerator.generate({ accountName: privateSettings.account[globalSettings.serverType], - client: navClient, + client: softClient, maxAddresses: privateSettings.maxAddresses, }, generateSubAddresses) } -const generateSubAddresses = (navSuccess) => { - if (!navSuccess) { - console.log('ERROR: failed to generate nav addresses') - Logger.writeLog('002', 'failed to generate nav addresses') +const generateSubAddresses = (softSuccess) => { + if (!softSuccess) { + console.log('ERROR: failed to generate soft addresses') + Logger.writeLog('002', 'failed to generate soft addresses') return } AddressGenerator.generate({ @@ -215,7 +215,7 @@ const generateHoldingAddresses = (subSuccess) => { if (globalSettings.serverType === 'INCOMING') { AddressGenerator.generate({ accountName: privateSettings.account.HOLDING, - client: navClient, + client: softClient, maxAddresses: privateSettings.maxHolding, }, createSecret) } else { @@ -229,8 +229,8 @@ const generateHoldingAddresses = (subSuccess) => { const createSecret = (holdingSuccess) => { if (!holdingSuccess) { - console.log('ERROR: failed to generate holding nav addresses') - Logger.writeLog('002', 'failed to generate holding nav addresses') + console.log('ERROR: failed to generate holding soft addresses') + Logger.writeLog('002', 'failed to generate holding soft addresses') return } diff --git a/src/validators/incoming.validation.json b/src/validators/incoming.validation.json old mode 100644 new mode 100755 index 8b8e4ae..8571632 --- a/src/validators/incoming.validation.json +++ b/src/validators/incoming.validation.json @@ -63,7 +63,7 @@ "type": "DOMAIN" } }, - "navCoin": { + "softCoin": { "user": { "required": true, "type": "STRING" diff --git a/src/validators/outgoing.validation.json b/src/validators/outgoing.validation.json old mode 100644 new mode 100755 index 615fffc..ddf2af3 --- a/src/validators/outgoing.validation.json +++ b/src/validators/outgoing.validation.json @@ -38,7 +38,7 @@ "type": "INT", "min": 10 }, - "navPoolAmount": { + "softPoolAmount": { "required": true, "type": "INT", "min": 50000 @@ -50,7 +50,7 @@ }, "anonTxFeeAddress": { "required": true, - "type": "NAV_ADDRESS" + "type": "SOFT_ADDRESS" }, "notificationEmail": { "required": true, @@ -70,7 +70,7 @@ "type": "DOMAIN" } }, - "navCoin": { + "softCoin": { "user": { "required": true, "type": "STRING" diff --git a/ssl/server.crt b/ssl/server.crt old mode 100644 new mode 100755 diff --git a/ssl/server.csr b/ssl/server.csr old mode 100644 new mode 100755 diff --git a/ssl/server.key b/ssl/server.key old mode 100644 new mode 100755 diff --git a/ssl/server.key.org b/ssl/server.key.org old mode 100644 new mode 100755 diff --git a/test/AddressGenerator.spec.js b/test/AddressGenerator.spec.js old mode 100644 new mode 100755 diff --git a/test/EncryptedData.spec.js b/test/EncryptedData.spec.js old mode 100644 new mode 100755 diff --git a/test/EncryptionKeys.spec.js b/test/EncryptionKeys.spec.js old mode 100644 new mode 100755 diff --git a/test/FlattenTransactions.spec.js b/test/FlattenTransactions.spec.js old mode 100644 new mode 100755 diff --git a/test/GroupPartials.spec.js b/test/GroupPartials.spec.js old mode 100644 new mode 100755 diff --git a/test/Logger.spec.js b/test/Logger.spec.js old mode 100644 new mode 100755 diff --git a/test/PayoutFee.spec.js b/test/PayoutFee.spec.js old mode 100644 new mode 100755 index 018efa5..b159a7e --- a/test/PayoutFee.spec.js +++ b/test/PayoutFee.spec.js @@ -30,10 +30,10 @@ describe('[PayoutFee]', () => { expect(true).toBe(true) done() } - PayoutFee.run({ settings: 'bloop', navClient: 'wow' }, callback) + PayoutFee.run({ settings: 'bloop', softClient: 'wow' }, callback) }) describe('(send)', () => { - it('should fail when navBalance is less than poolAmount', (done) => { + it('should fail when softBalance is less than poolAmount', (done) => { const callback = (success, data) => { expect(success).toBe(false) sinon.assert.calledWith(mockLogger.writeLog, 'PAY_002') @@ -44,12 +44,12 @@ describe('[PayoutFee]', () => { listUnspent: () => { return Promise.resolve([{ amount: 100 }, { amount: 200 }, { amount: 500 }]) }, } const mockSettings = { - navPoolAmount: 1000, + softPoolAmount: 1000, } PayoutFee.runtime = { callback, settings: mockSettings, - navClient: mockClient, + softClient: mockClient, } const mockLogger = { writeLog: sinon.spy(), @@ -57,7 +57,7 @@ describe('[PayoutFee]', () => { PayoutFee.__set__('Logger', mockLogger) PayoutFee.send() }) - it('should fail when navPayout is less than the minimum specified amount', (done) => { + it('should fail when softPayout is less than the minimum specified amount', (done) => { const callback = (success, data) => { expect(success).toBe(false) sinon.assert.notCalled(mockLogger.writeLog) @@ -68,7 +68,7 @@ describe('[PayoutFee]', () => { listUnspent: () => { return Promise.resolve([{ amount: 100 }, { amount: 200 }, { amount: 500 }]) }, } const mockSettings = { - navPoolAmount: 500, + softPoolAmount: 500, txFeePayoutMin: 500, } PayoutFee.privateSettings = { @@ -77,7 +77,7 @@ describe('[PayoutFee]', () => { PayoutFee.runtime = { callback, settings: mockSettings, - navClient: mockClient, + softClient: mockClient, } const mockLogger = { writeLog: sinon.spy(), @@ -98,7 +98,7 @@ describe('[PayoutFee]', () => { listUnspent: () => { return Promise.reject({ err: { code: -21 } }) }, } const mockSettings = { - navPoolAmount: 100, + softPoolAmount: 100, txFeePayoutMin: 1, anonTxFeeAddress: 'abc123', } @@ -109,7 +109,7 @@ describe('[PayoutFee]', () => { PayoutFee.runtime = { callback, settings: mockSettings, - navClient: mockClient, + softClient: mockClient, } PayoutFee.send() }) @@ -131,14 +131,14 @@ describe('[PayoutFee]', () => { listUnspent: () => { return Promise.resolve([{ amount: 100 }, { amount: 200 }, { amount: 500 }]) }, } const mockSettings = { - navPoolAmount: 500, + softPoolAmount: 500, txFeePayoutMin: 100, anonTxFeeAddress: 'abc123', } PayoutFee.runtime = { callback, settings: mockSettings, - navClient: mockClient, + softClient: mockClient, } PayoutFee.__set__('SendToAddress', SendToAddress) PayoutFee.send() @@ -168,14 +168,14 @@ describe('[PayoutFee]', () => { getBalance: () => { return Promise.resolve(120) }, } const mockSettings = { - navPoolAmount: 10, + softPoolAmount: 10, txFeePayoutMin: 1, anonTxFeeAddress: 'abc123', } PayoutFee.runtime = { callback, settings: mockSettings, - navClient: mockClient, + softClient: mockClient, } PayoutFee.sent(false) }) @@ -190,14 +190,14 @@ describe('[PayoutFee]', () => { getBalance: () => { return Promise.resolve(120) }, } const mockSettings = { - navPoolAmount: 10, + softPoolAmount: 10, txFeePayoutMin: 1, anonTxFeeAddress: 'abc123', } PayoutFee.runtime = { callback, settings: mockSettings, - navClient: mockClient, + softClient: mockClient, } PayoutFee.sent(true, { test: 'data' }) }) diff --git a/test/PreFlight.spec.js b/test/PreFlight.spec.js old mode 100644 new mode 100755 index 8924904..0279bce --- a/test/PreFlight.spec.js +++ b/test/PreFlight.spec.js @@ -30,16 +30,16 @@ describe('[PreFlight]', () => { it('should receive correct params and call checkBlockHeight', (done) => { const callback = () => {} - const mockNavClient = { test: 1 } + const mockSoftClient = { test: 1 } const mockSubClient = { test: 2 } - const mockNavCoin = { + const mockSoftCoin = { checkBlockHeight: (options, parsedCallback) => { - expect(parsedCallback).toBe(PreFlight.navBlocksChecked) + expect(parsedCallback).toBe(PreFlight.softBlocksChecked) expect(options).toBeA('object') expect(PreFlight.runtime).toEqual({ callback, - navClient: mockNavClient, + softClient: mockSoftClient, subClient: mockSubClient, settings: incomingSettings, }) @@ -47,16 +47,16 @@ describe('[PreFlight]', () => { }, } - PreFlight.__set__('NavCoin', mockNavCoin) + PreFlight.__set__('SoftCoin', mockSoftCoin) PreFlight.run({ - navClient: mockNavClient, + softClient: mockSoftClient, subClient: mockSubClient, settings: incomingSettings, }, callback) }) }) - describe('(navBlocksChecked)', () => { + describe('(softBlocksChecked)', () => { it('should fail due to success being false', (done) => { const mockLogger = { writeLog: sinon.spy(), @@ -71,7 +71,7 @@ describe('[PreFlight]', () => { }, } PreFlight.__set__('Logger', mockLogger) - PreFlight.navBlocksChecked(false, {}) + PreFlight.softBlocksChecked(false, {}) }) it('should fail due to data being undefined', (done) => { const mockLogger = { @@ -87,7 +87,7 @@ describe('[PreFlight]', () => { }, } PreFlight.__set__('Logger', mockLogger) - PreFlight.navBlocksChecked(true) + PreFlight.softBlocksChecked(true) }) it('should fail to set the tx fee', (done) => { const mockLogger = { @@ -101,12 +101,12 @@ describe('[PreFlight]', () => { sinon.assert.calledOnce(mockLogger.writeLog) done() }, - navClient: { + softClient: { setTxFee: () => { return Promise.reject({ code: -17 }) }, }, } PreFlight.__set__('Logger', mockLogger) - PreFlight.navBlocksChecked(true, { + PreFlight.softBlocksChecked(true, { balance: 100, }) }) @@ -115,17 +115,17 @@ describe('[PreFlight]', () => { writeLog: sinon.spy(), } - const mockNavCoin = { + const mockSoftCoin = { checkBlockHeight: (options, parsedCallback) => { expect(parsedCallback).toBe(PreFlight.subBlocksChecked) expect(options).toBeA('object') - expect(PreFlight.runtime.navBalance).toBe(100) + expect(PreFlight.runtime.softBalance).toBe(100) done() }, } PreFlight.runtime = { - navClient: { + softClient: { setTxFee: () => { return Promise.resolve() }, }, subClient: { @@ -133,9 +133,9 @@ describe('[PreFlight]', () => { }, } - PreFlight.__set__('NavCoin', mockNavCoin) + PreFlight.__set__('SoftCoin', mockSoftCoin) PreFlight.__set__('Logger', mockLogger) - PreFlight.navBlocksChecked(true, { + PreFlight.softBlocksChecked(true, { balance: 100, }) }) @@ -173,19 +173,19 @@ describe('[PreFlight]', () => { PreFlight.__set__('Logger', mockLogger) PreFlight.subBlocksChecked(true) }) - it('should save the subBalance to memory and unlock the navClient', (done) => { - const mockNavCoin = { + it('should save the subBalance to memory and unlock the softClient', (done) => { + const mockSoftCoin = { unlockWallet: (options, parsedCallback) => { - expect(parsedCallback).toBe(PreFlight.navClientUnlocked) + expect(parsedCallback).toBe(PreFlight.softClientUnlocked) expect(options).toBeA('object') - expect(options.type).toBe('navCoin') + expect(options.type).toBe('softCoin') expect(PreFlight.runtime.subBalance).toBe(200) done() }, } PreFlight.runtime = { - navClient: { + softClient: { setTxFee: () => { return Promise.resolve() }, }, subClient: { @@ -193,13 +193,13 @@ describe('[PreFlight]', () => { }, } - PreFlight.__set__('NavCoin', mockNavCoin) + PreFlight.__set__('SoftCoin', mockSoftCoin) PreFlight.subBlocksChecked(true, { balance: 200, }) }) }) - describe('(navClientUnlocked)', () => { + describe('(softClientUnlocked)', () => { it('should fail due to success being false', (done) => { const mockLogger = { writeLog: sinon.spy(), @@ -214,10 +214,10 @@ describe('[PreFlight]', () => { }, } PreFlight.__set__('Logger', mockLogger) - PreFlight.navClientUnlocked(false, {}) + PreFlight.softClientUnlocked(false, {}) }) it('should unlock the subClient', (done) => { - const mockNavCoin = { + const mockSoftCoin = { unlockWallet: (options, parsedCallback) => { expect(parsedCallback).toBe(PreFlight.subClientUnlocked) expect(options).toBeA('object') @@ -227,7 +227,7 @@ describe('[PreFlight]', () => { } PreFlight.runtime = { - navClient: { + softClient: { setTxFee: () => { return Promise.resolve() }, }, subClient: { @@ -235,8 +235,8 @@ describe('[PreFlight]', () => { }, } - PreFlight.__set__('NavCoin', mockNavCoin) - PreFlight.navClientUnlocked(true) + PreFlight.__set__('SoftCoin', mockSoftCoin) + PreFlight.softClientUnlocked(true) }) }) describe('(subClientUnlocked)', () => { @@ -280,14 +280,14 @@ describe('[PreFlight]', () => { callback: (success, data) => { expect(success).toBe(true) expect(data).toBeA('object') - expect(data.navBalance).toBe(100) + expect(data.softBalance).toBe(100) expect(data.subBalance).toBe(200) done() }, subClient: { setTxFee: () => { return Promise.resolve() }, }, - navBalance: 100, + softBalance: 100, subBalance: 200, } PreFlight.subClientUnlocked(true, {}) diff --git a/test/PrepareIncoming.spec.js b/test/PrepareIncoming.spec.js old mode 100644 new mode 100755 index a67f48d..8543620 --- a/test/PrepareIncoming.spec.js +++ b/test/PrepareIncoming.spec.js @@ -28,8 +28,8 @@ describe('[PrepareIncoming]', () => { it('should set the runtime variables and call getUnspent', (done) => { PrepareIncoming.getUnspent = () => { expect(PrepareIncoming.runtime.callback).toBe(callback) - expect(PrepareIncoming.runtime.navClient).toBe(mockClient) - expect(PrepareIncoming.runtime.outgoingNavBalance).toBe(50000) + expect(PrepareIncoming.runtime.softClient).toBe(mockClient) + expect(PrepareIncoming.runtime.outgoingSoftBalance).toBe(50000) expect(PrepareIncoming.runtime.subBalance).toBe(1000) done() } @@ -41,8 +41,8 @@ describe('[PrepareIncoming]', () => { } PrepareIncoming.run({ - navClient: mockClient, - outgoingNavBalance: 50000, + softClient: mockClient, + outgoingSoftBalance: 50000, subBalance: 1000, settings: { test: true }, }, callback) @@ -67,7 +67,7 @@ describe('[PrepareIncoming]', () => { } PrepareIncoming.__set__('Logger', mockLogger) PrepareIncoming.runtime = { - navClient: mockClient, + softClient: mockClient, callback, } PrepareIncoming.getUnspent() @@ -87,13 +87,13 @@ describe('[PrepareIncoming]', () => { } PrepareIncoming.__set__('Logger', mockLogger) PrepareIncoming.runtime = { - navClient: mockClient, + softClient: mockClient, callback, } PrepareIncoming.getUnspent() }) it('should find unspent and call the filter function', (done) => { - const mockNavCoin = { + const mockSoftCoin = { filterUnspent: (options, parsedCallback) => { expect(parsedCallback).toBe(PrepareIncoming.unspentFiltered) expect(options.unspent).toBe(unspent) @@ -112,9 +112,9 @@ describe('[PrepareIncoming]', () => { writeLog: sinon.spy(), } PrepareIncoming.__set__('Logger', mockLogger) - PrepareIncoming.__set__('NavCoin', mockNavCoin) + PrepareIncoming.__set__('SoftCoin', mockSoftCoin) PrepareIncoming.runtime = { - navClient: mockClient, + softClient: mockClient, callback, } PrepareIncoming.getUnspent() @@ -139,7 +139,7 @@ describe('[PrepareIncoming]', () => { } PrepareIncoming.__set__('Logger', mockLogger) PrepareIncoming.runtime = { - navClient: mockClient, + softClient: mockClient, callback, } PrepareIncoming.unspentFiltered(false) @@ -159,7 +159,7 @@ describe('[PrepareIncoming]', () => { } PrepareIncoming.__set__('Logger', mockLogger) PrepareIncoming.runtime = { - navClient: mockClient, + softClient: mockClient, callback, } PrepareIncoming.unspentFiltered(true, { @@ -181,7 +181,7 @@ describe('[PrepareIncoming]', () => { } PrepareIncoming.__set__('Logger', mockLogger) PrepareIncoming.runtime = { - navClient: mockClient, + softClient: mockClient, callback, } PrepareIncoming.unspentFiltered(true, { @@ -206,9 +206,9 @@ describe('[PrepareIncoming]', () => { PrepareIncoming.__set__('Logger', mockLogger) PrepareIncoming.__set__('GroupPartials', GroupPartials) PrepareIncoming.runtime = { - navClient: mockClient, + softClient: mockClient, subBalance: 1000, - outgoingNavBalance: 50000, + outgoingSoftBalance: 50000, } const currentPending = [1, 2, 3, 4] PrepareIncoming.unspentFiltered(true, { @@ -304,9 +304,9 @@ describe('[PrepareIncoming]', () => { } PrepareIncoming.runtime = { currentPending: 1234, - navClient: 3456, + softClient: 3456, subBalance: 1000, - outgoingNavBalance: 10000, + outgoingSoftBalance: 10000, } const mockLogger = { writeLog: sinon.spy(), diff --git a/test/PrepareOutgoing.spec.js b/test/PrepareOutgoing.spec.js old mode 100644 new mode 100755 index 40e7312..4629d0a --- a/test/PrepareOutgoing.spec.js +++ b/test/PrepareOutgoing.spec.js @@ -29,9 +29,9 @@ describe('[PrepareOutgoing]', () => { it('should set the runtime variables and fail to get the blockHeight', (done) => { const callback = () => { expect(PrepareOutgoing.runtime.callback).toBe(callback) - expect(PrepareOutgoing.runtime.navClient).toBe(mockClient) + expect(PrepareOutgoing.runtime.softClient).toBe(mockClient) expect(PrepareOutgoing.runtime.subClient).toBe(mockClient) - expect(PrepareOutgoing.runtime.navBalance).toBe(50000) + expect(PrepareOutgoing.runtime.softBalance).toBe(50000) expect(PrepareOutgoing.runtime.settings).toEqual({ test: 1 }) expect(PrepareOutgoing.runtime.failedSubTransactions).toEqual([]) expect(PrepareOutgoing.runtime.currentBatch).toEqual([]) @@ -53,18 +53,18 @@ describe('[PrepareOutgoing]', () => { } PrepareOutgoing.run({ - navClient: mockClient, + softClient: mockClient, subClient: mockClient, - navBalance: 50000, + softBalance: 50000, settings: { test: 1 }, }, callback) }) it('should set the runtime variables and call getUnspent', (done) => { PrepareOutgoing.getUnspent = () => { expect(PrepareOutgoing.runtime.callback).toBe(callback) - expect(PrepareOutgoing.runtime.navClient).toBe(mockClient) - expect(PrepareOutgoing.runtime.navClient).toBe(mockClient) - expect(PrepareOutgoing.runtime.navBalance).toBe(50000) + expect(PrepareOutgoing.runtime.softClient).toBe(mockClient) + expect(PrepareOutgoing.runtime.softClient).toBe(mockClient) + expect(PrepareOutgoing.runtime.softBalance).toBe(50000) expect(PrepareOutgoing.runtime.settings).toEqual({ test: 1 }) expect(PrepareOutgoing.runtime.failedSubTransactions).toEqual([]) expect(PrepareOutgoing.runtime.currentBatch).toEqual([]) @@ -86,9 +86,9 @@ describe('[PrepareOutgoing]', () => { } PrepareOutgoing.run({ - navClient: mockClient, + softClient: mockClient, subClient: mockClient, - navBalance: 50000, + softBalance: 50000, settings: { test: 1 }, }, callback) }) @@ -139,7 +139,7 @@ describe('[PrepareOutgoing]', () => { PrepareOutgoing.getUnspent() }) it('should find unspent and call the filter function', (done) => { - const mockNavCoin = { + const mockSoftCoin = { filterUnspent: (options, parsedCallback) => { expect(parsedCallback).toBe(PrepareOutgoing.unspentFiltered) expect(options.unspent).toBe(unspent) @@ -158,7 +158,7 @@ describe('[PrepareOutgoing]', () => { writeLog: sinon.spy(), } PrepareOutgoing.__set__('Logger', mockLogger) - PrepareOutgoing.__set__('NavCoin', mockNavCoin) + PrepareOutgoing.__set__('SoftCoin', mockSoftCoin) PrepareOutgoing.runtime = { subClient: mockClient, callback, @@ -519,7 +519,7 @@ describe('[PrepareOutgoing]', () => { amount: 100, } PrepareOutgoing.runtime = { - navClient: mockClient, + softClient: mockClient, } PrepareOutgoing.__set__('Logger', mockLogger) PrepareOutgoing.testDecrypted(decrypted, transaction) @@ -546,7 +546,7 @@ describe('[PrepareOutgoing]', () => { amount: 100, } PrepareOutgoing.runtime = { - navClient: mockClient, + softClient: mockClient, } PrepareOutgoing.__set__('Logger', mockLogger) PrepareOutgoing.testDecrypted(decrypted, transaction) @@ -575,8 +575,8 @@ describe('[PrepareOutgoing]', () => { amount: 100, } PrepareOutgoing.runtime = { - navClient: mockClient, - navBalance: 50000, + softClient: mockClient, + softBalance: 50000, sumPending: 0, currentBatch: [], currentPending: [1, 2, 3], @@ -611,8 +611,8 @@ describe('[PrepareOutgoing]', () => { amount: 100, } PrepareOutgoing.runtime = { - navClient: mockClient, - navBalance: 50000, + softClient: mockClient, + softBalance: 50000, sumPending: 0, currentBatch: [], currentPending: [1, 2, 3], @@ -638,8 +638,8 @@ describe('[PrepareOutgoing]', () => { amount: 100, } PrepareOutgoing.runtime = { - navClient: mockClient, - navBalance: 50000, + softClient: mockClient, + softBalance: 50000, sumPending: 49500, currentBatch: [4, 5], failedSubTransactions: [{ tx: 10 }, { tx: 155 }], diff --git a/test/ProcessIncoming.spec.js b/test/ProcessIncoming.spec.js old mode 100644 new mode 100755 index 001a421..3e55046 --- a/test/ProcessIncoming.spec.js +++ b/test/ProcessIncoming.spec.js @@ -41,7 +41,7 @@ describe('[ProcessIncoming]', () => { currentBatch: [], settings: { setting: true }, subClient: { test: true }, - navClient: { + softClient: { getBlockCount: () => { return Promise.reject({ err: { code: -21 } }) }, @@ -60,7 +60,7 @@ describe('[ProcessIncoming]', () => { expect(ProcessIncoming.runtime.remainingTxGroups).toBe(mockOptions.currentBatch) expect(ProcessIncoming.runtime.settings).toBe(mockOptions.settings) expect(ProcessIncoming.runtime.subClient).toBe(mockOptions.subClient) - expect(ProcessIncoming.runtime.navClient).toBe(mockOptions.navClient) + expect(ProcessIncoming.runtime.softClient).toBe(mockOptions.softClient) expect(ProcessIncoming.runtime.outgoingPubKey).toBe(mockOptions.outgoingPubKey) expect(ProcessIncoming.runtime.subAddresses).toBe(mockOptions.subAddresses) expect(ProcessIncoming.runtime.currentFlattened).toBe(mockOptions.currentFlattened) @@ -72,7 +72,7 @@ describe('[ProcessIncoming]', () => { currentBatch: [], settings: { setting: true }, subClient: { test: true }, - navClient: { + softClient: { getBlockCount: () => { return Promise.resolve(1000) }, diff --git a/test/ProcessOutgoing.spec.js b/test/ProcessOutgoing.spec.js old mode 100644 new mode 100755 index ae8fc6e..c066cd7 --- a/test/ProcessOutgoing.spec.js +++ b/test/ProcessOutgoing.spec.js @@ -25,7 +25,7 @@ describe('[ProcessOutgoing]', () => { it('should set the runtime variables and call getUnspent', (done) => { ProcessOutgoing.processPending = () => { expect(ProcessOutgoing.runtime.callback).toBe(callback) - expect(ProcessOutgoing.runtime.navClient).toBe(mockClient) + expect(ProcessOutgoing.runtime.softClient).toBe(mockClient) expect(ProcessOutgoing.runtime.settings).toEqual({ test: 1 }) expect(ProcessOutgoing.runtime.successfulTransactions).toEqual([]) expect(ProcessOutgoing.runtime.failedTransactions).toEqual([]) @@ -45,7 +45,7 @@ describe('[ProcessOutgoing]', () => { } ProcessOutgoing.run({ - navClient: mockClient, + softClient: mockClient, currentBatch: [1, 2, 3], settings: { test: 1 }, }, callback) @@ -82,12 +82,12 @@ describe('[ProcessOutgoing]', () => { ], successfulTransactions: [1, 2, 3], failedTransactions: [4, 5, 6], - navClient: { getInfo: true }, + softClient: { getInfo: true }, } const SendToAddress = { send: (options, callback) => { - expect(callback).toBe(ProcessOutgoing.sentNav) - expect(options.client).toBe(ProcessOutgoing.runtime.navClient) + expect(callback).toBe(ProcessOutgoing.sentSoft) + expect(options.client).toBe(ProcessOutgoing.runtime.softClient) expect(options.address).toBe('ASDF') expect(options.amount).toBe(333) expect(options.transaction).toEqual({ txid: 1234, decrypted: { n: 'ASDF', v: 333 } }) @@ -174,11 +174,11 @@ describe('[ProcessOutgoing]', () => { ProcessOutgoing.mockSend() }) }) - describe('(sentNav)', () => { + describe('(sentSoft)', () => { beforeEach(() => { // reset the rewired functions ProcessOutgoing = rewire('../src/lib/ProcessOutgoing') }) - it('should fail to send partial nav (returned false) and try the next one', (done) => { + it('should fail to send partial soft (returned false) and try the next one', (done) => { const mockLogger = { writeLog: sinon.spy(), } @@ -216,9 +216,9 @@ describe('[ProcessOutgoing]', () => { } ProcessOutgoing.__set__('Logger', mockLogger) - ProcessOutgoing.sentNav(false, { junkParam: 1234 }) + ProcessOutgoing.sentSoft(false, { junkParam: 1234 }) }) - it('should fail to send partial nav (bad data) and try the next one', (done) => { + it('should fail to send partial soft (bad data) and try the next one', (done) => { const mockLogger = { writeLog: sinon.spy(), } @@ -256,9 +256,9 @@ describe('[ProcessOutgoing]', () => { } ProcessOutgoing.__set__('Logger', mockLogger) - ProcessOutgoing.sentNav(true, { junkParam: 1234 }) + ProcessOutgoing.sentSoft(true, { junkParam: 1234 }) }) - it('should fail to send partial (no data) nav and try the next one', (done) => { + it('should fail to send partial (no data) soft and try the next one', (done) => { const mockLogger = { writeLog: sinon.spy(), } @@ -296,9 +296,9 @@ describe('[ProcessOutgoing]', () => { } ProcessOutgoing.__set__('Logger', mockLogger) - ProcessOutgoing.sentNav(true) + ProcessOutgoing.sentSoft(true) }) - it('should successfully send the partial nav and try the next partial', (done) => { + it('should successfully send the partial soft and try the next partial', (done) => { const mockLogger = { writeLog: sinon.spy(), } @@ -335,7 +335,7 @@ describe('[ProcessOutgoing]', () => { } ProcessOutgoing.__set__('Logger', mockLogger) - ProcessOutgoing.sentNav(true, { sendOutcome: '1234' }) + ProcessOutgoing.sentSoft(true, { sendOutcome: '1234' }) }) }) }) diff --git a/test/RandomizeTransactions.spec.js b/test/RandomizeTransactions.spec.js old mode 100644 new mode 100755 diff --git a/test/RefillOutgoing.spec.js b/test/RefillOutgoing.spec.js old mode 100644 new mode 100755 index a7ce97e..886061d --- a/test/RefillOutgoing.spec.js +++ b/test/RefillOutgoing.spec.js @@ -26,7 +26,7 @@ describe('[RefillOutgoing]', () => { }) it('should get the right params and call getUnspent', (done) => { const callback = () => {} - const navClient = {} + const softClient = {} RefillOutgoing.getUnspent = () => { expect(RefillOutgoing.runtime.callback).toBe(callback) sinon.assert.notCalled(mockLogger.writeLog) @@ -36,7 +36,7 @@ describe('[RefillOutgoing]', () => { writeLog: sinon.spy(), } RefillOutgoing.__set__('Logger', mockLogger) - RefillOutgoing.run({ navClient }, callback) + RefillOutgoing.run({ softClient }, callback) }) }) describe('(getUnspent)', () => { @@ -48,7 +48,7 @@ describe('[RefillOutgoing]', () => { listUnspent: () => { return Promise.reject({ code: -4 }) }, } RefillOutgoing.runtime = { - navClient: mockClient, + softClient: mockClient, callback: (success, data) => { expect(success).toBe(false) expect(data.message).toBeA('string') @@ -68,7 +68,7 @@ describe('[RefillOutgoing]', () => { listUnspent: () => { return Promise.resolve([]) }, } RefillOutgoing.runtime = { - navClient: mockClient, + softClient: mockClient, callback: (success, data) => { expect(success).toBe(true) expect(data.message).toBeA('string') @@ -88,10 +88,10 @@ describe('[RefillOutgoing]', () => { listUnspent: () => { return Promise.resolve([1, 2, 3]) }, } RefillOutgoing.runtime = { - navClient: mockClient, + softClient: mockClient, callback: () => {}, } - const NavCoin = { + const SoftCoin = { filterUnspent: (options, callback) => { expect(options.client).toBe(mockClient) expect(options.unspent).toEqual([1, 2, 3]) @@ -104,7 +104,7 @@ describe('[RefillOutgoing]', () => { writeLog: sinon.spy(), } RefillOutgoing.__set__('Logger', mockLogger) - RefillOutgoing.__set__('NavCoin', NavCoin) + RefillOutgoing.__set__('SoftCoin', SoftCoin) RefillOutgoing.getUnspent() }) }) @@ -220,14 +220,14 @@ describe('[RefillOutgoing]', () => { const hld1 = { confirmations: 5, amount: 100, txid: 'XYZ' } const hld2 = { confirmations: 10, amount: 500, txid: 'ABC' } RefillOutgoing.runtime = { - navClient: {}, + softClient: {}, currentHolding: [hld1, hld2], } const EncryptedData = { getEncrypted: (options, callback) => { expect(callback).toEqual(RefillOutgoing.holdingDecrypted) expect(options.transaction).toBe(hld1) - expect(options.client).toBe(RefillOutgoing.runtime.navClient) + expect(options.client).toBe(RefillOutgoing.runtime.softClient) sinon.assert.notCalled(mockLogger.writeLog) done() }, @@ -326,7 +326,7 @@ describe('[RefillOutgoing]', () => { incoming: (options, callback) => { expect(callback).toEqual(RefillOutgoing.checkRandomTransactions) expect(options.totalToSend).toBe(500) - expect(options.addresses.length).toBeGreaterThanOrEqualTo(privateSettings.minNavTransactions) + expect(options.addresses.length).toBeGreaterThanOrEqualTo(privateSettings.minSoftTransactions) expect(options.addresses.length).toBeLessThanOrEqualTo(decrypted.length) sinon.assert.notCalled(mockLogger.writeLog) if (i === 100) done() diff --git a/test/RetrieveSubchainAddresses.spec.js b/test/RetrieveSubchainAddresses.spec.js old mode 100644 new mode 100755 index 1e6ad0f..ce6f42f --- a/test/RetrieveSubchainAddresses.spec.js +++ b/test/RetrieveSubchainAddresses.spec.js @@ -282,7 +282,7 @@ describe('[RetrieveSubchainAddresses]', () => { RetrieveSubchainAddresses.runtime = { numAddresses: 3, } - const NavCoin = { + const SoftCoin = { validateAddresses: (options, callback) => { expect(callback).toBe(RetrieveSubchainAddresses.subAddressesValid) sinon.assert.notCalled(mockLogger.writeLog) @@ -293,7 +293,7 @@ describe('[RetrieveSubchainAddresses]', () => { writeLog: sinon.spy(), } RetrieveSubchainAddresses.__set__('Logger', mockLogger) - RetrieveSubchainAddresses.__set__('NavCoin', NavCoin) + RetrieveSubchainAddresses.__set__('SoftCoin', SoftCoin) RetrieveSubchainAddresses.checkSubAddresses([1, 2, 3]) }) }) diff --git a/test/ReturnAllToSenders.spec.js b/test/ReturnAllToSenders.spec.js old mode 100644 new mode 100755 index 6842310..ee7bdff --- a/test/ReturnAllToSenders.spec.js +++ b/test/ReturnAllToSenders.spec.js @@ -25,10 +25,10 @@ describe('[ReturnAllToSenders]', () => { }) it('should procedd to run getUnspent', (done) => { const callback = () => {} - const navClient = {} + const softClient = {} ReturnAllToSenders.getUnspent = () => { expect(ReturnAllToSenders.runtime.callback).toBe(callback) - expect(ReturnAllToSenders.runtime.navClient).toBe(navClient) + expect(ReturnAllToSenders.runtime.softClient).toBe(softClient) sinon.assert.notCalled(mockLogger.writeLog) done() } @@ -36,7 +36,7 @@ describe('[ReturnAllToSenders]', () => { writeLog: sinon.spy(), } ReturnAllToSenders.__set__('Logger', mockLogger) - ReturnAllToSenders.run({ navClient }, callback) + ReturnAllToSenders.run({ softClient }, callback) }) }) describe('(fromList)', () => { @@ -59,11 +59,11 @@ describe('[ReturnAllToSenders]', () => { }) it('should procedd to run returnToSender', (done) => { const callback = () => {} - const navClient = {} + const softClient = {} const transactionsToReturn = [1, 2, 3] ReturnAllToSenders.returnToSender = () => { expect(ReturnAllToSenders.runtime.callback).toBe(callback) - expect(ReturnAllToSenders.runtime.navClient).toBe(navClient) + expect(ReturnAllToSenders.runtime.softClient).toBe(softClient) expect(ReturnAllToSenders.runtime.transactionsToReturn).toBe(transactionsToReturn) sinon.assert.notCalled(mockLogger.writeLog) done() @@ -72,7 +72,7 @@ describe('[ReturnAllToSenders]', () => { writeLog: sinon.spy(), } ReturnAllToSenders.__set__('Logger', mockLogger) - ReturnAllToSenders.fromList({ navClient, transactionsToReturn }, callback) + ReturnAllToSenders.fromList({ softClient, transactionsToReturn }, callback) }) }) describe('(getUnspent)', () => { @@ -81,7 +81,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should fail to get the unspent', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.reject({ code: -17 }) }, }, callback: (success, data) => { @@ -100,7 +100,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should get unspent but there are none', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.resolve([]) }, }, callback: (success, data) => { @@ -118,15 +118,15 @@ describe('[ReturnAllToSenders]', () => { }) it('should get unspent and call the filter function', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.resolve([1, 2, 3]) }, }, } - const NavCoin = { + const SoftCoin = { filterUnspent: (options, callback) => { expect(callback).toBe(ReturnAllToSenders.unspentFiltered) expect(options.unspent).toEqual([1, 2, 3]) - expect(options.client).toBe(ReturnAllToSenders.runtime.navClient) + expect(options.client).toBe(ReturnAllToSenders.runtime.softClient) expect(options.accountName).toBe(privateSettings.account.INCOMING) sinon.assert.notCalled(mockLogger.writeLog) done() @@ -136,7 +136,7 @@ describe('[ReturnAllToSenders]', () => { writeLog: sinon.spy(), } ReturnAllToSenders.__set__('Logger', mockLogger) - ReturnAllToSenders.__set__('NavCoin', NavCoin) + ReturnAllToSenders.__set__('SoftCoin', SoftCoin) ReturnAllToSenders.getUnspent() }) }) @@ -146,7 +146,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should fail to filter the unspent (returned false)', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.reject({ code: -17 }) }, }, callback: (success, data) => { @@ -165,7 +165,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should fail to filter the unspent (no data)', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.reject({ code: -17 }) }, }, callback: (success, data) => { @@ -184,7 +184,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should fail to filter the unspent (no currentPending)', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.reject({ code: -17 }) }, }, callback: (success, data) => { @@ -203,7 +203,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should get unspent and call the filter function', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.resolve([1, 2, 3]) }, }, } @@ -225,7 +225,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should fail because the filtered wasnt an array', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.reject({ code: -17 }) }, }, transactionsToReturn: 1234, @@ -244,7 +244,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should fail because ther were no filtered', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.reject({ code: -17 }) }, }, transactionsToReturn: [], @@ -263,7 +263,7 @@ describe('[ReturnAllToSenders]', () => { }) it('should succeed and call the send function', (done) => { ReturnAllToSenders.runtime = { - navClient: { + softClient: { listUnspent: () => { return Promise.reject({ code: -17 }) }, }, transactionsToReturn: [1, 2, 3], @@ -273,7 +273,7 @@ describe('[ReturnAllToSenders]', () => { send: (options, callback) => { expect(callback).toBe(ReturnAllToSenders.returnedToSender) expect(options.transaction).toEqual(1) - expect(options.client).toBe(ReturnAllToSenders.runtime.navClient) + expect(options.client).toBe(ReturnAllToSenders.runtime.softClient) sinon.assert.notCalled(mockLogger.writeLog) done() }, diff --git a/test/ReturnSubnav.spec.js b/test/ReturnSubsoft.spec.js old mode 100644 new mode 100755 similarity index 59% rename from test/ReturnSubnav.spec.js rename to test/ReturnSubsoft.spec.js index 522e4b0..2fd4486 --- a/test/ReturnSubnav.spec.js +++ b/test/ReturnSubsoft.spec.js @@ -4,9 +4,9 @@ const expect = require('expect') const rewire = require('rewire') const sinon = require('sinon') -let ReturnSubnav = rewire('../src/lib/ReturnSubnav') +let ReturnSubsoft = rewire('../src/lib/ReturnSubsoft') -describe('[ReturnSubnav]', () => { +describe('[ReturnSubsoft]', () => { describe('(run)', () => { it('should fail on params', (done) => { const callback = (success, data) => { @@ -19,34 +19,34 @@ describe('[ReturnSubnav]', () => { const mockLogger = { writeLog: sinon.spy(), } - ReturnSubnav.__set__('Logger', mockLogger) - ReturnSubnav.run({ junkParam: 1234 }, callback) + ReturnSubsoft.__set__('Logger', mockLogger) + ReturnSubsoft.run({ junkParam: 1234 }, callback) }) it('should have the right params and call sendToIncoming', (done) => { const callback = () => {} const subClient = {} const settings = {} - ReturnSubnav.sendToIncoming = () => { - expect(ReturnSubnav.runtime.callback).toBe(callback) - expect(ReturnSubnav.runtime.subClient).toBe(subClient) - expect(ReturnSubnav.runtime.transactions).toEqual([1, 2, 3, 4]) - expect(ReturnSubnav.runtime.settings).toBe(settings) + ReturnSubsoft.sendToIncoming = () => { + expect(ReturnSubsoft.runtime.callback).toBe(callback) + expect(ReturnSubsoft.runtime.subClient).toBe(subClient) + expect(ReturnSubsoft.runtime.transactions).toEqual([1, 2, 3, 4]) + expect(ReturnSubsoft.runtime.settings).toBe(settings) sinon.assert.notCalled(mockLogger.writeLog) done() } const mockLogger = { writeLog: sinon.spy(), } - ReturnSubnav.__set__('Logger', mockLogger) - ReturnSubnav.run({ transactions: [1, 2, 3, 4], settings, subClient }, callback) + ReturnSubsoft.__set__('Logger', mockLogger) + ReturnSubsoft.run({ transactions: [1, 2, 3, 4], settings, subClient }, callback) }) }) describe('(sendToIncoming)', () => { beforeEach(() => { // reset the rewired functions - ReturnSubnav = rewire('../src/lib/ReturnSubnav') + ReturnSubsoft = rewire('../src/lib/ReturnSubsoft') }) it('should call the callback when theres no transactions left', (done) => { - ReturnSubnav.runtime = { + ReturnSubsoft.runtime = { remainingTransactions: [], callback: (success, data) => { expect(success).toBe(true) @@ -58,18 +58,18 @@ describe('[ReturnSubnav]', () => { const mockLogger = { writeLog: sinon.spy(), } - ReturnSubnav.__set__('Logger', mockLogger) - ReturnSubnav.sendToIncoming() + ReturnSubsoft.__set__('Logger', mockLogger) + ReturnSubsoft.sendToIncoming() }) it('should have transactions to return so call the send function', (done) => { - ReturnSubnav.runtime = { + ReturnSubsoft.runtime = { remainingTransactions: [{ transaction: 1 }, { transaction: 2 }], subClient: {}, } const ReturnToSender = { send: (options, callback) => { - expect(callback).toBe(ReturnSubnav.sent) - expect(options.client).toBe(ReturnSubnav.runtime.subClient) + expect(callback).toBe(ReturnSubsoft.sent) + expect(options.client).toBe(ReturnSubsoft.runtime.subClient) expect(options.transaction).toEqual(1) sinon.assert.notCalled(mockLogger.writeLog) done() @@ -78,20 +78,20 @@ describe('[ReturnSubnav]', () => { const mockLogger = { writeLog: sinon.spy(), } - ReturnSubnav.__set__('Logger', mockLogger) - ReturnSubnav.__set__('ReturnToSender', ReturnToSender) - ReturnSubnav.sendToIncoming() + ReturnSubsoft.__set__('Logger', mockLogger) + ReturnSubsoft.__set__('ReturnToSender', ReturnToSender) + ReturnSubsoft.sendToIncoming() }) }) describe('(sent)', () => { beforeEach(() => { // reset the rewired functions - ReturnSubnav = rewire('../src/lib/ReturnSubnav') + ReturnSubsoft = rewire('../src/lib/ReturnSubsoft') }) - it('should fail because it couldnt return subnav (returned false)', (done) => { - ReturnSubnav.runtime = { + it('should fail because it couldnt return subsoft (returned false)', (done) => { + ReturnSubsoft.runtime = { remainingTransactions: [1, 2, 3, 4], } - ReturnSubnav.runtime = { + ReturnSubsoft.runtime = { callback: (success, data) => { expect(success).toBe(false) expect(data.message).toBeA('string') @@ -104,14 +104,14 @@ describe('[ReturnSubnav]', () => { const mockLogger = { writeLog: sinon.spy(), } - ReturnSubnav.__set__('Logger', mockLogger) - ReturnSubnav.sent(false) + ReturnSubsoft.__set__('Logger', mockLogger) + ReturnSubsoft.sent(false) }) - it('should fail because it couldnt return subnav (no rawOutcome)', (done) => { - ReturnSubnav.runtime = { + it('should fail because it couldnt return subsoft (no rawOutcome)', (done) => { + ReturnSubsoft.runtime = { remainingTransactions: [1, 2, 3, 4], } - ReturnSubnav.runtime = { + ReturnSubsoft.runtime = { callback: (success, data) => { expect(success).toBe(false) expect(data.message).toBeA('string') @@ -124,15 +124,15 @@ describe('[ReturnSubnav]', () => { const mockLogger = { writeLog: sinon.spy(), } - ReturnSubnav.__set__('Logger', mockLogger) - ReturnSubnav.sent(true, { junkParam: '1234' }) + ReturnSubsoft.__set__('Logger', mockLogger) + ReturnSubsoft.sent(true, { junkParam: '1234' }) }) - it('should succeed and proceed to the next subnav transaction', (done) => { - ReturnSubnav.runtime = { + it('should succeed and proceed to the next subsoft transaction', (done) => { + ReturnSubsoft.runtime = { remainingTransactions: [1, 2, 3, 4], } - ReturnSubnav.sendToIncoming = () => { - expect(ReturnSubnav.runtime.remainingTransactions).toEqual([2, 3, 4]) + ReturnSubsoft.sendToIncoming = () => { + expect(ReturnSubsoft.runtime.remainingTransactions).toEqual([2, 3, 4]) sinon.assert.notCalled(mockLogger.writeLog) done() } @@ -140,8 +140,8 @@ describe('[ReturnSubnav]', () => { const mockLogger = { writeLog: sinon.spy(), } - ReturnSubnav.__set__('Logger', mockLogger) - ReturnSubnav.sent(true, { rawOutcome: '1234' }) + ReturnSubsoft.__set__('Logger', mockLogger) + ReturnSubsoft.sent(true, { rawOutcome: '1234' }) }) }) }) diff --git a/test/ReturnToSender.spec.js b/test/ReturnToSender.spec.js old mode 100644 new mode 100755 index 719deb5..7305b71 --- a/test/ReturnToSender.spec.js +++ b/test/ReturnToSender.spec.js @@ -6,7 +6,7 @@ const sinon = require('sinon') let ReturnToSender = rewire('../src/lib/ReturnToSender') -describe('[ReturnSubnav]', () => { +describe('[ReturnSubsoft]', () => { describe('(send)', () => { it('should fail on params', (done) => { const callback = (success, data) => { diff --git a/test/SelectOutgoing.spec.js b/test/SelectOutgoing.spec.js old mode 100644 new mode 100755 index 5344048..b383fc2 --- a/test/SelectOutgoing.spec.js +++ b/test/SelectOutgoing.spec.js @@ -24,7 +24,7 @@ describe('[SelectOutgoing]', () => { }) it('should fail because no remotes found in settings', (done) => { const settings = { remote: [] } - const navClient = {} + const softClient = {} const callback = (success, data) => { expect(success).toBe(false) expect(data.message).toBeA('string') @@ -36,17 +36,17 @@ describe('[SelectOutgoing]', () => { writeLog: sinon.spy(), } SelectOutgoing.__set__('Logger', mockLogger) - SelectOutgoing.run({ settings, navClient }, callback) + SelectOutgoing.run({ settings, softClient }, callback) }) it('should find the remotes and call pickServer', (done) => { const settings = { remote: [1, 2, 3] } - const navClient = {} + const softClient = {} const callback = () => {} SelectOutgoing.pickServer = () => { expect(SelectOutgoing.runtime.callback).toBe(callback) expect(SelectOutgoing.runtime.remoteCluster).toEqual([1, 2, 3]) expect(SelectOutgoing.runtime.settings).toBe(settings) - expect(SelectOutgoing.runtime.navClient).toBe(navClient) + expect(SelectOutgoing.runtime.softClient).toBe(softClient) sinon.assert.notCalled(mockLogger.writeLog) done() } @@ -54,7 +54,7 @@ describe('[SelectOutgoing]', () => { writeLog: sinon.spy(), } SelectOutgoing.__set__('Logger', mockLogger) - SelectOutgoing.run({ settings, navClient }, callback) + SelectOutgoing.run({ settings, softClient }, callback) }) }) describe('(pickServer)', () => { @@ -288,7 +288,7 @@ describe('[SelectOutgoing]', () => { const mockLogger = { writeLog: sinon.spy(), } - const body = '{ "type": "SUCCESS", "data": { "nav_addresses": [], "nav_balance": 10000, "junkParam": "QWERTY" } }' + const body = '{ "type": "SUCCESS", "data": { "soft_addresses": [], "soft_balance": 10000, "junkParam": "QWERTY" } }' SelectOutgoing.__set__('Logger', mockLogger) SelectOutgoing.checkOutgoingCanTransact(body, '192.168.1.1:3000') }) @@ -315,7 +315,7 @@ describe('[SelectOutgoing]', () => { const mockLogger = { writeLog: sinon.spy(), } - const body = `{ "type": "SUCCESS", "data": { "nav_addresses": [], "nav_balance": 10000, + const body = `{ "type": "SUCCESS", "data": { "soft_addresses": [], "soft_balance": 10000, "public_key": "QWERTY", "server_type": "INCOMING" } }` SelectOutgoing.__set__('Logger', mockLogger) SelectOutgoing.checkOutgoingCanTransact(body, '192.168.1.1:3000') @@ -334,14 +334,14 @@ describe('[SelectOutgoing]', () => { } SelectOutgoing.checkPublicKey = () => { expect(SelectOutgoing.runtime.outgoingServerData).toBeA('object') - expect(SelectOutgoing.runtime.outgoingNavBalance).toBe(10000) + expect(SelectOutgoing.runtime.outgoingSoftBalance).toBe(10000) sinon.assert.notCalled(mockLogger.writeLog) done() } const mockLogger = { writeLog: sinon.spy(), } - const body = `{ "type": "SUCCESS", "data": { "nav_addresses": [1, 2, 3], "nav_balance": 10000, + const body = `{ "type": "SUCCESS", "data": { "soft_addresses": [1, 2, 3], "soft_balance": 10000, "public_key": "QWERTY", "server_type": "OUTGOING" } }` SelectOutgoing.__set__('Logger', mockLogger) SelectOutgoing.checkOutgoingCanTransact(body, '192.168.1.1:3000') @@ -362,8 +362,8 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, @@ -408,8 +408,8 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, @@ -443,7 +443,7 @@ describe('[SelectOutgoing]', () => { SelectOutgoing.__set__('privateSettings', mockPrivateSettings) SelectOutgoing.checkPublicKey() }) - it('should complete the encryption test and call hasNavAddresses', (done) => { + it('should complete the encryption test and call hasSoftAddresses', (done) => { SelectOutgoing.runtime = { chosenOutgoing: { ipAddress: '192.168.1.1', port: '3000' }, outgoingAddress: '192.168.1.1:3000', @@ -454,8 +454,8 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, @@ -469,7 +469,7 @@ describe('[SelectOutgoing]', () => { } }, } - SelectOutgoing.hasNavAddresses = () => { + SelectOutgoing.hasSoftAddresses = () => { sinon.assert.notCalled(mockLogger.writeLog) done() } @@ -485,11 +485,11 @@ describe('[SelectOutgoing]', () => { SelectOutgoing.checkPublicKey() }) }) - describe('(hasNavAddresses)', () => { + describe('(hasSoftAddresses)', () => { beforeEach(() => { // reset the rewired functions SelectOutgoing = rewire('../src/lib/SelectOutgoing') }) - it('should not have any nav addresses returned and try the next server', (done) => { + it('should not have any soft addresses returned and try the next server', (done) => { SelectOutgoing.runtime = { chosenOutgoingIndex: 0, remoteCluster: [ @@ -498,8 +498,8 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [], - nav_balance: 10000, + soft_addresses: [], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, @@ -518,9 +518,9 @@ describe('[SelectOutgoing]', () => { writeLog: sinon.spy(), } SelectOutgoing.__set__('Logger', mockLogger) - SelectOutgoing.hasNavAddresses() + SelectOutgoing.hasSoftAddresses() }) - it('should hav nav addresses and try to validate them', (done) => { + it('should hav soft addresses and try to validate them', (done) => { SelectOutgoing.runtime = { chosenOutgoingIndex: 0, remoteCluster: [ @@ -529,16 +529,16 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, } - const NavCoin = { + const SoftCoin = { validateAddresses: (options, callback) => { - expect(callback).toBe(SelectOutgoing.navAddressesValid) + expect(callback).toBe(SelectOutgoing.softAddressesValid) expect(options.addresses).toEqual([1, 2, 3]) sinon.assert.notCalled(mockLogger.writeLog) done() @@ -548,11 +548,11 @@ describe('[SelectOutgoing]', () => { writeLog: sinon.spy(), } SelectOutgoing.__set__('Logger', mockLogger) - SelectOutgoing.__set__('NavCoin', NavCoin) - SelectOutgoing.hasNavAddresses() + SelectOutgoing.__set__('SoftCoin', SoftCoin) + SelectOutgoing.hasSoftAddresses() }) }) - describe('(navAddressesValid)', () => { + describe('(softAddressesValid)', () => { beforeEach(() => { // reset the rewired functions SelectOutgoing = rewire('../src/lib/SelectOutgoing') }) @@ -565,8 +565,8 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, @@ -585,7 +585,7 @@ describe('[SelectOutgoing]', () => { writeLog: sinon.spy(), } SelectOutgoing.__set__('Logger', mockLogger) - SelectOutgoing.navAddressesValid(false) + SelectOutgoing.softAddressesValid(false) }) it('should validate the addresses and get the encryption keys', (done) => { SelectOutgoing.runtime = { @@ -596,8 +596,8 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, @@ -616,7 +616,7 @@ describe('[SelectOutgoing]', () => { } SelectOutgoing.__set__('EncryptionKeys', EncryptionKeys) SelectOutgoing.__set__('Logger', mockLogger) - SelectOutgoing.navAddressesValid(true) + SelectOutgoing.softAddressesValid(true) }) }) describe('(encryptOutgoingAddresses)', () => { @@ -690,8 +690,8 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, @@ -737,8 +737,8 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, @@ -793,17 +793,17 @@ describe('[SelectOutgoing]', () => { { ipAddress: '192.168.1.3', port: '3000' }, ], outgoingServerData: { - nav_addresses: [1, 2, 3], - nav_balance: 10000, + soft_addresses: [1, 2, 3], + soft_balance: 10000, public_key: 'QWERTY', server_type: 'OUTGOING', }, outgoingPubKey: 'QWERTY', - outgoingNavBalance: 10000, + outgoingSoftBalance: 10000, callback: (success, data) => { expect(success).toBe(true) expect(data.chosenOutgoing).toEqual({ ipAddress: '192.168.1.1', port: '3000' }) - expect(data.outgoingNavBalance).toBe(10000) + expect(data.outgoingSoftBalance).toBe(10000) expect(data.outgoingPubKey).toBe('QWERTY') expect(data.holdingEncrypted).toBe('ENCRYPTED_DATA') expect(data.returnAllToSenders).toBe(false) diff --git a/test/SendRawTransaction.spec.js b/test/SendRawTransaction.spec.js old mode 100644 new mode 100755 index 6009bb7..4b3dfd4 --- a/test/SendRawTransaction.spec.js +++ b/test/SendRawTransaction.spec.js @@ -207,7 +207,7 @@ describe('[SendRawTransaction]', () => { SendRawTransaction.__set__('Logger', mockLogger) SendRawTransaction.signRaw('RAW_TRANSACTION') }) - it('should fail to sign the raw transaction and attempt to unlock the wallet (navCoin)', (done) => { + it('should fail to sign the raw transaction and attempt to unlock the wallet (softCoin)', (done) => { const callback = () => {} const client = { signRawTransaction: () => { return Promise.reject({ code: -13 }) }, @@ -219,11 +219,11 @@ describe('[SendRawTransaction]', () => { client, } - const NavCoin = { + const SoftCoin = { unlockWallet: (options, parsedCallback) => { expect(parsedCallback).toBe(SendRawTransaction.walletUnlocked) expect(options.client).toBe(client) - expect(options.type).toBe('navCoin') + expect(options.type).toBe('softCoin') sinon.assert.notCalled(mockLogger.writeLog) done() }, @@ -233,7 +233,7 @@ describe('[SendRawTransaction]', () => { writeLog: sinon.spy(), } - SendRawTransaction.__set__('NavCoin', NavCoin) + SendRawTransaction.__set__('SoftCoin', SoftCoin) SendRawTransaction.__set__('Logger', mockLogger) SendRawTransaction.signRaw('RAW_TRANSACTION') }) @@ -249,7 +249,7 @@ describe('[SendRawTransaction]', () => { client, } - const NavCoin = { + const SoftCoin = { unlockWallet: (options, parsedCallback) => { expect(parsedCallback).toBe(SendRawTransaction.walletUnlocked) expect(options.client).toBe(client) @@ -263,7 +263,7 @@ describe('[SendRawTransaction]', () => { writeLog: sinon.spy(), } - SendRawTransaction.__set__('NavCoin', NavCoin) + SendRawTransaction.__set__('SoftCoin', SoftCoin) SendRawTransaction.__set__('Logger', mockLogger) SendRawTransaction.signRaw('RAW_TRANSACTION') }) diff --git a/test/SendToAddress.spec.js b/test/SendToAddress.spec.js old mode 100644 new mode 100755 index 9775046..854886a --- a/test/SendToAddress.spec.js +++ b/test/SendToAddress.spec.js @@ -47,11 +47,11 @@ describe('[SendToAddress]', () => { }) it('should have the right params and fail to send due to locked wallet', (done) => { const callback = () => {} - const NavCoin = { + const SoftCoin = { unlockWallet: (options, parsedCallback) => { expect(parsedCallback).toBe(SendToAddress.walletUnlocked) expect(options.client).toBe(client) - expect(options.type).toBe('navCoin') + expect(options.type).toBe('softCoin') sinon.assert.notCalled(mockLogger.writeLog) done() }, @@ -66,7 +66,7 @@ describe('[SendToAddress]', () => { const mockLogger = { writeLog: sinon.spy(), } - SendToAddress.__set__('NavCoin', NavCoin) + SendToAddress.__set__('SoftCoin', SoftCoin) SendToAddress.__set__('Logger', mockLogger) SendToAddress.send({ address, amount, client, transaction, counter: 1 }, callback) }) diff --git a/test/NavCoin.spec.js b/test/SoftCoin.spec.js old mode 100644 new mode 100755 similarity index 79% rename from test/NavCoin.spec.js rename to test/SoftCoin.spec.js index 74f13fc..8035937 --- a/test/NavCoin.spec.js +++ b/test/SoftCoin.spec.js @@ -4,10 +4,10 @@ const expect = require('expect') const rewire = require('rewire') const config = require('config') -let NavCoin = rewire('../src/lib/NavCoin') +let SoftCoin = rewire('../src/lib/SoftCoin') const incomingSettings = config.get('INCOMING') -describe('[NavCoin]', () => { +describe('[SoftCoin]', () => { describe('(unlockWallet)', () => { it('should fail on params', (done) => { const callback = (success, data) => { @@ -15,19 +15,19 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.unlockWallet({}, callback) + SoftCoin.unlockWallet({}, callback) }) it('should immediately callback if not using a locked wallet', (done) => { - NavCoin.__set__({ globalSettings: { encryptedWallet: false } }) + SoftCoin.__set__({ globalSettings: { encryptedWallet: false } }) const mockClient = {} const callback = (success) => { expect(success).toBe(true) done() } - NavCoin.unlockWallet({ client: mockClient, settings: incomingSettings, type: 'navCoin' }, callback) + SoftCoin.unlockWallet({ client: mockClient, settings: incomingSettings, type: 'softCoin' }, callback) }) it('should fail to unlock the wallet', (done) => { - NavCoin.__set__({ globalSettings: { encryptedWallet: true } }) + SoftCoin.__set__({ globalSettings: { encryptedWallet: true } }) const mockClient = { walletPassphrase: () => { return Promise.reject({ code: -5 }) }, walletLock: () => { return Promise.resolve() }, @@ -37,7 +37,7 @@ describe('[NavCoin]', () => { expect(error.message).toBeA('string') done() } - NavCoin.unlockWallet({ client: mockClient, settings: incomingSettings, type: 'navCoin' }, callback) + SoftCoin.unlockWallet({ client: mockClient, settings: incomingSettings, type: 'softCoin' }, callback) }) it('should unlock the wallet', (done) => { const mockClient = { @@ -48,12 +48,12 @@ describe('[NavCoin]', () => { expect(success).toEqual(true) done() } - NavCoin.unlockWallet({ client: mockClient, settings: incomingSettings, type: 'navCoin' }, callback) + SoftCoin.unlockWallet({ client: mockClient, settings: incomingSettings, type: 'softCoin' }, callback) }) }) describe('(lockWallet)', () => { beforeEach(() => { // reset the rewired functions - NavCoin = rewire('../src/lib/NavCoin') + SoftCoin = rewire('../src/lib/SoftCoin') }) it('should fail on params', (done) => { const callback = (success, data) => { @@ -61,7 +61,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.lockWallet({}, callback) + SoftCoin.lockWallet({}, callback) }) it('should fail to lock the wallet', (done) => { const mockClient = { @@ -72,19 +72,19 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.lockWallet({ client: mockClient, type: 'navCoin' }, callback) + SoftCoin.lockWallet({ client: mockClient, type: 'softCoin' }, callback) }) it('should lock the wallet', (done) => { const mockClient = { walletLock: () => { return Promise.resolve({ message: 'WALLET_UNLOCKED' }) }, } - NavCoin.unlockWallet = (options, callback) => { - expect(options.type).toBe('navCoin') + SoftCoin.unlockWallet = (options, callback) => { + expect(options.type).toBe('softCoin') expect(options.client).toBe(mockClient) expect(callback).toBeA('function') done() } - NavCoin.lockWallet({ client: mockClient, type: 'navCoin' }, () => {}) + SoftCoin.lockWallet({ client: mockClient, type: 'softCoin' }, () => {}) }) }) describe('(filterUnspent)', () => { @@ -94,7 +94,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.filterUnspent({}, callback) + SoftCoin.filterUnspent({}, callback) }) it('should to get the addresses by account', (done) => { const unspent = [] @@ -106,7 +106,7 @@ describe('[NavCoin]', () => { expect(success).toBe(false) done() } - NavCoin.filterUnspent({ client: mockClient, unspent, accountName }, callback) + SoftCoin.filterUnspent({ client: mockClient, unspent, accountName }, callback) }) it('should not find any intersecting addresses', (done) => { const unspent = [ @@ -122,7 +122,7 @@ describe('[NavCoin]', () => { expect(success).toBe(false) done() } - NavCoin.filterUnspent({ client: mockClient, unspent, accountName }, callback) + SoftCoin.filterUnspent({ client: mockClient, unspent, accountName }, callback) }) it('should find 1 intersecting address', (done) => { const unspent = [ @@ -139,7 +139,7 @@ describe('[NavCoin]', () => { expect(data.currentPending.length).toBe(1) done() } - NavCoin.filterUnspent({ client: mockClient, unspent, accountName }, callback) + SoftCoin.filterUnspent({ client: mockClient, unspent, accountName }, callback) }) it('should find 3 intersecting address', (done) => { const unspent = [ @@ -156,7 +156,7 @@ describe('[NavCoin]', () => { expect(data.currentPending.length).toBe(3) done() } - NavCoin.filterUnspent({ client: mockClient, unspent, accountName }, callback) + SoftCoin.filterUnspent({ client: mockClient, unspent, accountName }, callback) }) }) describe('(checkBlockHeight)', () => { @@ -166,7 +166,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.checkBlockHeight({}, callback) + SoftCoin.checkBlockHeight({}, callback) }) it('should fail getInfo', (done) => { const mockClient = { @@ -177,7 +177,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.checkBlockHeight({ client: mockClient, blockThreshold: 1 }, callback) + SoftCoin.checkBlockHeight({ client: mockClient, blockThreshold: 1 }, callback) }) it('should pass getInfo and fail getBlockCount', (done) => { const mockClient = { @@ -189,7 +189,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.checkBlockHeight({ client: mockClient, blockThreshold: 1 }, callback) + SoftCoin.checkBlockHeight({ client: mockClient, blockThreshold: 1 }, callback) }) it('should fail due to being too far behind', (done) => { const mockClient = { @@ -201,7 +201,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.checkBlockHeight({ client: mockClient, blockThreshold: 1 }, callback) + SoftCoin.checkBlockHeight({ client: mockClient, blockThreshold: 1 }, callback) }) it('should pass the block check', (done) => { const mockClient = { @@ -213,7 +213,7 @@ describe('[NavCoin]', () => { expect(data.balance).toBe(10000) done() } - NavCoin.checkBlockHeight({ client: mockClient, blockThreshold: 1 }, callback) + SoftCoin.checkBlockHeight({ client: mockClient, blockThreshold: 1 }, callback) }) }) describe('(validateAddresses)', () => { @@ -223,7 +223,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.validateAddresses({}, callback) + SoftCoin.validateAddresses({}, callback) }) it('should fail the validateAddress call', (done) => { const mockClient = { @@ -235,7 +235,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.validateAddresses({ client: mockClient, addresses }, callback) + SoftCoin.validateAddresses({ client: mockClient, addresses }, callback) }) it('should not validate the addresses', (done) => { const mockClient = { @@ -247,7 +247,7 @@ describe('[NavCoin]', () => { expect(data.message).toBeA('string') done() } - NavCoin.validateAddresses({ client: mockClient, addresses }, callback) + SoftCoin.validateAddresses({ client: mockClient, addresses }, callback) }) it('should validate the addresses', (done) => { const mockClient = { @@ -258,7 +258,7 @@ describe('[NavCoin]', () => { expect(success).toBe(true) done() } - NavCoin.validateAddresses({ client: mockClient, addresses }, callback) + SoftCoin.validateAddresses({ client: mockClient, addresses }, callback) }) }) }) @@ -272,7 +272,7 @@ describe('[NavCoin]', () => { // expect(success).toBe(false) // done() // } - // NavCoin.pruneIncomingUnspent({}, callback) + // SoftCoin.pruneIncomingUnspent({}, callback) // }) // it('should not prune any pending', (done) => { // const currentPending = [ @@ -286,7 +286,7 @@ describe('[NavCoin]', () => { // expect(data.sumPending).toBe(60) // done() // } - // NavCoin.pruneIncomingUnspent({ currentPending, subBalance: 1000, maxAmount: 100 }, callback) + // SoftCoin.pruneIncomingUnspent({ currentPending, subBalance: 1000, maxAmount: 100 }, callback) // }) // it('should prune all pending', (done) => { // const currentPending = [ @@ -299,7 +299,7 @@ describe('[NavCoin]', () => { // expect(data.error).toBe('no pruned') // done() // } - // NavCoin.pruneIncomingUnspent({ currentPending, subBalance: 1000, maxAmount: 50 }, callback) + // SoftCoin.pruneIncomingUnspent({ currentPending, subBalance: 1000, maxAmount: 50 }, callback) // }) // it('should prune to the maxAmount', (done) => { // const currentPending = [ @@ -313,7 +313,7 @@ describe('[NavCoin]', () => { // expect(data.sumPending).toBe(50) // done() // } - // NavCoin.pruneIncomingUnspent({ currentPending, subBalance: 1000, maxAmount: 100 }, callback) + // SoftCoin.pruneIncomingUnspent({ currentPending, subBalance: 1000, maxAmount: 100 }, callback) // }) // it('should prune to the right number subcoins', (done) => { // const currentPending = [ @@ -327,7 +327,7 @@ describe('[NavCoin]', () => { // expect(data.sumPending).toBe(20) // done() // } - // NavCoin.pruneIncomingUnspent({ currentPending, subBalance: 10.01, maxAmount: 100 }, callback) + // SoftCoin.pruneIncomingUnspent({ currentPending, subBalance: 10.01, maxAmount: 100 }, callback) // }) // it('should prune to the maximum amount of subaddresses we can receive from the outgoing', (done) => { // const currentPending = [] @@ -340,6 +340,6 @@ describe('[NavCoin]', () => { // expect(data.sumPending).toBe(5000) // done() // } - // NavCoin.pruneIncomingUnspent({ currentPending, subBalance: 100000, maxAmount: 100000 }, callback) + // SoftCoin.pruneIncomingUnspent({ currentPending, subBalance: 100000, maxAmount: 100000 }, callback) // }) // }) diff --git a/test/SpendToHolding.spec.js b/test/SpendToHolding.spec.js old mode 100644 new mode 100755 index 42159a8..bc1d048 --- a/test/SpendToHolding.spec.js +++ b/test/SpendToHolding.spec.js @@ -27,7 +27,7 @@ describe('[SpendToHolding]', () => { }) it('should have correct params and call getRandomAccountAddresses', (done) => { const callback = () => {} - const navClient = { + const softClient = { getInfo: () => {}, } const successfulSubTransactions = [1, 2, 3] @@ -36,7 +36,7 @@ describe('[SpendToHolding]', () => { getRandomAccountAddresses: (options, parsedCallback) => { expect(parsedCallback).toBe(SpendToHolding.createHoldingTransactions) expect(options.accountName).toBe('HOLDING_ACCOUNT') - expect(options.client).toBe(navClient) + expect(options.client).toBe(softClient) expect(options.numAddresses).toBe(1) sinon.assert.notCalled(mockLogger.writeLog) done() @@ -51,7 +51,7 @@ describe('[SpendToHolding]', () => { SpendToHolding.__set__('Logger', mockLogger) SpendToHolding.__set__('RandomizeTransactions', RandomizeTransactions) SpendToHolding.__set__('privateSettings', privateSettings) - SpendToHolding.run({ navClient, successfulSubTransactions, holdingEncrypted }, callback) + SpendToHolding.run({ softClient, successfulSubTransactions, holdingEncrypted }, callback) }) }) describe('(createHoldingTransactions)', () => { @@ -75,7 +75,7 @@ describe('[SpendToHolding]', () => { SpendToHolding.createHoldingTransactions(false) }) it('should build the holding transactions and create call createRaw', (done) => { - const navClient = { + const softClient = { getInfo: () => {}, } const privateSettings = { @@ -88,7 +88,7 @@ describe('[SpendToHolding]', () => { { txid: '6789', amount: 400, vout: 2 }, ], holdingEncrypted: 'QWER==', - navClient, + softClient, } const SendRawTransaction = { createRaw: (options, parsedCallback) => { @@ -101,7 +101,7 @@ describe('[SpendToHolding]', () => { { txid: '6789', vout: 2 }, ]) expect(options.encrypted).toBe('QWER==') - expect(options.client).toBe(navClient) + expect(options.client).toBe(softClient) expect(parsedCallback).toBe(SpendToHolding.sentToHolding) sinon.assert.notCalled(mockLogger.writeLog) done() diff --git a/test/incoming.spec.js b/test/incoming.spec.js old mode 100644 new mode 100755 index 0f61d77..4a6780f --- a/test/incoming.spec.js +++ b/test/incoming.spec.js @@ -19,7 +19,7 @@ describe('[IncomingServer]', () => { expect(callback).toBe(IncomingServer.startProcessing) sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'INC_000') - expect(IncomingServer.navClient).toBeA('object') + expect(IncomingServer.softClient).toBeA('object') expect(IncomingServer.subClient).toBeA('object') done() }, @@ -39,7 +39,7 @@ describe('[IncomingServer]', () => { IncomingServer.init() sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'INC_000') - expect(IncomingServer.navClient).toBeA('object') + expect(IncomingServer.softClient).toBeA('object') expect(IncomingServer.subClient).toBeA('object') expect(IncomingServer.cron._repeat).toBe(settings.scriptInterval) done() @@ -59,13 +59,13 @@ describe('[IncomingServer]', () => { done() }) it('should proceed to run preflight checks', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.subClient = { getInfo: () => true } const now = new Date() const clock = sinon.useFakeTimers(now.getTime()) const PreFlight = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(options.subClient).toBe(IncomingServer.subClient) expect(callback).toBe(IncomingServer.preFlightComplete) expect(IncomingServer.processing).toBe(true) @@ -99,15 +99,15 @@ describe('[IncomingServer]', () => { done() }) it('should pass preflight, set balances and call the refill function', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.subClient = { getInfo: () => true } const RefillOutgoing = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.holdingProcessed) expect(IncomingServer.processing).toBe(true) expect(IncomingServer.runtime).toEqual({ - navBalance: 1000, + softBalance: 1000, subBalance: 100, }) done() @@ -118,7 +118,7 @@ describe('[IncomingServer]', () => { IncomingServer.__set__('Logger', mockLogger) IncomingServer.__set__('RefillOutgoing', RefillOutgoing) IncomingServer.preFlightComplete(true, { - navBalance: 1000, + softBalance: 1000, subBalance: 100, }) }) @@ -140,11 +140,11 @@ describe('[IncomingServer]', () => { done() }) it('should process the holding, set balances and call the refill function', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.subClient = { getInfo: () => true } const SelectOutgoing = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(options.settings).toBe(settings) expect(callback).toBe(IncomingServer.outgoingSelected) expect(IncomingServer.processing).toBe(true) @@ -156,7 +156,7 @@ describe('[IncomingServer]', () => { IncomingServer.__set__('Logger', mockLogger) IncomingServer.__set__('SelectOutgoing', SelectOutgoing) IncomingServer.holdingProcessed(true, { - navClient: IncomingServer.navClient, + softClient: IncomingServer.softClient, settings, }) }) @@ -178,11 +178,11 @@ describe('[IncomingServer]', () => { done() }) it('should return all to senders if failed to locate outgoing server', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.subClient = { getInfo: () => true } const ReturnAllToSenders = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.allPendingReturned) expect(IncomingServer.processing).toBe(true) done() @@ -198,11 +198,11 @@ describe('[IncomingServer]', () => { }) }) it('should pause transactions if the issue was on the incoming server', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.subClient = { getInfo: () => true } const ReturnAllToSenders = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.allPendingReturned) expect(IncomingServer.processing).toBe(true) expect(IncomingServer.paused).toBe(true) @@ -220,11 +220,11 @@ describe('[IncomingServer]', () => { }) }) it('should not pause transactions if the issue was on the outgoing server', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.subClient = { getInfo: () => true } const ReturnAllToSenders = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.allPendingReturned) expect(IncomingServer.processing).toBe(true) expect(IncomingServer.paused).toBe(false) @@ -241,19 +241,19 @@ describe('[IncomingServer]', () => { }) }) it('should run prepareIncoming if all params correct', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.subClient = { getInfo: () => true } const PrepareIncoming = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) - expect(options.outgoingNavBalance).toBe(1000) - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) + expect(options.outgoingSoftBalance).toBe(1000) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.currentBatchPrepared) expect(options.settings).toBe(settings) expect(IncomingServer.processing).toBe(true) expect(IncomingServer.runtime).toEqual({ chosenOutgoing: 'QWER', - outgoingNavBalance: 1000, + outgoingSoftBalance: 1000, holdingEncrypted: 'ZXCV', outgoingPubKey: 'ASDF', }) @@ -268,7 +268,7 @@ describe('[IncomingServer]', () => { IncomingServer.outgoingSelected(true, { returnAllToSenders: false, chosenOutgoing: 'QWER', - outgoingNavBalance: 1000, + outgoingSoftBalance: 1000, holdingEncrypted: 'ZXCV', outgoingPubKey: 'ASDF', }) @@ -340,11 +340,11 @@ describe('[IncomingServer]', () => { done() }) it('should get the currentBatch but have some to return', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } const ReturnAllToSenders = { fromList: (options, callback) => { expect(callback).toBe(IncomingServer.pendingFailedReturned) - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(options.transactionsToReturn).toEqual([{ txid: '1234', amount: 100 }, { txid: 'QWER', amount: 100 }]) done() }, @@ -425,7 +425,7 @@ describe('[IncomingServer]', () => { const ReturnAllToSenders = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.allPendingReturned) sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'INC_011A') @@ -506,7 +506,7 @@ describe('[IncomingServer]', () => { const ReturnAllToSenders = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.allPendingReturned) sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'INC_009') @@ -522,13 +522,13 @@ describe('[IncomingServer]', () => { IncomingServer.retrievedSubchainAddresses(false) }) it('should fail to retrieve subchain addresses with bad params', (done) => { - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.processing = true IncomingServer.paused = false const ReturnAllToSenders = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.allPendingReturned) sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'INC_009') @@ -547,7 +547,7 @@ describe('[IncomingServer]', () => { IncomingServer.processing = true IncomingServer.paused = false IncomingServer.subClient = { getInfo: () => true } - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.runtime = { currentBatch: [{ unique: 'ABC', amount: 30 }, { unique: 'XYZ', amount: 200 }], currentFlattened: { ABC: [10, 10, 10], XYZ: [100, 100] }, @@ -555,7 +555,7 @@ describe('[IncomingServer]', () => { } const ProcessIncoming = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(options.subClient).toBe(IncomingServer.subClient) expect(options.currentBatch).toEqual(IncomingServer.runtime.currentBatch) expect(options.currentFlattened).toEqual(IncomingServer.runtime.currentFlattened) @@ -583,11 +583,11 @@ describe('[IncomingServer]', () => { it('should fail to process all transactions and return all to senders', (done) => { IncomingServer.processing = true IncomingServer.paused = false - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } const ReturnAllToSenders = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.allPendingReturned) sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'INC_010') @@ -605,7 +605,7 @@ describe('[IncomingServer]', () => { it('should process some and fail a partial send', (done) => { IncomingServer.processing = true IncomingServer.paused = false - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } const mockLogger = { writeLog: sinon.spy() } IncomingServer.__set__('Logger', mockLogger) @@ -621,11 +621,11 @@ describe('[IncomingServer]', () => { it('should succeed with some failed and return the failed', (done) => { IncomingServer.processing = true IncomingServer.paused = false - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } const ReturnAllToSenders = { fromList: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.failedTransactionsReturned) sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'INC_011') @@ -673,7 +673,7 @@ describe('[IncomingServer]', () => { it('should succeed with no failed and skip trying to return any', (done) => { IncomingServer.processing = true IncomingServer.paused = false - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } IncomingServer.failedTransactionsReturned = (success) => { expect(success).toBe(true) @@ -713,7 +713,7 @@ describe('[IncomingServer]', () => { it('should fail to return the failed to sender and continue to try to spend to holding', (done) => { IncomingServer.processing = true IncomingServer.paused = false - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } const successfulTxGroups = [ { @@ -732,7 +732,7 @@ describe('[IncomingServer]', () => { const SpendToHolding = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.spentToHolding) expect(options.holdingEncrypted).toBe('QWER==') expect(options.successfulSubTransactions).toEqual([ @@ -761,7 +761,7 @@ describe('[IncomingServer]', () => { it('should return the failed to sender and continue to spend to holding', (done) => { IncomingServer.processing = true IncomingServer.paused = false - IncomingServer.navClient = { getInfo: () => true } + IncomingServer.softClient = { getInfo: () => true } const successfulTxGroups = [ { @@ -780,7 +780,7 @@ describe('[IncomingServer]', () => { const SpendToHolding = { run: (options, callback) => { - expect(options.navClient).toBe(IncomingServer.navClient) + expect(options.softClient).toBe(IncomingServer.softClient) expect(callback).toBe(IncomingServer.spentToHolding) expect(options.holdingEncrypted).toBe('QWER==') expect(options.successfulSubTransactions).toEqual([ diff --git a/test/keys/private/1482278400000_private.pem b/test/keys/private/1482278400000_private.pem old mode 100644 new mode 100755 diff --git a/test/keys/public/1482278400000_public.pub b/test/keys/public/1482278400000_public.pub old mode 100644 new mode 100755 diff --git a/test/outgoing.spec.js b/test/outgoing.spec.js old mode 100644 new mode 100755 index d14afb2..87428fd --- a/test/outgoing.spec.js +++ b/test/outgoing.spec.js @@ -19,7 +19,7 @@ describe('[OutgoingServer]', () => { expect(callback).toBe(OutgoingServer.startProcessing) sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'OUT_000') - expect(OutgoingServer.navClient).toBeA('object') + expect(OutgoingServer.softClient).toBeA('object') expect(OutgoingServer.subClient).toBeA('object') done() }, @@ -41,7 +41,7 @@ describe('[OutgoingServer]', () => { OutgoingServer.init() sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'OUT_000') - expect(OutgoingServer.navClient).toBeA('object') + expect(OutgoingServer.softClient).toBeA('object') expect(OutgoingServer.subClient).toBeA('object') expect(OutgoingServer.cron._repeat).toBe(settings.scriptInterval) done() @@ -61,13 +61,13 @@ describe('[OutgoingServer]', () => { done() }) it('should proceed to run preflight checks', (done) => { - OutgoingServer.navClient = { getInfo: () => true } + OutgoingServer.softClient = { getInfo: () => true } OutgoingServer.subClient = { getInfo: () => true } const now = new Date() const clock = sinon.useFakeTimers(now.getTime()) const PreFlight = { run: (options, callback) => { - expect(options.navClient).toBe(OutgoingServer.navClient) + expect(options.softClient).toBe(OutgoingServer.softClient) expect(options.subClient).toBe(OutgoingServer.subClient) expect(callback).toBe(OutgoingServer.preFlightComplete) expect(OutgoingServer.processing).toBe(true) @@ -101,13 +101,13 @@ describe('[OutgoingServer]', () => { done() }) it('should pass preflight, set balances and call the refill function', (done) => { - OutgoingServer.navClient = { listUnspent: () => true } + OutgoingServer.softClient = { listUnspent: () => true } OutgoingServer.subClient = { listUnspent: () => true } const PayoutFee = { run: (options, callback) => { - expect(options.navClient).toBe(OutgoingServer.navClient) + expect(options.softClient).toBe(OutgoingServer.softClient) expect(OutgoingServer.runtime).toEqual({ - navBalance: 1000, + softBalance: 1000, subBalance: 100, }) done() @@ -118,7 +118,7 @@ describe('[OutgoingServer]', () => { OutgoingServer.__set__('Logger', mockLogger) OutgoingServer.__set__('PayoutFee', PayoutFee) OutgoingServer.preFlightComplete(true, { - navBalance: 1000, + softBalance: 1000, subBalance: 100, }) }) @@ -146,7 +146,7 @@ describe('[OutgoingServer]', () => { const ProcessOutgoing = { run: (options, callback) => { - expect(options.navClient).toBe(OutgoingServer.navClient) + expect(options.softClient).toBe(OutgoingServer.softClient) expect(callback).toBe(OutgoingServer.transactionsProcessed) expect(OutgoingServer.processing).toBe(true) expect(OutgoingServer.paused).toBe(false) @@ -167,7 +167,7 @@ describe('[OutgoingServer]', () => { const ProcessOutgoing = { run: (options, callback) => { - expect(options.navClient).toBe(OutgoingServer.navClient) + expect(options.softClient).toBe(OutgoingServer.softClient) expect(callback).toBe(OutgoingServer.transactionsProcessed) expect(OutgoingServer.processing).toBe(true) expect(OutgoingServer.paused).toBe(false) @@ -205,10 +205,10 @@ describe('[OutgoingServer]', () => { OutgoingServer.processing = true OutgoingServer.paused = false - const ReturnSubnav = { + const ReturnSubsoft = { run: (options, callback) => { expect(options.subClient).toBe(OutgoingServer.subClient) - expect(callback).toBe(OutgoingServer.subnavReturned) + expect(callback).toBe(OutgoingServer.subsoftReturned) expect(OutgoingServer.processing).toBe(true) expect(OutgoingServer.paused).toBe(false) sinon.assert.calledOnce(mockLogger.writeLog) @@ -219,7 +219,7 @@ describe('[OutgoingServer]', () => { const mockLogger = { writeLog: sinon.spy() } OutgoingServer.__set__('Logger', mockLogger) - OutgoingServer.__set__('ReturnSubnav', ReturnSubnav) + OutgoingServer.__set__('ReturnSubsoft', ReturnSubsoft) OutgoingServer.transactionsProcessed(true, { successfulTransactions: [1, 2, 3], failedTransactions: [4, 5, 6] }) }) it('should fail to send any transactions and pause', (done) => { @@ -239,14 +239,14 @@ describe('[OutgoingServer]', () => { sinon.assert.calledWith(mockLogger.writeLog, 'OUT_005') done() }) - it('should get the current batch and return the subnav', (done) => { + it('should get the current batch and return the subsoft', (done) => { OutgoingServer.processing = true OutgoingServer.paused = false - const ReturnSubnav = { + const ReturnSubsoft = { run: (options, callback) => { expect(options.subClient).toBe(OutgoingServer.subClient) - expect(callback).toBe(OutgoingServer.subnavReturned) + expect(callback).toBe(OutgoingServer.subsoftReturned) expect(OutgoingServer.processing).toBe(true) expect(OutgoingServer.paused).toBe(false) expect(OutgoingServer.runtime.successfulTransactions).toEqual([1, 2, 3]) @@ -256,7 +256,7 @@ describe('[OutgoingServer]', () => { const mockLogger = { writeLog: sinon.spy() } OutgoingServer.__set__('Logger', mockLogger) - OutgoingServer.__set__('ReturnSubnav', ReturnSubnav) + OutgoingServer.__set__('ReturnSubsoft', ReturnSubsoft) OutgoingServer.transactionsProcessed(true, { successfulTransactions: [1, 2, 3] }) }) }) @@ -264,7 +264,7 @@ describe('[OutgoingServer]', () => { beforeEach(() => { // reset the rewired functions OutgoingServer = rewire('../src/outgoing') }) - it('should continue to return the subnav if it failed to pay the fee', (done) => { + it('should continue to return the subsoft if it failed to pay the fee', (done) => { OutgoingServer.processing = true OutgoingServer.paused = false @@ -275,9 +275,9 @@ describe('[OutgoingServer]', () => { const PrepareOutgoing = { run: (options, callback) => { expect(options.subClient).toBe(OutgoingServer.subClient) - expect(options.navClient).toBe(OutgoingServer.navClient) + expect(options.softClient).toBe(OutgoingServer.softClient) expect(callback).toBe(OutgoingServer.currentBatchPrepared) - expect(options.navBalance).toBe(50000) + expect(options.softBalance).toBe(50000) expect(OutgoingServer.processing).toBe(true) expect(OutgoingServer.paused).toBe(false) sinon.assert.calledOnce(mockLogger.writeLog) @@ -289,10 +289,10 @@ describe('[OutgoingServer]', () => { const mockLogger = { writeLog: sinon.spy() } OutgoingServer.__set__('Logger', mockLogger) OutgoingServer.__set__('PrepareOutgoing', PrepareOutgoing) - OutgoingServer.navClient = mockClient + OutgoingServer.softClient = mockClient OutgoingServer.feePaid(false, { transaction: 123, error: 'failed' }) }) - it('should continue to return the subnav if it paid the fee', (done) => { + it('should continue to return the subsoft if it paid the fee', (done) => { OutgoingServer.processing = true OutgoingServer.paused = false @@ -303,8 +303,8 @@ describe('[OutgoingServer]', () => { const PrepareOutgoing = { run: (options, callback) => { expect(options.subClient).toBe(OutgoingServer.subClient) - expect(options.navClient).toBe(OutgoingServer.navClient) - expect(options.navBalance).toBe(50000) + expect(options.softClient).toBe(OutgoingServer.softClient) + expect(options.softBalance).toBe(50000) expect(callback).toBe(OutgoingServer.currentBatchPrepared) expect(OutgoingServer.processing).toBe(true) expect(OutgoingServer.paused).toBe(false) @@ -316,7 +316,7 @@ describe('[OutgoingServer]', () => { const mockLogger = { writeLog: sinon.spy() } OutgoingServer.__set__('Logger', mockLogger) OutgoingServer.__set__('PrepareOutgoing', PrepareOutgoing) - OutgoingServer.navClient = mockClient + OutgoingServer.softClient = mockClient OutgoingServer.feePaid(true, { transaction: 123, error: 'failed' }) }) it('should stop if it couldnt get the balance after sending the fee', (done) => { @@ -329,23 +329,23 @@ describe('[OutgoingServer]', () => { const mockLogger = { writeLog: sinon.spy() } OutgoingServer.__set__('Logger', mockLogger) - OutgoingServer.navClient = mockClient + OutgoingServer.softClient = mockClient OutgoingServer.feePaid(true, { transaction: 123, error: 'failed' }) done() }) }) - describe('(subnavReturned)', () => { + describe('(subsoftReturned)', () => { beforeEach(() => { // reset the rewired functions OutgoingServer = rewire('../src/outgoing') }) - it('should fail to return the subnav and pause', (done) => { + it('should fail to return the subsoft and pause', (done) => { OutgoingServer.processing = true OutgoingServer.paused = false const mockLogger = { writeLog: sinon.spy() } OutgoingServer.__set__('Logger', mockLogger) - OutgoingServer.subnavReturned(false) + OutgoingServer.subsoftReturned(false) sinon.assert.calledOnce(mockLogger.writeLog) sinon.assert.calledWith(mockLogger.writeLog, 'OUT_007') @@ -353,13 +353,13 @@ describe('[OutgoingServer]', () => { expect(OutgoingServer.paused).toBe(true) done() }) - it('should fail to return the subnav and end', (done) => { + it('should fail to return the subsoft and end', (done) => { OutgoingServer.processing = true OutgoingServer.paused = false const mockLogger = { writeLog: sinon.spy() } OutgoingServer.__set__('Logger', mockLogger) - OutgoingServer.subnavReturned(true) + OutgoingServer.subsoftReturned(true) sinon.assert.notCalled(mockLogger.writeLog) expect(OutgoingServer.processing).toBe(false) diff --git a/webpack.config.js b/webpack.config.js old mode 100644 new mode 100755 index 3733b94..70535ac --- a/webpack.config.js +++ b/webpack.config.js @@ -19,7 +19,7 @@ const vendorModules = [ module.exports = { entry: { - navtech: './src/app.js', + softnode: './src/app.js', vendor: vendorModules, }, target: 'node',