vk-chat-bot
Version:
Package for easy creation of chat bots for VK communities (uses Callback API).
3 lines (2 loc) • 39.4 kB
JavaScript
;var __awaiter=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(s,a){function i(e){try{o(r.next(e))}catch(e){a(e)}}function l(e){try{o(r.throw(e))}catch(e){a(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}o((r=r.apply(e,t||[])).next())}))},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const escape_string_regexp_1=__importDefault(require("escape-string-regexp")),context_1=__importDefault(require("./api/context")),log_1=require("./extra/log");class Core{constructor(e,t,n,r){this.locked=!1,this.eventHandlers={message_new:null,message_reply:null,message_edit:null,message_typing_state:null,message_allow:null,message_deny:null,start:null,service_action:null,no_match:null,handler_error:null},this.exactPayloadHandlers={},this.dynPayloadHandlers=[],this.commandHandlers=[],this.regexHandlers=[],this.eventWarnings=!0,this.helpMessage="",this.api=e,this.stats=t,this.cmdPrefix=n,this.escapedCmdPrefix=escape_string_regexp_1.default(this.cmdPrefix),this.groupId=escape_string_regexp_1.default(r.toString()),this.registerMessageNewHandler()}noEventWarnings(){this.eventWarnings=!1,log_1.log().w("Warnings about missing event handlers were disabled").from("core").now()}lock(){this.locked=!0,this.generateHelpMessage()}on(e,t){this.isLocked()||(Object.keys(this.eventHandlers).includes(e)||log_1.log().e(`Cannot register a handler: unknown event type '${e}'`).from("core").now(),this.eventHandlers[e]?"message_new"===e?log_1.log().e("Cannot register a handler: handler for the `message_new` event is defined internally").from("core").now():log_1.log().e(`Cannot register a handler: duplicate handler for event '${e}'`).from("core").now():this.eventHandlers[e]=t)}payload(e,t){this.isLocked()||("function"!=typeof e?this.exactPayloadHandlers[JSON.stringify(e)]?log_1.log().e(`Cannot register a handler: duplicate handler for payload '${e}'`).from("core").now():this.exactPayloadHandlers[JSON.stringify(e)]=t:this.dynPayloadHandlers.push({tester:e,handler:t}))}cmd(e,t,n=""){this.isLocked()||this.commandHandlers.push({command:e,description:n,handler:t})}regex(e,t){this.isLocked()||this.regexHandlers.push({regex:e,handler:t})}parseRequest(e){return __awaiter(this,void 0,void 0,(function*(){const t=e.object,n=e.type,r=new context_1.default(this.api,n,t,t.text);yield this.event(n,r)}))}help(){return this.helpMessage}isLocked(){return this.locked&&log_1.log().w("Registering a handler while the bot is running is not allowed").from("core").now(),this.locked}event(e,t){return __awaiter(this,void 0,void 0,(function*(){if(this.stats.event(e),this.eventHandlers[e])try{yield this.eventHandlers[e](t),t.needsAutoSend()&&"message_new"!==e&&(yield t.send())}catch(n){log_1.log().w(`Error in handler: ${n}`).from("core").now(),"handler_error"!==e&&(yield this.event("handler_error",t))}else this.eventWarnings&&log_1.log().w(`No handler for event '${e}'`).from("core").now()}))}registerMessageNewHandler(){this.on("message_new",e=>__awaiter(this,void 0,void 0,(function*(){if(!e.obj.action)return(yield this.tryHandlePayload(e))||(yield this.tryHandleCommand(e))||(yield this.tryHandleRegex(e))?void(e.needsAutoSend()&&(yield e.send())):(log_1.log().w(`Don't know how to respond to ${JSON.stringify(e.msg).replace(/\n/g,"\\n")}, calling 'no_match' event`).from("core").now(),void(yield this.event("no_match",e)));yield this.event("service_action",e)})))}tryHandlePayload(e){return __awaiter(this,void 0,void 0,(function*(){const{payload:t}=e.obj;if(t){try{if("start"===JSON.parse(t).command)return yield this.event("start",e),e.noAutoSend(),!0}catch(e){}if(this.exactPayloadHandlers[t])return yield this.exactPayloadHandlers[t](e),!0;const n=this.dynPayloadHandlers.map(e=>{let n=null;try{n=JSON.parse(t)}catch(e){}return e.tester(t,n)?e:null}).filter(e=>e);if(n)return yield n[0].handler(e),!0}return!1}))}tryHandleCommand(e){return __awaiter(this,void 0,void 0,(function*(){const t=this.commandHandlers.map(t=>{const n=escape_string_regexp_1.default(t.command),r=new RegExp(`^( *\\[club${this.groupId}\\|.*\\])?( *${this.escapedCmdPrefix}${n})+`,"i");return r.test(e.msg)?{handler:t,msg:e.msg.replace(r,"")}:null}).filter(e=>e);if(t.length>0){const{handler:n,msg:r}=t[0];return e.msg=r,yield n.handler(e),!0}return!1}))}tryHandleRegex(e){return __awaiter(this,void 0,void 0,(function*(){const t=this.regexHandlers.filter(t=>t.regex.test(e.msg));return t.length>0&&(yield t[0].handler(e),!0)}))}generateHelpMessage(){let e="\n";this.commandHandlers.forEach(t=>{let n="";n+=this.cmdPrefix,n+=t.command,t.description&&(n+=" - ",n+=t.description),e+=`${n}\n`}),this.helpMessage=e}getHandlerCounts(){return{evt:Object.values(this.eventHandlers).filter(e=>e).length-1,cmd:this.commandHandlers.length,reg:this.regexHandlers.length,pld:Object.keys(this.exactPayloadHandlers).length+this.dynPayloadHandlers.length}}}exports.default=Core;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUuanMiLCJjb3JlLnRzIl0sIm5hbWVzIjpbIl9fYXdhaXRlciIsInRoaXMiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsImFwcGx5IiwiX19pbXBvcnREZWZhdWx0IiwibW9kIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJlc2NhcGVfc3RyaW5nX3JlZ2V4cF8xIiwicmVxdWlyZSIsImNvbnRleHRfMSIsImxvZ18xIiwiQ29yZSIsIltvYmplY3QgT2JqZWN0XSIsImFwaSIsInN0YXRzIiwiY21kUHJlZml4IiwiZ3JvdXBJZCIsImxvY2tlZCIsImV2ZW50SGFuZGxlcnMiLCJtZXNzYWdlX25ldyIsIm1lc3NhZ2VfcmVwbHkiLCJtZXNzYWdlX2VkaXQiLCJtZXNzYWdlX3R5cGluZ19zdGF0ZSIsIm1lc3NhZ2VfYWxsb3ciLCJtZXNzYWdlX2RlbnkiLCJzdGFydCIsInNlcnZpY2VfYWN0aW9uIiwibm9fbWF0Y2giLCJoYW5kbGVyX2Vycm9yIiwiZXhhY3RQYXlsb2FkSGFuZGxlcnMiLCJkeW5QYXlsb2FkSGFuZGxlcnMiLCJjb21tYW5kSGFuZGxlcnMiLCJyZWdleEhhbmRsZXJzIiwiZXZlbnRXYXJuaW5ncyIsImhlbHBNZXNzYWdlIiwiZXNjYXBlZENtZFByZWZpeCIsInRvU3RyaW5nIiwicmVnaXN0ZXJNZXNzYWdlTmV3SGFuZGxlciIsImxvZyIsInciLCJmcm9tIiwibm93IiwiZ2VuZXJhdGVIZWxwTWVzc2FnZSIsImV2ZW50IiwiaGFuZGxlciIsImlzTG9ja2VkIiwia2V5cyIsImluY2x1ZGVzIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIiwidGVzdGVyIiwiY29tbWFuZCIsImRlc2NyaXB0aW9uIiwicmVnZXgiLCJib2R5Iiwib2JqIiwib2JqZWN0IiwidHlwZSIsIiQiLCJ0ZXh0IiwibmFtZSIsIm5lZWRzQXV0b1NlbmQiLCJzZW5kIiwiZXJyb3IiLCJvbiIsImFjdGlvbiIsInRyeUhhbmRsZVBheWxvYWQiLCJ0cnlIYW5kbGVDb21tYW5kIiwidHJ5SGFuZGxlUmVnZXgiLCJtc2ciLCJyZXBsYWNlIiwicGFyc2UiLCJub0F1dG9TZW5kIiwiaGFuZGxlcnMiLCJtYXAiLCJwb3RlbnRpYWxIYW5kbGVyIiwicGFyc2VkIiwiZmlsdGVyIiwiaGFuZGxlck9ianMiLCJjbWQiLCJjbWRSZWdleCIsIlJlZ0V4cCIsInRlc3QiLCJsZW5ndGgiLCJmb3JFYWNoIiwiaGVscEVudHJ5IiwiZXZ0IiwidmFsdWVzIiwicmVnIiwicGxkIl0sIm1hcHBpbmdzIjoiQUFBQSxhQUNBLElBQUlBLFVBQWFDLE1BQVFBLEtBQUtELFdBQWMsU0FBVUUsRUFBU0MsRUFBWUMsRUFBR0MsR0FFMUUsT0FBTyxJQUFLRCxJQUFNQSxFQUFJRSxXQUFVLFNBQVVDLEVBQVNDLEdBQy9DLFNBQVNDLEVBQVVDLEdBQVMsSUFBTUMsRUFBS04sRUFBVU8sS0FBS0YsSUFBVyxNQUFPRyxHQUFLTCxFQUFPSyxJQUNwRixTQUFTQyxFQUFTSixHQUFTLElBQU1DLEVBQUtOLEVBQWlCLE1BQUVLLElBQVcsTUFBT0csR0FBS0wsRUFBT0ssSUFDdkYsU0FBU0YsRUFBS0ksR0FKbEIsSUFBZUwsRUFJYUssRUFBT0MsS0FBT1QsRUFBUVEsRUFBT0wsUUFKMUNBLEVBSXlESyxFQUFPTCxNQUpoREEsYUFBaUJOLEVBQUlNLEVBQVEsSUFBSU4sR0FBRSxTQUFVRyxHQUFXQSxFQUFRRyxPQUlUTyxLQUFLUixFQUFXSyxHQUNsR0gsR0FBTU4sRUFBWUEsRUFBVWEsTUFBTWhCLEVBQVNDLEdBQWMsS0FBS1MsWUFHbEVPLGdCQUFtQmxCLE1BQVFBLEtBQUtrQixpQkFBb0IsU0FBVUMsR0FDOUQsT0FBUUEsR0FBT0EsRUFB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S0FBS2lELGdCQUFnQnVELFFBQVMxQyxJQUMxQixJQUFJMkMsRUFBWSxHQUVoQkEsR0FBYXpHLEtBQUtpQyxVQUNsQndFLEdBQWEzQyxFQUFRUyxRQUVqQlQsRUFBUVUsY0FDUmlDLEdBQWEsTUFDYkEsR0FBYTNDLEVBQVFVLGFBR3pCcEIsR0FBZSxHQUFHcUQsUUFHdEJ6RyxLQUFLb0QsWUFBY0EsRUFNaEJ0QixtQkFNSCxNQUFPLENBRUg0RSxJQUFLcEYsT0FBT3FGLE9BQU8zRyxLQUFLb0MsZUFBZTZELE9BQU9yRixHQUFLQSxHQUFHMkYsT0FBUyxFQUMvREosSUFBS25HLEtBQUtpRCxnQkFBZ0JzRCxPQUMxQkssSUFBSzVHLEtBQUtrRCxjQUFjcUQsT0FDeEJNLElBQUt2RixPQUFPMEMsS0FBS2hFLEtBQUsrQyxzQkFBc0J3RCxPQUFTdkcsS0FBS2dELG1CQUFtQnVELFNBN2xCekYvRSxRQUFBSCxRQUFBUSIsImZpbGUiOiJjb3JlLmpzIiwic291cmNlc0NvbnRlbnQiOltudWxsLCJpbXBvcnQgZXNjYXBlUmVnZXggZnJvbSAnZXNjYXBlLXN0cmluZy1yZWdleHAnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi9hcGkvY29udGV4dCc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2V4dHJhL2xvZyc7XG5cbmltcG9ydCBBUEkgZnJvbSAnLi9hcGkvYXBpJztcbmltcG9ydCBTdGF0cyBmcm9tICcuL2V4dHJhL3N0YXRzJztcblxuZXhwb3J0IHR5cGUgSGFuZGxlciA9ICgkOiBDb250ZXh0KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IHR5cGUgUGF5bG9hZCA9IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbi8qKlxuICogQHBhcmFtIHBheWxvYWRKc29uIGBwYXlsb2FkSnNvbmAgdGhlIHN0cmluZ2lmaWVkIEpTT04gb2YgdGhlIHBheWxvYWQgKGFzIGdpdmVuIGJ5IENhbGxiYWNrIEFQSSlcbiAqIEBwYXJhbSBwYXlsb2FkIGBwYXlsb2FkYCB0aGUgSlMgb2JqZWN0IHRoYXQgd2FzIG1hZGUgYnkgcGFyc2luZyB0aGUgYHBheWxvYWRKc29uYCwgaWYgdGhlXG4gKiBwYXJzaW5nIHdhcyBzdWNjZXNzZnVsXG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RlciA9IChwYXlsb2FkSnNvbjogc3RyaW5nLCBwYXlsb2FkPzogUGF5bG9hZCkgPT4gYm9vbGVhbjtcblxuaW50ZXJmYWNlIER5blBheWxvYWRIYW5kbGVyIHtcbiAgICB0ZXN0ZXI6IFRlc3RlcjtcbiAgICBoYW5kbGVyOiBIYW5kbGVyO1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZEhhbmRsZXIge1xuICAgIGNvbW1hbmQ6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGhhbmRsZXI6IEhhbmRsZXI7XG59XG5cbi8qKlxuICogRGlzcGF0Y2hlcyBtZXNzYWdlIGhhbmRsaW5nIHRvIGFwcHJvcHJpYXRlIGhhbmRsZXJzLFxuICogYW5kIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlc2UgaGFuZGxlcnMuXG4gKlxuICogSGFuZGxlcnMgZm9yIHRoZSBgbWVzc2FnZV9uZXdgIGV2ZW50IHdpbGwgYmUgc2VhcmNoZWQgaW4gdGhpcyBvcmRlcjpcbiAqIDEuIElmIHNlcnZpY2UgYWN0aW9uIG1lc3NhZ2UgPT4gW1tvbl1dIGhhbmRsZXIgZm9yIHRoZSBgc2VydmljZV9hY3Rpb25gIGV2ZW50XG4gKiAxLiBJZiB1c2VyIHByZXNzZWQgdGhlIGBTdGFydGAgYnV0dG9uID0+IFtbb25dXSBoYW5kbGVyIGZvciB0aGUgYHN0YXJ0YCBldmVudFxuICogMS4gW1twYXlsb2FkXV1cbiAqIDEuIFtbY21kXV1cbiAqIDEuIFtbcmVnZXhdXVxuICpcbiAqIEZvciBvdGhlciBldmVudHMsIGEgbWF0Y2hpbmcgW1tvbl1dIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvcmUge1xuICAgIHB1YmxpYyByZWFkb25seSBhcGk6IEFQSTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHM6IFN0YXRzO1xuXG4gICAgLyoqXG4gICAgICogQ29tbWFuZCBwcmVmaXguXG4gICAgICovXG4gICAgcHJpdmF0ZSBjbWRQcmVmaXg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdyb3VwIElELlxuICAgICAqL1xuICAgIHByaXZhdGUgZ3JvdXBJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tbWFuZCBwcmVmaXgsIGVzY2FwZWQgZm9yIHVzYWdlIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGVzY2FwZWRDbWRQcmVmaXg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElzIHRoaXMgYENvcmVgIGxvY2tlZD9cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvY2tlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcnMgZm9yIGV2ZW50cy5cbiAgICAgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvY2FtZWxjYXNlICovXG4gICAgcHJpdmF0ZSBldmVudEhhbmRsZXJzOiB7IFtrZXk6IHN0cmluZ106IEhhbmRsZXIgfSA9IHtcbiAgICAgICAgLy8gQ2FsbGJhY2sgQVBJXG4gICAgICAgIG1lc3NhZ2VfbmV3OiBudWxsLFxuICAgICAgICBtZXNzYWdlX3JlcGx5OiBudWxsLFxuICAgICAgICBtZXNzYWdlX2VkaXQ6IG51bGwsXG4gICAgICAgIG1lc3NhZ2VfdHlwaW5nX3N0YXRlOiBudWxsLFxuICAgICAgICBtZXNzYWdlX2FsbG93OiBudWxsLFxuICAgICAgICBtZXNzYWdlX2Rlbnk6IG51bGwsXG5cbiAgICAgICAgLy8gRGV0ZWN0ZWQgd2hlbiBwYXJzaW5nICdtZXNzYWdlX25ldycgZXZlbnRcbiAgICAgICAgc3RhcnQ6IG51bGwsXG4gICAgICAgIHNlcnZpY2VfYWN0aW9uOiBudWxsLFxuXG4gICAgICAgIC8vIEludGVybmFsIGV2ZW50c1xuICAgICAgICBub19tYXRjaDogbnVsbCxcbiAgICAgICAgaGFuZGxlcl9lcnJvcjogbnVsbCxcbiAgICB9O1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L2NhbWVsY2FzZSAqL1xuXG4gICAgLyoqXG4gICAgICogRXhhY3QgcGF5bG9hZCBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4YWN0UGF5bG9hZEhhbmRsZXJzOiB7IFtrZXk6IHN0cmluZ106IEhhbmRsZXIgfSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogRHluYW1pYyBwYXlsb2FkIGhhbmRsZXJzLlxuICAgICAqICh0aG9zZSB3aGljaCB1c2UgZnVuY3Rpb25zIHRvIGRldGVybWluZSB3aGV0aGVyIGEgaGFuZGxlciBpcyBzdWl0YWJsZSlcbiAgICAgKi9cbiAgICBwcml2YXRlIGR5blBheWxvYWRIYW5kbGVyczogRHluUGF5bG9hZEhhbmRsZXJbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQ29tbWFuZCBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbW1hbmRIYW5kbGVyczogQ29tbWFuZEhhbmRsZXJbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogUmVndWxhciBleHByZXNzaW9uIGhhbmRsZXJzLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVnZXhIYW5kbGVyczogeyByZWdleDogUmVnRXhwOyBoYW5kbGVyOiBIYW5kbGVyIH1bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQXJlIGV2ZW50IHdhcm5pbmdzIGVuYWJsZWQ/XG4gICAgICovXG4gICAgcHJpdmF0ZSBldmVudFdhcm5pbmdzID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBoZWxwIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoZWxwTWVzc2FnZSA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBbW0NvcmVdXS5cbiAgICAgKiBAcGFyYW0gYXBpIFtbQVBJXV0gb2JqZWN0XG4gICAgICogQHBhcmFtIHN0YXRzIFtbU3RhdHNdXSBvYmplY3RcbiAgICAgKiBAcGFyYW0gY21kUHJlZml4IGNvbW1hbmQgcHJlZml4XG4gICAgICogQHBhcmFtIGdyb3VwSWQgZ3JvdXAgSURcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIGFwaTogQVBJLFxuICAgICAgICBzdGF0czogU3RhdHMsXG4gICAgICAgIGNtZFByZWZpeDogc3RyaW5nLFxuICAgICAgICBncm91cElkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuYXBpID0gYXBpO1xuICAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7XG4gICAgICAgIHRoaXMuY21kUHJlZml4ID0gY21kUHJlZml4O1xuICAgICAgICB0aGlzLmVzY2FwZWRDbWRQcmVmaXggPSBlc2NhcGVSZWdleCh0aGlzLmNtZFByZWZpeCk7XG4gICAgICAgIHRoaXMuZ3JvdXBJZCA9IGVzY2FwZVJlZ2V4KGdyb3VwSWQudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VOZXdIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgd2FybmluZ3MgYWJvdXQgbWlzc2luZyBldmVudCBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbm9FdmVudFdhcm5pbmdzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmV2ZW50V2FybmluZ3MgPSBmYWxzZTtcbiAgICAgICAgbG9nKClcbiAgICAgICAgICAgIC53KCdXYXJuaW5ncyBhYm91dCBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzIHdlcmUgZGlzYWJsZWQnKVxuICAgICAgICAgICAgLmZyb20oJ2NvcmUnKVxuICAgICAgICAgICAgLm5vdygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2tzIHRoaXMgYENvcmVgLCBzbyBuZXcgaGFuZGxlcnMgY2FuJ3QgYmUgYWRkZWQsXG4gICAgICogYW5kIGdlbmVyYXRlcyB0aGUgaGVscCBtZXNzYWdlIGZvciBsYXRlciB1c2FnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9jaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmdlbmVyYXRlSGVscE1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYW4gZXZlbnQgaGFuZGxlci5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHdvcmsgZm9yIGBtZXNzYWdlX25ld2AsIGFzIGl0cyBoYW5kbGVyIGlzIGRlZmluZWQgYnkgYHZrLWNoYXQtYm90YCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiAjIyMgRXZlbnRzXG4gICAgICpcbiAgICAgKiAjIyMjIENhbGxiYWNrIEFQSSBFdmVudHNcbiAgICAgKiBFdmVudCB8IERlc2NyaXB0aW9uXG4gICAgICogLS0tfC0tLVxuICAgICAqIGBtZXNzYWdlX2FsbG93YCB8IFVzZXIgKiphbGxvd2VkKiogc2VuZGluZyBtZXNzYWdlcyB0byBoaW0vaGVyXG4gICAgICogYG1lc3NhZ2VfZGVueWAgfCBVc2VyICoqZGlzYWxsb3dlZCoqIHNlbmRpbmcgbWVzc2FnZXMgdG8gaGltL2hlclxuICAgICAqIGBtZXNzYWdlX3JlcGx5YCB8IE5ldyAqKm1lc3NhZ2Ugc2VudCoqIGJ5IGNvbW11bml0eSBhZG1pbmlzdHJhdG9yIChvciBieSB0aGUgYm90IGl0c2VsZilcbiAgICAgKiBgbWVzc2FnZV9lZGl0YCB8ICoqTWVzc2FnZSBlZGl0ZWQqKiBieSB1c2VyXG4gICAgICogYG1lc3NhZ2VfdHlwaW5nX3N0YXRlYCB8ICoqVXNlciBpcyB0eXBpbmcqKiBhIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqICMjIyMgT3RoZXIgRXZlbnRzXG4gICAgICogRXZlbnQgdHlwZSB8IFdoZW4gaGFuZGxlciBpcyBjYWxsZWRcbiAgICAgKiAtLS18LS0tXG4gICAgICogYHN0YXJ0YCB8IElmIHRoZSBtZXNzYWdlJ3MgcGF5bG9hZCBpcyBge1wiY29tbWFuZFwiOiBcInN0YXJ0XCJ9YCAoaS5lLiBgU3RhcnRgIGJ1dHRvbiBwcmVzc2VkKVxuICAgICAqIGBzZXJ2aWNlX2FjdGlvbmAgfCBTZXJ2aWNlIGFjdGlvbiBtZXNzYWdlIHJlY2VpdmVkXG4gICAgICogYG5vX21hdGNoYCB8IFdoZW4gbm8gbWF0Y2hpbmcgYGNtZCgpYCBvciBgcmVnZXgoKWAgaGFuZGxlciBpcyBmb3VuZFxuICAgICAqIGBoYW5kbGVyX2Vycm9yYCB8IElmIGFuIGVycm9yIGlzIHRocm93biBpbiBhIGhhbmRsZXJcbiAgICAgKlxuICAgICAqICMjIyMgVGhlIGBzZXJ2aWNlX2FjdGlvbmAgZXZlbnRcbiAgICAgKiA+IFRoZSBgJC5vYmouYWN0aW9uYCBvYmplY3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZpY2UgYWN0aW9uLlxuICAgICAqID4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiB0eXBlIChzdHJpbmcpIOKAlCBhY3Rpb24gdHlwZSwgb25lIG9mOlxuICAgICAqICAgIGBjaGF0X3Bob3RvX3VwZGF0ZWAg4oCUIGNoYXQgcGhvdG8gdXBkYXRlZFxuICAgICAqICAgIGBjaGF0X3Bob3RvX3JlbW92ZWAg4oCUIGNoYXQgcGhvdG8gcmVtb3ZlZFxuICAgICAqICAgIGBjaGF0X2NyZWF0ZWAg4oCUIGNoYXQgY3JlYXRlZFxuICAgICAqICAgIGBjaGF0X3RpdGxlX3VwZGF0ZWAg4oCUIGNoYXQgdGl0bGUgdXBkYXRlZFxuICAgICAqICAgIGBjaGF0X2ludml0ZV91c2VyYCDigJQgdXNlciB3YXMgaW52aXRlZCB0byBjaGF0XG4gICAgICogICAgYGNoYXRfa2lja191c2VyYCDigJQgdXNlciB3YXMga2lja2VkIGZyb20gdGhlIGNoYXRcbiAgICAgKiAgICBgY2hhdF9waW5fbWVzc2FnZWAg4oCUIGEgbWVzc2FnZSB3YXMgcGlubmVkXG4gICAgICogICAgYGNoYXRfdW5waW5fbWVzc2FnZWAg4oCUIGEgbWVzc2FnZSB3YXMgdW5waW5uZWRcbiAgICAgKiAgICBgY2hhdF9pbnZpdGVfdXNlcl9ieV9saW5rYCDigJQgdXNlciBqb2luZWQgdGhlIGNoYXQgYnkgbGlua1xuICAgICAqXG4gICAgICogbWVtYmVyX2lkIChpbnRlZ2VyKTpcbiAgICAgKiAgIHVzZXIgaWQgKGlmID4gMCksIHdoaWNoIHdhcyBpbnZpdGVkIG9yIGtpY2tlZCAoaWYgPCAwLCBzZWUgYGVtYWlsYCBmaWVsZClcbiAgICAgKiAgICAgKGBjaGF0X2ludml0ZV91c2VyYCwgYGNoYXRfaW52aXRlX3VzZXJfYnlfbGlua2AsICBgY2hhdF9raWNrX3VzZXJgKVxuICAgICAqICAgdXNlciBpZCwgd2hpY2ggcGlubmVkIG9yIHVucGlubmVkIGEgbWVzc2FnZVxuICAgICAqICAgICAoYGNoYXRfcGluX21lc3NhZ2VgLCBgY2hhdF91bnBpbl9tZXNzYWdlYClcbiAgICAgKlxuICAgICAqIHRleHQgKHN0cmluZyk6XG4gICAgICogICBjaGF0IG5hbWVcbiAgICAgKiAgICAgKGBjaGF0X2NyZWF0ZWAsIGBjaGF0X3RpdGxlX3VwZGF0ZWApXG4gICAgICpcbiAgICAgKiBlbWFpbCAoc3RyaW5nKTpcbiAgICAgKiAgIGVtYWlsLCB3aGljaCB3YXMgaW52aXRlZCBvciBraWNrZWRcbiAgICAgKiAgICAgKGBjaGF0X2ludml0ZV91c2VyYCwgYGNoYXRfa2lja191c2VyYCwgbWVtYmVyX2lkIDwgMClcbiAgICAgKlxuICAgICAqIHBob3RvIChvYmplY3QpIOKAlCBjaGF0IHBpY3R1cmUsIGNvbnRhaW5zOlxuICAgICAqICAgICBwaG90b181MCAoc3RyaW5nKTogVVJMIG9mIGltYWdlIDUwIHggNTAgcHhcbiAgICAgKiAgICAgcGhvdG9fMTAwIChzdHJpbmcpOiBVUkwgb2YgaW1hZ2UgMTAwIHggMTAwIHB4XG4gICAgICogICAgIHBob3RvXzIwMCAoc3RyaW5nKTogVVJMIG9mIGltYWdlIDIwMCB4IDIwMCBweFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIC0gZXZlbnQgbmFtZVxuICAgICAqIEBwYXJhbSAtIGZ1bmN0aW9uIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBtZXNzYWdlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGNvcmUub24oJ25vX21hdGNoJywgJCA9PiB7XG4gICAgICogICAkLnRleHQoJ0kgZG9uXFwndCBrbm93IGhvdyB0byByZXNwb25kIHRvIHlvdXIgbWVzc2FnZS4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuZXZlbnRIYW5kbGVycykuaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICAgICAgICBsb2coKVxuICAgICAgICAgICAgICAgIC5lKGBDYW5ub3QgcmVnaXN0ZXIgYSBoYW5kbGVyOiB1bmtub3duIGV2ZW50IHR5cGUgJyR7ZXZlbnR9J2ApXG4gICAgICAgICAgICAgICAgLmZyb20oJ2NvcmUnKVxuICAgICAgICAgICAgICAgIC5ub3coKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5ldmVudEhhbmRsZXJzW2V2ZW50XSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzW2V2ZW50XSA9IGhhbmRsZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdtZXNzYWdlX25ldycpIHtcbiAgICAgICAgICAgIGxvZygpXG4gICAgICAgICAgICAgICAgLmUoXG4gICAgICAgICAgICAgICAgICAgICdDYW5ub3QgcmVnaXN0ZXIgYSBoYW5kbGVyOiBoYW5kbGVyIGZvciB0aGUgYG1lc3NhZ2VfbmV3YCBldmVudCBpcyBkZWZpbmVkIGludGVybmFsbHknLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuZnJvbSgnY29yZScpXG4gICAgICAgICAgICAgICAgLm5vdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nKClcbiAgICAgICAgICAgICAgICAuZShgQ2Fubm90IHJlZ2lzdGVyIGEgaGFuZGxlcjogZHVwbGljYXRlIGhhbmRsZXIgZm9yIGV2ZW50ICcke2V2ZW50fSdgKVxuICAgICAgICAgICAgICAgIC5mcm9tKCdjb3JlJylcbiAgICAgICAgICAgICAgICAubm93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBwYXlsb2FkIGhhbmRsZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGUqKjogZXhhY3QgaGFuZGxlcnMgYXJlIHNlYXJjaGVkIGZpcnN0LCBhbmQgb25seSBpZiB0aGV5IGRvbid0IG1hdGNoLFxuICAgICAqIHRoZSBzZWFyY2ggZm9yIGEgZHluYW1pYyBoYW5kbGVyIGJlZ2lucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXlsb2FkIC0gZXhhY3QgcGF5bG9hZCB0byBoYW5kbGUsXG4gICAgICogb3IgYSBmdW5jdGlvbiAodHlwZSBbW1Rlc3Rlcl1dKSB3aGljaFxuICAgICAqIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gaGFuZGxlIHRoZSBwYXlsb2FkIG9yIG5vdC5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIGZ1bmN0aW9uIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBtZXNzYWdlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIC8vIC0tLS0tLS0+IEtFWUJPQVJEIChmb3Igc2VuZGluZyB0aGUgcGF5bG9hZClcbiAgICAgKlxuICAgICAqIC8vIENyZWF0ZSBhIGtleWJvYXJkXG4gICAgICogY29uc3QgeyBjb2xvcnMsIEtleWJvYXJkLCBCdXR0b24gfSA9IHZrLmtiZDtcbiAgICAgKlxuICAgICAqIHZhciBrYmQgPSBuZXcgS2V5Ym9hcmQoW1xuICAgICAqICAgICBbXG4gICAgICogICAgICAgICAvLyBDbGlja2luZyBvbiB0aGlzIGJ1dHRvbiB3aWxsIHNlbmQgdGhlIHBheWxvYWQge2E6ICdiJ31cbiAgICAgKiAgICAgICAgIGJ1dHRvbi50ZXh0KCdUZXN0IDEnLCBjb2xvcnMuZGVmYXVsdCwge2E6ICdiJ30pLFxuICAgICAqICAgICAgICAgYnV0dG9uLnRleHQoJ1Rlc3QgMicsIGNvbG9ycy5kZWZhdWx0LCB7YTogJ2InLCBjOiAnZCd9KVxuICAgICAqICAgICBdXG4gICAgICogXSwgZmFsc2UpO1xuICAgICAqXG4gICAgICogLy8gV2hlbiBhc2tlZCwgc2VuZCB0aGUga2V5Ym9hcmRcbiAgICAgKiBjb3JlLnJlZ2V4KC9rZXlib2FyZC9pLCAkID0+IHtcbiAgICAgKiAgICAkLmtleWJvYXJkKGtiZCk7XG4gICAgICogICAgJC50ZXh0KCdIZXJlIGl0IGlzIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gLS0tLS0tLT4gRVhBQ1QgUEFZTE9BRFxuICAgICAqIGNvcmUucGF5bG9hZCh7YTogJ2InfSwgJCA9PiB7XG4gICAgICogICAgJC50ZXh0KCdSZWNlaXZlZCBzZWNyZXQgcGF5bG9hZCEnKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIC0tLS0tLS0+IERZTkFNSUMgUEFZTE9BRFxuICAgICAqIC8vIEluIHRoaXMgY2FzZSwgdGhlIGhhbmRsZXIgd2lsbCBydW4gb25seSBpZiB0aGVcbiAgICAgKiAvLyBwYXlsb2FkJ3MgcHJvcGVydHkgYGNgIGNvbnRhaW5zIHRoZSB2YWx1ZSBgZGAuXG4gICAgICogY29yZS5wYXlsb2FkKChwYXlsb2FkLCBwYXJzZWQpID0+IHtcbiAgICAgKiAgICBpZiAocGFyc2VkKSB7IC8vIElmIHRoZSBwYXlsb2FkIGlzIGEgdmFsaWQgSlNPTlxuICAgICAqICAgICAgcmV0dXJuIHBhcnNlZC5jID09PSAnZCc7XG4gICAgICogICAgfSBlbHNlIHtcbiAgICAgKiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgKiAgICB9XG4gICAgICogfSwgJCA9PiB7XG4gICAgICogICAgJC50ZXh0KGBJbiBtZXNzYWdlICckeyQubXNnfScsIHBheWxvYWQuYyBpcyAnZCchYCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHBheWxvYWQocGF5bG9hZDogUGF5bG9hZCwgaGFuZGxlcjogSGFuZGxlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEV4YWN0IHBheWxvYWQgbWF0Y2g6XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5leGFjdFBheWxvYWRIYW5kbGVyc1tKU09OLnN0cmluZ2lmeShwYXlsb2FkKV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4YWN0UGF5bG9hZEhhbmRsZXJzW0pTT04uc3RyaW5naWZ5KHBheWxvYWQpXSA9IGhhbmRsZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZygpXG4gICAgICAgICAgICAgICAgICAgIC5lKFxuICAgICAgICAgICAgICAgICAgICAgICAgYENhbm5vdCByZWdpc3RlciBhIGhhbmRsZXI6IGR1cGxpY2F0ZSBoYW5kbGVyIGZvciBwYXlsb2FkICcke3BheWxvYWR9J2AsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmZyb20oJ2NvcmUnKVxuICAgICAgICAgICAgICAgICAgICAubm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEeW5hbWljIHBheWxvYWQgbWF0Y2g6XG5cbiAgICAgICAgICAgIHRoaXMuZHluUGF5bG9hZEhhbmRsZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRlc3RlcjogcGF5bG9hZCxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBjb21tYW5kIGhhbmRsZXIuXG4gICAgICpcbiAgICAgKiBIYW5kbGVyIGlzIGNhbGxlZCBpZiB0aGUgbWVzc2FnZSBiZWdpbnMgd2l0aCBgY21kX3ByZWZpeGBcbiAgICAgKiAoZGVmaW5lZCBpbiB0aGUgcGFyYW1ldGVycykgKiorKiogYGNvbW1hbmRgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29tbWFuZCAtIGNvbW1hbmRcbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIGZ1bmN0aW9uIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBtZXNzYWdlXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gdGhlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBjb21tYW5kIGRvZXMsXG4gICAgICogdG8gYmUgdXNlZCBpbiBoZWxwIG1lc3NhZ2VzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb3JlLmNtZCgnaGVscCcsICQgPT4ge1xuICAgICAqICAgLy8gY29yZS5oZWxwKCkgcmV0dXJucyB0aGUgaGVscCBtZXNzYWdlXG4gICAgICogICAkLnRleHQoJ1Rlc3QgQm90JyArIGNvcmUuaGVscCgpKTtcbiAgICAgKiB9LCAnc2hvd3MgdGhlIGhlbHAgbWVzc2FnZScpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbWQoXG4gICAgICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICAgICAgaGFuZGxlcjogSGFuZGxlcixcbiAgICAgICAgZGVzY3JpcHRpb24gPSAnJyxcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kSGFuZGxlcnMucHVzaCh7XG4gICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSByZWdleCBoYW5kbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBmdW5jdGlvbiB3aGljaCB3aWxsIGhhbmRsZSB0aGUgbWVzc2FnZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb3JlLnJlZ2V4KC9oKGl8ZWxsb3xleSkvaSwgJCA9PiB7XG4gICAgICogICAgJC50ZXh0KCdIZWxsbywgSSBhbSBhIHRlc3QgYm90LiBZb3Ugc2FpZDogJyArICQubXNnKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnZXgocmVnZXg6IFJlZ0V4cCwgaGFuZGxlcjogSGFuZGxlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZ2V4SGFuZGxlcnMucHVzaCh7XG4gICAgICAgICAgICByZWdleCxcbiAgICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyB0aGUgcmVxdWVzdCwgY3JlYXRlcyBhIFtbQ29udGV4dF1dLCBhbmQgcHJvY2VlZHNcbiAgICAgKiB0byBjYWxsIFtbQ29yZS5ldmVudF1dIHRvIGhhbmRsZSB0aGUgZXZlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gYm9keSBvZiB0aGUgcmVxdWVzdCwgaW4gcGFyc2VkIEpTT05cbiAgICAgKlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwYXJzZVJlcXVlc3QoYm9keTogYW55IC8qIFRPRE86IGJvZHkgdHlwZT8gKi8pOiBQcm9taXNlPHZvaWQ+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IG9iaiA9IGJvZHkub2JqZWN0O1xuICAgICAgICBjb25zdCBldmVudCA9IGJvZHkudHlwZTtcblxuICAgICAgICBjb25zdCAkID0gbmV3IENvbnRleHQodGhpcy5hcGksIGV2ZW50LCBvYmosIG9iai50ZXh0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmVudChldmVudCwgJCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGVscCBtZXNzYWdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBoZWxwKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBNZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgYENvcmVgIGlzIGxvY2tlZCwgYW5kIHByaW50cyBhIG1lc3NhZ2VcbiAgICAgKiB0byBub3RpZnkgdGhlIHVzZXIgaWYgaXQgaXMgbG9ja2VkLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNMb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmxvY2tlZCkge1xuICAgICAgICAgICAgbG9nKClcbiAgICAgICAgICAgICAgICAudygnUmVnaXN0ZXJpbmcgYSBoYW5kbGVyIHdoaWxlIHRoZSBib3QgaXMgcnVubmluZyBpcyBub3QgYWxsb3dlZCcpXG4gICAgICAgICAgICAgICAgLmZyb20oJ2NvcmUnKVxuICAgICAgICAgICAgICAgIC5ub3coKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2tlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGFuIGV2ZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgZXZlbnQobmFtZTogc3RyaW5nLCAkOiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RhdHMuZXZlbnQobmFtZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXZlbnRIYW5kbGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50SGFuZGxlcnNbbmFtZV0oJCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJC5uZWVkc0F1dG9TZW5kKCkgJiYgbmFtZSAhPT0gJ21lc3NhZ2VfbmV3Jykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCAkLnNlbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGxvZygpXG4gICAgICAgICAgICAgICAgICAgIC53KGBFcnJvciBpbiBoYW5kbGVyOiAke2Vycm9yfWApXG4gICAgICAgICAgICAgICAgICAgIC5mcm9tKCdjb3JlJylcbiAgICAgICAgICAgICAgICAgICAgLm5vdygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT09ICdoYW5kbGVyX2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50KCdoYW5kbGVyX2Vycm9yJywgJCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXZlbnRXYXJuaW5ncykge1xuICAgICAgICAgICAgbG9nKClcbiAgICAgICAgICAgICAgICAudyhgTm8gaGFuZGxlciBmb3IgZXZlbnQgJyR7bmFtZX0nYClcbiAgICAgICAgICAgICAgICAuZnJvbSgnY29yZScpXG4gICAgICAgICAgICAgICAgLm5vdygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYG1lc3NhZ2VfbmV3YCBldmVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZ2lzdGVyTWVzc2FnZU5ld0hhbmRsZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub24oJ21lc3NhZ2VfbmV3JywgYXN5bmMgKCQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciAnc2VydmljZV9hY3Rpb24nIGV2ZW50XG4gICAgICAgICAgICBpZiAoJC5vYmouYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmVudCgnc2VydmljZV9hY3Rpb24nLCAkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSByZWd1bGFyIG1lc3NhZ2VcbiAgICAgICAgICAgIGlmICghKGF3YWl0IHRoaXMudHJ5SGFuZGxlUGF5bG9hZCgkKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShhd2FpdCB0aGlzLnRyeUhhbmRsZUNvbW1hbmQoJCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGF3YWl0IHRoaXMudHJ5SGFuZGxlUmVnZXgoJCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRG9uJ3Qga25vdyBob3cgdG8gcmVzcG9uZCB0byAke0pTT04uc3RyaW5naWZ5KCQubXNnKS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1xcbi9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFxuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX0sIGNhbGxpbmcgJ25vX21hdGNoJyBldmVudGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKCdjb3JlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50KCdub19tYXRjaCcsICQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJC5uZWVkc0F1dG9TZW5kKCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCAkLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIGluIHRoZSBnaXZlbiBgQ29udGV4dGBcbiAgICAgKiB3aXRoIGEgcGF5bG9hZCBoYW5kbGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiB3YXMgdGhlIG1lc3NhZ2UgaGFuZGxlZD9cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHRyeUhhbmRsZVBheWxvYWQoJDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCB7IHBheWxvYWQgfSA9ICQub2JqO1xuICAgICAgICBpZiAocGF5bG9hZCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yICdzdGFydCcgZXZlbnRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKEpTT04ucGFyc2UocGF5bG9hZCkuY29tbWFuZCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2ZW50KCdzdGFydCcsICQpO1xuICAgICAgICAgICAgICAgICAgICAkLm5vQXV0b1NlbmQoKTsgLy8gTWVzc2FnZSBzZW5kaW5nIHdhcyBhbHJlYWR5IGhhbmRsZWQgYnkgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8qIEpTT04gUGFyc2UgRXJyb3IgKi9cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4YWN0IHBheWxvYWQgaGFuZGxlclxuICAgICAgICAgICAgaWYgKHRoaXMuZXhhY3RQYXlsb2FkSGFuZGxlcnNbcGF5bG9hZF0pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4YWN0UGF5bG9hZEhhbmRsZXJzW3BheWxvYWRdKCQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgZHluYW1pYyBwYXlsb2FkIGhhbmRsZXJcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5keW5QYXlsb2FkSGFuZGxlcnNcbiAgICAgICAgICAgICAgICAubWFwKChwb3RlbnRpYWxIYW5kbGVyKTogRHluUGF5bG9hZEhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEpTT04gUGFyc2UgRXJyb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3RlbnRpYWxIYW5kbGVyLnRlc3RlcihwYXlsb2FkLCBwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG90ZW50aWFsSGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihlID0+IGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZVxuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyc1swXS5oYW5kbGVyKCQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGhhbmRsZSB0aGUgbWVzc2FnZSBpbiB0aGUgZ2l2ZW4gYENvbnRleHRgXG4gICAgICogd2l0aCBhIGNvbW1hbmQgaGFuZGxlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gd2FzIHRoZSBtZXNzYWdlIGhhbmRsZWQ/XG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyB0cnlIYW5kbGVDb21tYW5kKCQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlck9ianMgPSB0aGlzLmNvbW1hbmRIYW5kbGVyc1xuICAgICAgICAgICAgLm1hcCgocG90ZW50aWFsSGFuZGxlcik6IHsgaGFuZGxlcjogQ29tbWFuZEhhbmRsZXI7IG1zZzogc3RyaW5nIH0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNtZCA9IGVzY2FwZVJlZ2V4KHBvdGVudGlhbEhhbmRsZXIuY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY21kUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICBgXiggKlxcXFxbY2x1YiR7dGhpcy5ncm91cElkfVxcXFx8LipcXFxcXSk/KCAqJHt0aGlzLmVzY2FwZWRDbWRQcmVmaXh9JHtjbWR9KStgLCAnaScsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChjbWRSZWdleC50ZXN0KCQubXNnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogcG90ZW50aWFsSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZzogJC5tc2cucmVwbGFjZShjbWRSZWdleCwgJycpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoZSA9PiBlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtZnVuY3Rpb24tcmV0dXJuLXR5cGVcblxuICAgICAgICBpZiAoaGFuZGxlck9ianMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgeyBoYW5kbGVyLCBtc2cgfSA9IGhhbmRsZXJPYmpzWzBdO1xuXG4gICAgICAgICAgICAkLm1zZyA9IG1zZzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGVyKCQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIGluIHRoZSBnaXZlbiBgQ29udGV4dGBcbiAgICAgKiB3aXRoIGEgcmVnZXggaGFuZGxlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gd2FzIHRoZSBtZXNzYWdlIGhhbmRsZWQ/XG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyB0cnlIYW5kbGVSZWdleCgkOiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5yZWdleEhhbmRsZXJzLmZpbHRlcigocG90ZW50aWFsSGFuZGxlcik6IGJvb2xlYW4gPT5cbiAgICAgICAgICAgIHBvdGVudGlhbEhhbmRsZXIucmVnZXgudGVzdCgkLm1zZyksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZXJzWzBdLmhhbmRsZXIoJCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIGhlbHAgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdlbmVyYXRlSGVscE1lc3NhZ2UoKTogdm9pZCB7XG4gICAgICAgIGxldCBoZWxwTWVzc2FnZSA9ICdcXG4nO1xuXG4gICAgICAgIHRoaXMuY29tbWFuZEhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGxldCBoZWxwRW50cnkgPSAnJztcblxuICAgICAgICAgICAgaGVscEVudHJ5ICs9IHRoaXMuY21kUHJlZml4O1xuICAgICAgICAgICAgaGVscEVudHJ5ICs9IGhhbmRsZXIuY29tbWFuZDtcblxuICAgICAgICAgICAgaWYgKGhhbmRsZXIuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBoZWxwRW50cnkgKz0gJyAtICc7XG4gICAgICAgICAgICAgICAgaGVscEVudHJ5ICs9IGhhbmRsZXIuZGVzY3JpcHRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhlbHBNZXNzYWdlICs9IGAke2hlbHBFbnRyeX1cXG5gO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmhlbHBNZXNzYWdlID0gaGVscE1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBoYW5kbGVyIGNvdW50cywgZXhjZXB0IGBtZXNzYWdlX25ld2AgZXZlbnQgc2luY2UgaXQgaXMgYnVpbHQtaW4uXG4gICAgICovXG4gICAgcHVibGljIGdldEhhbmRsZXJDb3VudHMoKToge1xuICAgICAgICBldnQ6IG51bWJlcjtcbiAgICAgICAgY21kOiBudW1iZXI7XG4gICAgICAgIHJlZzogbnVtYmVyO1xuICAgICAgICBwbGQ6IG51bWJlcjtcbiAgICB9IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIERvZXMgbm90IGNvdW50IGBtZXNzYWdlX25ld2AgZXZlbnRcbiAgICAgICAgICAgIGV2dDogT2JqZWN0LnZhbHVlcyh0aGlzLmV2ZW50SGFuZGxlcnMpLmZpbHRlcihlID0+IGUpLmxlbmd0aCAtIDEsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LWZ1bmN0aW9uLXJldHVybi10eXBlXG4gICAgICAgICAgICBjbWQ6IHRoaXMuY29tbWFuZEhhbmRsZXJzLmxlbmd0aCxcbiAgICAgICAgICAgIHJlZzogdGhpcy5yZWdleEhhbmRsZXJzLmxlbmd0aCxcbiAgICAgICAgICAgIHBsZDogT2JqZWN0LmtleXModGhpcy5leGFjdFBheWxvYWRIYW5kbGVycykubGVuZ3RoICsgdGhpcy5keW5QYXlsb2FkSGFuZGxlcnMubGVuZ3RoLFxuICAgICAgICB9XG4gICAgfVxufVxuIl19