Built motion from commit (unavailable).|2.5.6
[motion2.git] / server / api / cdr / cdr.controller.js
index 468028a..e1dcceb 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0x083e=['fields','attributes','nolimit','order','sort','where','pick','merge','VIRTUAL','filter','options','Cdr','count','include','findAll','rows','show','params','length','find','catch','create','body','destroy','html-pdf','eml-format','zip-dir','request-promise','moment','bluebird','mustache','util','path','sox','ejs','lodash','squel','crypto','jsforce','desk.js','papaparse','ioredis','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../mysqldb','sendStatus','status','end','json','offset','limit','set','Content-Range','apply','reject','save','update','then','name','send','map','rawAttributes','type','key','query','keys','filters','intersection','model'];(function(_0x37efda,_0x255841){var _0x4cd5d6=function(_0x58618f){while(--_0x58618f){_0x37efda['push'](_0x37efda['shift']());}};_0x4cd5d6(++_0x255841);}(_0x083e,0x140));var _0xe083=function(_0x1e4a8e,_0x18022b){_0x1e4a8e=_0x1e4a8e-0x0;var _0x5408f9=_0x083e[_0x1e4a8e];return _0x5408f9;};'use strict';var pdf=require(_0xe083('0x0'));var emlformat=require(_0xe083('0x1'));var rimraf=require('rimraf');var zipdir=require(_0xe083('0x2'));var jsonpatch=require('fast-json-patch');var rp=require(_0xe083('0x3'));var moment=require(_0xe083('0x4'));var BPromise=require(_0xe083('0x5'));var Mustache=require(_0xe083('0x6'));var util=require(_0xe083('0x7'));var path=require(_0xe083('0x8'));var sox=require(_0xe083('0x9'));var csv=require('to-csv');var ejs=require(_0xe083('0xa'));var fs=require('fs');var _=require(_0xe083('0xb'));var squel=require(_0xe083('0xc'));var crypto=require(_0xe083('0xd'));var jsforce=require(_0xe083('0xe'));var deskjs=require(_0xe083('0xf'));var toCsv=require('to-csv');var querystring=require('querystring');var Papa=require(_0xe083('0x10'));var Redis=require(_0xe083('0x11'));var authService=require('../../components/auth/service');var qs=require(_0xe083('0x12'));var as=require(_0xe083('0x13'));var hardwareService=require(_0xe083('0x14'));var logger=require(_0xe083('0x15'))(_0xe083('0x16'));var utils=require(_0xe083('0x17'));var config=require(_0xe083('0x18'));var db=require(_0xe083('0x19'))['db'];function respondWithStatusCode(_0x50a6ad,_0x543be8){_0x543be8=_0x543be8||0xcc;return function(_0x58f606){if(_0x58f606){return _0x50a6ad[_0xe083('0x1a')](_0x543be8);}return _0x50a6ad[_0xe083('0x1b')](_0x543be8)[_0xe083('0x1c')]();};}function respondWithResult(_0x2f7fa6,_0x488768){_0x488768=_0x488768||0xc8;return function(_0xd71c65){if(_0xd71c65){return _0x2f7fa6[_0xe083('0x1b')](_0x488768)[_0xe083('0x1d')](_0xd71c65);}};}function respondWithFilteredResult(_0x50053a,_0x38351e){return function(_0x4205bf){if(_0x4205bf){var _0x4ae78c=_0x4205bf['count'],_0x273af0=_0x38351e[_0xe083('0x1e')],_0x5c2f27=_0x38351e['offset']+_0x38351e[_0xe083('0x1f')],_0x19177c;if(_0x5c2f27>=_0x4ae78c){_0x5c2f27=_0x4ae78c;_0x19177c=0xc8;}else{_0x19177c=0xce;}_0x50053a[_0xe083('0x1b')](_0x19177c);return _0x50053a[_0xe083('0x20')](_0xe083('0x21'),_0x273af0+'-'+_0x5c2f27+'/'+_0x4ae78c)[_0xe083('0x1d')](_0x4205bf);}return null;};}function patchUpdates(_0x595916){return function(_0xba9229){try{jsonpatch[_0xe083('0x22')](_0xba9229,_0x595916,!![]);}catch(_0x15472e){return BPromise[_0xe083('0x23')](_0x15472e);}return _0xba9229[_0xe083('0x24')]();};}function saveUpdates(_0xc90691,_0x23ac51){return function(_0x27df65){if(_0x27df65){return _0x27df65[_0xe083('0x25')](_0xc90691)[_0xe083('0x26')](function(_0x479d18){return _0x479d18;});}return null;};}function removeEntity(_0x4cc040,_0x1889e8){return function(_0x2dc82b){if(_0x2dc82b){return _0x2dc82b['destroy']()['then'](function(){_0x4cc040[_0xe083('0x1b')](0xcc)['end']();});}};}function handleEntityNotFound(_0x188c08,_0x309128){return function(_0x2d1b80){if(!_0x2d1b80){_0x188c08['sendStatus'](0x194);}return _0x2d1b80;};}function handleError(_0x10c846,_0xe0f398){_0xe0f398=_0xe0f398||0x1f4;return function(_0x396bcd){logger['error'](_0x396bcd['stack']);if(_0x396bcd[_0xe083('0x27')]){delete _0x396bcd['name'];}_0x10c846['status'](_0xe0f398)[_0xe083('0x28')](_0x396bcd);};}exports['index']=function(_0x38389e,_0x4f342e){var _0x3b8e02={},_0x223602={},_0x9df4b9={'count':0x0,'rows':[]};var _0x18f196=_[_0xe083('0x29')](db['Cdr'][_0xe083('0x2a')],function(_0x3b3bb6){return{'name':_0x3b3bb6['fieldName'],'type':_0x3b3bb6[_0xe083('0x2b')][_0xe083('0x2c')]};});_0x223602['model']=_[_0xe083('0x29')](_0x18f196,_0xe083('0x27'));_0x223602[_0xe083('0x2d')]=_[_0xe083('0x2e')](_0x38389e[_0xe083('0x2d')]);_0x223602[_0xe083('0x2f')]=_[_0xe083('0x30')](_0x223602['model'],_0x223602[_0xe083('0x2d')]);_0x3b8e02['attributes']=_[_0xe083('0x30')](_0x223602[_0xe083('0x31')],qs['fields'](_0x38389e['query'][_0xe083('0x32')]));_0x3b8e02[_0xe083('0x33')]=_0x3b8e02[_0xe083('0x33')]['length']?_0x3b8e02['attributes']:_0x223602[_0xe083('0x31')];if(!_0x38389e['query']['hasOwnProperty'](_0xe083('0x34'))){_0x3b8e02[_0xe083('0x1f')]=qs[_0xe083('0x1f')](_0x38389e['query'][_0xe083('0x1f')]);_0x3b8e02[_0xe083('0x1e')]=qs[_0xe083('0x1e')](_0x38389e['query'][_0xe083('0x1e')]);}_0x3b8e02[_0xe083('0x35')]=qs[_0xe083('0x36')](_0x38389e[_0xe083('0x2d')][_0xe083('0x36')]);_0x3b8e02[_0xe083('0x37')]=qs[_0xe083('0x2f')](_[_0xe083('0x38')](_0x38389e[_0xe083('0x2d')],_0x223602['filters']));if(_0x38389e[_0xe083('0x2d')]['filter']){_0x3b8e02[_0xe083('0x37')]=_[_0xe083('0x39')](_0x3b8e02[_0xe083('0x37')],{'$or':_[_0xe083('0x29')](_0x18f196,function(_0x1da94a){if(_0x1da94a[_0xe083('0x2b')]!==_0xe083('0x3a')){var _0x34cc39={};_0x34cc39[_0x1da94a[_0xe083('0x27')]]={'$like':'%'+_0x38389e[_0xe083('0x2d')][_0xe083('0x3b')]+'%'};return _0x34cc39;}})});}_0x3b8e02=_[_0xe083('0x39')]({},_0x3b8e02,_0x38389e[_0xe083('0x3c')]);var _0x345c5a={'where':_0x3b8e02[_0xe083('0x37')]};return db[_0xe083('0x3d')][_0xe083('0x3e')](_0x345c5a)[_0xe083('0x26')](function(_0x53fbed){_0x9df4b9[_0xe083('0x3e')]=_0x53fbed;if(_0x38389e[_0xe083('0x2d')]['includeAll']){_0x3b8e02[_0xe083('0x3f')]=[{'all':!![]}];}return db[_0xe083('0x3d')][_0xe083('0x40')](_0x3b8e02);})[_0xe083('0x26')](function(_0x556808){_0x9df4b9[_0xe083('0x41')]=_0x556808;return _0x9df4b9;})[_0xe083('0x26')](respondWithFilteredResult(_0x4f342e,_0x3b8e02))['catch'](handleError(_0x4f342e,null));};exports[_0xe083('0x42')]=function(_0x5a8d4e,_0x318e44){var _0x59ff36={'raw':!![],'where':{'id':_0x5a8d4e[_0xe083('0x43')]['id']}},_0x37226d={};_0x37226d[_0xe083('0x31')]=_[_0xe083('0x2e')](db['Cdr']['rawAttributes']);_0x37226d[_0xe083('0x2d')]=_[_0xe083('0x2e')](_0x5a8d4e['query']);_0x37226d[_0xe083('0x2f')]=_[_0xe083('0x30')](_0x37226d[_0xe083('0x31')],_0x37226d[_0xe083('0x2d')]);_0x59ff36['attributes']=_[_0xe083('0x30')](_0x37226d[_0xe083('0x31')],qs[_0xe083('0x32')](_0x5a8d4e[_0xe083('0x2d')][_0xe083('0x32')]));_0x59ff36[_0xe083('0x33')]=_0x59ff36['attributes'][_0xe083('0x44')]?_0x59ff36[_0xe083('0x33')]:_0x37226d[_0xe083('0x31')];if(_0x5a8d4e[_0xe083('0x2d')]['includeAll']){_0x59ff36[_0xe083('0x3f')]=[{'all':!![]}];}_0x59ff36=_[_0xe083('0x39')]({},_0x59ff36,_0x5a8d4e[_0xe083('0x3c')]);return db[_0xe083('0x3d')][_0xe083('0x45')](_0x59ff36)['then'](handleEntityNotFound(_0x318e44,null))['then'](respondWithResult(_0x318e44,null))[_0xe083('0x46')](handleError(_0x318e44,null));};exports[_0xe083('0x47')]=function(_0x16dcf7,_0xb15882){return db[_0xe083('0x3d')][_0xe083('0x47')](_0x16dcf7['body'],{})[_0xe083('0x26')](respondWithResult(_0xb15882,0xc9))[_0xe083('0x46')](handleError(_0xb15882,null));};exports[_0xe083('0x25')]=function(_0x458cbe,_0x1593d5){if(_0x458cbe['body']['id']){delete _0x458cbe['body']['id'];}return db[_0xe083('0x3d')][_0xe083('0x45')]({'where':{'id':_0x458cbe[_0xe083('0x43')]['id']}})[_0xe083('0x26')](handleEntityNotFound(_0x1593d5,null))[_0xe083('0x26')](saveUpdates(_0x458cbe[_0xe083('0x48')],null))[_0xe083('0x26')](respondWithResult(_0x1593d5,null))[_0xe083('0x46')](handleError(_0x1593d5,null));};exports[_0xe083('0x49')]=function(_0x59f5dd,_0x478a70){return db[_0xe083('0x3d')][_0xe083('0x45')]({'where':{'id':_0x59f5dd['params']['id']}})[_0xe083('0x26')](handleEntityNotFound(_0x478a70,null))['then'](removeEntity(_0x478a70,null))['catch'](handleError(_0x478a70,null));};exports['describe']=function(_0x2e7e0b,_0x1ef4a6){return db[_0xe083('0x3d')]['describe']()[_0xe083('0x26')](respondWithResult(_0x1ef4a6,null))['catch'](handleError(_0x1ef4a6,null));};
\ No newline at end of file
+var _0xaa0a=['keys','filters','intersection','model','fields','attributes','length','hasOwnProperty','order','sort','where','pick','filter','VIRTUAL','merge','options','includeAll','include','findAll','catch','show','rawAttributes','create','body','params','find','describe','html-pdf','eml-format','rimraf','zip-dir','fast-json-patch','request-promise','moment','sox','to-csv','ejs','lodash','jsforce','desk.js','querystring','papaparse','ioredis','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','json','count','offset','limit','set','Content-Range','apply','update','then','destroy','end','name','send','map','Cdr','type','query'];(function(_0x209337,_0x59644c){var _0x28b07b=function(_0x10fff6){while(--_0x10fff6){_0x209337['push'](_0x209337['shift']());}};_0x28b07b(++_0x59644c);}(_0xaa0a,0x133));var _0xaaa0=function(_0xcb5da7,_0x46cf13){_0xcb5da7=_0xcb5da7-0x0;var _0x3eb37c=_0xaa0a[_0xcb5da7];return _0x3eb37c;};'use strict';var pdf=require(_0xaaa0('0x0'));var emlformat=require(_0xaaa0('0x1'));var rimraf=require(_0xaaa0('0x2'));var zipdir=require(_0xaaa0('0x3'));var jsonpatch=require(_0xaaa0('0x4'));var rp=require(_0xaaa0('0x5'));var moment=require(_0xaaa0('0x6'));var BPromise=require('bluebird');var Mustache=require('mustache');var util=require('util');var path=require('path');var sox=require(_0xaaa0('0x7'));var csv=require(_0xaaa0('0x8'));var ejs=require(_0xaaa0('0x9'));var fs=require('fs');var _=require(_0xaaa0('0xa'));var squel=require('squel');var crypto=require('crypto');var jsforce=require(_0xaaa0('0xb'));var deskjs=require(_0xaaa0('0xc'));var toCsv=require('to-csv');var querystring=require(_0xaaa0('0xd'));var Papa=require(_0xaaa0('0xe'));var Redis=require(_0xaaa0('0xf'));var authService=require('../../components/auth/service');var qs=require(_0xaaa0('0x10'));var as=require(_0xaaa0('0x11'));var hardwareService=require(_0xaaa0('0x12'));var logger=require(_0xaaa0('0x13'))('api');var utils=require(_0xaaa0('0x14'));var config=require(_0xaaa0('0x15'));var licenseUtil=require(_0xaaa0('0x16'));var db=require(_0xaaa0('0x17'))['db'];function respondWithStatusCode(_0x378098,_0x6c9bd4){_0x6c9bd4=_0x6c9bd4||0xcc;return function(_0xfb5ba){if(_0xfb5ba){return _0x378098[_0xaaa0('0x18')](_0x6c9bd4);}return _0x378098[_0xaaa0('0x19')](_0x6c9bd4)['end']();};}function respondWithResult(_0x168206,_0x56b38d){_0x56b38d=_0x56b38d||0xc8;return function(_0x1edeba){if(_0x1edeba){return _0x168206[_0xaaa0('0x19')](_0x56b38d)[_0xaaa0('0x1a')](_0x1edeba);}};}function respondWithFilteredResult(_0x272094,_0x19b46d){return function(_0x2acc99){if(_0x2acc99){var _0x3f0ca9=_0x2acc99[_0xaaa0('0x1b')],_0x29a733=_0x19b46d[_0xaaa0('0x1c')],_0xbd09ad=_0x19b46d[_0xaaa0('0x1c')]+_0x19b46d[_0xaaa0('0x1d')],_0x4a9555;if(_0xbd09ad>=_0x3f0ca9){_0xbd09ad=_0x3f0ca9;_0x4a9555=0xc8;}else{_0x4a9555=0xce;}_0x272094[_0xaaa0('0x19')](_0x4a9555);return _0x272094[_0xaaa0('0x1e')](_0xaaa0('0x1f'),_0x29a733+'-'+_0xbd09ad+'/'+_0x3f0ca9)[_0xaaa0('0x1a')](_0x2acc99);}return null;};}function patchUpdates(_0x1b3ba7){return function(_0x1d4833){try{jsonpatch[_0xaaa0('0x20')](_0x1d4833,_0x1b3ba7,!![]);}catch(_0x17c117){return BPromise['reject'](_0x17c117);}return _0x1d4833['save']();};}function saveUpdates(_0x3623f2,_0x1e71c6){return function(_0x473c8b){if(_0x473c8b){return _0x473c8b[_0xaaa0('0x21')](_0x3623f2)[_0xaaa0('0x22')](function(_0x43e2c7){return _0x43e2c7;});}return null;};}function removeEntity(_0x292970,_0x40ab15){return function(_0x532e83){if(_0x532e83){return _0x532e83[_0xaaa0('0x23')]()[_0xaaa0('0x22')](function(){_0x292970[_0xaaa0('0x19')](0xcc)[_0xaaa0('0x24')]();});}};}function handleEntityNotFound(_0x733633,_0x23291e){return function(_0x470c99){if(!_0x470c99){_0x733633['sendStatus'](0x194);}return _0x470c99;};}function handleError(_0x14e6e1,_0x319da4){_0x319da4=_0x319da4||0x1f4;return function(_0x37bdef){logger['error'](_0x37bdef['stack']);if(_0x37bdef[_0xaaa0('0x25')]){delete _0x37bdef[_0xaaa0('0x25')];}_0x14e6e1[_0xaaa0('0x19')](_0x319da4)[_0xaaa0('0x26')](_0x37bdef);};}exports['index']=function(_0x44ecc4,_0x2efe04){var _0x27fb29={},_0xe42515={},_0x3704a9={'count':0x0,'rows':[]};var _0x4dd568=_[_0xaaa0('0x27')](db[_0xaaa0('0x28')]['rawAttributes'],function(_0x51b1a9){return{'name':_0x51b1a9['fieldName'],'type':_0x51b1a9[_0xaaa0('0x29')]['key']};});_0xe42515['model']=_[_0xaaa0('0x27')](_0x4dd568,_0xaaa0('0x25'));_0xe42515[_0xaaa0('0x2a')]=_[_0xaaa0('0x2b')](_0x44ecc4[_0xaaa0('0x2a')]);_0xe42515[_0xaaa0('0x2c')]=_[_0xaaa0('0x2d')](_0xe42515[_0xaaa0('0x2e')],_0xe42515[_0xaaa0('0x2a')]);_0x27fb29['attributes']=_[_0xaaa0('0x2d')](_0xe42515[_0xaaa0('0x2e')],qs[_0xaaa0('0x2f')](_0x44ecc4[_0xaaa0('0x2a')]['fields']));_0x27fb29['attributes']=_0x27fb29[_0xaaa0('0x30')][_0xaaa0('0x31')]?_0x27fb29[_0xaaa0('0x30')]:_0xe42515[_0xaaa0('0x2e')];if(!_0x44ecc4[_0xaaa0('0x2a')][_0xaaa0('0x32')]('nolimit')){_0x27fb29['limit']=qs['limit'](_0x44ecc4[_0xaaa0('0x2a')][_0xaaa0('0x1d')]);_0x27fb29[_0xaaa0('0x1c')]=qs['offset'](_0x44ecc4['query'][_0xaaa0('0x1c')]);}_0x27fb29[_0xaaa0('0x33')]=qs[_0xaaa0('0x34')](_0x44ecc4[_0xaaa0('0x2a')]['sort']);_0x27fb29[_0xaaa0('0x35')]=qs['filters'](_[_0xaaa0('0x36')](_0x44ecc4[_0xaaa0('0x2a')],_0xe42515[_0xaaa0('0x2c')]),_0x4dd568);if(_0x44ecc4[_0xaaa0('0x2a')][_0xaaa0('0x37')]){_0x27fb29[_0xaaa0('0x35')]=_['merge'](_0x27fb29[_0xaaa0('0x35')],{'$or':_['map'](_0x4dd568,function(_0x48c09f){if(_0x48c09f[_0xaaa0('0x29')]!==_0xaaa0('0x38')){var _0x37fa83={};_0x37fa83[_0x48c09f[_0xaaa0('0x25')]]={'$like':'%'+_0x44ecc4[_0xaaa0('0x2a')][_0xaaa0('0x37')]+'%'};return _0x37fa83;}})});}_0x27fb29=_[_0xaaa0('0x39')]({},_0x27fb29,_0x44ecc4[_0xaaa0('0x3a')]);var _0x967ad0={'where':_0x27fb29['where']};return db[_0xaaa0('0x28')]['count'](_0x967ad0)[_0xaaa0('0x22')](function(_0x56e796){_0x3704a9[_0xaaa0('0x1b')]=_0x56e796;if(_0x44ecc4[_0xaaa0('0x2a')][_0xaaa0('0x3b')]){_0x27fb29[_0xaaa0('0x3c')]=[{'all':!![]}];}return db[_0xaaa0('0x28')][_0xaaa0('0x3d')](_0x27fb29);})[_0xaaa0('0x22')](function(_0x10441d){_0x3704a9['rows']=_0x10441d;return _0x3704a9;})['then'](respondWithFilteredResult(_0x2efe04,_0x27fb29))[_0xaaa0('0x3e')](handleError(_0x2efe04,null));};exports[_0xaaa0('0x3f')]=function(_0x56fbd8,_0x4190ac){var _0x39f2dd={'raw':!![],'where':{'id':_0x56fbd8['params']['id']}},_0x433e51={};_0x433e51['model']=_[_0xaaa0('0x2b')](db[_0xaaa0('0x28')][_0xaaa0('0x40')]);_0x433e51[_0xaaa0('0x2a')]=_[_0xaaa0('0x2b')](_0x56fbd8[_0xaaa0('0x2a')]);_0x433e51[_0xaaa0('0x2c')]=_[_0xaaa0('0x2d')](_0x433e51[_0xaaa0('0x2e')],_0x433e51[_0xaaa0('0x2a')]);_0x39f2dd[_0xaaa0('0x30')]=_[_0xaaa0('0x2d')](_0x433e51[_0xaaa0('0x2e')],qs['fields'](_0x56fbd8[_0xaaa0('0x2a')][_0xaaa0('0x2f')]));_0x39f2dd[_0xaaa0('0x30')]=_0x39f2dd[_0xaaa0('0x30')][_0xaaa0('0x31')]?_0x39f2dd[_0xaaa0('0x30')]:_0x433e51[_0xaaa0('0x2e')];if(_0x56fbd8['query'][_0xaaa0('0x3b')]){_0x39f2dd[_0xaaa0('0x3c')]=[{'all':!![]}];}_0x39f2dd=_['merge']({},_0x39f2dd,_0x56fbd8[_0xaaa0('0x3a')]);return db['Cdr']['find'](_0x39f2dd)[_0xaaa0('0x22')](handleEntityNotFound(_0x4190ac,null))['then'](respondWithResult(_0x4190ac,null))[_0xaaa0('0x3e')](handleError(_0x4190ac,null));};exports[_0xaaa0('0x41')]=function(_0x61968f,_0x4485d2){return db['Cdr']['create'](_0x61968f[_0xaaa0('0x42')],{})['then'](respondWithResult(_0x4485d2,0xc9))['catch'](handleError(_0x4485d2,null));};exports['update']=function(_0x2ccd3f,_0x5a3ca1){if(_0x2ccd3f[_0xaaa0('0x42')]['id']){delete _0x2ccd3f[_0xaaa0('0x42')]['id'];}return db[_0xaaa0('0x28')]['find']({'where':{'id':_0x2ccd3f[_0xaaa0('0x43')]['id']}})[_0xaaa0('0x22')](handleEntityNotFound(_0x5a3ca1,null))[_0xaaa0('0x22')](saveUpdates(_0x2ccd3f[_0xaaa0('0x42')],null))[_0xaaa0('0x22')](respondWithResult(_0x5a3ca1,null))[_0xaaa0('0x3e')](handleError(_0x5a3ca1,null));};exports[_0xaaa0('0x23')]=function(_0x41f59c,_0x141cb3){return db[_0xaaa0('0x28')][_0xaaa0('0x44')]({'where':{'id':_0x41f59c[_0xaaa0('0x43')]['id']}})[_0xaaa0('0x22')](handleEntityNotFound(_0x141cb3,null))[_0xaaa0('0x22')](removeEntity(_0x141cb3,null))[_0xaaa0('0x3e')](handleError(_0x141cb3,null));};exports[_0xaaa0('0x45')]=function(_0x11d474,_0x537fbe){return db['Cdr']['describe']()[_0xaaa0('0x22')](respondWithResult(_0x537fbe,null))[_0xaaa0('0x3e')](handleError(_0x537fbe,null));};
\ No newline at end of file