2016-04-04 13:44:00 +00:00
|
|
|
"use strict";
|
2016-05-23 06:15:47 +00:00
|
|
|
require("typings-test");
|
2016-07-17 15:34:15 +00:00
|
|
|
const smartfile = require("../dist/index");
|
|
|
|
const path = require("path");
|
|
|
|
const should = require("should");
|
2017-01-01 01:45:53 +00:00
|
|
|
const vinyl = require("vinyl");
|
|
|
|
describe('smartfile', function () {
|
|
|
|
describe('.fs', function () {
|
|
|
|
describe('.fileExistsSync', function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should return an accurate boolean', function () {
|
|
|
|
should(smartfile.fs.fileExistsSync('./test/mytest.json')).be.true();
|
|
|
|
should(smartfile.fs.fileExistsSync('./test/notthere.json')).be.false();
|
2016-02-04 13:21:48 +00:00
|
|
|
});
|
|
|
|
});
|
2017-01-01 01:45:53 +00:00
|
|
|
describe('.fileExists', function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should return a working promise', function () {
|
|
|
|
should(smartfile.fs.fileExists('./test/mytest.json')).be.Promise();
|
|
|
|
should(smartfile.fs.fileExists('./test/mytest.json')).be.fulfilled();
|
|
|
|
should(smartfile.fs.fileExists('./test/notthere.json')).not.be.fulfilled();
|
2016-06-23 16:31:55 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.listFoldersSync()', function () {
|
|
|
|
it('should get the file type from a string', function () {
|
|
|
|
should(smartfile.fs.listFoldersSync('./test/')).containDeep(['testfolder']);
|
|
|
|
should(smartfile.fs.listFoldersSync('./test/')).not.containDeep(['notExistentFolder']);
|
2016-06-23 16:31:55 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.listFolders()', function () {
|
|
|
|
it('should get the file type from a string', function (done) {
|
|
|
|
smartfile.fs.listFolders('./test/')
|
2016-06-23 16:31:55 +00:00
|
|
|
.then(function (folderArrayArg) {
|
2016-09-20 15:56:49 +00:00
|
|
|
should(folderArrayArg).containDeep(['testfolder']);
|
|
|
|
should(folderArrayArg).not.containDeep(['notExistentFolder']);
|
2016-06-23 16:31:55 +00:00
|
|
|
done();
|
|
|
|
});
|
2016-02-04 13:21:48 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.listFilesSync()', function () {
|
|
|
|
it('should get the file type from a string', function () {
|
|
|
|
should(smartfile.fs.listFilesSync('./test/')).containDeep(['mytest.json']);
|
|
|
|
should(smartfile.fs.listFilesSync('./test/')).not.containDeep(['notExistentFile']);
|
|
|
|
should(smartfile.fs.listFilesSync('./test/', /mytest\.json/)).containDeep(['mytest.json']);
|
|
|
|
should(smartfile.fs.listFilesSync('./test/', /mytests.json/)).not.containDeep(['mytest.json']);
|
2016-06-28 07:59:59 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.listFiles()', function () {
|
|
|
|
it('should get the file type from a string', function (done) {
|
|
|
|
smartfile.fs.listFiles('./test/')
|
2016-06-28 07:59:59 +00:00
|
|
|
.then(function (folderArrayArg) {
|
2016-09-20 15:56:49 +00:00
|
|
|
should(folderArrayArg).containDeep(['mytest.json']);
|
|
|
|
should(folderArrayArg).not.containDeep(['notExistentFile']);
|
2016-06-28 07:59:59 +00:00
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.listFileTree()', function () {
|
|
|
|
it('should get a file tree', function (done) {
|
|
|
|
smartfile.fs.listFileTree(path.resolve('./test/'), '**/*.txt')
|
2016-06-30 23:37:48 +00:00
|
|
|
.then(function (folderArrayArg) {
|
2016-09-20 15:56:49 +00:00
|
|
|
should(folderArrayArg).containDeep(['testfolder/testfile1.txt']);
|
|
|
|
should(folderArrayArg).not.containDeep(['mytest.json']);
|
2016-06-30 23:37:48 +00:00
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2017-01-01 01:45:53 +00:00
|
|
|
describe('.copy()', function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should copy a directory', function () {
|
|
|
|
smartfile.fs.copy('./test/testfolder/', './test/temp/');
|
2016-03-18 16:34:31 +00:00
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should copy a file', function () {
|
|
|
|
smartfile.fs.copy('./test/mytest.yaml', './test/temp/');
|
2016-03-18 16:34:31 +00:00
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should copy a file and rename it', function () {
|
|
|
|
smartfile.fs.copy('./test/mytest.yaml', './test/temp/mytestRenamed.yaml');
|
2016-03-18 16:34:31 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.remove()', function () {
|
|
|
|
it('should remove an entire directory', function () {
|
2016-03-20 23:28:29 +00:00
|
|
|
});
|
2016-09-29 12:17:46 +00:00
|
|
|
it('smartfile.fs.remove -> should remove single files', function (done) {
|
|
|
|
smartfile.fs.remove('./test/temp/mytestRenamed.yaml')
|
|
|
|
.then(() => { done(); });
|
|
|
|
});
|
|
|
|
it('smartfile.fs.removeSync -> should remove single files synchronouly', function () {
|
|
|
|
smartfile.fs.removeSync('./test/temp/testfile1.txt');
|
|
|
|
should(smartfile.fs.fileExistsSync('./test/temp/testfile1.txt')).be.false();
|
|
|
|
});
|
|
|
|
it('smartfile.fs.removeMany -> should remove and array of files', function (done) {
|
|
|
|
smartfile.fs.removeMany(['./test/temp/testfile1.txt', './test/temp/testfile2.txt']).then(() => {
|
|
|
|
should(smartfile.fs.fileExistsSync('./test/temp/testfile1.txt')).be.false();
|
|
|
|
should(smartfile.fs.fileExistsSync('./test/temp/testfile2.txt')).be.false();
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
it('smartfile.fs.removeManySync -> should remove and array of single files synchronouly', function () {
|
|
|
|
smartfile.fs.removeManySync(['./test/temp/testfile1.txt', './test/temp/testfile2.txt']);
|
|
|
|
should(smartfile.fs.fileExistsSync('./test/temp/testfile1.txt')).be.false();
|
|
|
|
should(smartfile.fs.fileExistsSync('./test/temp/testfile2.txt')).be.false();
|
2016-04-02 21:03:18 +00:00
|
|
|
});
|
2016-03-20 23:28:29 +00:00
|
|
|
});
|
2016-03-18 16:34:31 +00:00
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.interpreter', function () {
|
|
|
|
describe('.filetype()', function () {
|
|
|
|
it('should get the file type from a string', function () {
|
|
|
|
should(smartfile.interpreter.filetype('./somefolder/data.json')).equal('json');
|
2016-04-14 18:33:58 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2017-01-01 01:45:53 +00:00
|
|
|
describe('.fs', function () {
|
|
|
|
describe('.toObjectSync()', function () {
|
|
|
|
it('should read an ' + '.yaml' + ' file to an object', function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
let testData = smartfile.fs.toObjectSync('./test/mytest.yaml');
|
|
|
|
should(testData).have.property('key1', 'this works');
|
|
|
|
should(testData).have.property('key2', 'this works too');
|
2016-03-18 16:34:31 +00:00
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should state unknown file type for unknown file types', function () {
|
|
|
|
let testData = smartfile.fs.toObjectSync('./test/mytest.txt');
|
2016-03-18 16:34:31 +00:00
|
|
|
});
|
2017-01-01 01:45:53 +00:00
|
|
|
it('should read an ' + '.json' + ' file to an object', function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
let testData = smartfile.fs.toObjectSync('./test/mytest.json');
|
|
|
|
should(testData).have.property('key1', 'this works');
|
|
|
|
should(testData).have.property('key2', 'this works too');
|
2016-03-18 16:34:31 +00:00
|
|
|
});
|
2016-03-14 02:50:14 +00:00
|
|
|
});
|
2017-01-01 01:45:53 +00:00
|
|
|
describe('.toStringSync()', function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should read a file to a string', function () {
|
|
|
|
should.equal(smartfile.fs.toStringSync('./test/mytest.txt'), 'Some TestString &&%$');
|
2016-03-19 21:07:59 +00:00
|
|
|
});
|
|
|
|
});
|
2017-01-01 01:45:53 +00:00
|
|
|
describe('.toVinylSync', function () {
|
|
|
|
it('should read an ' + '.json OR .yaml' + ' file to an ' + 'vinyl file object', function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
let testData = smartfile.fs.toVinylSync('./test/mytest.json');
|
|
|
|
should(vinyl.isVinyl(testData)).be.true();
|
2016-03-18 16:34:31 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.memory', function () {
|
|
|
|
describe('.toGulpStream()', function () {
|
|
|
|
it('should produce a valid gulp stream', function () {
|
|
|
|
let localArray = ['test1', 'test2', 'test3'];
|
2016-10-27 16:55:18 +00:00
|
|
|
smartfile.memory.toGulpStream(localArray);
|
2016-04-04 13:44:00 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('toVinylFileSync()', function () {
|
|
|
|
it('should produce a vinylFile', function () {
|
|
|
|
let localString = 'myString';
|
|
|
|
let localOptions = { filename: 'vinylfile2', base: '/someDir' };
|
|
|
|
should(smartfile.memory.toVinylFileSync(localString, localOptions) instanceof vinyl).be.true();
|
2016-04-04 13:44:00 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('toVinylArraySync()', function () {
|
|
|
|
it('should produce a an array of vinylfiles', function () {
|
|
|
|
let localStringArray = ['string1', 'string2', 'string3'];
|
|
|
|
let localOptions = { filename: 'vinylfile2', base: '/someDir' };
|
2016-07-17 15:34:15 +00:00
|
|
|
let testResult = smartfile.memory.toVinylArraySync(localStringArray, localOptions);
|
2016-09-20 15:56:49 +00:00
|
|
|
should(testResult).be.Array();
|
|
|
|
should(testResult.length === 3).be.true();
|
2016-07-17 15:34:15 +00:00
|
|
|
for (let myKey in testResult) {
|
2016-09-20 15:56:49 +00:00
|
|
|
should(testResult[myKey] instanceof vinyl).be.true();
|
2016-04-04 13:44:00 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
2017-01-01 01:45:53 +00:00
|
|
|
describe('vinylToStringSync()', function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should produce a String from vinyl file', function () {
|
2017-01-01 01:45:53 +00:00
|
|
|
let localString = smartfile.memory.vinylToStringSync(new vinyl({
|
2016-09-20 15:56:49 +00:00
|
|
|
base: '/',
|
|
|
|
path: '/test.txt',
|
|
|
|
contents: new Buffer('myString')
|
2016-04-04 13:44:00 +00:00
|
|
|
}));
|
2016-09-20 15:56:49 +00:00
|
|
|
should(localString).equal('myString');
|
2016-04-04 13:44:00 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('toFs()', function () {
|
|
|
|
it('should write a file to disk and return a promise', function (done) {
|
|
|
|
let localString = 'myString';
|
|
|
|
smartfile.memory.toFs(localString, path.join(process.cwd(), './test/temp/testMemToFs.txt')).then(done);
|
2016-04-04 13:44:00 +00:00
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('toFsSync()', function () {
|
|
|
|
it('should write a file to disk and return true if successfull', function () {
|
|
|
|
let localString = 'myString';
|
|
|
|
smartfile.memory.toFsSync(localString, path.join(process.cwd(), './test/temp/testMemToFsSync.txt'));
|
2016-04-04 13:44:00 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
describe('.remote', function () {
|
|
|
|
describe('.toString()', function () {
|
|
|
|
it('should load a remote file to a variable', function (done) {
|
2016-03-18 16:34:31 +00:00
|
|
|
this.timeout(5000);
|
2016-09-20 15:56:49 +00:00
|
|
|
smartfile.remote.toString('https://raw.githubusercontent.com/pushrocks/smartfile/master/test/mytest.txt').then(function (responseString) {
|
|
|
|
should.equal(responseString, 'Some TestString &&%$');
|
2016-03-18 16:34:31 +00:00
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
2016-09-20 15:56:49 +00:00
|
|
|
it('should reject a Promise when the link is false', function (done) {
|
2016-04-02 21:03:18 +00:00
|
|
|
this.timeout(10000);
|
2016-09-20 15:56:49 +00:00
|
|
|
smartfile.remote.toString('https://push.rocks/doesnotexist.txt')
|
2016-03-18 16:34:31 +00:00
|
|
|
.then(function () {
|
2016-09-20 15:56:49 +00:00
|
|
|
throw new Error('this test should not be resolved');
|
2016-03-18 16:34:31 +00:00
|
|
|
}, function () {
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
2016-03-14 02:50:14 +00:00
|
|
|
});
|
|
|
|
});
|
2016-02-03 11:52:09 +00:00
|
|
|
});
|
2017-01-01 01:45:53 +00:00
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQiwyQ0FBMEM7QUFFMUMsNkJBQTZCO0FBQzdCLGlDQUFnQztBQUNoQywrQkFBOEI7QUFFOUIsUUFBUSxDQUFDLFdBQVcsRUFBRTtJQUNsQixRQUFRLENBQUMsS0FBSyxFQUFFO1FBQ1osUUFBUSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtnQkFDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBQ25FLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQzFFLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLENBQUE7UUFDRixRQUFRLENBQUMsYUFBYSxFQUFFO1lBQ3BCLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtnQkFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUE7Z0JBQ2xFLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFBO2dCQUNwRSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDOUUsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDLENBQUMsQ0FBQTtRQUNGLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQixFQUFFLENBQUMsd0NBQXdDLEVBQUU7Z0JBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7Z0JBQzNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUE7WUFDMUYsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDLENBQUMsQ0FBQTtRQUNGLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixFQUFFLENBQUMsd0NBQXdDLEVBQUUsVUFBVSxJQUFJO2dCQUN2RCxTQUFTLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7cUJBQzlCLElBQUksQ0FBQyxVQUFVLGNBQWM7b0JBQzFCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO29CQUNsRCxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQTtvQkFDN0QsSUFBSSxFQUFFLENBQUE7Z0JBQ1YsQ0FBQyxDQUFDLENBQUE7WUFDVixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO1FBQ0YsUUFBUSxDQUFDLGtCQUFrQixFQUFFO1lBQ3pCLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtnQkFDekMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtnQkFDMUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtnQkFDbEYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7Z0JBQzFGLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtZQUNsRyxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO1FBQ0YsUUFBUSxDQUFDLGNBQWMsRUFBRTtZQUNyQixFQUFFLENBQUMsd0NBQXdDLEVBQUUsVUFBVSxJQUFJO2dCQUN2RCxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7cUJBQzVCLElBQUksQ0FBQyxVQUFVLGNBQWM7b0JBQzFCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO29CQUNuRCxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtvQkFDM0QsSUFBSSxFQUFFLENBQUE7Z0JBQ1YsQ0FBQyxDQUFDLENBQUE7WUFDVixDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO1FBQ0YsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxVQUFVLElBQUk7Z0JBQ3ZDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDO3FCQUN6RCxJQUFJLENBQUMsVUFBVSxjQUFjO29CQUMxQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFBO29CQUNoRSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7b0JBQ3ZELElBQUksRUFBRSxDQUFBO2dCQUNWLENBQUMsQ0FBQyxDQUFBO1lBQ1YsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDLENBQUMsQ0FBQTtRQUNGLFFBQVEsQ0FBQyxTQUFTLEVBQUU7WUFDaEIsRUFBRSxDQUFDLHlCQUF5QixFQUFFO2dCQUMxQixTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxjQUFjLENBQUMsQ0FBQTtZQUMzRCxDQUFDLENBQUMsQ0FBQTtZQUNGLEVBQUUsQ0FBQyxvQkFBb0IsR
|