@resolveio/server-lib 1.0.0-rc4 → 1.0.0-rc6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/collections/active-subscription.collection.d.ts +8 -0
  2. package/collections/active-subscription.collection.js +68 -2
  3. package/collections/app-status.collection.d.ts +8 -0
  4. package/collections/app-status.collection.js +43 -2
  5. package/collections/app-version.collection.d.ts +8 -0
  6. package/collections/app-version.collection.js +56 -2
  7. package/collections/counter.collection.d.ts +10 -0
  8. package/collections/counter.collection.js +73 -2
  9. package/collections/cron-job-history.collection.d.ts +8 -0
  10. package/collections/cron-job-history.collection.js +86 -2
  11. package/collections/cron-job.collection.d.ts +8 -0
  12. package/collections/cron-job.collection.js +89 -2
  13. package/collections/file.collection.d.ts +10 -0
  14. package/collections/file.collection.js +73 -2
  15. package/collections/flag.collection.d.ts +8 -0
  16. package/collections/flag.collection.js +47 -2
  17. package/collections/log.collection.d.ts +8 -0
  18. package/collections/log.collection.js +64 -2
  19. package/collections/logged-in-users.collection.d.ts +8 -0
  20. package/collections/logged-in-users.collection.js +70 -2
  21. package/collections/method-call.collection.d.ts +7 -0
  22. package/collections/method-call.collection.js +44 -2
  23. package/collections/method-response.collection.d.ts +7 -0
  24. package/collections/method-response.collection.js +48 -2
  25. package/collections/queue-flag.collection.d.ts +8 -0
  26. package/collections/queue-flag.collection.js +41 -2
  27. package/collections/queue-method.collection.d.ts +8 -0
  28. package/collections/queue-method.collection.js +116 -2
  29. package/collections/queue-response.collection.d.ts +8 -0
  30. package/collections/queue-response.collection.js +78 -2
  31. package/collections/support-ticket.collection.d.ts +8 -0
  32. package/collections/support-ticket.collection.js +146 -2
  33. package/collections/user.collection.d.ts +9 -0
  34. package/collections/user.collection.js +108 -2
  35. package/cron/cron.d.ts +6 -0
  36. package/cron/cron.js +160 -2
  37. package/fixtures/cron-jobs.d.ts +2 -0
  38. package/fixtures/cron-jobs.js +72 -2
  39. package/fixtures/init.d.ts +2 -0
  40. package/fixtures/init.js +73 -2
  41. package/http/auth.d.ts +3 -0
  42. package/http/auth.js +472 -2
  43. package/http/health.d.ts +2 -0
  44. package/http/health.js +8 -2
  45. package/index.d.ts +14 -0
  46. package/index.js +97 -2
  47. package/managers/cron.manager.d.ts +17 -0
  48. package/managers/cron.manager.js +193 -2
  49. package/managers/method.manager.d.ts +27 -0
  50. package/managers/method.manager.js +513 -2
  51. package/managers/queue-method.manager.d.ts +14 -0
  52. package/managers/queue-method.manager.js +239 -2
  53. package/managers/subscription.manager.d.ts +27 -0
  54. package/managers/subscription.manager.js +700 -2
  55. package/managers/support.manager.d.ts +18 -0
  56. package/managers/support.manager.js +208 -2
  57. package/methods/accounts.d.ts +3 -0
  58. package/methods/accounts.js +253 -2
  59. package/methods/aws.d.ts +3 -0
  60. package/methods/aws.js +323 -2
  61. package/methods/cloudconvert.d.ts +3 -0
  62. package/methods/cloudconvert.js +37 -2
  63. package/methods/collections.d.ts +3 -0
  64. package/methods/collections.js +738 -2
  65. package/methods/counters.d.ts +3 -0
  66. package/methods/counters.js +404 -2
  67. package/methods/cron-jobs.d.ts +3 -0
  68. package/methods/cron-jobs.js +63 -2
  69. package/methods/flags.d.ts +3 -0
  70. package/methods/flags.js +6 -2
  71. package/methods/logs.d.ts +3 -0
  72. package/methods/logs.js +29 -2
  73. package/methods/pdf.d.ts +3 -0
  74. package/methods/pdf.js +303 -2
  75. package/models/active-subscription.model.d.ts +14 -0
  76. package/models/active-subscription.model.js +2 -2
  77. package/models/app-status.model.d.ts +5 -0
  78. package/models/app-status.model.js +2 -2
  79. package/models/app-version.model.d.ts +5 -0
  80. package/models/app-version.model.js +2 -2
  81. package/models/collection-document.model.d.ts +7 -0
  82. package/models/collection-document.model.js +2 -2
  83. package/models/counter.model.d.ts +6 -0
  84. package/models/counter.model.js +2 -2
  85. package/models/cron-job-history.model.d.ts +13 -0
  86. package/models/cron-job-history.model.js +2 -2
  87. package/models/cron-job.model.d.ts +14 -0
  88. package/models/cron-job.model.js +2 -2
  89. package/models/dialog.model.d.ts +24 -0
  90. package/models/dialog.model.js +2 -2
  91. package/models/file.model.d.ts +10 -0
  92. package/models/file.model.js +2 -2
  93. package/models/flag.model.d.ts +6 -0
  94. package/models/flag.model.js +2 -2
  95. package/models/log.model.d.ts +12 -0
  96. package/models/log.model.js +2 -2
  97. package/models/logged-in-users.model.d.ts +10 -0
  98. package/models/logged-in-users.model.js +2 -2
  99. package/models/method-call.model.d.ts +8 -0
  100. package/models/method-call.model.js +2 -2
  101. package/models/method-response.model.d.ts +9 -0
  102. package/models/method-response.model.js +2 -2
  103. package/models/method.model.d.ts +11 -0
  104. package/models/method.model.js +2 -2
  105. package/models/pagination.model.d.ts +12 -0
  106. package/models/pagination.model.js +20 -2
  107. package/models/permission.model.d.ts +13 -0
  108. package/models/permission.model.js +2 -2
  109. package/models/queue-method.model.d.ts +10 -0
  110. package/models/queue-method.model.js +2 -2
  111. package/models/queue-response.model.d.ts +11 -0
  112. package/models/queue-response.model.js +2 -2
  113. package/models/select-data-label.model.d.ts +10 -0
  114. package/models/select-data-label.model.js +2 -2
  115. package/models/server-response.model.d.ts +6 -0
  116. package/models/server-response.model.js +2 -2
  117. package/models/subscription.model.d.ts +31 -0
  118. package/models/subscription.model.js +2 -2
  119. package/models/support-method.model.d.ts +10 -0
  120. package/models/support-method.model.js +2 -2
  121. package/models/support-ticket.model.d.ts +40 -0
  122. package/models/support-ticket.model.js +2 -2
  123. package/models/user.model.d.ts +15 -0
  124. package/models/user.model.js +2 -2
  125. package/package.json +3 -1
  126. package/publications/app-status.d.ts +3 -0
  127. package/publications/app-status.js +14 -2
  128. package/publications/app-version.d.ts +3 -0
  129. package/publications/app-version.js +14 -2
  130. package/publications/cron-jobs.d.ts +3 -0
  131. package/publications/cron-jobs.js +14 -2
  132. package/publications/files.d.ts +3 -0
  133. package/publications/files.js +71 -2
  134. package/publications/flags.d.ts +3 -0
  135. package/publications/flags.js +23 -2
  136. package/publications/logs.d.ts +3 -0
  137. package/publications/logs.js +26 -2
  138. package/publications/method-calls.d.ts +3 -0
  139. package/publications/method-calls.js +14 -2
  140. package/publications/method-responses.d.ts +3 -0
  141. package/publications/method-responses.js +14 -2
  142. package/publications/super-admin.d.ts +3 -0
  143. package/publications/super-admin.js +21 -2
  144. package/publications/support-tickets.d.ts +2 -0
  145. package/publications/support-tickets.js +118 -2
  146. package/server-app.d.ts +33 -0
  147. package/server-app.js +598 -2
  148. package/support-methods/aws.d.ts +3 -0
  149. package/support-methods/aws.js +276 -2
  150. package/support-methods/collections.d.ts +3 -0
  151. package/support-methods/collections.js +471 -2
  152. package/support-methods/counters.d.ts +3 -0
  153. package/support-methods/counters.js +189 -2
  154. package/support-methods/support.d.ts +3 -0
  155. package/support-methods/support.js +19 -2
  156. package/util/common.d.ts +15 -0
  157. package/util/common.js +334 -2
@@ -1,2 +1,513 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var collections_1=require("../methods/collections"),logs_1=require("../methods/logs"),counters_1=require("../methods/counters"),pdf_1=require("../methods/pdf"),aws_1=require("../methods/aws"),cloudconvert_1=require("../methods/cloudconvert"),path=require("path"),fs=require("fs"),nodemailer=require("nodemailer"),aws=require("aws-sdk"),accounts_1=require("../methods/accounts"),init_1=require("../fixtures/init"),cron_jobs_1=require("../fixtures/cron-jobs"),cron_jobs_2=require("../methods/cron-jobs"),flags_1=require("../methods/flags"),method_response_collection_1=require("../collections/method-response.collection"),mongoose_1=require("mongoose"),common_1=require("../util/common"),log_collection_1=require("../collections/log.collection"),MethodManager=function(){function e(e,o){var r=this;this._methods={},this._sendQueue=[],this._runningQueue=!1,this._mainServer=e,this.serverConfig=o,init_1.loadServerInit(),cron_jobs_1.loadServerCronJobs(),accounts_1.loadAccountMethods(this),aws_1.loadAWSMethods(this),cloudconvert_1.loadCloudConvertMethods(this),collections_1.loadCollectionMethods(this),counters_1.loadCounterMethods(this),logs_1.loadLogMethods(this),pdf_1.loadPDFMethods(this),cron_jobs_2.loadCronJobMethods(this),flags_1.loadFlagMethods(this),this._mailer=nodemailer.createTransport({SES:new aws.SES({apiVersion:"2010-12-01",accessKeyId:o.AWSACCESSKEYID,secretAccessKey:o.AWSSECRETACCESSKEY,region:o.AWSSES_REGION})}),this._aws=new aws.S3({accessKeyId:o.AWSACCESSKEYID,secretAccessKey:o.AWSSECRETACCESSKEY,region:o.AWSREGION}),setInterval(function(){if(!r._runningQueue&&r._sendQueue.length){r._runningQueue=!0;for(var e=function(e){var o=r._mainServer.getWS(r._sendQueue[e].id_ws);if(o&&o.readyState===o.OPEN){if(o.bufferedAmount<20480){var t=r._sendQueue.pop();o.send(JSON.stringify(t.data),function(e){e&&(console.log("Error on WS: ",e),r._mainServer.unsubscribeWS(o))}),"countQuery"!==t.method&&"countCollectionWithQuery"!==t.method&&"find"!==t.method&&"findOne"!==t.method&&"findWithOptions"!==t.method&&"setWSAppVersion"!==t.method&&"uploadFileAndSave"!==t.method&&(common_1.getBinarySize(JSON.stringify(t.methodData))<2e5&&common_1.getBinarySize(JSON.stringify(t.data))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"client-response",title:"Client Response",message:"User: "+o.user+", MessageId: "+t.data.messageId+", Method: "+t.method,payload:[JSON.stringify(t.methodData),t.data],method:t.method,user:o.user,messageId:t.data.messageId}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"client-response",title:"Client Response",message:"User: "+o.user+", MessageId: "+t.data.messageId+", Method: "+t.method,payload:"Too Big",method:t.method,user:o.user,messageId:t.data.messageId})),method_response_collection_1.MethodResponses.create({_id:mongoose_1.Types.ObjectId().toHexString(),__v:0,id_user:o.id_user,message_id:t.data.messageId,data:JSON.stringify(t.methodData),response:t.data,method:t.method})}}else r._sendQueue.splice(e,1)},o=r._sendQueue.length-1;0<=o;o--)e(o);r._runningQueue=!1}},50)}return e.prototype.getMainServer=function(){return this._mainServer},e.prototype.methods=function(e){this._methods=Object.assign(this._methods,e)},e.prototype.callMethodCron=function(o){for(var e,t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];var s=this;if(!s._methods[o])return console.log("No Method: "+o),void s.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+s.serverConfig.CLIENT_NAME,"No Method: "+o);if((1<t.length||t[0])&&!s._methods[o].skipValidation){if(!s._methods[o].check)return console.error("No Check Function For Method "+o),void s.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+s.serverConfig.CLIENT_NAME,"No Check Function For Method "+o);if(!s._methods[o].check._schema)return console.error("No Check Schema For Method "+o),void s.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+s.serverConfig.CLIENT_NAME,"No Check Function For Method "+o);for(var n={},d=Object.keys(s._methods[o].check._schema).filter(function(e){return!e.includes(".")}),i=0;i<t.length;i++)n[d[i]]=t[i];try{s._methods[o].check.validate(n)}catch(e){if(e)return console.error("Error in Method Check ("+o+")",e),void s.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+s.serverConfig.CLIENT_NAME,"Match Error On Method "+o+"\n\nData Being Checked\n"+JSON.stringify(n,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2))}}(e=s._methods[o].function).call.apply(e,[Object.assign({},s,{id_user:"",user:"",id_ws:""})].concat(t))},e.prototype.callMethodQueue=function(t){var e,r=this,s=common_1.deepCopy(t),o=this;if(o._methods[t.method]){if((1<t.method_data.length||t.method_data[0])&&!o._methods[t.method].skipValidation){if(!o._methods[t.method].check){console.error("No Check Function For Method "+t.method),o.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"No Check Function For Method "+t.method);a={messageId:t.messageId,hasError:!0,data:"Internal Error"};return void this._mainServer.getQueueManager().addMethodResponse(s,a)}if(!o._methods[t.method].check._schema){console.error("No Check Schema For Method "+t.method),o.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"No Check Function For Method "+t.method);a={messageId:t.messageId,hasError:!0,data:"Internal Error"};return void this._mainServer.getQueueManager().addMethodResponse(s,a)}for(var n={},d=Object.keys(o._methods[t.method].check._schema).filter(function(e){return!e.includes(".")}),i=0;i<t.method_data.length;i++)n[d[i]]=t.method_data[i];try{o._methods[t.method].check.validate(n)}catch(e){if(e){console.error("Error in Method Check ("+t.method+")",e),o.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"Match Error On Method "+t.method+"\n\nData Being Checked\n"+JSON.stringify(n,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2));a={messageId:t.messageId,hasError:!0,data:"Internal Error"};return void this._mainServer.getQueueManager().addMethodResponse(s,a)}}}(e=o._methods[t.method].function).call.apply(e,[Object.assign({},o,{id_user:t.id_user,user:t.user,id_ws:t.id_ws})].concat(t.method_data)).then(function(e){var o={messageId:t.messageId,hasError:!1,data:e};r._mainServer.getQueueManager().addMethodResponse(s,o)},function(e){var o={messageId:t.messageId,hasError:!0,data:e};r._mainServer.getQueueManager().addMethodResponse(s,o)})}else{console.log("No Method: "+t.method),o.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"No Method: "+t.method);var a={messageId:t.messageId,hasError:!0,data:"Internal Error"};this._mainServer.getQueueManager().addMethodResponse(s,a)}},e.prototype.callMethod=function(t,r,s){for(var e,n=this,d=[],o=3;o<arguments.length;o++)d[o-3]=arguments[o];var i=this;if(i._methods[s]){if((1<d.length||d[0])&&!i._methods[s].skipValidation){if(!i._methods[s].check){console.error("No Check Function For Method "+s),i.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+i.serverConfig.CLIENT_NAME,"No Check Function For Method "+s);l={messageId:r,hasError:!0,data:"Internal Error"};return void this.sendWS(t,s,d,l)}if(!i._methods[s].check._schema){console.error("No Check Schema For Method "+s),i.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+i.serverConfig.CLIENT_NAME,"No Check Function For Method "+s);l={messageId:r,hasError:!0,data:"Internal Error"};return void this.sendWS(t,s,d,l)}for(var a={},c=Object.keys(i._methods[s].check._schema).filter(function(e){return!e.includes(".")}),h=0;h<d.length;h++)a[c[h]]=d[h];try{i._methods[s].check.validate(a)}catch(e){if(e){console.error("Error in Method Check ("+s+")",e),i.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+i.serverConfig.CLIENT_NAME,"Match Error On Method "+s+"\n\nData Being Checked\n"+JSON.stringify(a,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2));l={messageId:r,hasError:!0,data:"Internal Error"};return void this.sendWS(t,s,d,l)}}}(e=i._methods[s].function).call.apply(e,[Object.assign({},i,{id_user:t.id_user,user:t.user,id_ws:t.id_socket})].concat(d)).then(function(e){var o={messageId:r,hasError:!1,data:e};n.sendWS(t,s,d,o)},function(e){var o={messageId:r,hasError:!0,data:e};n.sendWS(t,s,d,o)})}else{console.log("No Method: "+s),i.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+i.serverConfig.CLIENT_NAME,"No Method: "+s);var l={messageId:r,hasError:!0,data:"Internal Error"};this.sendWS(t,s,d,l)}},e.prototype.callMethodInternal=function(e){for(var o,t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];var s=this;if(s._methods[e]){if((1<t.length||t[0]&&"function"!=typeof t[0])&&!s._methods[e].skipValidation){if(!s._methods[e].check)return void console.error("No Check Function For Method "+e);if(!s._methods[e].check._schema)return void console.error("No Check Schema For Method "+e)}var n=(o=s._methods[e].function).call.apply(o,[s].concat(t));return t[t.length-1]&&"function"==typeof t[t.length-1]&&n.then(function(e){return t[t.length-1](null,e)},function(e){return t[t.length-1](e,null)}),n}console.log("No Method: "+e)},e.prototype.sendWS=function(e,o,t,r){this._sendQueue.splice(0,0,{id_ws:e.id_socket,method:o,methodData:t,data:r})},e.prototype.sendEmail=function(e,o,t,r,s){this._mailer.sendMail({replyTo:void 0,from:this.serverConfig.MAIL_FROM,to:e,subject:o,text:t,html:r,attachments:s},function(e,o){e&&console.log(e)})},e.prototype.getAWS=function(){return this._aws},e.prototype.readFile=function(e){return new Promise(function(t,r){fs.readFile(path.join(__dirname,"../private/"+e),"utf-8",function(e,o){e?r(e):t(o)})})},e.prototype.readImage=function(e){return new Promise(function(t,r){fs.readFile(path.join(__dirname,"../private/"+e),"base64",function(e,o){e?r(e):t(o)})})},e}();exports.MethodManager=MethodManager;
2
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2Vycy9tZXRob2QubWFuYWdlci50cyJdLCJuYW1lcyI6WyJjb2xsZWN0aW9uc18xIiwicmVxdWlyZSIsImxvZ3NfMSIsImNvdW50ZXJzXzEiLCJwZGZfMSIsImF3c18xIiwiY2xvdWRjb252ZXJ0XzEiLCJwYXRoIiwiZnMiLCJub2RlbWFpbGVyIiwiYXdzIiwiYWNjb3VudHNfMSIsImluaXRfMSIsImNyb25fam9ic18xIiwiY3Jvbl9qb2JzXzIiLCJmbGFnc18xIiwibWV0aG9kX3Jlc3BvbnNlX2NvbGxlY3Rpb25fMSIsIm1vbmdvb3NlXzEiLCJjb21tb25fMSIsImxvZ19jb2xsZWN0aW9uXzEiLCJNZXRob2RNYW5hZ2VyIiwibWFpblNlcnZlciIsInNlcnZlckNvbmZpZyIsIl90aGlzIiwidGhpcyIsIl9tZXRob2RzIiwiX3NlbmRRdWV1ZSIsIl9ydW5uaW5nUXVldWUiLCJfbWFpblNlcnZlciIsImxvYWRTZXJ2ZXJJbml0IiwibG9hZFNlcnZlckNyb25Kb2JzIiwibG9hZEFjY291bnRNZXRob2RzIiwibG9hZEFXU01ldGhvZHMiLCJsb2FkQ2xvdWRDb252ZXJ0TWV0aG9kcyIsImxvYWRDb2xsZWN0aW9uTWV0aG9kcyIsImxvYWRDb3VudGVyTWV0aG9kcyIsImxvYWRMb2dNZXRob2RzIiwibG9hZFBERk1ldGhvZHMiLCJsb2FkQ3JvbkpvYk1ldGhvZHMiLCJsb2FkRmxhZ01ldGhvZHMiLCJfbWFpbGVyIiwiY3JlYXRlVHJhbnNwb3J0IiwiU0VTIiwiYXBpVmVyc2lvbiIsImFjY2Vzc0tleUlkIiwiQVdTQUNDRVNTS0VZSUQiLCJzZWNyZXRBY2Nlc3NLZXkiLCJBV1NTRUNSRVRBQ0NFU1NLRVkiLCJyZWdpb24iLCJBV1NTRVNfUkVHSU9OIiwiX2F3cyIsIlMzIiwiQVdTUkVHSU9OIiwic2V0SW50ZXJ2YWwiLCJsZW5ndGgiLCJpIiwid3MiLCJnZXRXUyIsImlkX3dzIiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJidWZmZXJlZEFtb3VudCIsInNlbmRJdGVtIiwicG9wIiwic2VuZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhIiwiZXJyb3IiLCJjb25zb2xlIiwibG9nIiwidW5zdWJzY3JpYmVXUyIsIm1ldGhvZCIsImdldEJpbmFyeVNpemUiLCJtZXRob2REYXRhIiwiTG9ncyIsImNyZWF0ZSIsIl9pZCIsIlR5cGVzIiwiT2JqZWN0SWQiLCJ0b0hleFN0cmluZyIsImRhdGUiLCJEYXRlIiwidHlwZSIsInRpdGxlIiwibWVzc2FnZSIsIm1lc3NhZ2VJZCIsInBheWxvYWQiLCJ1c2VyIiwiTWV0aG9kUmVzcG9uc2VzIiwiX192IiwiaWRfdXNlciIsIm1lc3NhZ2VfaWQiLCJyZXNwb25zZSIsInNwbGljZSIsInByb3RvdHlwZSIsImdldE1haW5TZXJ2ZXIiLCJtZXRob2RzIiwiT2JqZWN0IiwiYXNzaWduIiwiY2FsbE1ldGhvZENyb24iLCJfaSIsImFyZ3VtZW50cyIsInRoYXQiLCJzZW5kRW1haWwiLCJza2lwVmFsaWRhdGlvbiIsImNoZWNrIiwiX3NjaGVtYSIsInZhbE9iaiIsInJvb3RLZXlzIiwia2V5cyIsImZpbHRlciIsImEiLCJpbmNsdWRlcyIsInZhbGlkYXRlIiwiZXJyb3JzIiwiX2EiLCJmdW5jdGlvbiIsImNhbGwiLCJhcHBseSIsImNvbmNhdCIsImNhbGxNZXRob2RRdWV1ZSIsInVwZGF0ZSIsInVwZGF0ZUNvcHkiLCJkZWVwQ29weSIsIm1ldGhvZF9kYXRhIiwic2VydmVyUmVzIiwiaGFzRXJyb3IiLCJnZXRRdWV1ZU1hbmFnZXIiLCJhZGRNZXRob2RSZXNwb25zZSIsInRoZW4iLCJyZXMiLCJlcnIiLCJjYWxsTWV0aG9kIiwic2VuZFdTIiwiY2FsbE1ldGhvZEludGVybmFsIiwicHJvbWlzZSIsInNlbmRUbyIsInN1YmplY3QiLCJ0ZXh0IiwiaHRtbCIsImF0dGFjaG1lbnRzIiwic2VuZE1haWwiLCJyZXBseVRvIiwidW5kZWZpbmVkIiwiZnJvbSIsIk1BSUxfRlJPTSIsInRvIiwiaW5mbyIsImdldEFXUyIsInJlYWRGaWxlIiwiZmlsZU5hbWUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJyZWFkSW1hZ2UiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoib0VBQ0EsSUFBQUEsY0FBQUMsUUFBQSwwQkFFQUMsT0FBQUQsUUFBQSxtQkFDQUUsV0FBQUYsUUFBQSx1QkFDQUcsTUFBQUgsUUFBQSxrQkFDQUksTUFBQUosUUFBQSxrQkFDQUssZUFBQUwsUUFBQSwyQkFDQU0sS0FBQU4sUUFBQSxRQUNBTyxHQUFBUCxRQUFBLE1BQ0FRLFdBQUFSLFFBQUEsY0FFQVMsSUFBQVQsUUFBQSxXQUNBVSxXQUFBVixRQUFBLHVCQUNBVyxPQUFBWCxRQUFBLG9CQUNBWSxZQUFBWixRQUFBLHlCQUNBYSxZQUFBYixRQUFBLHdCQUNBYyxRQUFBZCxRQUFBLG9CQUVBZSw2QkFBQWYsUUFBQSw2Q0FDQWdCLFdBQUFoQixRQUFBLFlBQ0FpQixTQUFBakIsUUFBQSxrQkFDQWtCLGlCQUFBbEIsUUFBQSxpQ0FHQW1CLGNBQUEsV0FZQyxTQUFBQSxFQUFZQyxFQUFZQyxHQUF4QixJQUFBQyxFQUFBQyxLQVRPQSxLQUFBQyxTQUF3QixHQU12QkQsS0FBQUUsV0FBYSxHQUNiRixLQUFBRyxlQUFnQixFQUd2QkgsS0FBS0ksWUFBY1AsRUFFbkJHLEtBQUtGLGFBQWVBLEVBR3BCVixPQUFBaUIsaUJBQ0FoQixZQUFBaUIscUJBR0FuQixXQUFBb0IsbUJBQW1CUCxNQUNuQm5CLE1BQUEyQixlQUFlUixNQUNmbEIsZUFBQTJCLHdCQUF3QlQsTUFDeEJ4QixjQUFBa0Msc0JBQXNCVixNQUN0QnJCLFdBQUFnQyxtQkFBbUJYLE1BQ25CdEIsT0FBQWtDLGVBQWVaLE1BQ2ZwQixNQUFBaUMsZUFBZWIsTUFDZlYsWUFBQXdCLG1CQUFtQmQsTUFDbkJULFFBQUF3QixnQkFBZ0JmLE1BRWhCQSxLQUFLZ0IsUUFBVS9CLFdBQVdnQyxnQkFBZ0IsQ0FDekNDLElBQUssSUFBSWhDLElBQUlnQyxJQUFJLENBQ2hCQyxXQUFZLGFB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QUNIc0IsRUFBT3RCLEdBR1BxQixFQUFRdEIsUUFLYi9HLEVBM2tCQSxHQUFhMEksUUFBQTFJLGNBQUFBIiwiZmlsZSI6Im1hbmFnZXJzL21ldGhvZC5tYW5hZ2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VydmVyUmVzcG9uc2VNb2RlbCB9IGZyb20gJy4uL21vZGVscy9zZXJ2ZXItcmVzcG9uc2UubW9kZWwnO1xuaW1wb3J0IHsgbG9hZENvbGxlY3Rpb25NZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBNZXRob2RNb2RlbCB9IGZyb20gJy4uL21vZGVscy9tZXRob2QubW9kZWwnO1xuaW1wb3J0IHsgbG9hZExvZ01ldGhvZHMgfSBmcm9tICcuLi9tZXRob2RzL2xvZ3MnO1xuaW1wb3J0IHsgbG9hZENvdW50ZXJNZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9jb3VudGVycyc7XG5pbXBvcnQgeyBsb2FkUERGTWV0aG9kcyB9IGZyb20gJy4uL21ldGhvZHMvcGRmJztcbmltcG9ydCB7IGxvYWRBV1NNZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9hd3MnO1xuaW1wb3J0IHsgbG9hZENsb3VkQ29udmVydE1ldGhvZHMgfSBmcm9tICcuLi9tZXRob2RzL2Nsb3VkY29udmVydCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgbm9kZW1haWxlciBmcm9tICdub2RlbWFpbGVyJztcbmltcG9ydCAqIGFzIGltYXAgZnJvbSAnaW1hcCc7XG5pbXBvcnQgKiBhcyBhd3MgZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgeyBsb2FkQWNjb3VudE1ldGhvZHMgfSBmcm9tICcuLi9tZXRob2RzL2FjY291bnRzJztcbmltcG9ydCB7IGxvYWRTZXJ2ZXJJbml0IH0gZnJvbSAnLi4vZml4dHVyZXMvaW5pdCc7XG5pbXBvcnQgeyBsb2FkU2VydmVyQ3JvbkpvYnMgfSBmcm9tICcuLi9maXh0dXJlcy9jcm9uLWpvYnMnO1xuaW1wb3J0IHsgbG9hZENyb25Kb2JNZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9jcm9uLWpvYnMnO1xuaW1wb3J0IHsgbG9hZEZsYWdNZXRob2RzIH0gZnJvbSAnLi4vbWV0aG9kcy9mbGFncyc7XG5pbXBvcnQgeyBRdWV1ZU1ldGhvZE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL3F1ZXVlLW1ldGhvZC5tb2RlbCc7XG5pbXBvcnQgeyBNZXRob2RSZXNwb25zZXMgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy9tZXRob2QtcmVzcG9uc2UuY29sbGVjdGlvbic7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJ21vbmdvb3NlJztcbmltcG9ydCB7IGRlZXBDb3B5LCBnZXRCaW5hcnlTaXplIH0gZnJvbSAnLi4vdXRpbC9jb21tb24nO1xuaW1wb3J0IHsgTG9ncyB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL2xvZy5jb2xsZWN0aW9uJztcbmltcG9ydCB7IFJlc29sdmVJT01haW5TZXJ2ZXIgfSBmcm9tICcuLi9zZXJ2ZXItYXBwJztcblxuZXhwb3J0IGNsYXNzIE1ldGhvZE1hbmFnZXIge1xuXG5cdHByaXZhdGUgX21haW5TZXJ2ZXI6IFJlc29sdmVJT01haW5TZXJ2ZXI7XG5cdHB1YmxpYyBfbWV0aG9kczogTWV0aG9kTW9kZWwgPSB7fTtcblx0cHJpdmF0ZSBfbWFpbGVyOiBub2RlbWFpbGVyLlRyYW5zcG9ydGVyO1xuXHRwcml2YXRlIF9pbWFwOiBpbWFwO1xuXHRwcml2YXRlIF9hd3M6IGF3cy5TMztcblx0cHJpdmF0ZSBzZXJ2ZXJDb25maWc7XG5cblx0cHJpdmF0ZSBfc2VuZFF1ZXVlID0gW107XG5cdHByaXZhdGUgX3J1bm5pbmdRdWV1ZSA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKG1haW5TZXJ2ZXIsIHNlcnZlckNvbmZpZykge1xuXHRcdHRoaXMuX21haW5TZXJ2ZXIgPSBtYWluU2VydmVyO1xuXG5cdFx0dGhpcy5zZXJ2ZXJDb25maWcgPSBzZXJ2ZXJDb25maWc7XG5cblx0XHQvLyBGaXh0dXJlc1xuXHRcdGxvYWRTZXJ2ZXJJbml0KCk7XG5cdFx0bG9hZFNlcnZlckNyb25Kb2JzKCk7XG5cblx0XHQvLyBNZXRob2RzXG5cdFx0bG9hZEFjY291bnRNZXRob2RzKHRoaXMpO1xuXHRcdGxvYWRBV1NNZXRob2RzKHRoaXMpO1xuXHRcdGxvYWRDbG91ZENvbnZlcnRNZXRob2RzKHRoaXMpO1xuXHRcdGxvYWRDb2xsZWN0aW9uTWV0aG9kcyh0aGlzKTtcblx0XHRsb2FkQ291bnRlck1ldGhvZHModGhpcyk7XG5cdFx0bG9hZExvZ01ldGhvZHModGhpcyk7XG5cdFx0bG9hZFBERk1ldGhvZHModGhpcyk7XG5cdFx0bG9hZENyb25Kb2JNZXRob2RzKHRoaXMpO1xuXHRcdGxvYWRGbGFnTWV0aG9kcyh0aGlzKTtcblxuXHRcdHRoaXMuX21haWxlciA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcblx0XHRcdFNFUzogbmV3IGF3cy5TRVMoe1xuXHRcdFx0XHRhcGlWZXJzaW9uOiAnMjAxMC0xMi0wMScsXG5cdFx0XHRcdGFjY2Vzc0tleUlkOiBzZXJ2ZXJDb25maWcuQVdTQUNDRVNTS0VZSUQsXG5cdFx0XHRcdHNlY3JldEFjY2Vzc0tleTogc2VydmVyQ29uZmlnLkFXU1NFQ1JFVEFDQ0VTU0tFWSxcblx0XHRcdFx0cmVnaW9uOiBzZXJ2ZXJDb25maWcuQVdTU0VTX1JFR0lPTlxuXHRcdFx0fSlcblx0XHR9KTtcblxuXHRcdC8vIHRoaXMuX2ltYXAgPSBuZXcgaW1hcCh7XG5cdFx0Ly8gXHR1c2VyOiB0aGlzLnNlcnZlckNvbmZpZ1snT1JERVJTX0VNQUlMJ10sXG5cdFx0Ly8gXHRwYXNzd29yZDogdGhpcy5zZXJ2ZXJDb25maWdbJ09SREVSU19QQVNTV09SRCddLFxuXHRcdC8vIFx0aG9zdDogdGhpcy5zZXJ2ZXJDb25maWdbJ09SREVSU19IT1NUJ10sXG5cdFx0Ly8gXHRwb3J0OiB0aGlzLnNlcnZlckNvbmZpZ1snT1JERVJTX1BPUlQnXSxcblx0XHQvLyBcdHRsczogdGhpcy5zZXJ2ZXJDb25maWdbJ09SREVSU19UTFMnXVxuXHRcdC8vIH0pO1xuXG5cdFx0Ly8gbGV0IHRoYXQgPSB0aGlzO1xuXG5cdFx0Ly8gbGV0IGNoZW1pY2FsTmFtZXMgPSBhd2FpdCBDaGVtaWNhbHMuZmluZCh7fSkuc2VsZWN0KCdkZXNjcmlwdGlvbicpLmV4ZWMoKTtcblx0XHQvLyBsZXQgam9iTmFtZXMgPSBhd2FpdCBKb2JzLmZpbmQoe3N0YXR1czogJ0FjdGl2ZSd9KS5zZWxlY3QoJ3dlbGwnKS5leGVjKCk7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhqb2JOYW1lcy5tYXAoYSA9PiBhLndlbGwpKTtcblxuXHRcdC8vIHRoaXMuX2ltYXAub25jZSgncmVhZHknLCAoKSA9PiB7XG5cdFx0Ly8gXHR0aGlzLl9pbWFwLm9wZW5Cb3goJ0lOQk9YJywgdHJ1ZSwgZnVuY3Rpb24oZXJyLCBib3gpIHtcblx0XHQvLyBcdFx0aWYgKGVycikge1xuXHRcdC8vIFx0XHRcdHRocm93IGVycjtcblx0XHQvLyBcdFx0fVxuXG5cdFx0Ly8gXHRcdHRoYXQuX2ltYXAuc2VhcmNoKFsgJ05FVycgXSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG5cblx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZyhlcnIsIHJlc3VsdHMpO1xuXG5cdFx0Ly8gXHRcdFx0aWYgKGVyciB8fCAhcmVzdWx0cy5sZW5ndGgpIHtcblx0XHQvLyBcdFx0XHRcdHJldHVybiB0aGF0Ll9pbWFwLmVuZCgpO1xuXHRcdC8vIFx0XHRcdH1cblxuXHRcdC8vIFx0XHRcdGxldCBmID0gdGhhdC5faW1hcC5mZXRjaChyZXN1bHRzWzBdLCB7IGJvZGllczogWydIRUFERVIuRklFTERTIChGUk9NKScsICdURVhUJ10gfSk7XG5cdFx0Ly8gXHRcdFx0Zi5vbignbWVzc2FnZScsIGZ1bmN0aW9uKG1zZywgc2Vxbm8pIHtcblx0XHQvLyBcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdNZXNzYWdlICMlZCcsIHNlcW5vKTtcblx0XHQvLyBcdFx0XHRcdGxldCBwcmVmaXggPSAnKCMnICsgc2Vxbm8gKyAnKSAnO1xuXHRcdC8vIFx0XHRcdFx0bXNnLm9uKCdib2R5JywgZnVuY3Rpb24oc3RyZWFtLCBpbmZvKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdGxldCBidWZmZXIgPSAnJywgY291bnQgPSAwO1xuXHRcdC8vIFx0XHRcdFx0XHRzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuXHRcdC8vIFx0XHRcdFx0XHRcdGNvdW50ICs9IGNodW5rLmxlbmd0aDtcblx0XHQvLyBcdFx0XHRcdFx0XHRidWZmZXIgKz0gY2h1bmsudG9TdHJpbmcoJ3V0ZjgnKTtcblx0XHQvLyBcdFx0XHRcdFx0fSk7XG5cdFx0Ly8gXHRcdFx0XHRcdHN0cmVhbS5vbmNlKCdlbmQnLCBmdW5jdGlvbigpIHtcblx0XHQvLyBcdFx0XHRcdFx0XHRpZiAoaW5mby53aGljaCA9PT0gJ1RFWFQnKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhidWZmZXIpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2codHlwZW9mKGJ1ZmZlcikpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0bGV0IGxpbmVzID0gYnVmZmVyLnNwbGl0KCdcXHJcXG4nKTtcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGxpbmVzKTtcblx0XHRcdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBsZXQgaSA9IDA7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBsaW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xuXG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdGxldCBkYXRlOiBEYXRlO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRsZXQgZGF0ZVN0cmluZztcblxuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRpZiAobGluZS5pbmNsdWRlcygnRnJvbScpKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0Y29uc29sZS5sb2cobGluZSk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdH1cblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0aWYgKCFsaW5lLmluY2x1ZGVzKCdjbGFzcz0zRCcpICYmICFsaW5lLmluY2x1ZGVzKCdzdHlsZT0zRCcpKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0aWYgKGxpbmUuaW5jbHVkZXMoJ1dlbGwnKSB8fCBsaW5lLmluY2x1ZGVzKCdXZWxsIE5hbWUnKSB8fCBsaW5lLmluY2x1ZGVzKCdKb2InKSB8fCBsaW5lLmluY2x1ZGVzKCdQYWQnKSkge1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0bGV0IGJlc3QgPSBzdHJpbmdTaW1pbGFyaXR5LmZpbmRCZXN0TWF0Y2gobGluZSwgam9iTmFtZXMubWFwKGEgPT4gYS53ZWxsKSkuYmVzdE1hdGNoO1xuXHRcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRcdGlmIChiZXN0ICYmIGJlc3QucmF0aW5nID4gMC41KSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRcdGNvbnNvbGUubG9nKCdXZWxsJywgbGluZSk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHR9XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0fVxuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdGlmIChsaW5lLmluY2x1ZGVzKCdQcm9kdWN0JykgfHwgbGluZS5pbmNsdWRlcygnQ2hlbWljYWwnKSkge1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0bGV0IGJlc3QgPSBzdHJpbmdTaW1pbGFyaXR5LmZpbmRCZXN0TWF0Y2gobGluZSwgY2hlbWljYWxOYW1lcy5tYXAoYSA9PiBhLmRlc2NyaXB0aW9uKSkuYmVzdE1hdGNoO1xuXHRcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRcdGlmIChiZXN0ICYmIGJlc3QucmF0aW5nID4gMC41KSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRcdGNvbnNvbGUubG9nKCdDaGVtaWNhbCcsIGxpbmUpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0fVxuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdH1cblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRpZiAobGluZS5pbmNsdWRlcygnUXVhbnRpdHknKSB8fCBsaW5lLmluY2x1ZGVzKCdRdHknKSB8fCBsaW5lLmluY2x1ZGVzKCdBbW91bnQnKSkge1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0Y29uc29sZS5sb2coJ1F0eScsIGxpbmUpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdH1cblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRpZiAobGluZS5pbmNsdWRlcygnRGF0ZScpKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZygnRGF0ZScsIGxpbmUpO1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0Y29uc29sZS5sb2cobW9tZW50KERhdGUucGFyc2UobGluZSkpKTtcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRcdGRhdGUgPSBtb21lbnQoRGF0ZS5wYXJzZShsaW5lKSkudG9EYXRlKCk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRkYXRlU3RyaW5nID0gbGluZTtcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHR9XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0aWYgKGxpbmUuaW5jbHVkZXMoJ1RpbWUnKSkge1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHRcdFx0Y29uc29sZS5sb2coJ1RpbWUnLCBsaW5lKTtcblx0XHQvLyBcdFx0XHRcdFx0XHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKG1vbWVudChEYXRlLnBhcnNlKGxpbmUpKSk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZyhtb21lbnQoZGF0ZS5zZXRUaW1lKERhdGUucGFyc2UobGluZSkpKSk7XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyBcdFx0fVxuXHRcdC8vIFx0XHRcdFx0XHRcdFx0Ly8gXHR9XG5cdFx0Ly8gXHRcdFx0XHRcdFx0XHQvLyB9KTtcblx0XHQvLyBcdFx0XHRcdFx0XHR9XG5cdFx0Ly8gXHRcdFx0XHRcdH0pO1xuXHRcdC8vIFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XG5cdFx0Ly8gXHRcdFx0XHRtc2cub25jZSgnYXR0cmlidXRlcycsIGZ1bmN0aW9uKGF0dHJzKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdGNvbnNvbGUubG9nKHByZWZpeCArICdBdHRyaWJ1dGVzOiAlcycsIGluc3BlY3QoYXR0cnMsIGZhbHNlLCA4KSk7XG5cdFx0Ly8gXHRcdFx0XHR9KTtcblxuXHRcdC8vIFx0XHRcdFx0bXNnLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uKCkge1xuXHRcdC8vIFx0XHRcdFx0XHRjb25zb2xlLmxvZyhwcmVmaXggKyAnRmluaXNoZWQnKTtcblx0XHQvLyBcdFx0XHRcdH0pO1xuXHRcdC8vIFx0XHRcdH0pO1xuXHRcdFx0XHRcdFxuXHRcdC8vIFx0XHRcdGYub25jZSgnZXJyb3InLCBmdW5jdGlvbihlcnJvcikge1xuXHRcdC8vIFx0XHRcdFx0Y29uc29sZS5sb2coJ0ZldGNoIGVycm9yOiAnICsgZXJyb3IpO1xuXHRcdC8vIFx0XHRcdH0pO1xuXG5cdFx0Ly8gXHRcdFx0Zi5vbmNlKCdlbmQnLCBmdW5jdGlvbigpIHtcblx0XHQvLyBcdFx0XHRcdGNvbnNvbGUubG9nKCdEb25lIGZldGNoaW5nIGFsbCBtZXNzYWdlcyEnKTtcblx0XHQvLyBcdFx0XHRcdHRoYXQuX2ltYXAuZW5kKCk7XG5cdFx0Ly8gXHRcdFx0fSk7XG5cdFx0Ly8gXHRcdH0pO1xuXHRcdC8vIFx0fSk7XG5cdFx0Ly8gfSk7XG5cblx0XHQvLyB0aGlzLl9pbWFwLmNvbm5lY3QoKTtcblxuXHRcdHRoaXMuX2F3cyA9IG5ldyBhd3MuUzMoe1xuXHRcdFx0YWNjZXNzS2V5SWQ6IHNlcnZlckNvbmZpZy5BV1NBQ0NFU1NLRVlJRCxcblx0XHRcdHNlY3JldEFjY2Vzc0tleTogc2VydmVyQ29uZmlnLkFXU1NFQ1JFVEFDQ0VTU0tFWSxcblx0XHRcdHJlZ2lvbjogc2VydmVyQ29uZmlnLkFXU1JFR0lPTlxuXHRcdH0pO1xuXG5cdFx0c2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLl9ydW5uaW5nUXVldWUpIHtcblx0XHRcdFx0aWYgKHRoaXMuX3NlbmRRdWV1ZS5sZW5ndGgpIHtcblx0XHRcdFx0XHR0aGlzLl9ydW5uaW5nUXVldWUgPSB0cnVlO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSB0aGlzLl9zZW5kUXVldWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdFx0XHRcdGxldCB3cyA9IHRoaXMuX21haW5TZXJ2ZXIuZ2V0V1ModGhpcy5fc2VuZFF1ZXVlW2ldLmlkX3dzKTtcblx0XHRcdFx0XHRcdGlmICh3cyAmJiB3cy5yZWFkeVN0YXRlID09PSB3cy5PUEVOKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh3cy5idWZmZXJlZEFtb3VudCA8IDIwNDgwKSB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNlbmRJdGVtID0gdGhpcy5fc2VuZFF1ZXVlLnBvcCgpO1xuXHRcdFx0XHRcdFx0XHRcdHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0uZGF0YSksIChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdFcnJvciBvbiBXUzogJywgZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tYWluU2VydmVyLnVuc3Vic2NyaWJlV1Mod3MpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlbmRJdGVtLm1ldGhvZCAhPT0gJ2NvdW50UXVlcnknICYmIHNlbmRJdGVtLm1ldGhvZCAhPT0gJ2NvdW50Q29sbGVjdGlvbldpdGhRdWVyeScgJiYgc2VuZEl0ZW0ubWV0aG9kICE9PSAnZmluZCcgJiYgc2VuZEl0ZW0ubWV0aG9kICE9PSAnZmluZE9uZScgJiYgc2VuZEl0ZW0ubWV0aG9kICE9PSAnZmluZFdpdGhPcHRpb25zJyAmJiBzZW5kSXRlbS5tZXRob2QgIT09ICdzZXRXU0FwcFZlcnNpb24nICYmIHNlbmRJdGVtLm1ldGhvZCAhPT0gJ3VwbG9hZEZpbGVBbmRTYXZlJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGdldEJpbmFyeVNpemUoSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0ubWV0aG9kRGF0YSkpIDwgMjAwMDAwICYmIGdldEJpbmFyeVNpemUoSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0uZGF0YSkpIDwgMjAwMDAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdjbGllbnQtcmVzcG9uc2UnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiAnQ2xpZW50IFJlc3BvbnNlJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiAnVXNlcjogJyArIHdzWyd1c2VyJ10gKyAnLCBNZXNzYWdlSWQ6ICcgKyBzZW5kSXRlbS5kYXRhLm1lc3NhZ2VJZCArICcsIE1ldGhvZDogJyArIHNlbmRJdGVtLm1ldGhvZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkOiBbSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0ubWV0aG9kRGF0YSksIHNlbmRJdGVtLmRhdGFdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogc2VuZEl0ZW0ubWV0aG9kLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXI6IHdzWyd1c2VyJ10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiBzZW5kSXRlbS5kYXRhLm1lc3NhZ2VJZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnY2xpZW50LXJlc3BvbnNlJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJ0NsaWVudCBSZXNwb25zZScsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogJ1VzZXI6ICcgKyB3c1sndXNlciddICsgJywgTWVzc2FnZUlkOiAnICsgc2VuZEl0ZW0uZGF0YS5tZXNzYWdlSWQgKyAnLCBNZXRob2Q6ICcgKyBzZW5kSXRlbS5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGF5bG9hZDogJ1RvbyBCaWcnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogc2VuZEl0ZW0ubWV0aG9kLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXI6IHdzWyd1c2VyJ10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiBzZW5kSXRlbS5kYXRhLm1lc3NhZ2VJZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRNZXRob2RSZXNwb25zZXMuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRcdF9pZDogVHlwZXMuT2JqZWN0SWQoKS50b0hleFN0cmluZygpLFxuXHRcdFx0XHRcdFx0XHRcdFx0X192OiAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0aWRfdXNlcjogd3NbJ2lkX3VzZXInXSxcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VfaWQ6IHNlbmRJdGVtLmRhdGEubWVzc2FnZUlkLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YTogSlNPTi5zdHJpbmdpZnkoc2VuZEl0ZW0ubWV0aG9kRGF0YSksXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZTogc2VuZEl0ZW0uZGF0YSxcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogc2VuZEl0ZW0ubWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZW5kUXVldWUuc3BsaWNlKGksIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuX3J1bm5pbmdRdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSwgNTApO1xuXHR9XG5cblx0cHVibGljIGdldE1haW5TZXJ2ZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX21haW5TZXJ2ZXI7XG5cdH1cblxuXHQvLyBBZGQgbWV0aG9kcyB0byBwcml2YXRlIG1ldGhvZHMgb2JqZWN0XG5cdHB1YmxpYyBtZXRob2RzKG1ldGhvZDogTWV0aG9kTW9kZWwpIHtcblx0XHR0aGlzLl9tZXRob2RzID0gT2JqZWN0LmFzc2lnbih0aGlzLl9tZXRob2RzLCBtZXRob2QpO1xuXHR9XG5cblx0cHVibGljIGNhbGxNZXRob2RDcm9uKG1ldGhvZDogc3RyaW5nLCAuLi5tZXRob2REYXRhOiBhbnlbXSkge1xuXHRcdGxldCB0aGF0ID0gdGhpcztcblxuXHRcdGlmICghdGhhdC5fbWV0aG9kc1ttZXRob2RdKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnTm8gTWV0aG9kOiAnICsgbWV0aG9kKTtcblxuXHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gTWV0aG9kOiAnICsgbWV0aG9kKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRpZiAoKG1ldGhvZERhdGEubGVuZ3RoID4gMSB8fCBtZXRob2REYXRhWzBdKSAmJiAhdGhhdC5fbWV0aG9kc1ttZXRob2RdLnNraXBWYWxpZGF0aW9uKSB7XG5cdFx0XHRpZiAoIXRoYXQuX21ldGhvZHNbbWV0aG9kXS5jaGVjaykge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdObyBDaGVjayBGdW5jdGlvbiBGb3IgTWV0aG9kICcgKyBtZXRob2QpO1xuXG5cdFx0XHRcdHRoYXQuc2VuZEVtYWlsKCdkZXZAcmVzb2x2ZWlvLmNvbScsICdTRVJWRVIgLSBFcnJvciBEZXRlY3RlZCAtICcgKyB0aGF0LnNlcnZlckNvbmZpZ1snQ0xJRU5UX05BTUUnXSwgJ05vIENoZWNrIEZ1bmN0aW9uIEZvciBNZXRob2QgJyArIG1ldGhvZCk7XG5cdFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICghdGhhdC5fbWV0aG9kc1ttZXRob2RdLmNoZWNrLl9zY2hlbWEpIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignTm8gQ2hlY2sgU2NoZW1hIEZvciBNZXRob2QgJyArIG1ldGhvZCk7XG5cblx0XHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gQ2hlY2sgRnVuY3Rpb24gRm9yIE1ldGhvZCAnICsgbWV0aG9kKTtcblx0XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRsZXQgdmFsT2JqID0ge307XG5cdFx0XHRcdGxldCB2YWxLZXlzID0gT2JqZWN0LmtleXModGhhdC5fbWV0aG9kc1ttZXRob2RdLmNoZWNrLl9zY2hlbWEpO1xuXG5cdFx0XHRcdGxldCByb290S2V5cyA9IHZhbEtleXMuZmlsdGVyKGEgPT4gIWEuaW5jbHVkZXMoJy4nKSk7XG5cdFx0XHRcdFxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1ldGhvZERhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHR2YWxPYmpbcm9vdEtleXNbaV1dID0gbWV0aG9kRGF0YVtpXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dGhhdC5fbWV0aG9kc1ttZXRob2RdLmNoZWNrLnZhbGlkYXRlKHZhbE9iaik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGVycm9ycykge1xuXHRcdFx0XHRcdGlmIChlcnJvcnMpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIE1ldGhvZCBDaGVjayAoJyArIG1ldGhvZCArICcpJywgZXJyb3JzKTtcblxuXHRcdFx0XHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTWF0Y2ggRXJyb3IgT24gTWV0aG9kICcgKyBtZXRob2QgKyAnXFxuXFxuRGF0YSBCZWluZyBDaGVja2VkXFxuJyArIEpTT04uc3RyaW5naWZ5KHZhbE9iaiwgbnVsbCwgMikgKyAnXFxuXFxuRXJyb3JzXFxuJyArIEpTT04uc3RyaW5naWZ5KGVycm9ycywgbnVsbCwgMikpO1xuXHRcdFx0XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdHRoYXQuX21ldGhvZHNbbWV0aG9kXS5mdW5jdGlvbi5jYWxsKE9iamVjdC5hc3NpZ24oe30sIHRoYXQsIHtpZF91c2VyOiAnJywgdXNlcjogJycsIGlkX3dzOiAnJ30pLCAuLi5tZXRob2REYXRhKTtcblx0fVxuXG5cdHB1YmxpYyBjYWxsTWV0aG9kUXVldWUodXBkYXRlOiBRdWV1ZU1ldGhvZE1vZGVsKSB7XG5cdFx0Ly8gY29uc29sZS5sb2coJ0NhbGwgTWV0aG9kIFF1ZXVlJywgdXBkYXRlKTtcblxuXHRcdGxldCB1cGRhdGVDb3B5ID0gZGVlcENvcHkodXBkYXRlKTtcblx0XHRcblx0XHRsZXQgdGhhdCA9IHRoaXM7XG5cblx0XHRpZiAoIXRoYXQuX21ldGhvZHNbdXBkYXRlLm1ldGhvZF0pIHtcblx0XHRcdGNvbnNvbGUubG9nKCdObyBNZXRob2Q6ICcgKyB1cGRhdGUubWV0aG9kKTtcblxuXHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gTWV0aG9kOiAnICsgdXBkYXRlLm1ldGhvZCk7XG5cdFx0XHRcblx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdG1lc3NhZ2VJZDogdXBkYXRlLm1lc3NhZ2VJZCxcblx0XHRcdFx0aGFzRXJyb3I6IHRydWUsXG5cdFx0XHRcdGRhdGE6ICdJbnRlcm5hbCBFcnJvcidcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuX21haW5TZXJ2ZXIuZ2V0UXVldWVNYW5hZ2VyKCkuYWRkTWV0aG9kUmVzcG9uc2UodXBkYXRlQ29weSwgc2VydmVyUmVzKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgodXBkYXRlLm1ldGhvZF9kYXRhLmxlbmd0aCA+IDEgfHwgdXBkYXRlLm1ldGhvZF9kYXRhWzBdKSAmJiAhdGhhdC5fbWV0aG9kc1t1cGRhdGUubWV0aG9kXS5za2lwVmFsaWRhdGlvbikge1xuXHRcdFx0aWYgKCF0aGF0Ll9tZXRob2RzW3VwZGF0ZS5tZXRob2RdLmNoZWNrKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIENoZWNrIEZ1bmN0aW9uIEZvciBNZXRob2QgJyArIHVwZGF0ZS5tZXRob2QpO1xuXG5cdFx0XHRcdHRoYXQuc2VuZEVtYWlsKCdkZXZAcmVzb2x2ZWlvLmNvbScsICdTRVJWRVIgLSBFcnJvciBEZXRlY3RlZCAtICcgKyB0aGF0LnNlcnZlckNvbmZpZ1snQ0xJRU5UX05BTUUnXSwgJ05vIENoZWNrIEZ1bmN0aW9uIEZvciBNZXRob2QgJyArIHVwZGF0ZS5tZXRob2QpO1xuXHRcdFx0XHRcblx0XHRcdFx0bGV0IHNlcnZlclJlczogU2VydmVyUmVzcG9uc2VNb2RlbCA9IHtcblx0XHRcdFx0XHRtZXNzYWdlSWQ6IHVwZGF0ZS5tZXNzYWdlSWQsXG5cdFx0XHRcdFx0aGFzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0ZGF0YTogJ0ludGVybmFsIEVycm9yJ1xuXHRcdFx0XHR9O1xuXHRcblx0XHRcdFx0dGhpcy5fbWFpblNlcnZlci5nZXRRdWV1ZU1hbmFnZXIoKS5hZGRNZXRob2RSZXNwb25zZSh1cGRhdGVDb3B5LCBzZXJ2ZXJSZXMpO1xuXHRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoIXRoYXQuX21ldGhvZHNbdXBkYXRlLm1ldGhvZF0uY2hlY2suX3NjaGVtYSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdObyBDaGVjayBTY2hlbWEgRm9yIE1ldGhvZCAnICsgdXBkYXRlLm1ldGhvZCk7XG5cblx0XHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gQ2hlY2sgRnVuY3Rpb24gRm9yIE1ldGhvZCAnICsgdXBkYXRlLm1ldGhvZCk7XG5cdFx0XHRcdFxuXHRcdFx0XHRsZXQgc2VydmVyUmVzOiBTZXJ2ZXJSZXNwb25zZU1vZGVsID0ge1xuXHRcdFx0XHRcdG1lc3NhZ2VJZDogdXBkYXRlLm1lc3NhZ2VJZCxcblx0XHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRkYXRhOiAnSW50ZXJuYWwgRXJyb3InXG5cdFx0XHRcdH07XG5cdFxuXHRcdFx0XHR0aGlzLl9tYWluU2VydmVyLmdldFF1ZXVlTWFuYWdlcigpLmFkZE1ldGhvZFJlc3BvbnNlKHVwZGF0ZUNvcHksIHNlcnZlclJlcyk7XG5cdFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bGV0IHZhbE9iaiA9IHt9O1xuXHRcdFx0XHRsZXQgdmFsS2V5cyA9IE9iamVjdC5rZXlzKHRoYXQuX21ldGhvZHNbdXBkYXRlLm1ldGhvZF0uY2hlY2suX3NjaGVtYSk7XG5cblx0XHRcdFx0bGV0IHJvb3RLZXlzID0gdmFsS2V5cy5maWx0ZXIoYSA9PiAhYS5pbmNsdWRlcygnLicpKTtcblx0XHRcdFx0XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdXBkYXRlLm1ldGhvZF9kYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0dmFsT2JqW3Jvb3RLZXlzW2ldXSA9IHVwZGF0ZS5tZXRob2RfZGF0YVtpXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dGhhdC5fbWV0aG9kc1t1cGRhdGUubWV0aG9kXS5jaGVjay52YWxpZGF0ZSh2YWxPYmopO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChlcnJvcnMpIHtcblx0XHRcdFx0XHRpZiAoZXJyb3JzKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciBpbiBNZXRob2QgQ2hlY2sgKCcgKyB1cGRhdGUubWV0aG9kICsgJyknLCBlcnJvcnMpO1xuXG5cdFx0XHRcdFx0XHR0aGF0LnNlbmRFbWFpbCgnZGV2QHJlc29sdmVpby5jb20nLCAnU0VSVkVSIC0gRXJyb3IgRGV0ZWN0ZWQgLSAnICsgdGhhdC5zZXJ2ZXJDb25maWdbJ0NMSUVOVF9OQU1FJ10sICdNYXRjaCBFcnJvciBPbiBNZXRob2QgJyArIHVwZGF0ZS5tZXRob2QgKyAnXFxuXFxuRGF0YSBCZWluZyBDaGVja2VkXFxuJyArIEpTT04uc3RyaW5naWZ5KHZhbE9iaiwgbnVsbCwgMikgKyAnXFxuXFxuRXJyb3JzXFxuJyArIEpTT04uc3RyaW5naWZ5KGVycm9ycywgbnVsbCwgMikpO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRsZXQgc2VydmVyUmVzOiBTZXJ2ZXJSZXNwb25zZU1vZGVsID0ge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSWQ6IHVwZGF0ZS5tZXNzYWdlSWQsXG5cdFx0XHRcdFx0XHRcdGhhc0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRkYXRhOiAnSW50ZXJuYWwgRXJyb3InXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XG5cdFx0XHRcdFx0XHR0aGlzLl9tYWluU2VydmVyLmdldFF1ZXVlTWFuYWdlcigpLmFkZE1ldGhvZFJlc3BvbnNlKHVwZGF0ZUNvcHksIHNlcnZlclJlcyk7XG5cdFx0XHRcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLmxvZygnUnVuIE1ldGhvZCcsIHVwZGF0ZS5tZXRob2QpO1xuXHRcdFxuXHRcdHRoYXQuX21ldGhvZHNbdXBkYXRlLm1ldGhvZF0uZnVuY3Rpb24uY2FsbChPYmplY3QuYXNzaWduKHt9LCB0aGF0LCB7aWRfdXNlcjogdXBkYXRlLmlkX3VzZXIsIHVzZXI6IHVwZGF0ZS51c2VyLCBpZF93czogdXBkYXRlLmlkX3dzfSksIC4uLnVwZGF0ZS5tZXRob2RfZGF0YSkudGhlbihyZXMgPT4ge1xuXHRcdFx0bGV0IHNlcnZlclJlczogU2VydmVyUmVzcG9uc2VNb2RlbCA9IHtcblx0XHRcdFx0bWVzc2FnZUlkOiB1cGRhdGUubWVzc2FnZUlkLFxuXHRcdFx0XHRoYXNFcnJvcjogZmFsc2UsXG5cdFx0XHRcdGRhdGE6IHJlc1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5fbWFpblNlcnZlci5nZXRRdWV1ZU1hbmFnZXIoKS5hZGRNZXRob2RSZXNwb25zZSh1cGRhdGVDb3B5LCBzZXJ2ZXJSZXMpO1xuXHRcdH0sIGVyciA9PiB7XG5cdFx0XHRsZXQgc2VydmVyUmVzOiBTZXJ2ZXJSZXNwb25zZU1vZGVsID0ge1xuXHRcdFx0XHRtZXNzYWdlSWQ6IHVwZGF0ZS5tZXNzYWdlSWQsXG5cdFx0XHRcdGhhc0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRkYXRhOiBlcnJcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuX21haW5TZXJ2ZXIuZ2V0UXVldWVNYW5hZ2VyKCkuYWRkTWV0aG9kUmVzcG9uc2UodXBkYXRlQ29weSwgc2VydmVyUmVzKTtcblx0XHR9KTtcblx0fVxuXG5cblxuXHQvLyBDYWxsL3J1biBtZXRob2QgKEVtaXQgb24gU29ja2V0KVxuXHRwdWJsaWMgY2FsbE1ldGhvZCh3czogV2ViU29ja2V0LCBtZXNzYWdlSWQsIG1ldGhvZCwgLi4ubWV0aG9kRGF0YTogYW55W10pIHtcblx0XHRsZXQgdGhhdCA9IHRoaXM7XG5cblx0XHRpZiAoIXRoYXQuX21ldGhvZHNbbWV0aG9kXSkge1xuXHRcdFx0Y29uc29sZS5sb2coJ05vIE1ldGhvZDogJyArIG1ldGhvZCk7XG5cblx0XHRcdHRoYXQuc2VuZEVtYWlsKCdkZXZAcmVzb2x2ZWlvLmNvbScsICdTRVJWRVIgLSBFcnJvciBEZXRlY3RlZCAtICcgKyB0aGF0LnNlcnZlckNvbmZpZ1snQ0xJRU5UX05BTUUnXSwgJ05vIE1ldGhvZDogJyArIG1ldGhvZCk7XG5cdFx0XHRcblx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZUlkLFxuXHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0ZGF0YTogJ0ludGVybmFsIEVycm9yJ1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5zZW5kV1Mod3MsIG1ldGhvZCwgbWV0aG9kRGF0YSwgc2VydmVyUmVzKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgobWV0aG9kRGF0YS5sZW5ndGggPiAxIHx8IG1ldGhvZERhdGFbMF0pICYmICF0aGF0Ll9tZXRob2RzW21ldGhvZF0uc2tpcFZhbGlkYXRpb24pIHtcblx0XHRcdGlmICghdGhhdC5fbWV0aG9kc1ttZXRob2RdLmNoZWNrKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIENoZWNrIEZ1bmN0aW9uIEZvciBNZXRob2QgJyArIG1ldGhvZCk7XG5cblx0XHRcdFx0dGhhdC5zZW5kRW1haWwoJ2RldkByZXNvbHZlaW8uY29tJywgJ1NFUlZFUiAtIEVycm9yIERldGVjdGVkIC0gJyArIHRoYXQuc2VydmVyQ29uZmlnWydDTElFTlRfTkFNRSddLCAnTm8gQ2hlY2sgRnVuY3Rpb24gRm9yIE1ldGhvZCAnICsgbWV0aG9kKTtcblx0XHRcdFx0XG5cdFx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdFx0bWVzc2FnZUlkOiBtZXNzYWdlSWQsXG5cdFx0XHRcdFx0aGFzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0ZGF0YTogJ0ludGVybmFsIEVycm9yJ1xuXHRcdFx0XHR9O1xuXHRcblx0XHRcdFx0dGhpcy5zZW5kV1Mod3MsIG1ldGhvZCwgbWV0aG9kRGF0YSwgc2VydmVyUmVzKTtcblx0XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKCF0aGF0Ll9tZXRob2RzW21ldGhvZF0uY2hlY2suX3NjaGVtYSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdObyBDaGVjayBTY2hlbWEgRm9yIE1ldGhvZCAnICsgbWV0aG9kKTtcblxuXHRcdFx0XHR0aGF0LnNlbmRFbWFpbCgnZGV2QHJlc29sdmVpby5jb20nLCAnU0VSVkVSIC0gRXJyb3IgRGV0ZWN0ZWQgLSAnICsgdGhhdC5zZXJ2ZXJDb25maWdbJ0NMSUVOVF9OQU1FJ10sICdObyBDaGVjayBGdW5jdGlvbiBGb3IgTWV0aG9kICcgKyBtZXRob2QpO1xuXHRcdFx0XHRcblx0XHRcdFx0bGV0IHNlcnZlclJlczogU2VydmVyUmVzcG9uc2VNb2RlbCA9IHtcblx0XHRcdFx0XHRtZXNzYWdlSWQ6IG1lc3NhZ2VJZCxcblx0XHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRkYXRhOiAnSW50ZXJuYWwgRXJyb3InXG5cdFx0XHRcdH07XG5cdFxuXHRcdFx0XHR0aGlzLnNlbmRXUyh3cywgbWV0aG9kLCBtZXRob2REYXRhLCBzZXJ2ZXJSZXMpO1xuXHRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGxldCB2YWxPYmogPSB7fTtcblx0XHRcdFx0bGV0IHZhbEtleXMgPSBPYmplY3Qua2V5cyh0aGF0Ll9tZXRob2RzW21ldGhvZF0uY2hlY2suX3NjaGVtYSk7XG5cblx0XHRcdFx0bGV0IHJvb3RLZXlzID0gdmFsS2V5cy5maWx0ZXIoYSA9PiAhYS5pbmNsdWRlcygnLicpKTtcblx0XHRcdFx0XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWV0aG9kRGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHZhbE9ialtyb290S2V5c1tpXV0gPSBtZXRob2REYXRhW2ldO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR0aGF0Ll9tZXRob2RzW21ldGhvZF0uY2hlY2sudmFsaWRhdGUodmFsT2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXJyb3JzKSB7XG5cdFx0XHRcdFx0aWYgKGVycm9ycykge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3IgaW4gTWV0aG9kIENoZWNrICgnICsgbWV0aG9kICsgJyknLCBlcnJvcnMpO1xuXG5cdFx0XHRcdFx0XHR0aGF0LnNlbmRFbWFpbCgnZGV2QHJlc29sdmVpby5jb20nLCAnU0VSVkVSIC0gRXJyb3IgRGV0ZWN0ZWQgLSAnICsgdGhhdC5zZXJ2ZXJDb25maWdbJ0NMSUVOVF9OQU1FJ10sICdNYXRjaCBFcnJvciBPbiBNZXRob2QgJyArIG1ldGhvZCArICdcXG5cXG5EYXRhIEJlaW5nIENoZWNrZWRcXG4nICsgSlNPTi5zdHJpbmdpZnkodmFsT2JqLCBudWxsLCAyKSArICdcXG5cXG5FcnJvcnNcXG4nICsgSlNPTi5zdHJpbmdpZnkoZXJyb3JzLCBudWxsLCAyKSk7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZUlkLFxuXHRcdFx0XHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0ZGF0YTogJ0ludGVybmFsIEVycm9yJ1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0dGhpcy5zZW5kV1Mod3MsIG1ldGhvZCwgbWV0aG9kRGF0YSwgc2VydmVyUmVzKTtcblx0XHRcdFxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHR0aGF0Ll9tZXRob2RzW21ldGhvZF0uZnVuY3Rpb24uY2FsbChPYmplY3QuYXNzaWduKHt9LCB0aGF0LCB7aWRfdXNlcjogd3NbJ2lkX3VzZXInXSwgdXNlcjogd3NbJ3VzZXInXSwgaWRfd3M6IHdzWydpZF9zb2NrZXQnXX0pLCAuLi5tZXRob2REYXRhKS50aGVuKHJlcyA9PiB7XG5cdFx0XHRsZXQgc2VydmVyUmVzOiBTZXJ2ZXJSZXNwb25zZU1vZGVsID0ge1xuXHRcdFx0XHRtZXNzYWdlSWQ6IG1lc3NhZ2VJZCxcblx0XHRcdFx0aGFzRXJyb3I6IGZhbHNlLFxuXHRcdFx0XHRkYXRhOiByZXNcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuc2VuZFdTKHdzLCBtZXRob2QsIG1ldGhvZERhdGEsIHNlcnZlclJlcyk7XG5cdFx0fSwgZXJyID0+IHtcblx0XHRcdGxldCBzZXJ2ZXJSZXM6IFNlcnZlclJlc3BvbnNlTW9kZWwgPSB7XG5cdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZUlkLFxuXHRcdFx0XHRoYXNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0ZGF0YTogZXJyXG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLnNlbmRXUyh3cywgbWV0aG9kLCBtZXRob2REYXRhLCBzZXJ2ZXJSZXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gQ2FsbC9ydW4gbWV0aG9kIGludGVybmFsIChObyBFbWl0IG9uIFNvY2tldClcblx0cHVibGljIGNhbGxNZXRob2RJbnRlcm5hbChtZXRob2QsIC4uLm1ldGhvZERhdGE6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcblx0XHRsZXQgdGhhdCA9IHRoaXM7XG5cblx0XHRpZiAoIXRoYXQuX21ldGhvZHNbbWV0aG9kXSkge1xuXHRcdFx0Y29uc29sZS5sb2coJ05vIE1ldGhvZDogJyArIG1ldGhvZCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKChtZXRob2REYXRhLmxlbmd0aCA+IDEgfHwgKG1ldGhvZERhdGFbMF0gJiYgdHlwZW9mKG1ldGhvZERhdGFbMF0pICE9PSAnZnVuY3Rpb24nKSkgJiYgIXRoYXQuX21ldGhvZHNbbWV0aG9kXS5za2lwVmFsaWRhdGlvbikge1xuXHRcdFx0aWYgKCF0aGF0Ll9tZXRob2RzW21ldGhvZF0uY2hlY2spIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignTm8gQ2hlY2sgRnVuY3Rpb24gRm9yIE1ldGhvZCAnICsgbWV0aG9kKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoIXRoYXQuX21ldGhvZHNbbWV0aG9kXS5jaGVjay5fc2NoZW1hKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIENoZWNrIFNjaGVtYSBGb3IgTWV0aG9kICcgKyBtZXRob2QpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHByb21pc2UgPSB0aGF0Ll9tZXRob2RzW21ldGhvZF0uZnVuY3Rpb24uY2FsbCh0aGF0LCAuLi5tZXRob2REYXRhKTtcblxuXHRcdGlmIChtZXRob2REYXRhW21ldGhvZERhdGEubGVuZ3RoIC0gMV0gJiYgdHlwZW9mKG1ldGhvZERhdGFbbWV0aG9kRGF0YS5sZW5ndGggLSAxXSkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHByb21pc2UudGhlbihyZXMgPT4gbWV0aG9kRGF0YVttZXRob2REYXRhLmxlbmd0aCAtIDFdKG51bGwsIHJlcyksIGVyciA9PiBtZXRob2REYXRhW21ldGhvZERhdGEubGVuZ3RoIC0gMV0oZXJyLCBudWxsKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb21pc2U7XG5cdH1cblxuXHRwcml2YXRlIHNlbmRXUyh3czogV2ViU29ja2V0LCBtZXRob2Q6IHN0cmluZywgbWV0aG9kRGF0YTogYW55W10sIGRhdGE6IFNlcnZlclJlc3BvbnNlTW9kZWwpIHtcblx0XHR0aGlzLl9zZW5kUXVldWUuc3BsaWNlKDAsIDAsIHtcblx0XHRcdGlkX3dzOiB3c1snaWRfc29ja2V0J10sXG5cdFx0XHRtZXRob2Q6IG1ldGhvZCxcblx0XHRcdG1ldGhvZERhdGE6IG1ldGhvZERhdGEsXG5cdFx0XHRkYXRhOiBkYXRhXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgc2VuZEVtYWlsKHNlbmRUbzogc3RyaW5nLCBzdWJqZWN0OiBzdHJpbmcsIHRleHQ/OiBzdHJpbmcsIGh0bWw/OiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogYW55W10pIHtcblx0XHR0aGlzLl9tYWlsZXIuc2VuZE1haWwoe1xuXHRcdFx0cmVwbHlUbzogdW5kZWZpbmVkLFxuXHRcdFx0ZnJvbTogdGhpcy5zZXJ2ZXJDb25maWcuTUFJTF9GUk9NLFxuXHRcdFx0dG86IHNlbmRUbyxcblx0XHRcdHN1YmplY3Q6IHN1YmplY3QsXG5cdFx0XHR0ZXh0OiB0ZXh0LFxuXHRcdFx0aHRtbDogaHRtbCxcblx0XHRcdGF0dGFjaG1lbnRzOiBhdHRhY2htZW50c1xuXHRcdH0sIChlcnIsIGluZm8pID0+IHtcblx0XHRcdGlmIChlcnIpIHtcblx0XHRcdFx0Y29uc29sZS5sb2coZXJyKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRBV1MoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2F3cztcblx0fVxuXG5cdHB1YmxpYyByZWFkRmlsZShmaWxlTmFtZSkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRmcy5yZWFkRmlsZShwYXRoLmpvaW4oX19kaXJuYW1lLCAoJy4uL3ByaXZhdGUvJyArIGZpbGVOYW1lKSksICd1dGYtOCcsIChlcnIsIHJlcykgPT4geyBcblx0XHRcdFx0aWYgKGVycikge1xuXHRcdFx0XHRcdHJlamVjdChlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUocmVzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgcmVhZEltYWdlKGZpbGVOYW1lKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGZzLnJlYWRGaWxlKHBhdGguam9pbihfX2Rpcm5hbWUsICgnLi4vcHJpdmF0ZS8nICsgZmlsZU5hbWUpKSwgJ2Jhc2U2NCcsIChlcnIsIHJlcykgPT4geyBcblx0XHRcdFx0aWYgKGVycikge1xuXHRcdFx0XHRcdHJlamVjdChlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUocmVzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cbn0iXX0=
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var collections_1 = require("../methods/collections");
4
+ var logs_1 = require("../methods/logs");
5
+ var counters_1 = require("../methods/counters");
6
+ var pdf_1 = require("../methods/pdf");
7
+ var aws_1 = require("../methods/aws");
8
+ var cloudconvert_1 = require("../methods/cloudconvert");
9
+ var path = require("path");
10
+ var fs = require("fs");
11
+ var nodemailer = require("nodemailer");
12
+ var aws = require("aws-sdk");
13
+ var accounts_1 = require("../methods/accounts");
14
+ var init_1 = require("../fixtures/init");
15
+ var cron_jobs_1 = require("../fixtures/cron-jobs");
16
+ var cron_jobs_2 = require("../methods/cron-jobs");
17
+ var flags_1 = require("../methods/flags");
18
+ var method_response_collection_1 = require("../collections/method-response.collection");
19
+ var mongoose_1 = require("mongoose");
20
+ var common_1 = require("../util/common");
21
+ var log_collection_1 = require("../collections/log.collection");
22
+ var MethodManager = /** @class */ (function () {
23
+ function MethodManager(mainServer, serverConfig) {
24
+ var _this = this;
25
+ this._methods = {};
26
+ this._sendQueue = [];
27
+ this._runningQueue = false;
28
+ this._mainServer = mainServer;
29
+ this.serverConfig = serverConfig;
30
+ // Fixtures
31
+ init_1.loadServerInit();
32
+ cron_jobs_1.loadServerCronJobs();
33
+ // Methods
34
+ accounts_1.loadAccountMethods(this);
35
+ aws_1.loadAWSMethods(this);
36
+ cloudconvert_1.loadCloudConvertMethods(this);
37
+ collections_1.loadCollectionMethods(this);
38
+ counters_1.loadCounterMethods(this);
39
+ logs_1.loadLogMethods(this);
40
+ pdf_1.loadPDFMethods(this);
41
+ cron_jobs_2.loadCronJobMethods(this);
42
+ flags_1.loadFlagMethods(this);
43
+ this._mailer = nodemailer.createTransport({
44
+ SES: new aws.SES({
45
+ apiVersion: '2010-12-01',
46
+ accessKeyId: serverConfig.AWSACCESSKEYID,
47
+ secretAccessKey: serverConfig.AWSSECRETACCESSKEY,
48
+ region: serverConfig.AWSSES_REGION
49
+ })
50
+ });
51
+ // this._imap = new imap({
52
+ // user: this.serverConfig['ORDERS_EMAIL'],
53
+ // password: this.serverConfig['ORDERS_PASSWORD'],
54
+ // host: this.serverConfig['ORDERS_HOST'],
55
+ // port: this.serverConfig['ORDERS_PORT'],
56
+ // tls: this.serverConfig['ORDERS_TLS']
57
+ // });
58
+ // let that = this;
59
+ // let chemicalNames = await Chemicals.find({}).select('description').exec();
60
+ // let jobNames = await Jobs.find({status: 'Active'}).select('well').exec();
61
+ // console.log(jobNames.map(a => a.well));
62
+ // this._imap.once('ready', () => {
63
+ // this._imap.openBox('INBOX', true, function(err, box) {
64
+ // if (err) {
65
+ // throw err;
66
+ // }
67
+ // that._imap.search([ 'NEW' ], function(err, results) {
68
+ // console.log(err, results);
69
+ // if (err || !results.length) {
70
+ // return that._imap.end();
71
+ // }
72
+ // let f = that._imap.fetch(results[0], { bodies: ['HEADER.FIELDS (FROM)', 'TEXT'] });
73
+ // f.on('message', function(msg, seqno) {
74
+ // // console.log('Message #%d', seqno);
75
+ // let prefix = '(#' + seqno + ') ';
76
+ // msg.on('body', function(stream, info) {
77
+ // let buffer = '', count = 0;
78
+ // stream.on('data', function(chunk) {
79
+ // count += chunk.length;
80
+ // buffer += chunk.toString('utf8');
81
+ // });
82
+ // stream.once('end', function() {
83
+ // if (info.which === 'TEXT') {
84
+ // // console.log(buffer);
85
+ // // console.log(typeof(buffer));
86
+ // let lines = buffer.split('\r\n');
87
+ // // console.log(lines);
88
+ // // let i = 0;
89
+ // // lines.forEach(line => {
90
+ // // let date: Date;
91
+ // // let dateString;
92
+ // // if (line.includes('From')) {
93
+ // // console.log(line);
94
+ // // }
95
+ // // if (!line.includes('class=3D') && !line.includes('style=3D')) {
96
+ // // if (line.includes('Well') || line.includes('Well Name') || line.includes('Job') || line.includes('Pad')) {
97
+ // // let best = stringSimilarity.findBestMatch(line, jobNames.map(a => a.well)).bestMatch;
98
+ // // if (best && best.rating > 0.5) {
99
+ // // console.log('Well', line);
100
+ // // }
101
+ // // }
102
+ // // if (line.includes('Product') || line.includes('Chemical')) {
103
+ // // let best = stringSimilarity.findBestMatch(line, chemicalNames.map(a => a.description)).bestMatch;
104
+ // // if (best && best.rating > 0.5) {
105
+ // // console.log('Chemical', line);
106
+ // // }
107
+ // // }
108
+ // // if (line.includes('Quantity') || line.includes('Qty') || line.includes('Amount')) {
109
+ // // console.log('Qty', line);
110
+ // // }
111
+ // // if (line.includes('Date')) {
112
+ // // console.log('Date', line);
113
+ // // console.log(moment(Date.parse(line)));
114
+ // // date = moment(Date.parse(line)).toDate();
115
+ // // dateString = line;
116
+ // // }
117
+ // // if (line.includes('Time')) {
118
+ // // console.log('Time', line);
119
+ // // console.log(moment(Date.parse(line)));
120
+ // // console.log(moment(date.setTime(Date.parse(line))));
121
+ // // }
122
+ // // }
123
+ // // });
124
+ // }
125
+ // });
126
+ // });
127
+ // msg.once('attributes', function(attrs) {
128
+ // console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
129
+ // });
130
+ // msg.once('end', function() {
131
+ // console.log(prefix + 'Finished');
132
+ // });
133
+ // });
134
+ // f.once('error', function(error) {
135
+ // console.log('Fetch error: ' + error);
136
+ // });
137
+ // f.once('end', function() {
138
+ // console.log('Done fetching all messages!');
139
+ // that._imap.end();
140
+ // });
141
+ // });
142
+ // });
143
+ // });
144
+ // this._imap.connect();
145
+ this._aws = new aws.S3({
146
+ accessKeyId: serverConfig.AWSACCESSKEYID,
147
+ secretAccessKey: serverConfig.AWSSECRETACCESSKEY,
148
+ region: serverConfig.AWSREGION
149
+ });
150
+ setInterval(function () {
151
+ if (!_this._runningQueue) {
152
+ if (_this._sendQueue.length) {
153
+ _this._runningQueue = true;
154
+ var _loop_1 = function (i) {
155
+ var ws = _this._mainServer.getWS(_this._sendQueue[i].id_ws);
156
+ if (ws && ws.readyState === ws.OPEN) {
157
+ if (ws.bufferedAmount < 20480) {
158
+ var sendItem = _this._sendQueue.pop();
159
+ ws.send(JSON.stringify(sendItem.data), function (error) {
160
+ if (error) {
161
+ console.log('Error on WS: ', error);
162
+ _this._mainServer.unsubscribeWS(ws);
163
+ }
164
+ });
165
+ if (sendItem.method !== 'countQuery' && sendItem.method !== 'countCollectionWithQuery' && sendItem.method !== 'find' && sendItem.method !== 'findOne' && sendItem.method !== 'findWithOptions' && sendItem.method !== 'setWSAppVersion' && sendItem.method !== 'uploadFileAndSave') {
166
+ if (common_1.getBinarySize(JSON.stringify(sendItem.methodData)) < 200000 && common_1.getBinarySize(JSON.stringify(sendItem.data)) < 200000) {
167
+ log_collection_1.Logs.create({
168
+ _id: mongoose_1.Types.ObjectId().toHexString(),
169
+ date: new Date(),
170
+ type: 'client-response',
171
+ title: 'Client Response',
172
+ message: 'User: ' + ws['user'] + ', MessageId: ' + sendItem.data.messageId + ', Method: ' + sendItem.method,
173
+ payload: [JSON.stringify(sendItem.methodData), sendItem.data],
174
+ method: sendItem.method,
175
+ user: ws['user'],
176
+ messageId: sendItem.data.messageId
177
+ });
178
+ }
179
+ else {
180
+ log_collection_1.Logs.create({
181
+ _id: mongoose_1.Types.ObjectId().toHexString(),
182
+ date: new Date(),
183
+ type: 'client-response',
184
+ title: 'Client Response',
185
+ message: 'User: ' + ws['user'] + ', MessageId: ' + sendItem.data.messageId + ', Method: ' + sendItem.method,
186
+ payload: 'Too Big',
187
+ method: sendItem.method,
188
+ user: ws['user'],
189
+ messageId: sendItem.data.messageId
190
+ });
191
+ }
192
+ }
193
+ method_response_collection_1.MethodResponses.create({
194
+ _id: mongoose_1.Types.ObjectId().toHexString(),
195
+ __v: 0,
196
+ id_user: ws['id_user'],
197
+ message_id: sendItem.data.messageId,
198
+ data: JSON.stringify(sendItem.methodData),
199
+ response: sendItem.data,
200
+ method: sendItem.method
201
+ });
202
+ }
203
+ }
204
+ else {
205
+ _this._sendQueue.splice(i, 1);
206
+ }
207
+ };
208
+ for (var i = _this._sendQueue.length - 1; i >= 0; i--) {
209
+ _loop_1(i);
210
+ }
211
+ _this._runningQueue = false;
212
+ }
213
+ }
214
+ }, 50);
215
+ }
216
+ MethodManager.prototype.getMainServer = function () {
217
+ return this._mainServer;
218
+ };
219
+ // Add methods to private methods object
220
+ MethodManager.prototype.methods = function (method) {
221
+ this._methods = Object.assign(this._methods, method);
222
+ };
223
+ MethodManager.prototype.callMethodCron = function (method) {
224
+ var methodData = [];
225
+ for (var _i = 1; _i < arguments.length; _i++) {
226
+ methodData[_i - 1] = arguments[_i];
227
+ }
228
+ var _a;
229
+ var that = this;
230
+ if (!that._methods[method]) {
231
+ console.log('No Method: ' + method);
232
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Method: ' + method);
233
+ return;
234
+ }
235
+ if ((methodData.length > 1 || methodData[0]) && !that._methods[method].skipValidation) {
236
+ if (!that._methods[method].check) {
237
+ console.error('No Check Function For Method ' + method);
238
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + method);
239
+ return;
240
+ }
241
+ else if (!that._methods[method].check._schema) {
242
+ console.error('No Check Schema For Method ' + method);
243
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + method);
244
+ return;
245
+ }
246
+ else {
247
+ var valObj = {};
248
+ var valKeys = Object.keys(that._methods[method].check._schema);
249
+ var rootKeys = valKeys.filter(function (a) { return !a.includes('.'); });
250
+ for (var i = 0; i < methodData.length; i++) {
251
+ valObj[rootKeys[i]] = methodData[i];
252
+ }
253
+ try {
254
+ that._methods[method].check.validate(valObj);
255
+ }
256
+ catch (errors) {
257
+ if (errors) {
258
+ console.error('Error in Method Check (' + method + ')', errors);
259
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'Match Error On Method ' + method + '\n\nData Being Checked\n' + JSON.stringify(valObj, null, 2) + '\n\nErrors\n' + JSON.stringify(errors, null, 2));
260
+ return;
261
+ }
262
+ }
263
+ }
264
+ }
265
+ (_a = that._methods[method].function).call.apply(_a, [Object.assign({}, that, { id_user: '', user: '', id_ws: '' })].concat(methodData));
266
+ };
267
+ MethodManager.prototype.callMethodQueue = function (update) {
268
+ // console.log('Call Method Queue', update);
269
+ var _this = this;
270
+ var _a;
271
+ var updateCopy = common_1.deepCopy(update);
272
+ var that = this;
273
+ if (!that._methods[update.method]) {
274
+ console.log('No Method: ' + update.method);
275
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Method: ' + update.method);
276
+ var serverRes = {
277
+ messageId: update.messageId,
278
+ hasError: true,
279
+ data: 'Internal Error'
280
+ };
281
+ this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
282
+ return;
283
+ }
284
+ if ((update.method_data.length > 1 || update.method_data[0]) && !that._methods[update.method].skipValidation) {
285
+ if (!that._methods[update.method].check) {
286
+ console.error('No Check Function For Method ' + update.method);
287
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + update.method);
288
+ var serverRes = {
289
+ messageId: update.messageId,
290
+ hasError: true,
291
+ data: 'Internal Error'
292
+ };
293
+ this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
294
+ return;
295
+ }
296
+ else if (!that._methods[update.method].check._schema) {
297
+ console.error('No Check Schema For Method ' + update.method);
298
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + update.method);
299
+ var serverRes = {
300
+ messageId: update.messageId,
301
+ hasError: true,
302
+ data: 'Internal Error'
303
+ };
304
+ this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
305
+ return;
306
+ }
307
+ else {
308
+ var valObj = {};
309
+ var valKeys = Object.keys(that._methods[update.method].check._schema);
310
+ var rootKeys = valKeys.filter(function (a) { return !a.includes('.'); });
311
+ for (var i = 0; i < update.method_data.length; i++) {
312
+ valObj[rootKeys[i]] = update.method_data[i];
313
+ }
314
+ try {
315
+ that._methods[update.method].check.validate(valObj);
316
+ }
317
+ catch (errors) {
318
+ if (errors) {
319
+ console.error('Error in Method Check (' + update.method + ')', errors);
320
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'Match Error On Method ' + update.method + '\n\nData Being Checked\n' + JSON.stringify(valObj, null, 2) + '\n\nErrors\n' + JSON.stringify(errors, null, 2));
321
+ var serverRes = {
322
+ messageId: update.messageId,
323
+ hasError: true,
324
+ data: 'Internal Error'
325
+ };
326
+ this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
327
+ return;
328
+ }
329
+ }
330
+ }
331
+ }
332
+ // console.log('Run Method', update.method);
333
+ (_a = that._methods[update.method].function).call.apply(_a, [Object.assign({}, that, { id_user: update.id_user, user: update.user, id_ws: update.id_ws })].concat(update.method_data)).then(function (res) {
334
+ var serverRes = {
335
+ messageId: update.messageId,
336
+ hasError: false,
337
+ data: res
338
+ };
339
+ _this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
340
+ }, function (err) {
341
+ var serverRes = {
342
+ messageId: update.messageId,
343
+ hasError: true,
344
+ data: err
345
+ };
346
+ _this._mainServer.getQueueManager().addMethodResponse(updateCopy, serverRes);
347
+ });
348
+ };
349
+ // Call/run method (Emit on Socket)
350
+ MethodManager.prototype.callMethod = function (ws, messageId, method) {
351
+ var _this = this;
352
+ var methodData = [];
353
+ for (var _i = 3; _i < arguments.length; _i++) {
354
+ methodData[_i - 3] = arguments[_i];
355
+ }
356
+ var _a;
357
+ var that = this;
358
+ if (!that._methods[method]) {
359
+ console.log('No Method: ' + method);
360
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Method: ' + method);
361
+ var serverRes = {
362
+ messageId: messageId,
363
+ hasError: true,
364
+ data: 'Internal Error'
365
+ };
366
+ this.sendWS(ws, method, methodData, serverRes);
367
+ return;
368
+ }
369
+ if ((methodData.length > 1 || methodData[0]) && !that._methods[method].skipValidation) {
370
+ if (!that._methods[method].check) {
371
+ console.error('No Check Function For Method ' + method);
372
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + method);
373
+ var serverRes = {
374
+ messageId: messageId,
375
+ hasError: true,
376
+ data: 'Internal Error'
377
+ };
378
+ this.sendWS(ws, method, methodData, serverRes);
379
+ return;
380
+ }
381
+ else if (!that._methods[method].check._schema) {
382
+ console.error('No Check Schema For Method ' + method);
383
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'No Check Function For Method ' + method);
384
+ var serverRes = {
385
+ messageId: messageId,
386
+ hasError: true,
387
+ data: 'Internal Error'
388
+ };
389
+ this.sendWS(ws, method, methodData, serverRes);
390
+ return;
391
+ }
392
+ else {
393
+ var valObj = {};
394
+ var valKeys = Object.keys(that._methods[method].check._schema);
395
+ var rootKeys = valKeys.filter(function (a) { return !a.includes('.'); });
396
+ for (var i = 0; i < methodData.length; i++) {
397
+ valObj[rootKeys[i]] = methodData[i];
398
+ }
399
+ try {
400
+ that._methods[method].check.validate(valObj);
401
+ }
402
+ catch (errors) {
403
+ if (errors) {
404
+ console.error('Error in Method Check (' + method + ')', errors);
405
+ that.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + that.serverConfig['CLIENT_NAME'], 'Match Error On Method ' + method + '\n\nData Being Checked\n' + JSON.stringify(valObj, null, 2) + '\n\nErrors\n' + JSON.stringify(errors, null, 2));
406
+ var serverRes = {
407
+ messageId: messageId,
408
+ hasError: true,
409
+ data: 'Internal Error'
410
+ };
411
+ this.sendWS(ws, method, methodData, serverRes);
412
+ return;
413
+ }
414
+ }
415
+ }
416
+ }
417
+ (_a = that._methods[method].function).call.apply(_a, [Object.assign({}, that, { id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket'] })].concat(methodData)).then(function (res) {
418
+ var serverRes = {
419
+ messageId: messageId,
420
+ hasError: false,
421
+ data: res
422
+ };
423
+ _this.sendWS(ws, method, methodData, serverRes);
424
+ }, function (err) {
425
+ var serverRes = {
426
+ messageId: messageId,
427
+ hasError: true,
428
+ data: err
429
+ };
430
+ _this.sendWS(ws, method, methodData, serverRes);
431
+ });
432
+ };
433
+ // Call/run method internal (No Emit on Socket)
434
+ MethodManager.prototype.callMethodInternal = function (method) {
435
+ var methodData = [];
436
+ for (var _i = 1; _i < arguments.length; _i++) {
437
+ methodData[_i - 1] = arguments[_i];
438
+ }
439
+ var _a;
440
+ var that = this;
441
+ if (!that._methods[method]) {
442
+ console.log('No Method: ' + method);
443
+ return;
444
+ }
445
+ if ((methodData.length > 1 || (methodData[0] && typeof (methodData[0]) !== 'function')) && !that._methods[method].skipValidation) {
446
+ if (!that._methods[method].check) {
447
+ console.error('No Check Function For Method ' + method);
448
+ return;
449
+ }
450
+ else if (!that._methods[method].check._schema) {
451
+ console.error('No Check Schema For Method ' + method);
452
+ return;
453
+ }
454
+ }
455
+ var promise = (_a = that._methods[method].function).call.apply(_a, [that].concat(methodData));
456
+ if (methodData[methodData.length - 1] && typeof (methodData[methodData.length - 1]) === 'function') {
457
+ promise.then(function (res) { return methodData[methodData.length - 1](null, res); }, function (err) { return methodData[methodData.length - 1](err, null); });
458
+ }
459
+ return promise;
460
+ };
461
+ MethodManager.prototype.sendWS = function (ws, method, methodData, data) {
462
+ this._sendQueue.splice(0, 0, {
463
+ id_ws: ws['id_socket'],
464
+ method: method,
465
+ methodData: methodData,
466
+ data: data
467
+ });
468
+ };
469
+ MethodManager.prototype.sendEmail = function (sendTo, subject, text, html, attachments) {
470
+ this._mailer.sendMail({
471
+ replyTo: undefined,
472
+ from: this.serverConfig.MAIL_FROM,
473
+ to: sendTo,
474
+ subject: subject,
475
+ text: text,
476
+ html: html,
477
+ attachments: attachments
478
+ }, function (err, info) {
479
+ if (err) {
480
+ console.log(err);
481
+ }
482
+ });
483
+ };
484
+ MethodManager.prototype.getAWS = function () {
485
+ return this._aws;
486
+ };
487
+ MethodManager.prototype.readFile = function (fileName) {
488
+ return new Promise(function (resolve, reject) {
489
+ fs.readFile(path.join(__dirname, ('../private/' + fileName)), 'utf-8', function (err, res) {
490
+ if (err) {
491
+ reject(err);
492
+ }
493
+ else {
494
+ resolve(res);
495
+ }
496
+ });
497
+ });
498
+ };
499
+ MethodManager.prototype.readImage = function (fileName) {
500
+ return new Promise(function (resolve, reject) {
501
+ fs.readFile(path.join(__dirname, ('../private/' + fileName)), 'base64', function (err, res) {
502
+ if (err) {
503
+ reject(err);
504
+ }
505
+ else {
506
+ resolve(res);
507
+ }
508
+ });
509
+ });
510
+ };
511
+ return MethodManager;
512
+ }());
513
+ exports.MethodManager = MethodManager;
@@ -0,0 +1,14 @@
1
+ import { QueueMethodModel } from '../models/queue-method.model';
2
+ import { ServerResponseModel } from '../models/server-response.model';
3
+ export declare class QueueMethodManager {
4
+ private _mainServer;
5
+ private _sendQueue;
6
+ private _runningQueue;
7
+ private _runningMethodResponse;
8
+ constructor(mainServer: any);
9
+ addMethodToQueue(id_ws: string, id_user: string, user: string, messageId: string, method: string, data: any[]): void;
10
+ runMethodQueue(count?: number): Promise<void>;
11
+ addMethodResponse(update: QueueMethodModel, response: ServerResponseModel): void;
12
+ runMethodResponse(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=queue-method.manager.d.ts.map