dcc3dd92afbf8b788c8e9eb85fb0dc501426b383
[motion2.git] / server / api / intZendeskAccount / intZendeskAccount.controller.js
1 // *************************************************************************
2 // *                                                                       *
3 // * xCALLY Motion -  The Omnichannel Contact Center                       *
4 // * Copyright (c) Xenialab s.r.l. All Rights Reserved                     *
5 // *                                                                       *
6 // *************************************************************************
7 // *                                                                       *
8 // * Email: info@xcally.com                                                *
9 // * Website: https://www.xcally.com                                       *
10 // *                                                                       *
11 // *************************************************************************
12 // *                                                                       *
13 // * The SOFTWARE PRODUCT is protected by copyright laws and international *
14 // * copyright treaties, as well as other intellectual property laws and   *
15 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                         *
16 // *                                                                       *
17 // *************************************************************************
18 var _0xd52f=['params','keys','fields','options','find','create','body','update','getConfigurations','ZendeskConfiguration','order','addConfiguration','findOne','AccountId','Subjects','channel','getDescriptions','ZendeskField','Descriptions','getFields','username','password','authType','remoteUri','slice','lastIndexOf','GET','format','%s/%s','ticket_fields','headers','%s:%s','toString','base64','Basic\x20%s','%s/token:%s','token','Unknown\x20authentication\x20type','subject','group','remove','includes','title','position','custom_field_options','statusCode','getFields,\x20%s,\x20%s,\x20%s','stringify','Wrong\x20credentials','html-pdf','eml-format','rimraf','moment','bluebird','mustache','path','sox','to-csv','ejs','lodash','squel','jsforce','querystring','ioredis','../../components/auth/service','../../components/parsers/advancedSearch','../../config/logger','api','../../config/utils','../../config/environment','../../components/integrations/configuration','jayson/promise','client','http','test','The\x20password\x20must\x20be\x20at\x20least\x208\x20characters\x20long\x20and\x20have\x201\x20lowercase\x20character,\x201\x20uppercase\x20character,\x201\x20number\x20and\x201\x20special\x20character\x20~!@#$%^&-_=+[{]}.','then','ZendeskAccount,\x20%s,\x20%s','request\x20sent','debug','ZendeskAccount,\x20%s,\x20%s,\x20%s','error','message','info','result','catch','status','count','offset','Content-Range','json','apply','reject','destroy','sendStatus','stack','name','send','map','ZendeskAccount','rawAttributes','fieldName','type','key','model','query','filters','intersection','attributes','length','hasOwnProperty','nolimit','limit','sort','where','pick','filter','merge','includeAll','include','findAll','rows'];(function(_0x3b56c0,_0xe100d8){var _0x377efe=function(_0x181589){while(--_0x181589){_0x3b56c0['push'](_0x3b56c0['shift']());}};_0x377efe(++_0xe100d8);}(_0xd52f,0xab));var _0xfd52=function(_0x46e22d,_0x4f6b31){_0x46e22d=_0x46e22d-0x0;var _0x567449=_0xd52f[_0x46e22d];return _0x567449;};'use strict';var pdf=require(_0xfd52('0x0'));var emlformat=require(_0xfd52('0x1'));var rimraf=require(_0xfd52('0x2'));var zipdir=require('zip-dir');var jsonpatch=require('fast-json-patch');var rp=require('request-promise');var moment=require(_0xfd52('0x3'));var BPromise=require(_0xfd52('0x4'));var Mustache=require(_0xfd52('0x5'));var util=require('util');var path=require(_0xfd52('0x6'));var sox=require(_0xfd52('0x7'));var csv=require(_0xfd52('0x8'));var ejs=require(_0xfd52('0x9'));var fs=require('fs');var _=require(_0xfd52('0xa'));var squel=require(_0xfd52('0xb'));var crypto=require('crypto');var jsforce=require(_0xfd52('0xc'));var deskjs=require('desk.js');var toCsv=require(_0xfd52('0x8'));var querystring=require(_0xfd52('0xd'));var Papa=require('papaparse');var Redis=require(_0xfd52('0xe'));var authService=require(_0xfd52('0xf'));var qs=require('../../components/parsers/qs');var as=require(_0xfd52('0x10'));var hardwareService=require('../../config/license/hardware');var logger=require(_0xfd52('0x11'))(_0xfd52('0x12'));var utils=require(_0xfd52('0x13'));var config=require(_0xfd52('0x14'));var db=require('../../mysqldb')['db'];var integrations=require(_0xfd52('0x15'));var jayson=require(_0xfd52('0x16'));var client=jayson[_0xfd52('0x17')][_0xfd52('0x18')]({'port':0x232a});function checkPasswordPattern(_0x2d0e48,_0x4e287d,_0x1a3637){if(_0x1a3637){var _0xae6b2f=new RegExp(/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[?!@#\$%\^&\*~\-_=+[{\]\}])(?=.{8,})/);if(_0xae6b2f[_0xfd52('0x19')](_0x4e287d)){return _0x2d0e48;}else{throw new db['Sequelize']['ValidationError'](_0xfd52('0x1a'));}}else{return _0x2d0e48;}}function respondWithRpcPromise(_0x24ccf0,_0x56cb35,_0x2cbbf8,_0x1f4580){return new BPromise(function(_0x3f543a,_0x40047d){var _0xbe73c6=_0x1f4580||client;return _0xbe73c6['request'](_0x24ccf0,_0x2cbbf8)[_0xfd52('0x1b')](function(_0x450bd0){logger['info'](_0xfd52('0x1c'),_0x56cb35,_0xfd52('0x1d'));logger[_0xfd52('0x1e')](_0xfd52('0x1f'),_0x56cb35,_0xfd52('0x1d'),JSON['stringify'](_0x450bd0));if(_0x450bd0[_0xfd52('0x20')]){if(_0x450bd0[_0xfd52('0x20')]['code']===0x1f4){logger[_0xfd52('0x20')]('ZendeskAccount,\x20%s,\x20%s',_0x56cb35,_0x450bd0['error'][_0xfd52('0x21')]);return _0x40047d(_0x450bd0['error']['message']);}logger['error'](_0xfd52('0x1c'),_0x56cb35,_0x450bd0[_0xfd52('0x20')][_0xfd52('0x21')]);return _0x3f543a(_0x450bd0[_0xfd52('0x20')][_0xfd52('0x21')]);}else{logger[_0xfd52('0x22')](_0xfd52('0x1c'),_0x56cb35,_0xfd52('0x1d'));_0x3f543a(_0x450bd0[_0xfd52('0x23')]['message']);}})[_0xfd52('0x24')](function(_0x5e4680){logger['error']('ZendeskAccount,\x20%s,\x20%s',_0x56cb35,_0x5e4680);_0x40047d(_0x5e4680);});});}function respondWithStatusCode(_0xb5fb5f,_0x1db279){_0x1db279=_0x1db279||0xcc;return function(_0x710683){if(_0x710683){return _0xb5fb5f['sendStatus'](_0x1db279);}return _0xb5fb5f['status'](_0x1db279)['end']();};}function respondWithResult(_0x2c3a78,_0x5be3ff){_0x5be3ff=_0x5be3ff||0xc8;return function(_0x5d72b3){if(_0x5d72b3){return _0x2c3a78[_0xfd52('0x25')](_0x5be3ff)['json'](_0x5d72b3);}};}function respondWithFilteredResult(_0x5c888d,_0x115d37){return function(_0x3f9625){if(_0x3f9625){var _0x4c2347=_0x3f9625[_0xfd52('0x26')],_0x6203c=_0x115d37[_0xfd52('0x27')],_0x15c845=_0x115d37[_0xfd52('0x27')]+_0x115d37['limit'],_0xcdc79e;if(_0x15c845>=_0x4c2347){_0x15c845=_0x4c2347;_0xcdc79e=0xc8;}else{_0xcdc79e=0xce;}_0x5c888d[_0xfd52('0x25')](_0xcdc79e);return _0x5c888d['set'](_0xfd52('0x28'),_0x6203c+'-'+_0x15c845+'/'+_0x4c2347)[_0xfd52('0x29')](_0x3f9625);}return null;};}function patchUpdates(_0xf2809c){return function(_0x2239dd){try{jsonpatch[_0xfd52('0x2a')](_0x2239dd,_0xf2809c,!![]);}catch(_0x2f8902){return BPromise[_0xfd52('0x2b')](_0x2f8902);}return _0x2239dd['save']();};}function saveUpdates(_0x473551,_0x53e2e6){return function(_0x3b07f8){if(_0x3b07f8){return _0x3b07f8['update'](_0x473551)[_0xfd52('0x1b')](function(_0x10b7ee){return _0x10b7ee;});}return null;};}function removeEntity(_0x2ddd1d,_0x5b7373){return function(_0x311c32){if(_0x311c32){return _0x311c32[_0xfd52('0x2c')]()['then'](function(){_0x2ddd1d[_0xfd52('0x25')](0xcc)['end']();});}};}function handleEntityNotFound(_0x57cbff,_0x524d3c){return function(_0x39f197){if(!_0x39f197){_0x57cbff[_0xfd52('0x2d')](0x194);}return _0x39f197;};}function handleError(_0x210654,_0x3f80bd){_0x3f80bd=_0x3f80bd||0x1f4;return function(_0x549e56){logger[_0xfd52('0x20')](_0x549e56[_0xfd52('0x2e')]);if(_0x549e56[_0xfd52('0x2f')]){delete _0x549e56[_0xfd52('0x2f')];}_0x210654[_0xfd52('0x25')](_0x3f80bd)[_0xfd52('0x30')](_0x549e56);};}exports['index']=function(_0xf7e0a4,_0x1df0cb){var _0x156b50={},_0x59d85f={},_0x4c3d86={'count':0x0,'rows':[]};var _0x315d66=_[_0xfd52('0x31')](db[_0xfd52('0x32')][_0xfd52('0x33')],function(_0x190c01){return{'name':_0x190c01[_0xfd52('0x34')],'type':_0x190c01[_0xfd52('0x35')][_0xfd52('0x36')]};});_0x59d85f[_0xfd52('0x37')]=_[_0xfd52('0x31')](_0x315d66,'name');_0x59d85f['query']=_['keys'](_0xf7e0a4[_0xfd52('0x38')]);_0x59d85f[_0xfd52('0x39')]=_[_0xfd52('0x3a')](_0x59d85f['model'],_0x59d85f[_0xfd52('0x38')]);_0x156b50[_0xfd52('0x3b')]=_[_0xfd52('0x3a')](_0x59d85f[_0xfd52('0x37')],qs['fields'](_0xf7e0a4[_0xfd52('0x38')]['fields']));_0x156b50[_0xfd52('0x3b')]=_0x156b50['attributes'][_0xfd52('0x3c')]?_0x156b50[_0xfd52('0x3b')]:_0x59d85f['model'];if(!_0xf7e0a4[_0xfd52('0x38')][_0xfd52('0x3d')](_0xfd52('0x3e'))){_0x156b50['limit']=qs['limit'](_0xf7e0a4['query'][_0xfd52('0x3f')]);_0x156b50[_0xfd52('0x27')]=qs['offset'](_0xf7e0a4[_0xfd52('0x38')][_0xfd52('0x27')]);}_0x156b50['order']=qs[_0xfd52('0x40')](_0xf7e0a4['query']['sort']);_0x156b50[_0xfd52('0x41')]=qs[_0xfd52('0x39')](_[_0xfd52('0x42')](_0xf7e0a4['query'],_0x59d85f[_0xfd52('0x39')]),_0x315d66);if(_0xf7e0a4[_0xfd52('0x38')][_0xfd52('0x43')]){_0x156b50[_0xfd52('0x41')]=_[_0xfd52('0x44')](_0x156b50[_0xfd52('0x41')],{'$or':_['map'](_0x315d66,function(_0x2fc5d5){if(_0x2fc5d5[_0xfd52('0x35')]!=='VIRTUAL'){var _0x2ea815={};_0x2ea815[_0x2fc5d5[_0xfd52('0x2f')]]={'$like':'%'+_0xf7e0a4[_0xfd52('0x38')][_0xfd52('0x43')]+'%'};return _0x2ea815;}})});}_0x156b50=_[_0xfd52('0x44')]({},_0x156b50,_0xf7e0a4['options']);var _0x4d040e={'where':_0x156b50['where']};return db[_0xfd52('0x32')][_0xfd52('0x26')](_0x4d040e)[_0xfd52('0x1b')](function(_0x44d36c){_0x4c3d86['count']=_0x44d36c;if(_0xf7e0a4[_0xfd52('0x38')][_0xfd52('0x45')]){_0x156b50[_0xfd52('0x46')]=[{'all':!![]}];}return db[_0xfd52('0x32')][_0xfd52('0x47')](_0x156b50);})['then'](function(_0x466eb9){_0x4c3d86[_0xfd52('0x48')]=_0x466eb9;return _0x4c3d86;})[_0xfd52('0x1b')](respondWithFilteredResult(_0x1df0cb,_0x156b50))[_0xfd52('0x24')](handleError(_0x1df0cb,null));};exports['show']=function(_0x520f75,_0x199735){var _0x55d46e={'raw':![],'where':{'id':_0x520f75[_0xfd52('0x49')]['id']}},_0xaefaf5={};_0xaefaf5[_0xfd52('0x37')]=_['keys'](db[_0xfd52('0x32')][_0xfd52('0x33')]);_0xaefaf5['query']=_[_0xfd52('0x4a')](_0x520f75[_0xfd52('0x38')]);_0xaefaf5['filters']=_['intersection'](_0xaefaf5[_0xfd52('0x37')],_0xaefaf5[_0xfd52('0x38')]);_0x55d46e[_0xfd52('0x3b')]=_[_0xfd52('0x3a')](_0xaefaf5['model'],qs['fields'](_0x520f75['query'][_0xfd52('0x4b')]));_0x55d46e[_0xfd52('0x3b')]=_0x55d46e[_0xfd52('0x3b')][_0xfd52('0x3c')]?_0x55d46e[_0xfd52('0x3b')]:_0xaefaf5[_0xfd52('0x37')];if(_0x520f75[_0xfd52('0x38')][_0xfd52('0x45')]){_0x55d46e[_0xfd52('0x46')]=[{'all':!![]}];}_0x55d46e=_[_0xfd52('0x44')]({},_0x55d46e,_0x520f75[_0xfd52('0x4c')]);return db[_0xfd52('0x32')][_0xfd52('0x4d')](_0x55d46e)[_0xfd52('0x1b')](handleEntityNotFound(_0x199735,null))[_0xfd52('0x1b')](respondWithResult(_0x199735,null))[_0xfd52('0x24')](handleError(_0x199735,null));};exports[_0xfd52('0x4e')]=function(_0x4ff02f,_0x571f78){return db[_0xfd52('0x32')][_0xfd52('0x4e')](_0x4ff02f[_0xfd52('0x4f')],{})[_0xfd52('0x1b')](respondWithResult(_0x571f78,0xc9))[_0xfd52('0x24')](handleError(_0x571f78,null));};exports[_0xfd52('0x50')]=function(_0x57fa7f,_0x4ff9e7){if(_0x57fa7f['body']['id']){delete _0x57fa7f[_0xfd52('0x4f')]['id'];}return db['ZendeskAccount'][_0xfd52('0x4d')]({'where':{'id':_0x57fa7f[_0xfd52('0x49')]['id']}})[_0xfd52('0x1b')](handleEntityNotFound(_0x4ff9e7,null))[_0xfd52('0x1b')](saveUpdates(_0x57fa7f[_0xfd52('0x4f')],null))['then'](respondWithResult(_0x4ff9e7,null))[_0xfd52('0x24')](handleError(_0x4ff9e7,null));};exports[_0xfd52('0x2c')]=function(_0x8fa19f,_0x344647){return db['ZendeskAccount'][_0xfd52('0x4d')]({'where':{'id':_0x8fa19f['params']['id']}})[_0xfd52('0x1b')](handleEntityNotFound(_0x344647,null))[_0xfd52('0x1b')](removeEntity(_0x344647,null))['catch'](handleError(_0x344647,null));};exports[_0xfd52('0x51')]=function(_0x100ab8,_0x5d5dfa,_0x4273dc){var _0x125e30={};var _0x5ec233={};var _0x20055c;var _0x33f9d6;return db[_0xfd52('0x32')]['findOne']({'where':{'id':_0x100ab8['params']['id']}})['then'](handleEntityNotFound(_0x5d5dfa,null))[_0xfd52('0x1b')](function(_0x92646c){if(_0x92646c){_0x20055c=_0x92646c;_0x5ec233[_0xfd52('0x37')]=_[_0xfd52('0x4a')](db[_0xfd52('0x52')][_0xfd52('0x33')]);_0x5ec233[_0xfd52('0x38')]=_[_0xfd52('0x4a')](_0x100ab8['query']);_0x5ec233[_0xfd52('0x39')]=_['intersection'](_0x5ec233['model'],_0x5ec233[_0xfd52('0x38')]);_0x125e30[_0xfd52('0x3b')]=_[_0xfd52('0x3a')](_0x5ec233[_0xfd52('0x37')],qs[_0xfd52('0x4b')](_0x100ab8['query']['fields']));_0x125e30[_0xfd52('0x3b')]=_0x125e30[_0xfd52('0x3b')][_0xfd52('0x3c')]?_0x125e30[_0xfd52('0x3b')]:_0x5ec233[_0xfd52('0x37')];_0x125e30[_0xfd52('0x53')]=qs[_0xfd52('0x40')](_0x100ab8[_0xfd52('0x38')][_0xfd52('0x40')]);_0x125e30[_0xfd52('0x41')]=qs[_0xfd52('0x39')](_[_0xfd52('0x42')](_0x100ab8[_0xfd52('0x38')],_0x5ec233[_0xfd52('0x39')]));if(_0x100ab8['query'][_0xfd52('0x43')]){_0x125e30[_0xfd52('0x41')]=_['merge'](_0x125e30[_0xfd52('0x41')],{'$or':_[_0xfd52('0x31')](_0x125e30['attributes'],function(_0x43b517){var _0x1ff1f0={};_0x1ff1f0[_0x43b517]={'$like':'%'+_0x100ab8['query'][_0xfd52('0x43')]+'%'};return _0x1ff1f0;})});}_0x125e30=_['merge']({},_0x125e30,_0x100ab8[_0xfd52('0x4c')]);return _0x20055c[_0xfd52('0x51')](_0x125e30);}})[_0xfd52('0x1b')](function(_0x3fb59c){if(_0x3fb59c){_0x33f9d6=_0x3fb59c['length'];if(!_0x100ab8[_0xfd52('0x38')][_0xfd52('0x3d')](_0xfd52('0x3e'))){_0x125e30[_0xfd52('0x3f')]=qs[_0xfd52('0x3f')](_0x100ab8[_0xfd52('0x38')][_0xfd52('0x3f')]);_0x125e30[_0xfd52('0x27')]=qs[_0xfd52('0x27')](_0x100ab8[_0xfd52('0x38')][_0xfd52('0x27')]);}return _0x20055c[_0xfd52('0x51')](_0x125e30);}})[_0xfd52('0x1b')](function(_0x2d063b){if(_0x2d063b){return _0x2d063b?{'count':_0x33f9d6,'rows':_0x2d063b}:null;}})['then'](respondWithResult(_0x5d5dfa,null))[_0xfd52('0x24')](handleError(_0x5d5dfa,null));};exports[_0xfd52('0x54')]=function(_0x178447,_0x174db2,_0x42044f){if(_0x178447[_0xfd52('0x4f')]['id']){delete _0x178447['body']['id'];}return db[_0xfd52('0x32')][_0xfd52('0x55')]({'where':{'id':_0x178447[_0xfd52('0x49')]['id']}})['then'](handleEntityNotFound(_0x174db2,null))[_0xfd52('0x1b')](function(_0x34b06f){if(_0x34b06f){_0x178447[_0xfd52('0x4f')][_0xfd52('0x56')]=_0x34b06f['id'];_0x178447[_0xfd52('0x4f')][_0xfd52('0x57')]=integrations['getSubjects'](_0x178447[_0xfd52('0x4f')][_0xfd52('0x58')],_0x178447[_0xfd52('0x4f')][_0xfd52('0x35')]);_0x178447[_0xfd52('0x4f')]['Descriptions']=integrations[_0xfd52('0x59')](_0x178447[_0xfd52('0x4f')]['channel'],_0x178447[_0xfd52('0x4f')][_0xfd52('0x35')]);return db[_0xfd52('0x52')][_0xfd52('0x4e')](_0x178447[_0xfd52('0x4f')],{'include':[{'model':db[_0xfd52('0x5a')],'as':'Subjects'},{'model':db[_0xfd52('0x5a')],'as':_0xfd52('0x5b')}]});}return null;})[_0xfd52('0x1b')](respondWithResult(_0x174db2,null))[_0xfd52('0x24')](handleError(_0x174db2,null));};exports[_0xfd52('0x5c')]=function(_0x179916,_0x144ffc,_0xcfabcb){var _0x3f4448='';return db['ZendeskAccount'][_0xfd52('0x55')]({'where':{'id':_0x179916['params']['id']},'attributes':['id',_0xfd52('0x5d'),_0xfd52('0x5e'),'token',_0xfd52('0x5f'),'remoteUri']})[_0xfd52('0x1b')](handleEntityNotFound(_0x144ffc,null))['then'](function(_0x20f2b9){if(_0x20f2b9){_0x3f4448=_0x20f2b9[_0xfd52('0x60')];var _0x17591f=_0x3f4448[_0xfd52('0x61')](-0x1);if(_0x17591f==='/'){_0x3f4448=_0x3f4448['substring'](0x0,_0x3f4448[_0xfd52('0x62')](_0x17591f));}var _0x2e7ef5={'method':_0xfd52('0x63'),'uri':util[_0xfd52('0x64')](_0xfd52('0x65'),_0x3f4448,_0xfd52('0x66')),'json':!![]};switch(_0x20f2b9[_0xfd52('0x5f')]){case _0xfd52('0x5e'):_0x2e7ef5[_0xfd52('0x67')]={'Authorization':util[_0xfd52('0x64')]('Basic\x20%s',new Buffer(util[_0xfd52('0x64')](_0xfd52('0x68'),_0x20f2b9[_0xfd52('0x5d')],_0x20f2b9[_0xfd52('0x5e')]))[_0xfd52('0x69')](_0xfd52('0x6a')))};break;case'token':_0x2e7ef5[_0xfd52('0x67')]={'Authorization':util[_0xfd52('0x64')](_0xfd52('0x6b'),new Buffer(util[_0xfd52('0x64')](_0xfd52('0x6c'),_0x20f2b9[_0xfd52('0x5d')],_0x20f2b9[_0xfd52('0x6d')]))[_0xfd52('0x69')]('base64'))};break;default:throw new db['Sequelize']['ValidationError'](_0xfd52('0x6e'));}return rp(_0x2e7ef5);}})[_0xfd52('0x1b')](function(_0xc2fd6f){if(_0xc2fd6f){var _0xbf8200=[_0xfd52('0x6f'),'description',_0xfd52('0x70'),'assignee'];_[_0xfd52('0x71')](_0xc2fd6f['ticket_fields'],function(_0x469d00){return _0xbf8200[_0xfd52('0x72')](_0x469d00[_0xfd52('0x35')]);});return{'count':_0xc2fd6f[_0xfd52('0x66')]['length'],'rows':_[_0xfd52('0x31')](_0xc2fd6f['ticket_fields'],function(_0x2c36c7){return{'id':_0x2c36c7['id'],'name':_0x2c36c7['position']>0x7?_0x2c36c7[_0xfd52('0x73')]:_0x2c36c7[_0xfd52('0x35')],'custom':_0x2c36c7[_0xfd52('0x74')]>0x7?!![]:![],'options':_0x2c36c7['system_field_options']?_0x2c36c7['system_field_options']:_0x2c36c7['custom_field_options']?_0x2c36c7[_0xfd52('0x75')]:[]};})};}})[_0xfd52('0x1b')](respondWithResult(_0x144ffc,null))[_0xfd52('0x24')](function(_0x4d70ab){var _0x678c3=_0x179916[_0xfd52('0x38')][_0xfd52('0x19')]?0x1f4:_0x4d70ab[_0xfd52('0x76')]||0x1f4;logger['error'](_0xfd52('0x77'),'getFields',_0x678c3,JSON[_0xfd52('0x78')](_0x4d70ab));delete _0x4d70ab[_0xfd52('0x2f')];if(_0x678c3===0x191){_0x678c3=0x190;}_0x144ffc[_0xfd52('0x25')](_0x678c3)[_0xfd52('0x30')](_0x179916['query'][_0xfd52('0x19')]?{'message':_0xfd52('0x79'),'statusCode':_0x4d70ab[_0xfd52('0x76')]}:_0x4d70ab);});};