Built motion from commit 953226e6.|2.6.32
[motion2.git] / server / api / voiceCallReport / voiceCallReport.controller.js
index 49af8e2..2ec369f 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xdb28=['options','includeAll','fullname','User','findAll','rows','catch','show','params','rawAttributes','intersection','include','find','create','destroy','describe','body','uniqueid','user','eml-format','rimraf','zip-dir','fast-json-patch','moment','bluebird','mustache','util','path','to-csv','ejs','squel','crypto','jsforce','desk.js','querystring','papaparse','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/logger','api','../../config/environment','../../config/license/util','../../mysqldb','status','end','json','offset','undefined','count','limit','set','apply','save','update','then','sendStatus','error','stack','name','send','index','VoiceCallReport','fieldName','type','key','map','query','keys','model','fields','attributes','length','nolimit','order','sort','filters','filter','where','VIRTUAL','merge'];(function(_0x28b762,_0x298f96){var _0x1c9a39=function(_0xdc8dc5){while(--_0xdc8dc5){_0x28b762['push'](_0x28b762['shift']());}};_0x1c9a39(++_0x298f96);}(_0xdb28,0x106));var _0x8db2=function(_0x2e5bf1,_0x3561ac){_0x2e5bf1=_0x2e5bf1-0x0;var _0xa27172=_0xdb28[_0x2e5bf1];return _0xa27172;};'use strict';var emlformat=require(_0x8db2('0x0'));var rimraf=require(_0x8db2('0x1'));var zipdir=require(_0x8db2('0x2'));var jsonpatch=require(_0x8db2('0x3'));var rp=require('request-promise');var moment=require(_0x8db2('0x4'));var BPromise=require(_0x8db2('0x5'));var Mustache=require(_0x8db2('0x6'));var util=require(_0x8db2('0x7'));var path=require(_0x8db2('0x8'));var sox=require('sox');var csv=require(_0x8db2('0x9'));var ejs=require(_0x8db2('0xa'));var fs=require('fs');var fs_extra=require('fs-extra');var _=require('lodash');var squel=require(_0x8db2('0xb'));var crypto=require(_0x8db2('0xc'));var jsforce=require(_0x8db2('0xd'));var deskjs=require(_0x8db2('0xe'));var toCsv=require(_0x8db2('0x9'));var querystring=require(_0x8db2('0xf'));var Papa=require(_0x8db2('0x10'));var Redis=require('ioredis');var authService=require(_0x8db2('0x11'));var qs=require(_0x8db2('0x12'));var as=require(_0x8db2('0x13'));var hardwareService=require('../../config/license/hardware');var logger=require(_0x8db2('0x14'))(_0x8db2('0x15'));var utils=require('../../config/utils');var config=require(_0x8db2('0x16'));var licenseUtil=require(_0x8db2('0x17'));var db=require(_0x8db2('0x18'))['db'];function respondWithStatusCode(_0x204f49,_0x37d017){_0x37d017=_0x37d017||0xcc;return function(_0x559fb1){if(_0x559fb1){return _0x204f49['sendStatus'](_0x37d017);}return _0x204f49[_0x8db2('0x19')](_0x37d017)[_0x8db2('0x1a')]();};}function respondWithResult(_0x350d61,_0x1d6a15){_0x1d6a15=_0x1d6a15||0xc8;return function(_0x227355){if(_0x227355){return _0x350d61[_0x8db2('0x19')](_0x1d6a15)[_0x8db2('0x1b')](_0x227355);}};}function respondWithFilteredResult(_0x3c96a7,_0x131252){return function(_0x16c8c2){if(_0x16c8c2){var _0x5489a9=typeof _0x131252[_0x8db2('0x1c')]===_0x8db2('0x1d')&&typeof _0x131252['limit']===_0x8db2('0x1d');var _0x44957d=_0x16c8c2[_0x8db2('0x1e')];var _0x3fddc2=_0x5489a9?0x0:_0x131252[_0x8db2('0x1c')];var _0x46ce14=_0x5489a9?_0x16c8c2['count']:_0x131252['offset']+_0x131252[_0x8db2('0x1f')];var _0x104e33;if(_0x46ce14>=_0x44957d){_0x46ce14=_0x44957d;_0x104e33=0xc8;}else{_0x104e33=0xce;}_0x3c96a7[_0x8db2('0x19')](_0x104e33);return _0x3c96a7[_0x8db2('0x20')]('Content-Range',_0x3fddc2+'-'+_0x46ce14+'/'+_0x44957d)[_0x8db2('0x1b')](_0x16c8c2);}return null;};}function patchUpdates(_0x36a9ff){return function(_0x260940){try{jsonpatch[_0x8db2('0x21')](_0x260940,_0x36a9ff,!![]);}catch(_0x3dbe8e){return BPromise['reject'](_0x3dbe8e);}return _0x260940[_0x8db2('0x22')]();};}function saveUpdates(_0x3e30e6,_0x18f69c){return function(_0x125be2){if(_0x125be2){return _0x125be2[_0x8db2('0x23')](_0x3e30e6)[_0x8db2('0x24')](function(_0x796ec1){return _0x796ec1;});}return null;};}function removeEntity(_0x5c6614,_0x256202){return function(_0x4f6516){if(_0x4f6516){return _0x4f6516['destroy']()['then'](function(){_0x5c6614['status'](0xcc)[_0x8db2('0x1a')]();});}};}function handleEntityNotFound(_0x29b5cd,_0x3be281){return function(_0x2baed0){if(!_0x2baed0){_0x29b5cd[_0x8db2('0x25')](0x194);}return _0x2baed0;};}function handleError(_0x8d4f54,_0x58cd9d){_0x58cd9d=_0x58cd9d||0x1f4;return function(_0x3544ba){logger[_0x8db2('0x26')](_0x3544ba[_0x8db2('0x27')]);if(_0x3544ba[_0x8db2('0x28')]){delete _0x3544ba['name'];}_0x8d4f54[_0x8db2('0x19')](_0x58cd9d)[_0x8db2('0x29')](_0x3544ba);};}exports[_0x8db2('0x2a')]=function(_0x1687ed,_0xbe5ece){var _0x21bae5={},_0xa54ea3={},_0x3124d5={'count':0x0,'rows':[]};var _0xbc5366=_['map'](db[_0x8db2('0x2b')]['rawAttributes'],function(_0x59cb77){return{'name':_0x59cb77[_0x8db2('0x2c')],'type':_0x59cb77[_0x8db2('0x2d')][_0x8db2('0x2e')]};});_0xa54ea3['model']=_[_0x8db2('0x2f')](_0xbc5366,'name');_0xa54ea3[_0x8db2('0x30')]=_[_0x8db2('0x31')](_0x1687ed[_0x8db2('0x30')]);_0xa54ea3['filters']=_['intersection'](_0xa54ea3[_0x8db2('0x32')],_0xa54ea3[_0x8db2('0x30')]);_0x21bae5['attributes']=_['intersection'](_0xa54ea3[_0x8db2('0x32')],qs[_0x8db2('0x33')](_0x1687ed[_0x8db2('0x30')][_0x8db2('0x33')]));_0x21bae5[_0x8db2('0x34')]=_0x21bae5[_0x8db2('0x34')][_0x8db2('0x35')]?_0x21bae5[_0x8db2('0x34')]:_0xa54ea3[_0x8db2('0x32')];if(!_0x1687ed[_0x8db2('0x30')]['hasOwnProperty'](_0x8db2('0x36'))){_0x21bae5[_0x8db2('0x1f')]=qs['limit'](_0x1687ed[_0x8db2('0x30')][_0x8db2('0x1f')]);_0x21bae5['offset']=qs['offset'](_0x1687ed[_0x8db2('0x30')]['offset']);}_0x21bae5[_0x8db2('0x37')]=qs[_0x8db2('0x38')](_0x1687ed[_0x8db2('0x30')][_0x8db2('0x38')]);_0x21bae5['where']=qs[_0x8db2('0x39')](_['pick'](_0x1687ed[_0x8db2('0x30')],_0xa54ea3[_0x8db2('0x39')]),_0xbc5366);if(_0x1687ed[_0x8db2('0x30')][_0x8db2('0x3a')]){_0x21bae5['where']=_['merge'](_0x21bae5[_0x8db2('0x3b')],{'$or':_[_0x8db2('0x2f')](_0xbc5366,function(_0x5dc2b4){if(_0x5dc2b4[_0x8db2('0x2d')]!==_0x8db2('0x3c')){var _0x656dd2={};_0x656dd2[_0x5dc2b4['name']]={'$like':'%'+_0x1687ed[_0x8db2('0x30')][_0x8db2('0x3a')]+'%'};return _0x656dd2;}})});}_0x21bae5=_[_0x8db2('0x3d')]({},_0x21bae5,_0x1687ed[_0x8db2('0x3e')]);var _0x2e6f0c={'where':_0x21bae5[_0x8db2('0x3b')]};return db[_0x8db2('0x2b')][_0x8db2('0x1e')](_0x2e6f0c)[_0x8db2('0x24')](function(_0x63c561){_0x3124d5[_0x8db2('0x1e')]=_0x63c561;if(_0x1687ed[_0x8db2('0x30')][_0x8db2('0x3f')]){_0x21bae5['include']=[{'attributes':['id',_0x8db2('0x28'),_0x8db2('0x40'),'alias'],'model':db['User'],'as':_0x8db2('0x41')}];}return db['VoiceCallReport'][_0x8db2('0x42')](_0x21bae5);})[_0x8db2('0x24')](function(_0x313130){_0x3124d5[_0x8db2('0x43')]=_0x313130;return _0x3124d5;})[_0x8db2('0x24')](respondWithFilteredResult(_0xbe5ece,_0x21bae5))[_0x8db2('0x44')](handleError(_0xbe5ece,null));};exports[_0x8db2('0x45')]=function(_0x5c97ef,_0x2f86b1){var _0x3d44de={'raw':!![],'where':{'id':_0x5c97ef[_0x8db2('0x46')]['id']}},_0x40c69e={};_0x40c69e['model']=_[_0x8db2('0x31')](db[_0x8db2('0x2b')][_0x8db2('0x47')]);_0x40c69e[_0x8db2('0x30')]=_['keys'](_0x5c97ef[_0x8db2('0x30')]);_0x40c69e['filters']=_[_0x8db2('0x48')](_0x40c69e[_0x8db2('0x32')],_0x40c69e[_0x8db2('0x30')]);_0x3d44de['attributes']=_['intersection'](_0x40c69e[_0x8db2('0x32')],qs['fields'](_0x5c97ef[_0x8db2('0x30')][_0x8db2('0x33')]));_0x3d44de[_0x8db2('0x34')]=_0x3d44de[_0x8db2('0x34')][_0x8db2('0x35')]?_0x3d44de[_0x8db2('0x34')]:_0x40c69e[_0x8db2('0x32')];if(_0x5c97ef[_0x8db2('0x30')][_0x8db2('0x3f')]){_0x3d44de[_0x8db2('0x49')]=[{'all':!![]}];}_0x3d44de=_[_0x8db2('0x3d')]({},_0x3d44de,_0x5c97ef[_0x8db2('0x3e')]);return db['VoiceCallReport'][_0x8db2('0x4a')](_0x3d44de)[_0x8db2('0x24')](handleEntityNotFound(_0x2f86b1,null))[_0x8db2('0x24')](respondWithResult(_0x2f86b1,null))[_0x8db2('0x44')](handleError(_0x2f86b1,null));};exports['create']=function(_0x4ffd9d,_0x11c224){return db[_0x8db2('0x2b')][_0x8db2('0x4b')](_0x4ffd9d['body'],{})['then'](respondWithResult(_0x11c224,0xc9))['catch'](handleError(_0x11c224,null));};exports[_0x8db2('0x4c')]=function(_0x368c37,_0x55c7dd){return db[_0x8db2('0x2b')][_0x8db2('0x4a')]({'where':{'id':_0x368c37[_0x8db2('0x46')]['id']}})[_0x8db2('0x24')](handleEntityNotFound(_0x55c7dd,null))['then'](removeEntity(_0x55c7dd,null))['catch'](handleError(_0x55c7dd,null));};exports[_0x8db2('0x4d')]=function(_0x18c6ef,_0x2908e4){return db[_0x8db2('0x2b')][_0x8db2('0x4d')]()[_0x8db2('0x24')](respondWithResult(_0x2908e4,null))[_0x8db2('0x44')](handleError(_0x2908e4,null));};exports[_0x8db2('0x23')]=function(_0x4187d6,_0x426ae0){if(_0x4187d6[_0x8db2('0x4e')][_0x8db2('0x4f')]){delete _0x4187d6[_0x8db2('0x4e')][_0x8db2('0x4f')];}return db[_0x8db2('0x2b')]['find']({'where':{'uniqueid':_0x4187d6[_0x8db2('0x46')]['id'],'UserId':{'$or':[null,_0x4187d6[_0x8db2('0x50')]['id']]}}})['then'](handleEntityNotFound(_0x426ae0,null))[_0x8db2('0x24')](saveUpdates(_0x4187d6[_0x8db2('0x4e')],null))[_0x8db2('0x24')](respondWithResult(_0x426ae0,null))['catch'](handleError(_0x426ae0,null));};
\ No newline at end of file
+var _0x73a1=['fields','length','hasOwnProperty','nolimit','sort','where','filters','pick','filter','merge','options','includeAll','include','name','fullname','alias','User','findAll','catch','show','params','find','create','describe','update','body','uniqueid','updateWithRetry','No\x20such\x20report','../../config/logger','api','promise-retry','status','offset','undefined','limit','count','set','json','then','destroy','end','sendStatus','error','map','VoiceCallReport','rawAttributes','fieldName','type','model','query','keys','intersection','attributes'];(function(_0x33bf2f,_0x25ba1f){var _0x1ff548=function(_0x3a40e6){while(--_0x3a40e6){_0x33bf2f['push'](_0x33bf2f['shift']());}};_0x1ff548(++_0x25ba1f);}(_0x73a1,0x161));var _0x173a=function(_0x337748,_0x402b05){_0x337748=_0x337748-0x0;var _0x3bb03f=_0x73a1[_0x337748];return _0x3bb03f;};'use strict';var _=require('lodash');var qs=require('../../components/parsers/qs');var logger=require(_0x173a('0x0'))(_0x173a('0x1'));var db=require('../../mysqldb')['db'];const promiseRetry=require(_0x173a('0x2'));function respondWithResult(_0x279349,_0xeec920){_0xeec920=_0xeec920||0xc8;return function(_0xf2a2c8){if(_0xf2a2c8){return _0x279349[_0x173a('0x3')](_0xeec920)['json'](_0xf2a2c8);}};}function respondWithFilteredResult(_0x417ec0,_0x1a8b94){return function(_0xac84a){if(_0xac84a){var _0xbd8757=typeof _0x1a8b94[_0x173a('0x4')]===_0x173a('0x5')&&typeof _0x1a8b94[_0x173a('0x6')]===_0x173a('0x5');var _0x3f06d5=_0xac84a[_0x173a('0x7')];var _0x30ffef=_0xbd8757?0x0:_0x1a8b94[_0x173a('0x4')];var _0x4d6b80=_0xbd8757?_0xac84a[_0x173a('0x7')]:_0x1a8b94['offset']+_0x1a8b94[_0x173a('0x6')];var _0x101aeb;if(_0x4d6b80>=_0x3f06d5){_0x4d6b80=_0x3f06d5;_0x101aeb=0xc8;}else{_0x101aeb=0xce;}_0x417ec0[_0x173a('0x3')](_0x101aeb);return _0x417ec0[_0x173a('0x8')]('Content-Range',_0x30ffef+'-'+_0x4d6b80+'/'+_0x3f06d5)[_0x173a('0x9')](_0xac84a);}return null;};}function saveUpdates(_0x53bfd0){return function(_0x28b560){if(_0x28b560){return _0x28b560['update'](_0x53bfd0)[_0x173a('0xa')](function(_0x21534e){return _0x21534e;});}return null;};}function removeEntity(_0x578f77){return function(_0x1cbfdc){if(_0x1cbfdc){return _0x1cbfdc[_0x173a('0xb')]()[_0x173a('0xa')](function(){_0x578f77[_0x173a('0x3')](0xcc)[_0x173a('0xc')]();});}};}function handleEntityNotFound(_0x410dfc){return function(_0x69fe68){if(!_0x69fe68){_0x410dfc[_0x173a('0xd')](0x194);}return _0x69fe68;};}function handleError(_0x5e4252,_0xb8e6b){_0xb8e6b=_0xb8e6b||0x1f4;return function(_0x3bcc3a){logger[_0x173a('0xe')](_0x3bcc3a['stack']);if(_0x3bcc3a['name']){delete _0x3bcc3a['name'];}_0x5e4252[_0x173a('0x3')](_0xb8e6b)['send'](_0x3bcc3a);};}exports['index']=function(_0xd84224,_0x2d3b17){var _0x54985d={},_0x2d1a42={},_0x3d6897={'count':0x0,'rows':[]};var _0x44eec5=_[_0x173a('0xf')](db[_0x173a('0x10')][_0x173a('0x11')],function(_0x47b362){return{'name':_0x47b362[_0x173a('0x12')],'type':_0x47b362[_0x173a('0x13')]['key']};});_0x2d1a42[_0x173a('0x14')]=_['map'](_0x44eec5,'name');_0x2d1a42[_0x173a('0x15')]=_[_0x173a('0x16')](_0xd84224[_0x173a('0x15')]);_0x2d1a42['filters']=_[_0x173a('0x17')](_0x2d1a42[_0x173a('0x14')],_0x2d1a42[_0x173a('0x15')]);_0x54985d[_0x173a('0x18')]=_[_0x173a('0x17')](_0x2d1a42[_0x173a('0x14')],qs['fields'](_0xd84224['query'][_0x173a('0x19')]));_0x54985d[_0x173a('0x18')]=_0x54985d[_0x173a('0x18')][_0x173a('0x1a')]?_0x54985d[_0x173a('0x18')]:_0x2d1a42[_0x173a('0x14')];if(!_0xd84224['query'][_0x173a('0x1b')](_0x173a('0x1c'))){_0x54985d[_0x173a('0x6')]=qs[_0x173a('0x6')](_0xd84224[_0x173a('0x15')][_0x173a('0x6')]);_0x54985d[_0x173a('0x4')]=qs[_0x173a('0x4')](_0xd84224[_0x173a('0x15')][_0x173a('0x4')]);}_0x54985d['order']=qs['sort'](_0xd84224['query'][_0x173a('0x1d')]);_0x54985d[_0x173a('0x1e')]=qs[_0x173a('0x1f')](_[_0x173a('0x20')](_0xd84224[_0x173a('0x15')],_0x2d1a42['filters']),_0x44eec5);if(_0xd84224[_0x173a('0x15')][_0x173a('0x21')]){_0x54985d['where']=_[_0x173a('0x22')](_0x54985d[_0x173a('0x1e')],{'$or':_[_0x173a('0xf')](_0x44eec5,function(_0x546e80){if(_0x546e80[_0x173a('0x13')]!=='VIRTUAL'){var _0xdab384={};_0xdab384[_0x546e80['name']]={'$like':'%'+_0xd84224['query'][_0x173a('0x21')]+'%'};return _0xdab384;}})});}_0x54985d=_[_0x173a('0x22')]({},_0x54985d,_0xd84224[_0x173a('0x23')]);var _0x41c181={'where':_0x54985d['where']};return db[_0x173a('0x10')][_0x173a('0x7')](_0x41c181)['then'](function(_0xe2a0a1){_0x3d6897['count']=_0xe2a0a1;if(_0xd84224[_0x173a('0x15')][_0x173a('0x24')]){_0x54985d[_0x173a('0x25')]=[{'attributes':['id',_0x173a('0x26'),_0x173a('0x27'),_0x173a('0x28')],'model':db[_0x173a('0x29')],'as':'User'}];}return db[_0x173a('0x10')][_0x173a('0x2a')](_0x54985d);})[_0x173a('0xa')](function(_0x5c1a69){_0x3d6897['rows']=_0x5c1a69;return _0x3d6897;})[_0x173a('0xa')](respondWithFilteredResult(_0x2d3b17,_0x54985d))[_0x173a('0x2b')](handleError(_0x2d3b17,null));};exports[_0x173a('0x2c')]=function(_0x4e4a02,_0x1a87c7){var _0x3d7c8c={'raw':!![],'where':{'id':_0x4e4a02[_0x173a('0x2d')]['id']}},_0x141d3f={};_0x141d3f['model']=_['keys'](db[_0x173a('0x10')][_0x173a('0x11')]);_0x141d3f[_0x173a('0x15')]=_[_0x173a('0x16')](_0x4e4a02[_0x173a('0x15')]);_0x141d3f[_0x173a('0x1f')]=_[_0x173a('0x17')](_0x141d3f[_0x173a('0x14')],_0x141d3f['query']);_0x3d7c8c[_0x173a('0x18')]=_[_0x173a('0x17')](_0x141d3f[_0x173a('0x14')],qs[_0x173a('0x19')](_0x4e4a02[_0x173a('0x15')][_0x173a('0x19')]));_0x3d7c8c[_0x173a('0x18')]=_0x3d7c8c[_0x173a('0x18')][_0x173a('0x1a')]?_0x3d7c8c[_0x173a('0x18')]:_0x141d3f[_0x173a('0x14')];if(_0x4e4a02[_0x173a('0x15')][_0x173a('0x24')]){_0x3d7c8c[_0x173a('0x25')]=[{'all':!![]}];}_0x3d7c8c=_['merge']({},_0x3d7c8c,_0x4e4a02[_0x173a('0x23')]);return db['VoiceCallReport'][_0x173a('0x2e')](_0x3d7c8c)[_0x173a('0xa')](handleEntityNotFound(_0x1a87c7,null))['then'](respondWithResult(_0x1a87c7,null))['catch'](handleError(_0x1a87c7,null));};exports[_0x173a('0x2f')]=function(_0x524420,_0x1c036f){return db[_0x173a('0x10')][_0x173a('0x2f')](_0x524420['body'],{})[_0x173a('0xa')](respondWithResult(_0x1c036f,0xc9))[_0x173a('0x2b')](handleError(_0x1c036f,null));};exports[_0x173a('0xb')]=function(_0x55649b,_0x21ffa5){return db[_0x173a('0x10')][_0x173a('0x2e')]({'where':{'id':_0x55649b['params']['id']}})[_0x173a('0xa')](handleEntityNotFound(_0x21ffa5,null))[_0x173a('0xa')](removeEntity(_0x21ffa5,null))['catch'](handleError(_0x21ffa5,null));};exports[_0x173a('0x30')]=function(_0x2d5a8c,_0x577778){return db[_0x173a('0x10')]['describe']()[_0x173a('0xa')](respondWithResult(_0x577778,null))['catch'](handleError(_0x577778,null));};function findForUpdate(_0x626942){return db[_0x173a('0x10')][_0x173a('0x2e')]({'where':{'uniqueid':_0x626942[_0x173a('0x2d')]['id'],'UserId':{'$or':[null,_0x626942['user']['id']]}}});}exports[_0x173a('0x31')]=function(_0xbda804,_0x1958b8){if(_0xbda804[_0x173a('0x32')][_0x173a('0x33')]){delete _0xbda804[_0x173a('0x32')][_0x173a('0x33')];}return findForUpdate(_0xbda804)['then'](handleEntityNotFound(_0x1958b8,null))[_0x173a('0xa')](saveUpdates(_0xbda804['body'],null))[_0x173a('0xa')](respondWithResult(_0x1958b8,null))[_0x173a('0x2b')](handleError(_0x1958b8,null));};exports[_0x173a('0x34')]=function(_0x43969f,_0x49dd52,_0x57de6a){if(_0x43969f[_0x173a('0x32')][_0x173a('0x33')]){delete _0x43969f[_0x173a('0x32')][_0x173a('0x33')];}promiseRetry(function(_0x299bd7){return findForUpdate(_0x43969f)[_0x173a('0xa')](function(_0x2e6d04){if(_0x2e6d04!==null){return _0x2e6d04;}else{_0x299bd7(new Error(_0x173a('0x35')));}});},{'retries':0x4,'minTimeout':0xfa})[_0x173a('0xa')](function(_0x3b19b1){if(!_0x3b19b1){return new Promise(function(_0x8ed463){_0x8ed463(handleEntityNotFound(_0x49dd52)());});}else{return _0x3b19b1[_0x173a('0x31')](_0x43969f[_0x173a('0x32')])['then'](function(_0x4f9d5c){return respondWithResult(_0x49dd52)(_0x4f9d5c);});}},function(){handleEntityNotFound(_0x49dd52)();});};
\ No newline at end of file