{"version":3,"sources":["jsdelivr-header.js","/npm/messagebird@4.0.1/lib/messagebird.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACAA,IAAI,KAAO,QAAQ,SACf,YAAc,QAAQ,eACtB,IAAM,QAAQ,mBACd,OAAS,OAAO,OAAS,OAAO,OAAS,QAAQ,QAAQ,QAW7D,OAAO,QAAU,CACf,WAAY,SAAU,EAAW,EAAS,GACxC,IAAI,EAAS,CACX,UAAW,EACX,QAAS,GAAW,KAGlB,EAAyB,gCACzB,EAAiB,wBACjB,GAA6B,EAqBjC,SAAS,EAAY,EAAe,GAClC,IAGI,EAHA,EAAU,CAAC,EACX,GAAW,EACX,EAAO,KAgBX,SAAS,EAAW,EAAK,GAClB,IACH,GAAW,EACX,EAAS,EAAK,GAAO,MAEzB,CAlB6B,mBAAlB,IACT,EAAW,EACX,EAAgB,MA0CG,UAXrB,EAAU,CACR,SAAU,EAAc,UAAY,uBACpC,KAAM,EAAc,KACpB,OAAQ,EAAc,OACtB,QAAS,CACP,cAAe,aAAe,EAAO,UACrC,aAlBE,EACK,uCAGP,yBACA,IAAI,QACJ,YACA,QAAQ,SAAS,QAgBX,QACW,QAAnB,EAAQ,QACW,UAAnB,EAAQ,QAER,EAAO,KAAK,UAAU,EAAc,QACpC,EAAQ,QAAQ,gBAAkB,mBAClC,EAAQ,QAAQ,kBAAoB,OAAO,WAAW,EAAM,SAE5D,EAAQ,MAAQ,EAAc,OAC1B,IAAM,YAAY,UAAU,EAAc,QAC1C,GAIN,EAAQ,QAAU,OAChB,EAAQ,SAAW,CAAC,EACpB,EAAc,SAAW,CAAC,IAG5B,EAAU,KAAK,QAAQ,IAGf,GAAG,UAAU,SAAU,GAC7B,EAAO,WAAW,SAAS,EAAO,QAAS,KAC3C,EAAO,GAAG,WAAW,WACnB,EAAQ,OACV,GACF,IAGA,EAAQ,GAAG,SAAS,SAAU,GAC5B,IAAI,EAAQ,IAAI,MAAM,mBAAqB,EAAE,SAEvB,eAAlB,EAAM,UACR,EAAQ,IAAI,MAAM,oBAGpB,EAAM,MAAQ,EACd,EAAW,EACb,IAGA,EAAQ,GAAG,YAAY,SAAU,GAC/B,IAAI,EAAO,GACP,EAAO,EACP,EAAQ,KAEZ,EAAS,GAAG,QAAQ,SAAU,GAC5B,EAAK,KAAK,GACV,GAAQ,EAAG,MACb,IAEA,EAAS,GAAG,SAAS,WACnB,EAAW,IAAI,MAAM,kBACvB,IAEA,EAAS,GAAG,OAAO,WAGjB,GAFA,EAAO,OAAO,OAAO,EAAM,GAAM,WAAW,OAEhB,MAAxB,EAAS,WAAb,CAKA,IACE,IAAI,EAAqB,EAAS,QAAQ,uBAG1C,GACE,GACA,EAAmB,SAAS,cAG5B,YADA,EAAW,EAAO,GAKpB,IADA,EAAO,KAAK,MAAM,IACT,OAAQ,CACf,IAAI,EAAe,EAAK,OAAO,KAAI,SAAU,GAC3C,OACE,EAAE,YACF,WACA,EAAE,MACD,EAAE,UAAY,gBAAkB,EAAE,UAAY,IAC/C,GAEJ,KAEA,EAAQ,IAAI,MAAM,iBAAmB,EAAa,KAAK,QACjD,WAAa,EAAS,WAC5B,EAAM,OAAS,EAAK,OACpB,EAAO,IACT,CACF,CAAE,MAAO,IACP,EAAQ,IAAI,MAAM,oBACZ,WAAa,EAAS,WAC5B,EAAM,MAAQ,EACd,EAAO,IACT,CAEA,EAAW,EAAO,EAtClB,MAFE,EAAW,MAAM,EAyCrB,GACF,IAGA,EAAQ,IAAI,EACd,CAGA,OAlLI,GAAY,YAAa,IACyB,IAAhD,EAAS,QAAQ,4BACnB,GAA6B,GAgL1B,CACL,QAAS,CAOP,KAAM,SAAU,GACd,EAAY,CAAE,OAAQ,MAAO,KAAM,YAAc,EACnD,GAGF,IAAK,CAOH,KAAM,SAAU,EAAI,GAClB,EAAY,CAAE,OAAQ,MAAO,KAAM,QAAU,GAAM,EACrD,EAUA,OAAQ,SAAU,EAAQ,EAAK,GAM7B,EACE,CAAE,OAAQ,OAAQ,KAAM,OAAQ,OANrB,CACX,OAAQ,EACR,UAA0B,mBAAR,EAAqB,KAAO,IAK9C,GAAY,EAEhB,GAGF,SAAU,CAQR,KAAM,SAAU,EAAI,GAClB,EAAY,CAAE,OAAQ,MAAO,KAAM,aAAe,GAAM,EAC1D,EAYA,KAAM,SAAU,EAAQ,GACtB,IAAI,EAAS,CAAC,EAEU,mBAAb,GACL,OAAO,UAAU,eAAe,KAAK,EAAQ,WAC/C,EAAO,MAAQ,EAAO,OAEpB,OAAO,UAAU,eAAe,KAAK,EAAQ,YAC/C,EAAO,OAAS,EAAO,QAErB,OAAO,UAAU,eAAe,KAAK,EAAQ,YAC/C,EAAO,OAAS,EAAO,SAGzB,EAAW,EAGb,EACE,CAAE,OAAQ,MAAO,KAAM,YAAa,OAAQ,GAC5C,EAEJ,EASA,OAAQ,SAAU,EAAQ,GACpB,EAAO,sBAAsB,QAC/B,EAAO,WAAa,EAAO,WAAW,KAAK,MAG7C,EACE,CAAE,OAAQ,OAAQ,KAAM,YAAa,OAAQ,GAC7C,EAEJ,EASA,OAAQ,SAAU,EAAI,GACpB,EAAY,CAAE,OAAQ,SAAU,KAAM,aAAe,GAAM,EAC7D,GAGF,IAAK,CAQH,KAAM,SAAU,EAAI,GAClB,EAAY,CAAE,OAAQ,MAAO,KAAM,QAAU,GAAM,EACrD,EASA,OAAQ,SAAU,EAAQ,GACpB,EAAO,sBAAsB,QAC/B,EAAO,WAAa,EAAO,WAAW,KAAK,MAE7C,EACE,CAAE,OAAQ,OAAQ,KAAM,OAAQ,OAAQ,GACxC,EAEJ,EAWA,KAAM,SAAU,EAAO,EAAQ,GAC7B,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CAAE,OAAQ,MAAO,KAAM,OAAQ,OAAQ,GACvC,EAEJ,EASA,OAAQ,SAAU,EAAI,GACpB,EAAY,CAAE,OAAQ,SAAU,KAAM,QAAU,GAAM,EACxD,GAGF,eAAgB,CAQd,KAAM,SAAU,EAAI,GAClB,EACE,CAAE,OAAQ,MAAO,KAAM,kBAAoB,GAC3C,EAEJ,EAWA,KAAM,SAAU,EAAO,EAAQ,GAC7B,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CAAE,OAAQ,MAAO,KAAM,iBAAkB,OAAQ,GACjD,EAEJ,EAUA,OAAQ,SAAU,EAAY,EAAQ,GAChC,aAAsB,SACxB,EAAW,EACX,EAAS,EACT,EAAa,MAGX,IACF,EAAO,WAAa,GAGlB,EAAO,sBAAsB,QAC/B,EAAO,WAAa,EAAO,WAAW,KAAK,MAG7C,EACE,CAAE,OAAQ,OAAQ,KAAM,iBAAkB,OAAQ,GAClD,EAEJ,EASA,OAAQ,SAAU,EAAI,GACpB,EACE,CAAE,OAAQ,SAAU,KAAM,kBAAoB,GAC9C,EAEJ,GAGF,OAAQ,CAQN,KAAM,SAAU,EAAI,GAClB,EAAY,CAAE,OAAQ,MAAO,KAAM,WAAa,GAAM,EACxD,EAUA,OAAQ,SAAU,EAAW,EAAQ,GACb,mBAAX,IACT,EAAW,EACX,EAAS,CAAC,GAGR,aAAqB,QACvB,EAAY,EAAU,IAGxB,EAAO,UAAY,EACnB,EACE,CAAE,OAAQ,OAAQ,KAAM,UAAW,OAAQ,GAC3C,EAEJ,EAWA,gBAAiB,SAAU,EAAM,EAAI,EAAQ,GACrB,mBAAX,IACT,EAAW,EACX,EAAS,CAAC,GAEP,IACH,EAAS,CAAC,GAEZ,EAAO,KAAO,QACd,EAAO,WAAa,EAEpB,KAAK,OAAO,EAAI,EAAQ,EAC1B,EASA,OAAQ,SAAU,EAAI,GACpB,EAAY,CAAE,OAAQ,SAAU,KAAM,WAAa,GAAM,EAC3D,EAUA,OAAQ,SAAU,EAAI,EAAO,GAK3B,EACE,CAAE,OAAQ,MAAO,KAAM,WAAa,EAAI,OAL7B,CACX,MAAO,IAKP,EAEJ,EASA,sBAAuB,SAAU,EAAI,GACnC,EACE,CAAE,OAAQ,MAAO,KAAM,0BAA4B,GACnD,EAEJ,GAEF,OAAQ,CASN,KAAM,SAAU,EAAa,EAAa,GACxC,IAAI,EAAS,CAAC,EAEa,mBAAhB,IACT,EAAW,EACX,EAAc,MAGZ,IACF,EAAO,YAAc,GAGvB,EACE,CAAE,OAAQ,MAAO,KAAM,WAAa,EAAa,OAAQ,GACzD,EAEJ,EAEA,IAAK,CASH,KAAM,SAAU,EAAa,EAAa,GACxC,IAAI,EAAS,CAAC,EAEa,mBAAhB,IACT,EAAW,EACX,EAAc,MAGZ,IACF,EAAO,YAAc,GAGvB,EACE,CACE,OAAQ,MACR,KAAM,WAAa,EAAc,OACjC,OAAQ,GAEV,EAEJ,EAUA,OAAQ,SAAU,EAAa,EAAQ,GACf,mBAAX,IACT,EAAW,EACX,EAAS,MAGX,EACE,CACE,OAAQ,OACR,KAAM,WAAa,EAAc,OACjC,OAAQ,GAEV,EAEJ,IAIJ,cAAe,CACb,YAAa,WACX,OAAO,CACT,EAYA,KAAM,SAAU,EAAQ,GACtB,EACE,CACE,SAAU,EACV,OAAQ,OACR,KAAM,WACN,OAAQ,GAEV,EAEJ,EAYA,MAAO,SAAU,EAAQ,GACvB,EACE,CACE,SAAU,EACV,OAAQ,OACR,KAAM,0BACN,OAAQ,GAEV,EAEJ,EAYA,KAAM,SAAU,EAAO,EAAQ,GAC7B,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,oBACN,OAAQ,GAEV,EAEJ,EASA,KAAM,SAAU,EAAI,GAClB,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,qBAAuB,GAE/B,EAEJ,EAUA,OAAQ,SAAU,EAAI,EAAQ,GAC5B,EACE,CACE,SAAU,EACV,OAAQ,QACR,KAAM,qBAAuB,EAC7B,OAAQ,GAEV,EAEJ,EAWA,MAAO,SAAU,EAAI,EAAQ,GAC3B,EACE,CACE,SAAU,EACV,OAAQ,OACR,KAAM,qBAAuB,EAAK,YAClC,OAAQ,GAEV,EAEJ,EAWA,aAAc,SAAU,EAAI,EAAO,EAAQ,GACzC,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,qBAAuB,EAAK,YAClC,OAAQ,GAEV,EAEJ,EASA,YAAa,SAAU,EAAI,GACzB,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,gBAAkB,GAE1B,EAEJ,EAEA,SAAU,CAQR,OAAQ,SAAU,EAAQ,GACxB,EACE,CACE,SAAU,EACV,OAAQ,OACR,KAAM,eACN,OAAQ,GAEV,EAEJ,EASA,KAAM,SAAU,EAAI,GAClB,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,gBAAkB,GAE1B,EAEJ,EAUA,OAAQ,SAAU,EAAI,EAAQ,GAC5B,EACE,CACE,SAAU,EACV,OAAQ,QACR,KAAM,gBAAkB,EACxB,OAAQ,GAEV,EAEJ,EAUA,KAAM,SAAU,EAAO,EAAQ,GAC7B,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,eACN,OAAQ,GAEV,EAEJ,EASA,OAAQ,SAAU,EAAI,GACpB,EACE,CACE,SAAU,EACV,OAAQ,SACR,KAAM,gBAAkB,GAE1B,EAEJ,IAIJ,MAAO,CACL,SAAU,CAQR,OAAQ,SAAU,EAAQ,GACxB,EACE,CACE,SAAU,EACV,OAAQ,OACR,KAAM,YACN,OAAQ,GAEV,EAEJ,EASA,KAAM,SAAU,EAAI,GAClB,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,aAAe,GAEvB,EAEJ,EAUA,OAAQ,SAAU,EAAI,EAAQ,GAC5B,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,aAAe,EACrB,OAAQ,GAEV,EAEJ,EAUA,KAAM,SAAU,EAAS,EAAa,GACpC,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,QAAS,EACT,YAAa,GAGf,EAAW,EAGb,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,YACN,OAAQ,GAEV,EAEJ,EASA,OAAQ,SAAU,EAAI,GACpB,EACE,CACE,SAAU,EACV,OAAQ,SACR,KAAM,aAAe,GAEvB,EAEJ,IAIJ,SAAU,CASR,OAAQ,SAAU,EAAa,EAAQ,GACf,mBAAX,IACT,EAAW,EACX,EAAS,CAAC,GAGZ,EAAO,OAAS,EAEhB,EACE,CAAE,OAAQ,OAAQ,KAAM,YAAa,OAAQ,GAC7C,EAEJ,EAWA,OAAQ,SAAU,EAAI,GACpB,EAAY,CAAE,OAAQ,SAAU,KAAM,aAAe,GAAM,EAC7D,EAWA,KAAM,SAAU,EAAO,EAAQ,GAC7B,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CAAE,OAAQ,MAAO,KAAM,YAAa,OAAQ,GAC5C,EAEJ,EASA,KAAM,SAAU,EAAI,GAClB,EAAY,CAAE,OAAQ,MAAO,KAAM,aAAe,GAAM,EAC1D,EAWA,OAAQ,SAAU,EAAI,EAAQ,GAC5B,EACE,CAAE,OAAQ,QAAS,KAAM,aAAe,EAAI,OAAQ,GACpD,EAEJ,EAWA,WAAY,SAAU,EAAW,EAAO,EAAQ,GAC9C,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CACE,OAAQ,MACR,KAAM,aAAe,EAAY,UACjC,OAAQ,GAEV,EAEJ,EAWA,aAAc,SAAU,EAAW,EAAO,EAAQ,GAChD,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CACE,OAAQ,MACR,KAAM,aAAe,EAAY,YACjC,OAAQ,GAEV,EAEJ,GAGF,UAAW,CAQT,KAAM,SAAU,EAAM,EAAS,GAC7B,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,KAAM,EACN,QAAS,GAGX,EAAW,EAGb,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,cACN,OAAQ,GAEV,EAEJ,EASA,OAAQ,SAAU,EAAQ,GACxB,EACE,CACE,SAAU,EACV,OAAQ,OACR,KAAM,cACN,OAAQ,GAEV,EAEJ,EASA,KAAM,SAAU,EAAQ,GACtB,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,eAAiB,GAEzB,EAEJ,EAWA,OAAQ,SAAU,EAAQ,GACxB,EACE,CACE,SAAU,EACV,OAAQ,SACR,KAAM,eAAiB,GAEzB,EAEJ,EAUA,OAAQ,SAAU,EAAQ,EAAQ,GAChC,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,eAAiB,EACvB,OAAQ,GAEV,EAEJ,GAEF,OAAQ,CASN,OAAQ,SAAU,EAAM,EAAQ,GACR,mBAAX,IACT,EAAW,EACX,EAAS,CAAC,GAGZ,EAAO,KAAO,EAEd,EACE,CAAE,OAAQ,OAAQ,KAAM,UAAW,OAAQ,GAC3C,EAEJ,EAWA,OAAQ,SAAU,EAAI,GACpB,EAAY,CAAE,OAAQ,SAAU,KAAM,WAAa,GAAM,EAC3D,EAWA,KAAM,SAAU,EAAO,EAAQ,GAC7B,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CAAE,OAAQ,MAAO,KAAM,UAAW,OAAQ,GAC1C,EAEJ,EASA,KAAM,SAAU,EAAI,GAClB,EAAY,CAAE,OAAQ,MAAO,KAAM,WAAa,GAAM,EACxD,EAWA,OAAQ,SAAU,EAAI,EAAM,EAAQ,GACZ,mBAAX,IACT,EAAW,EACX,EAAS,CAAC,GAGZ,EAAO,KAAO,EAEd,EACE,CAAE,OAAQ,QAAS,KAAM,WAAa,EAAI,OAAQ,GAClD,EAEJ,EAUA,YAAa,SAAU,EAAS,EAAY,GAM1C,EACE,CAAE,OAAQ,MAAO,KAAM,WAAa,EAAU,YAAa,OAN9C,CACb,UACA,IAAK,IAKL,EAEJ,EAWA,aAAc,SAAU,EAAS,EAAO,EAAQ,GAC9C,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,MAAO,EACP,OAAQ,GAGV,EAAW,EAGb,EACE,CACE,OAAQ,MACR,KAAM,WAAa,EAAU,YAC7B,OAAQ,GAEV,EAEJ,EAUA,cAAe,SAAU,EAAS,EAAW,GAC3C,EACE,CACE,OAAQ,SACR,KAAM,WAAa,EAAU,aAAe,GAE9C,EAEJ,GAEF,MAAO,CAQL,OAAQ,SAAU,EAAQ,GACxB,EACE,CACE,SAAU,EACV,OAAQ,OACR,KAAM,SACN,UAEF,EAEJ,EAQA,KAAM,SAAU,GACd,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,UAER,EAEJ,EASA,KAAM,SAAU,EAAQ,GACtB,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,UAAU,KAElB,EAEJ,EASA,OAAQ,SAAU,EAAQ,GACxB,EACE,CACE,SAAU,EACV,OAAQ,SACR,KAAM,UAAU,KAElB,EAEJ,GAEF,WAAY,CAUV,KAAM,SAAU,EAAQ,EAAO,EAAa,GAC1C,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,UAAU,UAAe,gBAAoB,KAErD,EAEJ,EAUA,KAAM,SAAU,EAAQ,EAAO,EAAO,EAAQ,GAC5C,IAAI,EAAS,KAEW,mBAAb,EACT,EAAS,CACP,QACA,UAGF,EAAW,EAGb,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,UAAU,UAAe,eAC/B,UAEF,EAEJ,EAYA,OAAQ,SAAU,EAAQ,EAAO,EAAO,GACtC,EACE,CACE,SAAU,EACV,OAAQ,SACR,KAAM,UAAU,UAAe,gBAAoB,KAErD,EAEJ,EAWA,SAAU,SAAU,EAAQ,EAAO,EAAa,GAC9C,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,UAAU,UAAe,gBAAoB,SAErD,EAEJ,GAEF,eAAgB,CAUd,OAAQ,SAAU,EAAQ,EAAO,EAAa,EAAU,GAKtD,EACE,CACE,SAAU,EACV,OAAQ,OACR,KAAM,UAAU,UAAe,gBAAoB,mBACnD,OATS,CACX,SAAU,IAUV,EAEJ,EAUA,KAAM,SAAU,EAAQ,EAAO,EAAa,GAC1C,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,UAAU,UAAe,gBAAoB,oBAErD,EAEJ,EAYA,KAAM,SAAU,EAAQ,EAAO,EAAa,EAAiB,GAC3D,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,UAAU,UAAe,gBAAoB,oBAA8B,KAEnF,EAEJ,EAWA,SAAU,SACR,EACA,EACA,EACA,EACA,GAEA,EACE,CACE,SAAU,EACV,OAAQ,MACR,KAAM,UAAU,UAAe,gBAAoB,oBAA8B,SAEnF,EAEJ,GAGN","file":"/npm/messagebird@4.0.1/lib/messagebird.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/messagebird@4.0.1/lib/messagebird.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * MessageBird API methods\n *\n * @module messagebird\n */\n\nvar http = require('https');\nvar querystring = require('querystring');\nvar pkg = require('../package.json');\nvar extend = Object.assign ? Object.assign : require('util')._extend;\n\n/**\n * module.exports sets configuration\n * and returns an object with methods\n *\n * @param {String} accessKey\n * @param {Integer} timeout\n * @param {Array} features\n * @return {Object}\n */\nmodule.exports = {\n  initClient: function (accessKey, timeout, features) {\n    var config = {\n      accessKey: accessKey,\n      timeout: timeout || 5000,\n    };\n\n    var CONVERSATIONS_ENDPOINT = 'conversations.messagebird.com';\n    var VOICE_ENDPOINT = 'voice.messagebird.com';\n    var IS_FIREBASE_PLUGIN_ENABLED = false;\n\n    if (features && 'indexOf' in features) {\n      if (features.indexOf('ENABLE_FIREBASE_PLUGIN') !== -1) {\n        IS_FIREBASE_PLUGIN_ENABLED = true;\n      }\n    }\n\n    /**\n     * httpRequest does the API call and process the response.\n     * requestParams.hostname is optional and defaults back to\n     * 'rest.messagebird.com'.\n     *\n     * @param {Object} requestParams\n     * @param {String} requestParams.hostname\n     * @param {String} requestParams.path\n     * @param {String} requestParams.method\n     * @param {Object} requestParams.params\n     * @param {Function} callback\n     * @return {Void}\n     */\n    function httpRequest(requestParams, callback) {\n      var options = {};\n      var complete = false;\n      var body = null;\n      var request;\n\n      if (typeof requestParams === 'function') {\n        callback = requestParams;\n        requestParams = null;\n      }\n\n      /**\n       * doCallback prevents multiple callback\n       * calls emitted by node's http module\n       *\n       * @param {Error} err\n       * @param {Mixed} res\n       * @return {Void}\n       */\n      function doCallback(err, res) {\n        if (!complete) {\n          complete = true;\n          callback(err, res || null);\n        }\n      }\n\n      function getUserAgent() {\n        if (IS_FIREBASE_PLUGIN_ENABLED) {\n          return 'MessageBird/ApiClient/FirebasePlugin';\n        }\n        return (\n          'MessageBird/ApiClient/' +\n          pkg.version +\n          ' Node.js/' +\n          process.versions.node\n        );\n      }\n\n      // build request\n      options = {\n        hostname: requestParams.hostname || 'rest.messagebird.com',\n        path: requestParams.path,\n        method: requestParams.method,\n        headers: {\n          Authorization: 'AccessKey ' + config.accessKey,\n          'User-Agent': getUserAgent(),\n        },\n      };\n\n      if (\n        options.method === 'POST' ||\n        options.method === 'PUT' ||\n        options.method === 'PATCH'\n      ) {\n        body = JSON.stringify(requestParams.params);\n        options.headers['Content-Type'] = 'application/json';\n        options.headers['Content-Length'] = Buffer.byteLength(body, 'utf8');\n      } else {\n        options.path += requestParams.params\n          ? '?' + querystring.stringify(requestParams.params)\n          : '';\n      }\n\n      // you can override any headers you like\n      options.headers = extend(\n        options.headers || {},\n        requestParams.headers || {}\n      );\n\n      request = http.request(options);\n\n      // set timeout\n      request.on('socket', function (socket) {\n        socket.setTimeout(parseInt(config.timeout, 10));\n        socket.on('timeout', function () {\n          request.abort();\n        });\n      });\n\n      // process client error\n      request.on('error', function (e) {\n        var error = new Error('request failed: ' + e.message);\n\n        if (error.message === 'ECONNRESET') {\n          error = new Error('request timeout');\n        }\n\n        error.error = e;\n        doCallback(error);\n      });\n\n      // process response\n      request.on('response', function (response) {\n        var data = [];\n        var size = 0;\n        var error = null;\n\n        response.on('data', function (ch) {\n          data.push(ch);\n          size += ch.length;\n        });\n\n        response.on('close', function () {\n          doCallback(new Error('request closed'));\n        });\n\n        response.on('end', function () {\n          data = Buffer.concat(data, size).toString().trim();\n\n          if (response.statusCode === 204) {\n            doCallback(null, true);\n            return;\n          }\n\n          try {\n            let contentDisposition = response.headers['content-disposition'];\n\n            // check if response data is downloadable so it can't be parsed to JSON\n            if (\n              contentDisposition &&\n              contentDisposition.includes('attachment')\n            ) {\n              doCallback(error, data);\n              return;\n            }\n\n            data = JSON.parse(data);\n            if (data.errors) {\n              let clientErrors = data.errors.map(function (e) {\n                return (\n                  e.description +\n                  ' (code: ' +\n                  e.code +\n                  (e.parameter ? ', parameter: ' + e.parameter : '') +\n                  ')'\n                );\n              });\n\n              error = new Error('api error(s): ' + clientErrors.join(', '));\n              error.statusCode = response.statusCode;\n              error.errors = data.errors;\n              data = null;\n            }\n          } catch (e) {\n            error = new Error('response failed');\n            error.statusCode = response.statusCode;\n            error.error = e;\n            data = null;\n          }\n\n          doCallback(error, data);\n        });\n      });\n\n      // do request\n      request.end(body);\n    }\n\n    // METHODS\n    return {\n      balance: {\n        /**\n         * Get account balance\n         *\n         * @param {Function} callback\n         * @return {void}\n         */\n        read: function (callback) {\n          httpRequest({ method: 'GET', path: '/balance' }, callback);\n        },\n      },\n\n      hlr: {\n        /**\n         * Get HLR report\n         *\n         * @param {Function} callback\n         * @return {void}\n         */\n        read: function (id, callback) {\n          httpRequest({ method: 'GET', path: '/hlr/' + id }, callback);\n        },\n\n        /**\n         * Send HLR network query to a number. Ref parameter is optional.\n         *\n         * @param {Number} msisdn\n         * @param {String} ref\n         * @param {Function} callback\n         * @return {void}\n         */\n        create: function (msisdn, ref, callback) {\n          var params = {\n            msisdn: msisdn,\n            reference: typeof ref === 'function' ? null : ref,\n          };\n\n          httpRequest(\n            { method: 'POST', path: '/hlr', params: params },\n            callback || ref\n          );\n        },\n      },\n\n      messages: {\n        /**\n         * Get a text message\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        read: function (id, callback) {\n          httpRequest({ method: 'GET', path: '/messages/' + id }, callback);\n        },\n\n        /**\n         * Lists sms messages.\n         *\n         * @param filter Filtering options.\n         * @param filter.status The status of the message.\n         * @param filter.limit The limit of messages to retrieve.\n         * @param filter.offset The number of messages to skip before selecting.\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (filter, callback) {\n          var params = {};\n\n          if (typeof callback === 'function') {\n            if (Object.prototype.hasOwnProperty.call(filter, 'limit')) {\n              params.limit = filter.limit;\n            }\n            if (Object.prototype.hasOwnProperty.call(filter, 'offset')) {\n              params.offset = filter.offset;\n            }\n            if (Object.prototype.hasOwnProperty.call(filter, 'status')) {\n              params.status = filter.status;\n            }\n          } else {\n            callback = filter;\n          }\n\n          httpRequest(\n            { method: 'GET', path: '/messages', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Send a text message\n         *\n         * @param {Object} params\n         * @param {Function} callback\n         * @return {void}\n         */\n        create: function (params, callback) {\n          if (params.recipients instanceof Array) {\n            params.recipients = params.recipients.join(',');\n          }\n\n          httpRequest(\n            { method: 'POST', path: '/messages', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Delete a text message\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        delete: function (id, callback) {\n          httpRequest({ method: 'DELETE', path: '/messages/' + id }, callback);\n        },\n      },\n\n      mms: {\n        /**\n         * Get a mms message\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        read: function (id, callback) {\n          httpRequest({ method: 'GET', path: '/mms/' + id }, callback);\n        },\n\n        /**\n         * Send a mms message\n         *\n         * @param {Object} params\n         * @param {Function} callback\n         * @return {void}\n         */\n        create: function (params, callback) {\n          if (params.recipients instanceof Array) {\n            params.recipients = params.recipients.join(',');\n          }\n          httpRequest(\n            { method: 'POST', path: '/mms', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Lists mms messages. Pagination is optional. If a limit is set, an\n         * offset is also required.\n         *\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            { method: 'GET', path: '/mms', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Delete a mms message\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        delete: function (id, callback) {\n          httpRequest({ method: 'DELETE', path: '/mms/' + id }, callback);\n        },\n      },\n\n      voice_messages: {\n        /**\n         * Get a voice message\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        read: function (id, callback) {\n          httpRequest(\n            { method: 'GET', path: '/voicemessages/' + id },\n            callback\n          );\n        },\n\n        /**\n         * Lists existing voice messages. Pagination is optional. If a limit is set, an\n         * offset is also required.\n         *\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            { method: 'GET', path: '/voicemessages', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Send a voice message\n         *\n         * @param {Array} recipients\n         * @param {Object} params\n         * @param {Function} callback\n         * @return {void}\n         */\n        create: function (recipients, params, callback) {\n          if (recipients instanceof Object) {\n            callback = params;\n            params = recipients;\n            recipients = null;\n          }\n\n          if (recipients) {\n            params.recipients = recipients;\n          }\n\n          if (params.recipients instanceof Array) {\n            params.recipients = params.recipients.join(',');\n          }\n\n          httpRequest(\n            { method: 'POST', path: '/voicemessages', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Delete a voice message\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        delete: function (id, callback) {\n          httpRequest(\n            { method: 'DELETE', path: '/voicemessages/' + id },\n            callback\n          );\n        },\n      },\n\n      verify: {\n        /**\n         * Get verification code details\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        read: function (id, callback) {\n          httpRequest({ method: 'GET', path: '/verify/' + id }, callback);\n        },\n\n        /**\n         * Send a verification code\n         *\n         * @param {String} recipient\n         * @param {Object} params\n         * @param {Function} callback\n         * @return {void}\n         */\n        create: function (recipient, params, callback) {\n          if (typeof params === 'function') {\n            callback = params;\n            params = {};\n          }\n\n          if (recipient instanceof Array) {\n            recipient = recipient[0];\n          }\n\n          params.recipient = recipient;\n          httpRequest(\n            { method: 'POST', path: '/verify', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Send a verification code via email\n         *\n         * @param {String} from\n         * @param {String} to\n         * @param {Object} params\n         * @param {Function} callback\n         * @return {void}\n         */\n        createWithEmail: function (from, to, params, callback) {\n          if (typeof params === 'function') {\n            callback = params;\n            params = {};\n          }\n          if (!params) {\n            params = {};\n          }\n          params.type = 'email';\n          params.originator = from;\n\n          this.create(to, params, callback);\n        },\n\n        /**\n         * Delete a verification code\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        delete: function (id, callback) {\n          httpRequest({ method: 'DELETE', path: '/verify/' + id }, callback);\n        },\n\n        /**\n         * Verify a verification code\n         *\n         * @param {String} id\n         * @param {String} token\n         * @param {Function} callback\n         * @return {void}\n         */\n        verify: function (id, token, callback) {\n          var params = {\n            token: token,\n          };\n\n          httpRequest(\n            { method: 'GET', path: '/verify/' + id, params: params },\n            callback\n          );\n        },\n\n        /**\n         * Get email message details\n         *\n         * @param {String} email message id\n         * @param {Function} callback\n         * @return {void}\n         */\n        getVerifyEmailMessage: function (id, callback) {\n          httpRequest(\n            { method: 'GET', path: '/verify/messages/email/' + id },\n            callback\n          );\n        },\n      },\n      lookup: {\n        /**\n         * Do a phonenumber lookup\n         *\n         * @param {String} phoneNumber\n         * @param {String} countryCode\n         * @param {Function} callback\n         * @return void\n         */\n        read: function (phoneNumber, countryCode, callback) {\n          var params = {};\n\n          if (typeof countryCode === 'function') {\n            callback = countryCode;\n            countryCode = null;\n          }\n\n          if (countryCode) {\n            params.countryCode = countryCode;\n          }\n\n          httpRequest(\n            { method: 'GET', path: '/lookup/' + phoneNumber, params: params },\n            callback\n          );\n        },\n\n        hlr: {\n          /**\n           * View an HLR lookup\n           *\n           * @param {String} phoneNumber\n           * @param {String} countryCode\n           * @param {Function} callback\n           * @return void\n           */\n          read: function (phoneNumber, countryCode, callback) {\n            var params = {};\n\n            if (typeof countryCode === 'function') {\n              callback = countryCode;\n              countryCode = null;\n            }\n\n            if (countryCode) {\n              params.countryCode = countryCode;\n            }\n\n            httpRequest(\n              {\n                method: 'GET',\n                path: '/lookup/' + phoneNumber + '/hlr',\n                params: params,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Request an HLR lookup\n           *\n           * @param {String} phoneNumber\n           * @param {Object} params\n           * @param {Function} callback\n           * @return void\n           */\n          create: function (phoneNumber, params, callback) {\n            if (typeof params === 'function') {\n              callback = params;\n              params = null;\n            }\n\n            httpRequest(\n              {\n                method: 'POST',\n                path: '/lookup/' + phoneNumber + '/hlr',\n                params: params,\n              },\n              callback\n            );\n          },\n        },\n      },\n\n      conversations: {\n        getEndpoint: function () {\n          return CONVERSATIONS_ENDPOINT;\n        },\n\n        /**\n         * Sends a new message to a channel-specific user identifier (e.g. phone\n         * number). If an active conversation already exists for the recipient,\n         * this conversation will be resumed. If an active conversation does not\n         * exist, a new one will be created.\n         *\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        send: function (params, callback) {\n          httpRequest(\n            {\n              hostname: CONVERSATIONS_ENDPOINT,\n              method: 'POST',\n              path: '/v1/send',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Starts a new conversation from a channel-specific user identifier,\n         * such as a phone number, and sends a first message. If an active\n         * conversation already exists for the recipient, this conversation will\n         * be resumed.\n         *\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        start: function (params, callback) {\n          httpRequest(\n            {\n              hostname: CONVERSATIONS_ENDPOINT,\n              method: 'POST',\n              path: '/v1/conversations/start',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Retrieves all conversations for this account. By default,\n         * conversations are sorted by their lastReceivedDatetime field so that\n         * conversations with new messages appear first.\n         *\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            {\n              hostname: CONVERSATIONS_ENDPOINT,\n              method: 'GET',\n              path: '/v1/conversations',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Retrieves a single conversation.\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return void\n         */\n        read: function (id, callback) {\n          httpRequest(\n            {\n              hostname: CONVERSATIONS_ENDPOINT,\n              method: 'GET',\n              path: '/v1/conversations/' + id,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Update Conversation Status.\n         *\n         * @param {String} id\n         * @param {String} params\n         * @param {Function} callback\n         * @return void\n         */\n        update: function (id, params, callback) {\n          httpRequest(\n            {\n              hostname: CONVERSATIONS_ENDPOINT,\n              method: 'PATCH',\n              path: '/v1/conversations/' + id,\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Adds a new message to an existing conversation and sends it to the\n         * contact that you're in conversation with.\n         *\n         * @param {String} id\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        reply: function (id, params, callback) {\n          httpRequest(\n            {\n              hostname: CONVERSATIONS_ENDPOINT,\n              method: 'POST',\n              path: '/v1/conversations/' + id + '/messages',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Lists the messages for a contact.\n         *\n         * @param {String} contactId\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        listMessages: function (id, limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            {\n              hostname: CONVERSATIONS_ENDPOINT,\n              method: 'GET',\n              path: '/v1/conversations/' + id + '/messages',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * View a message\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return {void}\n         */\n        readMessage: function (id, callback) {\n          httpRequest(\n            {\n              hostname: CONVERSATIONS_ENDPOINT,\n              method: 'GET',\n              path: '/v1/messages/' + id,\n            },\n            callback\n          );\n        },\n\n        webhooks: {\n          /**\n           * Creates a new webhook.\n           *\n           * @param {Object} params\n           * @param {Function} callback\n           * @return {void}\n           */\n          create: function (params, callback) {\n            httpRequest(\n              {\n                hostname: CONVERSATIONS_ENDPOINT,\n                method: 'POST',\n                path: '/v1/webhooks',\n                params: params,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Retrieves an existing webhook by id.\n           *\n           * @param {String} id\n           * @param {Function} callback\n           * @return {void}\n           */\n          read: function (id, callback) {\n            httpRequest(\n              {\n                hostname: CONVERSATIONS_ENDPOINT,\n                method: 'GET',\n                path: '/v1/webhooks/' + id,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Updates a webhook.\n           *\n           * @param {String} id\n           * @param {Object} params\n           * @param {Function} callback\n           * @return {void}\n           */\n          update: function (id, params, callback) {\n            httpRequest(\n              {\n                hostname: CONVERSATIONS_ENDPOINT,\n                method: 'PATCH',\n                path: '/v1/webhooks/' + id,\n                params: params,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Retrieves a list of webhooks.\n           *\n           * @param {Number} perPage\n           * @param {Number} currentPage\n           * @param {Function} callback\n           * @return void\n           */\n          list: function (limit, offset, callback) {\n            var params = null;\n\n            if (typeof callback === 'function') {\n              params = {\n                limit: limit,\n                offset: offset,\n              };\n            } else {\n              callback = limit;\n            }\n\n            httpRequest(\n              {\n                hostname: CONVERSATIONS_ENDPOINT,\n                method: 'GET',\n                path: '/v1/webhooks',\n                params: params,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Deletes webhook\n           *\n           * @param {String} id\n           * @param {Function} callback\n           * @return {void}\n           */\n          delete: function (id, callback) {\n            httpRequest(\n              {\n                hostname: CONVERSATIONS_ENDPOINT,\n                method: 'DELETE',\n                path: '/v1/webhooks/' + id,\n              },\n              callback\n            );\n          },\n        },\n      },\n\n      voice: {\n        webhooks: {\n          /**\n           * Creates a new webhook.\n           *\n           * @param {Object} params\n           * @param {Function} callback\n           * @return {void}\n           */\n          create: function (params, callback) {\n            httpRequest(\n              {\n                hostname: VOICE_ENDPOINT,\n                method: 'POST',\n                path: '/webhooks',\n                params: params,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Retrieves an existing webhook by id.\n           *\n           * @param {String} id\n           * @param {Function} callback\n           * @return {void}\n           */\n          read: function (id, callback) {\n            httpRequest(\n              {\n                hostname: VOICE_ENDPOINT,\n                method: 'GET',\n                path: '/webhooks/' + id,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Updates a webhook.\n           *\n           * @param {String} id\n           * @param {Object} params\n           * @param {Function} callback\n           * @return {void}\n           */\n          update: function (id, params, callback) {\n            httpRequest(\n              {\n                hostname: VOICE_ENDPOINT,\n                method: 'PUT',\n                path: '/webhooks/' + id,\n                params: params,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Retrieves a list of webhooks.\n           *\n           * @param {Number} perPage\n           * @param {Number} currentPage\n           * @param {Function} callback\n           * @return void\n           */\n          list: function (perPage, currentPage, callback) {\n            var params = null;\n\n            if (typeof callback === 'function') {\n              params = {\n                perPage: perPage,\n                currentPage: currentPage,\n              };\n            } else {\n              callback = perPage;\n            }\n\n            httpRequest(\n              {\n                hostname: VOICE_ENDPOINT,\n                method: 'GET',\n                path: '/webhooks',\n                params: params,\n              },\n              callback\n            );\n          },\n\n          /**\n           * Deletes webhook\n           *\n           * @param {String} id\n           * @param {Function} callback\n           * @return {void}\n           */\n          delete: function (id, callback) {\n            httpRequest(\n              {\n                hostname: VOICE_ENDPOINT,\n                method: 'DELETE',\n                path: '/webhooks/' + id,\n              },\n              callback\n            );\n          },\n        },\n      },\n\n      contacts: {\n        /**\n         * Create a new contact. Params is optional.\n         *\n         * @param {String} phoneNumber\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        create: function (phoneNumber, params, callback) {\n          if (typeof params === 'function') {\n            callback = params;\n            params = {};\n          }\n\n          params.msisdn = phoneNumber;\n\n          httpRequest(\n            { method: 'POST', path: '/contacts', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Deletes an existing contact. The callback is invoked with an error if\n         * applicable, but the data will never contain anything meaningful as the\n         * API returns an empty response for successful deletes.\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return void\n         */\n        delete: function (id, callback) {\n          httpRequest({ method: 'DELETE', path: '/contacts/' + id }, callback);\n        },\n\n        /**\n         * Lists existing contacts. Pagination is optional. If a limit is set, an\n         * offset is also required.\n         *\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            { method: 'GET', path: '/contacts', params: params },\n            callback\n          );\n        },\n\n        /**\n         * View an existing contact.\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return void\n         */\n        read: function (id, callback) {\n          httpRequest({ method: 'GET', path: '/contacts/' + id }, callback);\n        },\n\n        /**\n         * Updates an existing contact. Params is optional.\n         *\n         * @param {String} id\n         * @param {String} name\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        update: function (id, params, callback) {\n          httpRequest(\n            { method: 'PATCH', path: '/contacts/' + id, params: params },\n            callback\n          );\n        },\n\n        /**\n         * Lists the groups a contact is part of.\n         *\n         * @param {String} contactId\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        listGroups: function (contactId, limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            {\n              method: 'GET',\n              path: '/contacts/' + contactId + '/groups',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Lists the messages for a contact.\n         *\n         * @param {String} contactId\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        listMessages: function (contactId, limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            {\n              method: 'GET',\n              path: '/contacts/' + contactId + '/messages',\n              params: params,\n            },\n            callback\n          );\n        },\n      },\n\n      callflows: {\n        /**\n         * Lists existing call flows.\n         * @param {Number} page\n         * @param {Number} perpage\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (page, perpage, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              page: page,\n              perPage: perpage,\n            };\n          } else {\n            callback = page;\n          }\n\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: '/call-flows',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Creates a new call flow, params are mandatory.\n         *\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        create: function (params, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'POST',\n              path: '/call-flows',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Get a call flow\n         *\n         * @param {String} flowId\n         * @param {Function} callback\n         * @return {void}\n         */\n        read: function (flowId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: '/call-flows/' + flowId,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Deletes an existing call flow. The callback is invoked with an error if\n         * applicable, but the data will never contain anything meaningful as the\n         * API returns an empty response for successful deletes.\n         *\n         * @param {String} flowId\n         * @param {Function} callback\n         * @return void\n         */\n        delete: function (flowId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'DELETE',\n              path: '/call-flows/' + flowId,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Updates an existing call flow. Params are required.\n         *\n         * @param {String} flowId\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        update: function (flowId, params, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'PUT',\n              path: '/call-flows/' + flowId,\n              params: params,\n            },\n            callback\n          );\n        },\n      },\n      groups: {\n        /**\n         * Creates a new group. Params is optional.\n         *\n         * @param {String} name\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        create: function (name, params, callback) {\n          if (typeof params === 'function') {\n            callback = params;\n            params = {};\n          }\n\n          params.name = name;\n\n          httpRequest(\n            { method: 'POST', path: '/groups', params: params },\n            callback\n          );\n        },\n\n        /**\n         * Deletes an existing group. The callback is invoked with an error if\n         * applicable, but the data will never contain anything meaningful as the\n         * API returns an empty response for successful deletes.\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return void\n         */\n        delete: function (id, callback) {\n          httpRequest({ method: 'DELETE', path: '/groups/' + id }, callback);\n        },\n\n        /**\n         * Lists existing groups. Pagination is optional. If a limit is set, an\n         * offset is also required.\n         *\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            { method: 'GET', path: '/groups', params: params },\n            callback\n          );\n        },\n\n        /**\n         * View an existing group.\n         *\n         * @param {String} id\n         * @param {Function} callback\n         * @return void\n         */\n        read: function (id, callback) {\n          httpRequest({ method: 'GET', path: '/groups/' + id }, callback);\n        },\n\n        /**\n         * Updates an existing contact. Parmas is optional.\n         *\n         * @param {String} id\n         * @param {String} name\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        update: function (id, name, params, callback) {\n          if (typeof params === 'function') {\n            callback = params;\n            params = {};\n          }\n\n          params.name = name;\n\n          httpRequest(\n            { method: 'PATCH', path: '/groups/' + id, params: params },\n            callback\n          );\n        },\n\n        /**\n         * Adds anywhere from 1 to 50 contacts to a group.\n         *\n         * @param {String} groupId\n         * @param {String[]} contactIds\n         * @param {Function} callback\n         * @return void\n         */\n        addContacts: function (groupId, contactIds, callback) {\n          const params = {\n            groupId,\n            ids: contactIds,\n          };\n\n          httpRequest(\n            { method: 'PUT', path: '/groups/' + groupId + '/contacts', params },\n            callback\n          );\n        },\n\n        /**\n         * Lists the contacts that are part of a group.\n         *\n         * @param {String} groupId\n         * @param {Number} limit\n         * @param {Number} offset\n         * @param {Function} callback\n         * @return void\n         */\n        listContacts: function (groupId, limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit: limit,\n              offset: offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            {\n              method: 'GET',\n              path: '/groups/' + groupId + '/contacts',\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Removes a single contact from a group.\n         *\n         * @param {String} groupId\n         * @param {String} contactId\n         * @param {Function} callback\n         * @return void\n         */\n        removeContact: function (groupId, contactId, callback) {\n          httpRequest(\n            {\n              method: 'DELETE',\n              path: '/groups/' + groupId + '/contacts/' + contactId,\n            },\n            callback\n          );\n        },\n      },\n      calls: {\n        /**\n         * Create a call.\n         *\n         * @param {Object} params\n         * @param {Function} callback\n         * @return void\n         */\n        create: function (params, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'POST',\n              path: '/calls',\n              params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * List calls.\n         *\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: '/calls',\n            },\n            callback\n          );\n        },\n\n        /**\n         * Read a call.\n         *\n         * @param {String} callId\n         * @param {Function} callback\n         * @return void\n         */\n        read: function (callId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: `/calls/${callId}`,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Delete a call.\n         *\n         * @param {String} callId\n         * @param {Function} callback\n         * @return void\n         */\n        delete: function (callId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'DELETE',\n              path: `/calls/${callId}`,\n            },\n            callback\n          );\n        },\n      },\n      recordings: {\n        /**\n         * View an existing recording.\n         *\n         * @param {String} callId\n         * @param {String} legId\n         * @param {String} recordingId\n         * @param {Function} callback\n         * @return void\n         */\n        read: function (callId, legId, recordingId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: `/calls/${callId}/legs/${legId}/recordings/${recordingId}`,\n            },\n            callback\n          );\n        },\n\n        /**\n         * List recordings.\n         *\n         * @param {String} callId\n         * @param {String} legId\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (callId, legId, limit, offset, callback) {\n          var params = null;\n\n          if (typeof callback === 'function') {\n            params = {\n              limit,\n              offset,\n            };\n          } else {\n            callback = limit;\n          }\n\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: `/calls/${callId}/legs/${legId}/recordings`,\n              params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Delete recordings.\n         *\n         * @param {String} callId\n         * @param {String} legId\n         * @param {String} recId\n         * @param {Function} callback\n         * @return void\n         */\n\n        delete: function (callId, legId, recId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'DELETE',\n              path: `/calls/${callId}/legs/${legId}/recordings/${recId}`,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Download an existing recording.\n         *\n         * @param {String} callId\n         * @param {String} legId\n         * @param {String} recordingId\n         * @param {Function} callback\n         * @return void\n         */\n        download: function (callId, legId, recordingId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: `/calls/${callId}/legs/${legId}/recordings/${recordingId}.wav`,\n            },\n            callback\n          );\n        },\n      },\n      transcriptions: {\n        /**\n         * Creates a new transcription.\n         * @param {String} callId\n         * @param {String} legId\n         * @param {String} recordingId\n         * @param {String} language\n         * @param {Function} callback\n         * @return void\n         */\n        create: function (callId, legId, recordingId, language, callback) {\n          var params = {\n            language: language,\n          };\n\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'POST',\n              path: `/calls/${callId}/legs/${legId}/recordings/${recordingId}/transcriptions`,\n              params: params,\n            },\n            callback\n          );\n        },\n\n        /**\n         * List transcriptions.\n         * @param {String} callId\n         * @param {String} legId\n         * @param {String} recordingId\n         * @param {Function} callback\n         * @return void\n         */\n        list: function (callId, legId, recordingId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: `/calls/${callId}/legs/${legId}/recordings/${recordingId}/transcriptions`,\n            },\n            callback\n          );\n        },\n\n        /**\n         * View an existing transcription.\n         *\n         * @param {String} callId\n         * @param {String} legId\n         * @param {String} recordingId\n         * @param {String} language\n         * @param {Function} callback\n         * @return void\n         */\n        read: function (callId, legId, recordingId, transcriptionId, callback) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: `/calls/${callId}/legs/${legId}/recordings/${recordingId}/transcriptions/${transcriptionId}`,\n            },\n            callback\n          );\n        },\n\n        /**\n         * Downloads an existing transcription.\n         * @param {String} callId\n         * @param {String} legId\n         * @param {String} recordingId\n         * @param {String} transcriptionId\n         * @param {Function} callback\n         * @return void\n         */\n        download: function (\n          callId,\n          legId,\n          recordingId,\n          transcriptionId,\n          callback\n        ) {\n          httpRequest(\n            {\n              hostname: VOICE_ENDPOINT,\n              method: 'GET',\n              path: `/calls/${callId}/legs/${legId}/recordings/${recordingId}/transcriptions/${transcriptionId}.txt`,\n            },\n            callback\n          );\n        },\n      },\n    };\n  },\n};\n"]}