Built motion from commit da617fac.|2.6.6
[motion2.git] / server / api / smsTransferReport / smsTransferReport.controller.js
index dc7c936..01bdec0 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0x591c=['limit','Content-Range','apply','save','update','then','error','stack','name','index','fieldName','key','model','keys','filters','query','attributes','intersection','fields','length','hasOwnProperty','nolimit','order','sort','pick','filter','where','map','type','VIRTUAL','options','SmsTransferReport','includeAll','include','findAll','rows','show','params','rawAttributes','merge','catch','create','body','destroy','describe','eml-format','rimraf','zip-dir','moment','bluebird','mustache','util','path','sox','ejs','fs-extra','lodash','squel','crypto','jsforce','desk.js','to-csv','querystring','papaparse','ioredis','../../components/auth/service','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','end','json','undefined','count','offset'];(function(_0x14810c,_0x33f3da){var _0x8bfb1d=function(_0x362d86){while(--_0x362d86){_0x14810c['push'](_0x14810c['shift']());}};_0x8bfb1d(++_0x33f3da);}(_0x591c,0x165));var _0xc591=function(_0x576d2e,_0x53d420){_0x576d2e=_0x576d2e-0x0;var _0x48c60e=_0x591c[_0x576d2e];return _0x48c60e;};'use strict';var emlformat=require(_0xc591('0x0'));var rimraf=require(_0xc591('0x1'));var zipdir=require(_0xc591('0x2'));var jsonpatch=require('fast-json-patch');var rp=require('request-promise');var moment=require(_0xc591('0x3'));var BPromise=require(_0xc591('0x4'));var Mustache=require(_0xc591('0x5'));var util=require(_0xc591('0x6'));var path=require(_0xc591('0x7'));var sox=require(_0xc591('0x8'));var csv=require('to-csv');var ejs=require(_0xc591('0x9'));var fs=require('fs');var fs_extra=require(_0xc591('0xa'));var _=require(_0xc591('0xb'));var squel=require(_0xc591('0xc'));var crypto=require(_0xc591('0xd'));var jsforce=require(_0xc591('0xe'));var deskjs=require(_0xc591('0xf'));var toCsv=require(_0xc591('0x10'));var querystring=require(_0xc591('0x11'));var Papa=require(_0xc591('0x12'));var Redis=require(_0xc591('0x13'));var authService=require(_0xc591('0x14'));var qs=require('../../components/parsers/qs');var as=require(_0xc591('0x15'));var hardwareService=require(_0xc591('0x16'));var logger=require('../../config/logger')('api');var utils=require('../../config/utils');var config=require(_0xc591('0x17'));var licenseUtil=require(_0xc591('0x18'));var db=require(_0xc591('0x19'))['db'];function respondWithStatusCode(_0x6e1f3d,_0x596b78){_0x596b78=_0x596b78||0xcc;return function(_0xd0a379){if(_0xd0a379){return _0x6e1f3d[_0xc591('0x1a')](_0x596b78);}return _0x6e1f3d[_0xc591('0x1b')](_0x596b78)[_0xc591('0x1c')]();};}function respondWithResult(_0x387f19,_0x1fdcd3){_0x1fdcd3=_0x1fdcd3||0xc8;return function(_0x25d885){if(_0x25d885){return _0x387f19[_0xc591('0x1b')](_0x1fdcd3)[_0xc591('0x1d')](_0x25d885);}};}function respondWithFilteredResult(_0x5dab68,_0xc616f7){return function(_0x607b67){if(_0x607b67){var _0x1a9992=typeof _0xc616f7['offset']==='undefined'&&typeof _0xc616f7['limit']===_0xc591('0x1e');var _0x2654ba=_0x607b67[_0xc591('0x1f')];var _0x556d90=_0x1a9992?0x0:_0xc616f7['offset'];var _0x4a325b=_0x1a9992?_0x607b67[_0xc591('0x1f')]:_0xc616f7[_0xc591('0x20')]+_0xc616f7[_0xc591('0x21')];var _0x12bba3;if(_0x4a325b>=_0x2654ba){_0x4a325b=_0x2654ba;_0x12bba3=0xc8;}else{_0x12bba3=0xce;}_0x5dab68[_0xc591('0x1b')](_0x12bba3);return _0x5dab68['set'](_0xc591('0x22'),_0x556d90+'-'+_0x4a325b+'/'+_0x2654ba)[_0xc591('0x1d')](_0x607b67);}return null;};}function patchUpdates(_0x1eb95c){return function(_0x34f317){try{jsonpatch[_0xc591('0x23')](_0x34f317,_0x1eb95c,!![]);}catch(_0xeef86){return BPromise['reject'](_0xeef86);}return _0x34f317[_0xc591('0x24')]();};}function saveUpdates(_0x366c18,_0x381ce1){return function(_0x53020c){if(_0x53020c){return _0x53020c[_0xc591('0x25')](_0x366c18)[_0xc591('0x26')](function(_0x46e970){return _0x46e970;});}return null;};}function removeEntity(_0xbd0ae0,_0x178ffa){return function(_0x148acc){if(_0x148acc){return _0x148acc['destroy']()[_0xc591('0x26')](function(){_0xbd0ae0[_0xc591('0x1b')](0xcc)['end']();});}};}function handleEntityNotFound(_0x5564c7,_0x2ed04a){return function(_0x5658a5){if(!_0x5658a5){_0x5564c7[_0xc591('0x1a')](0x194);}return _0x5658a5;};}function handleError(_0x578196,_0xd7c2e1){_0xd7c2e1=_0xd7c2e1||0x1f4;return function(_0xc957ad){logger[_0xc591('0x27')](_0xc957ad[_0xc591('0x28')]);if(_0xc957ad[_0xc591('0x29')]){delete _0xc957ad[_0xc591('0x29')];}_0x578196[_0xc591('0x1b')](_0xd7c2e1)['send'](_0xc957ad);};}exports[_0xc591('0x2a')]=function(_0x382b66,_0x4d18c6){var _0x56d641={},_0x2cf3cf={},_0x1ec58c={'count':0x0,'rows':[]};var _0x3a79ba=_['map'](db['SmsTransferReport']['rawAttributes'],function(_0x3b5a69){return{'name':_0x3b5a69[_0xc591('0x2b')],'type':_0x3b5a69['type'][_0xc591('0x2c')]};});_0x2cf3cf[_0xc591('0x2d')]=_['map'](_0x3a79ba,_0xc591('0x29'));_0x2cf3cf['query']=_[_0xc591('0x2e')](_0x382b66['query']);_0x2cf3cf[_0xc591('0x2f')]=_['intersection'](_0x2cf3cf[_0xc591('0x2d')],_0x2cf3cf[_0xc591('0x30')]);_0x56d641[_0xc591('0x31')]=_[_0xc591('0x32')](_0x2cf3cf[_0xc591('0x2d')],qs['fields'](_0x382b66[_0xc591('0x30')][_0xc591('0x33')]));_0x56d641[_0xc591('0x31')]=_0x56d641['attributes'][_0xc591('0x34')]?_0x56d641['attributes']:_0x2cf3cf[_0xc591('0x2d')];if(!_0x382b66[_0xc591('0x30')][_0xc591('0x35')](_0xc591('0x36'))){_0x56d641['limit']=qs[_0xc591('0x21')](_0x382b66[_0xc591('0x30')][_0xc591('0x21')]);_0x56d641[_0xc591('0x20')]=qs['offset'](_0x382b66[_0xc591('0x30')][_0xc591('0x20')]);}_0x56d641[_0xc591('0x37')]=qs[_0xc591('0x38')](_0x382b66['query'][_0xc591('0x38')]);_0x56d641['where']=qs[_0xc591('0x2f')](_[_0xc591('0x39')](_0x382b66['query'],_0x2cf3cf['filters']),_0x3a79ba);if(_0x382b66[_0xc591('0x30')][_0xc591('0x3a')]){_0x56d641[_0xc591('0x3b')]=_['merge'](_0x56d641[_0xc591('0x3b')],{'$or':_[_0xc591('0x3c')](_0x3a79ba,function(_0x22446c){if(_0x22446c[_0xc591('0x3d')]!==_0xc591('0x3e')){var _0xa38299={};_0xa38299[_0x22446c[_0xc591('0x29')]]={'$like':'%'+_0x382b66['query'][_0xc591('0x3a')]+'%'};return _0xa38299;}})});}_0x56d641=_['merge']({},_0x56d641,_0x382b66[_0xc591('0x3f')]);var _0x659c59={'where':_0x56d641[_0xc591('0x3b')]};return db[_0xc591('0x40')][_0xc591('0x1f')](_0x659c59)['then'](function(_0x1e4989){_0x1ec58c[_0xc591('0x1f')]=_0x1e4989;if(_0x382b66[_0xc591('0x30')][_0xc591('0x41')]){_0x56d641[_0xc591('0x42')]=[{'all':!![]}];}return db[_0xc591('0x40')][_0xc591('0x43')](_0x56d641);})[_0xc591('0x26')](function(_0x36a5e0){_0x1ec58c[_0xc591('0x44')]=_0x36a5e0;return _0x1ec58c;})[_0xc591('0x26')](respondWithFilteredResult(_0x4d18c6,_0x56d641))['catch'](handleError(_0x4d18c6,null));};exports[_0xc591('0x45')]=function(_0x2f4132,_0xad86cb){var _0x608b06={'raw':!![],'where':{'id':_0x2f4132[_0xc591('0x46')]['id']}},_0x2f93ff={};_0x2f93ff['model']=_[_0xc591('0x2e')](db[_0xc591('0x40')][_0xc591('0x47')]);_0x2f93ff[_0xc591('0x30')]=_['keys'](_0x2f4132[_0xc591('0x30')]);_0x2f93ff[_0xc591('0x2f')]=_['intersection'](_0x2f93ff[_0xc591('0x2d')],_0x2f93ff[_0xc591('0x30')]);_0x608b06[_0xc591('0x31')]=_[_0xc591('0x32')](_0x2f93ff['model'],qs['fields'](_0x2f4132[_0xc591('0x30')][_0xc591('0x33')]));_0x608b06[_0xc591('0x31')]=_0x608b06[_0xc591('0x31')][_0xc591('0x34')]?_0x608b06['attributes']:_0x2f93ff[_0xc591('0x2d')];if(_0x2f4132['query'][_0xc591('0x41')]){_0x608b06[_0xc591('0x42')]=[{'all':!![]}];}_0x608b06=_[_0xc591('0x48')]({},_0x608b06,_0x2f4132[_0xc591('0x3f')]);return db['SmsTransferReport']['find'](_0x608b06)[_0xc591('0x26')](handleEntityNotFound(_0xad86cb,null))[_0xc591('0x26')](respondWithResult(_0xad86cb,null))[_0xc591('0x49')](handleError(_0xad86cb,null));};exports[_0xc591('0x4a')]=function(_0x6fc8a7,_0x1f91fd){return db[_0xc591('0x40')]['create'](_0x6fc8a7[_0xc591('0x4b')],{})[_0xc591('0x26')](respondWithResult(_0x1f91fd,0xc9))[_0xc591('0x49')](handleError(_0x1f91fd,null));};exports[_0xc591('0x25')]=function(_0x53285e,_0x4a11c7){if(_0x53285e[_0xc591('0x4b')]['id']){delete _0x53285e[_0xc591('0x4b')]['id'];}return db[_0xc591('0x40')]['find']({'where':{'id':_0x53285e[_0xc591('0x46')]['id']}})[_0xc591('0x26')](handleEntityNotFound(_0x4a11c7,null))[_0xc591('0x26')](saveUpdates(_0x53285e[_0xc591('0x4b')],null))[_0xc591('0x26')](respondWithResult(_0x4a11c7,null))[_0xc591('0x49')](handleError(_0x4a11c7,null));};exports[_0xc591('0x4c')]=function(_0x4c426f,_0x2ced06){return db[_0xc591('0x40')]['find']({'where':{'id':_0x4c426f[_0xc591('0x46')]['id']}})['then'](handleEntityNotFound(_0x2ced06,null))['then'](removeEntity(_0x2ced06,null))['catch'](handleError(_0x2ced06,null));};exports[_0xc591('0x4d')]=function(_0x454fc7,_0x41b771){return db['SmsTransferReport']['describe']()[_0xc591('0x26')](respondWithResult(_0x41b771,null))[_0xc591('0x49')](handleError(_0x41b771,null));};
\ No newline at end of file
+var _0x079d=['where','pick','filter','merge','VIRTUAL','includeAll','catch','show','keys','rawAttributes','include','find','create','body','params','describe','eml-format','zip-dir','request-promise','moment','bluebird','mustache','path','sox','to-csv','fs-extra','lodash','crypto','jsforce','desk.js','querystring','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','end','status','json','offset','undefined','limit','count','set','Content-Range','apply','reject','save','update','then','destroy','error','stack','name','send','index','map','SmsTransferReport','fieldName','type','model','query','filters','attributes','intersection','fields','hasOwnProperty','nolimit','order','sort'];(function(_0x47aa64,_0xfb8a07){var _0x549c7a=function(_0x266165){while(--_0x266165){_0x47aa64['push'](_0x47aa64['shift']());}};_0x549c7a(++_0xfb8a07);}(_0x079d,0xa6));var _0xd079=function(_0x4a7dec,_0x5f4581){_0x4a7dec=_0x4a7dec-0x0;var _0x188634=_0x079d[_0x4a7dec];return _0x188634;};'use strict';var emlformat=require(_0xd079('0x0'));var rimraf=require('rimraf');var zipdir=require(_0xd079('0x1'));var jsonpatch=require('fast-json-patch');var rp=require(_0xd079('0x2'));var moment=require(_0xd079('0x3'));var BPromise=require(_0xd079('0x4'));var Mustache=require(_0xd079('0x5'));var util=require('util');var path=require(_0xd079('0x6'));var sox=require(_0xd079('0x7'));var csv=require(_0xd079('0x8'));var ejs=require('ejs');var fs=require('fs');var fs_extra=require(_0xd079('0x9'));var _=require(_0xd079('0xa'));var squel=require('squel');var crypto=require(_0xd079('0xb'));var jsforce=require(_0xd079('0xc'));var deskjs=require(_0xd079('0xd'));var toCsv=require(_0xd079('0x8'));var querystring=require(_0xd079('0xe'));var Papa=require(_0xd079('0xf'));var Redis=require(_0xd079('0x10'));var authService=require(_0xd079('0x11'));var qs=require(_0xd079('0x12'));var as=require(_0xd079('0x13'));var hardwareService=require(_0xd079('0x14'));var logger=require('../../config/logger')('api');var utils=require('../../config/utils');var config=require(_0xd079('0x15'));var licenseUtil=require(_0xd079('0x16'));var db=require(_0xd079('0x17'))['db'];function respondWithStatusCode(_0x495036,_0x2c5e5f){_0x2c5e5f=_0x2c5e5f||0xcc;return function(_0x30890b){if(_0x30890b){return _0x495036[_0xd079('0x18')](_0x2c5e5f);}return _0x495036['status'](_0x2c5e5f)[_0xd079('0x19')]();};}function respondWithResult(_0x28f95a,_0x547c03){_0x547c03=_0x547c03||0xc8;return function(_0x5b6ea1){if(_0x5b6ea1){return _0x28f95a[_0xd079('0x1a')](_0x547c03)[_0xd079('0x1b')](_0x5b6ea1);}};}function respondWithFilteredResult(_0x57d92e,_0x1f997b){return function(_0x331465){if(_0x331465){var _0x1e5627=typeof _0x1f997b[_0xd079('0x1c')]===_0xd079('0x1d')&&typeof _0x1f997b[_0xd079('0x1e')]===_0xd079('0x1d');var _0x1ce7b5=_0x331465[_0xd079('0x1f')];var _0x44974a=_0x1e5627?0x0:_0x1f997b['offset'];var _0x35d97f=_0x1e5627?_0x331465[_0xd079('0x1f')]:_0x1f997b[_0xd079('0x1c')]+_0x1f997b[_0xd079('0x1e')];var _0x166bcc;if(_0x35d97f>=_0x1ce7b5){_0x35d97f=_0x1ce7b5;_0x166bcc=0xc8;}else{_0x166bcc=0xce;}_0x57d92e[_0xd079('0x1a')](_0x166bcc);return _0x57d92e[_0xd079('0x20')](_0xd079('0x21'),_0x44974a+'-'+_0x35d97f+'/'+_0x1ce7b5)['json'](_0x331465);}return null;};}function patchUpdates(_0x2330b6){return function(_0x39bec5){try{jsonpatch[_0xd079('0x22')](_0x39bec5,_0x2330b6,!![]);}catch(_0x35ee15){return BPromise[_0xd079('0x23')](_0x35ee15);}return _0x39bec5[_0xd079('0x24')]();};}function saveUpdates(_0x43399b,_0x54e96e){return function(_0x56fc59){if(_0x56fc59){return _0x56fc59[_0xd079('0x25')](_0x43399b)[_0xd079('0x26')](function(_0x287c95){return _0x287c95;});}return null;};}function removeEntity(_0x36f984,_0x277fe4){return function(_0x404f60){if(_0x404f60){return _0x404f60[_0xd079('0x27')]()[_0xd079('0x26')](function(){_0x36f984[_0xd079('0x1a')](0xcc)[_0xd079('0x19')]();});}};}function handleEntityNotFound(_0x56d08c,_0x2261ba){return function(_0x580a42){if(!_0x580a42){_0x56d08c[_0xd079('0x18')](0x194);}return _0x580a42;};}function handleError(_0x1cd72c,_0x5945e0){_0x5945e0=_0x5945e0||0x1f4;return function(_0x56ec57){logger[_0xd079('0x28')](_0x56ec57[_0xd079('0x29')]);if(_0x56ec57[_0xd079('0x2a')]){delete _0x56ec57['name'];}_0x1cd72c['status'](_0x5945e0)[_0xd079('0x2b')](_0x56ec57);};}exports[_0xd079('0x2c')]=function(_0x4ebbee,_0x551547){var _0x14ce47={},_0x3c6830={},_0x1dfc6e={'count':0x0,'rows':[]};var _0x4f2a42=_[_0xd079('0x2d')](db[_0xd079('0x2e')]['rawAttributes'],function(_0x358ca5){return{'name':_0x358ca5[_0xd079('0x2f')],'type':_0x358ca5[_0xd079('0x30')]['key']};});_0x3c6830[_0xd079('0x31')]=_[_0xd079('0x2d')](_0x4f2a42,_0xd079('0x2a'));_0x3c6830['query']=_['keys'](_0x4ebbee[_0xd079('0x32')]);_0x3c6830[_0xd079('0x33')]=_['intersection'](_0x3c6830['model'],_0x3c6830[_0xd079('0x32')]);_0x14ce47[_0xd079('0x34')]=_[_0xd079('0x35')](_0x3c6830[_0xd079('0x31')],qs[_0xd079('0x36')](_0x4ebbee[_0xd079('0x32')]['fields']));_0x14ce47[_0xd079('0x34')]=_0x14ce47[_0xd079('0x34')]['length']?_0x14ce47[_0xd079('0x34')]:_0x3c6830['model'];if(!_0x4ebbee['query'][_0xd079('0x37')](_0xd079('0x38'))){_0x14ce47['limit']=qs['limit'](_0x4ebbee[_0xd079('0x32')][_0xd079('0x1e')]);_0x14ce47[_0xd079('0x1c')]=qs['offset'](_0x4ebbee[_0xd079('0x32')][_0xd079('0x1c')]);}_0x14ce47[_0xd079('0x39')]=qs['sort'](_0x4ebbee['query'][_0xd079('0x3a')]);_0x14ce47[_0xd079('0x3b')]=qs[_0xd079('0x33')](_[_0xd079('0x3c')](_0x4ebbee[_0xd079('0x32')],_0x3c6830[_0xd079('0x33')]),_0x4f2a42);if(_0x4ebbee[_0xd079('0x32')][_0xd079('0x3d')]){_0x14ce47[_0xd079('0x3b')]=_[_0xd079('0x3e')](_0x14ce47[_0xd079('0x3b')],{'$or':_[_0xd079('0x2d')](_0x4f2a42,function(_0x2df2a3){if(_0x2df2a3[_0xd079('0x30')]!==_0xd079('0x3f')){var _0x3fd719={};_0x3fd719[_0x2df2a3[_0xd079('0x2a')]]={'$like':'%'+_0x4ebbee[_0xd079('0x32')][_0xd079('0x3d')]+'%'};return _0x3fd719;}})});}_0x14ce47=_['merge']({},_0x14ce47,_0x4ebbee['options']);var _0x4cc443={'where':_0x14ce47[_0xd079('0x3b')]};return db['SmsTransferReport']['count'](_0x4cc443)[_0xd079('0x26')](function(_0x20dd5a){_0x1dfc6e[_0xd079('0x1f')]=_0x20dd5a;if(_0x4ebbee[_0xd079('0x32')][_0xd079('0x40')]){_0x14ce47['include']=[{'all':!![]}];}return db[_0xd079('0x2e')]['findAll'](_0x14ce47);})[_0xd079('0x26')](function(_0x58eaca){_0x1dfc6e['rows']=_0x58eaca;return _0x1dfc6e;})[_0xd079('0x26')](respondWithFilteredResult(_0x551547,_0x14ce47))[_0xd079('0x41')](handleError(_0x551547,null));};exports[_0xd079('0x42')]=function(_0x151ccf,_0x5bf5b0){var _0x4a3565={'raw':!![],'where':{'id':_0x151ccf['params']['id']}},_0x1db308={};_0x1db308[_0xd079('0x31')]=_[_0xd079('0x43')](db[_0xd079('0x2e')][_0xd079('0x44')]);_0x1db308[_0xd079('0x32')]=_[_0xd079('0x43')](_0x151ccf[_0xd079('0x32')]);_0x1db308[_0xd079('0x33')]=_[_0xd079('0x35')](_0x1db308['model'],_0x1db308['query']);_0x4a3565[_0xd079('0x34')]=_[_0xd079('0x35')](_0x1db308[_0xd079('0x31')],qs[_0xd079('0x36')](_0x151ccf[_0xd079('0x32')]['fields']));_0x4a3565[_0xd079('0x34')]=_0x4a3565[_0xd079('0x34')]['length']?_0x4a3565[_0xd079('0x34')]:_0x1db308[_0xd079('0x31')];if(_0x151ccf[_0xd079('0x32')][_0xd079('0x40')]){_0x4a3565[_0xd079('0x45')]=[{'all':!![]}];}_0x4a3565=_['merge']({},_0x4a3565,_0x151ccf['options']);return db['SmsTransferReport'][_0xd079('0x46')](_0x4a3565)[_0xd079('0x26')](handleEntityNotFound(_0x5bf5b0,null))[_0xd079('0x26')](respondWithResult(_0x5bf5b0,null))[_0xd079('0x41')](handleError(_0x5bf5b0,null));};exports[_0xd079('0x47')]=function(_0x2833e4,_0x47a48d){return db['SmsTransferReport']['create'](_0x2833e4[_0xd079('0x48')],{})['then'](respondWithResult(_0x47a48d,0xc9))[_0xd079('0x41')](handleError(_0x47a48d,null));};exports[_0xd079('0x25')]=function(_0x4b40c5,_0x485023){if(_0x4b40c5[_0xd079('0x48')]['id']){delete _0x4b40c5['body']['id'];}return db['SmsTransferReport']['find']({'where':{'id':_0x4b40c5[_0xd079('0x49')]['id']}})[_0xd079('0x26')](handleEntityNotFound(_0x485023,null))[_0xd079('0x26')](saveUpdates(_0x4b40c5[_0xd079('0x48')],null))[_0xd079('0x26')](respondWithResult(_0x485023,null))[_0xd079('0x41')](handleError(_0x485023,null));};exports[_0xd079('0x27')]=function(_0x10b1e0,_0x337892){return db[_0xd079('0x2e')]['find']({'where':{'id':_0x10b1e0[_0xd079('0x49')]['id']}})['then'](handleEntityNotFound(_0x337892,null))[_0xd079('0x26')](removeEntity(_0x337892,null))['catch'](handleError(_0x337892,null));};exports[_0xd079('0x4a')]=function(_0x222331,_0x2d322a){return db[_0xd079('0x2e')][_0xd079('0x4a')]()[_0xd079('0x26')](respondWithResult(_0x2d322a,null))[_0xd079('0x41')](handleError(_0x2d322a,null));};
\ No newline at end of file