Built motion from commit (unavailable).|2.5.6
[motion2.git] / server / api / smsQueueReport / smsQueueReport.controller.js
index baa6be3..faea891 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xe14b=['findAll','rows','catch','find','create','body','params','destroy','describe','html-pdf','eml-format','fast-json-patch','request-promise','bluebird','path','sox','to-csv','ejs','lodash','squel','crypto','querystring','papaparse','ioredis','../../components/auth/service','../../config/license/hardware','../../config/logger','../../config/utils','../../config/environment','../../mysqldb','sendStatus','status','end','count','offset','limit','set','json','apply','reject','update','then','error','stack','name','index','SmsQueueReport','rawAttributes','fieldName','type','key','model','map','query','keys','filters','intersection','attributes','fields','length','order','sort','filter','where','merge','VIRTUAL','options','includeAll','include'];(function(_0x1bffd9,_0x5a9420){var _0xfec9b9=function(_0x237cce){while(--_0x237cce){_0x1bffd9['push'](_0x1bffd9['shift']());}};_0xfec9b9(++_0x5a9420);}(_0xe14b,0x93));var _0xbe14=function(_0x181b38,_0x488aef){_0x181b38=_0x181b38-0x0;var _0x25fd3e=_0xe14b[_0x181b38];return _0x25fd3e;};'use strict';var pdf=require(_0xbe14('0x0'));var emlformat=require(_0xbe14('0x1'));var rimraf=require('rimraf');var zipdir=require('zip-dir');var jsonpatch=require(_0xbe14('0x2'));var rp=require(_0xbe14('0x3'));var moment=require('moment');var BPromise=require(_0xbe14('0x4'));var Mustache=require('mustache');var util=require('util');var path=require(_0xbe14('0x5'));var sox=require(_0xbe14('0x6'));var csv=require(_0xbe14('0x7'));var ejs=require(_0xbe14('0x8'));var fs=require('fs');var _=require(_0xbe14('0x9'));var squel=require(_0xbe14('0xa'));var crypto=require(_0xbe14('0xb'));var jsforce=require('jsforce');var deskjs=require('desk.js');var toCsv=require('to-csv');var querystring=require(_0xbe14('0xc'));var Papa=require(_0xbe14('0xd'));var Redis=require(_0xbe14('0xe'));var authService=require(_0xbe14('0xf'));var qs=require('../../components/parsers/qs');var as=require('../../components/parsers/advancedSearch');var hardwareService=require(_0xbe14('0x10'));var logger=require(_0xbe14('0x11'))('api');var utils=require(_0xbe14('0x12'));var config=require(_0xbe14('0x13'));var db=require(_0xbe14('0x14'))['db'];function respondWithStatusCode(_0x3d38c2,_0x27792f){_0x27792f=_0x27792f||0xcc;return function(_0x3b898d){if(_0x3b898d){return _0x3d38c2[_0xbe14('0x15')](_0x27792f);}return _0x3d38c2[_0xbe14('0x16')](_0x27792f)[_0xbe14('0x17')]();};}function respondWithResult(_0xa2cf72,_0x1e4826){_0x1e4826=_0x1e4826||0xc8;return function(_0x33fd54){if(_0x33fd54){return _0xa2cf72[_0xbe14('0x16')](_0x1e4826)['json'](_0x33fd54);}};}function respondWithFilteredResult(_0x55b3a7,_0x3f58f5){return function(_0x3dc4a9){if(_0x3dc4a9){var _0xf4ac9=_0x3dc4a9[_0xbe14('0x18')],_0x37ce4e=_0x3f58f5[_0xbe14('0x19')],_0x4e8f34=_0x3f58f5[_0xbe14('0x19')]+_0x3f58f5[_0xbe14('0x1a')],_0x21c789;if(_0x4e8f34>=_0xf4ac9){_0x4e8f34=_0xf4ac9;_0x21c789=0xc8;}else{_0x21c789=0xce;}_0x55b3a7[_0xbe14('0x16')](_0x21c789);return _0x55b3a7[_0xbe14('0x1b')]('Content-Range',_0x37ce4e+'-'+_0x4e8f34+'/'+_0xf4ac9)[_0xbe14('0x1c')](_0x3dc4a9);}return null;};}function patchUpdates(_0x456ca8){return function(_0x329588){try{jsonpatch[_0xbe14('0x1d')](_0x329588,_0x456ca8,!![]);}catch(_0x3249da){return BPromise[_0xbe14('0x1e')](_0x3249da);}return _0x329588['save']();};}function saveUpdates(_0x24f820,_0x4a1bbd){return function(_0x417c8d){if(_0x417c8d){return _0x417c8d[_0xbe14('0x1f')](_0x24f820)[_0xbe14('0x20')](function(_0x51dc0b){return _0x51dc0b;});}return null;};}function removeEntity(_0xe60f42,_0x56d845){return function(_0x3c1c85){if(_0x3c1c85){return _0x3c1c85['destroy']()[_0xbe14('0x20')](function(){_0xe60f42['status'](0xcc)[_0xbe14('0x17')]();});}};}function handleEntityNotFound(_0x3d3608,_0x505dbd){return function(_0x2da350){if(!_0x2da350){_0x3d3608['sendStatus'](0x194);}return _0x2da350;};}function handleError(_0x4587a8,_0x4851f8){_0x4851f8=_0x4851f8||0x1f4;return function(_0x36a21e){logger[_0xbe14('0x21')](_0x36a21e[_0xbe14('0x22')]);if(_0x36a21e[_0xbe14('0x23')]){delete _0x36a21e[_0xbe14('0x23')];}_0x4587a8[_0xbe14('0x16')](_0x4851f8)['send'](_0x36a21e);};}exports[_0xbe14('0x24')]=function(_0x1ba46a,_0x391556){var _0x169369={},_0x5dd475={},_0x16f884={'count':0x0,'rows':[]};var _0x29fc64=_['map'](db[_0xbe14('0x25')][_0xbe14('0x26')],function(_0x1c7cc7){return{'name':_0x1c7cc7[_0xbe14('0x27')],'type':_0x1c7cc7[_0xbe14('0x28')][_0xbe14('0x29')]};});_0x5dd475[_0xbe14('0x2a')]=_[_0xbe14('0x2b')](_0x29fc64,_0xbe14('0x23'));_0x5dd475[_0xbe14('0x2c')]=_[_0xbe14('0x2d')](_0x1ba46a[_0xbe14('0x2c')]);_0x5dd475[_0xbe14('0x2e')]=_[_0xbe14('0x2f')](_0x5dd475[_0xbe14('0x2a')],_0x5dd475[_0xbe14('0x2c')]);_0x169369[_0xbe14('0x30')]=_[_0xbe14('0x2f')](_0x5dd475[_0xbe14('0x2a')],qs[_0xbe14('0x31')](_0x1ba46a['query'][_0xbe14('0x31')]));_0x169369['attributes']=_0x169369['attributes'][_0xbe14('0x32')]?_0x169369['attributes']:_0x5dd475[_0xbe14('0x2a')];if(!_0x1ba46a[_0xbe14('0x2c')]['hasOwnProperty']('nolimit')){_0x169369['limit']=qs[_0xbe14('0x1a')](_0x1ba46a[_0xbe14('0x2c')]['limit']);_0x169369[_0xbe14('0x19')]=qs[_0xbe14('0x19')](_0x1ba46a[_0xbe14('0x2c')][_0xbe14('0x19')]);}_0x169369[_0xbe14('0x33')]=qs['sort'](_0x1ba46a['query'][_0xbe14('0x34')]);_0x169369['where']=qs['filters'](_['pick'](_0x1ba46a[_0xbe14('0x2c')],_0x5dd475[_0xbe14('0x2e')]),_0x29fc64);if(_0x1ba46a[_0xbe14('0x2c')][_0xbe14('0x35')]){_0x169369[_0xbe14('0x36')]=_[_0xbe14('0x37')](_0x169369[_0xbe14('0x36')],{'$or':_[_0xbe14('0x2b')](_0x29fc64,function(_0x2d9c12){if(_0x2d9c12[_0xbe14('0x28')]!==_0xbe14('0x38')){var _0x32c59d={};_0x32c59d[_0x2d9c12['name']]={'$like':'%'+_0x1ba46a['query'][_0xbe14('0x35')]+'%'};return _0x32c59d;}})});}_0x169369=_[_0xbe14('0x37')]({},_0x169369,_0x1ba46a[_0xbe14('0x39')]);var _0x520e09={'where':_0x169369[_0xbe14('0x36')]};return db[_0xbe14('0x25')][_0xbe14('0x18')](_0x520e09)[_0xbe14('0x20')](function(_0x3bd454){_0x16f884[_0xbe14('0x18')]=_0x3bd454;if(_0x1ba46a[_0xbe14('0x2c')][_0xbe14('0x3a')]){_0x169369[_0xbe14('0x3b')]=[{'all':!![]}];}return db['SmsQueueReport'][_0xbe14('0x3c')](_0x169369);})[_0xbe14('0x20')](function(_0x3463c4){_0x16f884[_0xbe14('0x3d')]=_0x3463c4;return _0x16f884;})[_0xbe14('0x20')](respondWithFilteredResult(_0x391556,_0x169369))[_0xbe14('0x3e')](handleError(_0x391556,null));};exports['show']=function(_0xb0f143,_0x1974a4){var _0x1220c9={'raw':!![],'where':{'id':_0xb0f143['params']['id']}},_0x36263c={};_0x36263c['model']=_[_0xbe14('0x2d')](db[_0xbe14('0x25')][_0xbe14('0x26')]);_0x36263c['query']=_['keys'](_0xb0f143[_0xbe14('0x2c')]);_0x36263c['filters']=_['intersection'](_0x36263c[_0xbe14('0x2a')],_0x36263c[_0xbe14('0x2c')]);_0x1220c9[_0xbe14('0x30')]=_['intersection'](_0x36263c['model'],qs['fields'](_0xb0f143[_0xbe14('0x2c')][_0xbe14('0x31')]));_0x1220c9[_0xbe14('0x30')]=_0x1220c9['attributes'][_0xbe14('0x32')]?_0x1220c9[_0xbe14('0x30')]:_0x36263c[_0xbe14('0x2a')];if(_0xb0f143[_0xbe14('0x2c')]['includeAll']){_0x1220c9['include']=[{'all':!![]}];}_0x1220c9=_[_0xbe14('0x37')]({},_0x1220c9,_0xb0f143[_0xbe14('0x39')]);return db[_0xbe14('0x25')][_0xbe14('0x3f')](_0x1220c9)[_0xbe14('0x20')](handleEntityNotFound(_0x1974a4,null))['then'](respondWithResult(_0x1974a4,null))['catch'](handleError(_0x1974a4,null));};exports[_0xbe14('0x40')]=function(_0x2a3623,_0x238c60){return db[_0xbe14('0x25')]['create'](_0x2a3623[_0xbe14('0x41')],{})[_0xbe14('0x20')](respondWithResult(_0x238c60,0xc9))['catch'](handleError(_0x238c60,null));};exports[_0xbe14('0x1f')]=function(_0x2a35e5,_0x2d6ee8){if(_0x2a35e5[_0xbe14('0x41')]['id']){delete _0x2a35e5['body']['id'];}return db['SmsQueueReport'][_0xbe14('0x3f')]({'where':{'id':_0x2a35e5[_0xbe14('0x42')]['id']}})['then'](handleEntityNotFound(_0x2d6ee8,null))['then'](saveUpdates(_0x2a35e5[_0xbe14('0x41')],null))[_0xbe14('0x20')](respondWithResult(_0x2d6ee8,null))[_0xbe14('0x3e')](handleError(_0x2d6ee8,null));};exports[_0xbe14('0x43')]=function(_0xdbc6e1,_0xd04fd5){return db[_0xbe14('0x25')]['find']({'where':{'id':_0xdbc6e1[_0xbe14('0x42')]['id']}})[_0xbe14('0x20')](handleEntityNotFound(_0xd04fd5,null))[_0xbe14('0x20')](removeEntity(_0xd04fd5,null))[_0xbe14('0x3e')](handleError(_0xd04fd5,null));};exports[_0xbe14('0x44')]=function(_0x494c32,_0x3a221b){return db[_0xbe14('0x25')][_0xbe14('0x44')]()[_0xbe14('0x20')](respondWithResult(_0x3a221b,null))[_0xbe14('0x3e')](handleError(_0x3a221b,null));};
\ No newline at end of file
+var _0xa836=['fast-json-patch','request-promise','moment','bluebird','mustache','util','sox','to-csv','ejs','lodash','crypto','jsforce','querystring','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','api','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','status','json','count','offset','limit','set','Content-Range','apply','reject','save','update','then','stack','name','send','index','map','SmsQueueReport','fieldName','type','key','model','filters','intersection','query','fields','attributes','hasOwnProperty','nolimit','order','sort','where','pick','merge','VIRTUAL','includeAll','include','findAll','catch','show','params','keys','rawAttributes','find','create','body','destroy','describe','html-pdf'];(function(_0x1aa01e,_0x305a7a){var _0x3af9a7=function(_0x3fd45f){while(--_0x3fd45f){_0x1aa01e['push'](_0x1aa01e['shift']());}};_0x3af9a7(++_0x305a7a);}(_0xa836,0x162));var _0x6a83=function(_0x1bc2e0,_0xa543b){_0x1bc2e0=_0x1bc2e0-0x0;var _0x33e229=_0xa836[_0x1bc2e0];return _0x33e229;};'use strict';var pdf=require(_0x6a83('0x0'));var emlformat=require('eml-format');var rimraf=require('rimraf');var zipdir=require('zip-dir');var jsonpatch=require(_0x6a83('0x1'));var rp=require(_0x6a83('0x2'));var moment=require(_0x6a83('0x3'));var BPromise=require(_0x6a83('0x4'));var Mustache=require(_0x6a83('0x5'));var util=require(_0x6a83('0x6'));var path=require('path');var sox=require(_0x6a83('0x7'));var csv=require(_0x6a83('0x8'));var ejs=require(_0x6a83('0x9'));var fs=require('fs');var _=require(_0x6a83('0xa'));var squel=require('squel');var crypto=require(_0x6a83('0xb'));var jsforce=require(_0x6a83('0xc'));var deskjs=require('desk.js');var toCsv=require(_0x6a83('0x8'));var querystring=require(_0x6a83('0xd'));var Papa=require('papaparse');var Redis=require(_0x6a83('0xe'));var authService=require(_0x6a83('0xf'));var qs=require(_0x6a83('0x10'));var as=require(_0x6a83('0x11'));var hardwareService=require('../../config/license/hardware');var logger=require('../../config/logger')(_0x6a83('0x12'));var utils=require(_0x6a83('0x13'));var config=require(_0x6a83('0x14'));var licenseUtil=require(_0x6a83('0x15'));var db=require(_0x6a83('0x16'))['db'];function respondWithStatusCode(_0xd1b6a6,_0x91e05d){_0x91e05d=_0x91e05d||0xcc;return function(_0xf136ac){if(_0xf136ac){return _0xd1b6a6['sendStatus'](_0x91e05d);}return _0xd1b6a6[_0x6a83('0x17')](_0x91e05d)['end']();};}function respondWithResult(_0x1bbbfd,_0x194e47){_0x194e47=_0x194e47||0xc8;return function(_0x2b8825){if(_0x2b8825){return _0x1bbbfd['status'](_0x194e47)[_0x6a83('0x18')](_0x2b8825);}};}function respondWithFilteredResult(_0xc92cdb,_0x32b587){return function(_0x4aa0fd){if(_0x4aa0fd){var _0x55c067=_0x4aa0fd[_0x6a83('0x19')],_0x28b6a6=_0x32b587['offset'],_0x250d01=_0x32b587[_0x6a83('0x1a')]+_0x32b587[_0x6a83('0x1b')],_0x146ff2;if(_0x250d01>=_0x55c067){_0x250d01=_0x55c067;_0x146ff2=0xc8;}else{_0x146ff2=0xce;}_0xc92cdb[_0x6a83('0x17')](_0x146ff2);return _0xc92cdb[_0x6a83('0x1c')](_0x6a83('0x1d'),_0x28b6a6+'-'+_0x250d01+'/'+_0x55c067)[_0x6a83('0x18')](_0x4aa0fd);}return null;};}function patchUpdates(_0x5c2867){return function(_0x266fae){try{jsonpatch[_0x6a83('0x1e')](_0x266fae,_0x5c2867,!![]);}catch(_0x1003dc){return BPromise[_0x6a83('0x1f')](_0x1003dc);}return _0x266fae[_0x6a83('0x20')]();};}function saveUpdates(_0x2a7718,_0x41ff70){return function(_0x203e87){if(_0x203e87){return _0x203e87[_0x6a83('0x21')](_0x2a7718)[_0x6a83('0x22')](function(_0x51eede){return _0x51eede;});}return null;};}function removeEntity(_0x149c5b,_0x5b2932){return function(_0x1b3e57){if(_0x1b3e57){return _0x1b3e57['destroy']()[_0x6a83('0x22')](function(){_0x149c5b[_0x6a83('0x17')](0xcc)['end']();});}};}function handleEntityNotFound(_0x1f9c0b,_0x91169c){return function(_0x413a72){if(!_0x413a72){_0x1f9c0b['sendStatus'](0x194);}return _0x413a72;};}function handleError(_0x43379c,_0x4cd16a){_0x4cd16a=_0x4cd16a||0x1f4;return function(_0x1738e7){logger['error'](_0x1738e7[_0x6a83('0x23')]);if(_0x1738e7[_0x6a83('0x24')]){delete _0x1738e7['name'];}_0x43379c[_0x6a83('0x17')](_0x4cd16a)[_0x6a83('0x25')](_0x1738e7);};}exports[_0x6a83('0x26')]=function(_0x28c4d3,_0x44cf22){var _0xa7dafe={},_0x410ef0={},_0x451890={'count':0x0,'rows':[]};var _0x6562ec=_[_0x6a83('0x27')](db[_0x6a83('0x28')]['rawAttributes'],function(_0xab9417){return{'name':_0xab9417[_0x6a83('0x29')],'type':_0xab9417[_0x6a83('0x2a')][_0x6a83('0x2b')]};});_0x410ef0[_0x6a83('0x2c')]=_[_0x6a83('0x27')](_0x6562ec,_0x6a83('0x24'));_0x410ef0['query']=_['keys'](_0x28c4d3['query']);_0x410ef0[_0x6a83('0x2d')]=_[_0x6a83('0x2e')](_0x410ef0[_0x6a83('0x2c')],_0x410ef0[_0x6a83('0x2f')]);_0xa7dafe['attributes']=_[_0x6a83('0x2e')](_0x410ef0[_0x6a83('0x2c')],qs[_0x6a83('0x30')](_0x28c4d3[_0x6a83('0x2f')]['fields']));_0xa7dafe[_0x6a83('0x31')]=_0xa7dafe[_0x6a83('0x31')]['length']?_0xa7dafe[_0x6a83('0x31')]:_0x410ef0[_0x6a83('0x2c')];if(!_0x28c4d3[_0x6a83('0x2f')][_0x6a83('0x32')](_0x6a83('0x33'))){_0xa7dafe['limit']=qs['limit'](_0x28c4d3[_0x6a83('0x2f')][_0x6a83('0x1b')]);_0xa7dafe[_0x6a83('0x1a')]=qs[_0x6a83('0x1a')](_0x28c4d3[_0x6a83('0x2f')][_0x6a83('0x1a')]);}_0xa7dafe[_0x6a83('0x34')]=qs['sort'](_0x28c4d3[_0x6a83('0x2f')][_0x6a83('0x35')]);_0xa7dafe[_0x6a83('0x36')]=qs[_0x6a83('0x2d')](_[_0x6a83('0x37')](_0x28c4d3[_0x6a83('0x2f')],_0x410ef0[_0x6a83('0x2d')]),_0x6562ec);if(_0x28c4d3[_0x6a83('0x2f')]['filter']){_0xa7dafe[_0x6a83('0x36')]=_[_0x6a83('0x38')](_0xa7dafe[_0x6a83('0x36')],{'$or':_[_0x6a83('0x27')](_0x6562ec,function(_0x17c375){if(_0x17c375[_0x6a83('0x2a')]!==_0x6a83('0x39')){var _0x3e3a22={};_0x3e3a22[_0x17c375[_0x6a83('0x24')]]={'$like':'%'+_0x28c4d3[_0x6a83('0x2f')]['filter']+'%'};return _0x3e3a22;}})});}_0xa7dafe=_[_0x6a83('0x38')]({},_0xa7dafe,_0x28c4d3['options']);var _0x3684f4={'where':_0xa7dafe[_0x6a83('0x36')]};return db[_0x6a83('0x28')][_0x6a83('0x19')](_0x3684f4)['then'](function(_0x4aa7c1){_0x451890[_0x6a83('0x19')]=_0x4aa7c1;if(_0x28c4d3[_0x6a83('0x2f')][_0x6a83('0x3a')]){_0xa7dafe[_0x6a83('0x3b')]=[{'all':!![]}];}return db[_0x6a83('0x28')][_0x6a83('0x3c')](_0xa7dafe);})['then'](function(_0x21217a){_0x451890['rows']=_0x21217a;return _0x451890;})[_0x6a83('0x22')](respondWithFilteredResult(_0x44cf22,_0xa7dafe))[_0x6a83('0x3d')](handleError(_0x44cf22,null));};exports[_0x6a83('0x3e')]=function(_0x255cdd,_0x36ed8b){var _0x4bf439={'raw':!![],'where':{'id':_0x255cdd[_0x6a83('0x3f')]['id']}},_0x59413a={};_0x59413a[_0x6a83('0x2c')]=_[_0x6a83('0x40')](db[_0x6a83('0x28')][_0x6a83('0x41')]);_0x59413a[_0x6a83('0x2f')]=_[_0x6a83('0x40')](_0x255cdd[_0x6a83('0x2f')]);_0x59413a[_0x6a83('0x2d')]=_[_0x6a83('0x2e')](_0x59413a[_0x6a83('0x2c')],_0x59413a['query']);_0x4bf439[_0x6a83('0x31')]=_[_0x6a83('0x2e')](_0x59413a['model'],qs['fields'](_0x255cdd['query'][_0x6a83('0x30')]));_0x4bf439[_0x6a83('0x31')]=_0x4bf439[_0x6a83('0x31')]['length']?_0x4bf439[_0x6a83('0x31')]:_0x59413a['model'];if(_0x255cdd['query'][_0x6a83('0x3a')]){_0x4bf439[_0x6a83('0x3b')]=[{'all':!![]}];}_0x4bf439=_[_0x6a83('0x38')]({},_0x4bf439,_0x255cdd['options']);return db[_0x6a83('0x28')][_0x6a83('0x42')](_0x4bf439)[_0x6a83('0x22')](handleEntityNotFound(_0x36ed8b,null))[_0x6a83('0x22')](respondWithResult(_0x36ed8b,null))[_0x6a83('0x3d')](handleError(_0x36ed8b,null));};exports[_0x6a83('0x43')]=function(_0x52e219,_0x2102c8){return db[_0x6a83('0x28')][_0x6a83('0x43')](_0x52e219[_0x6a83('0x44')],{})[_0x6a83('0x22')](respondWithResult(_0x2102c8,0xc9))['catch'](handleError(_0x2102c8,null));};exports[_0x6a83('0x21')]=function(_0x485f35,_0x107d06){if(_0x485f35['body']['id']){delete _0x485f35[_0x6a83('0x44')]['id'];}return db['SmsQueueReport'][_0x6a83('0x42')]({'where':{'id':_0x485f35[_0x6a83('0x3f')]['id']}})[_0x6a83('0x22')](handleEntityNotFound(_0x107d06,null))[_0x6a83('0x22')](saveUpdates(_0x485f35[_0x6a83('0x44')],null))['then'](respondWithResult(_0x107d06,null))[_0x6a83('0x3d')](handleError(_0x107d06,null));};exports[_0x6a83('0x45')]=function(_0x8133ff,_0x120356){return db[_0x6a83('0x28')]['find']({'where':{'id':_0x8133ff['params']['id']}})[_0x6a83('0x22')](handleEntityNotFound(_0x120356,null))[_0x6a83('0x22')](removeEntity(_0x120356,null))[_0x6a83('0x3d')](handleError(_0x120356,null));};exports[_0x6a83('0x46')]=function(_0x504979,_0x51b850){return db[_0x6a83('0x28')][_0x6a83('0x46')]()[_0x6a83('0x22')](respondWithResult(_0x51b850,null))[_0x6a83('0x3d')](handleError(_0x51b850,null));};
\ No newline at end of file