@codeinahat/crypto

JS crypto Library

Usage no npm install needed!

<script type="module">
  import codeinahatCrypto from 'https://cdn.skypack.dev/@codeinahat/crypto';
</script>

README

��#� �C�o�d�e�i�n�a�h�a�t� �C�r�y�p�t�o� � � � �#�#� �I�n�s�t�a�l�l�a�t�i�o�n� � �T�h�i�s� �i�n� �[�N�o�d�e�.�j�s�]�(�h�t�t�p�s�:�/�/�n�o�d�e�j�s�.�o�r�g�)� �m�o�d�u�l�e� �a�v�a�i�l�a�b�l�e� �t�h�r�o�u�g�h� �t�h�e� �[�n�p�m� �r�e�g�i�s�t�r�y�]�(�h�t�t�p�s�:�/�/�n�p�m�j�s�.�c�o�m�)�.� � �I�n�s�t�a�l�l�a�t�i�o�n� �i�s� �d�o�n�e� �u�s�i�n�g� �t�h�e� �[�npm install� �c�o�m�m�a�n�d�]�(�h�t�t�p�s�:�/�/�d�o�c�s�.�n�p�m�j�s�.�c�o�m�/�d�o�w�n�l�o�a�d�i�n�g�-�a�n�d�-�i�n�s�t�a�l�l�i�n�g�-�p�a�c�k�a�g�e�s�-�l�o�c�a�l�l�y�)� � � � �sh $ npm install @codeinahat/crypto � � � � �#�#� �A�P�I� � � � �js const codehat = require('@codeinahat/crypto') � � � � �#�#� �C�l�a�s�s�e�s� � � � �T�h�e�r�e� �a�r�e� �c�u�r�r�e�n�t�l�y� �s�i�x� �a�c�c�e�s�i�b�l�e� �c�l�a�s�s�e�s� �i�n� �t�h�i�s� �m�o�d�u�l�e� �[�U�t�i�l�i�t�i�e�s�]�(�#�#�#�u�t�i�l�i�t�i�e�s�)� �[�S�a�l�t�]�(�#�#�#�s�a�l�t�)�,� �[�C�r�y�p�t�o�]�(�#�#�#�c�r�y�p�t�o�)�,� �KeyAndSequence�,� �a�n�d� �KeyAndSequenceResult�.� � �Y�o�u� �s�h�o�u�l�d� �n�o�t� �h�a�v�e� �t�o� �i�n�t�e�r�a�c�t� �a�t� �a�l�l� �w�i�t�h� �KeyAndSequence� �a�n�d� �KeyAndSequenceResult� �t�h�e�y� �a�r�e� �p�r�o�v�i�d�e�r� �i�n� �c�a�s�e� �t�h�a�t� �y�o�u� �n�e�e�d� �s�o�m�e� �f�l�e�x�i�b�i�l�i�t�y� �t�h�a�t� �t�h�e� �m�o�d�u�l�e� �d�o�e�s� �n�o�t� �a�l�r�e�a�d�y� �o�f�f�e�r�.� � �I�f� �y�o�u� �u�s�e� �KeyAndSequence�,� �a�n�d� �KeyAndSequenceResult� �m�a�k�e� �s�u�r�e� �y�o�u� �a�r�e� �familiar� �w�i�t�h� �c�o�d�e�.� � � � �#�#�#� �S�a�l�t� � � � �S�a�l�t� �o�n�l�y� �h�a�s� �o�n�e� �method� �t�h�a�t� �y�o�u� �n�e�e�d� �t�o� �c�o�n�c�e�r�n� �y�o�u�r�s�e�l�f� �w�i�t�h�;� �generate�.� �T�h�i�s� �m�e�t�h�o�d� �w�i�l�l� �r�e�t�u�r�n� �a� �string� �o�f� �r�a�n�d�o�m� �c�h�a�r�a�c�t�e�r�s�.� � �js // call the API const codehat = require('@codeinahat/crypto'); // instanciate the class const salt = new codehat.Salt(); // generate random string of characters const newSalt = salt.generate(); // prints out the string of random characters console.log(newSalt); � � � � �Y�o�u� �c�a�n� �m�o�d�i�f�y� �t�h�e� �length� �o�f� �t�h�e� �s�t�r�i�n�g� �o�f� �c�h�a�r�a�c�t�e�r�s�.� �B�y� �p�a�s�s�i�n�g� �t�h�e� �f�i�r�s�t� �p�a�r�a�m�e�t�e�r� �t�o� �t�h�e� �generate� �m�e�t�h�o�d�.� �T�h�e� �d�e�f�a�u�l�t� �v�a�l�u�e� �i�s� �1�0� � �i�f� �y�o�u� �d�o�n�'�t� �p�a�s�s� �a�n�y�t�h�i�n�g�.� � �js // istanciate the class const salt = new codehat.Salt(); // call the generate method but this time pass the keyLength parameter const newSalt = salt.generate(50); // now the newSalt will be 50 characters long or more // this happend because some of the randome numbers could be two digits console.log(newSalt); � � � � �Y�o�u� �c�a�n� �m�o�d�i�f�y� �t�h�e� �diversity� �o�f� �t�h�e� �r�a�n�d�o�m� �v�a�l�u�e�.� �T�h�e� �diversity� �i�s� �t�h�e� �r�a�n�g�e� �o�f� �n�u�m�b�e�r�s� �a�s� �t�o� �w�h�i�c�h� �t�h�e� �a�l�g�o�r�i�t�h�m� �l�o�o�k�s� � �f�o�r� �t�o� �s�e�l�e�c�t� �t�h�e� �r�a�n�d�o�m� �v�a�l�u�e�.� � � �js // istanciate the class const codehat = require('@codeinahat/crypto') const salt = new codehat.Salt(); /** * call the generate method but this time pass the range parameter * we will set the keyLength to null which will give you a string of * charaters of at least 10 characters * */ const newSalt = salt.generate(null, {beg: 0, beg: 100}); /** * instead of looking between 0 and 26 which is the default value it will * look between 0 and 100 therfore adding more diversity to each character value * */ � � �note:� �T�h�e� �b�i�g�g�e�r� �t�h�e� �k�e�y�L�e�n�g�t�h� �i�s� �a�n�d� �t�h�e� �b�i�g�g�e�r� �t�h�e� �r�a�n�g�e� �i�s� �a�d�d�s� �c�o�m�p�l�e�x�i�t�y� �t�o� �y�o�u�r� �s�a�l�t� � �v�a�l�u�e�.� � � � �#�#� �C�r�y�p�t�o� � � � �C�r�y�p�t�o� �h�a�s� �s�i�x� �static methods�.� �keySequenceEncrypt�,� �asyncKeySequenceEncrypt�,� �keySequenceDecrypt�,� �asyncKeySequenceDecrypt�,� �deleteKeyDir�,� �a�n�d� �deleteKeySequenceFileStorage�.� � � � � �keySequenceEncrypt� �t�a�k�e�s� �a�n� �a�r�r�a�y� �o�f� �(characters and/or numbers)� �o�r� �a� �string of characters� �a�n�d� �r�e�t�u�r�n�s� �a� �KeyAndSequenceResult�.� � � �W�h�i�c�h� �g�i�v�e�s� �y�o�u� �a�c�c�e�s�s� �t�o� �t�h�r�e�e� �v�a�l�u�e�s�.� �keyRing (number array)� �w�h�i�c�h� �i�s� �t�h�e� �e�n�c�r�y�p�t�e�d� �d�a�t�a�,� �sequence� �w�h�i�c�h� �t�h�e� �s�e�q�u�e�n�c�e� �t�h�a�t� �t�h�e� �a�l�g�o�r�i�t�h�m� � � �f�o�l�l�o�w�s� �t�o� �d�e�c�r�y�p�t� �t�h�e� �a�r�r�a�y� �o�f� �c�h�a�r�a�c�t�e�r�s� �a�n�d� �n�u�m�b�e�r�s�,� �a�n�d� �onetimeValues� �w�h�i�c�h� �g�i�v�e�s� �y�o�u� �t�h�e� �v�a�r�i�a�b�l�e�s� �o�f� �t�h�e� �m�a�t�h�e�m�a�t�h�i�c�a�l� �e�q�u�a�t�i�o�n� �t�h�a�t� �e�n�c�r�y�p�t�s� � � �t�h�e� �data� �i�n� �t�h�e� �f�o�r�m� �o�f� �a� �n�u�m�b�e�r� �a�r�r�a�y�.� �T�h�e� �onetimeValues� �c�a�n� �b�e� �undefined� �o�r� �null� �i�f� �y�o�u�r� �u�s�i�n�g� �e�n�c�r�y�p�t�i�o�n� �v�a�r�i�a�b�l�e�s� �stored in memory�.� � � � �keySequenceEncrypt� �w�i�t�h� �onetimepad�.� �onetimepad� �i�s� �b�y� �d�e�f�a�u�l�t� �t�r�u�e�;� �T�h�i�s� �m�o�d�e� �r�e�t�u�r�n�s� �t�h�e� �onetimeValues� �t�h�a�t� �t�h�e� �a�l�g�o�r�i�t�h�m� �u�s�e�s� �t�o� �e�n�c�r�y�p�t� � �t�h�e� �d�a�t�a�,� �w�i�t�h�o�u�t� �t�h�o�s�e� �v�a�l�u�e�s� �y�o�u�r� �d�a�t�a� �w�o�n�'�t� �b�e� �a�b�l�e� �t�o� �b�e� �d�e�c�r�y�p�t�e�d� �a�n�d� �w�i�l�l� �b�e� �lost permanently�.� � �js /** * instanciate a salt object we are going to use * the keySequenceEncrypt to encrypt the salt result * */ const codehat = require('@codeinahat/crypto'); const salt = new codehat.Salt(); // generate a salt const newSalt = salt.generate(); // encrypt the result const encrypted = codehat.Crypto.keSequenceEncrypt(newSalt); // returns the KeyAndSequenceResult object // encrypted values console.log(encrypted.keyRing); // encription sequence console.log(encrypted.sequence); // one time values console.log(encrypted.onetimeValues) � � � � �keySequenceEncrypt�,� �h�o�w�e�v�e�r� �t�h�i�s� �t�i�m�e� �w�e� �w�i�l�l� �u�s�e� �e�n�c�r�y�p�t�i�o�n� �v�a�r�i�a�b�l�e�s� �stored in memory�.� �T�h�i�s� �i�s� �u�s�e� �w�h�e�n� �y�o�u� �k�e�e�p� �t�h�e� �encryption variables� �s�t�o�r�e�d� �i�n� �a� �j�s�o�n� �f�i�l�e�.� � �T�h�e� �module� �w�o�u�l�d� �a�t�t�e�m�p�t� �t�o� �c�r�e�a�t�e� �a� �directory� �i�n� �y�o�u�r� �r�o�o�t� �d�i�r�e�c�t�o�r�y� �c�a�l�l�e�d� �keys� �a�n�d� �s�a�v�e� �a� �f�i�l�e� �i�n� �t�h�e�r�e� �w�i�t�h� �t�h�e� �encryption variables�.� �Y�o�u�r� �not� �r�e�q�u�i�r�e� �t�o� � � �c�r�e�a�t�e� �t�h�i�s� �f�i�l�e� �m�a�n�u�a�l�l�y� �a�n�d� �i�t� �i�s� �NOT� �r�e�c�o�m�e�n�d�e�d� �t�h�a�t� �y�o�u� �d�o� �o�r� �m�e�s�s� �w�i�t�h� �t�h�i�s� �f�i�l�e� �u�n�l�e�s�s� �y�o�u� �a�r� �a�b�s�o�l�u�t�l�y� �s�u�r�e� �t�h�a�t� �y�o�u� �k�n�o�w� �w�h�a�t� �y�o�u�r� �d�o�i�n�g�.� �T�h�i�s� �file� �i�s� �u�s�e�d� � �t�o� �e�n�c�r�y�p�t� �a�n�d� �d�e�c�r�y�p�t� �a�l�l� �y�o�u� �d�a�t�a�.� �O�n�c�e� �i�n� �production� �i�f� �y�o�u� �u�s�e� �t�h�i�s� �m�e�t�h�o�t� �t�o� �encrypt� �y�o�u�r� �d�a�t�a� �a�n�d� �t�h�e� �f�i�l�e� �g�e�t�s� �corrupted� �o�r� �deleted� �y�o�u� �w�i�l�l� �n�o�t� �b�e� �a�b�l�e� � �t�o� �decrypt� �t�h�e� �user data� �a�l�r�e�a�d�y� �encrypted�.� � �js /** * instanciate a salt object we ar going to use * the keySequenceEncrypt ti encrypt the salt result * */ const codehat = require('@codeinahat/crypto'); const salt = new codehat.Salt(); // generate salt const newSalt = salt.generate(); /** * encrypt the result only this time we will set the onetimepad * to false * */ const encrypted = codehat.Crypto.keySequenceEncrypt(newSalt, false); /** * The program will attempt to create a folder called keys in your root * directory if it does not exist. Then it will attempt to create a file * with the encryption variables if it does not alrady exist. * */ // returns the KeyAndSequenceResult object // only this this time onetimeValues is null or undefined console.log(encrypted.keyRing) // => outputs number array console.log(encrypted.sequence) // => outputs string array console.log(encrypted.onetimValues) // => null or undefined � � � �note:� �T�h�e� �f�i�r�s�t� �t�i�m�e� �y�o�u� �c�a�l�l� �t�h�i�s� �f�u�n�c�t�i�o�n� �i�t� �w�i�l�l� �c�r�e�a�t� �t�h�e� �directory� �a�n�d� �file�.� �A�f�t�e�r�w�a�r�d�s� �a�l�l� �t�h�e� �o�t�h�e�r� �a�t�t�e�m�p�t�s� �t�o� �e�n�c�r�y�p�t� �u�s�i�n�g� �v�a�r�i�a�b�l�e�s� �storage in memory� � �w�i�l�l� �s�i�m�p�l�y� �r�e�a�d� �f�r�o�m� �t�h�i�s� �f�i�l�e�.� � � � �asyncKeySequenceEncrypt� �t�h�i�s� �m�e�t�h�o�d� �d�o�e�s� �e�v�e�r�y�t�h�i�n�g� �t�h�a�t� � �keySequenceEncrypt� �c�a�n� �d�o� �b�u�t� �i�s� �a�n� �asynchronous� �f�u�n�c�t�i�o�n�.� �W�e� �t�a�l�k�e�d� �h�o�w� �i�t� �w�a�s� �p�o�s�s�i�b�l�e� �t�o� �s�a�v�e� �t�h�e� �encryption variables� � �t�o� �a� �f�i�l�e�.� �Codeinahat� �a�l�s�o� �s�u�p�p�o�r�t�s� �s�a�v�i�n�g� �t�h�e� �encryption variables� �t�o� �a� � �[�M�o�n�g�o�D�B�]�(�h�t�t�p�s�:�/�/�w�w�w�.�m�o�n�g�o�d�b�.�c�o�m�)� �d�a�t�a�b�a�s�e�.� �I�f� �y�o�u� �s�e�t� �t�h�e� � �ontimepad� �w�h�i�c�h� �i�s� �t�h�e� �s�e�c�o�n�d� �p�a�r�a�m�a�t�e�r� �t�h�a�t� � �keySequenceEncrypt� �a�n�d� �asyncKeySequenceEncrypt� �t�a�k�e� �t�o� �f�a�l�s�e� �b�y� �t�h�e� �d�e�f�a�u�l�t� �i�t� �w�i�l�l� �s�a�v�e� �t�h�e� �encryption variales to a file�;� �H�o�w�e�v�e�r� �both� �t�h�i�s� �f�u�n�c�t�i�o�n� �a�l�s�o� �t�a�k�e� �a� �t�h�i�r�d� �p�a�r�a�m�e�t�e�r� � �storageMethod�.� �I�f� �y�o�u� �w�a�n�t� �t�o� �s�a�v�e� �a� �t�h�e� �encryptions variables� �t�o� �a� �f�i�l�e� �w�e� �r�e�c�o�m�e�n�d� �y�o�u� �s�i�m�p�l�e� �u�s�e� �keySequenceEncrypt� �a�n�d� �l�e�a�v�e� �t�h�e� �t�h�i�r�d� �p�a�r�a�m�e�t�e�r� �storage method� �u�n�d�e�f�i�n�e�d�.� �H�o�w�e�v�e�r�,�\� � �i�f� �y�o�u� �w�a�n�t� �t�o� �s�a�v� �t�h�e� �encryption variables� �t�o� �[�M�o�n�g�o�D�B�]�(�h�t�t�p�s�:�/�/�w�w�w�.�m�o�n�g�o�d�b�.�c�o�m�)� �d�a�t�a�b�a�s�e� �u�s�e� �asyncKeySequenceEncrypt� �a�n�d� �p�a�s�s� �t�h�e� �storage method� �s�p�e�c�i�f�y�i�n�g� �t�h�e� �v�a�l�u�e�s�.� � �js // call the api const codehat = require('@codeinahar/crypto'); // value to encrypt; const phrase = 'Jumping up and down comes the dinasour'; // database connection string const connection = 'mongodb://127.0.0.1:27017/?readPreference=primary&ssl=false'; // encrypting and saving the encryption variables to a database (async ()=>{ // encrypts, saves the encryption variables to a database, // uses default database name and default collection name. // database: encryption // collection: keys const encryption1 = await codehat.Crypto.asyncKeySequenceEncrypt(phrase, false, { method: 'database', connectionString: connection }) // encrypts, saves the encryption variables to a database // only this time you specify database and/or collection name const encryption2 = await codehat.Crypto.asyncKeySequenceEncrypt(phrase, false, { method: 'database', connectionString: connection, database: 'mydb', collection: 'mycollection' }); })(); � � � � � �keySequenceDecrypt� �t�a�k�e�s� �a�n� �array of numbers (keyRing)� �a�n�d� �an array of characters (sequence)�.� �I�t� �w�i�l�l� �t�a�k�e� �an array of numbers (onetimeValues)� �i�f� �y�o�u� �d�i�d� �n�o�t� �u�s�e� � �t�h�e� �v�a�r�i�a�b�l�e�s� �stored in memory�.� �You are responsibel to stored and maintain the one time values�.� �I�t� �r�e�t�u�r�n�s� �a� �d�e�c�r�y�p�t�e�d� �s�t�r�i�n�g� �o�f� �c�h�a�r�a�c�t�e�r�s�.� � � � �keySequenceDecrypt� �w�i�t�h� �onetimeValues�.� � �js /** * instanciate a salt object we are going to use * the keySequenceEncrypt to encrypt the salt arr result * */ const codehat = require('@codeinahat/crypto'); const salt = new codehat.Salt(); // generate a salt const newSalt = salt.generate(); // encrypt the result (onetimepad mode) const encrypted = codehat.Crypto.keySequenceEncrypt(newSalt); // decrypt the result (onetimepad mode) const decrypted = codehat.Crypto.keySequenceDecrypt(encrypted.keyRing, encryption.sequence, encryption.onetimeValues); // returns a decrypted string of characters console.log(decrypted) � � � � �keySequenceDecrypt� �w�i�t�h� �v�a�r�i�a�b�l�e�s� �stored in memory�.� � �js /** * instanciate a salt object we are going to use * the keySequenceEncrypt to encrypt the salt arr result * */ const codehat = require('@codeinahat/crypto'); const salt = new codehat.Salt(); // generate a salt const newSalt = salt.generate(); // encrypt the result (variables stored in memory mode) const encrypted = codehat.Crypto.keySequenceEncrypt(newSalt, false); // decrypt the result (variables stored in memory mode) const decrypted = codehat.Crypto.keySequenceDecrypt(encrypted.keyRing, encryption.sequence); // returns a decrypted string of characters console.log(decrypted) � � �note:� �W�i�t�h� �v�a�r�i�a�b�l�e�s� �s�t�o�r�e�d� �i�n� �m�e�m�o�r�y� �t�h�e� �module� �t�a�k�e�s� �o�n� �t�h�e� �r�e�s�p�o�n�s�a�b�i�l�i�t�y� �o�f� �s�t�o�r�i�n�g� �a�n�d� �m�a�n�t�a�i�n�i�n�g� �t�h�i�s� �v�a�r�i�a�b�l�e�s�.� � �I�s� �u�p� �t�o� �t�h�e� �u�s�e�r� �w�h�i�c�h� �v�e�r�s�i�o�n� �t�o� �u�s�e�.� � � � �asyncKeySequenceDecrypt� �i�s� �t�w�i�n� �t�o� �keySequenceDecrypt� �w�i�t�h� �t�h�e� �e�x�c�e�p�t�i�o�n� �t�h�a�t� �i�t� �i�s� �a�n� �asynchronous� �m�e�t�h�o�d�.� �T�h�i�s� �m�e�t�h�o�d� �m�u�s�t� �b�e� �u�s�e� � �w�h�e�n� �d�e�c�r�y�p�t�i�n�g� �u�s�i�n�g� �equation variables� �s�t�o�r�e�d� �i�n� �a� �[�M�o�n�g�o�D�B�]�(�h�t�t�p�s�:�/�/�w�w�w�.�m�o�n�g�o�d�b�.�c�o�m�)� �d�a�t�a�b�a�s�e�,� �a�l�t�h�o�u�h�g� �i�t� �c�a�n� �a�l�s�o� �b�e� �u�s�e�d� �w�h�e�n� � � �equation variables� �a�r�e� �s�t�o�r�e�d� �i�n� �a� �f�i�l�e� �o�r� �f�o�r� �onetimepad� �v�a�l�u�e�s� �i�t�'�s� �r�e�a�l� �p�u�r�p�o�s�e� �i�s� �t�o� �r�u�n� �w�h�e�n� �i�n� �n�e�e�d� �o�f� �database� �s�t�o�r�a�g�e� �s�i�n�c�e� � �file storaged� �a�n�d� �onetimepad� �c�a�n� �b�e� �d�e�c�r�y�p�t�e�d� �w�i�t�h� �keySequenceDecrypt�.� � �js // class the api const codehat = require('@codeinahat/crypto'); // lets say the encrypted value is stored in a cookie const encryption = req.cookies['user-tag']; // value to decrypt; const phrase = 'Jumping up and down comes the dinasour'; // database connection string const connection = 'mongodb://127.0.0.1:27017/?readPreference=primary&ssl=false'; // decrypting (async ()=>{ // uses default database name and default collection name. // database: encryption // collection: keys const decryption1 = await codehat.Crypto.asyncSequenceDecryp(encryption.keyRing, encryption.sequence, undefined, { method: 'database', connectionString: connection }) // this time you specify database and/or collection name const decryption2 = await codehat.Crypto.asyncSequenceDecryp(encryption.keyRing, encryption.sequence, undefined, { method: 'database', connectionString: connection, database: 'mydb', collection: 'mycollection' }); })(); � � � � � � �deleteKeySequenceFileStorage� �t�h�i�s� �w�i�l�l� �d�e�l�e�t�e� �t�h�e� �file� �w�h�e�r�e� �t�h�e� �v�a�r�i�a�b�l�e�s� �a�r�e� �s�t�o�r�e�d�.� � �js // call the api const codehat = require('@codeinahat/crypto'); // deletes files codehat.Crypto.deleteKeySequenceFileStorage(); // returns => a true or false � � � � �deleteKeyDir� �t�h�i�s� �w�i�l�l� �d�e�l�e�t�e� �t�h�e� �directory� �w�h�e�r�e� �t�h�e� �key files� �a�r�e� �s�a�v�e�s�.� � �note:� �Y�o�u� �m�u�s�t� �d�e�l�e�t�e� �a�l�l� �files� �b�e�f�o�r�e� �d�e�l�e�t�i�n�g� �t�h�e� �directory�.� � �js // call the api const codehat = require('@codeinahat/crypto'); // deletes files codehat.Crypto.deleteKeyDir(); // returns => a true or false � � � � �#�#� �U�t�i�l�i�t�i�e�s� � � � �U�t�i�l�i�t�i�e�s� �i�s� �a� �s�i�m�p�l�e� �c�l�a�s�s� �t�h�a�t� �h�a�s� �o�n�e� �static� �m�e�t�h�o�d�.� �characterNumber� �i�t� �t�a�k�e�s� �a� �n�u�m�b�e�r� �a�s� �a�r�g�u�m�e�n�t� �a�n�d� �i�t� �r�e�t�u�r�n�s� �t�h�e� �c�h�a�r�a�c�t�e�r� �v�a�l�u�e� �o�f� �t�h�a�t� �n�u�m�b�e�r� �o�r� �t�h�e� �n�u�m�b�e�r� �i�t�s�e�l�f�.� �T�h�i�s� �d�e�c�i�t�i�o�n� �i�s� � �m�a�d�e� �a�t� �r�a�n�d�o�m�.� � �js // call the API const codehat = require('@codeinahat/crypto'); // call the method const result = codehat.Utilities.characterNumber(5); console.log(result); // => prints the number 5 or f � � � � � � �#� �M�O�R�E� �C�O�M�I�N�G� �S�O�O�N� �:�-�)� � �