Built motion from commit ddca4d0d.|2.5.47
[motion2.git] / server / api / intDeskField / intDeskField.controller.js
index c1b2f52..9426f1f 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xa49f=['limit','count','Content-Range','save','then','error','stack','name','send','map','DeskField','rawAttributes','fieldName','key','model','query','keys','filters','intersection','attributes','fields','length','hasOwnProperty','order','sort','where','pick','filter','merge','VIRTUAL','includeAll','include','findAll','rows','show','params','find','create','body','catch','destroy','rimraf','zip-dir','fast-json-patch','moment','bluebird','mustache','util','sox','to-csv','ejs','fs-extra','squel','crypto','desk.js','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/logger','api','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','end','status','json','offset','undefined'];(function(_0x38f3ce,_0xc9f790){var _0x40d0c0=function(_0x3bc58c){while(--_0x3bc58c){_0x38f3ce['push'](_0x38f3ce['shift']());}};_0x40d0c0(++_0xc9f790);}(_0xa49f,0xb7));var _0xfa49=function(_0xaa1b3e,_0x47d976){_0xaa1b3e=_0xaa1b3e-0x0;var _0x454d7d=_0xa49f[_0xaa1b3e];return _0x454d7d;};'use strict';var emlformat=require('eml-format');var rimraf=require(_0xfa49('0x0'));var zipdir=require(_0xfa49('0x1'));var jsonpatch=require(_0xfa49('0x2'));var rp=require('request-promise');var moment=require(_0xfa49('0x3'));var BPromise=require(_0xfa49('0x4'));var Mustache=require(_0xfa49('0x5'));var util=require(_0xfa49('0x6'));var path=require('path');var sox=require(_0xfa49('0x7'));var csv=require(_0xfa49('0x8'));var ejs=require(_0xfa49('0x9'));var fs=require('fs');var fs_extra=require(_0xfa49('0xa'));var _=require('lodash');var squel=require(_0xfa49('0xb'));var crypto=require(_0xfa49('0xc'));var jsforce=require('jsforce');var deskjs=require(_0xfa49('0xd'));var toCsv=require(_0xfa49('0x8'));var querystring=require('querystring');var Papa=require(_0xfa49('0xe'));var Redis=require(_0xfa49('0xf'));var authService=require(_0xfa49('0x10'));var qs=require(_0xfa49('0x11'));var as=require(_0xfa49('0x12'));var hardwareService=require('../../config/license/hardware');var logger=require(_0xfa49('0x13'))(_0xfa49('0x14'));var utils=require('../../config/utils');var config=require(_0xfa49('0x15'));var licenseUtil=require(_0xfa49('0x16'));var db=require(_0xfa49('0x17'))['db'];function respondWithStatusCode(_0x320d7e,_0x4d780b){_0x4d780b=_0x4d780b||0xcc;return function(_0x25094e){if(_0x25094e){return _0x320d7e[_0xfa49('0x18')](_0x4d780b);}return _0x320d7e['status'](_0x4d780b)[_0xfa49('0x19')]();};}function respondWithResult(_0x2b964f,_0x412cb4){_0x412cb4=_0x412cb4||0xc8;return function(_0x43255b){if(_0x43255b){return _0x2b964f[_0xfa49('0x1a')](_0x412cb4)[_0xfa49('0x1b')](_0x43255b);}};}function respondWithFilteredResult(_0x2b23b4,_0x3d0d17){return function(_0x4badbc){if(_0x4badbc){var _0x56298a=typeof _0x3d0d17[_0xfa49('0x1c')]===_0xfa49('0x1d')&&typeof _0x3d0d17[_0xfa49('0x1e')]===_0xfa49('0x1d');var _0x40eed4=_0x4badbc[_0xfa49('0x1f')];var _0x1f4345=_0x56298a?0x0:_0x3d0d17['offset'];var _0x3124ff=_0x56298a?_0x4badbc[_0xfa49('0x1f')]:_0x3d0d17[_0xfa49('0x1c')]+_0x3d0d17[_0xfa49('0x1e')];var _0x13e421;if(_0x3124ff>=_0x40eed4){_0x3124ff=_0x40eed4;_0x13e421=0xc8;}else{_0x13e421=0xce;}_0x2b23b4[_0xfa49('0x1a')](_0x13e421);return _0x2b23b4['set'](_0xfa49('0x20'),_0x1f4345+'-'+_0x3124ff+'/'+_0x40eed4)[_0xfa49('0x1b')](_0x4badbc);}return null;};}function patchUpdates(_0x594d56){return function(_0x1a9f3f){try{jsonpatch['apply'](_0x1a9f3f,_0x594d56,!![]);}catch(_0x18e81f){return BPromise['reject'](_0x18e81f);}return _0x1a9f3f[_0xfa49('0x21')]();};}function saveUpdates(_0x4d57bb,_0x2ab3cb){return function(_0x10b5a4){if(_0x10b5a4){return _0x10b5a4['update'](_0x4d57bb)[_0xfa49('0x22')](function(_0xb49fe6){return _0xb49fe6;});}return null;};}function removeEntity(_0x3ba9df,_0x340b00){return function(_0x5a3ff5){if(_0x5a3ff5){return _0x5a3ff5['destroy']()['then'](function(){_0x3ba9df[_0xfa49('0x1a')](0xcc)[_0xfa49('0x19')]();});}};}function handleEntityNotFound(_0x99d9f0,_0x113adc){return function(_0x32ff42){if(!_0x32ff42){_0x99d9f0['sendStatus'](0x194);}return _0x32ff42;};}function handleError(_0x47fc1a,_0x1d72b3){_0x1d72b3=_0x1d72b3||0x1f4;return function(_0x33bac7){logger[_0xfa49('0x23')](_0x33bac7[_0xfa49('0x24')]);if(_0x33bac7[_0xfa49('0x25')]){delete _0x33bac7[_0xfa49('0x25')];}_0x47fc1a[_0xfa49('0x1a')](_0x1d72b3)[_0xfa49('0x26')](_0x33bac7);};}exports['index']=function(_0x549b29,_0x56e065){var _0x33a9c3={},_0x2018a6={},_0x608175={'count':0x0,'rows':[]};var _0x449320=_[_0xfa49('0x27')](db[_0xfa49('0x28')][_0xfa49('0x29')],function(_0x30ba77){return{'name':_0x30ba77[_0xfa49('0x2a')],'type':_0x30ba77['type'][_0xfa49('0x2b')]};});_0x2018a6[_0xfa49('0x2c')]=_[_0xfa49('0x27')](_0x449320,_0xfa49('0x25'));_0x2018a6[_0xfa49('0x2d')]=_[_0xfa49('0x2e')](_0x549b29[_0xfa49('0x2d')]);_0x2018a6[_0xfa49('0x2f')]=_[_0xfa49('0x30')](_0x2018a6[_0xfa49('0x2c')],_0x2018a6['query']);_0x33a9c3[_0xfa49('0x31')]=_['intersection'](_0x2018a6[_0xfa49('0x2c')],qs[_0xfa49('0x32')](_0x549b29[_0xfa49('0x2d')][_0xfa49('0x32')]));_0x33a9c3[_0xfa49('0x31')]=_0x33a9c3[_0xfa49('0x31')][_0xfa49('0x33')]?_0x33a9c3[_0xfa49('0x31')]:_0x2018a6[_0xfa49('0x2c')];if(!_0x549b29['query'][_0xfa49('0x34')]('nolimit')){_0x33a9c3['limit']=qs[_0xfa49('0x1e')](_0x549b29[_0xfa49('0x2d')][_0xfa49('0x1e')]);_0x33a9c3['offset']=qs[_0xfa49('0x1c')](_0x549b29['query'][_0xfa49('0x1c')]);}_0x33a9c3[_0xfa49('0x35')]=qs[_0xfa49('0x36')](_0x549b29[_0xfa49('0x2d')][_0xfa49('0x36')]);_0x33a9c3[_0xfa49('0x37')]=qs[_0xfa49('0x2f')](_[_0xfa49('0x38')](_0x549b29[_0xfa49('0x2d')],_0x2018a6[_0xfa49('0x2f')]),_0x449320);if(_0x549b29[_0xfa49('0x2d')][_0xfa49('0x39')]){_0x33a9c3[_0xfa49('0x37')]=_[_0xfa49('0x3a')](_0x33a9c3[_0xfa49('0x37')],{'$or':_[_0xfa49('0x27')](_0x449320,function(_0x5399fc){if(_0x5399fc['type']!==_0xfa49('0x3b')){var _0x215f4c={};_0x215f4c[_0x5399fc[_0xfa49('0x25')]]={'$like':'%'+_0x549b29[_0xfa49('0x2d')][_0xfa49('0x39')]+'%'};return _0x215f4c;}})});}_0x33a9c3=_[_0xfa49('0x3a')]({},_0x33a9c3,_0x549b29['options']);var _0x408f42={'where':_0x33a9c3['where']};return db['DeskField']['count'](_0x408f42)['then'](function(_0x2db2f8){_0x608175[_0xfa49('0x1f')]=_0x2db2f8;if(_0x549b29[_0xfa49('0x2d')][_0xfa49('0x3c')]){_0x33a9c3[_0xfa49('0x3d')]=[{'all':!![]}];}return db[_0xfa49('0x28')][_0xfa49('0x3e')](_0x33a9c3);})[_0xfa49('0x22')](function(_0xed57f3){_0x608175[_0xfa49('0x3f')]=_0xed57f3;return _0x608175;})[_0xfa49('0x22')](respondWithFilteredResult(_0x56e065,_0x33a9c3))['catch'](handleError(_0x56e065,null));};exports[_0xfa49('0x40')]=function(_0x4a83b5,_0x113f85){var _0x47e71d={'raw':!![],'where':{'id':_0x4a83b5[_0xfa49('0x41')]['id']}},_0x58a52e={};_0x58a52e['model']=_[_0xfa49('0x2e')](db[_0xfa49('0x28')]['rawAttributes']);_0x58a52e[_0xfa49('0x2d')]=_['keys'](_0x4a83b5[_0xfa49('0x2d')]);_0x58a52e[_0xfa49('0x2f')]=_[_0xfa49('0x30')](_0x58a52e[_0xfa49('0x2c')],_0x58a52e['query']);_0x47e71d[_0xfa49('0x31')]=_[_0xfa49('0x30')](_0x58a52e[_0xfa49('0x2c')],qs[_0xfa49('0x32')](_0x4a83b5['query']['fields']));_0x47e71d[_0xfa49('0x31')]=_0x47e71d['attributes'][_0xfa49('0x33')]?_0x47e71d[_0xfa49('0x31')]:_0x58a52e[_0xfa49('0x2c')];if(_0x4a83b5[_0xfa49('0x2d')][_0xfa49('0x3c')]){_0x47e71d[_0xfa49('0x3d')]=[{'all':!![]}];}_0x47e71d=_[_0xfa49('0x3a')]({},_0x47e71d,_0x4a83b5['options']);return db[_0xfa49('0x28')][_0xfa49('0x42')](_0x47e71d)[_0xfa49('0x22')](handleEntityNotFound(_0x113f85,null))[_0xfa49('0x22')](respondWithResult(_0x113f85,null))['catch'](handleError(_0x113f85,null));};exports[_0xfa49('0x43')]=function(_0x1229df,_0x1f4e25){return db[_0xfa49('0x28')][_0xfa49('0x43')](_0x1229df[_0xfa49('0x44')],{})[_0xfa49('0x22')](respondWithResult(_0x1f4e25,0xc9))[_0xfa49('0x45')](handleError(_0x1f4e25,null));};exports['update']=function(_0xb89474,_0x3e43c0){if(_0xb89474[_0xfa49('0x44')]['id']){delete _0xb89474[_0xfa49('0x44')]['id'];}return db[_0xfa49('0x28')][_0xfa49('0x42')]({'where':{'id':_0xb89474['params']['id']}})[_0xfa49('0x22')](handleEntityNotFound(_0x3e43c0,null))['then'](saveUpdates(_0xb89474[_0xfa49('0x44')],null))[_0xfa49('0x22')](respondWithResult(_0x3e43c0,null))[_0xfa49('0x45')](handleError(_0x3e43c0,null));};exports[_0xfa49('0x46')]=function(_0x3d8835,_0x312bb6){return db[_0xfa49('0x28')][_0xfa49('0x42')]({'where':{'id':_0x3d8835[_0xfa49('0x41')]['id']}})[_0xfa49('0x22')](handleEntityNotFound(_0x312bb6,null))[_0xfa49('0x22')](removeEntity(_0x312bb6,null))[_0xfa49('0x45')](handleError(_0x312bb6,null));};
\ No newline at end of file
+var _0x63f1=['nolimit','order','sort','where','pick','filter','merge','includeAll','include','findAll','rows','catch','params','options','find','create','body','update','eml-format','rimraf','fast-json-patch','moment','bluebird','util','path','sox','to-csv','ejs','fs-extra','lodash','squel','jsforce','desk.js','querystring','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','api','../../config/utils','../../config/license/util','../../mysqldb','sendStatus','status','end','json','offset','undefined','limit','count','set','Content-Range','apply','reject','save','then','destroy','error','stack','name','send','index','map','DeskField','rawAttributes','type','key','model','query','keys','filters','intersection','attributes','fields','length'];(function(_0x64b210,_0x301877){var _0x232a2b=function(_0x1056fd){while(--_0x1056fd){_0x64b210['push'](_0x64b210['shift']());}};_0x232a2b(++_0x301877);}(_0x63f1,0x1da));var _0x163f=function(_0x599f41,_0x4db732){_0x599f41=_0x599f41-0x0;var _0x2e4d58=_0x63f1[_0x599f41];return _0x2e4d58;};'use strict';var emlformat=require(_0x163f('0x0'));var rimraf=require(_0x163f('0x1'));var zipdir=require('zip-dir');var jsonpatch=require(_0x163f('0x2'));var rp=require('request-promise');var moment=require(_0x163f('0x3'));var BPromise=require(_0x163f('0x4'));var Mustache=require('mustache');var util=require(_0x163f('0x5'));var path=require(_0x163f('0x6'));var sox=require(_0x163f('0x7'));var csv=require(_0x163f('0x8'));var ejs=require(_0x163f('0x9'));var fs=require('fs');var fs_extra=require(_0x163f('0xa'));var _=require(_0x163f('0xb'));var squel=require(_0x163f('0xc'));var crypto=require('crypto');var jsforce=require(_0x163f('0xd'));var deskjs=require(_0x163f('0xe'));var toCsv=require(_0x163f('0x8'));var querystring=require(_0x163f('0xf'));var Papa=require('papaparse');var Redis=require(_0x163f('0x10'));var authService=require(_0x163f('0x11'));var qs=require(_0x163f('0x12'));var as=require(_0x163f('0x13'));var hardwareService=require(_0x163f('0x14'));var logger=require('../../config/logger')(_0x163f('0x15'));var utils=require(_0x163f('0x16'));var config=require('../../config/environment');var licenseUtil=require(_0x163f('0x17'));var db=require(_0x163f('0x18'))['db'];function respondWithStatusCode(_0x331cde,_0xe8fc1c){_0xe8fc1c=_0xe8fc1c||0xcc;return function(_0x4bd756){if(_0x4bd756){return _0x331cde[_0x163f('0x19')](_0xe8fc1c);}return _0x331cde[_0x163f('0x1a')](_0xe8fc1c)[_0x163f('0x1b')]();};}function respondWithResult(_0x26635d,_0x151fa8){_0x151fa8=_0x151fa8||0xc8;return function(_0x42a2e0){if(_0x42a2e0){return _0x26635d[_0x163f('0x1a')](_0x151fa8)[_0x163f('0x1c')](_0x42a2e0);}};}function respondWithFilteredResult(_0x1603af,_0x57da99){return function(_0x2a9811){if(_0x2a9811){var _0x261d7b=typeof _0x57da99[_0x163f('0x1d')]===_0x163f('0x1e')&&typeof _0x57da99[_0x163f('0x1f')]==='undefined';var _0x37dacc=_0x2a9811[_0x163f('0x20')];var _0x558191=_0x261d7b?0x0:_0x57da99[_0x163f('0x1d')];var _0x44e0e3=_0x261d7b?_0x2a9811[_0x163f('0x20')]:_0x57da99[_0x163f('0x1d')]+_0x57da99[_0x163f('0x1f')];var _0x352b6b;if(_0x44e0e3>=_0x37dacc){_0x44e0e3=_0x37dacc;_0x352b6b=0xc8;}else{_0x352b6b=0xce;}_0x1603af['status'](_0x352b6b);return _0x1603af[_0x163f('0x21')](_0x163f('0x22'),_0x558191+'-'+_0x44e0e3+'/'+_0x37dacc)['json'](_0x2a9811);}return null;};}function patchUpdates(_0x1d8a9d){return function(_0x4b54a2){try{jsonpatch[_0x163f('0x23')](_0x4b54a2,_0x1d8a9d,!![]);}catch(_0x16fece){return BPromise[_0x163f('0x24')](_0x16fece);}return _0x4b54a2[_0x163f('0x25')]();};}function saveUpdates(_0x18f1a2,_0x169d66){return function(_0x30da66){if(_0x30da66){return _0x30da66['update'](_0x18f1a2)[_0x163f('0x26')](function(_0x55a1ff){return _0x55a1ff;});}return null;};}function removeEntity(_0x49b838,_0x371c22){return function(_0x4becf8){if(_0x4becf8){return _0x4becf8[_0x163f('0x27')]()[_0x163f('0x26')](function(){_0x49b838[_0x163f('0x1a')](0xcc)[_0x163f('0x1b')]();});}};}function handleEntityNotFound(_0x380124,_0x3b479d){return function(_0x9f17a0){if(!_0x9f17a0){_0x380124[_0x163f('0x19')](0x194);}return _0x9f17a0;};}function handleError(_0x4512a2,_0x498b5c){_0x498b5c=_0x498b5c||0x1f4;return function(_0xf03f21){logger[_0x163f('0x28')](_0xf03f21[_0x163f('0x29')]);if(_0xf03f21['name']){delete _0xf03f21[_0x163f('0x2a')];}_0x4512a2[_0x163f('0x1a')](_0x498b5c)[_0x163f('0x2b')](_0xf03f21);};}exports[_0x163f('0x2c')]=function(_0x1f723d,_0x24268d){var _0x16b3e2={},_0x45e7f9={},_0x58b932={'count':0x0,'rows':[]};var _0x5b11d5=_[_0x163f('0x2d')](db[_0x163f('0x2e')][_0x163f('0x2f')],function(_0xe89ef7){return{'name':_0xe89ef7['fieldName'],'type':_0xe89ef7[_0x163f('0x30')][_0x163f('0x31')]};});_0x45e7f9[_0x163f('0x32')]=_[_0x163f('0x2d')](_0x5b11d5,_0x163f('0x2a'));_0x45e7f9[_0x163f('0x33')]=_[_0x163f('0x34')](_0x1f723d['query']);_0x45e7f9[_0x163f('0x35')]=_[_0x163f('0x36')](_0x45e7f9['model'],_0x45e7f9['query']);_0x16b3e2[_0x163f('0x37')]=_[_0x163f('0x36')](_0x45e7f9[_0x163f('0x32')],qs[_0x163f('0x38')](_0x1f723d['query'][_0x163f('0x38')]));_0x16b3e2[_0x163f('0x37')]=_0x16b3e2[_0x163f('0x37')][_0x163f('0x39')]?_0x16b3e2[_0x163f('0x37')]:_0x45e7f9['model'];if(!_0x1f723d[_0x163f('0x33')]['hasOwnProperty'](_0x163f('0x3a'))){_0x16b3e2[_0x163f('0x1f')]=qs['limit'](_0x1f723d[_0x163f('0x33')][_0x163f('0x1f')]);_0x16b3e2['offset']=qs[_0x163f('0x1d')](_0x1f723d['query']['offset']);}_0x16b3e2[_0x163f('0x3b')]=qs[_0x163f('0x3c')](_0x1f723d[_0x163f('0x33')][_0x163f('0x3c')]);_0x16b3e2[_0x163f('0x3d')]=qs[_0x163f('0x35')](_[_0x163f('0x3e')](_0x1f723d[_0x163f('0x33')],_0x45e7f9[_0x163f('0x35')]),_0x5b11d5);if(_0x1f723d[_0x163f('0x33')][_0x163f('0x3f')]){_0x16b3e2['where']=_[_0x163f('0x40')](_0x16b3e2['where'],{'$or':_[_0x163f('0x2d')](_0x5b11d5,function(_0x39c923){if(_0x39c923['type']!=='VIRTUAL'){var _0x46db8a={};_0x46db8a[_0x39c923['name']]={'$like':'%'+_0x1f723d['query'][_0x163f('0x3f')]+'%'};return _0x46db8a;}})});}_0x16b3e2=_[_0x163f('0x40')]({},_0x16b3e2,_0x1f723d['options']);var _0x234416={'where':_0x16b3e2[_0x163f('0x3d')]};return db['DeskField']['count'](_0x234416)[_0x163f('0x26')](function(_0x34bbd8){_0x58b932['count']=_0x34bbd8;if(_0x1f723d['query'][_0x163f('0x41')]){_0x16b3e2[_0x163f('0x42')]=[{'all':!![]}];}return db[_0x163f('0x2e')][_0x163f('0x43')](_0x16b3e2);})[_0x163f('0x26')](function(_0x1a44bd){_0x58b932[_0x163f('0x44')]=_0x1a44bd;return _0x58b932;})[_0x163f('0x26')](respondWithFilteredResult(_0x24268d,_0x16b3e2))[_0x163f('0x45')](handleError(_0x24268d,null));};exports['show']=function(_0x5b6125,_0x2777d6){var _0xe8c203={'raw':!![],'where':{'id':_0x5b6125[_0x163f('0x46')]['id']}},_0x51337e={};_0x51337e[_0x163f('0x32')]=_[_0x163f('0x34')](db[_0x163f('0x2e')]['rawAttributes']);_0x51337e[_0x163f('0x33')]=_[_0x163f('0x34')](_0x5b6125[_0x163f('0x33')]);_0x51337e[_0x163f('0x35')]=_[_0x163f('0x36')](_0x51337e['model'],_0x51337e[_0x163f('0x33')]);_0xe8c203[_0x163f('0x37')]=_['intersection'](_0x51337e[_0x163f('0x32')],qs[_0x163f('0x38')](_0x5b6125[_0x163f('0x33')][_0x163f('0x38')]));_0xe8c203[_0x163f('0x37')]=_0xe8c203[_0x163f('0x37')][_0x163f('0x39')]?_0xe8c203['attributes']:_0x51337e[_0x163f('0x32')];if(_0x5b6125[_0x163f('0x33')][_0x163f('0x41')]){_0xe8c203['include']=[{'all':!![]}];}_0xe8c203=_['merge']({},_0xe8c203,_0x5b6125[_0x163f('0x47')]);return db[_0x163f('0x2e')][_0x163f('0x48')](_0xe8c203)[_0x163f('0x26')](handleEntityNotFound(_0x2777d6,null))[_0x163f('0x26')](respondWithResult(_0x2777d6,null))[_0x163f('0x45')](handleError(_0x2777d6,null));};exports[_0x163f('0x49')]=function(_0x727841,_0x56b9ee){return db[_0x163f('0x2e')][_0x163f('0x49')](_0x727841[_0x163f('0x4a')],{})[_0x163f('0x26')](respondWithResult(_0x56b9ee,0xc9))['catch'](handleError(_0x56b9ee,null));};exports[_0x163f('0x4b')]=function(_0x291aad,_0x5db7fe){if(_0x291aad[_0x163f('0x4a')]['id']){delete _0x291aad['body']['id'];}return db[_0x163f('0x2e')]['find']({'where':{'id':_0x291aad['params']['id']}})['then'](handleEntityNotFound(_0x5db7fe,null))[_0x163f('0x26')](saveUpdates(_0x291aad[_0x163f('0x4a')],null))['then'](respondWithResult(_0x5db7fe,null))[_0x163f('0x45')](handleError(_0x5db7fe,null));};exports[_0x163f('0x27')]=function(_0x3b0db7,_0x251c78){return db['DeskField'][_0x163f('0x48')]({'where':{'id':_0x3b0db7[_0x163f('0x46')]['id']}})['then'](handleEntityNotFound(_0x251c78,null))[_0x163f('0x26')](removeEntity(_0x251c78,null))[_0x163f('0x45')](handleError(_0x251c78,null));};
\ No newline at end of file