-var _0x2c4e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x53\x65\x71\x75\x65\x6C\x69\x7A\x65","\x75\x74\x69\x6C","\x61\x73\x79\x6E\x63","\x47\x6F\x74\x6F\x49\x66\x54\x69\x6D\x65","\x25\x73\x3F\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73\x3A\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73","\x53\x65\x74","\x43\x41\x4C\x4C\x45\x52\x49\x44\x28\x61\x6C\x6C\x29\x3D\x25\x73","\x44\x69\x61\x6C","\x25\x73\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73","\x4E\x6F\x4F\x70","\x44\x69\x61\x6C\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x41\x6E\x73\x77\x65\x72","","\x51\x75\x65\x75\x65","\x25\x73\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73","\x51\x75\x65\x75\x65\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x50\x6C\x61\x79\x62\x61\x63\x6B","\x25\x73\x2C\x25\x73","\x50\x6C\x61\x79\x62\x61\x63\x6B\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x41\x47\x49","\x61\x67\x69\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x2F\x73\x71\x75\x61\x72\x65\x2C\x25\x73","\x41\x47\x49\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x47\x6F\x74\x6F","\x25\x73\x2C\x25\x73\x2C\x25\x64","\x47\x6F\x74\x6F\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x48\x61\x6E\x67\x75\x70","\x25\x73","\x48\x61\x6E\x67\x75\x70\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x25\x73\x3D\x25\x73","\x53\x65\x74\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x63\x75\x73\x74\x6F\x6D","\x43\x75\x73\x74\x6F\x6D\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77\x42\x79\x52\x6F\x75\x74\x65","\x63\x6F\x6E\x74\x65\x78\x74","\x65\x78\x74\x65\x6E","\x61\x70\x70","\x61\x70\x70\x64\x61\x74\x61","\x70\x65\x72\x5F\x70\x61\x67\x65","\x71\x75\x65\x72\x79","\x70\x61\x67\x65","\x72\x6F\x75\x74\x65","\x70\x61\x72\x61\x6D\x73","\x6F\x72\x64\x65\x72","\x25\x73\x20\x25\x73","\x73\x6F\x72\x74\x5F\x62\x79","\x73\x6F\x72\x74\x5F\x6F\x72\x64\x65\x72","\x41\x53\x43","\x66\x6F\x72\x6D\x61\x74","\x24\x6F\x72","\x77\x68\x65\x72\x65","\x25","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x24","\x24\x6C\x69\x6B\x65","\x66\x6F\x72\x49\x6E","\x53\x6F\x6D\x65\x74\x68\x69\x6E\x67\x20\x62\x6C\x65\x77\x20\x75\x70\x21","\x63\x6F\x75\x6E\x74","\x63\x65\x69\x6C","\x6F\x66\x66\x73\x65\x74","\x25\x73\x3A\x2F\x2F\x25\x73\x25\x73\x3F\x70\x61\x67\x65\x3D\x25\x64","\x70\x72\x6F\x74\x6F\x63\x6F\x6C","\x68\x6F\x73\x74","\x68\x65\x61\x64\x65\x72\x73","\x62\x61\x73\x65\x55\x72\x6C","\x72\x6F\x77\x73","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77\x41\x70\x70\x73\x42\x79\x52\x6F\x75\x74\x65","\x69\x64","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x72\x6F\x75\x74\x65\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x62\x6F\x64\x79","\x74\x79\x70\x65","\x73\x6F\x72\x74\x41\x70\x70\x73\x42\x79\x52\x6F\x75\x74\x65","\x61\x70\x70\x47\x72\x6F\x75\x70","\x69\x73\x41\x70\x70","\x66\x69\x6E\x64","\x63\x6C\x6F\x6E\x65\x44\x65\x65\x70","\x63\x75\x73\x74\x6F\x6D\x41\x70\x70","\x25\x73\x25\x73\x25\x73","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x2A\x2C\x2A\x2C\x2A\x2C\x2A","\x69\x73\x49\x6E\x74\x65\x72\x76\x61\x6C","\x66\x69\x6C\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x70\x6C\x69\x63\x65","\x47\x6F\x74\x6F\x49\x66\x54\x69\x6D\x65\x46\x72\x6F\x6D\x41\x72\x72\x61\x79","\x3F\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73\x3A\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64","\x75\x6E\x73\x68\x69\x66\x74","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x49\x64","\x70\x72\x69\x6F\x72\x69\x74\x79","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x70\x6C\x75\x63\x6B","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x52\x4F\x55\x54\x45","\x6D\x61\x78","\x63\x61\x6C\x6C\x65\x72\x49\x44","\x72\x65\x6D\x6F\x76\x65","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x74\x72\x75\x6E\x6B","\x54\x72\x75\x6E\x6B\x49\x64","\x63\x75\x74\x64\x69\x67\x69\x74\x73","\x69\x6E\x74\x65\x72\x66\x61\x63\x65","\x61\x70\x70\x5F\x6F\x70\x74\x69\x6F\x6E\x73","\x74\x69\x6D\x65\x6F\x75\x74","\x75\x72\x6C","\x2C","\x72\x65\x70\x6C\x61\x63\x65","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x44\x69\x61\x6C\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x61\x75\x64\x69\x6F\x66\x69\x6C\x65","\x71\x75\x65\x75\x65","\x70\x72\x6F\x6A\x65\x63\x74","\x61\x6C\x74\x5F\x70\x72\x69\x6F\x72\x69\x74\x79","\x61\x6C\x74\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x61\x6C\x74\x5F\x63\x6F\x6E\x74\x65\x78\x74","\x63\x61\x75\x73\x65\x63\x6F\x64\x65","\x76\x61\x72\x69\x61\x62\x6C\x65","\x76\x61\x6C\x75\x65","\x6D\x61\x69\x6C\x62\x6F\x78","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79"];_0x2c4e[0];var _=require(_0x2c4e[1]);var VoiceExtension=require(_0x2c4e[3])[_0x2c4e[2]];var Interval=require(_0x2c4e[3])[_0x2c4e[4]];var sequelize=require(_0x2c4e[3])[_0x2c4e[5]];var Sequelize=require(_0x2c4e[3])[_0x2c4e[6]];var util=require(_0x2c4e[7]);var async=require(_0x2c4e[8]);var Applications={Dial:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[11],appdata:_0x2c4e[12]},{app:_0x2c4e[13],appdata:_0x2c4e[14],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[16]}],Queue:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[17],appdata:_0x2c4e[18]},{app:_0x2c4e[19],appdata:_0x2c4e[20],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[21]}],Playback:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[22],appdata:_0x2c4e[23],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[24]}],AGI:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[25],appdata:_0x2c4e[26],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[27]}],Goto:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[28],appdata:_0x2c4e[29],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[30]}],Hangup:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[31],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[33]}],Set:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[11],appdata:_0x2c4e[34],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[35]}],custom:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}],Voicemail:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[38],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[39]}]};exports[_0x2c4e[40]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[45]]()[_0x2c4e[44]](function(_0x234fxc){return _0x234fxa[_0x2c4e[43]](200)[_0x2c4e[42]](_0x234fxc)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[46]]=function(_0x234fx9,_0x234fxa,_0x234fxd){var _0x234fxe=[_0x2c4e[47],_0x2c4e[48],_0x2c4e[49],_0x2c4e[50]];var _0x234fxf=_0x234fx9[_0x2c4e[52]][_0x2c4e[51]]?parseInt(_0x234fx9[_0x2c4e[52]][_0x2c4e[51]],10):100;var _0x234fx10=_0x234fx9[_0x2c4e[52]][_0x2c4e[53]]?parseInt(_0x234fx9[_0x2c4e[52]][_0x2c4e[53]],10):0;var _0x234fx11={where:{type:_0x234fx9[_0x2c4e[55]][_0x2c4e[54]],VoiceExtensionId:null,app:_0x2c4e[15]},limit:_0x234fxf,offset:_0x234fx10*_0x234fxf};_[_0x2c4e[69]](_0x234fx9[_0x2c4e[52]],function(_0x234fx12,_0x234fx13){switch(_0x234fx13){case _0x2c4e[51]:;case _0x2c4e[53]:break ;;case _0x2c4e[58]:_0x234fx11[_0x2c4e[56]]=util[_0x2c4e[61]](_0x2c4e[57],_0x234fx9[_0x2c4e[52]][_0x2c4e[58]],_0x234fx9[_0x2c4e[52]][_0x2c4e[59]]||_0x2c4e[60])||null;break ;;case _0x2c4e[59]:break ;;case _0x2c4e[67]:_0x234fx11[_0x2c4e[63]][_0x2c4e[62]]=[];_0x234fxe[_0x2c4e[66]](function(_0x234fx14){var _0x234fx15={};_0x234fx15[_0x234fx14]={$like:_0x2c4e[64]+_0x234fx12+_0x2c4e[64]};_0x234fx11[_0x2c4e[63]][_0x2c4e[62]][_0x2c4e[65]](_0x234fx15);});break ;;default:_0x234fx11[_0x2c4e[63]][_0x234fx13]={$like:{}};_0x234fx11[_0x2c4e[63]][_0x234fx13][_0x2c4e[68]]=_0x2c4e[64]+_0x234fx12+_0x2c4e[64];;}});VoiceExtension[_0x2c4e[80]](_0x234fx11)[_0x2c4e[44]](function(_0x234fx16){var _0x234fx17=Math[_0x2c4e[72]](_0x234fx16[_0x2c4e[71]]/_0x234fxf);var _0x234fx18=_0x234fx17>(_0x234fx11[_0x2c4e[73]]+1)?util[_0x2c4e[61]](_0x2c4e[74],_0x234fx9[_0x2c4e[75]],_0x234fx9[_0x2c4e[77]][_0x2c4e[76]],_0x234fx9[_0x2c4e[78]],_0x234fx10+1):null;var _0x234fx19=_0x234fx10>0?util[_0x2c4e[61]](_0x2c4e[74],_0x234fx9[_0x2c4e[75]],_0x234fx9[_0x2c4e[77]][_0x2c4e[76]],_0x234fx9[_0x2c4e[78]],_0x234fx10-1):null;_0x234fxa[_0x2c4e[43]](200)[_0x2c4e[42]]({count:_0x234fx16[_0x2c4e[71]],rows:_0x234fx16[_0x2c4e[79]],next_page:_0x234fx18,previous_page:_0x234fx19,total_pages:_0x234fx17});})[_0x2c4e[41]](function(_0x234fxb){_0x234fxa[_0x2c4e[43]](500)[_0x2c4e[42]]({error:_0x2c4e[70]})});};exports[_0x2c4e[81]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[45]]({where:{VoiceExtensionId:_0x234fx9[_0x2c4e[55]][_0x2c4e[82]],isApp:true}})[_0x2c4e[44]](function(_0x234fxc){return _0x234fxa[_0x2c4e[43]](200)[_0x2c4e[42]](_0x234fxc)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[83]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[85]](_0x234fx9[_0x2c4e[55]][_0x2c4e[82]])[_0x2c4e[44]](function(_0x234fx1a){if(!_0x234fx1a){return _0x234fxa[_0x2c4e[84]](404)};return _0x234fxa[_0x2c4e[42]](_0x234fx1a);})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[86]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[45]]({where:{exten:_0x234fx9[_0x2c4e[87]][_0x2c4e[48]],context:_0x234fx9[_0x2c4e[87]][_0x2c4e[47]],type:_0x234fx9[_0x2c4e[87]][_0x2c4e[88]]}})[_0x2c4e[44]](function(_0x234fx1a){if(!_0x234fx1a){return _0x234fxa[_0x2c4e[84]](404)};return _0x234fxa[_0x2c4e[42]](_0x234fx1a);})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[89]]=function(_0x234fx9,_0x234fxa,_0x234fxd){VoiceExtension[_0x2c4e[45]]({where:{appGroup:_0x234fx9[_0x2c4e[87]][_0x2c4e[107]]}})[_0x2c4e[44]](function(_0x234fx1b){return sequelize[_0x2c4e[109]](function(_0x234fx1c){return VoiceExtension[_0x2c4e[108]]({where:{appGroup:_0x234fx9[_0x2c4e[87]][_0x2c4e[107]]}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(){var _0x234fx1d=2;_0x234fx9[_0x2c4e[87]][_0x2c4e[107]][_0x2c4e[66]](function(_0x234fx1e){var _0x234fx1f=_[_0x2c4e[92]](_0x234fx1b,function(_0x234fx20){return (_0x234fx20[_0x2c4e[90]]==_0x234fx1e&&_0x234fx20[_0x2c4e[91]]===true)});var _0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx1f[_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx1f[_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};var _0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx1f[_0x2c4e[47]],_0x234fx1f[_0x2c4e[48]],_0x234fx1d);_0x234fx1f[_0x2c4e[96]]=_0x234fx1f[_0x2c4e[96]]||_0x2c4e[97];var _0x234fx23=_[_0x2c4e[99]](_0x234fx1b,function(_0x234fx20){return (_0x234fx20[_0x2c4e[90]]==_0x234fx1e&&_0x234fx20[_0x2c4e[98]]===true)});if(_0x234fx23&&_0x234fx23[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx23[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[104]]?_0x234fx20[_0x2c4e[104]]:null,isInterval:true,interval:_0x234fx20[_0x2c4e[96]]})});};_0x234fx1d=appCreate(_0x234fx21,_0x234fx1f,_0x234fx22,_0x234fx23||[],_0x234fx1d);return VoiceExtension[_0x2c4e[106]](_0x234fx21,{transaction:_0x234fx1c});});})})[_0x2c4e[44]](function(){return _0x234fxa[_0x2c4e[84]](201)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})})[_0x2c4e[41]](function(_0x234fxb){return _0x234fxd(_0x234fxb)})};exports[_0x2c4e[110]]=function(_0x234fx9,_0x234fxa,_0x234fxd){var _0x234fx21;var _0x234fx22;var _0x234fx25;VoiceExtension[_0x2c4e[116]](_0x2c4e[112],{where:{VoiceExtensionId:_0x234fx9[_0x2c4e[87]][_0x2c4e[111]]}})[_0x2c4e[44]](function(_0x234fx26){if(_0x234fx9[_0x2c4e[87]][_0x2c4e[111]]){_0x234fx9[_0x2c4e[87]][_0x2c4e[112]]=_0x234fx26?++_0x234fx26:2;_0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx9[_0x2c4e[87]][_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx9[_0x2c4e[87]][_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};_0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx9[_0x2c4e[87]][_0x2c4e[47]],_0x234fx9[_0x2c4e[87]][_0x2c4e[48]],_0x234fx9[_0x2c4e[87]][_0x2c4e[112]]);_0x234fx9[_0x2c4e[87]][_0x2c4e[96]]=_0x234fx9[_0x2c4e[87]][_0x2c4e[96]]||_0x2c4e[97];Interval[_0x2c4e[45]]({where:{IntervalId:(_0x234fx9[_0x2c4e[87]][_0x2c4e[104]]!==null)?_0x234fx9[_0x2c4e[87]][_0x2c4e[104]]:0}})[_0x2c4e[44]](function(_0x234fx27){var _0x234fx28=[];var _0x234fx29;if(_0x234fx27&&_0x234fx27[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx28=_[_0x2c4e[114]](_0x234fx27,_0x2c4e[113]);_0x234fx28[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[82]],interval:_0x234fx29,isInterval:true})});};appCreate(_0x234fx21,_0x234fx9[_0x2c4e[87]],_0x234fx22,_0x234fx28);VoiceExtension[_0x2c4e[106]](_0x234fx21)[_0x2c4e[44]](function(_0x234fx2a){return _0x234fxa[_0x2c4e[43]](201)[_0x2c4e[42]](_0x234fx2a)});});}else {VoiceExtension[_0x2c4e[45]]({where:{exten:_0x234fx9[_0x2c4e[87]][_0x2c4e[48]],context:_0x234fx9[_0x2c4e[87]][_0x2c4e[47]],type:_0x234fx9[_0x2c4e[87]][_0x2c4e[88]]}})[_0x2c4e[44]](function(_0x234fx2b){if(!_0x234fx2b){return _0x234fxa[_0x2c4e[84]](404)};if(_0x234fx2b[_0x2c4e[100]]>0){return _0x234fxa[_0x2c4e[43]](500)[_0x2c4e[42]]({message:_0x2c4e[115]})};_0x234fx9[_0x2c4e[87]][_0x2c4e[112]]=1;VoiceExtension[_0x2c4e[110]](_0x234fx9[_0x2c4e[87]])[_0x2c4e[44]](function(_0x234fx2a){return _0x234fxa[_0x2c4e[43]](201)[_0x2c4e[42]](_0x234fx2a)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})}})[_0x2c4e[41]](function(_0x234fxb){_0x234fxd(_0x234fxb)});};function appCreate(_0x234fx21,_0x234fx2d,_0x234fx22,_0x234fx28,_0x234fx1d){var _0x234fx2e=_0x234fx28[_0x2c4e[100]];if(_0x234fx2d[_0x2c4e[94]]){_0x234fx2d[_0x2c4e[49]]=_0x2c4e[36]};switch(_0x234fx2d[_0x2c4e[49]]){case _0x2c4e[13]:if(!_0x234fx2d[_0x2c4e[117]]){_[_0x2c4e[118]](_0x234fx21,{app:_0x2c4e[11]})};_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[13]:if(_0x234fx2d[_0x2c4e[88]]===_0x2c4e[119]){_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[120]]=_0x234fx2d[_0x2c4e[120]];_0x234fx20[_0x2c4e[121]]=_0x234fx2d[_0x2c4e[121]];_0x234fx20[_0x2c4e[122]]=_0x234fx2d[_0x2c4e[122]]||0;_0x234fx20[_0x2c4e[117]]=_0x234fx2d[_0x2c4e[117]]||null;}else {_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[123]]=_0x234fx2d[_0x2c4e[123]];_0x234fx20[_0x2c4e[124]]=_0x234fx2d[_0x2c4e[124]]||_0x2c4e[18];_0x234fx20[_0x2c4e[125]]=_0x234fx2d[_0x2c4e[125]]||_0x2c4e[18];_0x234fx20[_0x2c4e[126]]=_0x234fx2d[_0x2c4e[126]]||_0x2c4e[18];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[123]],_0x234fx20[_0x2c4e[125]],_0x234fx20[_0x2c4e[124]]?_0x234fx20[_0x2c4e[124]][_0x2c4e[128]](_0x2c4e[127],_0x2c4e[18]):_0x2c4e[18],_0x234fx20[_0x2c4e[126]]);};break ;;case _0x2c4e[11]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[117]]);break ;;case _0x2c4e[15]:if(_0x234fx2d[_0x2c4e[88]]===_0x2c4e[119]){_0x234fx20[_0x2c4e[50]]=_0x2c4e[129]};break ;;default:;};});break ;;case _0x2c4e[19]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[19]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[124]]=_0x234fx2d[_0x2c4e[124]]||_0x2c4e[18];_0x234fx20[_0x2c4e[130]]=_0x234fx2d[_0x2c4e[130]]||_0x2c4e[18];_0x234fx20[_0x2c4e[131]]=_0x234fx2d[_0x2c4e[131]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[123]]=_0x234fx2d[_0x2c4e[123]];_0x234fx20[_0x2c4e[124]]=_0x234fx2d[_0x2c4e[124]];_0x234fx20[_0x2c4e[125]]=_0x234fx2d[_0x2c4e[125]]||_0x2c4e[18];_0x234fx20[_0x2c4e[126]]=_0x234fx2d[_0x2c4e[126]]||_0x2c4e[18];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[131]],_0x234fx20[_0x2c4e[124]]?_0x234fx20[_0x2c4e[124]][_0x2c4e[128]](_0x2c4e[127],_0x2c4e[18]):_0x2c4e[18],_0x234fx20[_0x2c4e[126]],_0x234fx20[_0x2c4e[130]],_0x234fx20[_0x2c4e[125]]);break ;;default:;};});break ;;case _0x2c4e[22]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[22]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[130]]=_0x234fx2d[_0x2c4e[130]]||_0x2c4e[18];_0x234fx20[_0x2c4e[124]]=_0x234fx2d[_0x2c4e[124]]||_0x2c4e[18];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[130]],_0x234fx20[_0x2c4e[124]]?_0x234fx20[_0x2c4e[124]][_0x2c4e[128]](_0x2c4e[127],_0x2c4e[18]):_0x2c4e[18]);break ;;default:;};});break ;;case _0x2c4e[25]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[25]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[132]]=_0x234fx2d[_0x2c4e[132]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[132]]);break ;;default:;};});break ;;case _0x2c4e[28]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[28]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[133]]=_0x234fx2d[_0x2c4e[133]];_0x234fx20[_0x2c4e[134]]=_0x234fx2d[_0x2c4e[134]];_0x234fx20[_0x2c4e[135]]=_0x234fx2d[_0x2c4e[135]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[135]],_0x234fx20[_0x2c4e[134]],_0x234fx20[_0x2c4e[133]]);break ;;default:;};});break ;;case _0x2c4e[31]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[31]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[136]]=_0x234fx2d[_0x2c4e[136]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[136]]);break ;;default:;};});break ;;case _0x2c4e[11]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[11]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[137]]=_0x234fx2d[_0x2c4e[137]];_0x234fx20[_0x2c4e[138]]=_0x234fx2d[_0x2c4e[138]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[137]],_0x234fx20[_0x2c4e[138]]);break ;;default:;};});break ;;case _0x2c4e[36]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[36]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[49]]=_0x234fx20[_0x2c4e[94]]=_0x234fx2d[_0x2c4e[94]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[50]]);break ;;default:;};});break ;;case _0x2c4e[38]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[38]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[139]]=_0x234fx2d[_0x2c4e[139]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[139]]);break ;;default:;};});break ;;default:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[36]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[49]]=_0x234fx20[_0x2c4e[94]]=_0x234fx2d[_0x2c4e[94]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[50]]);break ;;default:;};});;};if(_0x234fx1d){return _0x234fx1d};}exports[_0x2c4e[140]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[45]]({where:{exten:_0x234fx9[_0x2c4e[87]][_0x2c4e[48]],context:_0x234fx9[_0x2c4e[87]][_0x2c4e[47]],type:_0x234fx9[_0x2c4e[87]][_0x2c4e[88]],VoiceExtensionId:null,id:{$ne:_0x234fx9[_0x2c4e[87]][_0x2c4e[82]]}}})[_0x2c4e[44]](function(_0x234fx2b){if(!_0x234fx2b){return _0x234fxa[_0x2c4e[84]](404)};if(_0x234fx2b[_0x2c4e[100]]>0){return _0x234fxa[_0x2c4e[43]](500)[_0x2c4e[42]]({message:_0x2c4e[115]})};if(_0x234fx9[_0x2c4e[87]][_0x2c4e[82]]){delete _0x234fx9[_0x2c4e[87]][_0x2c4e[82]]};VoiceExtension[_0x2c4e[92]]({where:{id:_0x234fx9[_0x2c4e[55]][_0x2c4e[82]]}})[_0x2c4e[44]](function(_0x234fx1a){if(!_0x234fx1a){return _0x234fxa[_0x2c4e[84]](404)};var _0x234fx2f=_[_0x2c4e[141]](_0x234fx1a,_0x234fx9[_0x2c4e[87]]);return sequelize[_0x2c4e[109]](function(_0x234fx1c){return _0x234fx2f[_0x2c4e[142]]({transaction:_0x234fx1c})[_0x2c4e[44]](function(_0x234fx30){VoiceExtension[_0x2c4e[45]]({where:{VoiceExtensionId:_0x234fx30[_0x2c4e[82]],isApp:true}})[_0x2c4e[44]](function(_0x234fx2a){return VoiceExtension[_0x2c4e[108]]({where:{VoiceExtensionId:_0x234fx30[_0x2c4e[82]]}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(){_0x234fx2a=_[_0x2c4e[114]](_0x234fx2a,_0x2c4e[113]);var _0x234fx31=_[_0x2c4e[99]](_[_0x2c4e[114]](_0x234fx2a,_0x2c4e[104]),function(_0x234fx20){return _0x234fx20!==null});Interval[_0x2c4e[45]]({where:{IntervalId:_0x234fx31}})[_0x2c4e[44]](function(_0x234fx28){var _0x234fx1d=2;var _0x234fx25;_0x234fx2a[_0x2c4e[66]](function(_0x234fx1f){var _0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx1f[_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx1f[_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};_0x234fx1f[_0x2c4e[47]]=_0x234fx30[_0x2c4e[47]];_0x234fx1f[_0x2c4e[48]]=_0x234fx30[_0x2c4e[48]];var _0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx1f[_0x2c4e[47]],_0x234fx1f[_0x2c4e[48]],_0x234fx1d);_0x234fx1f[_0x2c4e[96]]=_0x234fx1f[_0x2c4e[96]]||_0x2c4e[97];var _0x234fx23=_[_0x2c4e[99]](_0x234fx28,function(_0x234fx20){return (_0x234fx20[_0x2c4e[104]]==_0x234fx1f[_0x2c4e[104]])});if(_0x234fx23&&_0x234fx23[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx23[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[82]],isInterval:true,interval:_0x234fx20[_0x2c4e[96]]})});};_0x234fx1d=appCreate(_0x234fx21,_0x234fx1f,_0x234fx22,_0x234fx23||[],_0x234fx1d);VoiceExtension[_0x2c4e[106]](_0x234fx21);});return _0x234fxa[_0x2c4e[84]](200);});})})})})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[143]]=function(_0x234fx9,_0x234fxa,_0x234fxd){var _0x234fx25;if(_0x234fx9[_0x2c4e[87]][_0x2c4e[50]]){delete _0x234fx9[_0x2c4e[87]][_0x2c4e[50]]};VoiceExtension[_0x2c4e[85]](_0x234fx9[_0x2c4e[87]][_0x2c4e[82]])[_0x2c4e[44]](function(_0x234fx32){if(!_0x234fx32){return _0x234fxa[_0x2c4e[84]](404)};delete _0x234fx9[_0x2c4e[87]][_0x2c4e[82]];var _0x234fx2f=_[_0x2c4e[141]](_0x234fx32,_0x234fx9[_0x2c4e[87]]);return sequelize[_0x2c4e[109]](function(_0x234fx1c){return _0x234fx2f[_0x2c4e[142]]({transaction:_0x234fx1c})[_0x2c4e[44]](function(){VoiceExtension[_0x2c4e[45]]({where:{VoiceExtensionId:_0x234fx9[_0x2c4e[87]][_0x2c4e[111]],isApp:true}})[_0x2c4e[44]](function(_0x234fx2a){return VoiceExtension[_0x2c4e[108]]({where:{VoiceExtensionId:_0x234fx9[_0x2c4e[87]][_0x2c4e[111]]}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(){_0x234fx2a=_[_0x2c4e[114]](_0x234fx2a,_0x2c4e[113]);var _0x234fx31=_[_0x2c4e[99]](_[_0x2c4e[114]](_0x234fx2a,_0x2c4e[104]),function(_0x234fx20){return _0x234fx20!==null});return Interval[_0x2c4e[45]]({where:{IntervalId:_0x234fx31}})[_0x2c4e[44]](function(_0x234fx28){var _0x234fx1d=2;var _0x234fx25;_0x234fx2a[_0x2c4e[66]](function(_0x234fx1f){var _0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx1f[_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx1f[_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};var _0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx1f[_0x2c4e[47]],_0x234fx1f[_0x2c4e[48]],_0x234fx1d);_0x234fx1f[_0x2c4e[96]]=_0x234fx1f[_0x2c4e[96]]||_0x2c4e[97];var _0x234fx23=_[_0x2c4e[99]](_0x234fx28,function(_0x234fx20){return (_0x234fx20[_0x2c4e[104]]==_0x234fx1f[_0x2c4e[104]])});if(_0x234fx23&&_0x234fx23[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx23[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[82]],isInterval:true,interval:_0x234fx20[_0x2c4e[96]]})});};_0x234fx1d=appCreate(_0x234fx21,_0x234fx1f,_0x234fx22,_0x234fx23||[],_0x234fx1d);VoiceExtension[_0x2c4e[106]](_0x234fx21);});});})})})})[_0x2c4e[44]](function(_0x234fx16){return _0x234fxa[_0x2c4e[43]](201)[_0x2c4e[42]](_0x234fx16)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});};exports[_0x2c4e[108]]=function(_0x234fx9,_0x234fxa,_0x234fxd){VoiceExtension[_0x2c4e[85]](_0x234fx9[_0x2c4e[55]][_0x2c4e[82]])[_0x2c4e[44]](function(_0x234fx1a){if(!_0x234fx1a){return _0x234fxa[_0x2c4e[84]](404)};if(!_0x234fx1a[_0x2c4e[111]]){_0x234fx1a[_0x2c4e[108]]()[_0x2c4e[44]](function(){return _0x234fxa[_0x2c4e[84]](204)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})}else {VoiceExtension[_0x2c4e[45]]({where:{appGroup:_0x234fx1a[_0x2c4e[90]]}})[_0x2c4e[44]](function(_0x234fxc){if(!_0x234fxc){return _0x234fxa[_0x2c4e[84]](404)};return sequelize[_0x2c4e[109]](function(_0x234fx1c){return VoiceExtension[_0x2c4e[108]]({where:{appGroup:_0x234fx1a[_0x2c4e[90]]}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(_0x234fx33){return VoiceExtension[_0x2c4e[45]]({where:{VoiceExtensionId:_0x234fx1a[_0x2c4e[111]],priority:{$gt:_0x234fxc[_0x234fx33-1][_0x2c4e[112]]}}})[_0x2c4e[44]](function(_0x234fx1b){return VoiceExtension[_0x2c4e[108]]({where:{VoiceExtensionId:_0x234fx1a[_0x2c4e[111]],priority:{$gt:_0x234fxc[_0x234fx33-1][_0x2c4e[112]]}}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(){var _0x234fx34=_[_0x2c4e[114]](_[_0x2c4e[99]](_[_0x2c4e[114]](_0x234fx1b,_0x2c4e[113]),function(_0x234fx20){return _0x234fx20[_0x2c4e[91]]===true}),_0x2c4e[90]);var _0x234fx1d=_0x234fxc[0][_0x2c4e[112]];_0x234fx34[_0x2c4e[66]](function(_0x234fx1e){var _0x234fx1f=_[_0x2c4e[92]](_0x234fx1b,function(_0x234fx20){return (_0x234fx20[_0x2c4e[90]]==_0x234fx1e&&_0x234fx20[_0x2c4e[91]]===true)});var _0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx1f[_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx1f[_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};var _0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx1f[_0x2c4e[47]],_0x234fx1f[_0x2c4e[48]],_0x234fx1d);_0x234fx1f[_0x2c4e[96]]=_0x234fx1f[_0x2c4e[96]]||_0x2c4e[97];var _0x234fx23=_[_0x2c4e[99]](_0x234fx1b,function(_0x234fx20){return (_0x234fx20[_0x2c4e[90]]==_0x234fx1e&&_0x234fx20[_0x2c4e[98]]===true)});if(_0x234fx23&&_0x234fx23[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx23[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[104]]?_0x234fx20[_0x2c4e[104]]:null,isInterval:true,interval:_0x234fx20[_0x2c4e[96]]})});};_0x234fx1d=appCreate(_0x234fx21,_0x234fx1f,_0x234fx22,_0x234fx23||[],_0x234fx1d);VoiceExtension[_0x2c4e[106]](_0x234fx21);});})})})})[_0x2c4e[44]](function(_0x234fx16){_0x234fxa[_0x2c4e[84]](201)})[_0x2c4e[41]](function(_0x234fxb){return _0x234fxd(_0x234fxb)});})};})[_0x2c4e[41]](function(_0x234fxb){return _0x234fxd(_0x234fxb)})};exports[_0x2c4e[144]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[108]]({where:{id:_0x234fx9[_0x2c4e[52]][_0x2c4e[82]]},individualHooks:true})[_0x2c4e[44]](function(){return _0x234fxa[_0x2c4e[84]](204)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};function handleError(_0x234fxa,_0x234fxb){return _0x234fxa[_0x2c4e[43]](500)[_0x2c4e[42]](_0x234fxb)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var VoiceExtension = require('../../models').VoiceExtension;
+var Interval = require('../../models').Interval;
+var sequelize = require('../../models').sequelize;
+var Sequelize = require('../../models').Sequelize;
+var util = require('util');
+var async = require('async');
+
+var Applications = {
+ Dial: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'Set',
+ appdata: 'CALLERID(all)=%s'
+ }, {
+ app: 'Dial',
+ appdata: '%s,%s,%s,%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Dial Application End'
+ }],
+ Queue: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'Answer',
+ appdata: ''
+ }, {
+ app: 'Queue',
+ appdata: '%s,%s,%s,%s,%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Queue Application End'
+ }],
+ Playback: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'Playback',
+ appdata: '%s,%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Playback Application End'
+ }],
+ AGI: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'AGI',
+ appdata: 'agi://127.0.0.1/square,%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'AGI Application End'
+ }],
+ Goto: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'Goto',
+ appdata: '%s,%s,%d',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Goto Application End'
+ }],
+ Hangup: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'Hangup',
+ appdata: '%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Hangup Application End'
+ }],
+ Set: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'Set',
+ appdata: '%s=%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Set Application End'
+ }],
+ custom: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'custom',
+ appdata: '%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Custom Application End'
+ }],
+ Voicemail: [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'Voicemail',
+ appdata: '%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Voicemail Application End'
+ }]
+};
+
+// Get list of voice_extensions
+exports.index = function(req, res) {
+ VoiceExtension
+ .findAll()
+ .then(function(voice_extensions) {
+ return res.status(200).send(voice_extensions);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+};
+
+// Get list of agents
+exports.showByRoute = function(req, res, next) {
+
+ var attributes = ['context', 'exten', 'app', 'appdata'];
+ var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
+ var page = req.query.page ? parseInt(req.query.page, 10) : 0;
+
+ var query = {
+ where: {
+ type: req.params.route,
+ VoiceExtensionId: null,
+ app: 'NoOp'
+ },
+ limit: per_page,
+ offset: page * per_page
+ };
+
+ _.forIn(req.query, function(value, key) {
+ switch (key) {
+ case 'per_page':
+ case 'page':
+ break;
+ case 'sort_by':
+ query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
+ break;
+ case 'sort_order':
+ break;
+ case '$':
+ query.where.$or = [];
+ attributes.forEach(function(attribute) {
+ var tmp = {};
+ tmp[attribute] = {
+ $like: '%' + value + '%'
+ };
+
+ query.where.$or.push(tmp);
+ });
+ break;
+ default:
+ query.where[key] = {
+ $like: {}
+ };
+ query.where[key].$like = '%' + value + '%';
+ }
+ });
+
+ VoiceExtension
+ .findAndCountAll(query)
+ .then(function(result) {
+
+ var total_pages = Math.ceil(result.count / per_page);
+ var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
+ var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
+
+ res.status(200).send({
+ count: result.count,
+ rows: result.rows,
+ next_page: next_page,
+ previous_page: previous_page,
+ total_pages: total_pages
+ });
+
+ })
+ .catch(function(err) {
+ res.status(500).send({
+ error: 'Something blew up!'
+ });
+ });
+};
+
+
+// Get list of voice_extensions by route
+exports.showAppsByRoute = function(req, res) {
+ VoiceExtension
+ .findAll({
+ where: {
+ VoiceExtensionId: req.params.id,
+ isApp: true
+ }
+ })
+ .then(function(voice_extensions) {
+ return res.status(200).send(voice_extensions);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+};
+
+// Get a single voice_extension or application
+exports.show = function(req, res) {
+ VoiceExtension
+ .findById(req.params.id)
+ .then(function(voice_extension) {
+ if (!voice_extension) {
+ return res.sendStatus(404);
+ }
+ return res.send(voice_extension);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+};
+
+// Validate the existence of a route
+exports.routeValidation = function(req, res) {
+ VoiceExtension
+ .findAll({
+ where: {
+ exten: req.body.exten,
+ context: req.body.context,
+ type: req.body.type
+ }
+ })
+ .then(function(voice_extension) {
+ if (!voice_extension) {
+ return res.sendStatus(404);
+ }
+ return res.send(voice_extension);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+};
+
+// exports.sortAppsByRoute = function(req, res, next) {
+// return sequelize
+// .transaction()
+// .then(function(t) {
+// async.waterfall([
+// function(callback) {
+// VoiceExtension
+// .findAll({
+// where: {
+// appGroup: req.body.applications
+// }
+// })
+// .then(function(voiceApplications) {
+// callback(null, voiceApplications);
+// })
+// .catch(function(err) {
+// callback(err);
+// });
+// },
+// function(voiceApplications, callback) {
+// console.log('found ad saved applications');
+// console.log('destroying old applications from db');
+// return VoiceExtension.destroy({
+// where: {
+// appGroup: req.body.applications
+// }
+// }, {
+// transaction: t
+// })
+// .then(function() {
+// callback(null, voiceApplications);
+// })
+// .catch(function(err) {
+// callback(err);
+// });
+// },
+// function(voiceApplications, callback) {
+// console.log('destroyed old applications from db');
+// var priority = 2;
+// console.log('iterating sorted applications ids');
+// req.body.applications.forEach(function(sortedElem) {
+// var tmpElem = _.find(voiceApplications, function(elem) {
+// return (elem.appGroup == sortedElem && elem.isApp === true);
+// });
+// var application = _.cloneDeep(Applications[tmpElem.app]);
+// if (!application || tmpElem.customApp) {
+// application = [{
+// app: 'GotoIfTime',
+// appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+// }, {
+// app: 'custom',
+// appdata: '%s',
+// isApp: true
+// }, {
+// app: 'NoOp',
+// appdata: 'Custom Application End'
+// }];
+// }
+// //console.log('PRIORITY');
+// //console.log(priority);
+// var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+// tmpElem.interval = tmpElem.interval || '*,*,*,*';
+// var tmpIntervals = _.filter(voiceApplications, function(elem) {
+// return (elem.appGroup == sortedElem && elem.isInterval === true);
+// });
+// if (tmpIntervals && tmpIntervals.length > 0) {
+// console.log('found custom interval, adding to app');
+// application.splice(0, 1);
+// tmpIntervals.forEach(function(elem, index) {
+//
+// application.unshift({
+// app: 'GotoIfTimeFromArray',
+// appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+// IntervalId: elem.IntervalId ? elem.IntervalId : null,
+// isInterval: true,
+// interval: elem.interval,
+// });
+// })
+// }
+// priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+// //console.log('returned priority');
+// //console.log(priority);
+// console.log('creating group of extensions');
+// return VoiceExtension
+// .bulkCreate(application, {
+// transaction: t
+// })
+// });
+// callback();
+// }
+// ],
+// function(err, result) {
+// if (err) {
+// console.log(err);
+// t.rollback();
+// } else {
+// console.log('commit');
+// t.commit();
+// console.log('finished creating, now searching the sorted and saved apps');
+// VoiceExtension
+// .findAll({
+// where: {
+// VoiceExtensionId: req.params.id,
+// isApp: true
+// }
+// })
+// .then(function(voiceExtensions) {
+// console.log('found sorted applications, returning');
+// //console.log(_.pluck(voiceExtensions, 'dataValues'));
+// return res.status(201).send(voiceExtensions);
+// })
+// }
+// });
+// });
+// }
+
+exports.sortAppsByRoute = function(req, res, next) {
+ // console.log('finding and saving old applications');
+ VoiceExtension
+ .findAll({
+ where: {
+ appGroup: req.body.applications
+ }
+ })
+ .then(function(voiceApplications) {
+ // console.log('found ad saved applications');
+ return sequelize.transaction(function(t) {
+ // console.log('destroying old applications from db');
+ return VoiceExtension.destroy({
+ where: {
+ appGroup: req.body.applications
+ }
+ }, {
+ transaction: t
+ })
+ .then(function() {
+ var priority = 2;
+ req.body.applications.forEach(function(sortedElem) {
+ var tmpElem = _.find(voiceApplications, function(elem) {
+ return (elem.appGroup == sortedElem && elem.isApp === true);
+ });
+ var application = _.cloneDeep(Applications[tmpElem.app]);
+ if (!application || tmpElem.customApp) {
+ application = [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'custom',
+ appdata: '%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Custom Application End'
+ }];
+ }
+ var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+ tmpElem.interval = tmpElem.interval || '*,*,*,*';
+ var tmpIntervals = _.filter(voiceApplications, function(elem) {
+ return (elem.appGroup == sortedElem && elem.isInterval === true);
+ });
+ if (tmpIntervals && tmpIntervals.length > 0) {
+ // console.log('found custom interval, adding to app');
+ application.splice(0, 1);
+ tmpIntervals.forEach(function(elem, index) {
+
+ application.unshift({
+ app: 'GotoIfTimeFromArray',
+ appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ IntervalId: elem.IntervalId ? elem.IntervalId : null,
+ isInterval: true,
+ interval: elem.interval,
+ });
+ })
+ }
+ priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+ //console.log('returned priority');
+ //console.log(priority);
+ // console.log('creating group of extensions');
+ return VoiceExtension
+ .bulkCreate(application, {
+ transaction: t
+ })
+ });
+ })
+ })
+ .then(function() {
+ // console.log('finished creating, now searching the sorted and saved apps');
+ // VoiceExtension
+ // .findAll({
+ // where: {
+ // VoiceExtensionId: req.params.id,
+ // isApp: true
+ // }
+ // })
+ // .then(function(voiceExtensions) {
+ // console.log('found sorted applications, returning');
+ // //console.log(_.pluck(voiceExtensions, 'dataValues'));
+ // return res.status(201).send(voiceExtensions);
+ // })
+ return res.sendStatus(201);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+ })
+ .catch(function(err) {
+ return next(err);
+ });
+};
+
+// // Creates a new voice_extension in the DB.
+// exports.create = function(req, res) {
+// VoiceExtension
+// .create(req.body)
+// .then(function(voice_extension) {
+// return res.status(201).send(voice_extension);
+// })
+// .catch(function(err) {
+// return handleError(res, err);
+// });
+// };
+
+// Creates a new voiceApplication in the DB.
+exports.create = function(req, res, next) {
+ // //console.log(req.body);
+ var application;
+ var appGroup;
+ var interval;
+ VoiceExtension
+ .max('priority', {
+ where: {
+ VoiceExtensionId: req.body.VoiceExtensionId
+ }
+ }).then(function(max) {
+ // SET PRIORITY
+ if (req.body.VoiceExtensionId) {
+ req.body.priority = max ? ++max : 2;
+ application = _.cloneDeep(Applications[req.body.app]);
+ if (!application || req.body.customApp) {
+ application = [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'custom',
+ appdata: '%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Custom Application End'
+ }];
+ }
+ appGroup = util.format('%s%s%s', req.body.context, req.body.exten, req.body.priority);
+ // interval = createInterval(req.body);
+
+
+ req.body.interval = req.body.interval || '*,*,*,*';
+ Interval
+ .findAll({
+ where: {
+ IntervalId: (req.body.IntervalId !== null) ? req.body.IntervalId : 0
+ }
+ })
+ .then(function(Intervals) {
+ var intervals = [];
+ var gotoInterval;
+ if (Intervals && Intervals.length > 0) {
+ application.splice(0, 1);
+ intervals = _.pluck(Intervals, 'dataValues');
+ intervals.forEach(function(elem, index) {
+ // gotoInterval = createInterval(elem);
+ application.unshift({
+ app: 'GotoIfTimeFromArray',
+ appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ IntervalId: elem.id,
+ interval: gotoInterval,
+ isInterval: true
+ });
+ })
+ }
+ appCreate(application, req.body, appGroup, intervals);
+ VoiceExtension
+ .bulkCreate(application)
+ .then(function(voiceExtensions) {
+ return res.status(201).send(voiceExtensions);
+ })
+ })
+ } else {
+ VoiceExtension
+ .findAll({
+ where: {
+ exten: req.body.exten,
+ context: req.body.context,
+ type: req.body.type,
+ }
+ })
+ .then(function(existingExtensions) {
+ //console.log(existingExtensions);
+ //console.log('Finding app row.....');
+ if (!existingExtensions) {
+ return res.sendStatus(404);
+ }
+ if (existingExtensions.length > 0) {
+ return res.status(500).send({
+ message: 'MESSAGE_EXIST_ROUTE'
+ });
+ }
+ req.body.priority = 1;
+ VoiceExtension
+ .create(req.body)
+ .then(function(voiceExtensions) {
+ return res.status(201).send(voiceExtensions);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ })
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+ }
+ // //console.log(application);
+
+ })
+ .catch(function(err) {
+ next(err);
+ });
+};
+
+// function createInterval(element) {
+// var interval = [];
+// if (element.t_from && element.t_from !== '') {
+// interval[0] = element.t_from;
+// if (element.t_to && element.t_to !== '') {
+// interval[0] += '-' + element.t_to;
+// }
+// } else {
+// interval[0] = '*';
+// }
+//
+// if (element.wd_from && element.wd_from !== '') {
+// interval[1] = element.wd_from;
+// if (element.wd_to && element.wd_to !== '') {
+// interval[1] += '-' + element.wd_to;
+// }
+// } else {
+// interval[1] = '*';
+// }
+//
+// if (element.md_from && element.md_from !== '') {
+// interval[2] = element.md_from;
+// if (element.md_to && element.md_to !== '') {
+// interval[2] += '-' + element.md_to;
+// }
+// } else {
+// interval[2] = '*';
+// }
+//
+// if (element.m_from && element.m_from !== '') {
+// interval[3] = element.m_from;
+// if (element.m_to && element.m_to !== '') {
+// interval[3] += '-' + element.m_to;
+// }
+// } else {
+// interval[3] = '*';
+// }
+//
+// return interval.join(',');
+// }
+
+function appCreate(application, element, appGroup, intervals, priority) {
+ var intLength = intervals.length;
+ if (element.customApp) {
+ element.app = 'custom'; //in questo modo posso rimuovere il default dello switch, ma lo lascio per completezza
+ }
+ switch (element.app) {
+ case 'Dial':
+ if (!element.callerID) {
+ _.remove(application, {
+ app: 'Set'
+ });
+ }
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'Dial':
+ if (element.type === 'outbound') {
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.trunk = element.trunk;
+ elem.TrunkId = element.TrunkId;
+ elem.cutdigits = element.cutdigits || 0;
+ elem.callerID = element.callerID || null;
+ // elem.appdata = util.format('SIP/${EXTEN:%d}@%s', elem.cutdigits, elem.trunk);
+ } else {
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.interface = element.interface;
+ elem.app_options = element.app_options || '';
+ elem.timeout = element.timeout || '';
+ elem.url = element.url || '';
+ elem.appdata = util.format(elem.appdata, element.interface, elem.timeout, elem.app_options ? elem.app_options.replace(',', '') : '', elem.url);
+ }
+ break;
+ case 'Set':
+ elem.appdata = util.format(elem.appdata, element.callerID);
+ break;
+ case 'NoOp':
+ if (element.type === 'outbound') {
+ elem.appdata = 'Outbound Dial Application End';
+ }
+ break;
+ default:
+
+ }
+ });
+ break;
+ case 'Queue':
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'Queue':
+ elem.IntervalId = element.IntervalId;
+ elem.app_options = element.app_options || '';
+ elem.audiofile = element.audiofile || '';
+ elem.queue = element.queue;
+ elem.interval = element.interval;
+ elem.interface = element.interface;
+ elem.app_options = element.app_options;
+ elem.timeout = element.timeout || '';
+ elem.url = element.url || '';
+ elem.appdata = util.format(elem.appdata, elem.queue, elem.app_options ? elem.app_options.replace(',', '') : '', elem.url, elem.audiofile, elem.timeout);
+ break;
+ default:
+
+ }
+ });
+ break;
+ case 'Playback':
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'Playback':
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.audiofile = element.audiofile || '';
+ elem.app_options = element.app_options || '';
+ elem.appdata = util.format(elem.appdata, elem.audiofile, elem.app_options ? elem.app_options.replace(',', '') : '');
+ break;
+ default:
+
+ }
+ });
+ break;
+ case 'AGI':
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'AGI':
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.project = element.project;
+ elem.appdata = util.format(elem.appdata, elem.project);
+ break;
+ default:
+
+ }
+ });
+ break;
+ case 'Goto':
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'Goto':
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.alt_priority = element.alt_priority;
+ elem.alt_extension = element.alt_extension;
+ elem.alt_context = element.alt_context;
+ elem.appdata = util.format(elem.appdata, elem.alt_context, elem.alt_extension, elem.alt_priority);
+ break;
+ default:
+
+ }
+ });
+ break;
+ case 'Hangup':
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'Hangup':
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.causecode = element.causecode;
+ elem.appdata = util.format(elem.appdata, elem.causecode);
+ break;
+ default:
+
+ }
+ });
+ break;
+ case 'Set':
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'Set':
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.variable = element.variable;
+ elem.value = element.value;
+ elem.appdata = util.format(elem.appdata, elem.variable, elem.value);
+ break;
+ default:
+
+ }
+ });
+ break;
+ case 'custom':
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'custom':
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.app = elem.customApp = element.customApp;
+ elem.appdata = util.format(elem.appdata, element.appdata);
+ break;
+ default:
+
+ }
+ });
+ break;
+ case 'Voicemail':
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'Voicemail':
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.mailbox = element.mailbox;
+ elem.appdata = util.format(elem.appdata, elem.mailbox);
+ break;
+ default:
+
+ }
+ });
+ break;
+ default:
+ application.forEach(function(elem, index) {
+ elem.exten = element.exten;
+ elem.type = element.type;
+ elem.context = element.context;
+ elem.VoiceExtensionId = element.VoiceExtensionId;
+ elem.priority = priority ? priority++ : element.priority++;
+ elem.appGroup = appGroup;
+ switch (elem.app) {
+ case 'GotoIfTime':
+ elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+ break;
+ case 'GotoIfTimeFromArray':
+ elem.app = 'GotoIfTime';
+ elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+ break;
+ case 'custom':
+ elem.IntervalId = element.IntervalId;
+ elem.interval = element.interval;
+ elem.app = elem.customApp = element.customApp;
+ elem.appdata = util.format(elem.appdata, element.appdata);
+ break;
+ default:
+
+ }
+ });
+
+ }
+ if (priority) {
+ return priority;
+ }
+}
+
+// Updates an existing voice_extension in the DB.
+exports.update = function(req, res) {
+ VoiceExtension
+ .findAll({
+ where: {
+ exten: req.body.exten,
+ context: req.body.context,
+ type: req.body.type,
+ VoiceExtensionId: null,
+ id: {
+ $ne: req.body.id
+ }
+ }
+ })
+ .then(function(existingExtensions) {
+ //console.log(existingExtensions);
+ //console.log('Finding app row.....');
+ if (!existingExtensions) {
+ return res.sendStatus(404);
+ }
+ if (existingExtensions.length > 0) {
+ return res.status(500).send({
+ message: 'MESSAGE_EXIST_ROUTE'
+ })
+ }
+ if (req.body.id) {
+ delete req.body.id;
+ }
+ VoiceExtension
+ .find({
+ where: {
+ id: req.params.id
+ }
+ })
+ .then(function(voice_extension) {
+ if (!voice_extension) {
+ return res.sendStatus(404);
+ }
+ var updated = _.merge(voice_extension, req.body);
+ return sequelize.transaction(function(t) {
+ return updated.save({
+ transaction: t
+ })
+ .then(function(updatedRoute) {
+ VoiceExtension
+ .findAll({
+ where: {
+ VoiceExtensionId: updatedRoute.id,
+ isApp: true
+ }
+ })
+ .then(function(voiceExtensions) {
+ return VoiceExtension.destroy({
+ where: {
+ VoiceExtensionId: updatedRoute.id
+ }
+ }, {
+ transaction: t
+ })
+ .then(function() {
+ voiceExtensions = _.pluck(voiceExtensions, 'dataValues');
+ var intervalIds = _.filter(_.pluck(voiceExtensions, 'IntervalId'), function(elem) {
+ return elem !== null;
+ });
+ Interval
+ .findAll({
+ where: {
+ IntervalId: intervalIds
+ }
+ })
+ .then(function(intervals) {
+ var priority = 2;
+ var interval;
+ voiceExtensions.forEach(function(tmpElem) {
+ var application = _.cloneDeep(Applications[tmpElem.app]);
+ if (!application || tmpElem.customApp) {
+ application = [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'custom',
+ appdata: '%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Custom Application End'
+ }];
+ }
+ tmpElem.context = updatedRoute.context;
+ tmpElem.exten = updatedRoute.exten;
+ var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+ tmpElem.interval = tmpElem.interval || '*,*,*,*';
+ var tmpIntervals = _.filter(intervals, function(elem) {
+ return (elem.IntervalId == tmpElem.IntervalId);
+ });
+ if (tmpIntervals && tmpIntervals.length > 0) {
+ application.splice(0, 1);
+ tmpIntervals.forEach(function(elem, index) {
+ application.unshift({
+ app: 'GotoIfTimeFromArray',
+ appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ IntervalId: elem.id,
+ isInterval: true,
+ interval: elem.interval
+ });
+ })
+ }
+ priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+ VoiceExtension
+ .bulkCreate(application)
+ });
+ return res.sendStatus(200);
+ })
+ })
+ })
+ })
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+};
+
+// Updates an existing voice_extension in the DB.
+exports.updateApplication = function(req, res, next) {
+ var interval;
+ if (req.body.appdata) {
+ delete req.body.appdata;
+ }
+
+ //console.log('Finding app row.....');
+ VoiceExtension
+ .findById(req.body.id)
+ .then(function(voiceExtension) {
+ if (!voiceExtension) {
+ return res.sendStatus(404);
+ }
+ delete req.body.id;
+ var updated = _.merge(voiceExtension, req.body);
+ //console.log('Updating app row.....');
+ return sequelize.transaction(function(t) {
+ return updated.save({
+ transaction: t
+ })
+ .then(function() {
+ //console.log('Finding extension apps..');
+ VoiceExtension
+ .findAll({
+ where: {
+ VoiceExtensionId: req.body.VoiceExtensionId,
+ isApp: true
+ }
+ })
+ .then(function(voiceExtensions) {
+ //console.log('Extensions found');
+ //console.log('Destroying extension rows...');
+ return VoiceExtension.destroy({
+ where: {
+ VoiceExtensionId: req.body.VoiceExtensionId
+ }
+ }, {
+ transaction: t
+ })
+ .then(function() {
+ voiceExtensions = _.pluck(voiceExtensions, 'dataValues');
+ var intervalIds = _.filter(_.pluck(voiceExtensions, 'IntervalId'), function(elem) {
+ return elem !== null;
+ });
+ return Interval
+ .findAll({
+ where: {
+ IntervalId: intervalIds
+ }
+ })
+ .then(function(intervals) {
+ //console.log('Creating extension rows...');
+ var priority = 2;
+ var interval;
+ voiceExtensions.forEach(function(tmpElem) {
+ //console.log('Creating app..');
+ var application = _.cloneDeep(Applications[tmpElem.app]);
+ if (!application || tmpElem.customApp) {
+ application = [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'custom',
+ appdata: '%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Custom Application End'
+ }];
+ }
+ //console.log('PRIORITY');
+ //console.log(priority);
+ var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+ tmpElem.interval = tmpElem.interval || '*,*,*,*';
+ var tmpIntervals = _.filter(intervals, function(elem) {
+ return (elem.IntervalId == tmpElem.IntervalId);
+ });
+ if (tmpIntervals && tmpIntervals.length > 0) {
+ application.splice(0, 1);
+ tmpIntervals.forEach(function(elem, index) {
+ // interval = createInterval(elem);
+ application.unshift({
+ app: 'GotoIfTimeFromArray',
+ appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ IntervalId: elem.id,
+ isInterval: true,
+ interval: elem.interval
+ });
+ })
+ }
+ priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+ //console.log('returned priority');
+ //console.log(priority);
+ VoiceExtension
+ .bulkCreate(application)
+ });
+ //console.log('THE END');
+ })
+ })
+ })
+ })
+ })
+ .then(function(result) {
+ return res.status(201).send(result);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+
+};
+
+// Deletes a voice_extension from the DB.
+exports.destroy = function(req, res, next) {
+ VoiceExtension
+ .findById(req.params.id)
+ .then(function(voice_extension) {
+ if (!voice_extension) {
+ return res.sendStatus(404);
+ }
+ if (!voice_extension.VoiceExtensionId) {
+ voice_extension.destroy()
+ .then(function() {
+ return res.sendStatus(204);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+ } else {
+ //console.log('isApplication');
+ VoiceExtension
+ .findAll({
+ where: {
+ appGroup: voice_extension.appGroup
+ }
+ })
+ .then(function(voice_extensions) {
+ //console.log('found extensions');
+ if (!voice_extensions) {
+ return res.sendStatus(404);
+ }
+ return sequelize.transaction(function(t) {
+ //console.log('trying to delete');
+ return VoiceExtension.destroy({
+ where: {
+ appGroup: voice_extension.appGroup
+ }
+ }, {
+ transaction: t
+ })
+ .then(function(deleted_rows) {
+ //console.log('the length of the group is', deleted_rows);
+ // //console.log(voice_extensions);
+ return VoiceExtension
+ .findAll({
+ where: {
+ VoiceExtensionId: voice_extension.VoiceExtensionId,
+ priority: {
+ $gt: voice_extensions[deleted_rows - 1].priority
+ }
+ }
+ })
+ .then(function(voiceApplications) {
+ return VoiceExtension
+ .destroy({
+ where: {
+ VoiceExtensionId: voice_extension.VoiceExtensionId,
+ priority: {
+ $gt: voice_extensions[deleted_rows - 1].priority
+ }
+ }
+ }, {
+ transaction: t
+ })
+ .then(function() {
+ var appGroups = _.pluck(_.filter(_.pluck(voiceApplications, 'dataValues'), function(elem) {
+ return elem.isApp === true;
+ }), 'appGroup');
+ var priority = voice_extensions[0].priority;
+ appGroups.forEach(function(sortedElem) {
+ var tmpElem = _.find(voiceApplications, function(elem) {
+ return (elem.appGroup == sortedElem && elem.isApp === true);
+ });
+ var application = _.cloneDeep(Applications[tmpElem.app]);
+ if (!application || tmpElem.customApp) {
+ application = [{
+ app: 'GotoIfTime',
+ appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ }, {
+ app: 'custom',
+ appdata: '%s',
+ isApp: true
+ }, {
+ app: 'NoOp',
+ appdata: 'Custom Application End'
+ }];
+ }
+ //console.log('PRIORITY');
+ //console.log(priority);
+ var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+ tmpElem.interval = tmpElem.interval || '*,*,*,*';
+ var tmpIntervals = _.filter(voiceApplications, function(elem) {
+ return (elem.appGroup == sortedElem && elem.isInterval === true);
+ });
+ if (tmpIntervals && tmpIntervals.length > 0) {
+ application.splice(0, 1);
+ tmpIntervals.forEach(function(elem, index) {
+
+ application.unshift({
+ app: 'GotoIfTimeFromArray',
+ appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+ IntervalId: elem.IntervalId ? elem.IntervalId : null,
+ isInterval: true,
+ interval: elem.interval,
+ });
+ })
+ }
+ priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+ //console.log('returned priority');
+ //console.log(priority);
+ VoiceExtension
+ .bulkCreate(application)
+ });
+ })
+ })
+ })
+ })
+ .then(function(result) {
+ // VoiceExtension
+ // .findAll({
+ // where: {
+ // VoiceExtensionId: voice_extension.VoiceExtensionId,
+ // isApp: true
+ // }
+ // })
+ // .then(function(voiceExtensions) {
+ // // //console.log(_.pluck(voiceExtensions, 'dataValues'));
+ // return res.status(201).send(voiceExtensions);
+ // })
+ res.sendStatus(201);
+ })
+ .catch(function(err) {
+ return next(err);
+ });
+ })
+ }
+ })
+ .catch(function(err) {
+ return next(err);
+ });
+};
+
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+ VoiceExtension
+ .destroy({
+ where: {
+ id: req.query.id
+ },
+ individualHooks: true
+ })
+ .then(function() {
+ return res.sendStatus(204);
+ })
+ .catch(function(err) {
+ return handleError(res, err);
+ });
+};
+
+function handleError(res, err) {
+ return res.status(500).send(err);
+}