From d3f718450746b1aff1e89770c2eede71dfe920b6 Mon Sep 17 00:00:00 2001 From: Jonathan Putney Date: Tue, 19 Nov 2019 15:31:18 -0500 Subject: [PATCH] Fixing 'this' for scheduled timeout --- dist/scorm-again.js | 4 ++-- dist/scorm-again.js.map | 2 +- dist/scorm-again.min.js | 2 +- src/BaseAPI.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dist/scorm-again.js b/dist/scorm-again.js index 2a83f14..aa1b93b 100644 --- a/dist/scorm-again.js +++ b/dist/scorm-again.js @@ -1058,7 +1058,7 @@ function () { value: function scheduleCommit(when) { this.clearScheduledCommit(); - _classPrivateFieldSet(this, _timeout, setTimeout(this.scheduledCallback, when)); + _classPrivateFieldSet(this, _timeout, setTimeout(this.scheduledCallback.bind(this), when)); this.apiLog('scheduleCommit', '', 'scheduled', _api_constants.global_constants.LOG_LEVEL_DEBUG); } @@ -8655,4 +8655,4 @@ function unflatten(data) { } },{}]},{},[1,2,5,6,7,8,9,10,11,12,13,14,15,16,3,4,17]) -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvQUlDQy5qcyIsInNyYy9CYXNlQVBJLmpzIiwic3JjL1Njb3JtMTJBUEkuanMiLCJzcmMvU2Nvcm0yMDA0QVBJLmpzIiwic3JjL2NtaS9haWNjX2NtaS5qcyIsInNyYy9jbWkvY29tbW9uLmpzIiwic3JjL2NtaS9zY29ybTEyX2NtaS5qcyIsInNyYy9jbWkvc2Nvcm0yMDA0X2NtaS5qcyIsInNyYy9jb25zdGFudHMvYXBpX2NvbnN0YW50cy5qcyIsInNyYy9jb25zdGFudHMvZXJyb3JfY29kZXMuanMiLCJzcmMvY29uc3RhbnRzL2ZpZWxkX3ZhbHVlcy5qcyIsInNyYy9jb25zdGFudHMvbGFuZ3VhZ2VfY29uc3RhbnRzLmpzIiwic3JjL2NvbnN0YW50cy9yZWdleC5qcyIsInNyYy9jb25zdGFudHMvcmVzcG9uc2VfY29uc3RhbnRzLmpzIiwic3JjL2V4Y2VwdGlvbnMuanMiLCJzcmMvZXhwb3J0cy5qcyIsInNyYy91dGlsaXRpZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0FDQ0E7O0FBQ0E7O0FBS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7OztJQUdxQixJOzs7OztBQUNuQjs7OztBQUlBLGdCQUFZLFFBQVosRUFBMEI7QUFBQTs7QUFBQTs7QUFDeEIsUUFBTSxhQUFhLHFCQUNkO0FBQ0QsTUFBQSxnQkFBZ0IsRUFBRTtBQURqQixLQURjLE1BR1gsUUFIVyxDQUFuQjs7QUFNQSw4RUFBTSxhQUFOO0FBRUEsVUFBSyxHQUFMLEdBQVcsSUFBSSxhQUFKLEVBQVg7QUFDQSxVQUFLLEdBQUwsR0FBVyxJQUFJLGdCQUFKLEVBQVg7QUFWd0I7QUFXekI7QUFFRDs7Ozs7Ozs7Ozs7O29DQVFnQixVLEVBQVksSyxFQUFPLGUsRUFBaUI7QUFDbEQsVUFBSSxRQUFRLDZFQUF5QixVQUF6QixFQUFxQyxLQUFyQyxFQUE0QyxlQUE1QyxD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UUFBQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUQsQ0FBRCxJQUFRLENBQUMsQ0FBQyxDQUFELENBQWhCO0FBQ0EsUUFBQSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxDQUFYLENBQUo7QUFDRDs7QUFDRCxNQUFBLEdBQUcsQ0FBQyxJQUFELENBQUgsR0FBWSxJQUFJLENBQUMsQ0FBRCxDQUFoQjtBQUNEO0FBQ0Y7O0FBQ0QsU0FBTyxNQUFNLENBQUMsRUFBRCxDQUFOLElBQWMsTUFBckI7QUFDRCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8vIEBmbG93XG5pbXBvcnQgU2Nvcm0xMkFQSSBmcm9tICcuL1Njb3JtMTJBUEknO1xuaW1wb3J0IHtcbiAgQ01JLFxuICBDTUlFdmFsdWF0aW9uQ29tbWVudHNPYmplY3QsXG4gIENNSVRyaWVzT2JqZWN0LFxufSBmcm9tICcuL2NtaS9haWNjX2NtaSc7XG5pbXBvcnQge05BVn0gZnJvbSAnLi9jbWkvc2Nvcm0xMl9jbWknO1xuXG4vKipcbiAqIFRoZSBBSUNDIEFQSSBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBSUNDIGV4dGVuZHMgU2Nvcm0xMkFQSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgQUlDQyBBUEkgb2JqZWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IHt9KSB7XG4gICAgY29uc3QgZmluYWxTZXR0aW5ncyA9IHtcbiAgICAgIC4uLntcbiAgICAgICAgbWFzdGVyeV9vdmVycmlkZTogZmFsc2UsXG4gICAgICB9LCAuLi5zZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgc3VwZXIoZmluYWxTZXR0aW5ncyk7XG5cbiAgICB0aGlzLmNtaSA9IG5ldyBDTUkoKTtcbiAgICB0aGlzLm5hdiA9IG5ldyBOQVYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIGJ1aWxkcyBhIG5ldyBjaGlsZCBlbGVtZW50IHRvIGFkZCB0byB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvdW5kRmlyc3RJbmRleFxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsIGZvdW5kRmlyc3RJbmRleCkge1xuICAgIGxldCBuZXdDaGlsZCA9IHN1cGVyLmdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSwgZm91bmRGaXJzdEluZGV4KTtcblxuICAgIGlmICghbmV3Q2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwuZXZhbHVhdGlvblxcXFwuY29tbWVudHNcXFxcLlxcXFxkJykpIHtcbiAgICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JRXZhbHVhdGlvbkNvbW1lbnRzT2JqZWN0KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnY21pXFxcXC5zdHVkZW50X2RhdGFcXFxcLnRyaWVzXFxcXC5cXFxcZCcpKSB7XG4gICAgICAgIG5ld0NoaWxkID0gbmV3IENNSVRyaWVzT2JqZWN0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0NoaWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHdob2xlIEFQSSB3aXRoIGFub3RoZXJcbiAgICpcbiAgICogQHBhcmFtIHtBSUNDfSBuZXdBUElcbiAgICovXG4gIHJlcGxhY2VXaXRoQW5vdGhlclNjb3JtQVBJKG5ld0FQSSkge1xuICAgIC8vIERhdGEgTW9kZWxcbiAgICB0aGlzLmNtaSA9IG5ld0FQSS5jbWk7XG4gICAgdGhpcy5uYXYgPSBuZXdBUEkubmF2O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtDTUlBcnJheX0gZnJvbSAnLi9jbWkvY29tbW9uJztcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yfSBmcm9tICcuL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtzY29ybTEyX2Vycm9yX2NvZGVzfSBmcm9tICcuL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQge2dsb2JhbF9jb25zdGFudHN9IGZyb20gJy4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IHt1bmZsYXR0ZW59IGZyb20gJy4vdXRpbGl0aWVzJztcblxuLyoqXG4gKiBCYXNlIEFQSSBjbGFzcyBmb3IgQUlDQywgU0NPUk0gMS4yLCBhbmQgU0NPUk0gMjAwNC4gU2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAqIGFic3RyYWN0LCBhbmQgbmV2ZXIgaW5pdGlhbGl6ZWQgb24gaXQncyBvd24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VBUEkge1xuICAjdGltZW91dDtcbiAgI3NjaGVkdWxlQ2FuY2VsbGVkID0gZmFsc2U7XG4gICNlcnJvcl9jb2RlcztcbiAgI3NldHRpbmdzID0ge1xuICAgIGF1dG9jb21taXQ6IGZhbHNlLFxuICAgIGF1dG9jb21taXRTZWNvbmRzOiA2MCxcbiAgICBsbXNDb21taXRVcmw6IGZhbHNlLFxuICAgIGRhdGFDb21taXRGb3JtYXQ6ICdqc29uJywgLy8gdmFsaWQgZm9ybWF0cyBhcmUgJ2pzb24nIG9yICdmbGF0dGVuZWQnLCAncGFyYW1zJ1xuICAgIGNvbW1pdFJlcXVlc3REYXRhVHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsXG4gICAgYXV0b1Byb2dyZXNzOiBmYWxzZSxcbiAgICBsb2dMZXZlbDogZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfRVJST1IsXG4gIH07XG4gIGNtaTtcbiAgc3RhcnRpbmdEYXRhOiB7fTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEJhc2UgQVBJIGNsYXNzLiBTZXRzIHNvbWUgc2hhcmVkIEFQSSBmaWVsZHMsIGFzIHdlbGwgYXNcbiAgICogc2V0cyB1cCBvcHRpb25zIGZvciB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXJyb3JfY29kZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvcl9jb2Rlcywgc2V0dGluZ3MpIHtcbiAgICBpZiAobmV3LnRhcmdldCA9PT0gQmFzZUFQSSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBCYXNlQVBJIGluc3RhbmNlcyBkaXJlY3RseScpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfTk9UX0lOSVRJQUxJWkVEO1xuICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgdGhpcy5saXN0ZW5lckFycmF5ID0gW107XG5cbiAgICB0aGlzLiN0aW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLiNlcnJvcl9jb2RlcyA9IGVycm9yX2NvZGVzO1xuXG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMuYXBpTG9nTGV2ZWwgPSB0aGlzLnNldHRpbmdzLmxvZ0xldmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIEFQSVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbml0aWFsaXplTWVzc2FnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVybWluYXRpb25NZXNzYWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGluaXRpYWxpemUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGluaXRpYWxpemVNZXNzYWdlPzogU3RyaW5nLFxuICAgICAgdGVybWluYXRpb25NZXNzYWdlPzogU3RyaW5nKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuSU5JVElBTElaRUQsIGluaXRpYWxpemVNZXNzYWdlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNUZXJtaW5hdGVkKCkpIHtcbiAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLlRFUk1JTkFURUQsIHRlcm1pbmF0aW9uTWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9JTklUSUFMSVpFRDtcbiAgICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzZXR0aW5nc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXQgc2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3NldHRpbmdzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgc2V0IHNldHRpbmdzKHNldHRpbmdzOiBPYmplY3QpIHtcbiAgICB0aGlzLiNzZXR0aW5ncyA9IHsuLi50aGlzLiNzZXR0aW5ncywgLi4uc2V0dGluZ3N9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZXMgdGhlIGN1cnJlbnQgcnVuIG9mIHRoZSBBUElcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0ZXJtaW5hdGUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbikge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5jaGVja1N0YXRlKGNoZWNrVGVybWluYXRlZCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuVEVSTUlOQVRJT05fQkVGT1JFX0lOSVQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLk1VTFRJUExFX1RFUk1JTkFUSU9OKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZURhdGEodHJ1ZSk7XG4gICAgICBpZiAocmVzdWx0LmVycm9yQ29kZSAmJiByZXN1bHQuZXJyb3JDb2RlID4gMCkge1xuICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihyZXN1bHQuZXJyb3JDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlID0gcmVzdWx0LnJlc3VsdCA/XG4gICAgICAgICAgcmVzdWx0LnJlc3VsdCA6IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICAgIGlmIChjaGVja1Rlcm1pbmF0ZWQpIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfVEVSTUlOQVRFRDtcbiAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIENNSUVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBjaGVja1Rlcm1pbmF0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VmFsdWUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbixcbiAgICAgIENNSUVsZW1lbnQ6IFN0cmluZykge1xuICAgIGxldCByZXR1cm5WYWx1ZTtcblxuICAgIGlmICh0aGlzLmNoZWNrU3RhdGUoY2hlY2tUZXJtaW5hdGVkLFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5SRVRSSUVWRV9CRUZPUkVfSU5JVCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuUkVUUklFVkVfQUZURVJfVEVSTSkpIHtcbiAgICAgIGlmIChjaGVja1Rlcm1pbmF0ZWQpIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZ2V0Q01JVmFsdWUoQ01JRWxlbWVudCk7XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lLCBDTUlFbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIENNSUVsZW1lbnQsICc6IHJldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQ01JRWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHNldFZhbHVlKFxuICAgICAgY2FsbGJhY2tOYW1lOiBTdHJpbmcsXG4gICAgICBjaGVja1Rlcm1pbmF0ZWQ6IGJvb2xlYW4sXG4gICAgICBDTUlFbGVtZW50LFxuICAgICAgdmFsdWUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tTdGF0ZShjaGVja1Rlcm1pbmF0ZWQsIHRoaXMuI2Vycm9yX2NvZGVzLlNUT1JFX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5TVE9SRV9BRlRFUl9URVJNKSkge1xuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gdGhpcy5zZXRDTUlWYWx1ZShDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gZS5lcnJvckNvZGU7XG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLkdFTkVSQUwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbnkgZXJyb3JzIHdoaWxlIHNldHRpbmcgdGhlIGRhdGEsIGdvIGFoZWFkIGFuZFxuICAgIC8vIHNjaGVkdWxlIGEgY29tbWl0LCBpZiBhdXRvY29tbWl0IGlzIHR1cm5lZCBvblxuICAgIGlmIChTdHJpbmcodGhpcy5sYXN0RXJyb3JDb2RlKSA9PT0gJzAnKSB7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5hdXRvY29tbWl0KSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVDb21taXQodGhpcy5zZXR0aW5ncy5hdXRvY29tbWl0U2Vjb25kcyAqIDEwMDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgQ01JRWxlbWVudCxcbiAgICAgICAgJzogJyArIHZhbHVlICsgJzogcmVzdWx0OiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmRlcnMgTE1TIHRvIHN0b3JlIGFsbCBjb250ZW50IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBjb21taXQoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuY2xlYXJTY2hlZHVsZWRDb21taXQoKTtcblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5jaGVja1N0YXRlKGNoZWNrVGVybWluYXRlZCwgdGhpcy4jZXJyb3JfY29kZXMuQ09NTUlUX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5DT01NSVRfQUZURVJfVEVSTSkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc3RvcmVEYXRhKGZhbHNlKTtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3JDb2RlICYmIHJlc3VsdC5lcnJvckNvZGUgPiAwKSB7XG4gICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHJlc3VsdC5lcnJvckNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWUgPSByZXN1bHQucmVzdWx0ID9cbiAgICAgICAgICByZXN1bHQucmVzdWx0IDogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCAnSHR0cFJlcXVlc3QnLCAnIFJlc3VsdDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKTtcblxuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcblxuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbGFzdCBlcnJvciBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TGFzdEVycm9yKGNhbGxiYWNrTmFtZTogU3RyaW5nKSB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBTdHJpbmcodGhpcy5sYXN0RXJyb3JDb2RlKTtcblxuICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXJyb3JOdW1iZXIgZXJyb3IgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldEVycm9yU3RyaW5nKGNhbGxiYWNrTmFtZTogU3RyaW5nLCBDTUlFcnJvckNvZGUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSAnJztcblxuICAgIGlmIChDTUlFcnJvckNvZGUgIT09IG51bGwgJiYgQ01JRXJyb3JDb2RlICE9PSAnJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLmdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoQ01JRXJyb3JDb2RlKTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wcmVoZW5zaXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvck51bWJlciBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldERpYWdub3N0aWMoY2FsbGJhY2tOYW1lOiBTdHJpbmcsIENNSUVycm9yQ29kZSkge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXG4gICAgaWYgKENNSUVycm9yQ29kZSAhPT0gbnVsbCAmJiBDTUlFcnJvckNvZGUgIT09ICcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhDTUlFcnJvckNvZGUsIHRydWUpO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBMTVMgc3RhdGUgYW5kIGVuc3VyZXMgaXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiZWZvcmVJbml0RXJyb3JcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFmdGVyVGVybUVycm9yXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBjaGVja1N0YXRlKFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuLFxuICAgICAgYmVmb3JlSW5pdEVycm9yOiBudW1iZXIsXG4gICAgICBhZnRlclRlcm1FcnJvcj86IG51bWJlcikge1xuICAgIGlmICh0aGlzLmlzTm90SW5pdGlhbGl6ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoYmVmb3JlSW5pdEVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNoZWNrVGVybWluYXRlZCAmJiB0aGlzLmlzVGVybWluYXRlZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihhZnRlclRlcm1FcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTG9nZ2luZyBmb3IgYWxsIFNDT1JNIGFjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9nTWVzc2FnZVxuICAgKiBAcGFyYW0ge251bWJlcn1tZXNzYWdlTGV2ZWxcbiAgICovXG4gIGFwaUxvZyhcbiAgICAgIGZ1bmN0aW9uTmFtZTogU3RyaW5nLFxuICAgICAgQ01JRWxlbWVudDogU3RyaW5nLFxuICAgICAgbG9nTWVzc2FnZTogU3RyaW5nLFxuICAgICAgbWVzc2FnZUxldmVsOiBudW1iZXIpIHtcbiAgICBsb2dNZXNzYWdlID0gdGhpcy5mb3JtYXRNZXNzYWdlKGZ1bmN0aW9uTmFtZSwgQ01JRWxlbWVudCwgbG9nTWVzc2FnZSk7XG5cbiAgICBpZiAobWVzc2FnZUxldmVsID49IHRoaXMuYXBpTG9nTGV2ZWwpIHtcbiAgICAgIHN3aXRjaCAobWVzc2FnZUxldmVsKSB7XG4gICAgICAgIGNhc2UgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfRVJST1I6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihsb2dNZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9XQVJOSU5HOlxuICAgICAgICAgIGNvbnNvbGUud2Fybihsb2dNZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPOlxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhsb2dNZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRzpcbiAgICAgICAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyhsb2dNZXNzYWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobG9nTWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIHRoZSBTQ09STSBtZXNzYWdlcyBmb3IgZWFzeSByZWFkaW5nXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbk5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZm9ybWF0TWVzc2FnZShmdW5jdGlvbk5hbWU6IFN0cmluZywgQ01JRWxlbWVudDogU3RyaW5nLCBtZXNzYWdlOiBTdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlTGVuZ3RoID0gMjA7XG4gICAgbGV0IG1lc3NhZ2VTdHJpbmcgPSAnJztcblxuICAgIG1lc3NhZ2VTdHJpbmcgKz0gZnVuY3Rpb25OYW1lO1xuXG4gICAgbGV0IGZpbGxDaGFycyA9IGJhc2VMZW5ndGggLSBtZXNzYWdlU3RyaW5nLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsbENoYXJzOyBpKyspIHtcbiAgICAgIG1lc3NhZ2VTdHJpbmcgKz0gJyAnO1xuICAgIH1cblxuICAgIG1lc3NhZ2VTdHJpbmcgKz0gJzogJztcblxuICAgIGlmIChDTUlFbGVtZW50KSB7XG4gICAgICBjb25zdCBDTUlFbGVtZW50QmFzZUxlbmd0aCA9IDcwO1xuXG4gICAgICBtZXNzYWdlU3RyaW5nICs9IENNSUVsZW1lbnQ7XG5cbiAgICAgIGZpbGxDaGFycyA9IENNSUVsZW1lbnRCYXNlTGVuZ3RoIC0gbWVzc2FnZVN0cmluZy5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmlsbENoYXJzOyBqKyspIHtcbiAgICAgICAgbWVzc2FnZVN0cmluZyArPSAnICc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2VTdHJpbmcgKz0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVzc2FnZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHtzdHJ9IGNvbnRhaW5zIHt0ZXN0ZXJ9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNoZWNrIGFnYWluc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RlciBTdHJpbmcgdG8gY2hlY2sgZm9yXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdHJpbmdNYXRjaGVzKHN0cjogU3RyaW5nLCB0ZXN0ZXI6IFN0cmluZykge1xuICAgIHJldHVybiBzdHIgJiYgdGVzdGVyICYmIHN0ci5tYXRjaCh0ZXN0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWMgb2JqZWN0IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHlcbiAgICogQHBhcmFtIHsqfSByZWZPYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGU6IFN0cmluZykge1xuICAgIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyZWZPYmplY3QsIGF0dHJpYnV0ZSkgfHxcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihyZWZPYmplY3QpLCBhdHRyaWJ1dGUpIHx8XG4gICAgICAgIChhdHRyaWJ1dGUgaW4gcmVmT2JqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRoYXQgY29ycmVzcG9uZHMgdG8gZXJyb3JOdW1iZXJcbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gX2Vycm9yTnVtYmVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gX2RldGFpbFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhfZXJyb3JOdW1iZXIsIF9kZXRhaWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpYyBlbGVtZW50LlxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZ2V0Q01JVmFsdWUoX0NNSUVsZW1lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBnZXRDTUlWYWx1ZSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpYyBlbGVtZW50LlxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge2FueX0gX3ZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBzZXRDTUlWYWx1ZShfQ01JRWxlbWVudCwgX3ZhbHVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2V0Q01JVmFsdWUgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBBUEkgbWV0aG9kIHRvIHNldCBhIHZhbGlkIGZvciBhIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2Nvcm0yMDA0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgX2NvbW1vblNldENNSVZhbHVlKFxuICAgICAgbWV0aG9kTmFtZTogU3RyaW5nLCBzY29ybTIwMDQ6IGJvb2xlYW4sIENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgaWYgKCFDTUlFbGVtZW50IHx8IENNSUVsZW1lbnQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJ1Y3R1cmUgPSBDTUlFbGVtZW50LnNwbGl0KCcuJyk7XG4gICAgbGV0IHJlZk9iamVjdCA9IHRoaXM7XG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICBsZXQgZm91bmRGaXJzdEluZGV4ID0gZmFsc2U7XG5cbiAgICBjb25zdCBpbnZhbGlkRXJyb3JNZXNzYWdlID0gYFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgcGFzc2VkIHRvICR7bWV0aG9kTmFtZX0gKCR7Q01JRWxlbWVudH0pIGlzIG5vdCBhIHZhbGlkIFNDT1JNIGRhdGEgbW9kZWwgZWxlbWVudC5gO1xuICAgIGNvbnN0IGludmFsaWRFcnJvckNvZGUgPSBzY29ybTIwMDQgP1xuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5VTkRFRklORURfREFUQV9NT0RFTCA6XG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLkdFTkVSQUw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cnVjdHVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc3RydWN0dXJlW2ldO1xuXG4gICAgICBpZiAoaSA9PT0gc3RydWN0dXJlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKHNjb3JtMjAwNCAmJiAoYXR0cmlidXRlLnN1YnN0cigwLCA4KSA9PT0gJ3t0YXJnZXQ9JykgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcmVmT2JqZWN0Ll9pc1RhcmdldFZhbGlkID09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGVja09iamVjdEhhc1Byb3BlcnR5KHJlZk9iamVjdCwgYXR0cmlidXRlKSkge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ1xcXFwuY29ycmVjdF9yZXNwb25zZXNcXFxcLlxcXFxkJykpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoQ01JRWxlbWVudCwgdmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2Nvcm0yMDA0IHx8IHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCkge1xuICAgICAgICAgICAgcmVmT2JqZWN0W2F0dHJpYnV0ZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVmT2JqZWN0ID0gcmVmT2JqZWN0W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmICghcmVmT2JqZWN0KSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmT2JqZWN0IGluc3RhbmNlb2YgQ01JQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHN0cnVjdHVyZVtpICsgMV0sIDEwKTtcblxuICAgICAgICAgIC8vIFNDTyBpcyB0cnlpbmcgdG8gc2V0IGFuIGl0ZW0gb24gYW4gYXJyYXlcbiAgICAgICAgICBpZiAoIWlzTmFOKGluZGV4KSkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHJlZk9iamVjdC5jaGlsZEFycmF5W2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgcmVmT2JqZWN0ID0gaXRlbTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0NoaWxkID0gdGhpcy5nZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsXG4gICAgICAgICAgICAgICAgICBmb3VuZEZpcnN0SW5kZXgpO1xuICAgICAgICAgICAgICBmb3VuZEZpcnN0SW5kZXggPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGlmICghbmV3Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVmT2JqZWN0LmluaXRpYWxpemVkKSBuZXdDaGlsZC5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgICAgICAgICByZWZPYmplY3QuY2hpbGRBcnJheS5wdXNoKG5ld0NoaWxkKTtcbiAgICAgICAgICAgICAgICByZWZPYmplY3QgPSBuZXdDaGlsZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYXZlIHRvIHVwZGF0ZSBpIHZhbHVlIHRvIHNraXAgdGhlIGFycmF5IHBvc2l0aW9uXG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlID09PSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFKSB7XG4gICAgICB0aGlzLmFwaUxvZyhtZXRob2ROYW1lLCBudWxsLFxuICAgICAgICAgIGBUaGVyZSB3YXMgYW4gZXJyb3Igc2V0dGluZyB0aGUgdmFsdWUgZm9yOiAke0NNSUVsZW1lbnR9LCB2YWx1ZSBvZjogJHt2YWx1ZX1gLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX1dBUk5JTkcpO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYnN0cmFjdCBtZXRob2QgZm9yIHZhbGlkYXRpbmcgdGhhdCBhIHJlc3BvbnNlIGlzIGNvcnJlY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IF92YWx1ZVxuICAgKi9cbiAgdmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoX0NNSUVsZW1lbnQsIF92YWx1ZSkge1xuICAgIC8vIGp1c3QgYSBzdHViIG1ldGhvZFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgYnVpbGRzIGEgbmV3IGNoaWxkIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBhcnJheS5cbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudCAtIHVudXNlZFxuICAgKiBAcGFyYW0geyp9IF92YWx1ZSAtIHVudXNlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF9mb3VuZEZpcnN0SW5kZXggLSB1bnVzZWRcbiAgICogQHJldHVybiB7Kn1cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRDaGlsZEVsZW1lbnQoX0NNSUVsZW1lbnQsIF92YWx1ZSwgX2ZvdW5kRmlyc3RJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdldENoaWxkRWxlbWVudCBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBzY29ybTIwMDRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIF9jb21tb25HZXRDTUlWYWx1ZShtZXRob2ROYW1lOiBTdHJpbmcsIHNjb3JtMjAwNDogYm9vbGVhbiwgQ01JRWxlbWVudCkge1xuICAgIGlmICghQ01JRWxlbWVudCB8fCBDTUlFbGVtZW50ID09PSAnJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cnVjdHVyZSA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBsZXQgcmVmT2JqZWN0ID0gdGhpcztcbiAgICBsZXQgYXR0cmlidXRlID0gbnVsbDtcblxuICAgIGNvbnN0IHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UgPSBgVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBwYXNzZWQgdG8gJHttZXRob2ROYW1lfSAoJHtDTUlFbGVtZW50fSkgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLmA7XG4gICAgY29uc3QgaW52YWxpZEVycm9yTWVzc2FnZSA9IGBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHBhc3NlZCB0byAke21ldGhvZE5hbWV9ICgke0NNSUVsZW1lbnR9KSBpcyBub3QgYSB2YWxpZCBTQ09STSBkYXRhIG1vZGVsIGVsZW1lbnQuYDtcbiAgICBjb25zdCBpbnZhbGlkRXJyb3JDb2RlID0gc2Nvcm0yMDA0ID9cbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuVU5ERUZJTkVEX0RBVEFfTU9ERUwgOlxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5HRU5FUkFMO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJ1Y3R1cmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGF0dHJpYnV0ZSA9IHN0cnVjdHVyZVtpXTtcblxuICAgICAgaWYgKCFzY29ybTIwMDQpIHtcbiAgICAgICAgaWYgKGkgPT09IHN0cnVjdHVyZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9jaGVja09iamVjdEhhc1Byb3BlcnR5KHJlZk9iamVjdCwgYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKFN0cmluZyhhdHRyaWJ1dGUpLnN1YnN0cigwLCA4KSA9PT0gJ3t0YXJnZXQ9JykgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcmVmT2JqZWN0Ll9pc1RhcmdldFZhbGlkID09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gU3RyaW5nKGF0dHJpYnV0ZSkuXG4gICAgICAgICAgICAgIHN1YnN0cig4LCBTdHJpbmcoYXR0cmlidXRlKS5sZW5ndGggLSA5KTtcbiAgICAgICAgICByZXR1cm4gcmVmT2JqZWN0Ll9pc1RhcmdldFZhbGlkKHRhcmdldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZk9iamVjdCA9IHJlZk9iamVjdFthdHRyaWJ1dGVdO1xuICAgICAgaWYgKHJlZk9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZk9iamVjdCBpbnN0YW5jZW9mIENNSUFycmF5KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoc3RydWN0dXJlW2kgKyAxXSwgMTApO1xuXG4gICAgICAgIC8vIFNDTyBpcyB0cnlpbmcgdG8gc2V0IGFuIGl0ZW0gb24gYW4gYXJyYXlcbiAgICAgICAgaWYgKCFpc05hTihpbmRleCkpIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gcmVmT2JqZWN0LmNoaWxkQXJyYXlbaW5kZXhdO1xuXG4gICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJlZk9iamVjdCA9IGl0ZW07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLlZBTFVFX05PVF9JTklUSUFMSVpFRCxcbiAgICAgICAgICAgICAgICB1bmluaXRpYWxpemVkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhdmUgdG8gdXBkYXRlIGkgdmFsdWUgdG8gc2tpcCB0aGUgYXJyYXkgcG9zaXRpb25cbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVmT2JqZWN0ID09PSBudWxsIHx8IHJlZk9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXNjb3JtMjAwNCkge1xuICAgICAgICBpZiAoYXR0cmlidXRlID09PSAnX2NoaWxkcmVuJykge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuQ0hJTERSRU5fRVJST1IpO1xuICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gJ19jb3VudCcpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTEyX2Vycm9yX2NvZGVzLkNPVU5UX0VSUk9SKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVmT2JqZWN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFQSSdzIGN1cnJlbnQgc3RhdGUgaXMgU1RBVEVfSU5JVElBTElaRURcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzSW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlID09PSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX0lOSVRJQUxJWkVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVBJJ3MgY3VycmVudCBzdGF0ZSBpcyBTVEFURV9OT1RfSU5JVElBTElaRURcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzTm90SW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlID09PSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX05PVF9JTklUSUFMSVpFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFQSSdzIGN1cnJlbnQgc3RhdGUgaXMgU1RBVEVfVEVSTUlOQVRFRFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNUZXJtaW5hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9URVJNSU5BVEVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBhdHRhY2hpbmcgdG8gYSBzcGVjaWZpYyBTQ09STSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdGVuZXJOYW1lXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbihsaXN0ZW5lck5hbWU6IFN0cmluZywgY2FsbGJhY2s6IGZ1bmN0aW9uKSB7XG4gICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuO1xuXG4gICAgY29uc3QgbGlzdGVuZXJGdW5jdGlvbnMgPSBsaXN0ZW5lck5hbWUuc3BsaXQoJyAnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVyRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lclNwbGl0ID0gbGlzdGVuZXJGdW5jdGlvbnNbaV0uc3BsaXQoJy4nKTtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsaXN0ZW5lclNwbGl0WzBdO1xuXG4gICAgICBsZXQgQ01JRWxlbWVudCA9IG51bGw7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIENNSUVsZW1lbnQgPSBsaXN0ZW5lck5hbWUucmVwbGFjZShmdW5jdGlvbk5hbWUgKyAnLicsICcnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5saXN0ZW5lckFycmF5LnB1c2goe1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgQ01JRWxlbWVudDogQ01JRWxlbWVudCxcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhbnkgJ29uJyBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25OYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICovXG4gIHByb2Nlc3NMaXN0ZW5lcnMoZnVuY3Rpb25OYW1lOiBTdHJpbmcsIENNSUVsZW1lbnQ6IFN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5saXN0ZW5lckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMubGlzdGVuZXJBcnJheVtpXTtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uc01hdGNoID0gbGlzdGVuZXIuZnVuY3Rpb25OYW1lID09PSBmdW5jdGlvbk5hbWU7XG4gICAgICBjb25zdCBsaXN0ZW5lckhhc0NNSUVsZW1lbnQgPSAhIWxpc3RlbmVyLkNNSUVsZW1lbnQ7XG4gICAgICBjb25zdCBDTUlFbGVtZW50c01hdGNoID0gbGlzdGVuZXIuQ01JRWxlbWVudCA9PT0gQ01JRWxlbWVudDtcblxuICAgICAgaWYgKGZ1bmN0aW9uc01hdGNoICYmICghbGlzdGVuZXJIYXNDTUlFbGVtZW50IHx8IENNSUVsZW1lbnRzTWF0Y2gpKSB7XG4gICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgU0NPUk0gZXJyb3JcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yTnVtYmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqL1xuICB0aHJvd1NDT1JNRXJyb3IoZXJyb3JOdW1iZXI6IG51bWJlciwgbWVzc2FnZTogU3RyaW5nKSB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlID0gdGhpcy5nZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKGVycm9yTnVtYmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZygndGhyb3dTQ09STUVycm9yJywgbnVsbCwgZXJyb3JOdW1iZXIgKyAnOiAnICsgbWVzc2FnZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfRVJST1IpO1xuXG4gICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gU3RyaW5nKGVycm9yTnVtYmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGxhc3QgU0NPUk0gZXJyb3IgY29kZSBvbiBzdWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VjY2Vzc1xuICAgKi9cbiAgY2xlYXJTQ09STUVycm9yKHN1Y2Nlc3M6IFN0cmluZykge1xuICAgIGlmIChzdWNjZXNzICE9PSB1bmRlZmluZWQgJiYgc3VjY2VzcyAhPT0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRSkge1xuICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gc3RvcmUgdGhlIGRhdGEgdG8gdGhlIExNUywgbG9ncyBkYXRhIGlmIG5vIExNUyBjb25maWd1cmVkXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBfY2FsY3VsYXRlVG90YWxUaW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBzdG9yZURhdGEoX2NhbGN1bGF0ZVRvdGFsVGltZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBzdG9yZURhdGEgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIENNSSBmcm9tIGEgZmxhdHRlbmVkIEpTT04gb2JqZWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqL1xuICBsb2FkRnJvbUZsYXR0ZW5lZEpTT04oanNvbiwgQ01JRWxlbWVudCkge1xuICAgIHRoaXMubG9hZEZyb21KU09OKHVuZmxhdHRlbihqc29uKSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgQ01JIGRhdGEgZnJvbSBhIEpTT04gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0ganNvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKi9cbiAgbG9hZEZyb21KU09OKGpzb24sIENNSUVsZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNOb3RJbml0aWFsaXplZCgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICdsb2FkRnJvbUpTT04gY2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbCB0byBsbXNJbml0aWFsaXplLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIENNSUVsZW1lbnQgPSBDTUlFbGVtZW50IHx8ICdjbWknO1xuXG4gICAgdGhpcy5zdGFydGluZ0RhdGEgPSBqc29uO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoanNvbiwga2V5KSAmJiBqc29uW2tleV0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudENNSUVsZW1lbnQgPSBDTUlFbGVtZW50ICsgJy4nICsga2V5O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGpzb25ba2V5XTtcblxuICAgICAgICBpZiAodmFsdWVbJ2NoaWxkQXJyYXknXSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVbJ2NoaWxkQXJyYXknXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5sb2FkRnJvbUpTT04odmFsdWVbJ2NoaWxkQXJyYXknXVtpXSxcbiAgICAgICAgICAgICAgICBjdXJyZW50Q01JRWxlbWVudCArICcuJyArIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICAgICAgdGhpcy5sb2FkRnJvbUpTT04odmFsdWUsIGN1cnJlbnRDTUlFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldENNSVZhbHVlKGN1cnJlbnRDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBDTUkgb2JqZWN0IHRvIEpTT04gZm9yIHNlbmRpbmcgdG8gYW4gTE1TLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICByZW5kZXJDTUlUb0pTT05TdHJpbmcoKSB7XG4gICAgY29uc3QgY21pID0gdGhpcy5jbWk7XG4gICAgLy8gRG8gd2Ugd2FudC9uZWVkIHRvIHJldHVybiBmaWVsZHMgdGhhdCBoYXZlIG5vIHNldCB2YWx1ZT9cbiAgICAvLyByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBjbWkgfSwgKGssIHYpID0+IHYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2LCAyKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe2NtaX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKUyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGNtaVxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICByZW5kZXJDTUlUb0pTT05PYmplY3QoKSB7XG4gICAgLy8gRG8gd2Ugd2FudC9uZWVkIHRvIHJldHVybiBmaWVsZHMgdGhhdCBoYXZlIG5vIHNldCB2YWx1ZT9cbiAgICAvLyByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBjbWkgfSwgKGssIHYpID0+IHYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2LCAyKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLnJlbmRlckNNSVRvSlNPTlN0cmluZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNtaSBvYmplY3QgdG8gdGhlIHByb3BlciBmb3JtYXQgZm9yIExNUyBjb21taXRcbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF90ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7Kn1cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICByZW5kZXJDb21taXRDTUkoX3Rlcm1pbmF0ZUNvbW1pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBzdG9yZURhdGEgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIHJlcXVlc3QgdG8gdGhlIExNU1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fEFycmF5fSBwYXJhbXNcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgcHJvY2Vzc0h0dHBSZXF1ZXN0KHVybDogU3RyaW5nLCBwYXJhbXMpIHtcbiAgICBjb25zdCBnZW5lcmljRXJyb3IgPSB7XG4gICAgICAncmVzdWx0JzogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRSxcbiAgICAgICdlcnJvckNvZGUnOiB0aGlzLiNlcnJvcl9jb2Rlcy5HRU5FUkFMLFxuICAgIH07XG5cbiAgICBjb25zdCBodHRwUmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgaHR0cFJlcS5vcGVuKCdQT1NUJywgdXJsLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBodHRwUmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgIGh0dHBSZXEuc2VuZChwYXJhbXMuam9pbignJicpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0dHBSZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJyxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuY29tbWl0UmVxdWVzdERhdGFUeXBlKTtcbiAgICAgICAgaHR0cFJlcS5zZW5kKEpTT04uc3RyaW5naWZ5KHBhcmFtcykpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBnZW5lcmljRXJyb3I7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGh0dHBSZXEucmVzcG9uc2VUZXh0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZ2VuZXJpY0Vycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBTQ09STSBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gd2hlbiAtIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGNvbW1pdHRpbmdcbiAgICovXG4gIHNjaGVkdWxlQ29tbWl0KHdoZW46IG51bWJlcikge1xuICAgIHRoaXMuY2xlYXJTY2hlZHVsZWRDb21taXQoKTtcbiAgICB0aGlzLiN0aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLnNjaGVkdWxlZENhbGxiYWNrLCB3aGVuKTtcbiAgICB0aGlzLmFwaUxvZygnc2NoZWR1bGVDb21taXQnLCAnJywgJ3NjaGVkdWxlZCcsIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW5kIGNhbmNlbHMgYW55IGN1cnJlbnRseSBzY2hlZHVsZWQgY29tbWl0c1xuICAgKi9cbiAgY2xlYXJTY2hlZHVsZWRDb21taXQoKSB7XG4gICAgaWYgKHRoaXMuI3RpbWVvdXQpIHtcbiAgICAgIHRoaXMuI3NjaGVkdWxlQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lb3V0KTtcbiAgICAgIHRoaXMuYXBpTG9nKCdjbGVhclNjaGVkdWxlZENvbW1pdCcsICcnLCAnY2xlYXJlZCcsXG4gICAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfREVCVUcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmb3Igc2NoZWR1bGVkIGNvbW1pdCB0aW1lb3V0XG4gICAqL1xuICBzY2hlZHVsZWRDYWxsYmFjaygpIHtcbiAgICBpZiAoIXRoaXMuI3NjaGVkdWxlQ2FuY2VsbGVkKSB7XG4gICAgICB0aGlzLmNvbW1pdCgnQ29tbWl0JywgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBCYXNlQVBJIGZyb20gJy4vQmFzZUFQSSc7XG5pbXBvcnQge1xuICBDTUksXG4gIENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc09iamVjdCxcbiAgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCxcbiAgQ01JT2JqZWN0aXZlc09iamVjdCwgTkFWLFxufSBmcm9tICcuL2NtaS9zY29ybTEyX2NtaSc7XG5pbXBvcnQgKiBhcyBVdGlsaXRpZXMgZnJvbSAnLi91dGlsaXRpZXMnO1xuaW1wb3J0IHtnbG9iYWxfY29uc3RhbnRzLCBzY29ybTEyX2NvbnN0YW50c30gZnJvbSAnLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQge3Njb3JtMTJfZXJyb3JfY29kZXN9IGZyb20gJy4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcblxuY29uc3QgY29uc3RhbnRzID0gc2Nvcm0xMl9jb25zdGFudHM7XG5cbi8qKlxuICogQVBJIGNsYXNzIGZvciBTQ09STSAxLjJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Nvcm0xMkFQSSBleHRlbmRzIEJhc2VBUEkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIFNDT1JNIDEuMiBBUElcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZXR0aW5nczoge30pIHtcbiAgICBjb25zdCBmaW5hbFNldHRpbmdzID0ge1xuICAgICAgLi4ue1xuICAgICAgICBtYXN0ZXJ5X292ZXJyaWRlOiBmYWxzZSxcbiAgICAgIH0sIC4uLnNldHRpbmdzLFxuICAgIH07XG5cbiAgICBzdXBlcihzY29ybTEyX2Vycm9yX2NvZGVzLCBmaW5hbFNldHRpbmdzKTtcblxuICAgIHRoaXMuY21pID0gbmV3IENNSSgpO1xuICAgIHRoaXMubmF2ID0gbmV3IE5BVigpO1xuXG4gICAgLy8gUmVuYW1lIGZ1bmN0aW9ucyB0byBtYXRjaCAxLjIgU3BlYyBhbmQgZXhwb3NlIHRvIG1vZHVsZXNcbiAgICB0aGlzLkxNU0luaXRpYWxpemUgPSB0aGlzLmxtc0luaXRpYWxpemU7XG4gICAgdGhpcy5MTVNGaW5pc2ggPSB0aGlzLmxtc0ZpbmlzaDtcbiAgICB0aGlzLkxNU0dldFZhbHVlID0gdGhpcy5sbXNHZXRWYWx1ZTtcbiAgICB0aGlzLkxNU1NldFZhbHVlID0gdGhpcy5sbXNTZXRWYWx1ZTtcbiAgICB0aGlzLkxNU0NvbW1pdCA9IHRoaXMubG1zQ29tbWl0O1xuICAgIHRoaXMuTE1TR2V0TGFzdEVycm9yID0gdGhpcy5sbXNHZXRMYXN0RXJyb3I7XG4gICAgdGhpcy5MTVNHZXRFcnJvclN0cmluZyA9IHRoaXMubG1zR2V0RXJyb3JTdHJpbmc7XG4gICAgdGhpcy5MTVNHZXREaWFnbm9zdGljID0gdGhpcy5sbXNHZXREaWFnbm9zdGljO1xuICB9XG5cbiAgLyoqXG4gICAqIGxtc0luaXRpYWxpemUgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0luaXRpYWxpemUoKSB7XG4gICAgdGhpcy5jbWkuaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoJ0xNU0luaXRpYWxpemUnLCAnTE1TIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIScsXG4gICAgICAgICdMTVMgaXMgYWxyZWFkeSBmaW5pc2hlZCEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNGaW5pc2ggZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0ZpbmlzaCgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRlcm1pbmF0ZSgnTE1TRmluaXNoJywgZmFsc2UpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFKSB7XG4gICAgICBpZiAodGhpcy5uYXYuZXZlbnQgIT09ICcnKSB7XG4gICAgICAgIGlmICh0aGlzLm5hdi5ldmVudCA9PT0gJ2NvbnRpbnVlJykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VOZXh0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZVByZXZpb3VzJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5hdXRvUHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZU5leHQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldFZhbHVlIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zR2V0VmFsdWUoQ01JRWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCdMTVNHZXRWYWx1ZScsIGZhbHNlLCBDTUlFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNTZXRWYWx1ZSBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zU2V0VmFsdWUoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZSgnTE1TU2V0VmFsdWUnLCBmYWxzZSwgQ01JRWxlbWVudCwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0NvbW1pdCBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zQ29tbWl0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbW1pdCgnTE1TQ29tbWl0JywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldExhc3RFcnJvciBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldExhc3RFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXN0RXJyb3IoJ0xNU0dldExhc3RFcnJvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldEVycm9yU3RyaW5nIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRFcnJvclN0cmluZyhDTUlFcnJvckNvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRFcnJvclN0cmluZygnTE1TR2V0RXJyb3JTdHJpbmcnLCBDTUlFcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldERpYWdub3N0aWMgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldERpYWdub3N0aWMoQ01JRXJyb3JDb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlhZ25vc3RpYygnTE1TR2V0RGlhZ25vc3RpYycsIENNSUVycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHZhbHVlIG9uIHRoZSBDTUkgT2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc2V0Q01JVmFsdWUoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uU2V0Q01JVmFsdWUoJ0xNU1NldFZhbHVlJywgZmFsc2UsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgQ01JIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0Q01JVmFsdWUoQ01JRWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLl9jb21tb25HZXRDTUlWYWx1ZSgnZ2V0Q01JVmFsdWUnLCBmYWxzZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBidWlsZHMgYSBuZXcgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm91bmRGaXJzdEluZGV4XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIGdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSwgZm91bmRGaXJzdEluZGV4KSB7XG4gICAgbGV0IG5ld0NoaWxkO1xuXG4gICAgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnY21pXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCcpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlPYmplY3RpdmVzT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGRcXFxcLmNvcnJlY3RfcmVzcG9uc2VzXFxcXC5cXFxcZCcpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGRcXFxcLm9iamVjdGl2ZXNcXFxcLlxcXFxkJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnY21pXFxcXC5pbnRlcmFjdGlvbnNcXFxcLlxcXFxkJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSUludGVyYWN0aW9uc09iamVjdCgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdDaGlsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgQ29ycmVjdCBSZXNwb25zZSB2YWx1ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgdmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRoYXQgY29ycmVzcG9uZHMgdG8gZXJyb3JOdW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtib29sZWFuIH1kZXRhaWxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhlcnJvck51bWJlciwgZGV0YWlsKSB7XG4gICAgbGV0IGJhc2ljTWVzc2FnZSA9ICdObyBFcnJvcic7XG4gICAgbGV0IGRldGFpbE1lc3NhZ2UgPSAnTm8gRXJyb3InO1xuXG4gICAgLy8gU2V0IGVycm9yIG51bWJlciB0byBzdHJpbmcgc2luY2UgaW5jb25zaXN0ZW50IGZyb20gbW9kdWxlcyBpZiBzdHJpbmcgb3IgbnVtYmVyXG4gICAgZXJyb3JOdW1iZXIgPSBTdHJpbmcoZXJyb3JOdW1iZXIpO1xuICAgIGlmIChjb25zdGFudHMuZXJyb3JfZGVzY3JpcHRpb25zW2Vycm9yTnVtYmVyXSkge1xuICAgICAgYmFzaWNNZXNzYWdlID0gY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uYmFzaWNNZXNzYWdlO1xuICAgICAgZGV0YWlsTWVzc2FnZSA9IGNvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdLmRldGFpbE1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRldGFpbCA/IGRldGFpbE1lc3NhZ2UgOiBiYXNpY01lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgd2hvbGUgQVBJIHdpdGggYW5vdGhlclxuICAgKlxuICAgKiBAcGFyYW0ge1Njb3JtMTJBUEl9IG5ld0FQSVxuICAgKi9cbiAgcmVwbGFjZVdpdGhBbm90aGVyU2Nvcm1BUEkobmV3QVBJKSB7XG4gICAgLy8gRGF0YSBNb2RlbFxuICAgIHRoaXMuY21pID0gbmV3QVBJLmNtaTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNtaSBvYmplY3QgdG8gdGhlIHByb3BlciBmb3JtYXQgZm9yIExNUyBjb21taXRcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7b2JqZWN0fEFycmF5fVxuICAgKi9cbiAgcmVuZGVyQ29tbWl0Q01JKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNtaUV4cG9ydCA9IHRoaXMucmVuZGVyQ01JVG9KU09OT2JqZWN0KCk7XG5cbiAgICBpZiAodGVybWluYXRlQ29tbWl0KSB7XG4gICAgICBjbWlFeHBvcnQuY21pLmNvcmUudG90YWxfdGltZSA9IHRoaXMuY21pLmdldEN1cnJlbnRUb3RhbFRpbWUoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBmbGF0dGVuZWQgPSBVdGlsaXRpZXMuZmxhdHRlbihjbWlFeHBvcnQpO1xuICAgIHN3aXRjaCAodGhpcy5zZXR0aW5ncy5kYXRhQ29tbWl0Rm9ybWF0KSB7XG4gICAgICBjYXNlICdmbGF0dGVuZWQnOlxuICAgICAgICByZXR1cm4gVXRpbGl0aWVzLmZsYXR0ZW4oY21pRXhwb3J0KTtcbiAgICAgIGNhc2UgJ3BhcmFtcyc6XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBpbiBmbGF0dGVuZWQpIHtcbiAgICAgICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChmbGF0dGVuZWQsIGl0ZW0pKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChgJHtpdGVtfT0ke2ZsYXR0ZW5lZFtpdGVtXX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNtaUV4cG9ydDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gc3RvcmUgdGhlIGRhdGEgdG8gdGhlIExNU1xuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBzdG9yZURhdGEodGVybWluYXRlQ29tbWl0OiBib29sZWFuKSB7XG4gICAgaWYgKHRlcm1pbmF0ZUNvbW1pdCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxTdGF0dXMgPSB0aGlzLmNtaS5jb3JlLmxlc3Nvbl9zdGF0dXM7XG4gICAgICBpZiAob3JpZ2luYWxTdGF0dXMgPT09ICdub3QgYXR0ZW1wdGVkJykge1xuICAgICAgICB0aGlzLmNtaS5jb3JlLmxlc3Nvbl9zdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY21pLmNvcmUubGVzc29uX21vZGUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIGlmICh0aGlzLmNtaS5jb3JlLmNyZWRpdCA9PT0gJ2NyZWRpdCcpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5tYXN0ZXJ5X292ZXJyaWRlICYmXG4gICAgICAgICAgICAgIHRoaXMuY21pLnN0dWRlbnRfZGF0YS5tYXN0ZXJ5X3Njb3JlICE9PSAnJyAmJlxuICAgICAgICAgICAgICB0aGlzLmNtaS5jb3JlLnNjb3JlLnJhdyAhPT0gJycpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHRoaXMuY21pLmNvcmUuc2NvcmUucmF3KSA+PVxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQodGhpcy5jbWkuc3R1ZGVudF9kYXRhLm1hc3Rlcnlfc2NvcmUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cyA9ICdwYXNzZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29yZS5sZXNzb25fc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY21pLmNvcmUubGVzc29uX21vZGUgPT09ICdicm93c2UnKSB7XG4gICAgICAgIGlmICgodGhpcy5zdGFydGluZ0RhdGE/LmNtaT8uY29yZT8ubGVzc29uX3N0YXR1cyB8fCAnJykgPT09ICcnICYmXG4gICAgICAgICAgICBvcmlnaW5hbFN0YXR1cyA9PT0gJ25vdCBhdHRlbXB0ZWQnKSB7XG4gICAgICAgICAgdGhpcy5jbWkuY29yZS5sZXNzb25fc3RhdHVzID0gJ2Jyb3dzZWQnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWl0T2JqZWN0ID0gdGhpcy5yZW5kZXJDb21taXRDTUkodGVybWluYXRlQ29tbWl0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmxtc0NvbW1pdFVybCkge1xuICAgICAgaWYgKHRoaXMuYXBpTG9nTGV2ZWwgPT09IGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ0NvbW1pdCAodGVybWluYXRlZDogJyArXG4gICAgICAgICAgICAodGVybWluYXRlQ29tbWl0ID8gJ3llcycgOiAnbm8nKSArICcpOiAnKTtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyhjb21taXRPYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0dHBSZXF1ZXN0KHRoaXMuc2V0dGluZ3MubG1zQ29tbWl0VXJsLCBjb21taXRPYmplY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnQ29tbWl0ICh0ZXJtaW5hdGVkOiAnICtcbiAgICAgICAgICAodGVybWluYXRlQ29tbWl0ID8gJ3llcycgOiAnbm8nKSArICcpOiAnKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbW1pdE9iamVjdCk7XG4gICAgICByZXR1cm4gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBCYXNlQVBJIGZyb20gJy4vQmFzZUFQSSc7XG5pbXBvcnQge1xuICBBREwsXG4gIENNSSxcbiAgQ01JQ29tbWVudHNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc09iamVjdCxcbiAgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCxcbiAgQ01JT2JqZWN0aXZlc09iamVjdCxcbn0gZnJvbSAnLi9jbWkvc2Nvcm0yMDA0X2NtaSc7XG5pbXBvcnQgKiBhcyBVdGlsaXRpZXMgZnJvbSAnLi91dGlsaXRpZXMnO1xuaW1wb3J0IHtnbG9iYWxfY29uc3RhbnRzLCBzY29ybTIwMDRfY29uc3RhbnRzfSBmcm9tICcuL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCB7c2Nvcm0yMDA0X2Vycm9yX2NvZGVzfSBmcm9tICcuL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQge2NvcnJlY3RfcmVzcG9uc2VzfSBmcm9tICcuL2NvbnN0YW50cy9yZXNwb25zZV9jb25zdGFudHMnO1xuaW1wb3J0IHt2YWxpZF9sYW5ndWFnZXN9IGZyb20gJy4vY29uc3RhbnRzL2xhbmd1YWdlX2NvbnN0YW50cyc7XG5pbXBvcnQge3Njb3JtMjAwNF9yZWdleH0gZnJvbSAnLi9jb25zdGFudHMvcmVnZXgnO1xuXG5jb25zdCBjb25zdGFudHMgPSBzY29ybTIwMDRfY29uc3RhbnRzO1xuXG4vKipcbiAqIEFQSSBjbGFzcyBmb3IgU0NPUk0gMjAwNFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY29ybTIwMDRBUEkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgI3ZlcnNpb246ICcxLjAnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgU0NPUk0gMjAwNCBBUElcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZXR0aW5nczoge30pIHtcbiAgICBjb25zdCBmaW5hbFNldHRpbmdzID0ge1xuICAgICAgLi4ue1xuICAgICAgICBtYXN0ZXJ5X292ZXJyaWRlOiBmYWxzZSxcbiAgICAgIH0sIC4uLnNldHRpbmdzLFxuICAgIH07XG5cbiAgICBzdXBlcihzY29ybTIwMDRfZXJyb3JfY29kZXMsIGZpbmFsU2V0dGluZ3MpO1xuXG4gICAgdGhpcy5jbWkgPSBuZXcgQ01JKCk7XG4gICAgdGhpcy5hZGwgPSBuZXcgQURMKCk7XG5cbiAgICAvLyBSZW5hbWUgZnVuY3Rpb25zIHRvIG1hdGNoIDIwMDQgU3BlYyBhbmQgZXhwb3NlIHRvIG1vZHVsZXNcbiAgICB0aGlzLkluaXRpYWxpemUgPSB0aGlzLmxtc0luaXRpYWxpemU7XG4gICAgdGhpcy5UZXJtaW5hdGUgPSB0aGlzLmxtc1Rlcm1pbmF0ZTtcbiAgICB0aGlzLkdldFZhbHVlID0gdGhpcy5sbXNHZXRWYWx1ZTtcbiAgICB0aGlzLlNldFZhbHVlID0gdGhpcy5sbXNTZXRWYWx1ZTtcbiAgICB0aGlzLkNvbW1pdCA9IHRoaXMubG1zQ29tbWl0O1xuICAgIHRoaXMuR2V0TGFzdEVycm9yID0gdGhpcy5sbXNHZXRMYXN0RXJyb3I7XG4gICAgdGhpcy5HZXRFcnJvclN0cmluZyA9IHRoaXMubG1zR2V0RXJyb3JTdHJpbmc7XG4gICAgdGhpcy5HZXREaWFnbm9zdGljID0gdGhpcy5sbXNHZXREaWFnbm9zdGljO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3ZlcnNpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3ZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7c3RyaW5nfSBib29sXG4gICAqL1xuICBsbXNJbml0aWFsaXplKCkge1xuICAgIHRoaXMuY21pLmluaXRpYWxpemUoKTtcbiAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKCdJbml0aWFsaXplJyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7c3RyaW5nfSBib29sXG4gICAqL1xuICBsbXNUZXJtaW5hdGUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50ZXJtaW5hdGUoJ1Rlcm1pbmF0ZScsIHRydWUpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFKSB7XG4gICAgICBpZiAodGhpcy5hZGwubmF2LnJlcXVlc3QgIT09ICdfbm9uZV8nKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hZGwubmF2LnJlcXVlc3QpIHtcbiAgICAgICAgICBjYXNlICdjb250aW51ZSc6XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlTmV4dCcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncHJldmlvdXMnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZVByZXZpb3VzJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdjaG9pY2UnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUNob2ljZScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXhpdCc6XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlRXhpdCcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXhpdEFsbCc6XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlRXhpdEFsbCcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYWJhbmRvbic6XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlQWJhbmRvbicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYWJhbmRvbkFsbCc6XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlQWJhbmRvbkFsbCcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5hdXRvUHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZU5leHQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldFZhbHVlKENNSUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnR2V0VmFsdWUnLCB0cnVlLCBDTUlFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zU2V0VmFsdWUoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZSgnU2V0VmFsdWUnLCB0cnVlLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogT3JkZXJzIExNUyB0byBzdG9yZSBhbGwgY29udGVudCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zQ29tbWl0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbW1pdCgnQ29tbWl0Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBsYXN0IGVycm9yIGNvZGVcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zR2V0TGFzdEVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExhc3RFcnJvcignR2V0TGFzdEVycm9yJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXJyb3JOdW1iZXIgZXJyb3IgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcil9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRFcnJvclN0cmluZyhDTUlFcnJvckNvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRFcnJvclN0cmluZygnR2V0RXJyb3JTdHJpbmcnLCBDTUlFcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wcmVoZW5zaXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvck51bWJlciBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcil9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXREaWFnbm9zdGljKENNSUVycm9yQ29kZSkge1xuICAgIHJldHVybiB0aGlzLmdldERpYWdub3N0aWMoJ0dldERpYWdub3N0aWMnLCBDTUlFcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSB2YWx1ZSBvbiB0aGUgQ01JIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc2V0Q01JVmFsdWUoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uU2V0Q01JVmFsdWUoJ1NldFZhbHVlJywgdHJ1ZSwgQ01JRWxlbWVudCwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgYnVpbGRzIGEgbmV3IGNoaWxkIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm91bmRGaXJzdEluZGV4XG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSwgZm91bmRGaXJzdEluZGV4KSB7XG4gICAgbGV0IG5ld0NoaWxkO1xuXG4gICAgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnY21pXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCcpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlPYmplY3RpdmVzT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGRcXFxcLmNvcnJlY3RfcmVzcG9uc2VzXFxcXC5cXFxcZCcpKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHBhcnRzWzJdKTtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gdGhpcy5jbWkuaW50ZXJhY3Rpb25zLmNoaWxkQXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcmFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuREVQRU5ERU5DWV9OT1RfRVNUQUJMSVNIRUQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25fdHlwZSA9IGludGVyYWN0aW9uLnR5cGU7XG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uX2NvdW50ID0gaW50ZXJhY3Rpb24uY29ycmVjdF9yZXNwb25zZXMuX2NvdW50O1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25fdHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVyYWN0aW9uX2NvdW50ICYmIHRoaXMubGFzdEVycm9yQ29kZSA9PT1cbiAgICAgICAgICAwOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gaW50ZXJhY3Rpb24uY29ycmVjdF9yZXNwb25zZXMuY2hpbGRBcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5wYXR0ZXJuID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VfdHlwZSA9IGNvcnJlY3RfcmVzcG9uc2VzW2ludGVyYWN0aW9uX3R5cGVdO1xuICAgICAgICBsZXQgbm9kZXMgPSBbXTtcbiAgICAgICAgaWYgKHJlc3BvbnNlX3R5cGUuZGVsaW1pdGVyICE9PSAnJykge1xuICAgICAgICAgIG5vZGVzID0gU3RyaW5nKHZhbHVlKS5zcGxpdChyZXNwb25zZV90eXBlLmRlbGltaXRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZXNbMF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwICYmIG5vZGVzLmxlbmd0aCA8PSByZXNwb25zZV90eXBlLm1heCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tDb3JyZWN0UmVzcG9uc2VWYWx1ZShpbnRlcmFjdGlvbl90eXBlLCBub2RlcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVzLmxlbmd0aCA+IHJlc3BvbnNlX3R5cGUubWF4KSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkdFTkVSQUxfU0VUX0ZBSUxVUkUsXG4gICAgICAgICAgICAgICdEYXRhIE1vZGVsIEVsZW1lbnQgUGF0dGVybiBUb28gTG9uZycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5sYXN0RXJyb3JDb2RlID09PSAwKSB7XG4gICAgICAgIG5ld0NoaWxkID0gbmV3IENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZvdW5kRmlyc3RJbmRleCAmJiB0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCxcbiAgICAgICAgJ2NtaVxcXFwuaW50ZXJhY3Rpb25zXFxcXC5cXFxcZFxcXFwub2JqZWN0aXZlc1xcXFwuXFxcXGQnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGQnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCxcbiAgICAgICAgJ2NtaVxcXFwuY29tbWVudHNfZnJvbV9sZWFybmVyXFxcXC5cXFxcZCcpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlDb21tZW50c09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmNvbW1lbnRzX2Zyb21fbG1zXFxcXC5cXFxcZCcpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlDb21tZW50c09iamVjdCh0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q2hpbGQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY29ycmVjdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgdmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICBjb25zdCBwYXJ0cyA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBpbmRleCA9IE51bWJlcihwYXJ0c1syXSk7XG4gICAgY29uc3QgcGF0dGVybl9pbmRleCA9IE51bWJlcihwYXJ0c1s0XSk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLmNtaS5pbnRlcmFjdGlvbnMuY2hpbGRBcnJheVtpbmRleF07XG5cbiAgICBjb25zdCBpbnRlcmFjdGlvbl90eXBlID0gaW50ZXJhY3Rpb24udHlwZTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbl9jb3VudCA9IGludGVyYWN0aW9uLmNvcnJlY3RfcmVzcG9uc2VzLl9jb3VudDtcbiAgICBpZiAoaW50ZXJhY3Rpb25fdHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJhY3Rpb25fY291bnQgJiYgdGhpcy5sYXN0RXJyb3JDb2RlID09PSAwOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBpbnRlcmFjdGlvbi5jb3JyZWN0X3Jlc3BvbnNlcy5jaGlsZEFycmF5W2ldO1xuICAgICAgICBpZiAocmVzcG9uc2UucGF0dGVybiA9PT0gdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZV90eXBlID0gc2Nvcm0yMDA0X2NvbnN0YW50cy5jb3JyZWN0X3Jlc3BvbnNlc1tpbnRlcmFjdGlvbl90eXBlXTtcbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlX3R5cGUubGltaXQgIT09ICd1bmRlZmluZWQnIHx8IGludGVyYWN0aW9uX2NvdW50IDxcbiAgICAgICAgcmVzcG9uc2VfdHlwZS5saW1pdCkge1xuICAgICAgbGV0IG5vZGVzID0gW107XG4gICAgICBpZiAocmVzcG9uc2VfdHlwZS5kZWxpbWl0ZXIgIT09ICcnKSB7XG4gICAgICAgIG5vZGVzID0gU3RyaW5nKHZhbHVlKS5zcGxpdChyZXNwb25zZV90eXBlLmRlbGltaXRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2Rlc1swXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCAmJiBub2Rlcy5sZW5ndGggPD0gcmVzcG9uc2VfdHlwZS5tYXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0NvcnJlY3RSZXNwb25zZVZhbHVlKGludGVyYWN0aW9uX3R5cGUsIG5vZGVzLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGVzLmxlbmd0aCA+IHJlc3BvbnNlX3R5cGUubWF4KSB7XG4gICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5HRU5FUkFMX1NFVF9GQUlMVVJFLFxuICAgICAgICAgICAgJ0RhdGEgTW9kZWwgRWxlbWVudCBQYXR0ZXJuIFRvbyBMb25nJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmxhc3RFcnJvckNvZGUgPT09IDAgJiZcbiAgICAgICAgICAoIXJlc3BvbnNlX3R5cGUuZHVwbGljYXRlIHx8XG4gICAgICAgICAgICAgICF0aGlzLmNoZWNrRHVwbGljYXRlZFBhdHRlcm4oaW50ZXJhY3Rpb24uY29ycmVjdF9yZXNwb25zZXMsXG4gICAgICAgICAgICAgICAgICBwYXR0ZXJuX2luZGV4LCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCAmJiB2YWx1ZSA9PT0gJycpKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcsIHdlIHdhbnQgdGhlIGludmVyc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RFcnJvckNvZGUgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSxcbiAgICAgICAgICAgICAgJ0RhdGEgTW9kZWwgRWxlbWVudCBQYXR0ZXJuIEFscmVhZHkgRXhpc3RzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkdFTkVSQUxfU0VUX0ZBSUxVUkUsXG4gICAgICAgICAgJ0RhdGEgTW9kZWwgRWxlbWVudCBDb2xsZWN0aW9uIExpbWl0IFJlYWNoZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldENNSVZhbHVlKENNSUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uR2V0Q01JVmFsdWUoJ0dldFZhbHVlJywgdHJ1ZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGVycm9yTnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtib29sZWFufSBkZXRhaWxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhlcnJvck51bWJlciwgZGV0YWlsKSB7XG4gICAgbGV0IGJhc2ljTWVzc2FnZSA9ICcnO1xuICAgIGxldCBkZXRhaWxNZXNzYWdlID0gJyc7XG5cbiAgICAvLyBTZXQgZXJyb3IgbnVtYmVyIHRvIHN0cmluZyBzaW5jZSBpbmNvbnNpc3RlbnQgZnJvbSBtb2R1bGVzIGlmIHN0cmluZyBvciBudW1iZXJcbiAgICBlcnJvck51bWJlciA9IFN0cmluZyhlcnJvck51bWJlcik7XG4gICAgaWYgKGNvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdKSB7XG4gICAgICBiYXNpY01lc3NhZ2UgPSBjb25zdGFudHMuZXJyb3JfZGVzY3JpcHRpb25zW2Vycm9yTnVtYmVyXS5iYXNpY01lc3NhZ2U7XG4gICAgICBkZXRhaWxNZXNzYWdlID0gY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uZGV0YWlsTWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGV0YWlsID8gZGV0YWlsTWVzc2FnZSA6IGJhc2ljTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgYSBjb3JyZWN0X3Jlc3BvbnNlIHZhbHVlIGhhcyBiZWVuIGR1cGxpY2F0ZWRcbiAgICogQHBhcmFtIHtDTUlBcnJheX0gY29ycmVjdF9yZXNwb25zZVxuICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudF9pbmRleFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBjaGVja0R1cGxpY2F0ZWRQYXR0ZXJuID0gKGNvcnJlY3RfcmVzcG9uc2UsIGN1cnJlbnRfaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgY29uc3QgY291bnQgPSBjb3JyZWN0X3Jlc3BvbnNlLl9jb3VudDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ICYmICFmb3VuZDsgaSsrKSB7XG4gICAgICBpZiAoaSAhPT0gY3VycmVudF9pbmRleCAmJiBjb3JyZWN0X3Jlc3BvbnNlLmNoaWxkQXJyYXlbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIGEgdmFsaWQgY29ycmVjdF9yZXNwb25zZSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJhY3Rpb25fdHlwZVxuICAgKiBAcGFyYW0ge0FycmF5fSBub2Rlc1xuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqL1xuICBjaGVja0NvcnJlY3RSZXNwb25zZVZhbHVlKGludGVyYWN0aW9uX3R5cGUsIG5vZGVzLCB2YWx1ZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY29ycmVjdF9yZXNwb25zZXNbaW50ZXJhY3Rpb25fdHlwZV07XG4gICAgY29uc3QgZm9ybWF0UmVnZXggPSBuZXcgUmVnRXhwKHJlc3BvbnNlLmZvcm1hdCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGggJiYgdGhpcy5sYXN0RXJyb3JDb2RlID09PSAwOyBpKyspIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbl90eXBlLm1hdGNoKFxuICAgICAgICAgICdeKGZpbGwtaW58bG9uZy1maWxsLWlufG1hdGNoaW5nfHBlcmZvcm1hbmNlfHNlcXVlbmNpbmcpJCcpKSB7XG4gICAgICAgIG5vZGVzW2ldID0gdGhpcy5yZW1vdmVDb3JyZWN0UmVzcG9uc2VQcmVmaXhlcyhub2Rlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS5kZWxpbWl0ZXIyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gbm9kZXNbaV0uc3BsaXQocmVzcG9uc2UuZGVsaW1pdGVyMik7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHZhbHVlc1swXS5tYXRjaChmb3JtYXRSZWdleCk7XG4gICAgICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdmFsdWVzWzFdLm1hdGNoKG5ldyBSZWdFeHAocmVzcG9uc2UuZm9ybWF0MikpKSB7XG4gICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gbm9kZXNbaV0ubWF0Y2goZm9ybWF0UmVnZXgpO1xuICAgICAgICBpZiAoKCFtYXRjaGVzICYmIHZhbHVlICE9PSAnJykgfHxcbiAgICAgICAgICAgICghbWF0Y2hlcyAmJiBpbnRlcmFjdGlvbl90eXBlID09PSAndHJ1ZS1mYWxzZScpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpbnRlcmFjdGlvbl90eXBlID09PSAnbnVtZXJpYycgJiYgbm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgaWYgKE51bWJlcihub2Rlc1swXSkgPiBOdW1iZXIobm9kZXNbMV0pKSB7XG4gICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5vZGVzW2ldICE9PSAnJyAmJiByZXNwb25zZS51bmlxdWUpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpICYmIHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVzW2ldID09PSBub2Rlc1tqXSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgcHJlZml4ZXMgZnJvbSBjb3JyZWN0X3Jlc3BvbnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBub2RlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICByZW1vdmVDb3JyZWN0UmVzcG9uc2VQcmVmaXhlcyhub2RlKSB7XG4gICAgbGV0IHNlZW5PcmRlciA9IGZhbHNlO1xuICAgIGxldCBzZWVuQ2FzZSA9IGZhbHNlO1xuICAgIGxldCBzZWVuTGFuZyA9IGZhbHNlO1xuXG4gICAgY29uc3QgcHJlZml4UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAnXih7KGxhbmd8Y2FzZV9tYXR0ZXJzfG9yZGVyX21hdHRlcnMpPShbXn1dKyl9KScpO1xuICAgIGxldCBtYXRjaGVzID0gbm9kZS5tYXRjaChwcmVmaXhSZWdleCk7XG4gICAgbGV0IGxhbmdNYXRjaGVzID0gbnVsbDtcbiAgICB3aGlsZSAobWF0Y2hlcykge1xuICAgICAgc3dpdGNoIChtYXRjaGVzWzJdKSB7XG4gICAgICAgIGNhc2UgJ2xhbmcnOlxuICAgICAgICAgIGxhbmdNYXRjaGVzID0gbm9kZS5tYXRjaChzY29ybTIwMDRfcmVnZXguQ01JTGFuZ2NyKTtcbiAgICAgICAgICBpZiAobGFuZ01hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmcgPSBsYW5nTWF0Y2hlc1szXTtcbiAgICAgICAgICAgIGlmIChsYW5nICE9PSB1bmRlZmluZWQgJiYgbGFuZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGlmICh2YWxpZF9sYW5ndWFnZXNbbGFuZy50b0xvd2VyQ2FzZSgpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlZW5MYW5nID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2FzZV9tYXR0ZXJzJzpcbiAgICAgICAgICBpZiAoIXNlZW5MYW5nICYmICFzZWVuT3JkZXIgJiYgIXNlZW5DYXNlKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2hlc1szXSAhPT0gJ3RydWUnICYmIG1hdGNoZXNbM10gIT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlZW5DYXNlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb3JkZXJfbWF0dGVycyc6XG4gICAgICAgICAgaWYgKCFzZWVuQ2FzZSAmJiAhc2VlbkxhbmcgJiYgIXNlZW5PcmRlcikge1xuICAgICAgICAgICAgaWYgKG1hdGNoZXNbM10gIT09ICd0cnVlJyAmJiBtYXRjaGVzWzNdICE9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWVuT3JkZXIgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUuc3Vic3RyKG1hdGNoZXNbMV0ubGVuZ3RoKTtcbiAgICAgIG1hdGNoZXMgPSBub2RlLm1hdGNoKHByZWZpeFJlZ2V4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSB3aG9sZSBBUEkgd2l0aCBhbm90aGVyXG4gICAqIEBwYXJhbSB7U2Nvcm0yMDA0QVBJfSBuZXdBUElcbiAgICovXG4gIHJlcGxhY2VXaXRoQW5vdGhlclNjb3JtQVBJKG5ld0FQSSkge1xuICAgIC8vIERhdGEgTW9kZWxcbiAgICB0aGlzLmNtaSA9IG5ld0FQSS5jbWk7XG4gICAgdGhpcy5hZGwgPSBuZXdBUEkuYWRsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY21pIG9iamVjdCB0byB0aGUgcHJvcGVyIGZvcm1hdCBmb3IgTE1TIGNvbW1pdFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHtvYmplY3R8QXJyYXl9XG4gICAqL1xuICByZW5kZXJDb21taXRDTUkodGVybWluYXRlQ29tbWl0OiBib29sZWFuKSB7XG4gICAgY29uc3QgY21pRXhwb3J0ID0gdGhpcy5yZW5kZXJDTUlUb0pTT05PYmplY3QoKTtcblxuICAgIGlmICh0ZXJtaW5hdGVDb21taXQpIHtcbiAgICAgIGNtaUV4cG9ydC5jbWkudG90YWxfdGltZSA9IHRoaXMuY21pLmdldEN1cnJlbnRUb3RhbFRpbWUoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBmbGF0dGVuZWQgPSBVdGlsaXRpZXMuZmxhdHRlbihjbWlFeHBvcnQpO1xuICAgIHN3aXRjaCAodGhpcy5zZXR0aW5ncy5kYXRhQ29tbWl0Rm9ybWF0KSB7XG4gICAgICBjYXNlICdmbGF0dGVuZWQnOlxuICAgICAgICByZXR1cm4gVXRpbGl0aWVzLmZsYXR0ZW4oY21pRXhwb3J0KTtcbiAgICAgIGNhc2UgJ3BhcmFtcyc6XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBpbiBmbGF0dGVuZWQpIHtcbiAgICAgICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChmbGF0dGVuZWQsIGl0ZW0pKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChgJHtpdGVtfT0ke2ZsYXR0ZW5lZFtpdGVtXX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNtaUV4cG9ydDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gc3RvcmUgdGhlIGRhdGEgdG8gdGhlIExNU1xuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBzdG9yZURhdGEodGVybWluYXRlQ29tbWl0OiBib29sZWFuKSB7XG4gICAgaWYgKHRlcm1pbmF0ZUNvbW1pdCkge1xuICAgICAgaWYgKHRoaXMuY21pLm1vZGUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIGlmICh0aGlzLmNtaS5jcmVkaXQgPT09ICdjcmVkaXQnKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY21pLmNvbXBsZXRpb25fdGhyZXNob2xkICYmIHRoaXMuY21pLnByb2dyZXNzX21lYXN1cmUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNtaS5wcm9ncmVzc19tZWFzdXJlID49IHRoaXMuY21pLmNvbXBsZXRpb25fdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgIHRoaXMuY21pLmNvbXBsZXRpb25fc3RhdHVzID0gJ2NvbXBsZXRlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNtaS5jb21wbGV0aW9uX3N0YXR1cyA9ICdpbmNvbXBsZXRlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuY21pLnNjYWxlZF9wYXNzaW5nX3Njb3JlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIHRoaXMuY21pLnNjb3JlLnNjYWxlZCAhPT0gJycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNtaS5zY29yZS5zY2FsZWQgPj0gdGhpcy5jbWkuc2NhbGVkX3Bhc3Npbmdfc2NvcmUpIHtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuc3VjY2Vzc19zdGF0dXMgPSAncGFzc2VkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY21pLnN1Y2Nlc3Nfc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG5hdlJlcXVlc3QgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5hZGwubmF2LnJlcXVlc3QgIT09ICh0aGlzLnN0YXJ0aW5nRGF0YT8uYWRsPy5uYXY/LnJlcXVlc3QpICYmXG4gICAgICAgIHRoaXMuYWRsLm5hdi5yZXF1ZXN0ICE9PSAnX25vbmVfJykge1xuICAgICAgdGhpcy5hZGwubmF2LnJlcXVlc3QgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy5hZGwubmF2LnJlcXVlc3QpO1xuICAgICAgbmF2UmVxdWVzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWl0T2JqZWN0ID0gdGhpcy5yZW5kZXJDb21taXRDTUkodGVybWluYXRlQ29tbWl0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmxtc0NvbW1pdFVybCkge1xuICAgICAgaWYgKHRoaXMuYXBpTG9nTGV2ZWwgPT09IGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ0NvbW1pdCAodGVybWluYXRlZDogJyArXG4gICAgICAgICAgICAodGVybWluYXRlQ29tbWl0ID8gJ3llcycgOiAnbm8nKSArICcpOiAnKTtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyhjb21taXRPYmplY3QpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9jZXNzSHR0cFJlcXVlc3QodGhpcy5zZXR0aW5ncy5sbXNDb21taXRVcmwsXG4gICAgICAgICAgY29tbWl0T2JqZWN0KTtcbiAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgYSBzZXF1ZW5jaW5nIGNhbGwsIGFuZCB0aGVuIGNhbGwgdGhlIG5lY2Vzc2FyeSBKU1xuICAgICAgaWYgKG5hdlJlcXVlc3QgJiYgcmVzdWx0Lm5hdlJlcXVlc3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHJlc3VsdC5uYXZSZXF1ZXN0ICE9PSAnJykge1xuICAgICAgICBGdW5jdGlvbihgXCJ1c2Ugc3RyaWN0XCI7KCgpID0+IHsgJHtyZXN1bHQubmF2UmVxdWVzdH0gfSkoKWApKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnQ29tbWl0ICh0ZXJtaW5hdGVkOiAnICtcbiAgICAgICAgICAodGVybWluYXRlQ29tbWl0ID8gJ3llcycgOiAnbm8nKSArICcpOiAnKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbW1pdE9iamVjdCk7XG4gICAgICByZXR1cm4gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgU2Nvcm0xMkNNSSBmcm9tICcuL3Njb3JtMTJfY21pJztcbmltcG9ydCB7QmFzZUNNSSwgQ01JQXJyYXksIENNSVNjb3JlfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQge2FpY2NfY29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQge2FpY2NfcmVnZXh9IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge3Njb3JtMTJfZXJyb3JfY29kZXN9IGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQge1xuICBjaGVjazEyVmFsaWRGb3JtYXQsXG4gIHRocm93UmVhZE9ubHlFcnJvcixcbiAgdGhyb3dXcml0ZU9ubHlFcnJvcixcbn0gZnJvbSAnLi9zY29ybTEyX2NtaSc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IGFpY2NfY29uc3RhbnRzO1xuY29uc3QgcmVnZXggPSBhaWNjX3JlZ2V4O1xuXG4vKipcbiAqIENNSSBDbGFzcyBmb3IgQUlDQ1xuICovXG5leHBvcnQgY2xhc3MgQ01JIGV4dGVuZHMgU2Nvcm0xMkNNSS5DTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgQ01JIG9iamVjdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRpYWxpemVkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihpbml0aWFsaXplZDogYm9vbGVhbikge1xuICAgIHN1cGVyKGNvbnN0YW50cy5jbWlfY2hpbGRyZW4pO1xuXG4gICAgaWYgKGluaXRpYWxpemVkKSB0aGlzLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuc3R1ZGVudF9kYXRhID0gbmV3IEFJQ0NDTUlTdHVkZW50RGF0YSgpO1xuICAgIHRoaXMuZXZhbHVhdGlvbiA9IG5ldyBDTUlFdmFsdWF0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc3R1ZGVudF9kYXRhPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5ldmFsdWF0aW9uPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWlcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBzdXNwZW5kX2RhdGE6IHN0cmluZyxcbiAgICogICAgICBsYXVuY2hfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIGNvbW1lbnRzOiBzdHJpbmcsXG4gICAqICAgICAgY29tbWVudHNfZnJvbV9sbXM6IHN0cmluZyxcbiAgICogICAgICBjb3JlOiBDTUlDb3JlLFxuICAgKiAgICAgIG9iamVjdGl2ZXM6IENNSU9iamVjdGl2ZXMsXG4gICAqICAgICAgc3R1ZGVudF9kYXRhOiBDTUlTdHVkZW50RGF0YSxcbiAgICogICAgICBzdHVkZW50X3ByZWZlcmVuY2U6IENNSVN0dWRlbnRQcmVmZXJlbmNlLFxuICAgKiAgICAgIGludGVyYWN0aW9uczogQ01JSW50ZXJhY3Rpb25zXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdzdXNwZW5kX2RhdGEnOiB0aGlzLnN1c3BlbmRfZGF0YSxcbiAgICAgICdsYXVuY2hfZGF0YSc6IHRoaXMubGF1bmNoX2RhdGEsXG4gICAgICAnY29tbWVudHMnOiB0aGlzLmNvbW1lbnRzLFxuICAgICAgJ2NvbW1lbnRzX2Zyb21fbG1zJzogdGhpcy5jb21tZW50c19mcm9tX2xtcyxcbiAgICAgICdjb3JlJzogdGhpcy5jb3JlLFxuICAgICAgJ29iamVjdGl2ZXMnOiB0aGlzLm9iamVjdGl2ZXMsXG4gICAgICAnc3R1ZGVudF9kYXRhJzogdGhpcy5zdHVkZW50X2RhdGEsXG4gICAgICAnc3R1ZGVudF9wcmVmZXJlbmNlJzogdGhpcy5zdHVkZW50X3ByZWZlcmVuY2UsXG4gICAgICAnaW50ZXJhY3Rpb25zJzogdGhpcy5pbnRlcmFjdGlvbnMsXG4gICAgICAnZXZhbHVhdGlvbic6IHRoaXMuZXZhbHVhdGlvbixcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIEFJQ0MgRXZhbHVhdGlvbiBvYmplY3RcbiAqL1xuY2xhc3MgQ01JRXZhbHVhdGlvbiBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgRXZhbHVhdGlvbiBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmNvbW1lbnRzID0gbmV3IENNSUV2YWx1YXRpb25Db21tZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvbW1lbnRzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuZXZhbHVhdGlvbiBvYmplY3RcbiAgICogQHJldHVybiB7e2NvbW1lbnRzOiBDTUlFdmFsdWF0aW9uQ29tbWVudHN9fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2NvbW1lbnRzJzogdGhpcy5jb21tZW50cyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBBSUNDJ3MgY21pLmV2YWx1YXRpb24uY29tbWVudHMgb2JqZWN0XG4gKi9cbmNsYXNzIENNSUV2YWx1YXRpb25Db21tZW50cyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIEV2YWx1YXRpb24gQ29tbWVudHMgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihjb25zdGFudHMuY29tbWVudHNfY2hpbGRyZW4sXG4gICAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUpO1xuICB9XG59XG5cbi8qKlxuICogU3R1ZGVudERhdGEgY2xhc3MgZm9yIEFJQ0NcbiAqL1xuY2xhc3MgQUlDQ0NNSVN0dWRlbnREYXRhIGV4dGVuZHMgU2Nvcm0xMkNNSS5DTUlTdHVkZW50RGF0YSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQUlDQyBTdHVkZW50RGF0YSBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGNvbnN0YW50cy5zdHVkZW50X2RhdGFfY2hpbGRyZW4pO1xuXG4gICAgdGhpcy50cmllcyA9IG5ldyBDTUlUcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnRyaWVzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjdHJpZXNfZHVyaW5nX2xlc3NvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIHRyaWVzX2R1cmluZ19sZXNzb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRyaWVzX2R1cmluZ19sZXNzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RyaWVzX2R1cmluZ19sZXNzb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdHJpZXNfZHVyaW5nX2xlc3Nvbi4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWVzX2R1cmluZ19sZXNzb25cbiAgICovXG4gIHNldCB0cmllc19kdXJpbmdfbGVzc29uKHRyaWVzX2R1cmluZ19sZXNzb24pIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3RyaWVzX2R1cmluZ19sZXNzb24gPSB0cmllc19kdXJpbmdfbGVzc29uIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuc3R1ZGVudF9kYXRhIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIG1hc3Rlcnlfc2NvcmU6IHN0cmluZyxcbiAgICogICAgICBtYXhfdGltZV9hbGxvd2VkOiBzdHJpbmcsXG4gICAqICAgICAgdGltZV9saW1pdF9hY3Rpb246IHN0cmluZyxcbiAgICogICAgICB0cmllczogQ01JVHJpZXNcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ21hc3Rlcnlfc2NvcmUnOiB0aGlzLm1hc3Rlcnlfc2NvcmUsXG4gICAgICAnbWF4X3RpbWVfYWxsb3dlZCc6IHRoaXMubWF4X3RpbWVfYWxsb3dlZCxcbiAgICAgICd0aW1lX2xpbWl0X2FjdGlvbic6IHRoaXMudGltZV9saW1pdF9hY3Rpb24sXG4gICAgICAndHJpZXMnOiB0aGlzLnRyaWVzLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBBSUNDIGNtaS5zdHVkZW50X2RhdGEudHJpZXMgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlUcmllcyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBpbmxpbmUgVHJpZXMgQXJyYXkgY2xhc3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGFpY2NfY29uc3RhbnRzLnRyaWVzX2NoaWxkcmVuKTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBBSUNDIFRyaWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlUcmllc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgVHJpZXMgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zY29yZSA9IG5ldyBDTUlTY29yZShcbiAgICAgICAge1xuICAgICAgICAgIHNjb3JlX2NoaWxkcmVuOiBjb25zdGFudHMuc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgICAgc2NvcmVfcmFuZ2U6IHJlZ2V4LnNjb3JlX3JhbmdlLFxuICAgICAgICAgIGludmFsaWRFcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICAgICAgaW52YWxpZFR5cGVDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gsXG4gICAgICAgICAgaW52YWxpZFJhbmdlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsXG4gICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnNjb3JlPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjc3RhdHVzID0gJyc7XG4gICN0aW1lID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0dXNcbiAgICovXG4gIHNldCBzdGF0dXMoc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzdGF0dXMsIHJlZ2V4LkNNSVN0YXR1czIpKSB7XG4gICAgICB0aGlzLiNzdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVxuICAgKi9cbiAgc2V0IHRpbWUodGltZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQodGltZSwgcmVnZXguQ01JVGltZSkpIHtcbiAgICAgIHRoaXMuI3RpbWUgPSB0aW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X2RhdGEudHJpZXMubiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBzdGF0dXM6IHN0cmluZyxcbiAgICogICAgICB0aW1lOiBzdHJpbmcsXG4gICAqICAgICAgc2NvcmU6IENNSVNjb3JlXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdzdGF0dXMnOiB0aGlzLnN0YXR1cyxcbiAgICAgICd0aW1lJzogdGhpcy50aW1lLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBBSUNDIEV2YWx1YXRpb24gQ29tbWVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUV2YWx1YXRpb25Db21tZW50c09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEV2YWx1YXRpb24gQ29tbWVudHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjY29udGVudCA9ICcnO1xuICAjbG9jYXRpb24gPSAnJztcbiAgI3RpbWUgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29udGVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb250ZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqL1xuICBzZXQgY29udGVudChjb250ZW50KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChjb250ZW50LCByZWdleC5DTUlTdHJpbmcyNTYpKSB7XG4gICAgICB0aGlzLiNjb250ZW50ID0gY29udGVudDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNsb2NhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsb2NhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAgICovXG4gIHNldCBsb2NhdGlvbihsb2NhdGlvbikge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobG9jYXRpb24sIHJlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI2xvY2F0aW9uID0gbG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGluZyBmb3IgI3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHNldCB0aW1lKHRpbWUpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHRpbWUsIHJlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICB0aGlzLiN0aW1lID0gdGltZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuZXZhdWxhdGlvbi5jb21tZW50cy5uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICogICAgICBsb2NhdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIHRpbWU6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnY29udGVudCc6IHRoaXMuY29udGVudCxcbiAgICAgICdsb2NhdGlvbic6IHRoaXMubG9jYXRpb24sXG4gICAgICAndGltZSc6IHRoaXMudGltZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7c2Nvcm0xMl9jb25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCB7c2Nvcm0xMl9lcnJvcl9jb2Rlc30gZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yfSBmcm9tICcuLi9leGNlcHRpb25zJztcbmltcG9ydCB7c2Nvcm0xMl9yZWdleH0gZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgcHJvcGVyIGZvcm1hdC4gSWYgbm90LCB0aHJvdyBwcm9wZXIgZXJyb3IgY29kZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdleFBhdHRlcm5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dFbXB0eVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmFsaWRGb3JtYXQoXG4gICAgdmFsdWU6IFN0cmluZyxcbiAgICByZWdleFBhdHRlcm46IFN0cmluZyxcbiAgICBlcnJvckNvZGU6IG51bWJlcixcbiAgICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhbikge1xuICBjb25zdCBmb3JtYXRSZWdleCA9IG5ldyBSZWdFeHAocmVnZXhQYXR0ZXJuKTtcbiAgY29uc3QgbWF0Y2hlcyA9IHZhbHVlLm1hdGNoKGZvcm1hdFJlZ2V4KTtcbiAgaWYgKGFsbG93RW1wdHlTdHJpbmcgJiYgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIW1hdGNoZXMgfHwgbWF0Y2hlc1swXSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9yQ29kZSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIHByb3BlciByYW5nZS4gSWYgbm90LCB0aHJvdyBwcm9wZXIgZXJyb3IgY29kZS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmFuZ2VQYXR0ZXJuXG4gKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tWYWxpZFJhbmdlKFxuICAgIHZhbHVlOiBhbnksIHJhbmdlUGF0dGVybjogU3RyaW5nLCBlcnJvckNvZGU6IG51bWJlcikge1xuICBjb25zdCByYW5nZXMgPSByYW5nZVBhdHRlcm4uc3BsaXQoJyMnKTtcbiAgdmFsdWUgPSB2YWx1ZSAqIDEuMDtcbiAgaWYgKHZhbHVlID49IHJhbmdlc1swXSkge1xuICAgIGlmICgocmFuZ2VzWzFdID09PSAnKicpIHx8ICh2YWx1ZSA8PSByYW5nZXNbMV0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvckNvZGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9yQ29kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBBUEkgY21pIG9iamVjdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VDTUkge1xuICBqc29uU3RyaW5nID0gZmFsc2U7XG4gICNpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQmFzZUNNSSwganVzdCBtYXJrcyB0aGUgY2xhc3MgYXMgYWJzdHJhY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChuZXcudGFyZ2V0ID09PSBCYXNlQ01JKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29uc3RydWN0IEJhc2VDTUkgaW5zdGFuY2VzIGRpcmVjdGx5Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2luaXRpYWxpemVkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2luaXRpYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMuI2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNtaSAqLnNjb3JlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGNsYXNzIENNSVNjb3JlIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgKi5zY29yZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcmVfY2hpbGRyZW5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjb3JlX3JhbmdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludmFsaWRFcnJvckNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludmFsaWRUeXBlQ29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW52YWxpZFJhbmdlQ29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjaW1hbFJlZ2V4XG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHtcbiAgICAgICAgc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgIHNjb3JlX3JhbmdlLFxuICAgICAgICBtYXgsXG4gICAgICAgIGludmFsaWRFcnJvckNvZGUsXG4gICAgICAgIGludmFsaWRUeXBlQ29kZSxcbiAgICAgICAgaW52YWxpZFJhbmdlQ29kZSxcbiAgICAgICAgZGVjaW1hbFJlZ2V4LFxuICAgICAgfSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBzY29yZV9jaGlsZHJlbiB8fFxuICAgICAgICBzY29ybTEyX2NvbnN0YW50cy5zY29yZV9jaGlsZHJlbjtcbiAgICB0aGlzLiNfc2NvcmVfcmFuZ2UgPSAhc2NvcmVfcmFuZ2UgPyBmYWxzZSA6IHNjb3JtMTJfcmVnZXguc2NvcmVfcmFuZ2U7XG4gICAgdGhpcy4jbWF4ID0gKG1heCB8fCBtYXggPT09ICcnKSA/IG1heCA6ICcxMDAnO1xuICAgIHRoaXMuI19pbnZhbGlkX2Vycm9yX2NvZGUgPSBpbnZhbGlkRXJyb3JDb2RlIHx8XG4gICAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUU7XG4gICAgdGhpcy4jX2ludmFsaWRfdHlwZV9jb2RlID0gaW52YWxpZFR5cGVDb2RlIHx8XG4gICAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSDtcbiAgICB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlID0gaW52YWxpZFJhbmdlQ29kZSB8fFxuICAgICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRTtcbiAgICB0aGlzLiNfZGVjaW1hbF9yZWdleCA9IGRlY2ltYWxSZWdleCB8fFxuICAgICAgICBzY29ybTEyX3JlZ2V4LkNNSURlY2ltYWw7XG4gIH1cblxuICAjX2NoaWxkcmVuO1xuICAjX3Njb3JlX3JhbmdlO1xuICAjX2ludmFsaWRfZXJyb3JfY29kZTtcbiAgI19pbnZhbGlkX3R5cGVfY29kZTtcbiAgI19pbnZhbGlkX3JhbmdlX2NvZGU7XG4gICNfZGVjaW1hbF9yZWdleDtcbiAgI3JhdyA9ICcnO1xuICAjbWluID0gJyc7XG4gICNtYXg7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yIF9jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih0aGlzLiNfaW52YWxpZF9lcnJvcl9jb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNyYXdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHJhdygpIHtcbiAgICByZXR1cm4gdGhpcy4jcmF3O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Jhd1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3XG4gICAqL1xuICBzZXQgcmF3KHJhdykge1xuICAgIGlmIChjaGVja1ZhbGlkRm9ybWF0KHJhdywgdGhpcy4jX2RlY2ltYWxfcmVnZXgsXG4gICAgICAgIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSkgJiZcbiAgICAgICAgKCF0aGlzLiNfc2NvcmVfcmFuZ2UgfHxcbiAgICAgICAgICAgIGNoZWNrVmFsaWRSYW5nZShyYXcsIHRoaXMuI19zY29yZV9yYW5nZSxcbiAgICAgICAgICAgICAgICB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlKSkpIHtcbiAgICAgIHRoaXMuI3JhdyA9IHJhdztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbWluXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtaW5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1pblxuICAgKi9cbiAgc2V0IG1pbihtaW4pIHtcbiAgICBpZiAoY2hlY2tWYWxpZEZvcm1hdChtaW4sIHRoaXMuI19kZWNpbWFsX3JlZ2V4LFxuICAgICAgICB0aGlzLiNfaW52YWxpZF90eXBlX2NvZGUpICYmXG4gICAgICAgICghdGhpcy4jX3Njb3JlX3JhbmdlIHx8XG4gICAgICAgICAgICBjaGVja1ZhbGlkUmFuZ2UobWluLCB0aGlzLiNfc2NvcmVfcmFuZ2UsXG4gICAgICAgICAgICAgICAgdGhpcy4jX2ludmFsaWRfcmFuZ2VfY29kZSkpKSB7XG4gICAgICB0aGlzLiNtaW4gPSBtaW47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21heFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWF4KCkge1xuICAgIHJldHVybiB0aGlzLiNtYXg7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWF4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXhcbiAgICovXG4gIHNldCBtYXgobWF4KSB7XG4gICAgaWYgKGNoZWNrVmFsaWRGb3JtYXQobWF4LCB0aGlzLiNfZGVjaW1hbF9yZWdleCxcbiAgICAgICAgdGhpcy4jX2ludmFsaWRfdHlwZV9jb2RlKSAmJlxuICAgICAgICAoIXRoaXMuI19zY29yZV9yYW5nZSB8fFxuICAgICAgICAgICAgY2hlY2tWYWxpZFJhbmdlKG1heCwgdGhpcy4jX3Njb3JlX3JhbmdlLFxuICAgICAgICAgICAgICAgIHRoaXMuI19pbnZhbGlkX3JhbmdlX2NvZGUpKSkge1xuICAgICAgdGhpcy4jbWF4ID0gbWF4O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yICouc2NvcmVcbiAgICogQHJldHVybiB7e21pbjogc3RyaW5nLCBtYXg6IHN0cmluZywgcmF3OiBzdHJpbmd9fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3Jhdyc6IHRoaXMucmF3LFxuICAgICAgJ21pbic6IHRoaXMubWluLFxuICAgICAgJ21heCc6IHRoaXMubWF4LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY21pICoubiBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlBcnJheSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgY21pICoubiBhcnJheXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkcmVuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjaGlsZHJlbiwgZXJyb3JDb2RlfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jX2NoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgdGhpcy4jZXJyb3JDb2RlID0gZXJyb3JDb2RlO1xuICAgIHRoaXMuY2hpbGRBcnJheSA9IFtdO1xuICB9XG5cbiAgI2Vycm9yQ29kZTtcbiAgI19jaGlsZHJlbjtcblxuICAvKipcbiAgICogR2V0dGVyIGZvciBfY2hpbGRyZW5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yIF9jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih0aGlzLiNlcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgX2NvdW50XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBfY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRBcnJheS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciBfY291bnQuIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gX2NvdW50XG4gICAqL1xuICBzZXQgX2NvdW50KF9jb3VudCkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodGhpcy4jZXJyb3JDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yICoubiBhcnJheXNcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpICsgJyddID0gdGhpcy5jaGlsZEFycmF5W2ldO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge1xuICBCYXNlQ01JLFxuICBjaGVja1ZhbGlkRm9ybWF0LFxuICBjaGVja1ZhbGlkUmFuZ2UsXG4gIENNSUFycmF5LFxuICBDTUlTY29yZSxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtzY29ybTEyX2NvbnN0YW50c30gZnJvbSAnLi4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IHtzY29ybTEyX2Vycm9yX2NvZGVzfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IHtzY29ybTEyX3JlZ2V4fSBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gJy4uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0ICogYXMgVXRpbGl0aWVzIGZyb20gJy4uL3V0aWxpdGllcyc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IHNjb3JtMTJfY29uc3RhbnRzO1xuY29uc3QgcmVnZXggPSBzY29ybTEyX3JlZ2V4O1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFJlYWQgT25seSBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dSZWFkT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFdyaXRlIE9ubHkgZXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm93V3JpdGVPbmx5RXJyb3IoKSB7XG4gIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0xMl9lcnJvcl9jb2Rlcy5XUklURV9PTkxZX0VMRU1FTlQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIEludmFsaWQgU2V0IGVycm9yXG4gKi9cbmZ1bmN0aW9uIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKSB7XG4gIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCwgbm8gcmVhc29uIHRvIGhhdmUgdG8gcGFzcyB0aGUgc2FtZSBlcnJvciBjb2RlcyBldmVyeSB0aW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnZXhQYXR0ZXJuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RW1wdHlTdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVjazEyVmFsaWRGb3JtYXQoXG4gICAgdmFsdWU6IFN0cmluZyxcbiAgICByZWdleFBhdHRlcm46IFN0cmluZyxcbiAgICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhbikge1xuICByZXR1cm4gY2hlY2tWYWxpZEZvcm1hdCh2YWx1ZSwgcmVnZXhQYXR0ZXJuLFxuICAgICAgc2Nvcm0xMl9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILCBhbGxvd0VtcHR5U3RyaW5nKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kLCBubyByZWFzb24gdG8gaGF2ZSB0byBwYXNzIHRoZSBzYW1lIGVycm9yIGNvZGVzIGV2ZXJ5IHRpbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByYW5nZVBhdHRlcm5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dFbXB0eVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrMTJWYWxpZFJhbmdlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgcmFuZ2VQYXR0ZXJuOiBTdHJpbmcsXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGNoZWNrVmFsaWRSYW5nZSh2YWx1ZSwgcmFuZ2VQYXR0ZXJuLFxuICAgICAgc2Nvcm0xMl9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsIGFsbG93RW1wdHlTdHJpbmcpO1xufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgY21pIG9iamVjdCBmb3IgU0NPUk0gMS4yXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUkgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI19jaGlsZHJlbiA9ICcnO1xuICAjX3ZlcnNpb24gPSAnMy40JztcbiAgI3N1c3BlbmRfZGF0YSA9ICcnO1xuICAjbGF1bmNoX2RhdGEgPSAnJztcbiAgI2NvbW1lbnRzID0gJyc7XG4gICNjb21tZW50c19mcm9tX2xtcyA9ICcnO1xuXG4gIHN0dWRlbnRfZGF0YSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciB0aGUgU0NPUk0gMS4yIGNtaSBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtaV9jaGlsZHJlblxuICAgKiBAcGFyYW0geyhDTUlTdHVkZW50RGF0YXxBSUNDQ01JU3R1ZGVudERhdGEpfSBzdHVkZW50X2RhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0aWFsaXplZFxuICAgKi9cbiAgY29uc3RydWN0b3IoY21pX2NoaWxkcmVuLCBzdHVkZW50X2RhdGEsIGluaXRpYWxpemVkOiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmIChpbml0aWFsaXplZCkgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBjbWlfY2hpbGRyZW4gPyBjbWlfY2hpbGRyZW4gOiBjb25zdGFudHMuY21pX2NoaWxkcmVuO1xuICAgIHRoaXMuY29yZSA9IG5ldyBDTUlDb3JlKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzID0gbmV3IENNSU9iamVjdGl2ZXMoKTtcbiAgICB0aGlzLnN0dWRlbnRfZGF0YSA9IHN0dWRlbnRfZGF0YSA/IHN0dWRlbnRfZGF0YSA6IG5ldyBDTUlTdHVkZW50RGF0YSgpO1xuICAgIHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlID0gbmV3IENNSVN0dWRlbnRQcmVmZXJlbmNlKCk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbnMgPSBuZXcgQ01JSW50ZXJhY3Rpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29yZT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMub2JqZWN0aXZlcz8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc3R1ZGVudF9kYXRhPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdHVkZW50X3ByZWZlcmVuY2U/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmludGVyYWN0aW9ucz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgc3VzcGVuZF9kYXRhOiBzdHJpbmcsXG4gICAqICAgICAgbGF1bmNoX2RhdGE6IHN0cmluZyxcbiAgICogICAgICBjb21tZW50czogc3RyaW5nLFxuICAgKiAgICAgIGNvbW1lbnRzX2Zyb21fbG1zOiBzdHJpbmcsXG4gICAqICAgICAgY29yZTogQ01JQ29yZSxcbiAgICogICAgICBvYmplY3RpdmVzOiBDTUlPYmplY3RpdmVzLFxuICAgKiAgICAgIHN0dWRlbnRfZGF0YTogQ01JU3R1ZGVudERhdGEsXG4gICAqICAgICAgc3R1ZGVudF9wcmVmZXJlbmNlOiBDTUlTdHVkZW50UHJlZmVyZW5jZSxcbiAgICogICAgICBpbnRlcmFjdGlvbnM6IENNSUludGVyYWN0aW9uc1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnc3VzcGVuZF9kYXRhJzogdGhpcy5zdXNwZW5kX2RhdGEsXG4gICAgICAnbGF1bmNoX2RhdGEnOiB0aGlzLmxhdW5jaF9kYXRhLFxuICAgICAgJ2NvbW1lbnRzJzogdGhpcy5jb21tZW50cyxcbiAgICAgICdjb21tZW50c19mcm9tX2xtcyc6IHRoaXMuY29tbWVudHNfZnJvbV9sbXMsXG4gICAgICAnY29yZSc6IHRoaXMuY29yZSxcbiAgICAgICdvYmplY3RpdmVzJzogdGhpcy5vYmplY3RpdmVzLFxuICAgICAgJ3N0dWRlbnRfZGF0YSc6IHRoaXMuc3R1ZGVudF9kYXRhLFxuICAgICAgJ3N0dWRlbnRfcHJlZmVyZW5jZSc6IHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlLFxuICAgICAgJ2ludGVyYWN0aW9ucyc6IHRoaXMuaW50ZXJhY3Rpb25zLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI192ZXJzaW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBfdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX3ZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX3ZlcnNpb24uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX3ZlcnNpb25cbiAgICovXG4gIHNldCBfdmVyc2lvbihfdmVyc2lvbikge1xuICAgIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI192ZXJzaW9uLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdXNwZW5kX2RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N1c3BlbmRfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdXNwZW5kX2RhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1c3BlbmRfZGF0YVxuICAgKi9cbiAgc2V0IHN1c3BlbmRfZGF0YShzdXNwZW5kX2RhdGEpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHN1c3BlbmRfZGF0YSwgcmVnZXguQ01JU3RyaW5nNDA5NikpIHtcbiAgICAgIHRoaXMuI3N1c3BlbmRfZGF0YSA9IHN1c3BlbmRfZGF0YTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGF1bmNoX2RhdGFcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhdW5jaF9kYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXVuY2hfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYXVuY2hfZGF0YS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYXVuY2hfZGF0YVxuICAgKi9cbiAgc2V0IGxhdW5jaF9kYXRhKGxhdW5jaF9kYXRhKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNsYXVuY2hfZGF0YSA9IGxhdW5jaF9kYXRhIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29tbWVudHNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21tZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb21tZW50c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudHNcbiAgICovXG4gIHNldCBjb21tZW50cyhjb21tZW50cykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoY29tbWVudHMsIHJlZ2V4LkNNSVN0cmluZzQwOTYpKSB7XG4gICAgICB0aGlzLiNjb21tZW50cyA9IGNvbW1lbnRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21tZW50c19mcm9tX2xtc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29tbWVudHNfZnJvbV9sbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbW1lbnRzX2Zyb21fbG1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbW1lbnRzX2Zyb21fbG1zLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRzX2Zyb21fbG1zXG4gICAqL1xuICBzZXQgY29tbWVudHNfZnJvbV9sbXMoY29tbWVudHNfZnJvbV9sbXMpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI2NvbW1lbnRzX2Zyb21fbG1zID0gY29tbWVudHNfZnJvbV9sbXMgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBjdXJyZW50IHNlc3Npb24gdGltZSB0byB0aGUgZXhpc3RpbmcgdG90YWwgdGltZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0Q3VycmVudFRvdGFsVGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmdldEN1cnJlbnRUb3RhbFRpbWUoKTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgY21pLmNvcmUgb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmNsYXNzIENNSUNvcmUgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuY29yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc2NvcmUgPSBuZXcgQ01JU2NvcmUoXG4gICAgICAgIHtcbiAgICAgICAgICBzY29yZV9jaGlsZHJlbjogY29uc3RhbnRzLnNjb3JlX2NoaWxkcmVuLFxuICAgICAgICAgIHNjb3JlX3JhbmdlOiByZWdleC5zY29yZV9yYW5nZSxcbiAgICAgICAgICBpbnZhbGlkRXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgICAgIGludmFsaWRUeXBlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zY29yZT8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI19jaGlsZHJlbiA9IGNvbnN0YW50cy5jb3JlX2NoaWxkcmVuO1xuICAjc3R1ZGVudF9pZCA9ICcnO1xuICAjc3R1ZGVudF9uYW1lID0gJyc7XG4gICNsZXNzb25fbG9jYXRpb24gPSAnJztcbiAgI2NyZWRpdCA9ICcnO1xuICAjbGVzc29uX3N0YXR1cyA9ICdub3QgYXR0ZW1wdGVkJztcbiAgI2VudHJ5ID0gJyc7XG4gICN0b3RhbF90aW1lID0gJyc7XG4gICNsZXNzb25fbW9kZSA9ICdub3JtYWwnO1xuICAjZXhpdCA9ICcnO1xuICAjc2Vzc2lvbl90aW1lID0gJzAwOjAwOjAwJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdHVkZW50X2lkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdHVkZW50X2lkKCkge1xuICAgIHJldHVybiB0aGlzLiNzdHVkZW50X2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0dWRlbnRfaWQuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9pZFxuICAgKi9cbiAgc2V0IHN0dWRlbnRfaWQoc3R1ZGVudF9pZCkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jc3R1ZGVudF9pZCA9IHN0dWRlbnRfaWQgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdHVkZW50X25hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN0dWRlbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3R1ZGVudF9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0dWRlbnRfbmFtZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHVkZW50X25hbWVcbiAgICovXG4gIHNldCBzdHVkZW50X25hbWUoc3R1ZGVudF9uYW1lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNzdHVkZW50X25hbWUgPSBzdHVkZW50X25hbWUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZXNzb25fbG9jYXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxlc3Nvbl9sb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVzc29uX2xvY2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlc3Nvbl9sb2NhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVzc29uX2xvY2F0aW9uXG4gICAqL1xuICBzZXQgbGVzc29uX2xvY2F0aW9uKGxlc3Nvbl9sb2NhdGlvbikge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGVzc29uX2xvY2F0aW9uLCByZWdleC5DTUlTdHJpbmcyNTYpKSB7XG4gICAgICB0aGlzLiNsZXNzb25fbG9jYXRpb24gPSBsZXNzb25fbG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NyZWRpdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY3JlZGl0KCkge1xuICAgIHJldHVybiB0aGlzLiNjcmVkaXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY3JlZGl0LiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNyZWRpdFxuICAgKi9cbiAgc2V0IGNyZWRpdChjcmVkaXQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2NyZWRpdCA9IGNyZWRpdCA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xlc3Nvbl9zdGF0dXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxlc3Nvbl9zdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlc3Nvbl9zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGVzc29uX3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVzc29uX3N0YXR1c1xuICAgKi9cbiAgc2V0IGxlc3Nvbl9zdGF0dXMobGVzc29uX3N0YXR1cykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGVzc29uX3N0YXR1cywgcmVnZXguQ01JU3RhdHVzKSkge1xuICAgICAgdGhpcy4jbGVzc29uX3N0YXR1cyA9IGxlc3Nvbl9zdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2VudHJ5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBlbnRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZW50cnkuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW50cnlcbiAgICovXG4gIHNldCBlbnRyeShlbnRyeSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jZW50cnkgPSBlbnRyeSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RvdGFsX3RpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRvdGFsX3RpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RvdGFsX3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdG90YWxfdGltZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3RhbF90aW1lXG4gICAqL1xuICBzZXQgdG90YWxfdGltZSh0b3RhbF90aW1lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiN0b3RhbF90aW1lID0gdG90YWxfdGltZSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xlc3Nvbl9tb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZXNzb25fbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVzc29uX21vZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGVzc29uX21vZGUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVzc29uX21vZGVcbiAgICovXG4gIHNldCBsZXNzb25fbW9kZShsZXNzb25fbW9kZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jbGVzc29uX21vZGUgPSBsZXNzb25fbW9kZSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2V4aXQuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgZXhpdCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jZXhpdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNleGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleGl0XG4gICAqL1xuICBzZXQgZXhpdChleGl0KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChleGl0LCByZWdleC5DTUlFeGl0KSkge1xuICAgICAgdGhpcy4jZXhpdCA9IGV4aXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Nlc3Npb25fdGltZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBzZXNzaW9uX3RpbWUoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3Nlc3Npb25fdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzZXNzaW9uX3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25fdGltZVxuICAgKi9cbiAgc2V0IHNlc3Npb25fdGltZShzZXNzaW9uX3RpbWUpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHNlc3Npb25fdGltZSwgcmVnZXguQ01JVGltZXNwYW4pKSB7XG4gICAgICB0aGlzLiNzZXNzaW9uX3RpbWUgPSBzZXNzaW9uX3RpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0aW1lIHRvIHRoZSBleGlzdGluZyB0b3RhbCB0aW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRDdXJyZW50VG90YWxUaW1lKCkge1xuICAgIHJldHVybiBVdGlsaXRpZXMuYWRkSEhNTVNTVGltZVN0cmluZ3MoXG4gICAgICAgIHRoaXMuI3RvdGFsX3RpbWUsXG4gICAgICAgIHRoaXMuI3Nlc3Npb25fdGltZSxcbiAgICAgICAgbmV3IFJlZ0V4cChzY29ybTEyX3JlZ2V4LkNNSVRpbWVzcGFuKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuY29yZVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHN0dWRlbnRfbmFtZTogc3RyaW5nLFxuICAgKiAgICAgIGVudHJ5OiBzdHJpbmcsXG4gICAqICAgICAgZXhpdDogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBDTUlTY29yZSxcbiAgICogICAgICBzdHVkZW50X2lkOiBzdHJpbmcsXG4gICAqICAgICAgbGVzc29uX21vZGU6IHN0cmluZyxcbiAgICogICAgICBsZXNzb25fbG9jYXRpb246IHN0cmluZyxcbiAgICogICAgICBsZXNzb25fc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgY3JlZGl0OiBzdHJpbmcsXG4gICAqICAgICAgdG90YWxfdGltZTogc3RyaW5nLFxuICAgKiAgICAgIHNlc3Npb25fdGltZTogKlxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnc3R1ZGVudF9pZCc6IHRoaXMuc3R1ZGVudF9pZCxcbiAgICAgICdzdHVkZW50X25hbWUnOiB0aGlzLnN0dWRlbnRfbmFtZSxcbiAgICAgICdsZXNzb25fbG9jYXRpb24nOiB0aGlzLmxlc3Nvbl9sb2NhdGlvbixcbiAgICAgICdjcmVkaXQnOiB0aGlzLmNyZWRpdCxcbiAgICAgICdsZXNzb25fc3RhdHVzJzogdGhpcy5sZXNzb25fc3RhdHVzLFxuICAgICAgJ2VudHJ5JzogdGhpcy5lbnRyeSxcbiAgICAgICd0b3RhbF90aW1lJzogdGhpcy50b3RhbF90aW1lLFxuICAgICAgJ2xlc3Nvbl9tb2RlJzogdGhpcy5sZXNzb25fbW9kZSxcbiAgICAgICdleGl0JzogdGhpcy5leGl0LFxuICAgICAgJ3Nlc3Npb25fdGltZSc6IHRoaXMuc2Vzc2lvbl90aW1lLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkub2JqZWN0aXZlcyBvYmplY3RcbiAqIEBleHRlbmRzIENNSUFycmF5XG4gKi9cbmNsYXNzIENNSU9iamVjdGl2ZXMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLm9iamVjdGl2ZXNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBjb25zdGFudHMub2JqZWN0aXZlc19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuc3R1ZGVudF9kYXRhIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JU3R1ZGVudERhdGEgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI19jaGlsZHJlbjtcbiAgI21hc3Rlcnlfc2NvcmUgPSAnJztcbiAgI21heF90aW1lX2FsbG93ZWQgPSAnJztcbiAgI3RpbWVfbGltaXRfYWN0aW9uID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuc3R1ZGVudF9kYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHVkZW50X2RhdGFfY2hpbGRyZW5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHN0dWRlbnRfZGF0YV9jaGlsZHJlbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBzdHVkZW50X2RhdGFfY2hpbGRyZW4gP1xuICAgICAgICBzdHVkZW50X2RhdGFfY2hpbGRyZW4gOlxuICAgICAgICBjb25zdGFudHMuc3R1ZGVudF9kYXRhX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI19jaGlsZHJlblxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21hc3Rlcl9zY29yZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWFzdGVyeV9zY29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbWFzdGVyeV9zY29yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtYXN0ZXJfc2NvcmUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFzdGVyeV9zY29yZVxuICAgKi9cbiAgc2V0IG1hc3Rlcnlfc2NvcmUobWFzdGVyeV9zY29yZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jbWFzdGVyeV9zY29yZSA9IG1hc3Rlcnlfc2NvcmUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtYXhfdGltZV9hbGxvd2VkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtYXhfdGltZV9hbGxvd2VkKCkge1xuICAgIHJldHVybiB0aGlzLiNtYXhfdGltZV9hbGxvd2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21heF90aW1lX2FsbG93ZWQuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4X3RpbWVfYWxsb3dlZFxuICAgKi9cbiAgc2V0IG1heF90aW1lX2FsbG93ZWQobWF4X3RpbWVfYWxsb3dlZCkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jbWF4X3RpbWVfYWxsb3dlZCA9IG1heF90aW1lX2FsbG93ZWQgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lX2xpbWl0X2FjdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZV9saW1pdF9hY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWVfbGltaXRfYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVfbGltaXRfYWN0aW9uLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVfbGltaXRfYWN0aW9uXG4gICAqL1xuICBzZXQgdGltZV9saW1pdF9hY3Rpb24odGltZV9saW1pdF9hY3Rpb24pIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3RpbWVfbGltaXRfYWN0aW9uID0gdGltZV9saW1pdF9hY3Rpb24gOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X2RhdGFcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBtYXhfdGltZV9hbGxvd2VkOiBzdHJpbmcsXG4gICAqICAgICAgdGltZV9saW1pdF9hY3Rpb246IHN0cmluZyxcbiAgICogICAgICBtYXN0ZXJ5X3Njb3JlOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ21hc3Rlcnlfc2NvcmUnOiB0aGlzLm1hc3Rlcnlfc2NvcmUsXG4gICAgICAnbWF4X3RpbWVfYWxsb3dlZCc6IHRoaXMubWF4X3RpbWVfYWxsb3dlZCxcbiAgICAgICd0aW1lX2xpbWl0X2FjdGlvbic6IHRoaXMudGltZV9saW1pdF9hY3Rpb24sXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLnN0dWRlbnRfcHJlZmVyZW5jZSBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuY2xhc3MgQ01JU3R1ZGVudFByZWZlcmVuY2UgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuc3R1ZGVudF9wcmVmZXJlbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgI19jaGlsZHJlbiA9IGNvbnN0YW50cy5zdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW47XG4gICNhdWRpbyA9ICcnO1xuICAjbGFuZ3VhZ2UgPSAnJztcbiAgI3NwZWVkID0gJyc7XG4gICN0ZXh0ID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI19jaGlsZHJlblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjYXVkaW9cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGF1ZGlvKCkge1xuICAgIHJldHVybiB0aGlzLiNhdWRpbztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNhdWRpb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXVkaW9cbiAgICovXG4gIHNldCBhdWRpbyhhdWRpbykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoYXVkaW8sIHJlZ2V4LkNNSVNJbnRlZ2VyKSAmJlxuICAgICAgICBjaGVjazEyVmFsaWRSYW5nZShhdWRpbywgcmVnZXguYXVkaW9fcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNhdWRpbyA9IGF1ZGlvO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYW5ndWFnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGFuZ3VhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhbmd1YWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhbmd1YWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuICAgKi9cbiAgc2V0IGxhbmd1YWdlKGxhbmd1YWdlKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChsYW5ndWFnZSwgcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jbGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3BlZWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHNwZWVkKCkge1xuICAgIHJldHVybiB0aGlzLiNzcGVlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzcGVlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3BlZWRcbiAgICovXG4gIHNldCBzcGVlZChzcGVlZCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc3BlZWQsIHJlZ2V4LkNNSVNJbnRlZ2VyKSAmJlxuICAgICAgICBjaGVjazEyVmFsaWRSYW5nZShzcGVlZCwgcmVnZXguc3BlZWRfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNzcGVlZCA9IHNwZWVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0ZXh0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICovXG4gIHNldCB0ZXh0KHRleHQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHRleHQsIHJlZ2V4LkNNSVNJbnRlZ2VyKSAmJlxuICAgICAgICBjaGVjazEyVmFsaWRSYW5nZSh0ZXh0LCByZWdleC50ZXh0X3JhbmdlKSkge1xuICAgICAgdGhpcy4jdGV4dCA9IHRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLnN0dWRlbnRfcHJlZmVyZW5jZVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGF1ZGlvOiBzdHJpbmcsXG4gICAqICAgICAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgICogICAgICBzcGVlZDogc3RyaW5nLFxuICAgKiAgICAgIHRleHQ6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnYXVkaW8nOiB0aGlzLmF1ZGlvLFxuICAgICAgJ2xhbmd1YWdlJzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICdzcGVlZCc6IHRoaXMuc3BlZWQsXG4gICAgICAndGV4dCc6IHRoaXMudGV4dCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuaW50ZXJhY3Rpb25zIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5jbGFzcyBDTUlJbnRlcmFjdGlvbnMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgY2hpbGRyZW46IGNvbnN0YW50cy5pbnRlcmFjdGlvbnNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLmludGVyYWN0aW9ucy5uIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9ucy5uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub2JqZWN0aXZlcyA9IG5ldyBDTUlBcnJheSh7XG4gICAgICBlcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICBjaGlsZHJlbjogY29uc3RhbnRzLm9iamVjdGl2ZXNfY2hpbGRyZW4sXG4gICAgfSk7XG4gICAgdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcyA9IG5ldyBDTUlBcnJheSh7XG4gICAgICBlcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICBjaGlsZHJlbjogY29uc3RhbnRzLmNvcnJlY3RfcmVzcG9uc2VzX2NoaWxkcmVuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLm9iamVjdGl2ZXM/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvcnJlY3RfcmVzcG9uc2VzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjaWQgPSAnJztcbiAgI3RpbWUgPSAnJztcbiAgI3R5cGUgPSAnJztcbiAgI3dlaWdodGluZyA9ICcnO1xuICAjc3R1ZGVudF9yZXNwb25zZSA9ICcnO1xuICAjcmVzdWx0ID0gJyc7XG4gICNsYXRlbmN5ID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICovXG4gIHNldCBpZChpZCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoaWQsIHJlZ2V4LkNNSUlkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLiNpZCA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHRpbWUoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVxuICAgKi9cbiAgc2V0IHRpbWUodGltZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQodGltZSwgcmVnZXguQ01JVGltZSkpIHtcbiAgICAgIHRoaXMuI3RpbWUgPSB0aW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0eXBlLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3R5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKi9cbiAgc2V0IHR5cGUodHlwZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQodHlwZSwgcmVnZXguQ01JVHlwZSkpIHtcbiAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN3ZWlnaHRpbmcuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgd2VpZ2h0aW5nKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgP1xuICAgICAgICB0aHJvd1dyaXRlT25seUVycm9yKCkgOlxuICAgICAgICB0aGlzLiN3ZWlnaHRpbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjd2VpZ2h0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3ZWlnaHRpbmdcbiAgICovXG4gIHNldCB3ZWlnaHRpbmcod2VpZ2h0aW5nKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdCh3ZWlnaHRpbmcsIHJlZ2V4LkNNSURlY2ltYWwpICYmXG4gICAgICAgIGNoZWNrMTJWYWxpZFJhbmdlKHdlaWdodGluZywgcmVnZXgud2VpZ2h0aW5nX3JhbmdlKSkge1xuICAgICAgdGhpcy4jd2VpZ2h0aW5nID0gd2VpZ2h0aW5nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdHVkZW50X3Jlc3BvbnNlLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHN0dWRlbnRfcmVzcG9uc2UoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3N0dWRlbnRfcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3R1ZGVudF9yZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9yZXNwb25zZVxuICAgKi9cbiAgc2V0IHN0dWRlbnRfcmVzcG9uc2Uoc3R1ZGVudF9yZXNwb25zZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc3R1ZGVudF9yZXNwb25zZSwgcmVnZXguQ01JRmVlZGJhY2ssIHRydWUpKSB7XG4gICAgICB0aGlzLiNzdHVkZW50X3Jlc3BvbnNlID0gc3R1ZGVudF9yZXNwb25zZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcmVzdWx0LiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHJlc3VsdCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Jlc3VsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzdWx0XG4gICAqL1xuICBzZXQgcmVzdWx0KHJlc3VsdCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQocmVzdWx0LCByZWdleC5DTUlSZXN1bHQpKSB7XG4gICAgICB0aGlzLiNyZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhdGVuY3kuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgbGF0ZW5jeSgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jbGF0ZW5jeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYXRlbmN5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYXRlbmN5XG4gICAqL1xuICBzZXQgbGF0ZW5jeShsYXRlbmN5KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChsYXRlbmN5LCByZWdleC5DTUlUaW1lc3BhbikpIHtcbiAgICAgIHRoaXMuI2xhdGVuY3kgPSBsYXRlbmN5O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5pbnRlcmFjdGlvbnMublxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmcsXG4gICAqICAgICAgdGltZTogc3RyaW5nLFxuICAgKiAgICAgIHR5cGU6IHN0cmluZyxcbiAgICogICAgICB3ZWlnaHRpbmc6IHN0cmluZyxcbiAgICogICAgICBzdHVkZW50X3Jlc3BvbnNlOiBzdHJpbmcsXG4gICAqICAgICAgcmVzdWx0OiBzdHJpbmcsXG4gICAqICAgICAgbGF0ZW5jeTogc3RyaW5nLFxuICAgKiAgICAgIG9iamVjdGl2ZXM6IENNSUFycmF5LFxuICAgKiAgICAgIGNvcnJlY3RfcmVzcG9uc2VzOiBDTUlBcnJheVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgICAgJ3RpbWUnOiB0aGlzLnRpbWUsXG4gICAgICAndHlwZSc6IHRoaXMudHlwZSxcbiAgICAgICd3ZWlnaHRpbmcnOiB0aGlzLndlaWdodGluZyxcbiAgICAgICdzdHVkZW50X3Jlc3BvbnNlJzogdGhpcy5zdHVkZW50X3Jlc3BvbnNlLFxuICAgICAgJ3Jlc3VsdCc6IHRoaXMucmVzdWx0LFxuICAgICAgJ2xhdGVuY3knOiB0aGlzLmxhdGVuY3ksXG4gICAgICAnb2JqZWN0aXZlcyc6IHRoaXMub2JqZWN0aXZlcyxcbiAgICAgICdjb3JyZWN0X3Jlc3BvbnNlcyc6IHRoaXMuY29ycmVjdF9yZXNwb25zZXMsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLm9iamVjdGl2ZXMubiBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSU9iamVjdGl2ZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkub2JqZWN0aXZlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zY29yZSA9IG5ldyBDTUlTY29yZShcbiAgICAgICAge1xuICAgICAgICAgIHNjb3JlX2NoaWxkcmVuOiBjb25zdGFudHMuc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgICAgc2NvcmVfcmFuZ2U6IHJlZ2V4LnNjb3JlX3JhbmdlLFxuICAgICAgICAgIGludmFsaWRFcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICAgICAgaW52YWxpZFR5cGVDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gsXG4gICAgICAgICAgaW52YWxpZFJhbmdlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsXG4gICAgICAgIH0pO1xuICB9XG5cbiAgI2lkID0gJyc7XG4gICNzdGF0dXMgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaWRcbiAgICogQHJldHVybiB7XCJcIn1cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGlkLCByZWdleC5DTUlJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3RhdHVzXG4gICAqIEByZXR1cm4ge1wiXCJ9XG4gICAqL1xuICBnZXQgc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0dXNcbiAgICovXG4gIHNldCBzdGF0dXMoc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzdGF0dXMsIHJlZ2V4LkNNSVN0YXR1czIpKSB7XG4gICAgICB0aGlzLiNzdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLm9iamVjdGl2ZXMublxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmcsXG4gICAqICAgICAgc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgc2NvcmU6IENNSVNjb3JlXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAnc3RhdHVzJzogdGhpcy5zdGF0dXMsXG4gICAgICAnc2NvcmUnOiB0aGlzLnNjb3JlLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5pbnRlcmFjdGlvbnMubi5vYmplY3RpdmVzLm4gb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNPYmplY3RpdmVzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNpZCA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZFxuICAgKiBAcmV0dXJuIHtcIlwifVxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICovXG4gIHNldCBpZChpZCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoaWQsIHJlZ2V4LkNNSUlkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLiNpZCA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5pbnRlcmFjdGlvbnMubi5vYmplY3RpdmVzLm5cbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBpZDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLmludGVyYWN0aW9ucy5jb3JyZWN0X3Jlc3BvbnNlcy5uIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zQ29ycmVjdFJlc3BvbnNlc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMuY29ycmVjdF9yZXNwb25zZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNwYXR0ZXJuID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3BhdHRlcm5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHBhdHRlcm4oKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3BhdHRlcm47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcGF0dGVyblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuICAgKi9cbiAgc2V0IHBhdHRlcm4ocGF0dGVybikge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQocGF0dGVybiwgcmVnZXguQ01JRmVlZGJhY2ssIHRydWUpKSB7XG4gICAgICB0aGlzLiNwYXR0ZXJuID0gcGF0dGVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLmNvcnJlY3RfcmVzcG9uc2VzLm5cbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBwYXR0ZXJuOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3BhdHRlcm4nOiB0aGlzLnBhdHRlcm4sXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgQUlDQyBOYXZpZ2F0aW9uIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgTkFWIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgTkFWIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNldmVudCA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNldmVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZXZlbnQoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI2V2ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2V2ZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKi9cbiAgc2V0IGV2ZW50KGV2ZW50KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChldmVudCwgcmVnZXguTkFWRXZlbnQpKSB7XG4gICAgICB0aGlzLiNldmVudCA9IGV2ZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIG5hdiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBldmVudDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdldmVudCc6IHRoaXMuZXZlbnQsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge1xuICBCYXNlQ01JLFxuICBjaGVja1ZhbGlkRm9ybWF0LFxuICBjaGVja1ZhbGlkUmFuZ2UsXG4gIENNSUFycmF5LFxuICBDTUlTY29yZSxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtzY29ybTIwMDRfY29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQge3Njb3JtMjAwNF9yZWdleH0gZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCB7c2Nvcm0yMDA0X2Vycm9yX2NvZGVzfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IHtsZWFybmVyX3Jlc3BvbnNlc30gZnJvbSAnLi4vY29uc3RhbnRzL3Jlc3BvbnNlX2NvbnN0YW50cyc7XG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcn0gZnJvbSAnLi4vZXhjZXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBVdGlsIGZyb20gJy4uL3V0aWxpdGllcyc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IHNjb3JtMjAwNF9jb25zdGFudHM7XG5jb25zdCByZWdleCA9IHNjb3JtMjAwNF9yZWdleDtcblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBSZWFkIE9ubHkgZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dSZWFkT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgV3JpdGUgT25seSBlcnJvclxuICovXG5mdW5jdGlvbiB0aHJvd1dyaXRlT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5XUklURV9PTkxZX0VMRU1FTlQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFR5cGUgTWlzbWF0Y2ggZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCwgbm8gcmVhc29uIHRvIGhhdmUgdG8gcGFzcyB0aGUgc2FtZSBlcnJvciBjb2RlcyBldmVyeSB0aW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnZXhQYXR0ZXJuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RW1wdHlTdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNoZWNrMjAwNFZhbGlkRm9ybWF0KFxuICAgIHZhbHVlOiBTdHJpbmcsXG4gICAgcmVnZXhQYXR0ZXJuOiBTdHJpbmcsXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGNoZWNrVmFsaWRGb3JtYXQodmFsdWUsIHJlZ2V4UGF0dGVybixcbiAgICAgIHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILCBhbGxvd0VtcHR5U3RyaW5nKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kLCBubyByZWFzb24gdG8gaGF2ZSB0byBwYXNzIHRoZSBzYW1lIGVycm9yIGNvZGVzIGV2ZXJ5IHRpbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByYW5nZVBhdHRlcm5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNoZWNrMjAwNFZhbGlkUmFuZ2UodmFsdWU6IGFueSwgcmFuZ2VQYXR0ZXJuOiBTdHJpbmcpIHtcbiAgcmV0dXJuIGNoZWNrVmFsaWRSYW5nZSh2YWx1ZSwgcmFuZ2VQYXR0ZXJuLFxuICAgICAgc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRSk7XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGNtaSBvYmplY3QgZm9yIFNDT1JNIDIwMDRcbiAqL1xuZXhwb3J0IGNsYXNzIENNSSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBTQ09STSAyMDA0IGNtaSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0aWFsaXplZFxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5sZWFybmVyX3ByZWZlcmVuY2UgPSBuZXcgQ01JTGVhcm5lclByZWZlcmVuY2UoKTtcbiAgICB0aGlzLnNjb3JlID0gbmV3IFNjb3JtMjAwNENNSVNjb3JlKCk7XG4gICAgdGhpcy5jb21tZW50c19mcm9tX2xlYXJuZXIgPSBuZXcgQ01JQ29tbWVudHNGcm9tTGVhcm5lcigpO1xuICAgIHRoaXMuY29tbWVudHNfZnJvbV9sbXMgPSBuZXcgQ01JQ29tbWVudHNGcm9tTE1TKCk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbnMgPSBuZXcgQ01JSW50ZXJhY3Rpb25zKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzID0gbmV3IENNSU9iamVjdGl2ZXMoKTtcblxuICAgIGlmIChpbml0aWFsaXplZCkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjX3ZlcnNpb24gPSAnMS4wJztcbiAgI19jaGlsZHJlbiA9IGNvbnN0YW50cy5jbWlfY2hpbGRyZW47XG4gICNjb21wbGV0aW9uX3N0YXR1cyA9ICd1bmtub3duJztcbiAgI2NvbXBsZXRpb25fdGhyZXNob2xkID0gJyc7XG4gICNjcmVkaXQgPSAnY3JlZGl0JztcbiAgI2VudHJ5ID0gJyc7XG4gICNleGl0ID0gJyc7XG4gICNsYXVuY2hfZGF0YSA9ICcnO1xuICAjbGVhcm5lcl9pZCA9ICcnO1xuICAjbGVhcm5lcl9uYW1lID0gJyc7XG4gICNsb2NhdGlvbiA9ICcnO1xuICAjbWF4X3RpbWVfYWxsb3dlZCA9ICcnO1xuICAjbW9kZSA9ICdub3JtYWwnO1xuICAjcHJvZ3Jlc3NfbWVhc3VyZSA9ICcnO1xuICAjc2NhbGVkX3Bhc3Npbmdfc2NvcmUgPSAnJztcbiAgI3Nlc3Npb25fdGltZSA9ICdQVDBIME0wUyc7XG4gICNzdWNjZXNzX3N0YXR1cyA9ICd1bmtub3duJztcbiAgI3N1c3BlbmRfZGF0YSA9ICcnO1xuICAjdGltZV9saW1pdF9hY3Rpb24gPSAnY29udGludWUsbm8gbWVzc2FnZSc7XG4gICN0b3RhbF90aW1lID0gJzAnO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5sZWFybmVyX3ByZWZlcmVuY2U/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnNjb3JlPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb21tZW50c19mcm9tX2xlYXJuZXI/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvbW1lbnRzX2Zyb21fbG1zPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbnM/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLm9iamVjdGl2ZXM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfdmVyc2lvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX3ZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI192ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI192ZXJzaW9uLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF92ZXJzaW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX3ZlcnNpb24oX3ZlcnNpb24pIHtcbiAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29tcGxldGlvbl9zdGF0dXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbXBsZXRpb25fc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wbGV0aW9uX3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb21wbGV0aW9uX3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tcGxldGlvbl9zdGF0dXNcbiAgICovXG4gIHNldCBjb21wbGV0aW9uX3N0YXR1cyhjb21wbGV0aW9uX3N0YXR1cykge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChjb21wbGV0aW9uX3N0YXR1cywgcmVnZXguQ01JQ1N0YXR1cykpIHtcbiAgICAgIHRoaXMuI2NvbXBsZXRpb25fc3RhdHVzID0gY29tcGxldGlvbl9zdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbXBsZXRpb25fdGhyZXNob2xkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21wbGV0aW9uX3RocmVzaG9sZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcGxldGlvbl90aHJlc2hvbGQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tcGxldGlvbl90aHJlc2hvbGQuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tcGxldGlvbl90aHJlc2hvbGRcbiAgICovXG4gIHNldCBjb21wbGV0aW9uX3RocmVzaG9sZChjb21wbGV0aW9uX3RocmVzaG9sZCkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jY29tcGxldGlvbl90aHJlc2hvbGQgPSBjb21wbGV0aW9uX3RocmVzaG9sZCA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NyZWRpdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY3JlZGl0KCkge1xuICAgIHJldHVybiB0aGlzLiNjcmVkaXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY3JlZGl0LiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNyZWRpdFxuICAgKi9cbiAgc2V0IGNyZWRpdChjcmVkaXQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2NyZWRpdCA9IGNyZWRpdCA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2VudHJ5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBlbnRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZW50cnkuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW50cnlcbiAgICovXG4gIHNldCBlbnRyeShlbnRyeSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jZW50cnkgPSBlbnRyeSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2V4aXQuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBleGl0KCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNleGl0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2V4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4aXRcbiAgICovXG4gIHNldCBleGl0KGV4aXQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoZXhpdCwgcmVnZXguQ01JRXhpdCkpIHtcbiAgICAgIHRoaXMuI2V4aXQgPSBleGl0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYXVuY2hfZGF0YVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGF1bmNoX2RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhdW5jaF9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhdW5jaF9kYXRhLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhdW5jaF9kYXRhXG4gICAqL1xuICBzZXQgbGF1bmNoX2RhdGEobGF1bmNoX2RhdGEpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2xhdW5jaF9kYXRhID0gbGF1bmNoX2RhdGEgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZWFybmVyX2lkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZWFybmVyX2lkKCkge1xuICAgIHJldHVybiB0aGlzLiNsZWFybmVyX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlYXJuZXJfaWQuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVhcm5lcl9pZFxuICAgKi9cbiAgc2V0IGxlYXJuZXJfaWQobGVhcm5lcl9pZCkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jbGVhcm5lcl9pZCA9IGxlYXJuZXJfaWQgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZWFybmVyX25hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxlYXJuZXJfbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVhcm5lcl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlYXJuZXJfbmFtZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZWFybmVyX25hbWVcbiAgICovXG4gIHNldCBsZWFybmVyX25hbWUobGVhcm5lcl9uYW1lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNsZWFybmVyX25hbWUgPSBsZWFybmVyX25hbWUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsb2NhdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xvY2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xvY2F0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICAgKi9cbiAgc2V0IGxvY2F0aW9uKGxvY2F0aW9uKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGxvY2F0aW9uLCByZWdleC5DTUlTdHJpbmcxMDAwKSkge1xuICAgICAgdGhpcy4jbG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbWF4X3RpbWVfYWxsb3dlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWF4X3RpbWVfYWxsb3dlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X3RpbWVfYWxsb3dlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtYXhfdGltZV9hbGxvd2VkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heF90aW1lX2FsbG93ZWRcbiAgICovXG4gIHNldCBtYXhfdGltZV9hbGxvd2VkKG1heF90aW1lX2FsbG93ZWQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI21heF90aW1lX2FsbG93ZWQgPSBtYXhfdGltZV9hbGxvd2VkIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbW9kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtb2RlLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVcbiAgICovXG4gIHNldCBtb2RlKG1vZGUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI21vZGUgPSBtb2RlIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcHJvZ3Jlc3NfbWVhc3VyZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcHJvZ3Jlc3NfbWVhc3VyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNwcm9ncmVzc19tZWFzdXJlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9ncmVzc19tZWFzdXJlXG4gICAqL1xuICBzZXQgcHJvZ3Jlc3NfbWVhc3VyZShwcm9ncmVzc19tZWFzdXJlKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHByb2dyZXNzX21lYXN1cmUsIHJlZ2V4LkNNSURlY2ltYWwpICYmXG4gICAgICAgIGNoZWNrMjAwNFZhbGlkUmFuZ2UocHJvZ3Jlc3NfbWVhc3VyZSwgcmVnZXgucHJvZ3Jlc3NfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNwcm9ncmVzc19tZWFzdXJlID0gcHJvZ3Jlc3NfbWVhc3VyZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc2NhbGVkX3Bhc3Npbmdfc2NvcmVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHNjYWxlZF9wYXNzaW5nX3Njb3JlKCkge1xuICAgIHJldHVybiB0aGlzLiNzY2FsZWRfcGFzc2luZ19zY29yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzY2FsZWRfcGFzc2luZ19zY29yZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2FsZWRfcGFzc2luZ19zY29yZVxuICAgKi9cbiAgc2V0IHNjYWxlZF9wYXNzaW5nX3Njb3JlKHNjYWxlZF9wYXNzaW5nX3Njb3JlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNzY2FsZWRfcGFzc2luZ19zY29yZSA9IHNjYWxlZF9wYXNzaW5nX3Njb3JlIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc2Vzc2lvbl90aW1lLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc2Vzc2lvbl90aW1lKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNzZXNzaW9uX3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2Vzc2lvbl90aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uX3RpbWVcbiAgICovXG4gIHNldCBzZXNzaW9uX3RpbWUoc2Vzc2lvbl90aW1lKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHNlc3Npb25fdGltZSwgcmVnZXguQ01JVGltZXNwYW4pKSB7XG4gICAgICB0aGlzLiNzZXNzaW9uX3RpbWUgPSBzZXNzaW9uX3RpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N1Y2Nlc3Nfc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdWNjZXNzX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3VjY2Vzc19zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3VjY2Vzc19zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3Nfc3RhdHVzXG4gICAqL1xuICBzZXQgc3VjY2Vzc19zdGF0dXMoc3VjY2Vzc19zdGF0dXMpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc3VjY2Vzc19zdGF0dXMsIHJlZ2V4LkNNSVNTdGF0dXMpKSB7XG4gICAgICB0aGlzLiNzdWNjZXNzX3N0YXR1cyA9IHN1Y2Nlc3Nfc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdXNwZW5kX2RhdGFcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN1c3BlbmRfZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3VzcGVuZF9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N1c3BlbmRfZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VzcGVuZF9kYXRhXG4gICAqL1xuICBzZXQgc3VzcGVuZF9kYXRhKHN1c3BlbmRfZGF0YSkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChzdXNwZW5kX2RhdGEsIHJlZ2V4LkNNSVN0cmluZzY0MDAwLCB0cnVlKSkge1xuICAgICAgdGhpcy4jc3VzcGVuZF9kYXRhID0gc3VzcGVuZF9kYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lX2xpbWl0X2FjdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZV9saW1pdF9hY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWVfbGltaXRfYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVfbGltaXRfYWN0aW9uLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVfbGltaXRfYWN0aW9uXG4gICAqL1xuICBzZXQgdGltZV9saW1pdF9hY3Rpb24odGltZV9saW1pdF9hY3Rpb24pIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3RpbWVfbGltaXRfYWN0aW9uID0gdGltZV9saW1pdF9hY3Rpb24gOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0b3RhbF90aW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0b3RhbF90aW1lKCkge1xuICAgIHJldHVybiB0aGlzLiN0b3RhbF90aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RvdGFsX3RpbWUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG90YWxfdGltZVxuICAgKi9cbiAgc2V0IHRvdGFsX3RpbWUodG90YWxfdGltZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jdG90YWxfdGltZSA9IHRvdGFsX3RpbWUgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBjdXJyZW50IHNlc3Npb24gdGltZSB0byB0aGUgZXhpc3RpbmcgdG90YWwgdGltZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBJU084NjAxIER1cmF0aW9uXG4gICAqL1xuICBnZXRDdXJyZW50VG90YWxUaW1lKCkge1xuICAgIHJldHVybiBVdGlsLmFkZFR3b0R1cmF0aW9ucyhcbiAgICAgICAgdGhpcy4jdG90YWxfdGltZSxcbiAgICAgICAgdGhpcy4jc2Vzc2lvbl90aW1lLFxuICAgICAgICBzY29ybTIwMDRfcmVnZXguQ01JVGltZXNwYW4sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGNvbW1lbnRzX2Zyb21fbGVhcm5lcjogQ01JQ29tbWVudHNGcm9tTGVhcm5lcixcbiAgICogICAgICBjb21tZW50c19mcm9tX2xtczogQ01JQ29tbWVudHNGcm9tTE1TLFxuICAgKiAgICAgIGNvbXBsZXRpb25fc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgY29tcGxldGlvbl90aHJlc2hvbGQ6IHN0cmluZyxcbiAgICogICAgICBjcmVkaXQ6IHN0cmluZyxcbiAgICogICAgICBlbnRyeTogc3RyaW5nLFxuICAgKiAgICAgIGV4aXQ6IHN0cmluZyxcbiAgICogICAgICBpbnRlcmFjdGlvbnM6IENNSUludGVyYWN0aW9ucyxcbiAgICogICAgICBsYXVuY2hfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIGxlYXJuZXJfaWQ6IHN0cmluZyxcbiAgICogICAgICBsZWFybmVyX25hbWU6IHN0cmluZyxcbiAgICogICAgICBsZWFybmVyX3ByZWZlcmVuY2U6IENNSUxlYXJuZXJQcmVmZXJlbmNlLFxuICAgKiAgICAgIGxvY2F0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgbWF4X3RpbWVfYWxsb3dlZDogc3RyaW5nLFxuICAgKiAgICAgIG1vZGU6IHN0cmluZyxcbiAgICogICAgICBvYmplY3RpdmVzOiBDTUlPYmplY3RpdmVzLFxuICAgKiAgICAgIHByb2dyZXNzX21lYXN1cmU6IHN0cmluZyxcbiAgICogICAgICBzY2FsZWRfcGFzc2luZ19zY29yZTogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBTY29ybTIwMDRDTUlTY29yZSxcbiAgICogICAgICBzZXNzaW9uX3RpbWU6IHN0cmluZyxcbiAgICogICAgICBzdWNjZXNzX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIHN1c3BlbmRfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVfbGltaXRfYWN0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgdG90YWxfdGltZTogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdjb21tZW50c19mcm9tX2xlYXJuZXInOiB0aGlzLmNvbW1lbnRzX2Zyb21fbGVhcm5lcixcbiAgICAgICdjb21tZW50c19mcm9tX2xtcyc6IHRoaXMuY29tbWVudHNfZnJvbV9sbXMsXG4gICAgICAnY29tcGxldGlvbl9zdGF0dXMnOiB0aGlzLmNvbXBsZXRpb25fc3RhdHVzLFxuICAgICAgJ2NvbXBsZXRpb25fdGhyZXNob2xkJzogdGhpcy5jb21wbGV0aW9uX3RocmVzaG9sZCxcbiAgICAgICdjcmVkaXQnOiB0aGlzLmNyZWRpdCxcbiAgICAgICdlbnRyeSc6IHRoaXMuZW50cnksXG4gICAgICAnZXhpdCc6IHRoaXMuZXhpdCxcbiAgICAgICdpbnRlcmFjdGlvbnMnOiB0aGlzLmludGVyYWN0aW9ucyxcbiAgICAgICdsYXVuY2hfZGF0YSc6IHRoaXMubGF1bmNoX2RhdGEsXG4gICAgICAnbGVhcm5lcl9pZCc6IHRoaXMubGVhcm5lcl9pZCxcbiAgICAgICdsZWFybmVyX25hbWUnOiB0aGlzLmxlYXJuZXJfbmFtZSxcbiAgICAgICdsZWFybmVyX3ByZWZlcmVuY2UnOiB0aGlzLmxlYXJuZXJfcHJlZmVyZW5jZSxcbiAgICAgICdsb2NhdGlvbic6IHRoaXMubG9jYXRpb24sXG4gICAgICAnbWF4X3RpbWVfYWxsb3dlZCc6IHRoaXMubWF4X3RpbWVfYWxsb3dlZCxcbiAgICAgICdtb2RlJzogdGhpcy5tb2RlLFxuICAgICAgJ29iamVjdGl2ZXMnOiB0aGlzLm9iamVjdGl2ZXMsXG4gICAgICAncHJvZ3Jlc3NfbWVhc3VyZSc6IHRoaXMucHJvZ3Jlc3NfbWVhc3VyZSxcbiAgICAgICdzY2FsZWRfcGFzc2luZ19zY29yZSc6IHRoaXMuc2NhbGVkX3Bhc3Npbmdfc2NvcmUsXG4gICAgICAnc2NvcmUnOiB0aGlzLnNjb3JlLFxuICAgICAgJ3Nlc3Npb25fdGltZSc6IHRoaXMuc2Vzc2lvbl90aW1lLFxuICAgICAgJ3N1Y2Nlc3Nfc3RhdHVzJzogdGhpcy5zdWNjZXNzX3N0YXR1cyxcbiAgICAgICdzdXNwZW5kX2RhdGEnOiB0aGlzLnN1c3BlbmRfZGF0YSxcbiAgICAgICd0aW1lX2xpbWl0X2FjdGlvbic6IHRoaXMudGltZV9saW1pdF9hY3Rpb24sXG4gICAgICAndG90YWxfdGltZSc6IHRoaXMudG90YWxfdGltZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBTQ09STSAyMDA0J3MgY21pLmxlYXJuZXJfcHJlZmVyZW5jZSBvYmplY3RcbiAqL1xuY2xhc3MgQ01JTGVhcm5lclByZWZlcmVuY2UgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI19jaGlsZHJlbiA9IGNvbnN0YW50cy5zdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW47XG4gICNhdWRpb19sZXZlbCA9ICcxJztcbiAgI2xhbmd1YWdlID0gJyc7XG4gICNkZWxpdmVyeV9zcGVlZCA9ICcxJztcbiAgI2F1ZGlvX2NhcHRpb25pbmcgPSAnMCc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkubGVhcm5lcl9wcmVmZXJlbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI19jaGlsZHJlblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNhdWRpb19sZXZlbFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXVkaW9fbGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2F1ZGlvX2xldmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2F1ZGlvX2xldmVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdWRpb19sZXZlbFxuICAgKi9cbiAgc2V0IGF1ZGlvX2xldmVsKGF1ZGlvX2xldmVsKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGF1ZGlvX2xldmVsLCByZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgICBjaGVjazIwMDRWYWxpZFJhbmdlKGF1ZGlvX2xldmVsLCByZWdleC5hdWRpb19yYW5nZSkpIHtcbiAgICAgIHRoaXMuI2F1ZGlvX2xldmVsID0gYXVkaW9fbGV2ZWw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhbmd1YWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsYW5ndWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFuZ3VhZ2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGFuZ3VhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlXG4gICAqL1xuICBzZXQgbGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQobGFuZ3VhZ2UsIHJlZ2V4LkNNSUxhbmcpKSB7XG4gICAgICB0aGlzLiNsYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNkZWxpdmVyeV9zcGVlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGVsaXZlcnlfc3BlZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGl2ZXJ5X3NwZWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2RlbGl2ZXJ5X3NwZWVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWxpdmVyeV9zcGVlZFxuICAgKi9cbiAgc2V0IGRlbGl2ZXJ5X3NwZWVkKGRlbGl2ZXJ5X3NwZWVkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGRlbGl2ZXJ5X3NwZWVkLCByZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgICBjaGVjazIwMDRWYWxpZFJhbmdlKGRlbGl2ZXJ5X3NwZWVkLCByZWdleC5zcGVlZF9yYW5nZSkpIHtcbiAgICAgIHRoaXMuI2RlbGl2ZXJ5X3NwZWVkID0gZGVsaXZlcnlfc3BlZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2F1ZGlvX2NhcHRpb25pbmdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGF1ZGlvX2NhcHRpb25pbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2F1ZGlvX2NhcHRpb25pbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjYXVkaW9fY2FwdGlvbmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXVkaW9fY2FwdGlvbmluZ1xuICAgKi9cbiAgc2V0IGF1ZGlvX2NhcHRpb25pbmcoYXVkaW9fY2FwdGlvbmluZykge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChhdWRpb19jYXB0aW9uaW5nLCByZWdleC5DTUlTSW50ZWdlcikgJiZcbiAgICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShhdWRpb19jYXB0aW9uaW5nLCByZWdleC50ZXh0X3JhbmdlKSkge1xuICAgICAgdGhpcy4jYXVkaW9fY2FwdGlvbmluZyA9IGF1ZGlvX2NhcHRpb25pbmc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmxlYXJuZXJfcHJlZmVyZW5jZVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGF1ZGlvX2xldmVsOiBzdHJpbmcsXG4gICAqICAgICAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgICogICAgICBkZWxpdmVyeV9zcGVlZDogc3RyaW5nLFxuICAgKiAgICAgIGF1ZGlvX2NhcHRpb25pbmc6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnYXVkaW9fbGV2ZWwnOiB0aGlzLmF1ZGlvX2xldmVsLFxuICAgICAgJ2xhbmd1YWdlJzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICdkZWxpdmVyeV9zcGVlZCc6IHRoaXMuZGVsaXZlcnlfc3BlZWQsXG4gICAgICAnYXVkaW9fY2FwdGlvbmluZyc6IHRoaXMuYXVkaW9fY2FwdGlvbmluZyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmludGVyYWN0aW9ucyBvYmplY3RcbiAqL1xuY2xhc3MgQ01JSW50ZXJhY3Rpb25zIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5vYmplY3RpdmVzIEFycmF5XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBjaGlsZHJlbjogY29uc3RhbnRzLmludGVyYWN0aW9uc19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkub2JqZWN0aXZlcyBvYmplY3RcbiAqL1xuY2xhc3MgQ01JT2JqZWN0aXZlcyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkub2JqZWN0aXZlcyBBcnJheVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgY2hpbGRyZW46IGNvbnN0YW50cy5vYmplY3RpdmVzX2NoaWxkcmVuLFxuICAgICAgZXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMjAwNCdzIGNtaS5jb21tZW50c19mcm9tX2xtcyBvYmplY3RcbiAqL1xuY2xhc3MgQ01JQ29tbWVudHNGcm9tTE1TIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5jb21tZW50c19mcm9tX2xtcyBBcnJheVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgY2hpbGRyZW46IGNvbnN0YW50cy5jb21tZW50c19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuY29tbWVudHNfZnJvbV9sZWFybmVyIG9iamVjdFxuICovXG5jbGFzcyBDTUlDb21tZW50c0Zyb21MZWFybmVyIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5jb21tZW50c19mcm9tX2xlYXJuZXIgQXJyYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBjb25zdGFudHMuY29tbWVudHNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBTQ09STSAyMDA0J3MgY21pLmludGVyYWN0aW9uLm4gb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2lkID0gJyc7XG4gICN0eXBlID0gJyc7XG4gICN0aW1lc3RhbXAgPSAnJztcbiAgI3dlaWdodGluZyA9ICcnO1xuICAjbGVhcm5lcl9yZXNwb25zZSA9ICcnO1xuICAjcmVzdWx0ID0gJyc7XG4gICNsYXRlbmN5ID0gJyc7XG4gICNkZXNjcmlwdGlvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9uLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9iamVjdGl2ZXMgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgICBjaGlsZHJlbjogY29uc3RhbnRzLm9iamVjdGl2ZXNfY2hpbGRyZW4sXG4gICAgfSk7XG4gICAgdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcyA9IG5ldyBDTUlBcnJheSh7XG4gICAgICBlcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICAgIGNoaWxkcmVuOiBjb25zdGFudHMuY29ycmVjdF9yZXNwb25zZXNfY2hpbGRyZW4sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMub2JqZWN0aXZlcz8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29ycmVjdF9yZXNwb25zZXM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGlkLCByZWdleC5DTUlMb25nSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3R5cGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3R5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKi9cbiAgc2V0IHR5cGUodHlwZSkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdCh0eXBlLCByZWdleC5DTUlUeXBlKSkge1xuICAgICAgdGhpcy4jdHlwZSA9IHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVzdGFtcFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZXN0YW1wKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lc3RhbXA7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZXN0YW1wXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lc3RhbXBcbiAgICovXG4gIHNldCB0aW1lc3RhbXAodGltZXN0YW1wKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHRpbWVzdGFtcCwgcmVnZXguQ01JVGltZSkpIHtcbiAgICAgIHRoaXMuI3RpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjd2VpZ2h0aW5nXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB3ZWlnaHRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3dlaWdodGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN3ZWlnaHRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdlaWdodGluZ1xuICAgKi9cbiAgc2V0IHdlaWdodGluZyh3ZWlnaHRpbmcpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQod2VpZ2h0aW5nLCByZWdleC5DTUlEZWNpbWFsKSkge1xuICAgICAgdGhpcy4jd2VpZ2h0aW5nID0gd2VpZ2h0aW5nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZWFybmVyX3Jlc3BvbnNlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZWFybmVyX3Jlc3BvbnNlKCkge1xuICAgIHJldHVybiB0aGlzLiNsZWFybmVyX3Jlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlYXJuZXJfcmVzcG9uc2UuIERvZXMgdHlwZSB2YWxpZGF0aW9uIHRvIG1ha2Ugc3VyZSByZXNwb25zZVxuICAgKiBtYXRjaGVzIFNDT1JNIDIwMDQncyBzcGVjXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZWFybmVyX3Jlc3BvbnNlXG4gICAqL1xuICBzZXQgbGVhcm5lcl9yZXNwb25zZShsZWFybmVyX3Jlc3BvbnNlKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5ERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgY29uc3QgcmVzcG9uc2VfdHlwZSA9IGxlYXJuZXJfcmVzcG9uc2VzW3RoaXMudHlwZV07XG4gICAgICBpZiAocmVzcG9uc2VfdHlwZS5kZWxpbWl0ZXIgIT09ICcnKSB7XG4gICAgICAgIG5vZGVzID0gbGVhcm5lcl9yZXNwb25zZS5zcGxpdChyZXNwb25zZV90eXBlLmRlbGltaXRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2Rlc1swXSA9IGxlYXJuZXJfcmVzcG9uc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICgobm9kZXMubGVuZ3RoID4gMCkgJiYgKG5vZGVzLmxlbmd0aCA8PSByZXNwb25zZV90eXBlLm1heCkpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0UmVnZXggPSBuZXcgUmVnRXhwKHJlc3BvbnNlX3R5cGUuZm9ybWF0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2VfdHlwZS5kZWxpbWl0ZXIyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gbm9kZXNbaV0uc3BsaXQocmVzcG9uc2VfdHlwZS5kZWxpbWl0ZXIyKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsdWVzWzBdLm1hdGNoKGZvcm1hdFJlZ2V4KSkge1xuICAgICAgICAgICAgICAgIHRocm93VHlwZU1pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlc1sxXS5tYXRjaChuZXcgUmVnRXhwKHJlc3BvbnNlX3R5cGUuZm9ybWF0MikpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghbm9kZXNbaV0ubWF0Y2goZm9ybWF0UmVnZXgpKSB7XG4gICAgICAgICAgICAgIHRocm93VHlwZU1pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChub2Rlc1tpXSAhPT0gJycgJiYgcmVzcG9uc2VfdHlwZS51bmlxdWUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGk7IGorKykge1xuICAgICAgICAgICAgICAgICAgaWYgKG5vZGVzW2ldID09PSBub2Rlc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5HRU5FUkFMX1NFVF9GQUlMVVJFKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcmVzdWx0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCByZXN1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNyZXN1bHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3VsdFxuICAgKi9cbiAgc2V0IHJlc3VsdChyZXN1bHQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQocmVzdWx0LCByZWdleC5DTUlSZXN1bHQpKSB7XG4gICAgICB0aGlzLiNyZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhdGVuY3lcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhdGVuY3koKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGF0ZW5jeVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0ZW5jeVxuICAgKi9cbiAgc2V0IGxhdGVuY3kobGF0ZW5jeSkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChsYXRlbmN5LCByZWdleC5DTUlUaW1lc3BhbikpIHtcbiAgICAgIHRoaXMuI2xhdGVuY3kgPSBsYXRlbmN5O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2Rlc2NyaXB0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICAgKi9cbiAgc2V0IGRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGRlc2NyaXB0aW9uLCByZWdleC5DTUlMYW5nU3RyaW5nMjUwLCB0cnVlKSkge1xuICAgICAgdGhpcy4jZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLm5cbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBpZDogc3RyaW5nLFxuICAgKiAgICAgIHR5cGU6IHN0cmluZyxcbiAgICogICAgICBvYmplY3RpdmVzOiBDTUlBcnJheSxcbiAgICogICAgICB0aW1lc3RhbXA6IHN0cmluZyxcbiAgICogICAgICBjb3JyZWN0X3Jlc3BvbnNlczogQ01JQXJyYXksXG4gICAqICAgICAgd2VpZ2h0aW5nOiBzdHJpbmcsXG4gICAqICAgICAgbGVhcm5lcl9yZXNwb25zZTogc3RyaW5nLFxuICAgKiAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgKiAgICAgIGxhdGVuY3k6IHN0cmluZyxcbiAgICogICAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAndHlwZSc6IHRoaXMudHlwZSxcbiAgICAgICdvYmplY3RpdmVzJzogdGhpcy5vYmplY3RpdmVzLFxuICAgICAgJ3RpbWVzdGFtcCc6IHRoaXMudGltZXN0YW1wLFxuICAgICAgJ3dlaWdodGluZyc6IHRoaXMud2VpZ2h0aW5nLFxuICAgICAgJ2xlYXJuZXJfcmVzcG9uc2UnOiB0aGlzLmxlYXJuZXJfcmVzcG9uc2UsXG4gICAgICAncmVzdWx0JzogdGhpcy5yZXN1bHQsXG4gICAgICAnbGF0ZW5jeSc6IHRoaXMubGF0ZW5jeSxcbiAgICAgICdkZXNjcmlwdGlvbic6IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAnY29ycmVjdF9yZXNwb25zZXMnOiB0aGlzLmNvcnJlY3RfcmVzcG9uc2VzLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIFNDT1JNIDIwMDQncyBjbWkub2JqZWN0aXZlcy5uIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JT2JqZWN0aXZlc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAjaWQgPSAnJztcbiAgI3N1Y2Nlc3Nfc3RhdHVzID0gJ3Vua25vd24nO1xuICAjY29tcGxldGlvbl9zdGF0dXMgPSAndW5rbm93bic7XG4gICNwcm9ncmVzc19tZWFzdXJlID0gJyc7XG4gICNkZXNjcmlwdGlvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLm9iamVjdGl2ZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc2NvcmUgPSBuZXcgU2Nvcm0yMDA0Q01JU2NvcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zY29yZT8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoaWQsIHJlZ2V4LkNNSUxvbmdJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3VjY2Vzc19zdGF0dXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN1Y2Nlc3Nfc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNzdWNjZXNzX3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdWNjZXNzX3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VjY2Vzc19zdGF0dXNcbiAgICovXG4gIHNldCBzdWNjZXNzX3N0YXR1cyhzdWNjZXNzX3N0YXR1cykge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChzdWNjZXNzX3N0YXR1cywgcmVnZXguQ01JU1N0YXR1cykpIHtcbiAgICAgIHRoaXMuI3N1Y2Nlc3Nfc3RhdHVzID0gc3VjY2Vzc19zdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbXBsZXRpb25fc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21wbGV0aW9uX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcGxldGlvbl9zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tcGxldGlvbl9zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbXBsZXRpb25fc3RhdHVzXG4gICAqL1xuICBzZXQgY29tcGxldGlvbl9zdGF0dXMoY29tcGxldGlvbl9zdGF0dXMpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoY29tcGxldGlvbl9zdGF0dXMsIHJlZ2V4LkNNSUNTdGF0dXMpKSB7XG4gICAgICB0aGlzLiNjb21wbGV0aW9uX3N0YXR1cyA9IGNvbXBsZXRpb25fc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNwcm9ncmVzc19tZWFzdXJlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBwcm9ncmVzc19tZWFzdXJlKCkge1xuICAgIHJldHVybiB0aGlzLiNwcm9ncmVzc19tZWFzdXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Byb2dyZXNzX21lYXN1cmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb2dyZXNzX21lYXN1cmVcbiAgICovXG4gIHNldCBwcm9ncmVzc19tZWFzdXJlKHByb2dyZXNzX21lYXN1cmUpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQocHJvZ3Jlc3NfbWVhc3VyZSwgcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShwcm9ncmVzc19tZWFzdXJlLCByZWdleC5wcm9ncmVzc19yYW5nZSkpIHtcbiAgICAgIHRoaXMuI3Byb2dyZXNzX21lYXN1cmUgPSBwcm9ncmVzc19tZWFzdXJlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2Rlc2NyaXB0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICAgKi9cbiAgc2V0IGRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGRlc2NyaXB0aW9uLCByZWdleC5DTUlMYW5nU3RyaW5nMjUwLCB0cnVlKSkge1xuICAgICAgdGhpcy4jZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkub2JqZWN0aXZlcy5uXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZyxcbiAgICogICAgICBzdWNjZXNzX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIGNvbXBsZXRpb25fc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgcHJvZ3Jlc3NfbWVhc3VyZTogc3RyaW5nLFxuICAgKiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgc2NvcmU6IFNjb3JtMjAwNENNSVNjb3JlXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAnc3VjY2Vzc19zdGF0dXMnOiB0aGlzLnN1Y2Nlc3Nfc3RhdHVzLFxuICAgICAgJ2NvbXBsZXRpb25fc3RhdHVzJzogdGhpcy5jb21wbGV0aW9uX3N0YXR1cyxcbiAgICAgICdwcm9ncmVzc19tZWFzdXJlJzogdGhpcy5wcm9ncmVzc19tZWFzdXJlLFxuICAgICAgJ2Rlc2NyaXB0aW9uJzogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICdzY29yZSc6IHRoaXMuc2NvcmUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgU0NPUk0gMjAwNCdzIGNtaSAqLnNjb3JlIG9iamVjdFxuICovXG5jbGFzcyBTY29ybTIwMDRDTUlTY29yZSBleHRlbmRzIENNSVNjb3JlIHtcbiAgI3NjYWxlZCA9ICcnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pICouc2NvcmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgICB7XG4gICAgICAgICAgc2NvcmVfY2hpbGRyZW46IGNvbnN0YW50cy5zY29yZV9jaGlsZHJlbixcbiAgICAgICAgICBtYXg6ICcnLFxuICAgICAgICAgIGludmFsaWRFcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICAgICAgICBpbnZhbGlkVHlwZUNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsXG4gICAgICAgICAgZGVjaW1hbFJlZ2V4OiBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCxcbiAgICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc2NhbGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzY2FsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NjYWxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzY2FsZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjYWxlZFxuICAgKi9cbiAgc2V0IHNjYWxlZChzY2FsZWQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc2NhbGVkLCByZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgICBjaGVjazIwMDRWYWxpZFJhbmdlKHNjYWxlZCwgcmVnZXguc2NhbGVkX3JhbmdlKSkge1xuICAgICAgdGhpcy4jc2NhbGVkID0gc2NhbGVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaSAqLnNjb3JlXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgc2NhbGVkOiBzdHJpbmcsXG4gICAqICAgICAgcmF3OiBzdHJpbmcsXG4gICAqICAgICAgbWluOiBzdHJpbmcsXG4gICAqICAgICAgbWF4OiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3NjYWxlZCc6IHRoaXMuc2NhbGVkLFxuICAgICAgJ3Jhdyc6IHN1cGVyLnJhdyxcbiAgICAgICdtaW4nOiBzdXBlci5taW4sXG4gICAgICAnbWF4Jzogc3VwZXIubWF4LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuY29tbWVudHNfZnJvbV9sZWFybmVyLm4gYW5kIGNtaS5jb21tZW50c19mcm9tX2xtcy5uIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JQ29tbWVudHNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2NvbW1lbnQgPSAnJztcbiAgI2xvY2F0aW9uID0gJyc7XG4gICN0aW1lc3RhbXAgPSAnJztcbiAgI3JlYWRPbmx5QWZ0ZXJJbml0O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmNvbW1lbnRzX2Zyb21fbGVhcm5lci5uIGFuZCBjbWkuY29tbWVudHNfZnJvbV9sbXMublxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlYWRPbmx5QWZ0ZXJJbml0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFkT25seUFmdGVySW5pdCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNjb21tZW50ID0gJyc7XG4gICAgdGhpcy4jbG9jYXRpb24gPSAnJztcbiAgICB0aGlzLiN0aW1lc3RhbXAgPSAnJztcbiAgICB0aGlzLiNyZWFkT25seUFmdGVySW5pdCA9IHJlYWRPbmx5QWZ0ZXJJbml0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICAgKi9cbiAgc2V0IGNvbW1lbnQoY29tbWVudCkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI3JlYWRPbmx5QWZ0ZXJJbml0KSB7XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGNvbW1lbnQsIHJlZ2V4LkNNSUxhbmdTdHJpbmc0MDAwLCB0cnVlKSkge1xuICAgICAgICB0aGlzLiNjb21tZW50ID0gY29tbWVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNsb2NhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsb2NhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAgICovXG4gIHNldCBsb2NhdGlvbihsb2NhdGlvbikge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI3JlYWRPbmx5QWZ0ZXJJbml0KSB7XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGxvY2F0aW9uLCByZWdleC5DTUlTdHJpbmcyNTApKSB7XG4gICAgICAgIHRoaXMuI2xvY2F0aW9uID0gbG9jYXRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVzdGFtcFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZXN0YW1wKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lc3RhbXA7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZXN0YW1wXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lc3RhbXBcbiAgICovXG4gIHNldCB0aW1lc3RhbXAodGltZXN0YW1wKSB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy4jcmVhZE9ubHlBZnRlckluaXQpIHtcbiAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQodGltZXN0YW1wLCByZWdleC5DTUlUaW1lKSkge1xuICAgICAgICB0aGlzLiN0aW1lc3RhbXAgPSB0aW1lc3RhbXA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmNvbW1lbnRzX2Zyb21fbGVhcm5lci5uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGNvbW1lbnQ6IHN0cmluZyxcbiAgICogICAgICBsb2NhdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVzdGFtcDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdjb21tZW50JzogdGhpcy5jb21tZW50LFxuICAgICAgJ2xvY2F0aW9uJzogdGhpcy5sb2NhdGlvbixcbiAgICAgICd0aW1lc3RhbXAnOiB0aGlzLnRpbWVzdGFtcCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMubiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2lkID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoaWQsIHJlZ2V4LkNNSUxvbmdJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuaW50ZXJhY3Rpb25zLm4uY29ycmVjdF9yZXNwb25zZXMubiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI3BhdHRlcm4gPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMubi5jb3JyZWN0X3Jlc3BvbnNlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3BhdHRlcm5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHBhdHRlcm4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BhdHRlcm47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcGF0dGVyblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuICAgKi9cbiAgc2V0IHBhdHRlcm4ocGF0dGVybikge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChwYXR0ZXJuLCByZWdleC5DTUlGZWVkYmFjaykpIHtcbiAgICAgIHRoaXMuI3BhdHRlcm4gPSBwYXR0ZXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gY21pLmludGVyYWN0aW9ucy5uLmNvcnJlY3RfcmVzcG9uc2VzLm4gb2JqZWN0XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgcGF0dGVybjogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdwYXR0ZXJuJzogdGhpcy5wYXR0ZXJuLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBhZGwgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBBREwgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBhZGxcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm5hdiA9IG5ldyBBRExOYXYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5uYXY/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGFkbFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIG5hdjoge1xuICAgKiAgICAgICAgcmVxdWVzdDogc3RyaW5nXG4gICAqICAgICAgfVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnbmF2JzogdGhpcy5uYXYsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMjAwNCdzIGFkbC5uYXYgb2JqZWN0XG4gKi9cbmNsYXNzIEFETE5hdiBleHRlbmRzIEJhc2VDTUkge1xuICAjcmVxdWVzdCA9ICdfbm9uZV8nO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYWRsLm5hdlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucmVxdWVzdF92YWxpZCA9IG5ldyBBRExOYXZSZXF1ZXN0VmFsaWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5yZXF1ZXN0X3ZhbGlkPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcmVxdWVzdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcmVxdWVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVxdWVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNyZXF1ZXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0XG4gICAqL1xuICBzZXQgcmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHJlcXVlc3QsIHJlZ2V4Lk5BVkV2ZW50KSkge1xuICAgICAgdGhpcy4jcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgYWRsLm5hdlxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHJlcXVlc3Q6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAncmVxdWVzdCc6IHRoaXMucmVxdWVzdCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgYWRsLm5hdi5yZXF1ZXN0X3ZhbGlkIG9iamVjdFxuICovXG5jbGFzcyBBRExOYXZSZXF1ZXN0VmFsaWQgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2NvbnRpbnVlID0gJ3Vua25vd24nO1xuICAjcHJldmlvdXMgPSAndW5rbm93bic7XG4gIGNob2ljZSA9IGNsYXNzIHtcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0YXJnZXQgaXMgdmFsaWRcbiAgICAgKiBAcGFyYW0geyp9IF90YXJnZXRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgX2lzVGFyZ2V0VmFsaWQgPSAoX3RhcmdldCkgPT4gJ3Vua25vd24nO1xuICB9O1xuICBqdW1wID0gY2xhc3Mge1xuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRhcmdldCBpcyB2YWxpZFxuICAgICAqIEBwYXJhbSB7Kn0gX3RhcmdldFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBfaXNUYXJnZXRWYWxpZCA9IChfdGFyZ2V0KSA9PiAndW5rbm93bic7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBhZGwubmF2LnJlcXVlc3RfdmFsaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29udGludWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbnRpbnVlKCkge1xuICAgIHJldHVybiB0aGlzLiNjb250aW51ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb250aW51ZS4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7Kn0gX1xuICAgKi9cbiAgc2V0IGNvbnRpbnVlKF8pIHtcbiAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNwcmV2aW91c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcHJldmlvdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3ByZXZpb3VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3ByZXZpb3VzLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHsqfSBfXG4gICAqL1xuICBzZXQgcHJldmlvdXMoXykge1xuICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgYWRsLm5hdi5yZXF1ZXN0X3ZhbGlkXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgcHJldmlvdXM6IHN0cmluZyxcbiAgICogICAgICBjb250aW51ZTogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdwcmV2aW91cyc6IHRoaXMucHJldmlvdXMsXG4gICAgICAnY29udGludWUnOiB0aGlzLmNvbnRpbnVlLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgY29uc3QgZ2xvYmFsX2NvbnN0YW50cyA9IHtcbiAgU0NPUk1fVFJVRTogJ3RydWUnLFxuICBTQ09STV9GQUxTRTogJ2ZhbHNlJyxcbiAgU1RBVEVfTk9UX0lOSVRJQUxJWkVEOiAwLFxuICBTVEFURV9JTklUSUFMSVpFRDogMSxcbiAgU1RBVEVfVEVSTUlOQVRFRDogMixcbiAgTE9HX0xFVkVMX0RFQlVHOiAxLFxuICBMT0dfTEVWRUxfSU5GTzogMixcbiAgTE9HX0xFVkVMX1dBUk5JTkc6IDMsXG4gIExPR19MRVZFTF9FUlJPUjogNCxcbiAgTE9HX0xFVkVMX05PTkU6IDUsXG59O1xuXG5leHBvcnQgY29uc3Qgc2Nvcm0xMl9jb25zdGFudHMgPSB7XG4gIC8vIENoaWxkcmVuIGxpc3RzXG4gIGNtaV9jaGlsZHJlbjogJ2NvcmUsc3VzcGVuZF9kYXRhLGxhdW5jaF9kYXRhLGNvbW1lbnRzLG9iamVjdGl2ZXMsc3R1ZGVudF9kYXRhLHN0dWRlbnRfcHJlZmVyZW5jZSxpbnRlcmFjdGlvbnMnLFxuICBjb3JlX2NoaWxkcmVuOiAnc3R1ZGVudF9pZCxzdHVkZW50X25hbWUsbGVzc29uX2xvY2F0aW9uLGNyZWRpdCxsZXNzb25fc3RhdHVzLGVudHJ5LHNjb3JlLHRvdGFsX3RpbWUsbGVzc29uX21vZGUsZXhpdCxzZXNzaW9uX3RpbWUnLFxuICBzY29yZV9jaGlsZHJlbjogJ3JhdyxtaW4sbWF4JyxcbiAgY29tbWVudHNfY2hpbGRyZW46ICdjb250ZW50LGxvY2F0aW9uLHRpbWUnLFxuICBvYmplY3RpdmVzX2NoaWxkcmVuOiAnaWQsc2NvcmUsc3RhdHVzJyxcbiAgY29ycmVjdF9yZXNwb25zZXNfY2hpbGRyZW46ICdwYXR0ZXJuJyxcbiAgc3R1ZGVudF9kYXRhX2NoaWxkcmVuOiAnbWFzdGVyeV9zY29yZSxtYXhfdGltZV9hbGxvd2VkLHRpbWVfbGltaXRfYWN0aW9uJyxcbiAgc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuOiAnYXVkaW8sbGFuZ3VhZ2Usc3BlZWQsdGV4dCcsXG4gIGludGVyYWN0aW9uc19jaGlsZHJlbjogJ2lkLG9iamVjdGl2ZXMsdGltZSx0eXBlLGNvcnJlY3RfcmVzcG9uc2VzLHdlaWdodGluZyxzdHVkZW50X3Jlc3BvbnNlLHJlc3VsdCxsYXRlbmN5JyxcblxuICBlcnJvcl9kZXNjcmlwdGlvbnM6IHtcbiAgICAnMTAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBFeGNlcHRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ05vIHNwZWNpZmljIGVycm9yIGNvZGUgZXhpc3RzIHRvIGRlc2NyaWJlIHRoZSBlcnJvci4gVXNlIExNU0dldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24nLFxuICAgIH0sXG4gICAgJzIwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0ludmFsaWQgYXJndW1lbnQgZXJyb3InLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IGFuIGFyZ3VtZW50IHJlcHJlc2VudHMgYW4gaW52YWxpZCBkYXRhIG1vZGVsIGVsZW1lbnQgb3IgaXMgb3RoZXJ3aXNlIGluY29ycmVjdC4nLFxuICAgIH0sXG4gICAgJzIwMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgY2Fubm90IGhhdmUgY2hpbGRyZW4nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IExNU0dldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIGRhdGEgbW9kZWwgZWxlbWVudCBuYW1lIHRoYXQgZW5kcyBpbiBcIl9jaGlsZHJlblwiIGZvciBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFwiX2NoaWxkcmVuXCIgc3VmZml4LicsXG4gICAgfSxcbiAgICAnMjAzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBub3QgYW4gYXJyYXkgLSBjYW5ub3QgaGF2ZSBjb3VudCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgTE1TR2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgZGF0YSBtb2RlbCBlbGVtZW50IG5hbWUgdGhhdCBlbmRzIGluIFwiX2NvdW50XCIgZm9yIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgXCJfY291bnRcIiBzdWZmaXguJyxcbiAgICB9LFxuICAgICczMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdOb3QgaW5pdGlhbGl6ZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IGFuIEFQSSBjYWxsIHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBsbXNJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnNDAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnTm90IGltcGxlbWVudGVkIGVycm9yJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgZGF0YSBtb2RlbCBlbGVtZW50IGluZGljYXRlZCBpbiBhIGNhbGwgdG8gTE1TR2V0VmFsdWUgb3IgTE1TU2V0VmFsdWUgaXMgdmFsaWQsIGJ1dCB3YXMgbm90IGltcGxlbWVudGVkIGJ5IHRoaXMgTE1TLiBTQ09STSAxLjIgZGVmaW5lcyBhIHNldCBvZiBkYXRhIG1vZGVsIGVsZW1lbnRzIGFzIGJlaW5nIG9wdGlvbmFsIGZvciBhbiBMTVMgdG8gaW1wbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDAyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnSW52YWxpZCBzZXQgdmFsdWUsIGVsZW1lbnQgaXMgYSBrZXl3b3JkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBMTVNTZXRWYWx1ZSB3YXMgY2FsbGVkIG9uIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGtleXdvcmQgKGVsZW1lbnRzIHRoYXQgZW5kIGluIFwiX2NoaWxkcmVuXCIgYW5kIFwiX2NvdW50XCIpLicsXG4gICAgfSxcbiAgICAnNDAzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBpcyByZWFkIG9ubHknLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0xNU1NldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGNhbiBvbmx5IGJlIHJlYWQuJyxcbiAgICB9LFxuICAgICc0MDQnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IGlzIHdyaXRlIG9ubHknLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0xNU0dldFZhbHVlIHdhcyBjYWxsZWQgb24gYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBjYW4gb25seSBiZSB3cml0dGVuIHRvLicsXG4gICAgfSxcbiAgICAnNDA1Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnSW5jb3JyZWN0IERhdGEgVHlwZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTE1TU2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgdmFsdWUgdGhhdCBpcyBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgc3VwcGxpZWQgZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBhaWNjX2NvbnN0YW50cyA9IHtcbiAgLi4uc2Nvcm0xMl9jb25zdGFudHMsIC4uLntcbiAgICBjbWlfY2hpbGRyZW46ICdjb3JlLHN1c3BlbmRfZGF0YSxsYXVuY2hfZGF0YSxjb21tZW50cyxvYmplY3RpdmVzLHN0dWRlbnRfZGF0YSxzdHVkZW50X3ByZWZlcmVuY2UsaW50ZXJhY3Rpb25zLGV2YWx1YXRpb24nLFxuICAgIHN0dWRlbnRfZGF0YV9jaGlsZHJlbjogJ2F0dGVtcHRfbnVtYmVyLHRyaWVzLG1hc3Rlcnlfc2NvcmUsbWF4X3RpbWVfYWxsb3dlZCx0aW1lX2xpbWl0X2FjdGlvbicsXG4gICAgdHJpZXNfY2hpbGRyZW46ICd0aW1lLHN0YXR1cyxzY29yZScsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2Nvcm0yMDA0X2NvbnN0YW50cyA9IHtcbiAgLy8gQ2hpbGRyZW4gbGlzdHNcbiAgY21pX2NoaWxkcmVuOiAnX3ZlcnNpb24sY29tbWVudHNfZnJvbV9sZWFybmVyLGNvbW1lbnRzX2Zyb21fbG1zLGNvbXBsZXRpb25fc3RhdHVzLGNyZWRpdCxlbnRyeSxleGl0LGludGVyYWN0aW9ucyxsYXVuY2hfZGF0YSxsZWFybmVyX2lkLGxlYXJuZXJfbmFtZSxsZWFybmVyX3ByZWZlcmVuY2UsbG9jYXRpb24sbWF4X3RpbWVfYWxsb3dlZCxtb2RlLG9iamVjdGl2ZXMscHJvZ3Jlc3NfbWVhc3VyZSxzY2FsZWRfcGFzc2luZ19zY29yZSxzY29yZSxzZXNzaW9uX3RpbWUsc3VjY2Vzc19zdGF0dXMsc3VzcGVuZF9kYXRhLHRpbWVfbGltaXRfYWN0aW9uLHRvdGFsX3RpbWUnLFxuICBjb21tZW50c19jaGlsZHJlbjogJ2NvbW1lbnQsdGltZXN0YW1wLGxvY2F0aW9uJyxcbiAgc2NvcmVfY2hpbGRyZW46ICdtYXgscmF3LHNjYWxlZCxtaW4nLFxuICBvYmplY3RpdmVzX2NoaWxkcmVuOiAncHJvZ3Jlc3NfbWVhc3VyZSxjb21wbGV0aW9uX3N0YXR1cyxzdWNjZXNzX3N0YXR1cyxkZXNjcmlwdGlvbixzY29yZSxpZCcsXG4gIGNvcnJlY3RfcmVzcG9uc2VzX2NoaWxkcmVuOiAncGF0dGVybicsXG4gIHN0dWRlbnRfZGF0YV9jaGlsZHJlbjogJ21hc3Rlcnlfc2NvcmUsbWF4X3RpbWVfYWxsb3dlZCx0aW1lX2xpbWl0X2FjdGlvbicsXG4gIHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbjogJ2F1ZGlvX2xldmVsLGF1ZGlvX2NhcHRpb25pbmcsZGVsaXZlcnlfc3BlZWQsbGFuZ3VhZ2UnLFxuICBpbnRlcmFjdGlvbnNfY2hpbGRyZW46ICdpZCx0eXBlLG9iamVjdGl2ZXMsdGltZXN0YW1wLGNvcnJlY3RfcmVzcG9uc2VzLHdlaWdodGluZyxsZWFybmVyX3Jlc3BvbnNlLHJlc3VsdCxsYXRlbmN5LGRlc2NyaXB0aW9uJyxcblxuICBlcnJvcl9kZXNjcmlwdGlvbnM6IHtcbiAgICAnMCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ05vIEVycm9yJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdObyBlcnJvciBvY2N1cnJlZCwgdGhlIHByZXZpb3VzIEFQSSBjYWxsIHdhcyBzdWNjZXNzZnVsLicsXG4gICAgfSxcbiAgICAnMTAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBFeGNlcHRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ05vIHNwZWNpZmljIGVycm9yIGNvZGUgZXhpc3RzIHRvIGRlc2NyaWJlIHRoZSBlcnJvci4gVXNlIEdldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICB9LFxuICAgICcxMDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEluaXRpYWxpemF0aW9uIEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gSW5pdGlhbGl6ZSBmYWlsZWQgZm9yIGFuIHVua25vd24gcmVhc29uLicsXG4gICAgfSxcbiAgICAnMTAzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnQWxyZWFkeSBJbml0aWFsaXplZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBJbml0aWFsaXplIGZhaWxlZCBiZWNhdXNlIEluaXRpYWxpemUgd2FzIGFscmVhZHkgY2FsbGVkLicsXG4gICAgfSxcbiAgICAnMTA0Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnQ29udGVudCBJbnN0YW5jZSBUZXJtaW5hdGVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEluaXRpYWxpemUgZmFpbGVkIGJlY2F1c2UgVGVybWluYXRlIHdhcyBhbHJlYWR5IGNhbGxlZC4nLFxuICAgIH0sXG4gICAgJzExMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgVGVybWluYXRpb24gRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBUZXJtaW5hdGUgZmFpbGVkIGZvciBhbiB1bmtub3duIHJlYXNvbi4nLFxuICAgIH0sXG4gICAgJzExMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1Rlcm1pbmF0aW9uIEJlZm9yZSBJbml0aWFsaXphdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBUZXJtaW5hdGUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIEluaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICcxMTMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdUZXJtaW5hdGlvbiBBZnRlciBUZXJtaW5hdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBUZXJtaW5hdGUgZmFpbGVkIGJlY2F1c2UgVGVybWluYXRlIHdhcyBhbHJlYWR5IGNhbGxlZC4nLFxuICAgIH0sXG4gICAgJzEyMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1JldHJpZXZlIERhdGEgQmVmb3JlIEluaXRpYWxpemF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEdldFZhbHVlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnMTIzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnUmV0cmlldmUgRGF0YSBBZnRlciBUZXJtaW5hdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBHZXRWYWx1ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBhZnRlciB0aGUgY2FsbCB0byBUZXJtaW5hdGUuJyxcbiAgICB9LFxuICAgICcxMzInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdTdG9yZSBEYXRhIEJlZm9yZSBJbml0aWFsaXphdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBTZXRWYWx1ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzEzMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1N0b3JlIERhdGEgQWZ0ZXIgVGVybWluYXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gU2V0VmFsdWUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYWZ0ZXIgdGhlIGNhbGwgdG8gVGVybWluYXRlLicsXG4gICAgfSxcbiAgICAnMTQyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnQ29tbWl0IEJlZm9yZSBJbml0aWFsaXphdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBDb21taXQgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIEluaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICcxNDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdDb21taXQgQWZ0ZXIgVGVybWluYXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gQ29tbWl0IGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGFmdGVyIHRoZSBjYWxsIHRvIFRlcm1pbmF0ZS4nLFxuICAgIH0sXG4gICAgJzIwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgQXJndW1lbnQgRXJyb3InLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0FuIGludmFsaWQgYXJndW1lbnQgd2FzIHBhc3NlZCB0byBhbiBBUEkgbWV0aG9kICh1c3VhbGx5IGluZGljYXRlcyB0aGF0IEluaXRpYWxpemUsIENvbW1pdCBvciBUZXJtaW5hdGUgZGlkIG5vdCByZWNlaXZlIHRoZSBleHBlY3RlZCBlbXB0eSBzdHJpbmcgYXJndW1lbnQuJyxcbiAgICB9LFxuICAgICczMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEdldCBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgYSBmYWlsZWQgR2V0VmFsdWUgY2FsbCB3aGVyZSBubyBvdGhlciBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGFwcGxpY2FibGUuIFVzZSBHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgfSxcbiAgICAnMzUxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBTZXQgRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIGEgZmFpbGVkIFNldFZhbHVlIGNhbGwgd2hlcmUgbm8gb3RoZXIgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBhcHBsaWNhYmxlLiBVc2UgR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgIH0sXG4gICAgJzM5MSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgQ29tbWl0IEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyBhIGZhaWxlZCBDb21taXQgY2FsbCB3aGVyZSBubyBvdGhlciBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGFwcGxpY2FibGUuIFVzZSBHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgfSxcbiAgICAnNDAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnVW5kZWZpbmVkIERhdGEgTW9kZWwgRWxlbWVudCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBuYW1lIHBhc3NlZCB0byBHZXRWYWx1ZSBvciBTZXRWYWx1ZSBpcyBub3QgYSB2YWxpZCBTQ09STSBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdVbmltcGxlbWVudGVkIERhdGEgTW9kZWwgRWxlbWVudCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBpbmRpY2F0ZWQgaW4gYSBjYWxsIHRvIEdldFZhbHVlIG9yIFNldFZhbHVlIGlzIHZhbGlkLCBidXQgd2FzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIExNUy4gSW4gU0NPUk0gMjAwNCwgdGhpcyBlcnJvciB3b3VsZCBpbmRpY2F0ZSBhbiBMTVMgdGhhdCBpcyBub3QgZnVsbHkgU0NPUk0gY29uZm9ybWFudC4nLFxuICAgIH0sXG4gICAgJzQwMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBWYWx1ZSBOb3QgSW5pdGlhbGl6ZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0F0dGVtcHQgdG8gcmVhZCBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBieSB0aGUgTE1TIG9yIHRocm91Z2ggYSBTZXRWYWx1ZSBjYWxsLiBUaGlzIGVycm9yIGNvbmRpdGlvbiBpcyBvZnRlbiByZWFjaGVkIGR1cmluZyBub3JtYWwgZXhlY3V0aW9uIG9mIGEgU0NPLicsXG4gICAgfSxcbiAgICAnNDA0Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IElzIFJlYWQgT25seScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnU2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgY2FuIG9ubHkgYmUgcmVhZC4nLFxuICAgIH0sXG4gICAgJzQwNSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBJcyBXcml0ZSBPbmx5JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdHZXRWYWx1ZSB3YXMgY2FsbGVkIG9uIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgY2FuIG9ubHkgYmUgd3JpdHRlbiB0by4nLFxuICAgIH0sXG4gICAgJzQwNic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBUeXBlIE1pc21hdGNoJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdTZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSB0aGF0IGlzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBzdXBwbGllZCBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDcnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgVmFsdWUgT3V0IE9mIFJhbmdlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgbnVtZXJpYyB2YWx1ZSBzdXBwbGllZCB0byBhIFNldFZhbHVlIGNhbGwgaXMgb3V0c2lkZSBvZiB0aGUgbnVtZXJpYyByYW5nZSBhbGxvd2VkIGZvciB0aGUgc3VwcGxpZWQgZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDA4Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBEZXBlbmRlbmN5IE5vdCBFc3RhYmxpc2hlZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnU29tZSBkYXRhIG1vZGVsIGVsZW1lbnRzIGNhbm5vdCBiZSBzZXQgdW50aWwgYW5vdGhlciBkYXRhIG1vZGVsIGVsZW1lbnQgd2FzIHNldC4gVGhpcyBlcnJvciBjb25kaXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHByZXJlcXVpc2l0ZSBlbGVtZW50IHdhcyBub3Qgc2V0IGJlZm9yZSB0aGUgZGVwZW5kZW50IGVsZW1lbnQuJyxcbiAgICB9LFxuICB9LFxufTtcbiIsIi8vIEBmbG93XG5leHBvcnQgY29uc3QgZXJyb3JfY29kZXMgPSB7XG4gIEdFTkVSQUw6IDEwMSxcbiAgSU5JVElBTElaQVRJT05fRkFJTEVEOiAxMDEsXG4gIElOSVRJQUxJWkVEOiAxMDEsXG4gIFRFUk1JTkFURUQ6IDEwMSxcbiAgVEVSTUlOQVRJT05fRkFJTFVSRTogMTAxLFxuICBURVJNSU5BVElPTl9CRUZPUkVfSU5JVDogMTAxLFxuICBNVUxUSVBMRV9URVJNSU5BVElPTjogMTAxLFxuICBSRVRSSUVWRV9CRUZPUkVfSU5JVDogMTAxLFxuICBSRVRSSUVWRV9BRlRFUl9URVJNOiAxMDEsXG4gIFNUT1JFX0JFRk9SRV9JTklUOiAxMDEsXG4gIFNUT1JFX0FGVEVSX1RFUk06IDEwMSxcbiAgQ09NTUlUX0JFRk9SRV9JTklUOiAxMDEsXG4gIENPTU1JVF9BRlRFUl9URVJNOiAxMDEsXG4gIEFSR1VNRU5UX0VSUk9SOiAxMDEsXG4gIENISUxEUkVOX0VSUk9SOiAxMDEsXG4gIENPVU5UX0VSUk9SOiAxMDEsXG4gIEdFTkVSQUxfR0VUX0ZBSUxVUkU6IDEwMSxcbiAgR0VORVJBTF9TRVRfRkFJTFVSRTogMTAxLFxuICBHRU5FUkFMX0NPTU1JVF9GQUlMVVJFOiAxMDEsXG4gIFVOREVGSU5FRF9EQVRBX01PREVMOiAxMDEsXG4gIFVOSU1QTEVNRU5URURfRUxFTUVOVDogMTAxLFxuICBWQUxVRV9OT1RfSU5JVElBTElaRUQ6IDEwMSxcbiAgSU5WQUxJRF9TRVRfVkFMVUU6IDEwMSxcbiAgUkVBRF9PTkxZX0VMRU1FTlQ6IDEwMSxcbiAgV1JJVEVfT05MWV9FTEVNRU5UOiAxMDEsXG4gIFRZUEVfTUlTTUFUQ0g6IDEwMSxcbiAgVkFMVUVfT1VUX09GX1JBTkdFOiAxMDEsXG4gIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiAxMDEsXG59O1xuXG5leHBvcnQgY29uc3Qgc2Nvcm0xMl9lcnJvcl9jb2RlcyA9IHtcbiAgLi4uZXJyb3JfY29kZXMsIC4uLntcbiAgICBSRVRSSUVWRV9CRUZPUkVfSU5JVDogMzAxLFxuICAgIFNUT1JFX0JFRk9SRV9JTklUOiAzMDEsXG4gICAgQ09NTUlUX0JFRk9SRV9JTklUOiAzMDEsXG4gICAgQVJHVU1FTlRfRVJST1I6IDIwMSxcbiAgICBDSElMRFJFTl9FUlJPUjogMjAyLFxuICAgIENPVU5UX0VSUk9SOiAyMDMsXG4gICAgVU5ERUZJTkVEX0RBVEFfTU9ERUw6IDQwMSxcbiAgICBVTklNUExFTUVOVEVEX0VMRU1FTlQ6IDQwMSxcbiAgICBWQUxVRV9OT1RfSU5JVElBTElaRUQ6IDMwMSxcbiAgICBJTlZBTElEX1NFVF9WQUxVRTogNDAyLFxuICAgIFJFQURfT05MWV9FTEVNRU5UOiA0MDMsXG4gICAgV1JJVEVfT05MWV9FTEVNRU5UOiA0MDQsXG4gICAgVFlQRV9NSVNNQVRDSDogNDA1LFxuICAgIFZBTFVFX09VVF9PRl9SQU5HRTogNDA3LFxuICAgIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiA0MDgsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2Nvcm0yMDA0X2Vycm9yX2NvZGVzID0ge1xuICAuLi5lcnJvcl9jb2RlcywgLi4ue1xuICAgIElOSVRJQUxJWkFUSU9OX0ZBSUxFRDogMTAyLFxuICAgIElOSVRJQUxJWkVEOiAxMDMsXG4gICAgVEVSTUlOQVRFRDogMTA0LFxuICAgIFRFUk1JTkFUSU9OX0ZBSUxVUkU6IDExMSxcbiAgICBURVJNSU5BVElPTl9CRUZPUkVfSU5JVDogMTEyLFxuICAgIE1VTFRJUExFX1RFUk1JTkFUSU9OUzogMTEzLFxuICAgIFJFVFJJRVZFX0JFRk9SRV9JTklUOiAxMjIsXG4gICAgUkVUUklFVkVfQUZURVJfVEVSTTogMTIzLFxuICAgIFNUT1JFX0JFRk9SRV9JTklUOiAxMzIsXG4gICAgU1RPUkVfQUZURVJfVEVSTTogMTMzLFxuICAgIENPTU1JVF9CRUZPUkVfSU5JVDogMTQyLFxuICAgIENPTU1JVF9BRlRFUl9URVJNOiAxNDMsXG4gICAgQVJHVU1FTlRfRVJST1I6IDIwMSxcbiAgICBHRU5FUkFMX0dFVF9GQUlMVVJFOiAzMDEsXG4gICAgR0VORVJBTF9TRVRfRkFJTFVSRTogMzUxLFxuICAgIEdFTkVSQUxfQ09NTUlUX0ZBSUxVUkU6IDM5MSxcbiAgICBVTkRFRklORURfREFUQV9NT0RFTDogNDAxLFxuICAgIFVOSU1QTEVNRU5URURfRUxFTUVOVDogNDAyLFxuICAgIFZBTFVFX05PVF9JTklUSUFMSVpFRDogNDAzLFxuICAgIFJFQURfT05MWV9FTEVNRU5UOiA0MDQsXG4gICAgV1JJVEVfT05MWV9FTEVNRU5UOiA0MDUsXG4gICAgVFlQRV9NSVNNQVRDSDogNDA2LFxuICAgIFZBTFVFX09VVF9PRl9SQU5HRTogNDA3LFxuICAgIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiA0MDgsXG4gIH0sXG59O1xuIiwiY29uc3QgY29tbW9uX3ZhbHVlcyA9IHtcbiAgdmFsaWRSZXN1bHQ6IFtcbiAgICAnY29ycmVjdCcsXG4gICAgJ3dyb25nJyxcbiAgICAndW5hbnRpY2lwYXRlZCcsXG4gICAgJ25ldXRyYWwnLFxuICBdLFxuICBpbnZhbGlkUmVzdWx0OiBbXG4gICAgJy0xMDAwMCcsXG4gICAgJzEwMDAwJyxcbiAgICAnaW52YWxpZCcsXG4gIF0sXG5cbiAgdmFsaWQwVG8xUmFuZ2U6IFtcbiAgICAnMC4wJyxcbiAgICAnMC4yNScsXG4gICAgJzAuNScsXG4gICAgJzEuMCcsXG4gIF0sXG4gIGludmFsaWQwVG8xUmFuZ2U6IFtcbiAgICAnLTEnLFxuICAgICctMC4xJyxcbiAgICAnMS4xJyxcbiAgICAnLjI1JyxcbiAgXSxcblxuICB2YWxpZDBUbzEwMFJhbmdlOiBbXG4gICAgJzEnLFxuICAgICc1MCcsXG4gICAgJzEwMCcsXG4gIF0sXG4gIGludmFsaWQwVG8xMDBSYW5nZTogW1xuICAgICdpbnZhbGlkJyxcbiAgICAnYTEwMCcsXG4gICAgJy0xJyxcbiAgXSxcblxuICB2YWxpZFNjYWxlZFJhbmdlOiBbXG4gICAgJzEnLFxuICAgICcwLjUnLFxuICAgICcwJyxcbiAgICAnLTAuNScsXG4gICAgJy0xJyxcbiAgXSxcbiAgaW52YWxpZFNjYWxlZFJhbmdlOiBbXG4gICAgJy0xMDEnLFxuICAgICcyNS4xJyxcbiAgICAnNTAuNScsXG4gICAgJzc1JyxcbiAgICAnMTAwJyxcbiAgXSxcblxuICB2YWxpZEludGVnZXJTY2FsZWRSYW5nZTogW1xuICAgICcxJyxcbiAgICAnMCcsXG4gICAgJy0xJyxcbiAgXSxcbiAgaW52YWxpZEludGVnZXJTY2FsZWRSYW5nZTogW1xuICAgICctMTAxJyxcbiAgICAnLTAuNScsXG4gICAgJzAuNScsXG4gICAgJzI1LjEnLFxuICAgICc1MC41JyxcbiAgICAnNzUnLFxuICAgICcxMDAnLFxuICBdLFxufTtcblxuZXhwb3J0IGNvbnN0IHNjb3JtMTJfdmFsdWVzID0ge1xuICAuLi5jb21tb25fdmFsdWVzLCAuLi57XG4gICAgdmFsaWRMZXNzb25TdGF0dXM6IFtcbiAgICAgICdwYXNzZWQnLFxuICAgICAgJ2NvbXBsZXRlZCcsXG4gICAgICAnZmFpbGVkJyxcbiAgICAgICdpbmNvbXBsZXRlJyxcbiAgICAgICdicm93c2VkJyxcbiAgICBdLFxuICAgIGludmFsaWRMZXNzb25TdGF0dXM6IFtcbiAgICAgICdQYXNzZWQnLFxuICAgICAgJ1AnLFxuICAgICAgJ0YnLFxuICAgICAgJ3AnLFxuICAgICAgJ3RydWUnLFxuICAgICAgJ2ZhbHNlJyxcbiAgICAgICdjb21wbGV0ZScsXG4gICAgXSxcblxuICAgIHZhbGlkRXhpdDogW1xuICAgICAgJ3RpbWUtb3V0JyxcbiAgICAgICdzdXNwZW5kJyxcbiAgICAgICdsb2dvdXQnLFxuICAgIF0sXG4gICAgaW52YWxpZEV4aXQ6IFtcbiAgICAgICdjbG9zZScsXG4gICAgICAnZXhpdCcsXG4gICAgICAnY3Jhc2gnLFxuICAgIF0sXG5cbiAgICB2YWxpZFR5cGU6IFtcbiAgICAgICd0cnVlLWZhbHNlJyxcbiAgICAgICdjaG9pY2UnLFxuICAgICAgJ2ZpbGwtaW4nLFxuICAgICAgJ21hdGNoaW5nJyxcbiAgICAgICdwZXJmb3JtYW5jZScsXG4gICAgICAnc2VxdWVuY2luZycsXG4gICAgICAnbGlrZXJ0JyxcbiAgICAgICdudW1lcmljJyxcbiAgICBdLFxuICAgIGludmFsaWRUeXBlOiBbXG4gICAgICAnY29ycmVjdCcsXG4gICAgICAnd3JvbmcnLFxuICAgICAgJ2xvZ291dCcsXG4gICAgXSxcblxuICAgIHZhbGlkU3BlZWRSYW5nZTogW1xuICAgICAgJzEnLFxuICAgICAgJzUwJyxcbiAgICAgICcxMDAnLFxuICAgICAgJy0xJyxcbiAgICAgICctNTAnLFxuICAgICAgJy0xMDAnLFxuICAgIF0sXG4gICAgaW52YWxpZFNwZWVkUmFuZ2U6IFtcbiAgICAgICdpbnZhbGlkJyxcbiAgICAgICdhMTAwJyxcbiAgICAgICctMTAxJyxcbiAgICAgICcxMDEnLFxuICAgICAgJy0xMDAwMDAnLFxuICAgICAgJzEwMDAwMCcsXG4gICAgXSxcblxuICAgIHZhbGlkU2NvcmVSYW5nZTogW1xuICAgICAgJzEnLFxuICAgICAgJzUwLjI1JyxcbiAgICAgICcxMDAnLFxuICAgIF0sXG4gICAgaW52YWxpZFNjb3JlUmFuZ2U6IFtcbiAgICAgICdpbnZhbGlkJyxcbiAgICAgICdhMTAwJyxcbiAgICAgICctMScsXG4gICAgICAnMTAxJyxcbiAgICAgICctMTAwMDAwJyxcbiAgICAgICcxMDAwMDAnLFxuICAgIF0sXG4gICAgaW52YWxpZDBUbzEwMFJhbmdlOiBbXG4gICAgICAnaW52YWxpZCcsXG4gICAgICAnYTEwMCcsXG4gICAgICAnLTInLFxuICAgIF0sXG5cbiAgICB2YWxpZFRpbWU6IFtcbiAgICAgICcxMDowNjo1NycsXG4gICAgICAnMjM6NTk6NTknLFxuICAgICAgJzAwOjAwOjAwJyxcbiAgICBdLFxuICAgIGludmFsaWRUaW1lOiBbXG4gICAgICAnNDc6NTk6NTknLFxuICAgICAgJzAwOjAwOjAxLjU2JyxcbiAgICAgICcwNjo1OjEzJyxcbiAgICAgICcyMzo1OTo1OS4xMjMnLFxuICAgICAgJ1AxRFQyM0g1OU01OVMnLFxuICAgIF0sXG5cbiAgICB2YWxpZFRpbWVzcGFuOiBbXG4gICAgICAnMTA6MDY6NTcnLFxuICAgICAgJzAwOjAwOjAxLjU2JyxcbiAgICAgICcyMzo1OTo1OScsXG4gICAgICAnNDc6NTk6NTknLFxuICAgIF0sXG4gICAgaW52YWxpZFRpbWVzcGFuOiBbXG4gICAgICAnMDY6NToxMycsXG4gICAgICAnMjM6NTk6NTkuMTIzJyxcbiAgICAgICdQMURUMjNINTlNNTlTJyxcbiAgICBdLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHNjb3JtMjAwNF92YWx1ZXMgPSB7XG4gIC4uLmNvbW1vbl92YWx1ZXMsIC4uLntcbiAgICAvLyB2YWxpZCBmaWVsZCB2YWx1ZXNcbiAgICB2YWxpZFRpbWVzdGFtcHM6IFtcbiAgICAgICcyMDE5LTA2LTI1JyxcbiAgICAgICcyMDE5LTA2LTI1VDIzOjU5JyxcbiAgICAgICcyMDE5LTA2LTI1VDIzOjU5OjU5Ljk5JyxcbiAgICAgICcxOTcwLTAxLTAxJyxcbiAgICBdLFxuICAgIGludmFsaWRUaW1lc3RhbXBzOiBbXG4gICAgICAnMjAxOS0wNi0yNVQnLFxuICAgICAgJzIwMTktMDYtMjVUMjM6NTk6NTkuOTk5JyxcbiAgICAgICcyMDE5LTA2LTI1VDI1OjU5OjU5Ljk5JyxcbiAgICAgICcyMDE5LTEzLTMxJyxcbiAgICAgICcxOTY5LTEyLTMxJyxcbiAgICAgICctMDA6MDA6MzAnLFxuICAgICAgJzA6NTA6MzAnLFxuICAgICAgJzIzOjAwOjMwLicsXG4gICAgXSxcblxuICAgIHZhbGlkQ1N0YXR1czogW1xuICAgICAgJ2NvbXBsZXRlZCcsXG4gICAgICAnaW5jb21wbGV0ZScsXG4gICAgICAnbm90IGF0dGVtcHRlZCcsXG4gICAgICAndW5rbm93bicsXG4gICAgXSxcbiAgICBpbnZhbGlkQ1N0YXR1czogW1xuICAgICAgJ2NvbXBsZXRlJyxcbiAgICAgICdwYXNzZWQnLFxuICAgICAgJ2ZhaWxlZCcsXG4gICAgXSxcblxuICAgIHZhbGlkU1N0YXR1czogW1xuICAgICAgJ3Bhc3NlZCcsXG4gICAgICAnZmFpbGVkJyxcbiAgICAgICd1bmtub3duJyxcbiAgICBdLFxuICAgIGludmFsaWRTU3RhdHVzOiBbXG4gICAgICAnY29tcGxldGUnLFxuICAgICAgJ2luY29tcGxldGUnLFxuICAgICAgJ1AnLFxuICAgICAgJ2YnLFxuICAgIF0sXG5cbiAgICB2YWxpZEV4aXQ6IFtcbiAgICAgICd0aW1lLW91dCcsXG4gICAgICAnc3VzcGVuZCcsXG4gICAgICAnbG9nb3V0JyxcbiAgICAgICdub3JtYWwnLFxuICAgIF0sXG4gICAgaW52YWxpZEV4aXQ6IFtcbiAgICAgICdjbG9zZScsXG4gICAgICAnZXhpdCcsXG4gICAgICAnY3Jhc2gnLFxuICAgIF0sXG5cbiAgICB2YWxpZFR5cGU6IFtcbiAgICAgICd0cnVlLWZhbHNlJyxcbiAgICAgICdjaG9pY2UnLFxuICAgICAgJ2ZpbGwtaW4nLFxuICAgICAgJ2xvbmctZmlsbC1pbicsXG4gICAgICAnbWF0Y2hpbmcnLFxuICAgICAgJ3BlcmZvcm1hbmNlJyxcbiAgICAgICdzZXF1ZW5jaW5nJyxcbiAgICAgICdsaWtlcnQnLFxuICAgICAgJ251bWVyaWMnLFxuICAgICAgJ290aGVyJyxcbiAgICBdLFxuICAgIGludmFsaWRUeXBlOiBbXG4gICAgICAnY29ycmVjdCcsXG4gICAgICAnd3JvbmcnLFxuICAgICAgJ2xvZ291dCcsXG4gICAgXSxcblxuICAgIHZhbGlkU2NvcmVSYW5nZTogW1xuICAgICAgJzEnLFxuICAgICAgJzUwJyxcbiAgICAgICcxMDAnLFxuICAgICAgJy0xMDAwMCcsXG4gICAgICAnLTEnLFxuICAgICAgJzEwMDAwJyxcbiAgICBdLFxuICAgIGludmFsaWRTY29yZVJhbmdlOiBbXG4gICAgICAnaW52YWxpZCcsXG4gICAgICAnYTEwMCcsXG4gICAgICAnLTEwMDAwMCcsXG4gICAgICAnMTAwMDAwJyxcbiAgICBdLFxuXG4gICAgdmFsaWRJU084NjAxRHVyYXRpb25zOiBbXG4gICAgICAnUDFZMzREVDIzSDQ1TTE1UycsXG4gICAgICAnUFQxTTQ1UycsXG4gICAgICAnUDBTJyxcbiAgICAgICdQVDc1TScsXG4gICAgXSxcbiAgICBpbnZhbGlkSVNPODYwMUR1cmF0aW9uczogW1xuICAgICAgJzAwOjA4OjQ1JyxcbiAgICAgICctUDFIJyxcbiAgICAgICcxeTQ1RCcsXG4gICAgICAnMCcsXG4gICAgXSxcblxuICAgIHZhbGlkQ29tbWVudDogW1xuICAgICAgJ3tsYW5nPWVuLTk4fSBsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ3tsYW5nPWVuZy05OC05fSBsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ3tsYW5nPWVuZy05OC05Zmhnan0nICsgJ3gnLnJlcGVhdCg0MDAwKSxcbiAgICAgICdsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ2xlYXJuZXIgY29tbWVudH0nLFxuICAgICAgJ3tsYW5nPWkteHh9JyxcbiAgICAgICd7bGFuZz1pfScsXG4gICAgICAnJyxcbiAgICBdLFxuICAgIGludmFsaWRDb21tZW50OiBbXG4gICAgICAne2xhbmc9aS19JyxcbiAgICAgICd7bGFuZz1pLXh9JyxcbiAgICAgICd7bGFuZz1lbmctOTgtOWZoZ2p9eyBsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ3tsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ3tsYW5nPWVuZy05OC05Zmhnan0nICsgJ3gnLnJlcGVhdCg0MDAxKSxcbiAgICAgICd7bGFuZz1lbmctOTgtOWZoZ2p9eycgKyAneCcucmVwZWF0KDM5OTkpLFxuICAgIF0sXG5cbiAgICB2YWxpZERlc2NyaXB0aW9uOiBbXG4gICAgICAne2xhbmc9ZW4tOTh9IGxlYXJuZXIgY29tbWVudCcsXG4gICAgICAne2xhbmc9ZW5nLTk4LTl9IGxlYXJuZXIgY29tbWVudCcsXG4gICAgICAne2xhbmc9ZW5nLTk4LTlmaGdqfScgKyAneCcucmVwZWF0KDI1MCksXG4gICAgICAnbGVhcm5lciBjb21tZW50JyxcbiAgICAgICdsZWFybmVyIGNvbW1lbnR9JyxcbiAgICAgICd7bGFuZz1pLXh4fScsXG4gICAgICAne2xhbmc9aX0nLFxuICAgICAgJycsXG4gICAgXSxcbiAgICBpbnZhbGlkRGVzY3JpcHRpb246IFtcbiAgICAgICd7bGFuZz1pLX0nLFxuICAgICAgJ3tsYW5nPWkteH0nLFxuICAgICAgJ3tsYW5nPWVuZy05OC05Zmhnan17IGxlYXJuZXIgY29tbWVudCcsXG4gICAgICAne2xlYXJuZXIgY29tbWVudCcsXG4gICAgICAne2xhbmc9ZW5nLTk4LTlmaGdqfScgKyAneCcucmVwZWF0KDI1MSksXG4gICAgICAne2xhbmc9ZW5nLTk4LTlmaGdqfXsnICsgJ3gnLnJlcGVhdCgyNDkpLFxuICAgIF0sXG5cbiAgICB2YWxpZE5hdlJlcXVlc3Q6IFtcbiAgICAgICdwcmV2aW91cycsXG4gICAgICAnY29udGludWUnLFxuICAgICAgJ2V4aXQnLFxuICAgICAgJ2V4aXRBbGwnLFxuICAgICAgJ2FiYW5kb24nLFxuICAgICAgJ2FiYW5kb25BbGwnLFxuICAgICAgJ3N1c3BlbmRBbGwnLFxuICAgIF0sXG4gICAgaW52YWxpZE5hdlJlcXVlc3Q6IFtcbiAgICAgICdjbG9zZScsXG4gICAgICAncXVpdCcsXG4gICAgICAnbmV4dCcsXG4gICAgICAnYmVmb3JlJyxcbiAgICBdLFxuICB9LFxufTtcbiIsImV4cG9ydCBjb25zdCB2YWxpZF9sYW5ndWFnZXMgPSB7XG4gICdhYSc6ICdhYScsICdhYic6ICdhYicsICdhZSc6ICdhZScsICdhZic6ICdhZicsICdhayc6ICdhaycsICdhbSc6ICdhbScsXG4gICdhbic6ICdhbicsICdhcic6ICdhcicsICdhcyc6ICdhcycsICdhdic6ICdhdicsICdheSc6ICdheScsICdheic6ICdheicsXG4gICdiYSc6ICdiYScsICdiZSc6ICdiZScsICdiZyc6ICdiZycsICdiaCc6ICdiaCcsICdiaSc6ICdiaScsICdibSc6ICdibScsXG4gICdibic6ICdibicsICdibyc6ICdibycsICdicic6ICdicicsICdicyc6ICdicycsICdjYSc6ICdjYScsICdjZSc6ICdjZScsXG4gICdjaCc6ICdjaCcsICdjbyc6ICdjbycsICdjcic6ICdjcicsICdjcyc6ICdjcycsICdjdSc6ICdjdScsICdjdic6ICdjdicsXG4gICdjeSc6ICdjeScsICdkYSc6ICdkYScsICdkZSc6ICdkZScsICdkdic6ICdkdicsICdkeic6ICdkeicsICdlZSc6ICdlZScsXG4gICdlbCc6ICdlbCcsICdlbic6ICdlbicsICdlbyc6ICdlbycsICdlcyc6ICdlcycsICdldCc6ICdldCcsICdldSc6ICdldScsXG4gICdmYSc6ICdmYScsICdmZic6ICdmZicsICdmaSc6ICdmaScsICdmaic6ICdmaicsICdmbyc6ICdmbycsICdmcic6ICdmcicsXG4gICdmeSc6ICdmeScsICdnYSc6ICdnYScsICdnZCc6ICdnZCcsICdnbCc6ICdnbCcsICdnbic6ICdnbicsICdndSc6ICdndScsXG4gICdndic6ICdndicsICdoYSc6ICdoYScsICdoZSc6ICdoZScsICdoaSc6ICdoaScsICdobyc6ICdobycsICdocic6ICdocicsXG4gICdodCc6ICdodCcsICdodSc6ICdodScsICdoeSc6ICdoeScsICdoeic6ICdoeicsICdpYSc6ICdpYScsICdpZCc6ICdpZCcsXG4gICdpZSc6ICdpZScsICdpZyc6ICdpZycsICdpaSc6ICdpaScsICdpayc6ICdpaycsICdpbyc6ICdpbycsICdpcyc6ICdpcycsXG4gICdpdCc6ICdpdCcsICdpdSc6ICdpdScsICdqYSc6ICdqYScsICdqdic6ICdqdicsICdrYSc6ICdrYScsICdrZyc6ICdrZycsXG4gICdraSc6ICdraScsICdraic6ICdraicsICdrayc6ICdraycsICdrbCc6ICdrbCcsICdrbSc6ICdrbScsICdrbic6ICdrbicsXG4gICdrbyc6ICdrbycsICdrcic6ICdrcicsICdrcyc6ICdrcycsICdrdSc6ICdrdScsICdrdic6ICdrdicsICdrdyc6ICdrdycsXG4gICdreSc6ICdreScsICdsYSc6ICdsYScsICdsYic6ICdsYicsICdsZyc6ICdsZycsICdsaSc6ICdsaScsICdsbic6ICdsbicsXG4gICdsbyc6ICdsbycsICdsdCc6ICdsdCcsICdsdSc6ICdsdScsICdsdic6ICdsdicsICdtZyc6ICdtZycsICdtaCc6ICdtaCcsXG4gICdtaSc6ICdtaScsICdtayc6ICdtaycsICdtbCc6ICdtbCcsICdtbic6ICdtbicsICdtbyc6ICdtbycsICdtcic6ICdtcicsXG4gICdtcyc6ICdtcycsICdtdCc6ICdtdCcsICdteSc6ICdteScsICduYSc6ICduYScsICduYic6ICduYicsICduZCc6ICduZCcsXG4gICduZSc6ICduZScsICduZyc6ICduZycsICdubCc6ICdubCcsICdubic6ICdubicsICdubyc6ICdubycsICducic6ICducicsXG4gICdudic6ICdudicsICdueSc6ICdueScsICdvYyc6ICdvYycsICdvaic6ICdvaicsICdvbSc6ICdvbScsICdvcic6ICdvcicsXG4gICdvcyc6ICdvcycsICdwYSc6ICdwYScsICdwaSc6ICdwaScsICdwbCc6ICdwbCcsICdwcyc6ICdwcycsICdwdCc6ICdwdCcsXG4gICdxdSc6ICdxdScsICdybSc6ICdybScsICdybic6ICdybicsICdybyc6ICdybycsICdydSc6ICdydScsICdydyc6ICdydycsXG4gICdzYSc6ICdzYScsICdzYyc6ICdzYycsICdzZCc6ICdzZCcsICdzZSc6ICdzZScsICdzZyc6ICdzZycsICdzaCc6ICdzaCcsXG4gICdzaSc6ICdzaScsICdzayc6ICdzaycsICdzbCc6ICdzbCcsICdzbSc6ICdzbScsICdzbic6ICdzbicsICdzbyc6ICdzbycsXG4gICdzcSc6ICdzcScsICdzcic6ICdzcicsICdzcyc6ICdzcycsICdzdCc6ICdzdCcsICdzdSc6ICdzdScsICdzdic6ICdzdicsXG4gICdzdyc6ICdzdycsICd0YSc6ICd0YScsICd0ZSc6ICd0ZScsICd0Zyc6ICd0ZycsICd0aCc6ICd0aCcsICd0aSc6ICd0aScsXG4gICd0ayc6ICd0aycsICd0bCc6ICd0bCcsICd0bic6ICd0bicsICd0byc6ICd0bycsICd0cic6ICd0cicsICd0cyc6ICd0cycsXG4gICd0dCc6ICd0dCcsICd0dyc6ICd0dycsICd0eSc6ICd0eScsICd1Zyc6ICd1ZycsICd1ayc6ICd1aycsICd1cic6ICd1cicsXG4gICd1eic6ICd1eicsICd2ZSc6ICd2ZScsICd2aSc6ICd2aScsICd2byc6ICd2bycsICd3YSc6ICd3YScsICd3byc6ICd3bycsXG4gICd4aCc6ICd4aCcsICd5aSc6ICd5aScsICd5byc6ICd5bycsICd6YSc6ICd6YScsICd6aCc6ICd6aCcsICd6dSc6ICd6dScsXG4gICdhYXInOiAnYWFyJywgJ2Fiayc6ICdhYmsnLCAnYXZlJzogJ2F2ZScsICdhZnInOiAnYWZyJywgJ2FrYSc6ICdha2EnLFxuICAnYW1oJzogJ2FtaCcsICdhcmcnOiAnYXJnJywgJ2FyYSc6ICdhcmEnLCAnYXNtJzogJ2FzbScsICdhdmEnOiAnYXZhJyxcbiAgJ2F5bSc6ICdheW0nLCAnYXplJzogJ2F6ZScsICdiYWsnOiAnYmFrJywgJ2JlbCc6ICdiZWwnLCAnYnVsJzogJ2J1bCcsXG4gICdiaWgnOiAnYmloJywgJ2Jpcyc6ICdiaXMnLCAnYmFtJzogJ2JhbScsICdiZW4nOiAnYmVuJywgJ3RpYic6ICd0aWInLFxuICAnYm9kJzogJ2JvZCcsICdicmUnOiAnYnJlJywgJ2Jvcyc6ICdib3MnLCAnY2F0JzogJ2NhdCcsICdjaGUnOiAnY2hlJyxcbiAgJ2NoYSc6ICdjaGEnLCAnY29zJzogJ2NvcycsICdjcmUnOiAnY3JlJywgJ2N6ZSc6ICdjemUnLCAnY2VzJzogJ2NlcycsXG4gICdjaHUnOiAnY2h1JywgJ2Nodic6ICdjaHYnLCAnd2VsJzogJ3dlbCcsICdjeW0nOiAnY3ltJywgJ2Rhbic6ICdkYW4nLFxuICAnZ2VyJzogJ2dlcicsICdkZXUnOiAnZGV1JywgJ2Rpdic6ICdkaXYnLCAnZHpvJzogJ2R6bycsICdld2UnOiAnZXdlJyxcbiAgJ2dyZSc6ICdncmUnLCAnZWxsJzogJ2VsbCcsICdlbmcnOiAnZW5nJywgJ2Vwbyc6ICdlcG8nLCAnc3BhJzogJ3NwYScsXG4gICdlc3QnOiAnZXN0JywgJ2JhcSc6ICdiYXEnLCAnZXVzJzogJ2V1cycsICdwZXInOiAncGVyJywgJ2Zhcyc6ICdmYXMnLFxuICAnZnVsJzogJ2Z1bCcsICdmaW4nOiAnZmluJywgJ2Zpaic6ICdmaWonLCAnZmFvJzogJ2ZhbycsICdmcmUnOiAnZnJlJyxcbiAgJ2ZyYSc6ICdmcmEnLCAnZnJ5JzogJ2ZyeScsICdnbGUnOiAnZ2xlJywgJ2dsYSc6ICdnbGEnLCAnZ2xnJzogJ2dsZycsXG4gICdncm4nOiAnZ3JuJywgJ2d1aic6ICdndWonLCAnZ2x2JzogJ2dsdicsICdoYXUnOiAnaGF1JywgJ2hlYic6ICdoZWInLFxuICAnaGluJzogJ2hpbicsICdobW8nOiAnaG1vJywgJ2hydic6ICdocnYnLCAnaGF0JzogJ2hhdCcsICdodW4nOiAnaHVuJyxcbiAgJ2FybSc6ICdhcm0nLCAnaHllJzogJ2h5ZScsICdoZXInOiAnaGVyJywgJ2luYSc6ICdpbmEnLCAnaW5kJzogJ2luZCcsXG4gICdpbGUnOiAnaWxlJywgJ2libyc6ICdpYm8nLCAnaWlpJzogJ2lpaScsICdpcGsnOiAnaXBrJywgJ2lkbyc6ICdpZG8nLFxuICAnaWNlJzogJ2ljZScsICdpc2wnOiAnaXNsJywgJ2l0YSc6ICdpdGEnLCAnaWt1JzogJ2lrdScsICdqcG4nOiAnanBuJyxcbiAgJ2phdic6ICdqYXYnLCAnZ2VvJzogJ2dlbycsICdrYXQnOiAna2F0JywgJ2tvbic6ICdrb24nLCAna2lrJzogJ2tpaycsXG4gICdrdWEnOiAna3VhJywgJ2theic6ICdrYXonLCAna2FsJzogJ2thbCcsICdraG0nOiAna2htJywgJ2thbic6ICdrYW4nLFxuICAna29yJzogJ2tvcicsICdrYXUnOiAna2F1JywgJ2thcyc6ICdrYXMnLCAna3VyJzogJ2t1cicsICdrb20nOiAna29tJyxcbiAgJ2Nvcic6ICdjb3InLCAna2lyJzogJ2tpcicsICdsYXQnOiAnbGF0JywgJ2x0eic6ICdsdHonLCAnbHVnJzogJ2x1ZycsXG4gICdsaW0nOiAnbGltJywgJ2xpbic6ICdsaW4nLCAnbGFvJzogJ2xhbycsICdsaXQnOiAnbGl0JywgJ2x1Yic6ICdsdWInLFxuICAnbGF2JzogJ2xhdicsICdtbGcnOiAnbWxnJywgJ21haCc6ICdtYWgnLCAnbWFvJzogJ21hbycsICdtcmknOiAnbXJpJyxcbiAgJ21hYyc6ICdtYWMnLCAnbWtkJzogJ21rZCcsICdtYWwnOiAnbWFsJywgJ21vbic6ICdtb24nLCAnbW9sJzogJ21vbCcsXG4gICdtYXInOiAnbWFyJywgJ21heSc6ICdtYXknLCAnbXNhJzogJ21zYScsICdtbHQnOiAnbWx0JywgJ2J1cic6ICdidXInLFxuICAnbXlhJzogJ215YScsICduYXUnOiAnbmF1JywgJ25vYic6ICdub2InLCAnbmRlJzogJ25kZScsICduZXAnOiAnbmVwJyxcbiAgJ25kbyc6ICduZG8nLCAnZHV0JzogJ2R1dCcsICdubGQnOiAnbmxkJywgJ25ubyc6ICdubm8nLCAnbm9yJzogJ25vcicsXG4gICduYmwnOiAnbmJsJywgJ25hdic6ICduYXYnLCAnbnlhJzogJ255YScsICdvY2knOiAnb2NpJywgJ29qaSc6ICdvamknLFxuICAnb3JtJzogJ29ybScsICdvcmknOiAnb3JpJywgJ29zcyc6ICdvc3MnLCAncGFuJzogJ3BhbicsICdwbGknOiAncGxpJyxcbiAgJ3BvbCc6ICdwb2wnLCAncHVzJzogJ3B1cycsICdwb3InOiAncG9yJywgJ3F1ZSc6ICdxdWUnLCAncm9oJzogJ3JvaCcsXG4gICdydW4nOiAncnVuJywgJ3J1bSc6ICdydW0nLCAncm9uJzogJ3JvbicsICdydXMnOiAncnVzJywgJ2tpbic6ICdraW4nLFxuICAnc2FuJzogJ3NhbicsICdzcmQnOiAnc3JkJywgJ3NuZCc6ICdzbmQnLCAnc21lJzogJ3NtZScsICdzYWcnOiAnc2FnJyxcbiAgJ3Nsbyc6ICdzbG8nLCAnc2luJzogJ3NpbicsICdzbGsnOiAnc2xrJywgJ3Nsdic6ICdzbHYnLCAnc21vJzogJ3NtbycsXG4gICdzbmEnOiAnc25hJywgJ3NvbSc6ICdzb20nLCAnYWxiJzogJ2FsYicsICdzcWknOiAnc3FpJywgJ3NycCc6ICdzcnAnLFxuICAnc3N3JzogJ3NzdycsICdzb3QnOiAnc290JywgJ3N1bic6ICdzdW4nLCAnc3dlJzogJ3N3ZScsICdzd2EnOiAnc3dhJyxcbiAgJ3RhbSc6ICd0YW0nLCAndGVsJzogJ3RlbCcsICd0Z2snOiAndGdrJywgJ3RoYSc6ICd0aGEnLCAndGlyJzogJ3RpcicsXG4gICd0dWsnOiAndHVrJywgJ3RnbCc6ICd0Z2wnLCAndHNuJzogJ3RzbicsICd0b24nOiAndG9uJywgJ3R1cic6ICd0dXInLFxuICAndHNvJzogJ3RzbycsICd0YXQnOiAndGF0JywgJ3R3aSc6ICd0d2knLCAndGFoJzogJ3RhaCcsICd1aWcnOiAndWlnJyxcbiAgJ3Vrcic6ICd1a3InLCAndXJkJzogJ3VyZCcsICd1emInOiAndXpiJywgJ3Zlbic6ICd2ZW4nLCAndmllJzogJ3ZpZScsXG4gICd2b2wnOiAndm9sJywgJ3dsbic6ICd3bG4nLCAnd29sJzogJ3dvbCcsICd4aG8nOiAneGhvJywgJ3lpZCc6ICd5aWQnLFxuICAneW9yJzogJ3lvcicsICd6aGEnOiAnemhhJywgJ2NoaSc6ICdjaGknLCAnemhvJzogJ3pobycsICd6dWwnOiAnenVsJyxcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3Njb3JtMTJfdmFsdWVzLCBzY29ybTIwMDRfdmFsdWVzfSBmcm9tICcuL2ZpZWxkX3ZhbHVlcyc7XG5cbmV4cG9ydCBjb25zdCBzY29ybTEyX3JlZ2V4ID0ge1xuICBDTUlTdHJpbmcyNTY6ICdeLnswLDI1NX0kJyxcbiAgQ01JU3RyaW5nNDA5NjogJ14uezAsNDA5Nn0kJyxcbiAgQ01JVGltZTogJ14oPzpbMDFdXFxcXGR8MlswMTIzXSk6KD86WzAxMjM0NV1cXFxcZCk6KD86WzAxMjM0NV1cXFxcZCkkJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlUaW1lc3BhbjogJ14oWzAtOV17Mix9KTooWzAtOV17Mn0pOihbMC05XXsyfSkoXFwuWzAtOV17MSwyfSk/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JSW50ZWdlcjogJ15cXFxcZCskJyxcbiAgQ01JU0ludGVnZXI6ICdeLT8oWzAtOV0rKSQnLFxuICBDTUlEZWNpbWFsOiAnXi0/KFswLTldezAsM30pKFxcLlswLTldKik/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JSWRlbnRpZmllcjogJ15bXFxcXHUwMDIxLVxcXFx1MDA3RV17MCwyNTV9JCcsXG4gIENNSUZlZWRiYWNrOiAnXi57MCwyNTV9JCcsIC8vIFRoaXMgbXVzdCBiZSByZWRlZmluZWRcbiAgQ01JSW5kZXg6ICdbLl9dKFxcXFxkKykuJyxcblxuICAvLyBWb2NhYnVsYXJ5IERhdGEgVHlwZSBEZWZpbml0aW9uXG4gIENNSVN0YXR1czogJ14oJyArIHNjb3JtMTJfdmFsdWVzLnZhbGlkTGVzc29uU3RhdHVzLmpvaW4oJ3wnKSArICcpJCcsXG4gIENNSVN0YXR1czI6ICdeKCcgKyBzY29ybTEyX3ZhbHVlcy52YWxpZExlc3NvblN0YXR1cy5qb2luKCd8JykgKyAnfG5vdCBhdHRlbXB0ZWQpJCcsXG4gIENNSUV4aXQ6ICdeKCcgKyBzY29ybTEyX3ZhbHVlcy52YWxpZEV4aXQuam9pbignfCcpICsgJ3wpJCcsXG4gIENNSVR5cGU6ICdeKCcgKyBzY29ybTEyX3ZhbHVlcy52YWxpZFR5cGUuam9pbignfCcpICsgJykkJyxcbiAgQ01JUmVzdWx0OiAnXignICsgc2Nvcm0xMl92YWx1ZXMudmFsaWRSZXN1bHQuam9pbignfCcpICsgJ3woWzAtOV17MCwzfSk/KFxcXFwuWzAtOV0qKT8pJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgTkFWRXZlbnQ6ICdeKHByZXZpb3VzfGNvbnRpbnVlKSQnLFxuXG4gIC8vIERhdGEgcmFuZ2VzXG4gIHNjb3JlX3JhbmdlOiAnMCMxMDAnLFxuICBhdWRpb19yYW5nZTogJy0xIzEwMCcsXG4gIHNwZWVkX3JhbmdlOiAnLTEwMCMxMDAnLFxuICB3ZWlnaHRpbmdfcmFuZ2U6ICctMTAwIzEwMCcsXG4gIHRleHRfcmFuZ2U6ICctMSMxJyxcbn07XG5cbmV4cG9ydCBjb25zdCBhaWNjX3JlZ2V4ID0ge1xuICAuLi5zY29ybTEyX3JlZ2V4LCAuLi57XG4gICAgQ01JSWRlbnRpZmllcjogJ15cXFxcd3sxLDI1NX0kJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzY29ybTIwMDRfcmVnZXggPSB7XG4gIENNSVN0cmluZzIwMDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCwyMDB9JCcsXG4gIENNSVN0cmluZzI1MDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCwyNTB9JCcsXG4gIENNSVN0cmluZzEwMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsMTAwMH0kJyxcbiAgQ01JU3RyaW5nNDAwMDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCw0MDAwfSQnLFxuICBDTUlTdHJpbmc2NDAwMDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCw2NDAwMH0kJyxcbiAgQ01JTGFuZzogJ14oW2EtekEtWl17MiwzfXxpfHgpKFxcLVthLXpBLVowLTlcXC1dezIsOH0pPyR8XiQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxhbmdTdHJpbmcyNTA6ICdeKFxce2xhbmc9KFthLXpBLVpdezIsM318aXx4KShcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pPygoPyFcXHsuKiQpLnswLDI1MH0kKT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nY3I6ICdeKChcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCk/KFxcLVthLXpBLVowLTlcXC1dezIsOH0pP1xcfSkpKC4qPykkJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nU3RyaW5nMjUwY3I6ICdeKChcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCk/KFxcLVthLXpBLVowLTlcXC1dezIsOH0pP1xcfSk/KC57MCwyNTB9KT8pPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxhbmdTdHJpbmc0MDAwOiAnXihcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCkoXFwtW2EtekEtWjAtOVxcLV17Miw4fSk/XFx9KT8oKD8hXFx7LiokKS57MCw0MDAwfSQpPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSVRpbWU6ICdeKDE5WzctOV17MX1bMC05XXsxfXwyMFswLTJdezF9WzAtOV17MX18MjAzWzAtOF17MX0pKCgtKDBbMS05XXsxfXwxWzAtMl17MX0pKSgoLSgwWzEtOV17MX18WzEtMl17MX1bMC05XXsxfXwzWzAtMV17MX0pKShUKFswLTFdezF9WzAtOV17MX18MlswLTNdezF9KSgoOlswLTVdezF9WzAtOV17MX0pKCg6WzAtNV17MX1bMC05XXsxfSkoKFxcXFwuWzAtOV17MSwyfSkoKFp8KFsrfC1dKFswLTFdezF9WzAtOV17MX18MlswLTNdezF9KSkpKDpbMC01XXsxfVswLTldezF9KT8pPyk/KT8pPyk/KT8pPyQnLFxuICBDTUlUaW1lc3BhbjogJ15QKD86KFsuLFxcXFxkXSspWSk/KD86KFsuLFxcXFxkXSspTSk/KD86KFsuLFxcXFxkXSspVyk/KD86KFsuLFxcXFxkXSspRCk/KD86VD8oPzooWy4sXFxcXGRdKylIKT8oPzooWy4sXFxcXGRdKylNKT8oPzooWy4sXFxcXGRdKylTKT8pPyQnLFxuICBDTUlJbnRlZ2VyOiAnXlxcXFxkKyQnLFxuICBDTUlTSW50ZWdlcjogJ14tPyhbMC05XSspJCcsXG4gIENNSURlY2ltYWw6ICdeLT8oWzAtOV17MSw1fSkoXFxcXC5bMC05XXsxLDE4fSk/JCcsXG4gIENNSUlkZW50aWZpZXI6ICdeXFxcXFN7MSwyNTB9W2EtekEtWjAtOV0kJyxcbiAgQ01JU2hvcnRJZGVudGlmaWVyOiAnXltcXFxcd1xcLl17MSwyNTB9JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTG9uZ0lkZW50aWZpZXI6ICdeKD86KD8hdXJuOilcXFxcU3sxLDQwMDB9fHVybjpbQS1aYS16MC05LV17MSwzMX06XFxcXFN7MSw0MDAwfSkkJyxcbiAgQ01JRmVlZGJhY2s6ICdeLiokJywgLy8gVGhpcyBtdXN0IGJlIHJlZGVmaW5lZFxuICBDTUlJbmRleDogJ1suX10oXFxcXGQrKS4nLFxuICBDTUlJbmRleFN0b3JlOiAnLk4oXFxcXGQrKS4nLFxuXG4gIC8vIFZvY2FidWxhcnkgRGF0YSBUeXBlIERlZmluaXRpb25cbiAgQ01JQ1N0YXR1czogJ14oJyArIHNjb3JtMjAwNF92YWx1ZXMudmFsaWRDU3RhdHVzLmpvaW4oJ3wnKSArICcpJCcsXG4gIENNSVNTdGF0dXM6ICdeKCcgKyBzY29ybTIwMDRfdmFsdWVzLnZhbGlkU1N0YXR1cy5qb2luKCd8JykgKyAnKSQnLFxuICBDTUlFeGl0OiAnXignICsgc2Nvcm0yMDA0X3ZhbHVlcy52YWxpZEV4aXQuam9pbignfCcpICsgJykkJyxcbiAgQ01JVHlwZTogJ14oJyArIHNjb3JtMjAwNF92YWx1ZXMudmFsaWRUeXBlLmpvaW4oJ3wnKSArICcpJCcsXG4gIENNSVJlc3VsdDogJ14oJyArIHNjb3JtMjAwNF92YWx1ZXMudmFsaWRSZXN1bHQuam9pbignfCcpICsgJ3wtPyhbMC05XXsxLDR9KShcXFxcLlswLTldezEsMTh9KT8pJCcsXG4gIE5BVkV2ZW50OiAnXignICsgc2Nvcm0yMDA0X3ZhbHVlcy52YWxpZE5hdlJlcXVlc3Quam9pbignfCcpICsgJ3xcXHt0YXJnZXQ9XFxcXFN7MCwyMDB9W2EtekEtWjAtOV1cXH1jaG9pY2V8anVtcCkkJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBOQVZCb29sZWFuOiAnXih1bmtub3dufHRydWV8ZmFsc2UkKScsXG4gIE5BVlRhcmdldDogJ14ocHJldmlvdXN8Y29udGludWV8Y2hvaWNlLnt0YXJnZXQ9XFxcXFN7MCwyMDB9W2EtekEtWjAtOV19KSQnLFxuXG4gIC8vIERhdGEgcmFuZ2VzXG4gIHNjYWxlZF9yYW5nZTogJy0xIzEnLFxuICBhdWRpb19yYW5nZTogJzAjKicsXG4gIHNwZWVkX3JhbmdlOiAnMCMqJyxcbiAgdGV4dF9yYW5nZTogJy0xIzEnLFxuICBwcm9ncmVzc19yYW5nZTogJzAjMScsXG59O1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7c2Nvcm0yMDA0X3JlZ2V4fSBmcm9tICcuL3JlZ2V4JztcblxuZXhwb3J0IGNvbnN0IGxlYXJuZXJfcmVzcG9uc2VzID0ge1xuICAndHJ1ZS1mYWxzZSc6IHtcbiAgICBmb3JtYXQ6ICdedHJ1ZSR8XmZhbHNlJCcsXG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ2Nob2ljZSc6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbWF4OiAzNixcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogdHJ1ZSxcbiAgfSxcbiAgJ2ZpbGwtaW4nOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzI1MCxcbiAgICBtYXg6IDEwLFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ2xvbmctZmlsbC1pbic6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nNDAwMCxcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnbWF0Y2hpbmcnOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIGZvcm1hdDI6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbWF4OiAzNixcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIGRlbGltaXRlcjI6ICdbLl0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdwZXJmb3JtYW5jZSc6IHtcbiAgICBmb3JtYXQ6ICdeJHwnICsgc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBmb3JtYXQyOiBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCArICd8XiR8JyArXG4gICAgICAgIHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbWF4OiAyNTAsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICBkZWxpbWl0ZXIyOiAnWy5dJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnc2VxdWVuY2luZyc6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbWF4OiAzNixcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdsaWtlcnQnOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdudW1lcmljJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwsXG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ290aGVyJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVN0cmluZzQwMDAsXG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBjb3JyZWN0X3Jlc3BvbnNlcyA9IHtcbiAgJ3RydWUtZmFsc2UnOiB7XG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogJ150cnVlJHxeZmFsc2UkJyxcbiAgICBsaW1pdDogMSxcbiAgfSxcbiAgJ2Nob2ljZSc6IHtcbiAgICBtYXg6IDM2LFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgdW5pcXVlOiB0cnVlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICB9LFxuICAnZmlsbC1pbic6IHtcbiAgICBtYXg6IDEwLFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSUxhbmdTdHJpbmcyNTBjcixcbiAgfSxcbiAgJ2xvbmctZmlsbC1pbic6IHtcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogdHJ1ZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nNDAwMCxcbiAgfSxcbiAgJ21hdGNoaW5nJzoge1xuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICBkZWxpbWl0ZXIyOiAnWy5dJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIGZvcm1hdDI6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gIH0sXG4gICdwZXJmb3JtYW5jZSc6IHtcbiAgICBtYXg6IDI1MCxcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIGRlbGltaXRlcjI6ICdbLl0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6ICdeJHwnICsgc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBmb3JtYXQyOiBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCArICd8XiR8JyArXG4gICAgICAgIHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gIH0sXG4gICdzZXF1ZW5jaW5nJzoge1xuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICB9LFxuICAnbGlrZXJ0Jzoge1xuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbGltaXQ6IDEsXG4gIH0sXG4gICdudW1lcmljJzoge1xuICAgIG1heDogMixcbiAgICBkZWxpbWl0ZXI6ICdbOl0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlEZWNpbWFsLFxuICAgIGxpbWl0OiAxLFxuICB9LFxuICAnb3RoZXInOiB7XG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVN0cmluZzQwMDAsXG4gICAgbGltaXQ6IDEsXG4gIH0sXG59O1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBEYXRhIFZhbGlkYXRpb24gRXhjZXB0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byB0YWtlIGluIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZXJyb3JDb2RlOiBudW1iZXIpIHtcbiAgICBzdXBlcihlcnJvckNvZGUpO1xuICAgIHRoaXMuI2Vycm9yQ29kZSA9IGVycm9yQ29kZTtcbiAgfVxuXG4gICNlcnJvckNvZGU7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2Vycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZXJyb3JDb2RlKCkge1xuICAgIHJldHVybiB0aGlzLiNlcnJvckNvZGU7XG4gIH1cblxuICAvKipcbiAgICogVHJ5aW5nIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IEVycm9yIG1lc3NhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Vycm9yQ29kZSArICcnO1xuICB9XG59XG4iLCJpbXBvcnQgU2Nvcm0yMDA0QVBJIGZyb20gJy4vU2Nvcm0yMDA0QVBJJztcbmltcG9ydCBTY29ybTEyQVBJIGZyb20gJy4vU2Nvcm0xMkFQSSc7XG5pbXBvcnQgQUlDQyBmcm9tICcuL0FJQ0MnO1xuXG53aW5kb3cuU2Nvcm0xMkFQSSA9IFNjb3JtMTJBUEk7XG53aW5kb3cuU2Nvcm0yMDA0QVBJID0gU2Nvcm0yMDA0QVBJO1xud2luZG93LkFJQ0MgPSBBSUNDO1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBjb25zdCBTRUNPTkRTX1BFUl9TRUNPTkQgPSAxLjA7XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfTUlOVVRFID0gNjA7XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfSE9VUiA9IDYwICogU0VDT05EU19QRVJfTUlOVVRFO1xuZXhwb3J0IGNvbnN0IFNFQ09ORFNfUEVSX0RBWSA9IDI0ICogU0VDT05EU19QRVJfSE9VUjtcblxuY29uc3QgZGVzaWduYXRpb25zID0gW1xuICBbJ0QnLCBTRUNPTkRTX1BFUl9EQVldLFxuICBbJ0gnLCBTRUNPTkRTX1BFUl9IT1VSXSxcbiAgWydNJywgU0VDT05EU19QRVJfTUlOVVRFXSxcbiAgWydTJywgU0VDT05EU19QRVJfU0VDT05EXSxcbl07XG5cbi8qKlxuICogQ29udmVydHMgYSBOdW1iZXIgdG8gYSBTdHJpbmcgb2YgSEg6TU06U1NcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gdG90YWxTZWNvbmRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRzQXNISE1NU1ModG90YWxTZWNvbmRzOiBOdW1iZXIpIHtcbiAgLy8gU0NPUk0gc3BlYyBkb2VzIG5vdCBkZWFsIHdpdGggbmVnYXRpdmUgZHVyYXRpb25zLCBnaXZlIHplcm8gYmFja1xuICBpZiAoIXRvdGFsU2Vjb25kcyB8fCB0b3RhbFNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybiAnMDA6MDA6MDAnO1xuICB9XG5cbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIFNFQ09ORFNfUEVSX0hPVVIpO1xuXG4gIGNvbnN0IGRhdGVPYmogPSBuZXcgRGF0ZSh0b3RhbFNlY29uZHMgKiAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IGRhdGVPYmouZ2V0VVRDTWludXRlcygpO1xuICAvLyBtYWtlIHN1cmUgd2UgYWRkIGFueSBwb3NzaWJsZSBkZWNpbWFsIHZhbHVlXG4gIGNvbnN0IHNlY29uZHMgPSBkYXRlT2JqLmdldFNlY29uZHMoKSArICh0b3RhbFNlY29uZHMgJSAxLjApO1xuXG4gIHJldHVybiBob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnOicgK1xuICAgICAgbWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnOicgK1xuICAgICAgc2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBmcm9tIElTTyA4NjAxIER1cmF0aW9uXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHNlY29uZHNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlY29uZHNBc0lTT0R1cmF0aW9uKHNlY29uZHM6IE51bWJlcikge1xuICAvLyBTQ09STSBzcGVjIGRvZXMgbm90IGRlYWwgd2l0aCBuZWdhdGl2ZSBkdXJhdGlvbnMsIGdpdmUgemVybyBiYWNrXG4gIGlmICghc2Vjb25kcyB8fCBzZWNvbmRzIDw9IDApIHtcbiAgICByZXR1cm4gJ1BUMFMnO1xuICB9XG5cbiAgbGV0IGR1cmF0aW9uID0gJ1AnO1xuICBsZXQgcmVtYWluZGVyID0gc2Vjb25kcztcblxuICBkZXNpZ25hdGlvbnMuZm9yRWFjaCgoW3NpZ24sIGN1cnJlbnRfc2Vjb25kc10pID0+IHtcbiAgICBsZXQgdmFsdWUgPSBNYXRoLmZsb29yKHJlbWFpbmRlciAvIGN1cnJlbnRfc2Vjb25kcyk7XG5cbiAgICByZW1haW5kZXIgPSByZW1haW5kZXIgJSBjdXJyZW50X3NlY29uZHM7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbnl0aGluZyBsZWZ0IGluIHRoZSByZW1haW5kZXIsIGFuZCB3ZSdyZSBjdXJyZW50bHkgYWRkaW5nXG4gICAgLy8gc2Vjb25kcyB0byB0aGUgZHVyYXRpb24sIGdvIGFoZWFkIGFuZCBhZGQgdGhlIGRlY2ltYWwgdG8gdGhlIHNlY29uZHNcbiAgICBpZiAoc2lnbiA9PT0gJ1MnICYmIHJlbWFpbmRlciA+IDApIHtcbiAgICAgIHZhbHVlICs9IHJlbWFpbmRlcjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICgoZHVyYXRpb24uaW5kZXhPZignRCcpID4gMCB8fFxuICAgICAgICAgIHNpZ24gPT09ICdIJyB8fCBzaWduID09PSAnTScgfHwgc2lnbiA9PT0gJ1MnKSAmJlxuICAgICAgICAgIGR1cmF0aW9uLmluZGV4T2YoJ1QnKSA9PT0gLTEpIHtcbiAgICAgICAgZHVyYXRpb24gKz0gJ1QnO1xuICAgICAgfVxuICAgICAgZHVyYXRpb24gKz0gYCR7dmFsdWV9JHtzaWdufWA7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZHVyYXRpb247XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBmcm9tIEhIOk1NOlNTLkRERERERFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lU3RyaW5nXG4gKiBAcGFyYW0ge1JlZ0V4cH0gdGltZVJlZ2V4XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lQXNTZWNvbmRzKHRpbWVTdHJpbmc6IFN0cmluZywgdGltZVJlZ2V4OiBSZWdFeHApIHtcbiAgaWYgKCF0aW1lU3RyaW5nIHx8IHR5cGVvZiB0aW1lU3RyaW5nICE9PSAnc3RyaW5nJyB8fFxuICAgICAgIXRpbWVTdHJpbmcubWF0Y2godGltZVJlZ2V4KSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IHBhcnRzID0gdGltZVN0cmluZy5zcGxpdCgnOicpO1xuICBjb25zdCBob3VycyA9IE51bWJlcihwYXJ0c1swXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBOdW1iZXIocGFydHNbMV0pO1xuICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKHBhcnRzWzJdKTtcbiAgcmV0dXJuIChob3VycyAqIDM2MDApICsgKG1pbnV0ZXMgKiA2MCkgKyBzZWNvbmRzO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSBJU08gODYwMSBEdXJhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdXJhdGlvblxuICogQHBhcmFtIHtSZWdFeHB9IGR1cmF0aW9uUmVnZXhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldER1cmF0aW9uQXNTZWNvbmRzKGR1cmF0aW9uOiBTdHJpbmcsIGR1cmF0aW9uUmVnZXg6IFJlZ0V4cCkge1xuICBpZiAoIWR1cmF0aW9uIHx8ICFkdXJhdGlvbi5tYXRjaChkdXJhdGlvblJlZ2V4KSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgWywgeWVhcnMsIG1vbnRocywgLCBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kc10gPSBuZXcgUmVnRXhwKFxuICAgICAgZHVyYXRpb25SZWdleCkuZXhlYyhkdXJhdGlvbikgfHwgW107XG5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgY29uc3QgYW5jaG9yID0gbmV3IERhdGUobm93KTtcbiAgYW5jaG9yLnNldEZ1bGxZZWFyKGFuY2hvci5nZXRGdWxsWWVhcigpICsgTnVtYmVyKHllYXJzIHx8IDApKTtcbiAgYW5jaG9yLnNldE1vbnRoKGFuY2hvci5nZXRNb250aCgpICsgTnVtYmVyKG1vbnRocyB8fCAwKSk7XG4gIGFuY2hvci5zZXREYXRlKGFuY2hvci5nZXREYXRlKCkgKyBOdW1iZXIoZGF5cyB8fCAwKSk7XG4gIGFuY2hvci5zZXRIb3VycyhhbmNob3IuZ2V0SG91cnMoKSArIE51bWJlcihob3VycyB8fCAwKSk7XG4gIGFuY2hvci5zZXRNaW51dGVzKGFuY2hvci5nZXRNaW51dGVzKCkgKyBOdW1iZXIobWludXRlcyB8fCAwKSk7XG4gIGFuY2hvci5zZXRTZWNvbmRzKGFuY2hvci5nZXRTZWNvbmRzKCkgKyBOdW1iZXIoc2Vjb25kcyB8fCAwKSk7XG4gIGlmIChzZWNvbmRzICYmIFN0cmluZyhzZWNvbmRzKS5pbmRleE9mKCcuJykgPiAwKSB7XG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gTnVtYmVyKE51bWJlcihzZWNvbmRzKSAlIDEpLnRvRml4ZWQoNikgKiAxMDAwLjA7XG4gICAgYW5jaG9yLnNldE1pbGxpc2Vjb25kcyhhbmNob3IuZ2V0TWlsbGlzZWNvbmRzKCkgKyBtaWxsaXNlY29uZHMpO1xuICB9XG5cbiAgcmV0dXJuICgoYW5jaG9yICogMS4wKSAtIG5vdykgLyAxMDAwLjA7XG59XG5cbi8qKlxuICogQWRkcyB0b2dldGhlciB0d28gSVNPODYwMSBEdXJhdGlvbiBzdHJpbmdzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpcnN0XG4gKiBAcGFyYW0ge3N0cmluZ30gc2Vjb25kXG4gKiBAcGFyYW0ge1JlZ0V4cH0gZHVyYXRpb25SZWdleFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVHdvRHVyYXRpb25zKFxuICAgIGZpcnN0OiBTdHJpbmcsXG4gICAgc2Vjb25kOiBTdHJpbmcsXG4gICAgZHVyYXRpb25SZWdleDogUmVnRXhwKSB7XG4gIGNvbnN0IGZpcnN0U2Vjb25kcyA9IGdldER1cmF0aW9uQXNTZWNvbmRzKGZpcnN0LCBkdXJhdGlvblJlZ2V4KTtcbiAgY29uc3Qgc2Vjb25kU2Vjb25kcyA9IGdldER1cmF0aW9uQXNTZWNvbmRzKHNlY29uZCwgZHVyYXRpb25SZWdleCk7XG5cbiAgcmV0dXJuIGdldFNlY29uZHNBc0lTT0R1cmF0aW9uKGZpcnN0U2Vjb25kcyArIHNlY29uZFNlY29uZHMpO1xufVxuXG4vKipcbiAqIEFkZCB0b2dldGhlciB0d28gSEg6TU06U1MuREQgc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaXJzdFxuICogQHBhcmFtIHtzdHJpbmd9IHNlY29uZFxuICogQHBhcmFtIHtSZWdFeHB9IHRpbWVSZWdleFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSEhNTVNTVGltZVN0cmluZ3MoXG4gICAgZmlyc3Q6IFN0cmluZyxcbiAgICBzZWNvbmQ6IFN0cmluZyxcbiAgICB0aW1lUmVnZXg6IFJlZ0V4cCkge1xuICBjb25zdCBmaXJzdFNlY29uZHMgPSBnZXRUaW1lQXNTZWNvbmRzKGZpcnN0LCB0aW1lUmVnZXgpO1xuICBjb25zdCBzZWNvbmRTZWNvbmRzID0gZ2V0VGltZUFzU2Vjb25kcyhzZWNvbmQsIHRpbWVSZWdleCk7XG4gIHJldHVybiBnZXRTZWNvbmRzQXNISE1NU1MoZmlyc3RTZWNvbmRzICsgc2Vjb25kU2Vjb25kcyk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIEpTT04gb2JqZWN0IGRvd24gdG8gc3RyaW5nIHBhdGhzIGZvciBlYWNoIHZhbHVlc1xuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4oZGF0YSkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAvKipcbiAgICogUmVjdXJzZSB0aHJvdWdoIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHsqfSBjdXJcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICBmdW5jdGlvbiByZWN1cnNlKGN1ciwgcHJvcCkge1xuICAgIGlmIChPYmplY3QoY3VyKSAhPT0gY3VyKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBjdXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZWN1cnNlKGN1cltpXSwgcHJvcCArICdbJyArIGkgKyAnXScpO1xuICAgICAgICBpZiAobCA9PT0gMCkgcmVzdWx0W3Byb3BdID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpc0VtcHR5ID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcCBpbiBjdXIpIHtcbiAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoY3VyLCBwKSkge1xuICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyAnLicgKyBwIDogcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHJlc3VsdFtwcm9wXSA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2UoZGF0YSwgJycpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFVuLWZsYXR0ZW4gYSBmbGF0IEpTT04gb2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKGRhdGEpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBpZiAoT2JqZWN0KGRhdGEpICE9PSBkYXRhIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBkYXRhO1xuICBjb25zdCByZWdleCA9IC9cXC4/KFteLltcXF1dKyl8XFxbKFxcZCspXS9nO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBwIGluIGRhdGEpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBwKSkge1xuICAgICAgbGV0IGN1ciA9IHJlc3VsdDtcbiAgICAgIGxldCBwcm9wID0gJyc7XG4gICAgICBsZXQgbSA9IHJlZ2V4LmV4ZWMocCk7XG4gICAgICB3aGlsZSAobSkge1xuICAgICAgICBjdXIgPSBjdXJbcHJvcF0gfHwgKGN1cltwcm9wXSA9IChtWzJdID8gW10gOiB7fSkpO1xuICAgICAgICBwcm9wID0gbVsyXSB8fCBtWzFdO1xuICAgICAgICBtID0gcmVnZXguZXhlYyhwKTtcbiAgICAgIH1cbiAgICAgIGN1cltwcm9wXSA9IGRhdGFbcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRbJyddIHx8IHJlc3VsdDtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvQUlDQy5qcyIsInNyYy9CYXNlQVBJLmpzIiwic3JjL1Njb3JtMTJBUEkuanMiLCJzcmMvU2Nvcm0yMDA0QVBJLmpzIiwic3JjL2NtaS9haWNjX2NtaS5qcyIsInNyYy9jbWkvY29tbW9uLmpzIiwic3JjL2NtaS9zY29ybTEyX2NtaS5qcyIsInNyYy9jbWkvc2Nvcm0yMDA0X2NtaS5qcyIsInNyYy9jb25zdGFudHMvYXBpX2NvbnN0YW50cy5qcyIsInNyYy9jb25zdGFudHMvZXJyb3JfY29kZXMuanMiLCJzcmMvY29uc3RhbnRzL2ZpZWxkX3ZhbHVlcy5qcyIsInNyYy9jb25zdGFudHMvbGFuZ3VhZ2VfY29uc3RhbnRzLmpzIiwic3JjL2NvbnN0YW50cy9yZWdleC5qcyIsInNyYy9jb25zdGFudHMvcmVzcG9uc2VfY29uc3RhbnRzLmpzIiwic3JjL2V4Y2VwdGlvbnMuanMiLCJzcmMvZXhwb3J0cy5qcyIsInNyYy91dGlsaXRpZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0FDQ0E7O0FBQ0E7O0FBS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7OztJQUdxQixJOzs7OztBQUNuQjs7OztBQUlBLGdCQUFZLFFBQVosRUFBMEI7QUFBQTs7QUFBQTs7QUFDeEIsUUFBTSxhQUFhLHFCQUNkO0FBQ0QsTUFBQSxnQkFBZ0IsRUFBRTtBQURqQixLQURjLE1BR1gsUUFIVyxDQUFuQjs7QUFNQSw4RUFBTSxhQUFOO0FBRUEsVUFBSyxHQUFMLEdBQVcsSUFBSSxhQUFKLEVBQVg7QUFDQSxVQUFLLEdBQUwsR0FBVyxJQUFJLGdCQUFKLEVBQVg7QUFWd0I7QUFXekI7QUFFRDs7Ozs7Ozs7Ozs7O29DQVFnQixVLEVBQVksSyxFQUFPLGUsRUFBaUI7QUFDbEQsVUFBSSxRQUFRLDZFQUF5QixVQUF6QixFQUFxQyxLQUFyQyxFQUE0QyxlQUE1QyxD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TztBQUNMLE1BQUEsWUFBWSxFQUFFLGtDQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQXpDVztBQTZDbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLDhCQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQTdDVztBQWlEbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLDhCQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQWpEVztBQXFEbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLDBCQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQXJEVztBQXlEbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLHdCQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQXpEVztBQTZEbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLHFCQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQTdEVztBQWlFbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLHFCQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQWpFVztBQXFFbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLHdCQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQXJFVztBQXlFbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLDhCQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQXpFVztBQTZFbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLGtDQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQTdFVztBQWlGbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLDBDQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQWpGVztBQXFGbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLGlDQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQXJGVztBQXlGbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLGtDQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQXpGVztBQTZGbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLGtDQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQTdGVztBQWlHbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLHVDQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVixLQWpHVztBQXFHbEIsV0FBTztBQUNMLE1BQUEsWUFBWSxFQUFFLHVDQURUO0FBRUwsTUFBQSxhQUFhLEVBQUU7QUFGVjtBQXJHVztBQVhhLENBQTVCOzs7Ozs7Ozs7Ozs7Ozs7OztBQzlFQSxJQUFNLFdBQVcsR0FBRztBQUN6QixFQUFBLE9BQU8sRUFBRSxHQURnQjtBQUV6QixFQUFBLHFCQUFxQixFQUFFLEdBRkU7QUFHekIsRUFBQSxXQUFXLEVBQUUsR0FIWTtBQUl6QixFQUFBLFVBQVUsRUFBRSxHQUphO0FBS3pCLEVBQUEsbUJBQW1CLEVBQUUsR0FMSTtBQU16QixFQUFBLHVCQUF1QixFQUFFLEdBTkE7QUFPekIsRUFBQSxvQkFBb0IsRUFBRSxHQVBHO0FBUXpCLEVBQUEsb0JBQW9CLEVBQUUsR0FSRztBQVN6QixFQUFBLG1CQUFtQixFQUFFLEdBVEk7QUFVekIsRUFBQSxpQkFBaUIsRUFBRSxHQVZNO0FBV3pCLEVBQUEsZ0JBQWdCLEVBQUUsR0FYTztBQVl6QixFQUFBLGtCQUFrQixFQUFFLEdBWks7QUFhekIsRUFBQSxpQkFBaUIsRUFBRSxHQWJNO0FBY3pCLEVBQUEsY0FBYyxFQUFFLEdBZFM7QUFlekIsRUFBQSxjQUFjLEVBQUUsR0FmUztBQWdCekIsRUFBQSxXQUFXLEVBQUUsR0FoQlk7QUFpQnpCLEVBQUEsbUJBQW1CLEVBQUUsR0FqQkk7QUFrQnpCLEVBQUEsbUJBQW1CLEVBQUUsR0FsQkk7QUFtQnpCLEVBQUEsc0JBQXNCLEVBQUUsR0FuQkM7QUFvQnpCLEVBQUEsb0JBQW9CLEVBQUUsR0FwQkc7QUFxQnpCLEVBQUEscUJBQXFCLEVBQUUsR0FyQkU7QUFzQnpCLEVBQUEscUJBQXFCLEVBQUUsR0F0QkU7QUF1QnpCLEVBQUEsaUJBQWlCLEVBQUUsR0F2Qk07QUF3QnpCLEVBQUEsaUJBQWlCLEVBQUUsR0F4Qk07QUF5QnpCLEVBQUEsa0JBQWtCLEVBQUUsR0F6Qks7QUEwQnpCLEVBQUEsYUFBYSxFQUFFLEdBMUJVO0FBMkJ6QixFQUFBLGtCQUFrQixFQUFFLEdBM0JLO0FBNEJ6QixFQUFBLDBCQUEwQixFQUFFO0FBNUJILENBQXBCOzs7QUErQkEsSUFBTSxtQkFBbUIscUJBQzNCLFdBRDJCLE1BQ1g7QUFDakIsRUFBQSxvQkFBb0IsRUFBRSxHQURMO0FBRWpCLEVBQUEsaUJBQWlCLEVBQUUsR0FGRjtBQUdqQixFQUFBLGtCQUFrQixFQUFFLEdBSEg7QUFJakIsRUFBQSxjQUFjLEVBQUUsR0FKQztBQUtqQixFQUFBLGNBQWMsRUFBRSxHQUxDO0FBTWpCLEVBQUEsV0FBVyxFQUFFLEdBTkk7QUFPakIsRUFBQSxvQkFBb0IsRUFBRSxHQVBMO0FBUWpCLEVBQUEscUJBQXFCLEVBQUUsR0FSTjtBQVNqQixFQUFBLHFCQUFxQixFQUFFLEdBVE47QUFVakIsRUFBQSxpQkFBaUIsRUFBRSxHQVZGO0FBV2pCLEVBQUEsaUJBQWlCLEVBQUUsR0FYRjtBQVlqQixFQUFBLGtCQUFrQixFQUFFLEdBWkg7QUFhakIsRUFBQSxhQUFhLEVBQUUsR0FiRTtBQWNqQixFQUFBLGtCQUFrQixFQUFFLEdBZEg7QUFlakIsRUFBQSwwQkFBMEIsRUFBRTtBQWZYLENBRFcsQ0FBekI7Ozs7QUFvQkEsSUFBTSxxQkFBcUIscUJBQzdCLFdBRDZCLE1BQ2I7QUFDakIsRUFBQSxxQkFBcUIsRUFBRSxHQUROO0FBRWpCLEVBQUEsV0FBVyxFQUFFLEdBRkk7QUFHakIsRUFBQSxVQUFVLEVBQUUsR0FISztBQUlqQixFQUFBLG1CQUFtQixFQUFFLEdBSko7QUFLakIsRUFBQSx1QkFBdUIsRUFBRSxHQUxSO0FBTWpCLEVBQUEscUJBQXFCLEVBQUUsR0FOTjtBQU9qQixFQUFBLG9CQUFvQixFQUFFLEdBUEw7QUFRakIsRUFBQSxtQkFBbUIsRUFBRSxHQVJKO0FBU2pCLEVBQUEsaUJBQWlCLEVBQUUsR0FURjtBQVVqQixFQUFBLGdCQUFnQixFQUFFLEdBVkQ7QUFXakIsRUFBQSxrQkFBa0IsRUFBRSxHQVhIO0FBWWpCLEVBQUEsaUJBQWlCLEVBQUUsR0FaRjtBQWFqQixFQUFBLGNBQWMsRUFBRSxHQWJDO0FBY2pCLEVBQUEsbUJBQW1CLEVBQUUsR0FkSjtBQWVqQixFQUFBLG1CQUFtQixFQUFFLEdBZko7QUFnQmpCLEVBQUEsc0JBQXNCLEVBQUUsR0FoQlA7QUFpQmpCLEVBQUEsb0JBQW9CLEVBQUUsR0FqQkw7QUFrQmpCLEVBQUEscUJBQXFCLEVBQUUsR0FsQk47QUFtQmpCLEVBQUEscUJBQXFCLEVBQUUsR0FuQk47QUFvQmpCLEVBQUEsaUJBQWlCLEVBQUUsR0FwQkY7QUFxQmpCLEVBQUEsa0JBQWtCLEVBQUUsR0FyQkg7QUFzQmpCLEVBQUEsYUFBYSxFQUFFLEdBdEJFO0FBdUJqQixFQUFBLGtCQUFrQixFQUFFLEdBdkJIO0FBd0JqQixFQUFBLDBCQUEwQixFQUFFO0FBeEJYLENBRGEsQ0FBM0I7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BEUCxJQUFNLGFBQWEsR0FBRztBQUNwQixFQUFBLFdBQVcsRUFBRSxDQUNYLFNBRFcsRUFFWCxPQUZXLEVBR1gsZUFIVyxFQUlYLFNBSlcsQ0FETztBQU9wQixFQUFBLGFBQWEsRUFBRSxDQUNiLFFBRGEsRUFFYixPQUZhLEVBR2IsU0FIYSxDQVBLO0FBYXBCLEVBQUEsY0FBYyxFQUFFLENBQ2QsS0FEYyxFQUVkLE1BRmMsRUFHZCxLQUhjLEVBSWQsS0FKYyxDQWJJO0FBbUJwQixFQUFBLGdCQUFnQixFQUFFLENBQ2hCLElBRGdCLEVBRWhCLE1BRmdCLEVBR2hCLEtBSGdCLEVBSWhCLEtBSmdCLENBbkJFO0FBMEJwQixFQUFBLGdCQUFnQixFQUFFLENBQ2hCLEdBRGdCLEVBRWhCLElBRmdCLEVBR2hCLEtBSGdCLENBMUJFO0FBK0JwQixFQUFBLGtCQUFrQixFQUFFLENBQ2xCLFNBRGtCLEVBRWxCLE1BRmtCLEVBR2xCLElBSGtCLENBL0JBO0FBcUNwQixFQUFBLGdCQUFnQixFQUFFLENBQ2hCLEdBRGdCLEVBRWhCLEtBRmdCLEVBR2hCLEdBSGdCLEVBSWhCLE1BSmdCLEVBS2hCLElBTGdCLENBckNFO0FBNENwQixFQUFBLGtCQUFrQixFQUFFLENBQ2xCLE1BRGtCLEVBRWxCLE1BRmtCLEVBR2xCLE1BSGtCLEVBSWxCLElBSmtCLEVBS2xCLEtBTGtCLENBNUNBO0FBb0RwQixFQUFBLHVCQUF1QixFQUFFLENBQ3ZCLEdBRHVCLEVBRXZCLEdBRnVCLEVBR3ZCLElBSHVCLENBcERMO0FBeURwQixFQUFBLHlCQUF5QixFQUFFLENBQ3pCLE1BRHlCLEVBRXpCLE1BRnlCLEVBR3pCLEtBSHlCLEVBSXpCLE1BSnlCLEVBS3pCLE1BTHlCLEVBTXpCLElBTnlCLEVBT3pCLEtBUHlCO0FBekRQLENBQXRCOztBQW9FTyxJQUFNLGNBQWMscUJBQ3RCLGFBRHNCLE1BQ0o7QUFDbkIsRUFBQSxpQkFBaUIsRUFBRSxDQUNqQixRQURpQixFQUVqQixXQUZpQixFQUdqQixRQUhpQixFQUlqQixZQUppQixFQUtqQixTQUxpQixDQURBO0FBUW5CLEVBQUEsbUJBQW1CLEVBQUUsQ0FDbkIsUUFEbUIsRUFFbkIsR0FGbUIsRUFHbkIsR0FIbUIsRUFJbkIsR0FKbUIsRUFLbkIsTUFMbUIsRUFNbkIsT0FObUIsRUFPbkIsVUFQbUIsQ0FSRjtBQWtCbkIsRUFBQSxTQUFTLEVBQUUsQ0FDVCxVQURTLEVBRVQsU0FGUyxFQUdULFFBSFMsQ0FsQlE7QUF1Qm5CLEVBQUEsV0FBVyxFQUFFLENBQ1gsT0FEVyxFQUVYLE1BRlcsRUFHWCxPQUhXLENBdkJNO0FBNkJuQixFQUFBLFNBQVMsRUFBRSxDQUNULFlBRFMsRUFFVCxRQUZTLEVBR1QsU0FIUyxFQUlULFVBSlMsRUFLVCxhQUxTLEVBTVQsWUFOUyxFQU9ULFFBUFMsRUFRVCxTQVJTLENBN0JRO0FBdUNuQixFQUFBLFdBQVcsRUFBRSxDQUNYLFNBRFcsRUFFWCxPQUZXLEVBR1gsUUFIVyxDQXZDTTtBQTZDbkIsRUFBQSxlQUFlLEVBQUUsQ0FDZixHQURlLEVBRWYsSUFGZSxFQUdmLEtBSGUsRUFJZixJQUplLEVBS2YsS0FMZSxFQU1mLE1BTmUsQ0E3Q0U7QUFxRG5CLEVBQUEsaUJBQWlCLEVBQUUsQ0FDakIsU0FEaUIsRUFFakIsTUFGaUIsRUFHakIsTUFIaUIsRUFJakIsS0FKaUIsRUFLakIsU0FMaUIsRUFNakIsUUFOaUIsQ0FyREE7QUE4RG5CLEVBQUEsZUFBZSxFQUFFLENBQ2YsR0FEZSxFQUVmLE9BRmUsRUFHZixLQUhlLENBOURFO0FBbUVuQixFQUFBLGlCQUFpQixFQUFFLENBQ2pCLFNBRGlCLEVBRWpCLE1BRmlCLEVBR2pCLElBSGlCLEVBSWpCLEtBSmlCLEVBS2pCLFNBTGlCLEVBTWpCLFFBTmlCLENBbkVBO0FBMkVuQixFQUFBLGtCQUFrQixFQUFFLENBQ2xCLFNBRGtCLEVBRWxCLE1BRmtCLEVBR2xCLElBSGtCLENBM0VEO0FBaUZuQixFQUFBLFNBQVMsRUFBRSxDQUNULFVBRFMsRUFFVCxVQUZTLEVBR1QsVUFIUyxDQWpGUTtBQXNGbkIsRUFBQSxXQUFXLEVBQUUsQ0FDWCxVQURXLEVBRVgsYUFGVyxFQUdYLFNBSFcsRUFJWCxjQUpXLEVBS1gsZUFMVyxDQXRGTTtBQThGbkIsRUFBQSxhQUFhLEVBQUUsQ0FDYixVQURhLEVBRWIsYUFGYSxFQUdiLFVBSGEsRUFJYixVQUphLENBOUZJO0FBb0duQixFQUFBLGVBQWUsRUFBRSxDQUNmLFNBRGUsRUFFZixjQUZlLEVBR2YsZUFIZTtBQXBHRSxDQURJLENBQXBCOzs7O0FBNkdBLElBQU0sZ0JBQWdCLHFCQUN4QixhQUR3QixNQUNOO0FBQ25CO0FBQ0EsRUFBQSxlQUFlLEVBQUUsQ0FDZixZQURlLEVBRWYsa0JBRmUsRUFHZix3QkFIZSxFQUlmLFlBSmUsQ0FGRTtBQVFuQixFQUFBLGlCQUFpQixFQUFFLENBQ2pCLGFBRGlCLEVBRWpCLHlCQUZpQixFQUdqQix3QkFIaUIsRUFJakIsWUFKaUIsRUFLakIsWUFMaUIsRUFNakIsV0FOaUIsRUFPakIsU0FQaUIsRUFRakIsV0FSaUIsQ0FSQTtBQW1CbkIsRUFBQSxZQUFZLEVBQUUsQ0FDWixXQURZLEVBRVosWUFGWSxFQUdaLGVBSFksRUFJWixTQUpZLENBbkJLO0FBeUJuQixFQUFBLGNBQWMsRUFBRSxDQUNkLFVBRGMsRUFFZCxRQUZjLEVBR2QsUUFIYyxDQXpCRztBQStCbkIsRUFBQSxZQUFZLEVBQUUsQ0FDWixRQURZLEVBRVosUUFGWSxFQUdaLFNBSFksQ0EvQks7QUFvQ25CLEVBQUEsY0FBYyxFQUFFLENBQ2QsVUFEYyxFQUVkLFlBRmMsRUFHZCxHQUhjLEVBSWQsR0FKYyxDQXBDRztBQTJDbkIsRUFBQSxTQUFTLEVBQUUsQ0FDVCxVQURTLEVBRVQsU0FGUyxFQUdULFFBSFMsRUFJVCxRQUpTLENBM0NRO0FBaURuQixFQUFBLFdBQVcsRUFBRSxDQUNYLE9BRFcsRUFFWCxNQUZXLEVBR1gsT0FIVyxDQWpETTtBQXVEbkIsRUFBQSxTQUFTLEVBQUUsQ0FDVCxZQURTLEVBRVQsUUFGUyxFQUdULFNBSFMsRUFJVCxjQUpTLEVBS1QsVUFMUyxFQU1ULGFBTlMsRUFPVCxZQVBTLEVBUVQsUUFSUyxFQVNULFNBVFMsRUFVVCxPQVZTLENBdkRRO0FBbUVuQixFQUFBLFdBQVcsRUFBRSxDQUNYLFNBRFcsRUFFWCxPQUZXLEVBR1gsUUFIVyxDQW5FTTtBQXlFbkIsRUFBQSxlQUFlLEVBQUUsQ0FDZixHQURlLEVBRWYsSUFGZSxFQUdmLEtBSGUsRUFJZixRQUplLEVBS2YsSUFMZSxFQU1mLE9BTmUsQ0F6RUU7QUFpRm5CLEVBQUEsaUJBQWlCLEVBQUUsQ0FDakIsU0FEaUIsRUFFakIsTUFGaUIsRUFHakIsU0FIaUIsRUFJakIsUUFKaUIsQ0FqRkE7QUF3Rm5CLEVBQUEscUJBQXFCLEVBQUUsQ0FDckIsa0JBRHFCLEVBRXJCLFNBRnFCLEVBR3JCLEtBSHFCLEVBSXJCLE9BSnFCLENBeEZKO0FBOEZuQixFQUFBLHVCQUF1QixFQUFFLENBQ3ZCLFVBRHVCLEVBRXZCLE1BRnVCLEVBR3ZCLE9BSHVCLEVBSXZCLEdBSnVCLENBOUZOO0FBcUduQixFQUFBLFlBQVksRUFBRSxDQUNaLDhCQURZLEVBRVosaUNBRlksRUFHWix3QkFBd0IsSUFBSSxNQUFKLENBQVcsSUFBWCxDQUhaLEVBSVosaUJBSlksRUFLWixrQkFMWSxFQU1aLGFBTlksRUFPWixVQVBZLEVBUVosRUFSWSxDQXJHSztBQStHbkIsRUFBQSxjQUFjLEVBQUUsQ0FDZCxXQURjLEVBRWQsWUFGYyxFQUdkLHNDQUhjLEVBSWQsa0JBSmMsRUFLZCx3QkFBd0IsSUFBSSxNQUFKLENBQVcsSUFBWCxDQUxWLEVBTWQseUJBQXlCLElBQUksTUFBSixDQUFXLElBQVgsQ0FOWCxDQS9HRztBQXdIbkIsRUFBQSxnQkFBZ0IsRUFBRSxDQUNoQiw4QkFEZ0IsRUFFaEIsaUNBRmdCLEVBR2hCLHdCQUF3QixJQUFJLE1BQUosQ0FBVyxHQUFYLENBSFIsRUFJaEIsaUJBSmdCLEVBS2hCLGtCQUxnQixFQU1oQixhQU5nQixFQU9oQixVQVBnQixFQVFoQixFQVJnQixDQXhIQztBQWtJbkIsRUFBQSxrQkFBa0IsRUFBRSxDQUNsQixXQURrQixFQUVsQixZQUZrQixFQUdsQixzQ0FIa0IsRUFJbEIsa0JBSmtCLEVBS2xCLHdCQUF3QixJQUFJLE1BQUosQ0FBVyxHQUFYLENBTE4sRUFNbEIseUJBQXlCLElBQUksTUFBSixDQUFXLEdBQVgsQ0FOUCxDQWxJRDtBQTJJbkIsRUFBQSxlQUFlLEVBQUUsQ0FDZixVQURlLEVBRWYsVUFGZSxFQUdmLE1BSGUsRUFJZixTQUplLEVBS2YsU0FMZSxFQU1mLFlBTmUsRUFPZixZQVBlLENBM0lFO0FBb0puQixFQUFBLGlCQUFpQixFQUFFLENBQ2pCLE9BRGlCLEVBRWpCLE1BRmlCLEVBR2pCLE1BSGlCLEVBSWpCLFFBSmlCO0FBcEpBLENBRE0sQ0FBdEI7Ozs7Ozs7Ozs7O0FDakxBLElBQU0sZUFBZSxHQUFHO0FBQzdCLFFBQU0sSUFEdUI7QUFDakIsUUFBTSxJQURXO0FBQ0wsUUFBTSxJQUREO0FBQ08sUUFBTSxJQURiO0FBQ21CLFFBQU0sSUFEekI7QUFDK0IsUUFBTSxJQURyQztBQUU3QixRQUFNLElBRnVCO0FBRWpCLFFBQU0sSUFGVztBQUVMLFFBQU0sSUFGRDtBQUVPLFFBQU0sSUFGYjtBQUVtQixRQUFNLElBRnpCO0FBRStCLFFBQU0sSUFGckM7QUFHN0IsUUFBTSxJQUh1QjtBQUdqQixRQUFNLElBSFc7QUFHTCxRQUFNLElBSEQ7QUFHTyxRQUFNLElBSGI7QUFHbUIsUUFBTSxJQUh6QjtBQUcrQixRQUFNLElBSHJDO0FBSTdCLFFBQU0sSUFKdUI7QUFJakIsUUFBTSxJQUpXO0FBSUwsUUFBTSxJQUpEO0FBSU8sUUFBTSxJQUpiO0FBSW1CLFFBQU0sSUFKekI7QUFJK0IsUUFBTSxJQUpyQztBQUs3QixRQUFNLElBTHVCO0FBS2pCLFFBQU0sSUFMVztBQUtMLFFBQU0sSUFMRDtBQUtPLFFBQU0sSUFMYjtBQUttQixRQUFNLElBTHpCO0FBSytCLFFBQU0sSUFMckM7QUFNN0IsUUFBTSxJQU51QjtBQU1qQixRQUFNLElBTlc7QUFNTCxRQUFNLElBTkQ7QUFNTyxRQUFNLElBTmI7QUFNbUIsUUFBTSxJQU56QjtBQU0rQixRQUFNLElBTnJDO0FBTzdCLFFBQU0sSUFQdUI7QUFPakIsUUFBTSxJQVBXO0FBT0wsUUFBTSxJQVBEO0FBT08sUUFBTSxJQVBiO0FBT21CLFFBQU0sSUFQekI7QUFPK0IsUUFBTSxJQVByQztBQVE3QixRQUFNLElBUnVCO0FBUWpCLFFBQU0sSUFSVztBQVFMLFFBQU0sSUFSRDtBQVFPLFFBQU0sSUFSYjtBQVFtQixRQUFNLElBUnpCO0FBUStCLFFBQU0sSUFSckM7QUFTN0IsUUFBTSxJQVR1QjtBQVNqQixRQUFNLElBVFc7QUFTTCxRQUFNLElBVEQ7QUFTTyxRQUFNLElBVGI7QUFTbUIsUUFBTSxJQVR6QjtBQVMrQixRQUFNLElBVHJDO0FBVTdCLFFBQU0sSUFWdUI7QUFVakIsUUFBTSxJQVZXO0FBVUwsUUFBTSxJQVZEO0FBVU8sUUFBTSxJQVZiO0FBVW1CLFFBQU0sSUFWekI7QUFVK0IsUUFBTSxJQVZyQztBQVc3QixRQUFNLElBWHVCO0FBV2pCLFFBQU0sSUFYVztBQVdMLFFBQU0sSUFYRDtBQVdPLFFBQU0sSUFYYjtBQVdtQixRQUFNLElBWHpCO0FBVytCLFFBQU0sSUFYckM7QUFZN0IsUUFBTSxJQVp1QjtBQVlqQixRQUFNLElBWlc7QUFZTCxRQUFNLElBWkQ7QUFZTyxRQUFNLElBWmI7QUFZbUIsUUFBTSxJQVp6QjtBQVkrQixRQUFNLElBWnJDO0FBYTdCLFFBQU0sSUFidUI7QUFhakIsUUFBTSxJQWJXO0FBYUwsUUFBTSxJQWJEO0FBYU8sUUFBTSxJQWJiO0FBYW1CLFFBQU0sSUFiekI7QUFhK0IsUUFBTSxJQWJyQztBQWM3QixRQUFNLElBZHVCO0FBY2pCLFFBQU0sSUFkVztBQWNMLFFBQU0sSUFkRDtBQWNPLFFBQU0sSUFkYjtBQWNtQixRQUFNLElBZHpCO0FBYytCLFFBQU0sSUFkckM7QUFlN0IsUUFBTSxJQWZ1QjtBQWVqQixRQUFNLElBZlc7QUFlTCxRQUFNLElBZkQ7QUFlTyxRQUFNLElBZmI7QUFlbUIsUUFBTSxJQWZ6QjtBQWUrQixRQUFNLElBZnJDO0FBZ0I3QixRQUFNLElBaEJ1QjtBQWdCakIsUUFBTSxJQWhCVztBQWdCTCxRQUFNLElBaEJEO0FBZ0JPLFFBQU0sSUFoQmI7QUFnQm1CLFFBQU0sSUFoQnpCO0FBZ0IrQixRQUFNLElBaEJyQztBQWlCN0IsUUFBTSxJQWpCdUI7QUFpQmpCLFFBQU0sSUFqQlc7QUFpQkwsUUFBTSxJQWpCRDtBQWlCTyxRQUFNLElBakJiO0FBaUJtQixRQUFNLElBakJ6QjtBQWlCK0IsUUFBTSxJQWpCckM7QUFrQjdCLFFBQU0sSUFsQnVCO0FBa0JqQixRQUFNLElBbEJXO0FBa0JMLFFBQU0sSUFsQkQ7QUFrQk8sUUFBTSxJQWxCYjtBQWtCbUIsUUFBTSxJQWxCekI7QUFrQitCLFFBQU0sSUFsQnJDO0FBbUI3QixRQUFNLElBbkJ1QjtBQW1CakIsUUFBTSxJQW5CVztBQW1CTCxRQUFNLElBbkJEO0FBbUJPLFFBQU0sSUFuQmI7QUFtQm1CLFFBQU0sSUFuQnpCO0FBbUIrQixRQUFNLElBbkJyQztBQW9CN0IsUUFBTSxJQXBCdUI7QUFvQmpCLFFBQU0sSUFwQlc7QUFvQkwsUUFBTSxJQXBCRDtBQW9CTyxRQUFNLElBcEJiO0FBb0JtQixRQUFNLElBcEJ6QjtBQW9CK0IsUUFBTSxJQXBCckM7QUFxQjdCLFFBQU0sSUFyQnVCO0FBcUJqQixRQUFNLElBckJXO0FBcUJMLFFBQU0sSUFyQkQ7QUFxQk8sUUFBTSxJQXJCYjtBQXFCbUIsUUFBTSxJQXJCekI7QUFxQitCLFFBQU0sSUFyQnJDO0FBc0I3QixRQUFNLElBdEJ1QjtBQXNCakIsUUFBTSxJQXRCVztBQXNCTCxRQUFNLElBdEJEO0FBc0JPLFFBQU0sSUF0QmI7QUFzQm1CLFFBQU0sSUF0QnpCO0FBc0IrQixRQUFNLElBdEJyQztBQXVCN0IsUUFBTSxJQXZCdUI7QUF1QmpCLFFBQU0sSUF2Qlc7QUF1QkwsUUFBTSxJQXZCRDtBQXVCTyxRQUFNLElBdkJiO0FBdUJtQixRQUFNLElBdkJ6QjtBQXVCK0IsUUFBTSxJQXZCckM7QUF3QjdCLFFBQU0sSUF4QnVCO0FBd0JqQixRQUFNLElBeEJXO0FBd0JMLFFBQU0sSUF4QkQ7QUF3Qk8sUUFBTSxJQXhCYjtBQXdCbUIsUUFBTSxJQXhCekI7QUF3QitCLFFBQU0sSUF4QnJDO0FBeUI3QixRQUFNLElBekJ1QjtBQXlCakIsUUFBTSxJQXpCVztBQXlCTCxRQUFNLElBekJEO0FBeUJPLFFBQU0sSUF6QmI7QUF5Qm1CLFFBQU0sSUF6QnpCO0FBeUIrQixRQUFNLElBekJyQztBQTBCN0IsUUFBTSxJQTFCdUI7QUEwQmpCLFFBQU0sSUExQlc7QUEwQkwsUUFBTSxJQTFCRDtBQTBCTyxRQUFNLElBMUJiO0FBMEJtQixRQUFNLElBMUJ6QjtBQTBCK0IsUUFBTSxJQTFCckM7QUEyQjdCLFFBQU0sSUEzQnVCO0FBMkJqQixRQUFNLElBM0JXO0FBMkJMLFFBQU0sSUEzQkQ7QUEyQk8sUUFBTSxJQTNCYjtBQTJCbUIsUUFBTSxJQTNCekI7QUEyQitCLFFBQU0sSUEzQnJDO0FBNEI3QixRQUFNLElBNUJ1QjtBQTRCakIsUUFBTSxJQTVCVztBQTRCTCxRQUFNLElBNUJEO0FBNEJPLFFBQU0sSUE1QmI7QUE0Qm1CLFFBQU0sSUE1QnpCO0FBNEIrQixRQUFNLElBNUJyQztBQTZCN0IsUUFBTSxJQTdCdUI7QUE2QmpCLFFBQU0sSUE3Qlc7QUE2QkwsUUFBTSxJQTdCRDtBQTZCTyxRQUFNLElBN0JiO0FBNkJtQixRQUFNLElBN0J6QjtBQTZCK0IsUUFBTSxJQTdCckM7QUE4QjdCLFFBQU0sSUE5QnVCO0FBOEJqQixRQUFNLElBOUJXO0FBOEJMLFFBQU0sSUE5QkQ7QUE4Qk8sUUFBTSxJQTlCYjtBQThCbUIsUUFBTSxJQTlCekI7QUE4QitCLFFBQU0sSUE5QnJDO0FBK0I3QixRQUFNLElBL0J1QjtBQStCakIsUUFBTSxJQS9CVztBQStCTCxRQUFNLElBL0JEO0FBK0JPLFFBQU0sSUEvQmI7QUErQm1CLFFBQU0sSUEvQnpCO0FBK0IrQixRQUFNLElBL0JyQztBQWdDN0IsU0FBTyxLQWhDc0I7QUFnQ2YsU0FBTyxLQWhDUTtBQWdDRCxTQUFPLEtBaENOO0FBZ0NhLFNBQU8sS0FoQ3BCO0FBZ0MyQixTQUFPLEtBaENsQztBQWlDN0IsU0FBTyxLQWpDc0I7QUFpQ2YsU0FBTyxLQWpDUTtBQWlDRCxTQUFPLEtBakNOO0FBaUNhLFNBQU8sS0FqQ3BCO0FBaUMyQixTQUFPLEtBakNsQztBQWtDN0IsU0FBTyxLQWxDc0I7QUFrQ2YsU0FBTyxLQWxDUTtBQWtDRCxTQUFPLEtBbENOO0FBa0NhLFNBQU8sS0FsQ3BCO0FBa0MyQixTQUFPLEtBbENsQztBQW1DN0IsU0FBTyxLQW5Dc0I7QUFtQ2YsU0FBTyxLQW5DUTtBQW1DRCxTQUFPLEtBbkNOO0FBbUNhLFNBQU8sS0FuQ3BCO0FBbUMyQixTQUFPLEtBbkNsQztBQW9DN0IsU0FBTyxLQXBDc0I7QUFvQ2YsU0FBTyxLQXBDUTtBQW9DRCxTQUFPLEtBcENOO0FBb0NhLFNBQU8sS0FwQ3BCO0FBb0MyQixTQUFPLEtBcENsQztBQXFDN0IsU0FBTyxLQXJDc0I7QUFxQ2YsU0FBTyxLQXJDUTtBQXFDRCxTQUFPLEtBckNOO0FBcUNhLFNBQU8sS0FyQ3BCO0FBcUMyQixTQUFPLEtBckNsQztBQXNDN0IsU0FBTyxLQXRDc0I7QUFzQ2YsU0FBTyxLQXRDUTtBQXNDRCxTQUFPLEtBdENOO0FBc0NhLFNBQU8sS0F0Q3BCO0FBc0MyQixTQUFPLEtBdENsQztBQXVDN0IsU0FBTyxLQXZDc0I7QUF1Q2YsU0FBTyxLQXZDUTtBQXVDRCxTQUFPLEtBdkNOO0FBdUNhLFNBQU8sS0F2Q3BCO0FBdUMyQixTQUFPLEtBdkNsQztBQXdDN0IsU0FBTyxLQXhDc0I7QUF3Q2YsU0FBTyxLQXhDUTtBQXdDRCxTQUFPLEtBeENOO0FBd0NhLFNBQU8sS0F4Q3BCO0FBd0MyQixTQUFPLEtBeENsQztBQXlDN0IsU0FBTyxLQXpDc0I7QUF5Q2YsU0FBTyxLQXpDUTtBQXlDRCxTQUFPLEtBekNOO0FBeUNhLFNBQU8sS0F6Q3BCO0FBeUMyQixTQUFPLEtBekNsQztBQTBDN0IsU0FBTyxLQTFDc0I7QUEwQ2YsU0FBTyxLQTFDUTtBQTBDRCxTQUFPLEtBMUNOO0FBMENhLFNBQU8sS0ExQ3BCO0FBMEMyQixTQUFPLEtBMUNsQztBQTJDN0IsU0FBTyxLQTNDc0I7QUEyQ2YsU0FBTyxLQTNDUTtBQTJDRCxTQUFPLEtBM0NOO0FBMkNhLFNBQU8sS0EzQ3BCO0FBMkMyQixTQUFPLEtBM0NsQztBQTRDN0IsU0FBTyxLQTVDc0I7QUE0Q2YsU0FBTyxLQTVDUTtBQTRDRCxTQUFPLEtBNUNOO0FBNENhLFNBQU8sS0E1Q3BCO0FBNEMyQixTQUFPLEtBNUNsQztBQTZDN0IsU0FBTyxLQTdDc0I7QUE2Q2YsU0FBTyxLQTdDUTtBQTZDRCxTQUFPLEtBN0NOO0FBNkNhLFNBQU8sS0E3Q3BCO0FBNkMyQixTQUFPLEtBN0NsQztBQThDN0IsU0FBTyxLQTlDc0I7QUE4Q2YsU0FBTyxLQTlDUTtBQThDRCxTQUFPLEtBOUNOO0FBOENhLFNBQU8sS0E5Q3BCO0FBOEMyQixTQUFPLEtBOUNsQztBQStDN0IsU0FBTyxLQS9Dc0I7QUErQ2YsU0FBTyxLQS9DUTtBQStDRCxTQUFPLEtBL0NOO0FBK0NhLFNBQU8sS0EvQ3BCO0FBK0MyQixTQUFPLEtBL0NsQztBQWdEN0IsU0FBTyxLQWhEc0I7QUFnRGYsU0FBTyxLQWhEUTtBQWdERCxTQUFPLEtBaEROO0FBZ0RhLFNBQU8sS0FoRHBCO0FBZ0QyQixTQUFPLEtBaERsQztBQWlEN0IsU0FBTyxLQWpEc0I7QUFpRGYsU0FBTyxLQWpEUTtBQWlERCxTQUFPLEtBakROO0FBaURhLFNBQU8sS0FqRHBCO0FBaUQyQixTQUFPLEtBakRsQztBQWtEN0IsU0FBTyxLQWxEc0I7QUFrRGYsU0FBTyxLQWxEUTtBQWtERCxTQUFPLEtBbEROO0FBa0RhLFNBQU8sS0FsRHBCO0FBa0QyQixTQUFPLEtBbERsQztBQW1EN0IsU0FBTyxLQW5Ec0I7QUFtRGYsU0FBTyxLQW5EUTtBQW1ERCxTQUFPLEtBbkROO0FBbURhLFNBQU8sS0FuRHBCO0FBbUQyQixTQUFPLEtBbkRsQztBQW9EN0IsU0FBTyxLQXBEc0I7QUFvRGYsU0FBTyxLQXBEUTtBQW9ERCxTQUFPLEtBcEROO0FBb0RhLFNBQU8sS0FwRHBCO0FBb0QyQixTQUFPLEtBcERsQztBQXFEN0IsU0FBTyxLQXJEc0I7QUFxRGYsU0FBTyxLQXJEUTtBQXFERCxTQUFPLEtBckROO0FBcURhLFNBQU8sS0FyRHBCO0FBcUQyQixTQUFPLEtBckRsQztBQXNEN0IsU0FBTyxLQXREc0I7QUFzRGYsU0FBTyxLQXREUTtBQXNERCxTQUFPLEtBdEROO0FBc0RhLFNBQU8sS0F0RHBCO0FBc0QyQixTQUFPLEtBdERsQztBQXVEN0IsU0FBTyxLQXZEc0I7QUF1RGYsU0FBTyxLQXZEUTtBQXVERCxTQUFPLEtBdkROO0FBdURhLFNBQU8sS0F2RHBCO0FBdUQyQixTQUFPLEtBdkRsQztBQXdEN0IsU0FBTyxLQXhEc0I7QUF3RGYsU0FBTyxLQXhEUTtBQXdERCxTQUFPLEtBeEROO0FBd0RhLFNBQU8sS0F4RHBCO0FBd0QyQixTQUFPLEtBeERsQztBQXlEN0IsU0FBTyxLQXpEc0I7QUF5RGYsU0FBTyxLQXpEUTtBQXlERCxTQUFPLEtBekROO0FBeURhLFNBQU8sS0F6RHBCO0FBeUQyQixTQUFPLEtBekRsQztBQTBEN0IsU0FBTyxLQTFEc0I7QUEwRGYsU0FBTyxLQTFEUTtBQTBERCxTQUFPLEtBMUROO0FBMERhLFNBQU8sS0ExRHBCO0FBMEQyQixTQUFPLEtBMURsQztBQTJEN0IsU0FBTyxLQTNEc0I7QUEyRGYsU0FBTyxLQTNEUTtBQTJERCxTQUFPLEtBM0ROO0FBMkRhLFNBQU8sS0EzRHBCO0FBMkQyQixTQUFPLEtBM0RsQztBQTREN0IsU0FBTyxLQTVEc0I7QUE0RGYsU0FBTyxLQTVEUTtBQTRERCxTQUFPLEtBNUROO0FBNERhLFNBQU8sS0E1RHBCO0FBNEQyQixTQUFPLEtBNURsQztBQTZEN0IsU0FBTyxLQTdEc0I7QUE2RGYsU0FBTyxLQTdEUTtBQTZERCxTQUFPLEtBN0ROO0FBNkRhLFNBQU8sS0E3RHBCO0FBNkQyQixTQUFPLEtBN0RsQztBQThEN0IsU0FBTyxLQTlEc0I7QUE4RGYsU0FBTyxLQTlEUTtBQThERCxTQUFPLEtBOUROO0FBOERhLFNBQU8sS0E5RHBCO0FBOEQyQixTQUFPLEtBOURsQztBQStEN0IsU0FBTyxLQS9Ec0I7QUErRGYsU0FBTyxLQS9EUTtBQStERCxTQUFPLEtBL0ROO0FBK0RhLFNBQU8sS0EvRHBCO0FBK0QyQixTQUFPLEtBL0RsQztBQWdFN0IsU0FBTyxLQWhFc0I7QUFnRWYsU0FBTyxLQWhFUTtBQWdFRCxTQUFPLEtBaEVOO0FBZ0VhLFNBQU8sS0FoRXBCO0FBZ0UyQixTQUFPLEtBaEVsQztBQWlFN0IsU0FBTyxLQWpFc0I7QUFpRWYsU0FBTyxLQWpFUTtBQWlFRCxTQUFPLEtBakVOO0FBaUVhLFNBQU8sS0FqRXBCO0FBaUUyQixTQUFPLEtBakVsQztBQWtFN0IsU0FBTyxLQWxFc0I7QUFrRWYsU0FBTyxLQWxFUTtBQWtFRCxTQUFPLEtBbEVOO0FBa0VhLFNBQU8sS0FsRXBCO0FBa0UyQixTQUFPLEtBbEVsQztBQW1FN0IsU0FBTyxLQW5Fc0I7QUFtRWYsU0FBTyxLQW5FUTtBQW1FRCxTQUFPLEtBbkVOO0FBbUVhLFNBQU8sS0FuRXBCO0FBbUUyQixTQUFPLEtBbkVsQztBQW9FN0IsU0FBTyxLQXBFc0I7QUFvRWYsU0FBTyxLQXBFUTtBQW9FRCxTQUFPLEtBcEVOO0FBb0VhLFNBQU8sS0FwRXBCO0FBb0UyQixTQUFPLEtBcEVsQztBQXFFN0IsU0FBTyxLQXJFc0I7QUFxRWYsU0FBTyxLQXJFUTtBQXFFRCxTQUFPLEtBckVOO0FBcUVhLFNBQU8sS0FyRXBCO0FBcUUyQixTQUFPLEtBckVsQztBQXNFN0IsU0FBTyxLQXRFc0I7QUFzRWYsU0FBTyxLQXRFUTtBQXNFRCxTQUFPLEtBdEVOO0FBc0VhLFNBQU8sS0F0RXBCO0FBc0UyQixTQUFPLEtBdEVsQztBQXVFN0IsU0FBTyxLQXZFc0I7QUF1RWYsU0FBTyxLQXZFUTtBQXVFRCxTQUFPLEtBdkVOO0FBdUVhLFNBQU8sS0F2RXBCO0FBdUUyQixTQUFPLEtBdkVsQztBQXdFN0IsU0FBTyxLQXhFc0I7QUF3RWYsU0FBTyxLQXhFUTtBQXdFRCxTQUFPLEtBeEVOO0FBd0VhLFNBQU8sS0F4RXBCO0FBd0UyQixTQUFPO0FBeEVsQyxDQUF4Qjs7Ozs7Ozs7Ozs7QUNFUDs7Ozs7Ozs7QUFFTyxJQUFNLGFBQWEsR0FBRztBQUMzQixFQUFBLFlBQVksRUFBRSxZQURhO0FBRTNCLEVBQUEsYUFBYSxFQUFFLGFBRlk7QUFHM0IsRUFBQSxPQUFPLEVBQUUsdURBSGtCO0FBR3VDO0FBQ2xFLEVBQUEsV0FBVyxFQUFFLG9EQUpjO0FBSXdDO0FBQ25FLEVBQUEsVUFBVSxFQUFFLFFBTGU7QUFNM0IsRUFBQSxXQUFXLEVBQUUsY0FOYztBQU8zQixFQUFBLFVBQVUsRUFBRSw2QkFQZTtBQU9nQjtBQUMzQyxFQUFBLGFBQWEsRUFBRSw0QkFSWTtBQVMzQixFQUFBLFdBQVcsRUFBRSxZQVRjO0FBU0E7QUFDM0IsRUFBQSxRQUFRLEVBQUUsYUFWaUI7QUFZM0I7QUFDQSxFQUFBLFNBQVMsRUFBRSxPQUFPLDZCQUFlLGlCQUFmLENBQWlDLElBQWpDLENBQXNDLEdBQXRDLENBQVAsR0FBb0QsSUFicEM7QUFjM0IsRUFBQSxVQUFVLEVBQUUsT0FBTyw2QkFBZSxpQkFBZixDQUFpQyxJQUFqQyxDQUFzQyxHQUF0QyxDQUFQLEdBQW9ELGtCQWRyQztBQWUzQixFQUFBLE9BQU8sRUFBRSxPQUFPLDZCQUFlLFNBQWYsQ0FBeUIsSUFBekIsQ0FBOEIsR0FBOUIsQ0FBUCxHQUE0QyxLQWYxQjtBQWdCM0IsRUFBQSxPQUFPLEVBQUUsT0FBTyw2QkFBZSxTQUFmLENBQXlCLElBQXpCLENBQThCLEdBQTlCLENBQVAsR0FBNEMsSUFoQjFCO0FBaUIzQixFQUFBLFNBQVMsRUFBRSxPQUFPLDZCQUFlLFdBQWYsQ0FBMkIsSUFBM0IsQ0FBZ0MsR0FBaEMsQ0FBUCxHQUE4Qyw4QkFqQjlCO0FBaUI4RDtBQUN6RixFQUFBLFFBQVEsRUFBRSx1QkFsQmlCO0FBb0IzQjtBQUNBLEVBQUEsV0FBVyxFQUFFLE9BckJjO0FBc0IzQixFQUFBLFdBQVcsRUFBRSxRQXRCYztBQXVCM0IsRUFBQSxXQUFXLEVBQUUsVUF2QmM7QUF3QjNCLEVBQUEsZUFBZSxFQUFFLFVBeEJVO0FBeUIzQixFQUFBLFVBQVUsRUFBRTtBQXpCZSxDQUF0Qjs7O0FBNEJBLElBQU0sVUFBVSxxQkFDbEIsYUFEa0IsTUFDQTtBQUNuQixFQUFBLGFBQWEsRUFBRTtBQURJLENBREEsQ0FBaEI7OztBQU1BLElBQU0sZUFBZSxHQUFHO0FBQzdCLEVBQUEsWUFBWSxFQUFFLDRCQURlO0FBRTdCLEVBQUEsWUFBWSxFQUFFLDRCQUZlO0FBRzdCLEVBQUEsYUFBYSxFQUFFLDZCQUhjO0FBSTdCLEVBQUEsYUFBYSxFQUFFLDZCQUpjO0FBSzdCLEVBQUEsY0FBYyxFQUFFLDhCQUxhO0FBTTdCLEVBQUEsT0FBTyxFQUFFLGlEQU5vQjtBQU0rQjtBQUM1RCxFQUFBLGdCQUFnQixFQUFFLCtFQVBXO0FBT3NFO0FBQ25HLEVBQUEsU0FBUyxFQUFFLGlFQVJrQjtBQVFpRDtBQUM5RSxFQUFBLGtCQUFrQixFQUFFLHlFQVRTO0FBU2tFO0FBQy9GLEVBQUEsaUJBQWlCLEVBQUUsZ0ZBVlU7QUFVd0U7QUFDckcsRUFBQSxPQUFPLEVBQUUsMFJBWG9CO0FBWTdCLEVBQUEsV0FBVyxFQUFFLDRIQVpnQjtBQWE3QixFQUFBLFVBQVUsRUFBRSxRQWJpQjtBQWM3QixFQUFBLFdBQVcsRUFBRSxjQWRnQjtBQWU3QixFQUFBLFVBQVUsRUFBRSxtQ0FmaUI7QUFnQjdCLEVBQUEsYUFBYSxFQUFFLHlCQWhCYztBQWlCN0IsRUFBQSxrQkFBa0IsRUFBRSxrQkFqQlM7QUFpQlc7QUFDeEMsRUFBQSxpQkFBaUIsRUFBRSw4REFsQlU7QUFtQjdCLEVBQUEsV0FBVyxFQUFFLE1BbkJnQjtBQW1CUjtBQUNyQixFQUFBLFFBQVEsRUFBRSxhQXBCbUI7QUFxQjdCLEVBQUEsYUFBYSxFQUFFLFdBckJjO0FBdUI3QjtBQUNBLEVBQUEsVUFBVSxFQUFFLE9BQU8sK0JBQWlCLFlBQWpCLENBQThCLElBQTlCLENBQW1DLEdBQW5DLENBQVAsR0FBaUQsSUF4QmhDO0FBeUI3QixFQUFBLFVBQVUsRUFBRSxPQUFPLCtCQUFpQixZQUFqQixDQUE4QixJQUE5QixDQUFtQyxHQUFuQyxDQUFQLEdBQWlELElBekJoQztBQTBCN0IsRUFBQSxPQUFPLEVBQUUsT0FBTywrQkFBaUIsU0FBakIsQ0FBMkIsSUFBM0IsQ0FBZ0MsR0FBaEMsQ0FBUCxHQUE4QyxJQTFCMUI7QUEyQjdCLEVBQUEsT0FBTyxFQUFFLE9BQU8sK0JBQWlCLFNBQWpCLENBQTJCLElBQTNCLENBQWdDLEdBQWhDLENBQVAsR0FBOEMsSUEzQjFCO0FBNEI3QixFQUFBLFNBQVMsRUFBRSxPQUFPLCtCQUFpQixXQUFqQixDQUE2QixJQUE3QixDQUFrQyxHQUFsQyxDQUFQLEdBQWdELG9DQTVCOUI7QUE2QjdCLEVBQUEsUUFBUSxFQUFFLE9BQU8sK0JBQWlCLGVBQWpCLENBQWlDLElBQWpDLENBQXNDLEdBQXRDLENBQVAsR0FBb0QsZ0RBN0JqQztBQTZCbUY7QUFDaEgsRUFBQSxVQUFVLEVBQUUsd0JBOUJpQjtBQStCN0IsRUFBQSxTQUFTLEVBQUUsNkRBL0JrQjtBQWlDN0I7QUFDQSxFQUFBLFlBQVksRUFBRSxNQWxDZTtBQW1DN0IsRUFBQSxXQUFXLEVBQUUsS0FuQ2dCO0FBb0M3QixFQUFBLFdBQVcsRUFBRSxLQXBDZ0I7QUFxQzdCLEVBQUEsVUFBVSxFQUFFLE1BckNpQjtBQXNDN0IsRUFBQSxjQUFjLEVBQUU7QUF0Q2EsQ0FBeEI7Ozs7Ozs7Ozs7O0FDckNQOztBQUVPLElBQU0saUJBQWlCLEdBQUc7QUFDL0IsZ0JBQWM7QUFDWixJQUFBLE1BQU0sRUFBRSxnQkFESTtBQUVaLElBQUEsR0FBRyxFQUFFLENBRk87QUFHWixJQUFBLFNBQVMsRUFBRSxFQUhDO0FBSVosSUFBQSxNQUFNLEVBQUU7QUFKSSxHQURpQjtBQU8vQixZQUFVO0FBQ1IsSUFBQSxNQUFNLEVBQUUsdUJBQWdCLGtCQURoQjtBQUVSLElBQUEsR0FBRyxFQUFFLEVBRkc7QUFHUixJQUFBLFNBQVMsRUFBRSxLQUhIO0FBSVIsSUFBQSxNQUFNLEVBQUU7QUFKQSxHQVBxQjtBQWEvQixhQUFXO0FBQ1QsSUFBQSxNQUFNLEVBQUUsdUJBQWdCLGdCQURmO0FBRVQsSUFBQSxHQUFHLEVBQUUsRUFGSTtBQUdULElBQUEsU0FBUyxFQUFFLEtBSEY7QUFJVCxJQUFBLE1BQU0sRUFBRTtBQUpDLEdBYm9CO0FBbUIvQixrQkFBZ0I7QUFDZCxJQUFBLE1BQU0sRUFBRSx1QkFBZ0IsaUJBRFY7QUFFZCxJQUFBLEdBQUcsRUFBRSxDQUZTO0FBR2QsSUFBQSxTQUFTLEVBQUUsRUFIRztBQUlkLElBQUEsTUFBTSxFQUFFO0FBSk0sR0FuQmU7QUF5Qi9CLGNBQVk7QUFDVixJQUFBLE1BQU0sRUFBRSx1QkFBZ0Isa0JBRGQ7QUFFVixJQUFBLE9BQU8sRUFBRSx1QkFBZ0Isa0JBRmY7QUFHVixJQUFBLEdBQUcsRUFBRSxFQUhLO0FBSVYsSUFBQSxTQUFTLEVBQUUsS0FKRDtBQUtWLElBQUEsVUFBVSxFQUFFLEtBTEY7QUFNVixJQUFBLE1BQU0sRUFBRTtBQU5FLEdBekJtQjtBQWlDL0IsaUJBQWU7QUFDYixJQUFBLE1BQU0sRUFBRSxRQUFRLHVCQUFnQixrQkFEbkI7QUFFYixJQUFBLE9BQU8sRUFBRSx1QkFBZ0IsVUFBaEIsR0FBNkIsTUFBN0IsR0FDTCx1QkFBZ0Isa0JBSFA7QUFJYixJQUFBLEdBQUcsRUFBRSxHQUpRO0FBS2IsSUFBQSxTQUFTLEVBQUUsS0FMRTtBQU1iLElBQUEsVUFBVSxFQUFFLEtBTkM7QUFPYixJQUFBLE1BQU0sRUFBRTtBQVBLLEdBakNnQjtBQTBDL0IsZ0JBQWM7QUFDWixJQUFBLE1BQU0sRUFBRSx1QkFBZ0Isa0JBRFo7QUFFWixJQUFBLEdBQUcsRUFBRSxFQUZPO0FBR1osSUFBQSxTQUFTLEVBQUUsS0FIQztBQUlaLElBQUEsTUFBTSxFQUFFO0FBSkksR0ExQ2lCO0FBZ0QvQixZQUFVO0FBQ1IsSUFBQSxNQUFNLEVBQUUsdUJBQWdCLGtCQURoQjtBQUVSLElBQUEsR0FBRyxFQUFFLENBRkc7QUFHUixJQUFBLFNBQVMsRUFBRSxFQUhIO0FBSVIsSUFBQSxNQUFNLEVBQUU7QUFKQSxHQWhEcUI7QUFzRC9CLGFBQVc7QUFDVCxJQUFBLE1BQU0sRUFBRSx1QkFBZ0IsVUFEZjtBQUVULElBQUEsR0FBRyxFQUFFLENBRkk7QUFHVCxJQUFBLFNBQVMsRUFBRSxFQUhGO0FBSVQsSUFBQSxNQUFNLEVBQUU7QUFKQyxHQXREb0I7QUE0RC9CLFdBQVM7QUFDUCxJQUFBLE1BQU0sRUFBRSx1QkFBZ0IsYUFEakI7QUFFUCxJQUFBLEdBQUcsRUFBRSxDQUZFO0FBR1AsSUFBQSxTQUFTLEVBQUUsRUFISjtBQUlQLElBQUEsTUFBTSxFQUFFO0FBSkQ7QUE1RHNCLENBQTFCOztBQW9FQSxJQUFNLGlCQUFpQixHQUFHO0FBQy9CLGdCQUFjO0FBQ1osSUFBQSxHQUFHLEVBQUUsQ0FETztBQUVaLElBQUEsU0FBUyxFQUFFLEVBRkM7QUFHWixJQUFBLE1BQU0sRUFBRSxLQUhJO0FBSVosSUFBQSxTQUFTLEVBQUUsS0FKQztBQUtaLElBQUEsTUFBTSxFQUFFLGdCQUxJO0FBTVosSUFBQSxLQUFLLEVBQUU7QUFOSyxHQURpQjtBQVMvQixZQUFVO0FBQ1IsSUFBQSxHQUFHLEVBQUUsRUFERztBQUVSLElBQUEsU0FBUyxFQUFFLEtBRkg7QUFHUixJQUFBLE1BQU0sRUFBRSxJQUhBO0FBSVIsSUFBQSxTQUFTLEVBQUUsS0FKSDtBQUtSLElBQUEsTUFBTSxFQUFFLHVCQUFnQjtBQUxoQixHQVRxQjtBQWdCL0IsYUFBVztBQUNULElBQUEsR0FBRyxFQUFFLEVBREk7QUFFVCxJQUFBLFNBQVMsRUFBRSxLQUZGO0FBR1QsSUFBQSxNQUFNLEVBQUUsS0FIQztBQUlULElBQUEsU0FBUyxFQUFFLEtBSkY7QUFLVCxJQUFBLE1BQU0sRUFBRSx1QkFBZ0I7QUFMZixHQWhCb0I7QUF1Qi9CLGtCQUFnQjtBQUNkLElBQUEsR0FBRyxFQUFFLENBRFM7QUFFZCxJQUFBLFNBQVMsRUFBRSxFQUZHO0FBR2QsSUFBQSxNQUFNLEVBQUUsS0FITTtBQUlkLElBQUEsU0FBUyxFQUFFLElBSkc7QUFLZCxJQUFBLE1BQU0sRUFBRSx1QkFBZ0I7QUFMVixHQXZCZTtBQThCL0IsY0FBWTtBQUNWLElBQUEsR0FBRyxFQUFFLEVBREs7QUFFVixJQUFBLFNBQVMsRUFBRSxLQUZEO0FBR1YsSUFBQSxVQUFVLEVBQUUsS0FIRjtBQUlWLElBQUEsTUFBTSxFQUFFLEtBSkU7QUFLVixJQUFBLFNBQVMsRUFBRSxLQUxEO0FBTVYsSUFBQSxNQUFNLEVBQUUsdUJBQWdCLGtCQU5kO0FBT1YsSUFBQSxPQUFPLEVBQUUsdUJBQWdCO0FBUGYsR0E5Qm1CO0FBdUMvQixpQkFBZTtBQUNiLElBQUEsR0FBRyxFQUFFLEdBRFE7QUFFYixJQUFBLFNBQVMsRUFBRSxLQUZFO0FBR2IsSUFBQSxVQUFVLEVBQUUsS0FIQztBQUliLElBQUEsTUFBTSxFQUFFLEtBSks7QUFLYixJQUFBLFNBQVMsRUFBRSxLQUxFO0FBTWIsSUFBQSxNQUFNLEVBQUUsUUFBUSx1QkFBZ0Isa0JBTm5CO0FBT2IsSUFBQSxPQUFPLEVBQUUsdUJBQWdCLFVBQWhCLEdBQTZCLE1BQTdCLEdBQ0wsdUJBQWdCO0FBUlAsR0F2Q2dCO0FBaUQvQixnQkFBYztBQUNaLElBQUEsR0FBRyxFQUFFLEVBRE87QUFFWixJQUFBLFNBQVMsRUFBRSxLQUZDO0FBR1osSUFBQSxNQUFNLEVBQUUsS0FISTtBQUlaLElBQUEsU0FBUyxFQUFFLEtBSkM7QUFLWixJQUFBLE1BQU0sRUFBRSx1QkFBZ0I7QUFMWixHQWpEaUI7QUF3RC9CLFlBQVU7QUFDUixJQUFBLEdBQUcsRUFBRSxDQURHO0FBRVIsSUFBQSxTQUFTLEVBQUUsRUFGSDtBQUdSLElBQUEsTUFBTSxFQUFFLEtBSEE7QUFJUixJQUFBLFNBQVMsRUFBRSxLQUpIO0FBS1IsSUFBQSxNQUFNLEVBQUUsdUJBQWdCLGtCQUxoQjtBQU1SLElBQUEsS0FBSyxFQUFFO0FBTkMsR0F4RHFCO0FBZ0UvQixhQUFXO0FBQ1QsSUFBQSxHQUFHLEVBQUUsQ0FESTtBQUVULElBQUEsU0FBUyxFQUFFLEtBRkY7QUFHVCxJQUFBLE1BQU0sRUFBRSxLQUhDO0FBSVQsSUFBQSxTQUFTLEVBQUUsS0FKRjtBQUtULElBQUEsTUFBTSxFQUFFLHVCQUFnQixVQUxmO0FBTVQsSUFBQSxLQUFLLEVBQUU7QUFORSxHQWhFb0I7QUF3RS9CLFdBQVM7QUFDUCxJQUFBLEdBQUcsRUFBRSxDQURFO0FBRVAsSUFBQSxTQUFTLEVBQUUsRUFGSjtBQUdQLElBQUEsTUFBTSxFQUFFLEtBSEQ7QUFJUCxJQUFBLFNBQVMsRUFBRSxLQUpKO0FBS1AsSUFBQSxNQUFNLEVBQUUsdUJBQWdCLGFBTGpCO0FBTVAsSUFBQSxLQUFLLEVBQUU7QUFOQTtBQXhFc0IsQ0FBMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckVQOzs7SUFHYSxlOzs7OztBQUNYOzs7O0FBSUEsMkJBQVksU0FBWixFQUErQjtBQUFBOztBQUFBOztBQUM3Qix5RkFBTSxTQUFOOztBQUQ2QjtBQUFBO0FBQUE7QUFBQTs7QUFFN0IscUVBQWtCLFNBQWxCOztBQUY2QjtBQUc5Qjs7Ozs7QUFJRDs7Ozt3QkFJZ0I7QUFDZCxtQ0FBTyxJQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozt3QkFJYztBQUNaLGFBQU8sMENBQWtCLEVBQXpCO0FBQ0Q7Ozs7bUJBMUJrQyxLOzs7Ozs7Ozs7QUNMckM7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNLENBQUMsVUFBUCxHQUFvQixzQkFBcEI7QUFDQSxNQUFNLENBQUMsWUFBUCxHQUFzQix3QkFBdEI7QUFDQSxNQUFNLENBQUMsSUFBUCxHQUFjLGdCQUFkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0xPLElBQU0sa0JBQWtCLEdBQUcsR0FBM0I7O0FBQ0EsSUFBTSxrQkFBa0IsR0FBRyxFQUEzQjs7QUFDQSxJQUFNLGdCQUFnQixHQUFHLEtBQUssa0JBQTlCOztBQUNBLElBQU0sZUFBZSxHQUFHLEtBQUssZ0JBQTdCOztBQUVQLElBQU0sWUFBWSxHQUFHLENBQ25CLENBQUMsR0FBRCxFQUFNLGVBQU4sQ0FEbUIsRUFFbkIsQ0FBQyxHQUFELEVBQU0sZ0JBQU4sQ0FGbUIsRUFHbkIsQ0FBQyxHQUFELEVBQU0sa0JBQU4sQ0FIbUIsRUFJbkIsQ0FBQyxHQUFELEVBQU0sa0JBQU4sQ0FKbUIsQ0FBckI7QUFPQTs7Ozs7OztBQU1PLFNBQVMsa0JBQVQsQ0FBNEIsWUFBNUIsRUFBa0Q7QUFDdkQ7QUFDQSxNQUFJLENBQUMsWUFBRCxJQUFpQixZQUFZLElBQUksQ0FBckMsRUFBd0M7QUFDdEMsV0FBTyxVQUFQO0FBQ0Q7O0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUwsQ0FBVyxZQUFZLEdBQUcsZ0JBQTFCLENBQWQ7QUFFQSxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUosQ0FBUyxZQUFZLEdBQUcsSUFBeEIsQ0FBaEI7QUFDQSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBUixFQUFoQixDQVR1RCxDQVV2RDs7QUFDQSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBUixLQUF3QixZQUFZLEdBQUcsR0FBdkQ7QUFFQSxTQUFPLEtBQUssQ0FBQyxRQUFOLEdBQWlCLFFBQWpCLENBQTBCLENBQTFCLEVBQTZCLEdBQTdCLElBQW9DLEdBQXBDLEdBQ0gsT0FBTyxDQUFDLFFBQVIsR0FBbUIsUUFBbkIsQ0FBNEIsQ0FBNUIsRUFBK0IsR0FBL0IsQ0FERyxHQUNtQyxHQURuQyxHQUVILE9BQU8sQ0FBQyxRQUFSLEdBQW1CLFFBQW5CLENBQTRCLENBQTVCLEVBQStCLEdBQS9CLENBRko7QUFHRDtBQUVEOzs7Ozs7OztBQU1PLFNBQVMsdUJBQVQsQ0FBaUMsT0FBakMsRUFBa0Q7QUFDdkQ7QUFDQSxNQUFJLENBQUMsT0FBRCxJQUFZLE9BQU8sSUFBSSxDQUEzQixFQUE4QjtBQUM1QixXQUFPLE1BQVA7QUFDRDs7QUFFRCxNQUFJLFFBQVEsR0FBRyxHQUFmO0FBQ0EsTUFBSSxTQUFTLEdBQUcsT0FBaEI7QUFFQSxFQUFBLFlBQVksQ0FBQyxPQUFiLENBQXFCLGdCQUE2QjtBQUFBO0FBQUEsUUFBM0IsSUFBMkI7QUFBQSxRQUFyQixlQUFxQjs7QUFDaEQsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUwsQ0FBVyxTQUFTLEdBQUcsZUFBdkIsQ0FBWjtBQUVBLElBQUEsU0FBUyxHQUFHLFNBQVMsR0FBRyxlQUF4QixDQUhnRCxDQUloRDtBQUNBOztBQUNBLFFBQUksSUFBSSxLQUFLLEdBQVQsSUFBZ0IsU0FBUyxHQUFHLENBQWhDLEVBQW1DO0FBQ2pDLE1BQUEsS0FBSyxJQUFJLFNBQVQ7QUFDRDs7QUFFRCxRQUFJLEtBQUosRUFBVztBQUNULFVBQUksQ0FBQyxRQUFRLENBQUMsT0FBVCxDQUFpQixHQUFqQixJQUF3QixDQUF4QixJQUNELElBQUksS0FBSyxHQURSLElBQ2UsSUFBSSxLQUFLLEdBRHhCLElBQytCLElBQUksS0FBSyxHQUR6QyxLQUVBLFFBQVEsQ0FBQyxPQUFULENBQWlCLEdBQWpCLE1BQTBCLENBQUMsQ0FGL0IsRUFFa0M7QUFDaEMsUUFBQSxRQUFRLElBQUksR0FBWjtBQUNEOztBQUNELE1BQUEsUUFBUSxjQUFPLEtBQVAsU0FBZSxJQUFmLENBQVI7QUFDRDtBQUNGLEdBbEJEO0FBb0JBLFNBQU8sUUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7OztBQU9PLFNBQVMsZ0JBQVQsQ0FBMEIsVUFBMUIsRUFBOEMsU0FBOUMsRUFBaUU7QUFDdEUsTUFBSSxDQUFDLFVBQUQsSUFBZSxPQUFPLFVBQVAsS0FBc0IsUUFBckMsSUFDQSxDQUFDLFVBQVUsQ0FBQyxLQUFYLENBQWlCLFNBQWpCLENBREwsRUFDa0M7QUFDaEMsV0FBTyxDQUFQO0FBQ0Q7O0FBQ0QsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQVgsQ0FBaUIsR0FBakIsQ0FBZDtBQUNBLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBRCxDQUFOLENBQXBCO0FBQ0EsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFELENBQU4sQ0FBdEI7QUFDQSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUQsQ0FBTixDQUF0QjtBQUNBLFNBQVEsS0FBSyxHQUFHLElBQVQsR0FBa0IsT0FBTyxHQUFHLEVBQTVCLEdBQWtDLE9BQXpDO0FBQ0Q7QUFFRDs7Ozs7Ozs7O0FBT08sU0FBUyxvQkFBVCxDQUE4QixRQUE5QixFQUFnRCxhQUFoRCxFQUF1RTtBQUM1RSxNQUFJLENBQUMsUUFBRCxJQUFhLENBQUMsUUFBUSxDQUFDLEtBQVQsQ0FBZSxhQUFmLENBQWxCLEVBQWlEO0FBQy9DLFdBQU8sQ0FBUDtBQUNEOztBQUgyRSxjQUtqQixJQUFJLE1BQUosQ0FDdkQsYUFEdUQsRUFDeEMsSUFEd0MsQ0FDbkMsUUFEbUMsS0FDdEIsRUFOdUM7QUFBQTtBQUFBLE1BS25FLEtBTG1FO0FBQUEsTUFLNUQsTUFMNEQ7QUFBQSxNQUtsRCxJQUxrRDtBQUFBLE1BSzVDLEtBTDRDO0FBQUEsTUFLckMsT0FMcUM7QUFBQSxNQUs1QixPQUw0Qjs7QUFRNUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFKLEVBQVo7QUFDQSxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUosQ0FBUyxHQUFULENBQWY7QUFDQSxFQUFBLE1BQU0sQ0FBQyxXQUFQLENBQW1CLE1BQU0sQ0FBQyxXQUFQLEtBQXVCLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBVixDQUFoRDtBQUNBLEVBQUEsTUFBTSxDQUFDLFFBQVAsQ0FBZ0IsTUFBTSxDQUFDLFFBQVAsS0FBb0IsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFYLENBQTFDO0FBQ0EsRUFBQSxNQUFNLENBQUMsT0FBUCxDQUFlLE1BQU0sQ0FBQyxPQUFQLEtBQW1CLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBVCxDQUF4QztBQUNBLEVBQUEsTUFBTSxDQUFDLFFBQVAsQ0FBZ0IsTUFBTSxDQUFDLFFBQVAsS0FBb0IsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFWLENBQTFDO0FBQ0EsRUFBQSxNQUFNLENBQUMsVUFBUCxDQUFrQixNQUFNLENBQUMsVUFBUCxLQUFzQixNQUFNLENBQUMsT0FBTyxJQUFJLENBQVosQ0FBOUM7QUFDQSxFQUFBLE1BQU0sQ0FBQyxVQUFQLENBQWtCLE1BQU0sQ0FBQyxVQUFQLEtBQXNCLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBWixDQUE5Qzs7QUFDQSxNQUFJLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBRCxDQUFOLENBQWdCLE9BQWhCLENBQXdCLEdBQXhCLElBQStCLENBQTlDLEVBQWlEO0FBQy9DLFFBQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBRCxDQUFOLEdBQWtCLENBQW5CLENBQU4sQ0FBNEIsT0FBNUIsQ0FBb0MsQ0FBcEMsSUFBeUMsTUFBOUQ7QUFDQSxJQUFBLE1BQU0sQ0FBQyxlQUFQLENBQXVCLE1BQU0sQ0FBQyxlQUFQLEtBQTJCLFlBQWxEO0FBQ0Q7O0FBRUQsU0FBTyxDQUFFLE1BQU0sR0FBRyxHQUFWLEdBQWlCLEdBQWxCLElBQXlCLE1BQWhDO0FBQ0Q7QUFFRDs7Ozs7Ozs7OztBQVFPLFNBQVMsZUFBVCxDQUNILEtBREcsRUFFSCxNQUZHLEVBR0gsYUFIRyxFQUdvQjtBQUN6QixNQUFNLFlBQVksR0FBRyxvQkFBb0IsQ0FBQyxLQUFELEVBQVEsYUFBUixDQUF6QztBQUNBLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLE1BQUQsRUFBUyxhQUFULENBQTFDO0FBRUEsU0FBTyx1QkFBdUIsQ0FBQyxZQUFZLEdBQUcsYUFBaEIsQ0FBOUI7QUFDRDtBQUVEOzs7Ozs7Ozs7O0FBUU8sU0FBUyxvQkFBVCxDQUNILEtBREcsRUFFSCxNQUZHLEVBR0gsU0FIRyxFQUdnQjtBQUNyQixNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxLQUFELEVBQVEsU0FBUixDQUFyQztBQUNBLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE1BQUQsRUFBUyxTQUFULENBQXRDO0FBQ0EsU0FBTyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsYUFBaEIsQ0FBekI7QUFDRDtBQUVEOzs7Ozs7O0FBS08sU0FBUyxPQUFULENBQWlCLElBQWpCLEVBQXVCO0FBQzVCLE1BQU0sTUFBTSxHQUFHLEVBQWY7QUFFQTs7Ozs7O0FBS0EsV0FBUyxPQUFULENBQWlCLEdBQWpCLEVBQXNCLElBQXRCLEVBQTRCO0FBQzFCLFFBQUksTUFBTSxDQUFDLEdBQUQsQ0FBTixLQUFnQixHQUFwQixFQUF5QjtBQUN2QixNQUFBLE1BQU0sQ0FBQyxJQUFELENBQU4sR0FBZSxHQUFmO0FBQ0QsS0FGRCxNQUVPLElBQUksS0FBSyxDQUFDLE9BQU4sQ0FBYyxHQUFkLENBQUosRUFBd0I7QUFDN0IsV0FBSyxJQUFJLENBQUMsR0FBRyxDQUFSLEVBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUF4QixFQUFnQyxDQUFDLEdBQUcsQ0FBcEMsRUFBdUMsQ0FBQyxFQUF4QyxFQUE0QztBQUMxQyxRQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBRCxDQUFKLEVBQVMsSUFBSSxHQUFHLEdBQVAsR0FBYSxDQUFiLEdBQWlCLEdBQTFCLENBQVA7QUFDQSxZQUFJLENBQUMsS0FBSyxDQUFWLEVBQWEsTUFBTSxDQUFDLElBQUQsQ0FBTixHQUFlLEVBQWY7QUFDZDtBQUNGLEtBTE0sTUFLQTtBQUNMLFVBQUksT0FBTyxHQUFHLElBQWQ7O0FBQ0EsV0FBSyxJQUFNLENBQVgsSUFBZ0IsR0FBaEIsRUFBcUI7QUFDbkIsWUFBSSxHQUFHLGNBQUgsQ0FBa0IsSUFBbEIsQ0FBdUIsR0FBdkIsRUFBNEIsQ0FBNUIsQ0FBSixFQUFvQztBQUNsQyxVQUFBLE9BQU8sR0FBRyxLQUFWO0FBQ0EsVUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUQsQ0FBSixFQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBUCxHQUFhLENBQWhCLEdBQW9CLENBQWpDLENBQVA7QUFDRDtBQUNGOztBQUNELFVBQUksT0FBTyxJQUFJLElBQWYsRUFBcUIsTUFBTSxDQUFDLElBQUQsQ0FBTixHQUFlLEVBQWY7QUFDdEI7QUFDRjs7QUFFRCxFQUFBLE9BQU8sQ0FBQyxJQUFELEVBQU8sRUFBUCxDQUFQO0FBQ0EsU0FBTyxNQUFQO0FBQ0Q7QUFFRDs7Ozs7OztBQUtPLFNBQVMsU0FBVCxDQUFtQixJQUFuQixFQUF5QjtBQUM5Qjs7QUFDQSxNQUFJLE1BQU0sQ0FBQyxJQUFELENBQU4sS0FBaUIsSUFBakIsSUFBeUIsS0FBSyxDQUFDLE9BQU4sQ0FBYyxJQUFkLENBQTdCLEVBQWtELE9BQU8sSUFBUDtBQUNsRCxNQUFNLEtBQUssR0FBRyx5QkFBZDtBQUNBLE1BQU0sTUFBTSxHQUFHLEVBQWY7O0FBQ0EsT0FBSyxJQUFNLENBQVgsSUFBZ0IsSUFBaEIsRUFBc0I7QUFDcEIsUUFBSSxHQUFHLGNBQUgsQ0FBa0IsSUFBbEIsQ0FBdUIsSUFBdkIsRUFBNkIsQ0FBN0IsQ0FBSixFQUFxQztBQUNuQyxVQUFJLEdBQUcsR0FBRyxNQUFWO0FBQ0EsVUFBSSxJQUFJLEdBQUcsRUFBWDtBQUNBLFVBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsQ0FBWCxDQUFSOztBQUNBLGFBQU8sQ0FBUCxFQUFVO0FBQ1IsUUFBQSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUQsQ0FBSCxLQUFjLEdBQUcsQ0FBQyxJQUFELENBQUgsR0FBYSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8sRUFBUCxHQUFZLEVBQXZDLENBQU47QUFDQSxRQUFBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBRCxDQUFELElBQVEsQ0FBQyxDQUFDLENBQUQsQ0FBaEI7QUFDQSxRQUFBLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLENBQVgsQ0FBSjtBQUNEOztBQUNELE1BQUEsR0FBRyxDQUFDLElBQUQsQ0FBSCxHQUFZLElBQUksQ0FBQyxDQUFELENBQWhCO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPLE1BQU0sQ0FBQyxFQUFELENBQU4sSUFBYyxNQUFyQjtBQUNEIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiLy8gQGZsb3dcbmltcG9ydCBTY29ybTEyQVBJIGZyb20gJy4vU2Nvcm0xMkFQSSc7XG5pbXBvcnQge1xuICBDTUksXG4gIENNSUV2YWx1YXRpb25Db21tZW50c09iamVjdCxcbiAgQ01JVHJpZXNPYmplY3QsXG59IGZyb20gJy4vY21pL2FpY2NfY21pJztcbmltcG9ydCB7TkFWfSBmcm9tICcuL2NtaS9zY29ybTEyX2NtaSc7XG5cbi8qKlxuICogVGhlIEFJQ0MgQVBJIGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFJQ0MgZXh0ZW5kcyBTY29ybTEyQVBJIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBBSUNDIEFQSSBvYmplY3RcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZXR0aW5nczoge30pIHtcbiAgICBjb25zdCBmaW5hbFNldHRpbmdzID0ge1xuICAgICAgLi4ue1xuICAgICAgICBtYXN0ZXJ5X292ZXJyaWRlOiBmYWxzZSxcbiAgICAgIH0sIC4uLnNldHRpbmdzLFxuICAgIH07XG5cbiAgICBzdXBlcihmaW5hbFNldHRpbmdzKTtcblxuICAgIHRoaXMuY21pID0gbmV3IENNSSgpO1xuICAgIHRoaXMubmF2ID0gbmV3IE5BVigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgYnVpbGRzIGEgbmV3IGNoaWxkIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm91bmRGaXJzdEluZGV4XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIGdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSwgZm91bmRGaXJzdEluZGV4KSB7XG4gICAgbGV0IG5ld0NoaWxkID0gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50KENNSUVsZW1lbnQsIHZhbHVlLCBmb3VuZEZpcnN0SW5kZXgpO1xuXG4gICAgaWYgKCFuZXdDaGlsZCkge1xuICAgICAgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnY21pXFxcXC5ldmFsdWF0aW9uXFxcXC5jb21tZW50c1xcXFwuXFxcXGQnKSkge1xuICAgICAgICBuZXdDaGlsZCA9IG5ldyBDTUlFdmFsdWF0aW9uQ29tbWVudHNPYmplY3QoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsICdjbWlcXFxcLnN0dWRlbnRfZGF0YVxcXFwudHJpZXNcXFxcLlxcXFxkJykpIHtcbiAgICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JVHJpZXNPYmplY3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q2hpbGQ7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgd2hvbGUgQVBJIHdpdGggYW5vdGhlclxuICAgKlxuICAgKiBAcGFyYW0ge0FJQ0N9IG5ld0FQSVxuICAgKi9cbiAgcmVwbGFjZVdpdGhBbm90aGVyU2Nvcm1BUEkobmV3QVBJKSB7XG4gICAgLy8gRGF0YSBNb2RlbFxuICAgIHRoaXMuY21pID0gbmV3QVBJLmNtaTtcbiAgICB0aGlzLm5hdiA9IG5ld0FQSS5uYXY7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge0NNSUFycmF5fSBmcm9tICcuL2NtaS9jb21tb24nO1xuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gJy4vZXhjZXB0aW9ucyc7XG5pbXBvcnQge3Njb3JtMTJfZXJyb3JfY29kZXN9IGZyb20gJy4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCB7Z2xvYmFsX2NvbnN0YW50c30gZnJvbSAnLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQge3VuZmxhdHRlbn0gZnJvbSAnLi91dGlsaXRpZXMnO1xuXG4vKipcbiAqIEJhc2UgQVBJIGNsYXNzIGZvciBBSUNDLCBTQ09STSAxLjIsIGFuZCBTQ09STSAyMDA0LiBTaG91bGQgYmUgY29uc2lkZXJlZFxuICogYWJzdHJhY3QsIGFuZCBuZXZlciBpbml0aWFsaXplZCBvbiBpdCdzIG93bi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUFQSSB7XG4gICN0aW1lb3V0O1xuICAjc2NoZWR1bGVDYW5jZWxsZWQgPSBmYWxzZTtcbiAgI2Vycm9yX2NvZGVzO1xuICAjc2V0dGluZ3MgPSB7XG4gICAgYXV0b2NvbW1pdDogZmFsc2UsXG4gICAgYXV0b2NvbW1pdFNlY29uZHM6IDYwLFxuICAgIGxtc0NvbW1pdFVybDogZmFsc2UsXG4gICAgZGF0YUNvbW1pdEZvcm1hdDogJ2pzb24nLCAvLyB2YWxpZCBmb3JtYXRzIGFyZSAnanNvbicgb3IgJ2ZsYXR0ZW5lZCcsICdwYXJhbXMnXG4gICAgY29tbWl0UmVxdWVzdERhdGFUeXBlOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcbiAgICBhdXRvUHJvZ3Jlc3M6IGZhbHNlLFxuICAgIGxvZ0xldmVsOiBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9FUlJPUixcbiAgfTtcbiAgY21pO1xuICBzdGFydGluZ0RhdGE6IHt9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQmFzZSBBUEkgY2xhc3MuIFNldHMgc29tZSBzaGFyZWQgQVBJIGZpZWxkcywgYXMgd2VsbCBhc1xuICAgKiBzZXRzIHVwIG9wdGlvbnMgZm9yIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlcnJvcl9jb2Rlc1xuICAgKiBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yX2NvZGVzLCBzZXR0aW5ncykge1xuICAgIGlmIChuZXcudGFyZ2V0ID09PSBCYXNlQVBJKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29uc3RydWN0IEJhc2VBUEkgaW5zdGFuY2VzIGRpcmVjdGx5Jyk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9OT1RfSU5JVElBTElaRUQ7XG4gICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICB0aGlzLmxpc3RlbmVyQXJyYXkgPSBbXTtcblxuICAgIHRoaXMuI3RpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuI2Vycm9yX2NvZGVzID0gZXJyb3JfY29kZXM7XG5cbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5hcGlMb2dMZXZlbCA9IHRoaXMuc2V0dGluZ3MubG9nTGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgQVBJXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGluaXRpYWxpemVNZXNzYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXJtaW5hdGlvbk1lc3NhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgaW5pdGlhbGl6ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2U/OiBTdHJpbmcsXG4gICAgICB0ZXJtaW5hdGlvbk1lc3NhZ2U/OiBTdHJpbmcpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5JTklUSUFMSVpFRCwgaW5pdGlhbGl6ZU1lc3NhZ2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1Rlcm1pbmF0ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuVEVSTUlOQVRFRCwgdGVybWluYXRpb25NZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX0lOSVRJQUxJWkVEO1xuICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NldHRpbmdzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIGdldCBzZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2V0dGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2V0dGluZ3NcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBzZXQgc2V0dGluZ3Moc2V0dGluZ3M6IE9iamVjdCkge1xuICAgIHRoaXMuI3NldHRpbmdzID0gey4uLnRoaXMuI3NldHRpbmdzLCAuLi5zZXR0aW5nc307XG4gIH1cblxuICAvKipcbiAgICogVGVybWluYXRlcyB0aGUgY3VycmVudCBydW4gb2YgdGhlIEFQSVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRlcm1pbmF0ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgIGlmICh0aGlzLmNoZWNrU3RhdGUoY2hlY2tUZXJtaW5hdGVkLFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5URVJNSU5BVElPTl9CRUZPUkVfSU5JVCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuTVVMVElQTEVfVEVSTUlOQVRJT04pKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnN0b3JlRGF0YSh0cnVlKTtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3JDb2RlICYmIHJlc3VsdC5lcnJvckNvZGUgPiAwKSB7XG4gICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHJlc3VsdC5lcnJvckNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWUgPSByZXN1bHQucmVzdWx0ID9cbiAgICAgICAgICByZXN1bHQucmVzdWx0IDogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9URVJNSU5BVEVEO1xuICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgQ01JRWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRWYWx1ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuLFxuICAgICAgQ01JRWxlbWVudDogU3RyaW5nKSB7XG4gICAgbGV0IHJldHVyblZhbHVlO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tTdGF0ZShjaGVja1Rlcm1pbmF0ZWQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlJFVFJJRVZFX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5SRVRSSUVWRV9BRlRFUl9URVJNKSkge1xuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHJldHVyblZhbHVlID0gdGhpcy5nZXRDTUlWYWx1ZShDTUlFbGVtZW50KTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUsIENNSUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgQ01JRWxlbWVudCwgJzogcmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBDTUlFbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc2V0VmFsdWUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbixcbiAgICAgIENNSUVsZW1lbnQsXG4gICAgICB2YWx1ZSkge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5jaGVja1N0YXRlKGNoZWNrVGVybWluYXRlZCwgdGhpcy4jZXJyb3JfY29kZXMuU1RPUkVfQkVGT1JFX0lOSVQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlNUT1JFX0FGVEVSX1RFUk0pKSB7XG4gICAgICBpZiAoY2hlY2tUZXJtaW5hdGVkKSB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLnNldENNSVZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSBlLmVycm9yQ29kZTtcbiAgICAgICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuR0VORVJBTCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAocmV0dXJuVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRpZG4ndCBoYXZlIGFueSBlcnJvcnMgd2hpbGUgc2V0dGluZyB0aGUgZGF0YSwgZ28gYWhlYWQgYW5kXG4gICAgLy8gc2NoZWR1bGUgYSBjb21taXQsIGlmIGF1dG9jb21taXQgaXMgdHVybmVkIG9uXG4gICAgaWYgKFN0cmluZyh0aGlzLmxhc3RFcnJvckNvZGUpID09PSAnMCcpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9jb21taXQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZUNvbW1pdCh0aGlzLnNldHRpbmdzLmF1dG9jb21taXRTZWNvbmRzICogMTAwMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBDTUlFbGVtZW50LFxuICAgICAgICAnOiAnICsgdmFsdWUgKyAnOiByZXN1bHQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9yZGVycyBMTVMgdG8gc3RvcmUgYWxsIGNvbnRlbnQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGNvbW1pdChcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5jbGVhclNjaGVkdWxlZENvbW1pdCgpO1xuXG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgIGlmICh0aGlzLmNoZWNrU3RhdGUoY2hlY2tUZXJtaW5hdGVkLCB0aGlzLiNlcnJvcl9jb2Rlcy5DT01NSVRfQkVGT1JFX0lOSVQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLkNPTU1JVF9BRlRFUl9URVJNKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZURhdGEoZmFsc2UpO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvckNvZGUgJiYgcmVzdWx0LmVycm9yQ29kZSA+IDApIHtcbiAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IocmVzdWx0LmVycm9yQ29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm5WYWx1ZSA9IHJlc3VsdC5yZXN1bHQgP1xuICAgICAgICAgIHJlc3VsdC5yZXN1bHQgOiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsICdIdHRwUmVxdWVzdCcsICcgUmVzdWx0OiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfREVCVUcpO1xuXG4gICAgICBpZiAoY2hlY2tUZXJtaW5hdGVkKSB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuXG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBsYXN0IGVycm9yIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRMYXN0RXJyb3IoY2FsbGJhY2tOYW1lOiBTdHJpbmcpIHtcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IFN0cmluZyh0aGlzLmxhc3RFcnJvckNvZGUpO1xuXG4gICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcnJvck51bWJlciBlcnJvciBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBDTUlFcnJvckNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0RXJyb3JTdHJpbmcoY2FsbGJhY2tOYW1lOiBTdHJpbmcsIENNSUVycm9yQ29kZSkge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXG4gICAgaWYgKENNSUVycm9yQ29kZSAhPT0gbnVsbCAmJiBDTUlFcnJvckNvZGUgIT09ICcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhDTUlFcnJvckNvZGUpO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXByZWhlbnNpdmUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yTnVtYmVyIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBDTUlFcnJvckNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0RGlhZ25vc3RpYyhjYWxsYmFja05hbWU6IFN0cmluZywgQ01JRXJyb3JDb2RlKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gJyc7XG5cbiAgICBpZiAoQ01JRXJyb3JDb2RlICE9PSBudWxsICYmIENNSUVycm9yQ29kZSAhPT0gJycpIHtcbiAgICAgIHJldHVyblZhbHVlID0gdGhpcy5nZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKENNSUVycm9yQ29kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIExNUyBzdGF0ZSBhbmQgZW5zdXJlcyBpdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBjaGVja1Rlcm1pbmF0ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGJlZm9yZUluaXRFcnJvclxuICAgKiBAcGFyYW0ge251bWJlcn0gYWZ0ZXJUZXJtRXJyb3JcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNoZWNrU3RhdGUoXG4gICAgICBjaGVja1Rlcm1pbmF0ZWQ6IGJvb2xlYW4sXG4gICAgICBiZWZvcmVJbml0RXJyb3I6IG51bWJlcixcbiAgICAgIGFmdGVyVGVybUVycm9yPzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaXNOb3RJbml0aWFsaXplZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihiZWZvcmVJbml0RXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoY2hlY2tUZXJtaW5hdGVkICYmIHRoaXMuaXNUZXJtaW5hdGVkKCkpIHtcbiAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGFmdGVyVGVybUVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dnaW5nIGZvciBhbGwgU0NPUk0gYWN0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25OYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dNZXNzYWdlXG4gICAqIEBwYXJhbSB7bnVtYmVyfW1lc3NhZ2VMZXZlbFxuICAgKi9cbiAgYXBpTG9nKFxuICAgICAgZnVuY3Rpb25OYW1lOiBTdHJpbmcsXG4gICAgICBDTUlFbGVtZW50OiBTdHJpbmcsXG4gICAgICBsb2dNZXNzYWdlOiBTdHJpbmcsXG4gICAgICBtZXNzYWdlTGV2ZWw6IG51bWJlcikge1xuICAgIGxvZ01lc3NhZ2UgPSB0aGlzLmZvcm1hdE1lc3NhZ2UoZnVuY3Rpb25OYW1lLCBDTUlFbGVtZW50LCBsb2dNZXNzYWdlKTtcblxuICAgIGlmIChtZXNzYWdlTGV2ZWwgPj0gdGhpcy5hcGlMb2dMZXZlbCkge1xuICAgICAgc3dpdGNoIChtZXNzYWdlTGV2ZWwpIHtcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9FUlJPUjpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX1dBUk5JTkc6XG4gICAgICAgICAgY29uc29sZS53YXJuKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk86XG4gICAgICAgICAgY29uc29sZS5pbmZvKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHOlxuICAgICAgICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dNZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIFNDT1JNIG1lc3NhZ2VzIGZvciBlYXN5IHJlYWRpbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmb3JtYXRNZXNzYWdlKGZ1bmN0aW9uTmFtZTogU3RyaW5nLCBDTUlFbGVtZW50OiBTdHJpbmcsIG1lc3NhZ2U6IFN0cmluZykge1xuICAgIGNvbnN0IGJhc2VMZW5ndGggPSAyMDtcbiAgICBsZXQgbWVzc2FnZVN0cmluZyA9ICcnO1xuXG4gICAgbWVzc2FnZVN0cmluZyArPSBmdW5jdGlvbk5hbWU7XG5cbiAgICBsZXQgZmlsbENoYXJzID0gYmFzZUxlbmd0aCAtIG1lc3NhZ2VTdHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxsQ2hhcnM7IGkrKykge1xuICAgICAgbWVzc2FnZVN0cmluZyArPSAnICc7XG4gICAgfVxuXG4gICAgbWVzc2FnZVN0cmluZyArPSAnOiAnO1xuXG4gICAgaWYgKENNSUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IENNSUVsZW1lbnRCYXNlTGVuZ3RoID0gNzA7XG5cbiAgICAgIG1lc3NhZ2VTdHJpbmcgKz0gQ01JRWxlbWVudDtcblxuICAgICAgZmlsbENoYXJzID0gQ01JRWxlbWVudEJhc2VMZW5ndGggLSBtZXNzYWdlU3RyaW5nLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaWxsQ2hhcnM7IGorKykge1xuICAgICAgICBtZXNzYWdlU3RyaW5nICs9ICcgJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgbWVzc2FnZVN0cmluZyArPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0byBzZWUgaWYge3N0cn0gY29udGFpbnMge3Rlc3Rlcn1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBTdHJpbmcgdG8gY2hlY2sgYWdhaW5zdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdGVyIFN0cmluZyB0byBjaGVjayBmb3JcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0cmluZ01hdGNoZXMoc3RyOiBTdHJpbmcsIHRlc3RlcjogU3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ciAmJiB0ZXN0ZXIgJiYgc3RyLm1hdGNoKHRlc3Rlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpYyBvYmplY3QgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eVxuICAgKiBAcGFyYW0geyp9IHJlZk9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tPYmplY3RIYXNQcm9wZXJ0eShyZWZPYmplY3QsIGF0dHJpYnV0ZTogU3RyaW5nKSB7XG4gICAgcmV0dXJuIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlZk9iamVjdCwgYXR0cmlidXRlKSB8fFxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlZk9iamVjdCksIGF0dHJpYnV0ZSkgfHxcbiAgICAgICAgKGF0dHJpYnV0ZSBpbiByZWZPYmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byBlcnJvck51bWJlclxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBfZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtib29sZWFufSBfZGV0YWlsXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKF9lcnJvck51bWJlciwgX2RldGFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBnZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIGVsZW1lbnQuXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRDTUlWYWx1ZShfQ01JRWxlbWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdldENNSVZhbHVlIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIGVsZW1lbnQuXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7YW55fSBfdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHNldENNSVZhbHVlKF9DTUlFbGVtZW50LCBfdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzZXRDTUlWYWx1ZSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIEFQSSBtZXRob2QgdG8gc2V0IGEgdmFsaWQgZm9yIGEgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBzY29ybTIwMDRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBfY29tbW9uU2V0Q01JVmFsdWUoXG4gICAgICBtZXRob2ROYW1lOiBTdHJpbmcsIHNjb3JtMjAwNDogYm9vbGVhbiwgQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICBpZiAoIUNNSUVsZW1lbnQgfHwgQ01JRWxlbWVudCA9PT0gJycpIHtcbiAgICAgIHJldHVybiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cnVjdHVyZSA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBsZXQgcmVmT2JqZWN0ID0gdGhpcztcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIGxldCBmb3VuZEZpcnN0SW5kZXggPSBmYWxzZTtcblxuICAgIGNvbnN0IGludmFsaWRFcnJvck1lc3NhZ2UgPSBgVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBwYXNzZWQgdG8gJHttZXRob2ROYW1lfSAoJHtDTUlFbGVtZW50fSkgaXMgbm90IGEgdmFsaWQgU0NPUk0gZGF0YSBtb2RlbCBlbGVtZW50LmA7XG4gICAgY29uc3QgaW52YWxpZEVycm9yQ29kZSA9IHNjb3JtMjAwNCA/XG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlVOREVGSU5FRF9EQVRBX01PREVMIDpcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuR0VORVJBTDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RydWN0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBzdHJ1Y3R1cmVbaV07XG5cbiAgICAgIGlmIChpID09PSBzdHJ1Y3R1cmUubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAoc2Nvcm0yMDA0ICYmIChhdHRyaWJ1dGUuc3Vic3RyKDAsIDgpID09PSAne3RhcmdldD0nKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiByZWZPYmplY3QuX2lzVGFyZ2V0VmFsaWQgPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnXFxcXC5jb3JyZWN0X3Jlc3BvbnNlc1xcXFwuXFxcXGQnKSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUNvcnJlY3RSZXNwb25zZShDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzY29ybTIwMDQgfHwgdGhpcy5sYXN0RXJyb3JDb2RlID09PSAwKSB7XG4gICAgICAgICAgICByZWZPYmplY3RbYXR0cmlidXRlXSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWZPYmplY3QgPSByZWZPYmplY3RbYXR0cmlidXRlXTtcbiAgICAgICAgaWYgKCFyZWZPYmplY3QpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWZPYmplY3QgaW5zdGFuY2VvZiBDTUlBcnJheSkge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoc3RydWN0dXJlW2kgKyAxXSwgMTApO1xuXG4gICAgICAgICAgLy8gU0NPIGlzIHRyeWluZyB0byBzZXQgYW4gaXRlbSBvbiBhbiBhcnJheVxuICAgICAgICAgIGlmICghaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcmVmT2JqZWN0LmNoaWxkQXJyYXlbaW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICByZWZPYmplY3QgPSBpdGVtO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3Q2hpbGQgPSB0aGlzLmdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGZvdW5kRmlyc3RJbmRleCk7XG4gICAgICAgICAgICAgIGZvdW5kRmlyc3RJbmRleCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgaWYgKCFuZXdDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZWZPYmplY3QuaW5pdGlhbGl6ZWQpIG5ld0NoaWxkLmluaXRpYWxpemUoKTtcblxuICAgICAgICAgICAgICAgIHJlZk9iamVjdC5jaGlsZEFycmF5LnB1c2gobmV3Q2hpbGQpO1xuICAgICAgICAgICAgICAgIHJlZk9iamVjdCA9IG5ld0NoaWxkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhdmUgdG8gdXBkYXRlIGkgdmFsdWUgdG8gc2tpcCB0aGUgYXJyYXkgcG9zaXRpb25cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmV0dXJuVmFsdWUgPT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0UpIHtcbiAgICAgIHRoaXMuYXBpTG9nKG1ldGhvZE5hbWUsIG51bGwsXG4gICAgICAgICAgYFRoZXJlIHdhcyBhbiBlcnJvciBzZXR0aW5nIHRoZSB2YWx1ZSBmb3I6ICR7Q01JRWxlbWVudH0sIHZhbHVlIG9mOiAke3ZhbHVlfWAsXG4gICAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfV0FSTklORyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFic3RyYWN0IG1ldGhvZCBmb3IgdmFsaWRhdGluZyB0aGF0IGEgcmVzcG9uc2UgaXMgY29ycmVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gX3ZhbHVlXG4gICAqL1xuICB2YWxpZGF0ZUNvcnJlY3RSZXNwb25zZShfQ01JRWxlbWVudCwgX3ZhbHVlKSB7XG4gICAgLy8ganVzdCBhIHN0dWIgbWV0aG9kXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBidWlsZHMgYSBuZXcgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gdGhlIGFycmF5LlxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50IC0gdW51c2VkXG4gICAqIEBwYXJhbSB7Kn0gX3ZhbHVlIC0gdW51c2VkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gX2ZvdW5kRmlyc3RJbmRleCAtIHVudXNlZFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGdldENoaWxkRWxlbWVudChfQ01JRWxlbWVudCwgX3ZhbHVlLCBfZm91bmRGaXJzdEluZGV4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2V0Q2hpbGRFbGVtZW50IG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgQ01JIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNjb3JtMjAwNFxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgX2NvbW1vbkdldENNSVZhbHVlKG1ldGhvZE5hbWU6IFN0cmluZywgc2Nvcm0yMDA0OiBib29sZWFuLCBDTUlFbGVtZW50KSB7XG4gICAgaWYgKCFDTUlFbGVtZW50IHx8IENNSUVsZW1lbnQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RydWN0dXJlID0gQ01JRWxlbWVudC5zcGxpdCgnLicpO1xuICAgIGxldCByZWZPYmplY3QgPSB0aGlzO1xuICAgIGxldCBhdHRyaWJ1dGUgPSBudWxsO1xuXG4gICAgY29uc3QgdW5pbml0aWFsaXplZEVycm9yTWVzc2FnZSA9IGBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHBhc3NlZCB0byAke21ldGhvZE5hbWV9ICgke0NNSUVsZW1lbnR9KSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuYDtcbiAgICBjb25zdCBpbnZhbGlkRXJyb3JNZXNzYWdlID0gYFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgcGFzc2VkIHRvICR7bWV0aG9kTmFtZX0gKCR7Q01JRWxlbWVudH0pIGlzIG5vdCBhIHZhbGlkIFNDT1JNIGRhdGEgbW9kZWwgZWxlbWVudC5gO1xuICAgIGNvbnN0IGludmFsaWRFcnJvckNvZGUgPSBzY29ybTIwMDQgP1xuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5VTkRFRklORURfREFUQV9NT0RFTCA6XG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLkdFTkVSQUw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cnVjdHVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgYXR0cmlidXRlID0gc3RydWN0dXJlW2ldO1xuXG4gICAgICBpZiAoIXNjb3JtMjAwNCkge1xuICAgICAgICBpZiAoaSA9PT0gc3RydWN0dXJlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoU3RyaW5nKGF0dHJpYnV0ZSkuc3Vic3RyKDAsIDgpID09PSAne3RhcmdldD0nKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiByZWZPYmplY3QuX2lzVGFyZ2V0VmFsaWQgPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBTdHJpbmcoYXR0cmlidXRlKS5cbiAgICAgICAgICAgICAgc3Vic3RyKDgsIFN0cmluZyhhdHRyaWJ1dGUpLmxlbmd0aCAtIDkpO1xuICAgICAgICAgIHJldHVybiByZWZPYmplY3QuX2lzVGFyZ2V0VmFsaWQodGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hlY2tPYmplY3RIYXNQcm9wZXJ0eShyZWZPYmplY3QsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVmT2JqZWN0ID0gcmVmT2JqZWN0W2F0dHJpYnV0ZV07XG4gICAgICBpZiAocmVmT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmT2JqZWN0IGluc3RhbmNlb2YgQ01JQXJyYXkpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChzdHJ1Y3R1cmVbaSArIDFdLCAxMCk7XG5cbiAgICAgICAgLy8gU0NPIGlzIHRyeWluZyB0byBzZXQgYW4gaXRlbSBvbiBhbiBhcnJheVxuICAgICAgICBpZiAoIWlzTmFOKGluZGV4KSkge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSByZWZPYmplY3QuY2hpbGRBcnJheVtpbmRleF07XG5cbiAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgcmVmT2JqZWN0ID0gaXRlbTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuVkFMVUVfTk9UX0lOSVRJQUxJWkVELFxuICAgICAgICAgICAgICAgIHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSGF2ZSB0byB1cGRhdGUgaSB2YWx1ZSB0byBza2lwIHRoZSBhcnJheSBwb3NpdGlvblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWZPYmplY3QgPT09IG51bGwgfHwgcmVmT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghc2Nvcm0yMDA0KSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICdfY2hpbGRyZW4nKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0xMl9lcnJvcl9jb2Rlcy5DSElMRFJFTl9FUlJPUik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlID09PSAnX2NvdW50Jykge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuQ09VTlRfRVJST1IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZWZPYmplY3Q7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVBJJ3MgY3VycmVudCBzdGF0ZSBpcyBTVEFURV9JTklUSUFMSVpFRFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNJbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUgPT09IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfSU5JVElBTElaRUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBBUEkncyBjdXJyZW50IHN0YXRlIGlzIFNUQVRFX05PVF9JTklUSUFMSVpFRFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNOb3RJbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUgPT09IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfTk9UX0lOSVRJQUxJWkVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVBJJ3MgY3VycmVudCBzdGF0ZSBpcyBTVEFURV9URVJNSU5BVEVEXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc1Rlcm1pbmF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlID09PSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX1RFUk1JTkFURUQ7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGF0dGFjaGluZyB0byBhIHNwZWNpZmljIFNDT1JNIGV2ZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaXN0ZW5lck5hbWVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uKGxpc3RlbmVyTmFtZTogU3RyaW5nLCBjYWxsYmFjazogZnVuY3Rpb24pIHtcbiAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm47XG5cbiAgICBjb25zdCBsaXN0ZW5lckZ1bmN0aW9ucyA9IGxpc3RlbmVyTmFtZS5zcGxpdCgnICcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyU3BsaXQgPSBsaXN0ZW5lckZ1bmN0aW9uc1tpXS5zcGxpdCgnLicpO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGxpc3RlbmVyU3BsaXRbMF07XG5cbiAgICAgIGxldCBDTUlFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgQ01JRWxlbWVudCA9IGxpc3RlbmVyTmFtZS5yZXBsYWNlKGZ1bmN0aW9uTmFtZSArICcuJywgJycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxpc3RlbmVyQXJyYXkucHVzaCh7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBDTUlFbGVtZW50OiBDTUlFbGVtZW50LFxuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIGFueSAnb24nIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbk5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgcHJvY2Vzc0xpc3RlbmVycyhmdW5jdGlvbk5hbWU6IFN0cmluZywgQ01JRWxlbWVudDogU3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpc3RlbmVyQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lckFycmF5W2ldO1xuICAgICAgY29uc3QgZnVuY3Rpb25zTWF0Y2ggPSBsaXN0ZW5lci5mdW5jdGlvbk5hbWUgPT09IGZ1bmN0aW9uTmFtZTtcbiAgICAgIGNvbnN0IGxpc3RlbmVySGFzQ01JRWxlbWVudCA9ICEhbGlzdGVuZXIuQ01JRWxlbWVudDtcbiAgICAgIGNvbnN0IENNSUVsZW1lbnRzTWF0Y2ggPSBsaXN0ZW5lci5DTUlFbGVtZW50ID09PSBDTUlFbGVtZW50O1xuXG4gICAgICBpZiAoZnVuY3Rpb25zTWF0Y2ggJiYgKCFsaXN0ZW5lckhhc0NNSUVsZW1lbnQgfHwgQ01JRWxlbWVudHNNYXRjaCkpIHtcbiAgICAgICAgbGlzdGVuZXIuY2FsbGJhY2soQ01JRWxlbWVudCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBTQ09STSBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICovXG4gIHRocm93U0NPUk1FcnJvcihlcnJvck51bWJlcjogbnVtYmVyLCBtZXNzYWdlOiBTdHJpbmcpIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2UgPSB0aGlzLmdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoZXJyb3JOdW1iZXIpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKCd0aHJvd1NDT1JNRXJyb3InLCBudWxsLCBlcnJvck51bWJlciArICc6ICcgKyBtZXNzYWdlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9FUlJPUik7XG5cbiAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSBTdHJpbmcoZXJyb3JOdW1iZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgbGFzdCBTQ09STSBlcnJvciBjb2RlIG9uIHN1Y2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWNjZXNzXG4gICAqL1xuICBjbGVhclNDT1JNRXJyb3Ioc3VjY2VzczogU3RyaW5nKSB7XG4gICAgaWYgKHN1Y2Nlc3MgIT09IHVuZGVmaW5lZCAmJiBzdWNjZXNzICE9PSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFKSB7XG4gICAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBzdG9yZSB0aGUgZGF0YSB0byB0aGUgTE1TLCBsb2dzIGRhdGEgaWYgbm8gTE1TIGNvbmZpZ3VyZWRcbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF9jYWxjdWxhdGVUb3RhbFRpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHN0b3JlRGF0YShfY2FsY3VsYXRlVG90YWxUaW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHN0b3JlRGF0YSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgQ01JIGZyb20gYSBmbGF0dGVuZWQgSlNPTiBvYmplY3RcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICovXG4gIGxvYWRGcm9tRmxhdHRlbmVkSlNPTihqc29uLCBDTUlFbGVtZW50KSB7XG4gICAgdGhpcy5sb2FkRnJvbUpTT04odW5mbGF0dGVuKGpzb24pLCBDTUlFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBDTUkgZGF0YSBmcm9tIGEgSlNPTiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqL1xuICBsb2FkRnJvbUpTT04oanNvbiwgQ01JRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5pc05vdEluaXRpYWxpemVkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ2xvYWRGcm9tSlNPTiBjYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsIHRvIGxtc0luaXRpYWxpemUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgQ01JRWxlbWVudCA9IENNSUVsZW1lbnQgfHwgJ2NtaSc7XG5cbiAgICB0aGlzLnN0YXJ0aW5nRGF0YSA9IGpzb247XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChqc29uLCBrZXkpICYmIGpzb25ba2V5XSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q01JRWxlbWVudCA9IENNSUVsZW1lbnQgKyAnLicgKyBrZXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0ganNvbltrZXldO1xuXG4gICAgICAgIGlmICh2YWx1ZVsnY2hpbGRBcnJheSddKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVsnY2hpbGRBcnJheSddLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRGcm9tSlNPTih2YWx1ZVsnY2hpbGRBcnJheSddW2ldLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRDTUlFbGVtZW50ICsgJy4nICsgaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgICB0aGlzLmxvYWRGcm9tSlNPTih2YWx1ZSwgY3VycmVudENNSUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0Q01JVmFsdWUoY3VycmVudENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIENNSSBvYmplY3QgdG8gSlNPTiBmb3Igc2VuZGluZyB0byBhbiBMTVMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHJlbmRlckNNSVRvSlNPTlN0cmluZygpIHtcbiAgICBjb25zdCBjbWkgPSB0aGlzLmNtaTtcbiAgICAvLyBEbyB3ZSB3YW50L25lZWQgdG8gcmV0dXJuIGZpZWxkcyB0aGF0IGhhdmUgbm8gc2V0IHZhbHVlP1xuICAgIC8vIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IGNtaSB9LCAoaywgdikgPT4gdiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHYsIDIpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7Y21pfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgY21pXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHJlbmRlckNNSVRvSlNPTk9iamVjdCgpIHtcbiAgICAvLyBEbyB3ZSB3YW50L25lZWQgdG8gcmV0dXJuIGZpZWxkcyB0aGF0IGhhdmUgbm8gc2V0IHZhbHVlP1xuICAgIC8vIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IGNtaSB9LCAoaywgdikgPT4gdiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHYsIDIpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVuZGVyQ01JVG9KU09OU3RyaW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY21pIG9iamVjdCB0byB0aGUgcHJvcGVyIGZvcm1hdCBmb3IgTE1TIGNvbW1pdFxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gX3Rlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHJlbmRlckNvbW1pdENNSShfdGVybWluYXRlQ29tbWl0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHN0b3JlRGF0YSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgTE1TXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R8QXJyYXl9IHBhcmFtc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBwcm9jZXNzSHR0cFJlcXVlc3QodXJsOiBTdHJpbmcsIHBhcmFtcykge1xuICAgIGNvbnN0IGdlbmVyaWNFcnJvciA9IHtcbiAgICAgICdyZXN1bHQnOiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFLFxuICAgICAgJ2Vycm9yQ29kZSc6IHRoaXMuI2Vycm9yX2NvZGVzLkdFTkVSQUwsXG4gICAgfTtcblxuICAgIGNvbnN0IGh0dHBSZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBodHRwUmVxLm9wZW4oJ1BPU1QnLCB1cmwsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGh0dHBSZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgaHR0cFJlcS5zZW5kKHBhcmFtcy5qb2luKCcmJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHR0cFJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5jb21taXRSZXF1ZXN0RGF0YVR5cGUpO1xuICAgICAgICBodHRwUmVxLnNlbmQoSlNPTi5zdHJpbmdpZnkocGFyYW1zKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGdlbmVyaWNFcnJvcjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoaHR0cFJlcS5yZXNwb25zZVRleHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBnZW5lcmljRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIFNDT1JNIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aGVuIC0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgY29tbWl0dGluZ1xuICAgKi9cbiAgc2NoZWR1bGVDb21taXQod2hlbjogbnVtYmVyKSB7XG4gICAgdGhpcy5jbGVhclNjaGVkdWxlZENvbW1pdCgpO1xuICAgIHRoaXMuI3RpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuc2NoZWR1bGVkQ2FsbGJhY2suYmluZCh0aGlzKSwgd2hlbik7XG4gICAgdGhpcy5hcGlMb2coJ3NjaGVkdWxlQ29tbWl0JywgJycsICdzY2hlZHVsZWQnLCBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFuZCBjYW5jZWxzIGFueSBjdXJyZW50bHkgc2NoZWR1bGVkIGNvbW1pdHNcbiAgICovXG4gIGNsZWFyU2NoZWR1bGVkQ29tbWl0KCkge1xuICAgIGlmICh0aGlzLiN0aW1lb3V0KSB7XG4gICAgICB0aGlzLiNzY2hlZHVsZUNhbmNlbGxlZCA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jdGltZW91dCk7XG4gICAgICB0aGlzLmFwaUxvZygnY2xlYXJTY2hlZHVsZWRDb21taXQnLCAnJywgJ2NsZWFyZWQnLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHNjaGVkdWxlZCBjb21taXQgdGltZW91dFxuICAgKi9cbiAgc2NoZWR1bGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKCF0aGlzLiNzY2hlZHVsZUNhbmNlbGxlZCkge1xuICAgICAgdGhpcy5jb21taXQoJ0NvbW1pdCcsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgQmFzZUFQSSBmcm9tICcuL0Jhc2VBUEknO1xuaW1wb3J0IHtcbiAgQ01JLFxuICBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0LFxuICBDTUlJbnRlcmFjdGlvbnNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QsXG4gIENNSU9iamVjdGl2ZXNPYmplY3QsIE5BVixcbn0gZnJvbSAnLi9jbWkvc2Nvcm0xMl9jbWknO1xuaW1wb3J0ICogYXMgVXRpbGl0aWVzIGZyb20gJy4vdXRpbGl0aWVzJztcbmltcG9ydCB7Z2xvYmFsX2NvbnN0YW50cywgc2Nvcm0xMl9jb25zdGFudHN9IGZyb20gJy4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IHtzY29ybTEyX2Vycm9yX2NvZGVzfSBmcm9tICcuL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IHNjb3JtMTJfY29uc3RhbnRzO1xuXG4vKipcbiAqIEFQSSBjbGFzcyBmb3IgU0NPUk0gMS4yXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjb3JtMTJBUEkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBTQ09STSAxLjIgQVBJXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IHt9KSB7XG4gICAgY29uc3QgZmluYWxTZXR0aW5ncyA9IHtcbiAgICAgIC4uLntcbiAgICAgICAgbWFzdGVyeV9vdmVycmlkZTogZmFsc2UsXG4gICAgICB9LCAuLi5zZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgc3VwZXIoc2Nvcm0xMl9lcnJvcl9jb2RlcywgZmluYWxTZXR0aW5ncyk7XG5cbiAgICB0aGlzLmNtaSA9IG5ldyBDTUkoKTtcbiAgICB0aGlzLm5hdiA9IG5ldyBOQVYoKTtcblxuICAgIC8vIFJlbmFtZSBmdW5jdGlvbnMgdG8gbWF0Y2ggMS4yIFNwZWMgYW5kIGV4cG9zZSB0byBtb2R1bGVzXG4gICAgdGhpcy5MTVNJbml0aWFsaXplID0gdGhpcy5sbXNJbml0aWFsaXplO1xuICAgIHRoaXMuTE1TRmluaXNoID0gdGhpcy5sbXNGaW5pc2g7XG4gICAgdGhpcy5MTVNHZXRWYWx1ZSA9IHRoaXMubG1zR2V0VmFsdWU7XG4gICAgdGhpcy5MTVNTZXRWYWx1ZSA9IHRoaXMubG1zU2V0VmFsdWU7XG4gICAgdGhpcy5MTVNDb21taXQgPSB0aGlzLmxtc0NvbW1pdDtcbiAgICB0aGlzLkxNU0dldExhc3RFcnJvciA9IHRoaXMubG1zR2V0TGFzdEVycm9yO1xuICAgIHRoaXMuTE1TR2V0RXJyb3JTdHJpbmcgPSB0aGlzLmxtc0dldEVycm9yU3RyaW5nO1xuICAgIHRoaXMuTE1TR2V0RGlhZ25vc3RpYyA9IHRoaXMubG1zR2V0RGlhZ25vc3RpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBsbXNJbml0aWFsaXplIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBib29sXG4gICAqL1xuICBsbXNJbml0aWFsaXplKCkge1xuICAgIHRoaXMuY21pLmluaXRpYWxpemUoKTtcbiAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKCdMTVNJbml0aWFsaXplJywgJ0xNUyB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCEnLFxuICAgICAgICAnTE1TIGlzIGFscmVhZHkgZmluaXNoZWQhJyk7XG4gIH1cblxuICAvKipcbiAgICogTE1TRmluaXNoIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBib29sXG4gICAqL1xuICBsbXNGaW5pc2goKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50ZXJtaW5hdGUoJ0xNU0ZpbmlzaCcsIGZhbHNlKTtcblxuICAgIGlmIChyZXN1bHQgPT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRSkge1xuICAgICAgaWYgKHRoaXMubmF2LmV2ZW50ICE9PSAnJykge1xuICAgICAgICBpZiAodGhpcy5uYXYuZXZlbnQgPT09ICdjb250aW51ZScpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlTmV4dCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VQcmV2aW91cycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b1Byb2dyZXNzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VOZXh0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNHZXRWYWx1ZSBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldFZhbHVlKENNSUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnTE1TR2V0VmFsdWUnLCBmYWxzZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogTE1TU2V0VmFsdWUgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc1NldFZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoJ0xNU1NldFZhbHVlJywgZmFsc2UsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNDb21taXQgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0NvbW1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb21taXQoJ0xNU0NvbW1pdCcsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNHZXRMYXN0RXJyb3IgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRMYXN0RXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVycm9yKCdMTVNHZXRMYXN0RXJyb3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNHZXRFcnJvclN0cmluZyBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFcnJvckNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zR2V0RXJyb3JTdHJpbmcoQ01JRXJyb3JDb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RXJyb3JTdHJpbmcoJ0xNU0dldEVycm9yU3RyaW5nJywgQ01JRXJyb3JDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNHZXREaWFnbm9zdGljIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXREaWFnbm9zdGljKENNSUVycm9yQ29kZSkge1xuICAgIHJldHVybiB0aGlzLmdldERpYWdub3N0aWMoJ0xNU0dldERpYWdub3N0aWMnLCBDTUlFcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSB2YWx1ZSBvbiB0aGUgQ01JIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHNldENNSVZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1vblNldENNSVZhbHVlKCdMTVNTZXRWYWx1ZScsIGZhbHNlLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldENNSVZhbHVlKENNSUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uR2V0Q01JVmFsdWUoJ2dldENNSVZhbHVlJywgZmFsc2UsIENNSUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgYnVpbGRzIGEgbmV3IGNoaWxkIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvdW5kRmlyc3RJbmRleFxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsIGZvdW5kRmlyc3RJbmRleCkge1xuICAgIGxldCBuZXdDaGlsZDtcblxuICAgIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwub2JqZWN0aXZlc1xcXFwuXFxcXGQnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdEluZGV4ICYmIHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5pbnRlcmFjdGlvbnNcXFxcLlxcXFxkXFxcXC5jb3JyZWN0X3Jlc3BvbnNlc1xcXFwuXFxcXGQnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zQ29ycmVjdFJlc3BvbnNlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdEluZGV4ICYmIHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5pbnRlcmFjdGlvbnNcXFxcLlxcXFxkXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCcpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlJbnRlcmFjdGlvbnNPYmplY3RpdmVzT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwuaW50ZXJhY3Rpb25zXFxcXC5cXFxcZCcpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlJbnRlcmFjdGlvbnNPYmplY3QoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q2hpbGQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIENvcnJlY3QgUmVzcG9uc2UgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHZhbGlkYXRlQ29ycmVjdFJlc3BvbnNlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGVycm9yTnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGVycm9yTnVtYmVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB9ZGV0YWlsXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoZXJyb3JOdW1iZXIsIGRldGFpbCkge1xuICAgIGxldCBiYXNpY01lc3NhZ2UgPSAnTm8gRXJyb3InO1xuICAgIGxldCBkZXRhaWxNZXNzYWdlID0gJ05vIEVycm9yJztcblxuICAgIC8vIFNldCBlcnJvciBudW1iZXIgdG8gc3RyaW5nIHNpbmNlIGluY29uc2lzdGVudCBmcm9tIG1vZHVsZXMgaWYgc3RyaW5nIG9yIG51bWJlclxuICAgIGVycm9yTnVtYmVyID0gU3RyaW5nKGVycm9yTnVtYmVyKTtcbiAgICBpZiAoY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0pIHtcbiAgICAgIGJhc2ljTWVzc2FnZSA9IGNvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdLmJhc2ljTWVzc2FnZTtcbiAgICAgIGRldGFpbE1lc3NhZ2UgPSBjb25zdGFudHMuZXJyb3JfZGVzY3JpcHRpb25zW2Vycm9yTnVtYmVyXS5kZXRhaWxNZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiBkZXRhaWwgPyBkZXRhaWxNZXNzYWdlIDogYmFzaWNNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHdob2xlIEFQSSB3aXRoIGFub3RoZXJcbiAgICpcbiAgICogQHBhcmFtIHtTY29ybTEyQVBJfSBuZXdBUElcbiAgICovXG4gIHJlcGxhY2VXaXRoQW5vdGhlclNjb3JtQVBJKG5ld0FQSSkge1xuICAgIC8vIERhdGEgTW9kZWxcbiAgICB0aGlzLmNtaSA9IG5ld0FQSS5jbWk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjbWkgb2JqZWN0IHRvIHRoZSBwcm9wZXIgZm9ybWF0IGZvciBMTVMgY29tbWl0XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdGVybWluYXRlQ29tbWl0XG4gICAqIEByZXR1cm4ge29iamVjdHxBcnJheX1cbiAgICovXG4gIHJlbmRlckNvbW1pdENNSSh0ZXJtaW5hdGVDb21taXQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjbWlFeHBvcnQgPSB0aGlzLnJlbmRlckNNSVRvSlNPTk9iamVjdCgpO1xuXG4gICAgaWYgKHRlcm1pbmF0ZUNvbW1pdCkge1xuICAgICAgY21pRXhwb3J0LmNtaS5jb3JlLnRvdGFsX3RpbWUgPSB0aGlzLmNtaS5nZXRDdXJyZW50VG90YWxUaW1lKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgZmxhdHRlbmVkID0gVXRpbGl0aWVzLmZsYXR0ZW4oY21pRXhwb3J0KTtcbiAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MuZGF0YUNvbW1pdEZvcm1hdCkge1xuICAgICAgY2FzZSAnZmxhdHRlbmVkJzpcbiAgICAgICAgcmV0dXJuIFV0aWxpdGllcy5mbGF0dGVuKGNtaUV4cG9ydCk7XG4gICAgICBjYXNlICdwYXJhbXMnOlxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gaW4gZmxhdHRlbmVkKSB7XG4gICAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoZmxhdHRlbmVkLCBpdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYCR7aXRlbX09JHtmbGF0dGVuZWRbaXRlbV19YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjbWlFeHBvcnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHN0b3JlIHRoZSBkYXRhIHRvIHRoZSBMTVNcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc3RvcmVEYXRhKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGlmICh0ZXJtaW5hdGVDb21taXQpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsU3RhdHVzID0gdGhpcy5jbWkuY29yZS5sZXNzb25fc3RhdHVzO1xuICAgICAgaWYgKG9yaWdpbmFsU3RhdHVzID09PSAnbm90IGF0dGVtcHRlZCcpIHtcbiAgICAgICAgdGhpcy5jbWkuY29yZS5sZXNzb25fc3RhdHVzID0gJ2NvbXBsZXRlZCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNtaS5jb3JlLmxlc3Nvbl9tb2RlID09PSAnbm9ybWFsJykge1xuICAgICAgICBpZiAodGhpcy5jbWkuY29yZS5jcmVkaXQgPT09ICdjcmVkaXQnKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubWFzdGVyeV9vdmVycmlkZSAmJlxuICAgICAgICAgICAgICB0aGlzLmNtaS5zdHVkZW50X2RhdGEubWFzdGVyeV9zY29yZSAhPT0gJycgJiZcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29yZS5zY29yZS5yYXcgIT09ICcnKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VGbG9hdCh0aGlzLmNtaS5jb3JlLnNjb3JlLnJhdykgPj1cbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KHRoaXMuY21pLnN0dWRlbnRfZGF0YS5tYXN0ZXJ5X3Njb3JlKSkge1xuICAgICAgICAgICAgICB0aGlzLmNtaS5jb3JlLmxlc3Nvbl9zdGF0dXMgPSAncGFzc2VkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNtaS5jb3JlLmxlc3Nvbl9tb2RlID09PSAnYnJvd3NlJykge1xuICAgICAgICBpZiAoKHRoaXMuc3RhcnRpbmdEYXRhPy5jbWk/LmNvcmU/Lmxlc3Nvbl9zdGF0dXMgfHwgJycpID09PSAnJyAmJlxuICAgICAgICAgICAgb3JpZ2luYWxTdGF0dXMgPT09ICdub3QgYXR0ZW1wdGVkJykge1xuICAgICAgICAgIHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cyA9ICdicm93c2VkJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbW1pdE9iamVjdCA9IHRoaXMucmVuZGVyQ29tbWl0Q01JKHRlcm1pbmF0ZUNvbW1pdCk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5sbXNDb21taXRVcmwpIHtcbiAgICAgIGlmICh0aGlzLmFwaUxvZ0xldmVsID09PSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRykge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdDb21taXQgKHRlcm1pbmF0ZWQ6ICcgK1xuICAgICAgICAgICAgKHRlcm1pbmF0ZUNvbW1pdCA/ICd5ZXMnIDogJ25vJykgKyAnKTogJyk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoY29tbWl0T2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdHRwUmVxdWVzdCh0aGlzLnNldHRpbmdzLmxtc0NvbW1pdFVybCwgY29tbWl0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ0NvbW1pdCAodGVybWluYXRlZDogJyArXG4gICAgICAgICAgKHRlcm1pbmF0ZUNvbW1pdCA/ICd5ZXMnIDogJ25vJykgKyAnKTogJyk7XG4gICAgICBjb25zb2xlLmxvZyhjb21taXRPYmplY3QpO1xuICAgICAgcmV0dXJuIGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgQmFzZUFQSSBmcm9tICcuL0Jhc2VBUEknO1xuaW1wb3J0IHtcbiAgQURMLFxuICBDTUksXG4gIENNSUNvbW1lbnRzT2JqZWN0LFxuICBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0LFxuICBDTUlJbnRlcmFjdGlvbnNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QsXG4gIENNSU9iamVjdGl2ZXNPYmplY3QsXG59IGZyb20gJy4vY21pL3Njb3JtMjAwNF9jbWknO1xuaW1wb3J0ICogYXMgVXRpbGl0aWVzIGZyb20gJy4vdXRpbGl0aWVzJztcbmltcG9ydCB7Z2xvYmFsX2NvbnN0YW50cywgc2Nvcm0yMDA0X2NvbnN0YW50c30gZnJvbSAnLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQge3Njb3JtMjAwNF9lcnJvcl9jb2Rlc30gZnJvbSAnLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IHtjb3JyZWN0X3Jlc3BvbnNlc30gZnJvbSAnLi9jb25zdGFudHMvcmVzcG9uc2VfY29uc3RhbnRzJztcbmltcG9ydCB7dmFsaWRfbGFuZ3VhZ2VzfSBmcm9tICcuL2NvbnN0YW50cy9sYW5ndWFnZV9jb25zdGFudHMnO1xuaW1wb3J0IHtzY29ybTIwMDRfcmVnZXh9IGZyb20gJy4vY29uc3RhbnRzL3JlZ2V4JztcblxuY29uc3QgY29uc3RhbnRzID0gc2Nvcm0yMDA0X2NvbnN0YW50cztcblxuLyoqXG4gKiBBUEkgY2xhc3MgZm9yIFNDT1JNIDIwMDRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Nvcm0yMDA0QVBJIGV4dGVuZHMgQmFzZUFQSSB7XG4gICN2ZXJzaW9uOiAnMS4wJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIFNDT1JNIDIwMDQgQVBJXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IHt9KSB7XG4gICAgY29uc3QgZmluYWxTZXR0aW5ncyA9IHtcbiAgICAgIC4uLntcbiAgICAgICAgbWFzdGVyeV9vdmVycmlkZTogZmFsc2UsXG4gICAgICB9LCAuLi5zZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgc3VwZXIoc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLCBmaW5hbFNldHRpbmdzKTtcblxuICAgIHRoaXMuY21pID0gbmV3IENNSSgpO1xuICAgIHRoaXMuYWRsID0gbmV3IEFETCgpO1xuXG4gICAgLy8gUmVuYW1lIGZ1bmN0aW9ucyB0byBtYXRjaCAyMDA0IFNwZWMgYW5kIGV4cG9zZSB0byBtb2R1bGVzXG4gICAgdGhpcy5Jbml0aWFsaXplID0gdGhpcy5sbXNJbml0aWFsaXplO1xuICAgIHRoaXMuVGVybWluYXRlID0gdGhpcy5sbXNUZXJtaW5hdGU7XG4gICAgdGhpcy5HZXRWYWx1ZSA9IHRoaXMubG1zR2V0VmFsdWU7XG4gICAgdGhpcy5TZXRWYWx1ZSA9IHRoaXMubG1zU2V0VmFsdWU7XG4gICAgdGhpcy5Db21taXQgPSB0aGlzLmxtc0NvbW1pdDtcbiAgICB0aGlzLkdldExhc3RFcnJvciA9IHRoaXMubG1zR2V0TGFzdEVycm9yO1xuICAgIHRoaXMuR2V0RXJyb3JTdHJpbmcgPSB0aGlzLmxtc0dldEVycm9yU3RyaW5nO1xuICAgIHRoaXMuR2V0RGlhZ25vc3RpYyA9IHRoaXMubG1zR2V0RGlhZ25vc3RpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN2ZXJzaW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLiN2ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zSW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLmNtaS5pbml0aWFsaXplKCk7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSgnSW5pdGlhbGl6ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zVGVybWluYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudGVybWluYXRlKCdUZXJtaW5hdGUnLCB0cnVlKTtcblxuICAgIGlmIChyZXN1bHQgPT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRSkge1xuICAgICAgaWYgKHRoaXMuYWRsLm5hdi5yZXF1ZXN0ICE9PSAnX25vbmVfJykge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRsLm5hdi5yZXF1ZXN0KSB7XG4gICAgICAgICAgY2FzZSAnY29udGludWUnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZU5leHQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3ByZXZpb3VzJzpcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VQcmV2aW91cycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnY2hvaWNlJzpcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VDaG9pY2UnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4aXQnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUV4aXQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4aXRBbGwnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUV4aXRBbGwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2FiYW5kb24nOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUFiYW5kb24nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2FiYW5kb25BbGwnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUFiYW5kb25BbGwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b1Byb2dyZXNzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VOZXh0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRWYWx1ZShDTUlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ0dldFZhbHVlJywgdHJ1ZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc1NldFZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoJ1NldFZhbHVlJywgdHJ1ZSwgQ01JRWxlbWVudCwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9yZGVycyBMTVMgdG8gc3RvcmUgYWxsIGNvbnRlbnQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0NvbW1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb21taXQoJ0NvbW1pdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbGFzdCBlcnJvciBjb2RlXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldExhc3RFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXN0RXJyb3IoJ0dldExhc3RFcnJvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVycm9yTnVtYmVyIGVycm9yIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBDTUlFcnJvckNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zR2V0RXJyb3JTdHJpbmcoQ01JRXJyb3JDb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RXJyb3JTdHJpbmcoJ0dldEVycm9yU3RyaW5nJywgQ01JRXJyb3JDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcHJlaGVuc2l2ZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3JOdW1iZXIgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBDTUlFcnJvckNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zR2V0RGlhZ25vc3RpYyhDTUlFcnJvckNvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREaWFnbm9zdGljKCdHZXREaWFnbm9zdGljJywgQ01JRXJyb3JDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdmFsdWUgb24gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHNldENNSVZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1vblNldENNSVZhbHVlKCdTZXRWYWx1ZScsIHRydWUsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIGJ1aWxkcyBhIG5ldyBjaGlsZCBlbGVtZW50IHRvIGFkZCB0byB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvdW5kRmlyc3RJbmRleFxuICAgKiBAcmV0dXJuIHthbnl9XG4gICAqL1xuICBnZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsIGZvdW5kRmlyc3RJbmRleCkge1xuICAgIGxldCBuZXdDaGlsZDtcblxuICAgIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwub2JqZWN0aXZlc1xcXFwuXFxcXGQnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdEluZGV4ICYmIHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5pbnRlcmFjdGlvbnNcXFxcLlxcXFxkXFxcXC5jb3JyZWN0X3Jlc3BvbnNlc1xcXFwuXFxcXGQnKSkge1xuICAgICAgY29uc3QgcGFydHMgPSBDTUlFbGVtZW50LnNwbGl0KCcuJyk7XG4gICAgICBjb25zdCBpbmRleCA9IE51bWJlcihwYXJ0c1syXSk7XG4gICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IHRoaXMuY21pLmludGVyYWN0aW9ucy5jaGlsZEFycmF5W2luZGV4XTtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkRFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uX3R5cGUgPSBpbnRlcmFjdGlvbi50eXBlO1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbl9jb3VudCA9IGludGVyYWN0aW9uLmNvcnJlY3RfcmVzcG9uc2VzLl9jb3VudDtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uX3R5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcmFjdGlvbl9jb3VudCAmJiB0aGlzLmxhc3RFcnJvckNvZGUgPT09XG4gICAgICAgICAgMDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGludGVyYWN0aW9uLmNvcnJlY3RfcmVzcG9uc2VzLmNoaWxkQXJyYXlbaV07XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucGF0dGVybiA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkdFTkVSQUxfU0VUX0ZBSUxVUkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlX3R5cGUgPSBjb3JyZWN0X3Jlc3BvbnNlc1tpbnRlcmFjdGlvbl90eXBlXTtcbiAgICAgICAgbGV0IG5vZGVzID0gW107XG4gICAgICAgIGlmIChyZXNwb25zZV90eXBlLmRlbGltaXRlciAhPT0gJycpIHtcbiAgICAgICAgICBub2RlcyA9IFN0cmluZyh2YWx1ZSkuc3BsaXQocmVzcG9uc2VfdHlwZS5kZWxpbWl0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGVzWzBdID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCAmJiBub2Rlcy5sZW5ndGggPD0gcmVzcG9uc2VfdHlwZS5tYXgpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrQ29ycmVjdFJlc3BvbnNlVmFsdWUoaW50ZXJhY3Rpb25fdHlwZSwgbm9kZXMsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2Rlcy5sZW5ndGggPiByZXNwb25zZV90eXBlLm1heCkge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5HRU5FUkFMX1NFVF9GQUlMVVJFLFxuICAgICAgICAgICAgICAnRGF0YSBNb2RlbCBFbGVtZW50IFBhdHRlcm4gVG9vIExvbmcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCkge1xuICAgICAgICBuZXdDaGlsZCA9IG5ldyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGRcXFxcLm9iamVjdGl2ZXNcXFxcLlxcXFxkJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnY21pXFxcXC5pbnRlcmFjdGlvbnNcXFxcLlxcXFxkJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSUludGVyYWN0aW9uc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmNvbW1lbnRzX2Zyb21fbGVhcm5lclxcXFwuXFxcXGQnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JQ29tbWVudHNPYmplY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5jb21tZW50c19mcm9tX2xtc1xcXFwuXFxcXGQnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JQ29tbWVudHNPYmplY3QodHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0NoaWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGNvcnJlY3QgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICovXG4gIHZhbGlkYXRlQ29ycmVjdFJlc3BvbnNlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgY29uc3QgcGFydHMgPSBDTUlFbGVtZW50LnNwbGl0KCcuJyk7XG4gICAgY29uc3QgaW5kZXggPSBOdW1iZXIocGFydHNbMl0pO1xuICAgIGNvbnN0IHBhdHRlcm5faW5kZXggPSBOdW1iZXIocGFydHNbNF0pO1xuICAgIGNvbnN0IGludGVyYWN0aW9uID0gdGhpcy5jbWkuaW50ZXJhY3Rpb25zLmNoaWxkQXJyYXlbaW5kZXhdO1xuXG4gICAgY29uc3QgaW50ZXJhY3Rpb25fdHlwZSA9IGludGVyYWN0aW9uLnR5cGU7XG4gICAgY29uc3QgaW50ZXJhY3Rpb25fY291bnQgPSBpbnRlcmFjdGlvbi5jb3JyZWN0X3Jlc3BvbnNlcy5fY291bnQ7XG4gICAgaWYgKGludGVyYWN0aW9uX3R5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVyYWN0aW9uX2NvdW50ICYmIHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gaW50ZXJhY3Rpb24uY29ycmVjdF9yZXNwb25zZXMuY2hpbGRBcnJheVtpXTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnBhdHRlcm4gPT09IHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkdFTkVSQUxfU0VUX0ZBSUxVUkUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VfdHlwZSA9IHNjb3JtMjAwNF9jb25zdGFudHMuY29ycmVjdF9yZXNwb25zZXNbaW50ZXJhY3Rpb25fdHlwZV07XG4gICAgaWYgKHR5cGVvZiByZXNwb25zZV90eXBlLmxpbWl0ICE9PSAndW5kZWZpbmVkJyB8fCBpbnRlcmFjdGlvbl9jb3VudCA8XG4gICAgICAgIHJlc3BvbnNlX3R5cGUubGltaXQpIHtcbiAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgaWYgKHJlc3BvbnNlX3R5cGUuZGVsaW1pdGVyICE9PSAnJykge1xuICAgICAgICBub2RlcyA9IFN0cmluZyh2YWx1ZSkuc3BsaXQocmVzcG9uc2VfdHlwZS5kZWxpbWl0ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZXNbMF0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDAgJiYgbm9kZXMubGVuZ3RoIDw9IHJlc3BvbnNlX3R5cGUubWF4KSB7XG4gICAgICAgIHRoaXMuY2hlY2tDb3JyZWN0UmVzcG9uc2VWYWx1ZShpbnRlcmFjdGlvbl90eXBlLCBub2RlcywgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChub2Rlcy5sZW5ndGggPiByZXNwb25zZV90eXBlLm1heCkge1xuICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSxcbiAgICAgICAgICAgICdEYXRhIE1vZGVsIEVsZW1lbnQgUGF0dGVybiBUb28gTG9uZycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5sYXN0RXJyb3JDb2RlID09PSAwICYmXG4gICAgICAgICAgKCFyZXNwb25zZV90eXBlLmR1cGxpY2F0ZSB8fFxuICAgICAgICAgICAgICAhdGhpcy5jaGVja0R1cGxpY2F0ZWRQYXR0ZXJuKGludGVyYWN0aW9uLmNvcnJlY3RfcmVzcG9uc2VzLFxuICAgICAgICAgICAgICAgICAgcGF0dGVybl9pbmRleCwgdmFsdWUpKSB8fFxuICAgICAgICAgICh0aGlzLmxhc3RFcnJvckNvZGUgPT09IDAgJiYgdmFsdWUgPT09ICcnKSkge1xuICAgICAgICAvLyBkbyBub3RoaW5nLCB3ZSB3YW50IHRoZSBpbnZlcnNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5sYXN0RXJyb3JDb2RlID09PSAwKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkdFTkVSQUxfU0VUX0ZBSUxVUkUsXG4gICAgICAgICAgICAgICdEYXRhIE1vZGVsIEVsZW1lbnQgUGF0dGVybiBBbHJlYWR5IEV4aXN0cycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5HRU5FUkFMX1NFVF9GQUlMVVJFLFxuICAgICAgICAgICdEYXRhIE1vZGVsIEVsZW1lbnQgQ29sbGVjdGlvbiBMaW1pdCBSZWFjaGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB2YWx1ZSBmcm9tIHRoZSBDTUkgT2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXRDTUlWYWx1ZShDTUlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1vbkdldENNSVZhbHVlKCdHZXRWYWx1ZScsIHRydWUsIENNSUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byBlcnJvck51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcil9IGVycm9yTnVtYmVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGV0YWlsXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoZXJyb3JOdW1iZXIsIGRldGFpbCkge1xuICAgIGxldCBiYXNpY01lc3NhZ2UgPSAnJztcbiAgICBsZXQgZGV0YWlsTWVzc2FnZSA9ICcnO1xuXG4gICAgLy8gU2V0IGVycm9yIG51bWJlciB0byBzdHJpbmcgc2luY2UgaW5jb25zaXN0ZW50IGZyb20gbW9kdWxlcyBpZiBzdHJpbmcgb3IgbnVtYmVyXG4gICAgZXJyb3JOdW1iZXIgPSBTdHJpbmcoZXJyb3JOdW1iZXIpO1xuICAgIGlmIChjb25zdGFudHMuZXJyb3JfZGVzY3JpcHRpb25zW2Vycm9yTnVtYmVyXSkge1xuICAgICAgYmFzaWNNZXNzYWdlID0gY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uYmFzaWNNZXNzYWdlO1xuICAgICAgZGV0YWlsTWVzc2FnZSA9IGNvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdLmRldGFpbE1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRldGFpbCA/IGRldGFpbE1lc3NhZ2UgOiBiYXNpY01lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdG8gc2VlIGlmIGEgY29ycmVjdF9yZXNwb25zZSB2YWx1ZSBoYXMgYmVlbiBkdXBsaWNhdGVkXG4gICAqIEBwYXJhbSB7Q01JQXJyYXl9IGNvcnJlY3RfcmVzcG9uc2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnRfaW5kZXhcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgY2hlY2tEdXBsaWNhdGVkUGF0dGVybiA9IChjb3JyZWN0X3Jlc3BvbnNlLCBjdXJyZW50X2luZGV4LCB2YWx1ZSkgPT4ge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvdW50ID0gY29ycmVjdF9yZXNwb25zZS5fY291bnQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudCAmJiAhZm91bmQ7IGkrKykge1xuICAgICAgaWYgKGkgIT09IGN1cnJlbnRfaW5kZXggJiYgY29ycmVjdF9yZXNwb25zZS5jaGlsZEFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGZvciBhIHZhbGlkIGNvcnJlY3RfcmVzcG9uc2UgdmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGludGVyYWN0aW9uX3R5cGVcbiAgICogQHBhcmFtIHtBcnJheX0gbm9kZXNcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgY2hlY2tDb3JyZWN0UmVzcG9uc2VWYWx1ZShpbnRlcmFjdGlvbl90eXBlLCBub2RlcywgdmFsdWUpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGNvcnJlY3RfcmVzcG9uc2VzW2ludGVyYWN0aW9uX3R5cGVdO1xuICAgIGNvbnN0IGZvcm1hdFJlZ2V4ID0gbmV3IFJlZ0V4cChyZXNwb25zZS5mb3JtYXQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoICYmIHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMDsgaSsrKSB7XG4gICAgICBpZiAoaW50ZXJhY3Rpb25fdHlwZS5tYXRjaChcbiAgICAgICAgICAnXihmaWxsLWlufGxvbmctZmlsbC1pbnxtYXRjaGluZ3xwZXJmb3JtYW5jZXxzZXF1ZW5jaW5nKSQnKSkge1xuICAgICAgICBub2Rlc1tpXSA9IHRoaXMucmVtb3ZlQ29ycmVjdFJlc3BvbnNlUHJlZml4ZXMobm9kZXNbaV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2UuZGVsaW1pdGVyMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IG5vZGVzW2ldLnNwbGl0KHJlc3BvbnNlLmRlbGltaXRlcjIpO1xuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZXNbMF0ubWF0Y2goZm9ybWF0UmVnZXgpO1xuICAgICAgICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlc1sxXS5tYXRjaChuZXcgUmVnRXhwKHJlc3BvbnNlLmZvcm1hdDIpKSkge1xuICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IG5vZGVzW2ldLm1hdGNoKGZvcm1hdFJlZ2V4KTtcbiAgICAgICAgaWYgKCghbWF0Y2hlcyAmJiB2YWx1ZSAhPT0gJycpIHx8XG4gICAgICAgICAgICAoIW1hdGNoZXMgJiYgaW50ZXJhY3Rpb25fdHlwZSA9PT0gJ3RydWUtZmFsc2UnKSkge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaW50ZXJhY3Rpb25fdHlwZSA9PT0gJ251bWVyaWMnICYmIG5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGlmIChOdW1iZXIobm9kZXNbMF0pID4gTnVtYmVyKG5vZGVzWzFdKSkge1xuICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChub2Rlc1tpXSAhPT0gJycgJiYgcmVzcG9uc2UudW5pcXVlKSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaSAmJiB0aGlzLmxhc3RFcnJvckNvZGUgPT09IDA7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChub2Rlc1tpXSA9PT0gbm9kZXNbal0pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHByZWZpeGVzIGZyb20gY29ycmVjdF9yZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm9kZVxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgcmVtb3ZlQ29ycmVjdFJlc3BvbnNlUHJlZml4ZXMobm9kZSkge1xuICAgIGxldCBzZWVuT3JkZXIgPSBmYWxzZTtcbiAgICBsZXQgc2VlbkNhc2UgPSBmYWxzZTtcbiAgICBsZXQgc2VlbkxhbmcgPSBmYWxzZTtcblxuICAgIGNvbnN0IHByZWZpeFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgJ14oeyhsYW5nfGNhc2VfbWF0dGVyc3xvcmRlcl9tYXR0ZXJzKT0oW159XSspfSknKTtcbiAgICBsZXQgbWF0Y2hlcyA9IG5vZGUubWF0Y2gocHJlZml4UmVnZXgpO1xuICAgIGxldCBsYW5nTWF0Y2hlcyA9IG51bGw7XG4gICAgd2hpbGUgKG1hdGNoZXMpIHtcbiAgICAgIHN3aXRjaCAobWF0Y2hlc1syXSkge1xuICAgICAgICBjYXNlICdsYW5nJzpcbiAgICAgICAgICBsYW5nTWF0Y2hlcyA9IG5vZGUubWF0Y2goc2Nvcm0yMDA0X3JlZ2V4LkNNSUxhbmdjcik7XG4gICAgICAgICAgaWYgKGxhbmdNYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBsYW5nID0gbGFuZ01hdGNoZXNbM107XG4gICAgICAgICAgICBpZiAobGFuZyAhPT0gdW5kZWZpbmVkICYmIGxhbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBpZiAodmFsaWRfbGFuZ3VhZ2VzW2xhbmcudG9Mb3dlckNhc2UoKV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWVuTGFuZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Nhc2VfbWF0dGVycyc6XG4gICAgICAgICAgaWYgKCFzZWVuTGFuZyAmJiAhc2Vlbk9yZGVyICYmICFzZWVuQ2FzZSkge1xuICAgICAgICAgICAgaWYgKG1hdGNoZXNbM10gIT09ICd0cnVlJyAmJiBtYXRjaGVzWzNdICE9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWVuQ2FzZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29yZGVyX21hdHRlcnMnOlxuICAgICAgICAgIGlmICghc2VlbkNhc2UgJiYgIXNlZW5MYW5nICYmICFzZWVuT3JkZXIpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzNdICE9PSAndHJ1ZScgJiYgbWF0Y2hlc1szXSAhPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2Vlbk9yZGVyID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnN1YnN0cihtYXRjaGVzWzFdLmxlbmd0aCk7XG4gICAgICBtYXRjaGVzID0gbm9kZS5tYXRjaChwcmVmaXhSZWdleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgd2hvbGUgQVBJIHdpdGggYW5vdGhlclxuICAgKiBAcGFyYW0ge1Njb3JtMjAwNEFQSX0gbmV3QVBJXG4gICAqL1xuICByZXBsYWNlV2l0aEFub3RoZXJTY29ybUFQSShuZXdBUEkpIHtcbiAgICAvLyBEYXRhIE1vZGVsXG4gICAgdGhpcy5jbWkgPSBuZXdBUEkuY21pO1xuICAgIHRoaXMuYWRsID0gbmV3QVBJLmFkbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNtaSBvYmplY3QgdG8gdGhlIHByb3BlciBmb3JtYXQgZm9yIExNUyBjb21taXRcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7b2JqZWN0fEFycmF5fVxuICAgKi9cbiAgcmVuZGVyQ29tbWl0Q01JKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNtaUV4cG9ydCA9IHRoaXMucmVuZGVyQ01JVG9KU09OT2JqZWN0KCk7XG5cbiAgICBpZiAodGVybWluYXRlQ29tbWl0KSB7XG4gICAgICBjbWlFeHBvcnQuY21pLnRvdGFsX3RpbWUgPSB0aGlzLmNtaS5nZXRDdXJyZW50VG90YWxUaW1lKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgZmxhdHRlbmVkID0gVXRpbGl0aWVzLmZsYXR0ZW4oY21pRXhwb3J0KTtcbiAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MuZGF0YUNvbW1pdEZvcm1hdCkge1xuICAgICAgY2FzZSAnZmxhdHRlbmVkJzpcbiAgICAgICAgcmV0dXJuIFV0aWxpdGllcy5mbGF0dGVuKGNtaUV4cG9ydCk7XG4gICAgICBjYXNlICdwYXJhbXMnOlxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gaW4gZmxhdHRlbmVkKSB7XG4gICAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoZmxhdHRlbmVkLCBpdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYCR7aXRlbX09JHtmbGF0dGVuZWRbaXRlbV19YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjbWlFeHBvcnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHN0b3JlIHRoZSBkYXRhIHRvIHRoZSBMTVNcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc3RvcmVEYXRhKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGlmICh0ZXJtaW5hdGVDb21taXQpIHtcbiAgICAgIGlmICh0aGlzLmNtaS5tb2RlID09PSAnbm9ybWFsJykge1xuICAgICAgICBpZiAodGhpcy5jbWkuY3JlZGl0ID09PSAnY3JlZGl0Jykge1xuICAgICAgICAgIGlmICh0aGlzLmNtaS5jb21wbGV0aW9uX3RocmVzaG9sZCAmJiB0aGlzLmNtaS5wcm9ncmVzc19tZWFzdXJlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbWkucHJvZ3Jlc3NfbWVhc3VyZSA+PSB0aGlzLmNtaS5jb21wbGV0aW9uX3RocmVzaG9sZCkge1xuICAgICAgICAgICAgICB0aGlzLmNtaS5jb21wbGV0aW9uX3N0YXR1cyA9ICdjb21wbGV0ZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29tcGxldGlvbl9zdGF0dXMgPSAnaW5jb21wbGV0ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNtaS5zY2FsZWRfcGFzc2luZ19zY29yZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICB0aGlzLmNtaS5zY29yZS5zY2FsZWQgIT09ICcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbWkuc2NvcmUuc2NhbGVkID49IHRoaXMuY21pLnNjYWxlZF9wYXNzaW5nX3Njb3JlKSB7XG4gICAgICAgICAgICAgIHRoaXMuY21pLnN1Y2Nlc3Nfc3RhdHVzID0gJ3Bhc3NlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNtaS5zdWNjZXNzX3N0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBuYXZSZXF1ZXN0ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuYWRsLm5hdi5yZXF1ZXN0ICE9PSAodGhpcy5zdGFydGluZ0RhdGE/LmFkbD8ubmF2Py5yZXF1ZXN0KSAmJlxuICAgICAgICB0aGlzLmFkbC5uYXYucmVxdWVzdCAhPT0gJ19ub25lXycpIHtcbiAgICAgIHRoaXMuYWRsLm5hdi5yZXF1ZXN0ID0gZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWRsLm5hdi5yZXF1ZXN0KTtcbiAgICAgIG5hdlJlcXVlc3QgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1pdE9iamVjdCA9IHRoaXMucmVuZGVyQ29tbWl0Q01JKHRlcm1pbmF0ZUNvbW1pdCk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5sbXNDb21taXRVcmwpIHtcbiAgICAgIGlmICh0aGlzLmFwaUxvZ0xldmVsID09PSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRykge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdDb21taXQgKHRlcm1pbmF0ZWQ6ICcgK1xuICAgICAgICAgICAgKHRlcm1pbmF0ZUNvbW1pdCA/ICd5ZXMnIDogJ25vJykgKyAnKTogJyk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoY29tbWl0T2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvY2Vzc0h0dHBSZXF1ZXN0KHRoaXMuc2V0dGluZ3MubG1zQ29tbWl0VXJsLFxuICAgICAgICAgIGNvbW1pdE9iamVjdCk7XG4gICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIGEgc2VxdWVuY2luZyBjYWxsLCBhbmQgdGhlbiBjYWxsIHRoZSBuZWNlc3NhcnkgSlNcbiAgICAgIGlmIChuYXZSZXF1ZXN0ICYmIHJlc3VsdC5uYXZSZXF1ZXN0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICByZXN1bHQubmF2UmVxdWVzdCAhPT0gJycpIHtcbiAgICAgICAgRnVuY3Rpb24oYFwidXNlIHN0cmljdFwiOygoKSA9PiB7ICR7cmVzdWx0Lm5hdlJlcXVlc3R9IH0pKClgKSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ0NvbW1pdCAodGVybWluYXRlZDogJyArXG4gICAgICAgICAgKHRlcm1pbmF0ZUNvbW1pdCA/ICd5ZXMnIDogJ25vJykgKyAnKTogJyk7XG4gICAgICBjb25zb2xlLmxvZyhjb21taXRPYmplY3QpO1xuICAgICAgcmV0dXJuIGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFNjb3JtMTJDTUkgZnJvbSAnLi9zY29ybTEyX2NtaSc7XG5pbXBvcnQge0Jhc2VDTUksIENNSUFycmF5LCBDTUlTY29yZX0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHthaWNjX2NvbnN0YW50c30gZnJvbSAnLi4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IHthaWNjX3JlZ2V4fSBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuaW1wb3J0IHtzY29ybTEyX2Vycm9yX2NvZGVzfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IHtcbiAgY2hlY2sxMlZhbGlkRm9ybWF0LFxuICB0aHJvd1JlYWRPbmx5RXJyb3IsXG4gIHRocm93V3JpdGVPbmx5RXJyb3IsXG59IGZyb20gJy4vc2Nvcm0xMl9jbWknO1xuXG5jb25zdCBjb25zdGFudHMgPSBhaWNjX2NvbnN0YW50cztcbmNvbnN0IHJlZ2V4ID0gYWljY19yZWdleDtcblxuLyoqXG4gKiBDTUkgQ2xhc3MgZm9yIEFJQ0NcbiAqL1xuZXhwb3J0IGNsYXNzIENNSSBleHRlbmRzIFNjb3JtMTJDTUkuQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIENNSSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0aWFsaXplZFxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcihjb25zdGFudHMuY21pX2NoaWxkcmVuKTtcblxuICAgIGlmIChpbml0aWFsaXplZCkgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICB0aGlzLnN0dWRlbnRfZGF0YSA9IG5ldyBBSUNDQ01JU3R1ZGVudERhdGEoKTtcbiAgICB0aGlzLmV2YWx1YXRpb24gPSBuZXcgQ01JRXZhbHVhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnN0dWRlbnRfZGF0YT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuZXZhbHVhdGlvbj8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgc3VzcGVuZF9kYXRhOiBzdHJpbmcsXG4gICAqICAgICAgbGF1bmNoX2RhdGE6IHN0cmluZyxcbiAgICogICAgICBjb21tZW50czogc3RyaW5nLFxuICAgKiAgICAgIGNvbW1lbnRzX2Zyb21fbG1zOiBzdHJpbmcsXG4gICAqICAgICAgY29yZTogQ01JQ29yZSxcbiAgICogICAgICBvYmplY3RpdmVzOiBDTUlPYmplY3RpdmVzLFxuICAgKiAgICAgIHN0dWRlbnRfZGF0YTogQ01JU3R1ZGVudERhdGEsXG4gICAqICAgICAgc3R1ZGVudF9wcmVmZXJlbmNlOiBDTUlTdHVkZW50UHJlZmVyZW5jZSxcbiAgICogICAgICBpbnRlcmFjdGlvbnM6IENNSUludGVyYWN0aW9uc1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnc3VzcGVuZF9kYXRhJzogdGhpcy5zdXNwZW5kX2RhdGEsXG4gICAgICAnbGF1bmNoX2RhdGEnOiB0aGlzLmxhdW5jaF9kYXRhLFxuICAgICAgJ2NvbW1lbnRzJzogdGhpcy5jb21tZW50cyxcbiAgICAgICdjb21tZW50c19mcm9tX2xtcyc6IHRoaXMuY29tbWVudHNfZnJvbV9sbXMsXG4gICAgICAnY29yZSc6IHRoaXMuY29yZSxcbiAgICAgICdvYmplY3RpdmVzJzogdGhpcy5vYmplY3RpdmVzLFxuICAgICAgJ3N0dWRlbnRfZGF0YSc6IHRoaXMuc3R1ZGVudF9kYXRhLFxuICAgICAgJ3N0dWRlbnRfcHJlZmVyZW5jZSc6IHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlLFxuICAgICAgJ2ludGVyYWN0aW9ucyc6IHRoaXMuaW50ZXJhY3Rpb25zLFxuICAgICAgJ2V2YWx1YXRpb24nOiB0aGlzLmV2YWx1YXRpb24sXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBSUNDIEV2YWx1YXRpb24gb2JqZWN0XG4gKi9cbmNsYXNzIENNSUV2YWx1YXRpb24gZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIEV2YWx1YXRpb24gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb21tZW50cyA9IG5ldyBDTUlFdmFsdWF0aW9uQ29tbWVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb21tZW50cz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmV2YWx1YXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm4ge3tjb21tZW50czogQ01JRXZhbHVhdGlvbkNvbW1lbnRzfX1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdjb21tZW50cyc6IHRoaXMuY29tbWVudHMsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgQUlDQydzIGNtaS5ldmFsdWF0aW9uLmNvbW1lbnRzIG9iamVjdFxuICovXG5jbGFzcyBDTUlFdmFsdWF0aW9uQ29tbWVudHMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQUlDQyBFdmFsdWF0aW9uIENvbW1lbnRzIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoY29uc3RhbnRzLmNvbW1lbnRzX2NoaWxkcmVuLFxuICAgICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0dWRlbnREYXRhIGNsYXNzIGZvciBBSUNDXG4gKi9cbmNsYXNzIEFJQ0NDTUlTdHVkZW50RGF0YSBleHRlbmRzIFNjb3JtMTJDTUkuQ01JU3R1ZGVudERhdGEge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgU3R1ZGVudERhdGEgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihjb25zdGFudHMuc3R1ZGVudF9kYXRhX2NoaWxkcmVuKTtcblxuICAgIHRoaXMudHJpZXMgPSBuZXcgQ01JVHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy50cmllcz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI3RyaWVzX2R1cmluZ19sZXNzb24gPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciB0cmllc19kdXJpbmdfbGVzc29uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0cmllc19kdXJpbmdfbGVzc29uKCkge1xuICAgIHJldHVybiB0aGlzLiN0cmllc19kdXJpbmdfbGVzc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RyaWVzX2R1cmluZ19sZXNzb24uIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmllc19kdXJpbmdfbGVzc29uXG4gICAqL1xuICBzZXQgdHJpZXNfZHVyaW5nX2xlc3Nvbih0cmllc19kdXJpbmdfbGVzc29uKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiN0cmllc19kdXJpbmdfbGVzc29uID0gdHJpZXNfZHVyaW5nX2xlc3NvbiA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLnN0dWRlbnRfZGF0YSBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBtYXN0ZXJ5X3Njb3JlOiBzdHJpbmcsXG4gICAqICAgICAgbWF4X3RpbWVfYWxsb3dlZDogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVfbGltaXRfYWN0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgdHJpZXM6IENNSVRyaWVzXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdtYXN0ZXJ5X3Njb3JlJzogdGhpcy5tYXN0ZXJ5X3Njb3JlLFxuICAgICAgJ21heF90aW1lX2FsbG93ZWQnOiB0aGlzLm1heF90aW1lX2FsbG93ZWQsXG4gICAgICAndGltZV9saW1pdF9hY3Rpb24nOiB0aGlzLnRpbWVfbGltaXRfYWN0aW9uLFxuICAgICAgJ3RyaWVzJzogdGhpcy50cmllcyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgQUlDQyBjbWkuc3R1ZGVudF9kYXRhLnRyaWVzIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JVHJpZXMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgaW5saW5lIFRyaWVzIEFycmF5IGNsYXNzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihhaWNjX2NvbnN0YW50cy50cmllc19jaGlsZHJlbik7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgQUlDQyBUcmllc1xuICovXG5leHBvcnQgY2xhc3MgQ01JVHJpZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIFRyaWVzIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc2NvcmUgPSBuZXcgQ01JU2NvcmUoXG4gICAgICAgIHtcbiAgICAgICAgICBzY29yZV9jaGlsZHJlbjogY29uc3RhbnRzLnNjb3JlX2NoaWxkcmVuLFxuICAgICAgICAgIHNjb3JlX3JhbmdlOiByZWdleC5zY29yZV9yYW5nZSxcbiAgICAgICAgICBpbnZhbGlkRXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgICAgIGludmFsaWRUeXBlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zY29yZT8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI3N0YXR1cyA9ICcnO1xuICAjdGltZSA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdGF0dXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzXG4gICAqL1xuICBzZXQgc3RhdHVzKHN0YXR1cykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc3RhdHVzLCByZWdleC5DTUlTdGF0dXMyKSkge1xuICAgICAgdGhpcy4jc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHNldCB0aW1lKHRpbWUpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHRpbWUsIHJlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICB0aGlzLiN0aW1lID0gdGltZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuc3R1ZGVudF9kYXRhLnRyaWVzLm4gb2JqZWN0XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgdGltZTogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBDTUlTY29yZVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnc3RhdHVzJzogdGhpcy5zdGF0dXMsXG4gICAgICAndGltZSc6IHRoaXMudGltZSxcbiAgICAgICdzY29yZSc6IHRoaXMuc2NvcmUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgQUlDQyBFdmFsdWF0aW9uIENvbW1lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlFdmFsdWF0aW9uQ29tbWVudHNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBFdmFsdWF0aW9uIENvbW1lbnRzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgI2NvbnRlbnQgPSAnJztcbiAgI2xvY2F0aW9uID0gJyc7XG4gICN0aW1lID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbnRlbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29udGVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKi9cbiAgc2V0IGNvbnRlbnQoY29udGVudCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoY29udGVudCwgcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jY29udGVudCA9IGNvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xvY2F0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbG9jYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gICAqL1xuICBzZXQgbG9jYXRpb24obG9jYXRpb24pIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGxvY2F0aW9uLCByZWdleC5DTUlTdHJpbmcyNTYpKSB7XG4gICAgICB0aGlzLiNsb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgZm9yICN0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lXG4gICAqL1xuICBzZXQgdGltZSh0aW1lKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdCh0aW1lLCByZWdleC5DTUlUaW1lKSkge1xuICAgICAgdGhpcy4jdGltZSA9IHRpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmV2YXVsYXRpb24uY29tbWVudHMubiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBjb250ZW50OiBzdHJpbmcsXG4gICAqICAgICAgbG9jYXRpb246IHN0cmluZyxcbiAgICogICAgICB0aW1lOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2NvbnRlbnQnOiB0aGlzLmNvbnRlbnQsXG4gICAgICAnbG9jYXRpb24nOiB0aGlzLmxvY2F0aW9uLFxuICAgICAgJ3RpbWUnOiB0aGlzLnRpbWUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge3Njb3JtMTJfY29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQge3Njb3JtMTJfZXJyb3JfY29kZXN9IGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcn0gZnJvbSAnLi4vZXhjZXB0aW9ucyc7XG5pbXBvcnQge3Njb3JtMTJfcmVnZXh9IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIHByb3BlciBmb3JtYXQuIElmIG5vdCwgdGhyb3cgcHJvcGVyIGVycm9yIGNvZGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnZXhQYXR0ZXJuXG4gKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RW1wdHlTdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1ZhbGlkRm9ybWF0KFxuICAgIHZhbHVlOiBTdHJpbmcsXG4gICAgcmVnZXhQYXR0ZXJuOiBTdHJpbmcsXG4gICAgZXJyb3JDb2RlOiBudW1iZXIsXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW4pIHtcbiAgY29uc3QgZm9ybWF0UmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4UGF0dGVybik7XG4gIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZS5tYXRjaChmb3JtYXRSZWdleCk7XG4gIGlmIChhbGxvd0VtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFtYXRjaGVzIHx8IG1hdGNoZXNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvckNvZGUpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBwcm9wZXIgcmFuZ2UuIElmIG5vdCwgdGhyb3cgcHJvcGVyIGVycm9yIGNvZGUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJhbmdlUGF0dGVyblxuICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmFsaWRSYW5nZShcbiAgICB2YWx1ZTogYW55LCByYW5nZVBhdHRlcm46IFN0cmluZywgZXJyb3JDb2RlOiBudW1iZXIpIHtcbiAgY29uc3QgcmFuZ2VzID0gcmFuZ2VQYXR0ZXJuLnNwbGl0KCcjJyk7XG4gIHZhbHVlID0gdmFsdWUgKiAxLjA7XG4gIGlmICh2YWx1ZSA+PSByYW5nZXNbMF0pIHtcbiAgICBpZiAoKHJhbmdlc1sxXSA9PT0gJyonKSB8fCAodmFsdWUgPD0gcmFuZ2VzWzFdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JDb2RlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvckNvZGUpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQVBJIGNtaSBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQ01JIHtcbiAganNvblN0cmluZyA9IGZhbHNlO1xuICAjaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEJhc2VDTUksIGp1c3QgbWFya3MgdGhlIGNsYXNzIGFzIGFic3RyYWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAobmV3LnRhcmdldCA9PT0gQmFzZUNNSSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBCYXNlQ01JIGluc3RhbmNlcyBkaXJlY3RseScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpbml0aWFsaXplZFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGluaXRpYWxpemVkKCkge1xuICAgIHJldHVybiB0aGlzLiNpbml0aWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLiNpbml0aWFsaXplZCA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjbWkgKi5zY29yZSBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlTY29yZSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yICouc2NvcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjb3JlX2NoaWxkcmVuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY29yZV9yYW5nZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnZhbGlkRXJyb3JDb2RlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnZhbGlkVHlwZUNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludmFsaWRSYW5nZUNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2ltYWxSZWdleFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgICB7XG4gICAgICAgIHNjb3JlX2NoaWxkcmVuLFxuICAgICAgICBzY29yZV9yYW5nZSxcbiAgICAgICAgbWF4LFxuICAgICAgICBpbnZhbGlkRXJyb3JDb2RlLFxuICAgICAgICBpbnZhbGlkVHlwZUNvZGUsXG4gICAgICAgIGludmFsaWRSYW5nZUNvZGUsXG4gICAgICAgIGRlY2ltYWxSZWdleCxcbiAgICAgIH0pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy4jX2NoaWxkcmVuID0gc2NvcmVfY2hpbGRyZW4gfHxcbiAgICAgICAgc2Nvcm0xMl9jb25zdGFudHMuc2NvcmVfY2hpbGRyZW47XG4gICAgdGhpcy4jX3Njb3JlX3JhbmdlID0gIXNjb3JlX3JhbmdlID8gZmFsc2UgOiBzY29ybTEyX3JlZ2V4LnNjb3JlX3JhbmdlO1xuICAgIHRoaXMuI21heCA9IChtYXggfHwgbWF4ID09PSAnJykgPyBtYXggOiAnMTAwJztcbiAgICB0aGlzLiNfaW52YWxpZF9lcnJvcl9jb2RlID0gaW52YWxpZEVycm9yQ29kZSB8fFxuICAgICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFO1xuICAgIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSA9IGludmFsaWRUeXBlQ29kZSB8fFxuICAgICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0g7XG4gICAgdGhpcy4jX2ludmFsaWRfcmFuZ2VfY29kZSA9IGludmFsaWRSYW5nZUNvZGUgfHxcbiAgICAgICAgc2Nvcm0xMl9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0U7XG4gICAgdGhpcy4jX2RlY2ltYWxfcmVnZXggPSBkZWNpbWFsUmVnZXggfHxcbiAgICAgICAgc2Nvcm0xMl9yZWdleC5DTUlEZWNpbWFsO1xuICB9XG5cbiAgI19jaGlsZHJlbjtcbiAgI19zY29yZV9yYW5nZTtcbiAgI19pbnZhbGlkX2Vycm9yX2NvZGU7XG4gICNfaW52YWxpZF90eXBlX2NvZGU7XG4gICNfaW52YWxpZF9yYW5nZV9jb2RlO1xuICAjX2RlY2ltYWxfcmVnZXg7XG4gICNyYXcgPSAnJztcbiAgI21pbiA9ICcnO1xuICAjbWF4O1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIF9jaGlsZHJlblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciBfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodGhpcy4jX2ludmFsaWRfZXJyb3JfY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcmF3XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCByYXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JhdztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNyYXdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1xuICAgKi9cbiAgc2V0IHJhdyhyYXcpIHtcbiAgICBpZiAoY2hlY2tWYWxpZEZvcm1hdChyYXcsIHRoaXMuI19kZWNpbWFsX3JlZ2V4LFxuICAgICAgICB0aGlzLiNfaW52YWxpZF90eXBlX2NvZGUpICYmXG4gICAgICAgICghdGhpcy4jX3Njb3JlX3JhbmdlIHx8XG4gICAgICAgICAgICBjaGVja1ZhbGlkUmFuZ2UocmF3LCB0aGlzLiNfc2NvcmVfcmFuZ2UsXG4gICAgICAgICAgICAgICAgdGhpcy4jX2ludmFsaWRfcmFuZ2VfY29kZSkpKSB7XG4gICAgICB0aGlzLiNyYXcgPSByYXc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21pblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWluKCkge1xuICAgIHJldHVybiB0aGlzLiNtaW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWluXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtaW5cbiAgICovXG4gIHNldCBtaW4obWluKSB7XG4gICAgaWYgKGNoZWNrVmFsaWRGb3JtYXQobWluLCB0aGlzLiNfZGVjaW1hbF9yZWdleCxcbiAgICAgICAgdGhpcy4jX2ludmFsaWRfdHlwZV9jb2RlKSAmJlxuICAgICAgICAoIXRoaXMuI19zY29yZV9yYW5nZSB8fFxuICAgICAgICAgICAgY2hlY2tWYWxpZFJhbmdlKG1pbiwgdGhpcy4jX3Njb3JlX3JhbmdlLFxuICAgICAgICAgICAgICAgIHRoaXMuI19pbnZhbGlkX3JhbmdlX2NvZGUpKSkge1xuICAgICAgdGhpcy4jbWluID0gbWluO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtYXhcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1heCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21heFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4XG4gICAqL1xuICBzZXQgbWF4KG1heCkge1xuICAgIGlmIChjaGVja1ZhbGlkRm9ybWF0KG1heCwgdGhpcy4jX2RlY2ltYWxfcmVnZXgsXG4gICAgICAgIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSkgJiZcbiAgICAgICAgKCF0aGlzLiNfc2NvcmVfcmFuZ2UgfHxcbiAgICAgICAgICAgIGNoZWNrVmFsaWRSYW5nZShtYXgsIHRoaXMuI19zY29yZV9yYW5nZSxcbiAgICAgICAgICAgICAgICB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlKSkpIHtcbiAgICAgIHRoaXMuI21heCA9IG1heDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciAqLnNjb3JlXG4gICAqIEByZXR1cm4ge3ttaW46IHN0cmluZywgbWF4OiBzdHJpbmcsIHJhdzogc3RyaW5nfX1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdyYXcnOiB0aGlzLnJhdyxcbiAgICAgICdtaW4nOiB0aGlzLm1pbixcbiAgICAgICdtYXgnOiB0aGlzLm1heCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNtaSAqLm4gb2JqZWN0c1xuICovXG5leHBvcnQgY2xhc3MgQ01JQXJyYXkgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGNtaSAqLm4gYXJyYXlzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZHJlblxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2hpbGRyZW4sIGVycm9yQ29kZX0pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI19jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIHRoaXMuI2Vycm9yQ29kZSA9IGVycm9yQ29kZTtcbiAgICB0aGlzLmNoaWxkQXJyYXkgPSBbXTtcbiAgfVxuXG4gICNlcnJvckNvZGU7XG4gICNfY2hpbGRyZW47XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgX2NoaWxkcmVuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciBfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodGhpcy4jZXJyb3JDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIF9jb3VudFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgX2NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkQXJyYXkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgX2NvdW50LiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IF9jb3VudFxuICAgKi9cbiAgc2V0IF9jb3VudChfY291bnQpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHRoaXMuI2Vycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciAqLm4gYXJyYXlzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaSArICcnXSA9IHRoaXMuY2hpbGRBcnJheVtpXTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtcbiAgQmFzZUNNSSxcbiAgY2hlY2tWYWxpZEZvcm1hdCxcbiAgY2hlY2tWYWxpZFJhbmdlLFxuICBDTUlBcnJheSxcbiAgQ01JU2NvcmUsXG59IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7c2Nvcm0xMl9jb25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCB7c2Nvcm0xMl9lcnJvcl9jb2Rlc30gZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCB7c2Nvcm0xMl9yZWdleH0gZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yfSBmcm9tICcuLi9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIFV0aWxpdGllcyBmcm9tICcuLi91dGlsaXRpZXMnO1xuXG5jb25zdCBjb25zdGFudHMgPSBzY29ybTEyX2NvbnN0YW50cztcbmNvbnN0IHJlZ2V4ID0gc2Nvcm0xMl9yZWdleDtcblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBSZWFkIE9ubHkgZXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm93UmVhZE9ubHlFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihzY29ybTEyX2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5UKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBXcml0ZSBPbmx5IGVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd1dyaXRlT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuV1JJVEVfT05MWV9FTEVNRU5UKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBJbnZhbGlkIFNldCBlcnJvclxuICovXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCkge1xuICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QsIG5vIHJlYXNvbiB0byBoYXZlIHRvIHBhc3MgdGhlIHNhbWUgZXJyb3IgY29kZXMgZXZlcnkgdGltZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4UGF0dGVyblxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0VtcHR5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2sxMlZhbGlkRm9ybWF0KFxuICAgIHZhbHVlOiBTdHJpbmcsXG4gICAgcmVnZXhQYXR0ZXJuOiBTdHJpbmcsXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGNoZWNrVmFsaWRGb3JtYXQodmFsdWUsIHJlZ2V4UGF0dGVybixcbiAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCwgYWxsb3dFbXB0eVN0cmluZyk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCwgbm8gcmVhc29uIHRvIGhhdmUgdG8gcGFzcyB0aGUgc2FtZSBlcnJvciBjb2RlcyBldmVyeSB0aW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmFuZ2VQYXR0ZXJuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RW1wdHlTdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVjazEyVmFsaWRSYW5nZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHJhbmdlUGF0dGVybjogU3RyaW5nLFxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuKSB7XG4gIHJldHVybiBjaGVja1ZhbGlkUmFuZ2UodmFsdWUsIHJhbmdlUGF0dGVybixcbiAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLCBhbGxvd0VtcHR5U3RyaW5nKTtcbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgdGhlIGNtaSBvYmplY3QgZm9yIFNDT1JNIDEuMlxuICovXG5leHBvcnQgY2xhc3MgQ01JIGV4dGVuZHMgQmFzZUNNSSB7XG4gICNfY2hpbGRyZW4gPSAnJztcbiAgI192ZXJzaW9uID0gJzMuNCc7XG4gICNzdXNwZW5kX2RhdGEgPSAnJztcbiAgI2xhdW5jaF9kYXRhID0gJyc7XG4gICNjb21tZW50cyA9ICcnO1xuICAjY29tbWVudHNfZnJvbV9sbXMgPSAnJztcblxuICBzdHVkZW50X2RhdGEgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFNDT1JNIDEuMiBjbWkgb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWlfY2hpbGRyZW5cbiAgICogQHBhcmFtIHsoQ01JU3R1ZGVudERhdGF8QUlDQ0NNSVN0dWRlbnREYXRhKX0gc3R1ZGVudF9kYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdGlhbGl6ZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNtaV9jaGlsZHJlbiwgc3R1ZGVudF9kYXRhLCBpbml0aWFsaXplZDogYm9vbGVhbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgdGhpcy4jX2NoaWxkcmVuID0gY21pX2NoaWxkcmVuID8gY21pX2NoaWxkcmVuIDogY29uc3RhbnRzLmNtaV9jaGlsZHJlbjtcbiAgICB0aGlzLmNvcmUgPSBuZXcgQ01JQ29yZSgpO1xuICAgIHRoaXMub2JqZWN0aXZlcyA9IG5ldyBDTUlPYmplY3RpdmVzKCk7XG4gICAgdGhpcy5zdHVkZW50X2RhdGEgPSBzdHVkZW50X2RhdGEgPyBzdHVkZW50X2RhdGEgOiBuZXcgQ01JU3R1ZGVudERhdGEoKTtcbiAgICB0aGlzLnN0dWRlbnRfcHJlZmVyZW5jZSA9IG5ldyBDTUlTdHVkZW50UHJlZmVyZW5jZSgpO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25zID0gbmV3IENNSUludGVyYWN0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvcmU/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLm9iamVjdGl2ZXM/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnN0dWRlbnRfZGF0YT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbnM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHN1c3BlbmRfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIGxhdW5jaF9kYXRhOiBzdHJpbmcsXG4gICAqICAgICAgY29tbWVudHM6IHN0cmluZyxcbiAgICogICAgICBjb21tZW50c19mcm9tX2xtczogc3RyaW5nLFxuICAgKiAgICAgIGNvcmU6IENNSUNvcmUsXG4gICAqICAgICAgb2JqZWN0aXZlczogQ01JT2JqZWN0aXZlcyxcbiAgICogICAgICBzdHVkZW50X2RhdGE6IENNSVN0dWRlbnREYXRhLFxuICAgKiAgICAgIHN0dWRlbnRfcHJlZmVyZW5jZTogQ01JU3R1ZGVudFByZWZlcmVuY2UsXG4gICAqICAgICAgaW50ZXJhY3Rpb25zOiBDTUlJbnRlcmFjdGlvbnNcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3N1c3BlbmRfZGF0YSc6IHRoaXMuc3VzcGVuZF9kYXRhLFxuICAgICAgJ2xhdW5jaF9kYXRhJzogdGhpcy5sYXVuY2hfZGF0YSxcbiAgICAgICdjb21tZW50cyc6IHRoaXMuY29tbWVudHMsXG4gICAgICAnY29tbWVudHNfZnJvbV9sbXMnOiB0aGlzLmNvbW1lbnRzX2Zyb21fbG1zLFxuICAgICAgJ2NvcmUnOiB0aGlzLmNvcmUsXG4gICAgICAnb2JqZWN0aXZlcyc6IHRoaXMub2JqZWN0aXZlcyxcbiAgICAgICdzdHVkZW50X2RhdGEnOiB0aGlzLnN0dWRlbnRfZGF0YSxcbiAgICAgICdzdHVkZW50X3ByZWZlcmVuY2UnOiB0aGlzLnN0dWRlbnRfcHJlZmVyZW5jZSxcbiAgICAgICdpbnRlcmFjdGlvbnMnOiB0aGlzLmludGVyYWN0aW9ucyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfdmVyc2lvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgX3ZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI192ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI192ZXJzaW9uLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF92ZXJzaW9uXG4gICAqL1xuICBzZXQgX3ZlcnNpb24oX3ZlcnNpb24pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfdmVyc2lvbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N1c3BlbmRfZGF0YVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3VzcGVuZF9kYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNzdXNwZW5kX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdXNwZW5kX2RhdGFcbiAgICovXG4gIHNldCBzdXNwZW5kX2RhdGEoc3VzcGVuZF9kYXRhKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzdXNwZW5kX2RhdGEsIHJlZ2V4LkNNSVN0cmluZzQwOTYpKSB7XG4gICAgICB0aGlzLiNzdXNwZW5kX2RhdGEgPSBzdXNwZW5kX2RhdGE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhdW5jaF9kYXRhXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsYXVuY2hfZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGF1bmNoX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGF1bmNoX2RhdGEuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGF1bmNoX2RhdGFcbiAgICovXG4gIHNldCBsYXVuY2hfZGF0YShsYXVuY2hfZGF0YSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jbGF1bmNoX2RhdGEgPSBsYXVuY2hfZGF0YSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbW1lbnRzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21tZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tbWVudHM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tbWVudHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRzXG4gICAqL1xuICBzZXQgY29tbWVudHMoY29tbWVudHMpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGNvbW1lbnRzLCByZWdleC5DTUlTdHJpbmc0MDk2KSkge1xuICAgICAgdGhpcy4jY29tbWVudHMgPSBjb21tZW50cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29tbWVudHNfZnJvbV9sbXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbW1lbnRzX2Zyb21fbG1zKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21tZW50c19mcm9tX2xtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb21tZW50c19mcm9tX2xtcy4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50c19mcm9tX2xtc1xuICAgKi9cbiAgc2V0IGNvbW1lbnRzX2Zyb21fbG1zKGNvbW1lbnRzX2Zyb21fbG1zKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNjb21tZW50c19mcm9tX2xtcyA9IGNvbW1lbnRzX2Zyb21fbG1zIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgdG8gdGhlIGV4aXN0aW5nIHRvdGFsIHRpbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldEN1cnJlbnRUb3RhbFRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRDdXJyZW50VG90YWxUaW1lKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgdGhlIGNtaS5jb3JlIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5jbGFzcyBDTUlDb3JlIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmNvcmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNjb3JlID0gbmV3IENNSVNjb3JlKFxuICAgICAgICB7XG4gICAgICAgICAgc2NvcmVfY2hpbGRyZW46IGNvbnN0YW50cy5zY29yZV9jaGlsZHJlbixcbiAgICAgICAgICBzY29yZV9yYW5nZTogcmVnZXguc2NvcmVfcmFuZ2UsXG4gICAgICAgICAgaW52YWxpZEVycm9yQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgICAgICBpbnZhbGlkVHlwZUNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCxcbiAgICAgICAgICBpbnZhbGlkUmFuZ2VDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRSxcbiAgICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc2NvcmU/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gICNfY2hpbGRyZW4gPSBjb25zdGFudHMuY29yZV9jaGlsZHJlbjtcbiAgI3N0dWRlbnRfaWQgPSAnJztcbiAgI3N0dWRlbnRfbmFtZSA9ICcnO1xuICAjbGVzc29uX2xvY2F0aW9uID0gJyc7XG4gICNjcmVkaXQgPSAnJztcbiAgI2xlc3Nvbl9zdGF0dXMgPSAnbm90IGF0dGVtcHRlZCc7XG4gICNlbnRyeSA9ICcnO1xuICAjdG90YWxfdGltZSA9ICcnO1xuICAjbGVzc29uX21vZGUgPSAnbm9ybWFsJztcbiAgI2V4aXQgPSAnJztcbiAgI3Nlc3Npb25fdGltZSA9ICcwMDowMDowMCc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI19jaGlsZHJlblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3R1ZGVudF9pZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3R1ZGVudF9pZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3R1ZGVudF9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdHVkZW50X2lkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0dWRlbnRfaWRcbiAgICovXG4gIHNldCBzdHVkZW50X2lkKHN0dWRlbnRfaWQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI3N0dWRlbnRfaWQgPSBzdHVkZW50X2lkIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3R1ZGVudF9uYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdHVkZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0dWRlbnRfbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdHVkZW50X25hbWUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9uYW1lXG4gICAqL1xuICBzZXQgc3R1ZGVudF9uYW1lKHN0dWRlbnRfbmFtZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jc3R1ZGVudF9uYW1lID0gc3R1ZGVudF9uYW1lIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVzc29uX2xvY2F0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZXNzb25fbG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlc3Nvbl9sb2NhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZXNzb25fbG9jYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlc3Nvbl9sb2NhdGlvblxuICAgKi9cbiAgc2V0IGxlc3Nvbl9sb2NhdGlvbihsZXNzb25fbG9jYXRpb24pIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGxlc3Nvbl9sb2NhdGlvbiwgcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jbGVzc29uX2xvY2F0aW9uID0gbGVzc29uX2xvY2F0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjcmVkaXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNyZWRpdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3JlZGl0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NyZWRpdC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcmVkaXRcbiAgICovXG4gIHNldCBjcmVkaXQoY3JlZGl0KSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNjcmVkaXQgPSBjcmVkaXQgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZXNzb25fc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZXNzb25fc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNsZXNzb25fc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlc3Nvbl9zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlc3Nvbl9zdGF0dXNcbiAgICovXG4gIHNldCBsZXNzb25fc3RhdHVzKGxlc3Nvbl9zdGF0dXMpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGxlc3Nvbl9zdGF0dXMsIHJlZ2V4LkNNSVN0YXR1cykpIHtcbiAgICAgIHRoaXMuI2xlc3Nvbl9zdGF0dXMgPSBsZXNzb25fc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlbnRyeVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZW50cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2VudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2VudHJ5LiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVudHJ5XG4gICAqL1xuICBzZXQgZW50cnkoZW50cnkpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2VudHJ5ID0gZW50cnkgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0b3RhbF90aW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0b3RhbF90aW1lKCkge1xuICAgIHJldHVybiB0aGlzLiN0b3RhbF90aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RvdGFsX3RpbWUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG90YWxfdGltZVxuICAgKi9cbiAgc2V0IHRvdGFsX3RpbWUodG90YWxfdGltZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jdG90YWxfdGltZSA9IHRvdGFsX3RpbWUgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZXNzb25fbW9kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVzc29uX21vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlc3Nvbl9tb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlc3Nvbl9tb2RlLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlc3Nvbl9tb2RlXG4gICAqL1xuICBzZXQgbGVzc29uX21vZGUobGVzc29uX21vZGUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2xlc3Nvbl9tb2RlID0gbGVzc29uX21vZGUgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNleGl0LiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IGV4aXQoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI2V4aXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZXhpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhpdFxuICAgKi9cbiAgc2V0IGV4aXQoZXhpdCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoZXhpdCwgcmVnZXguQ01JRXhpdCkpIHtcbiAgICAgIHRoaXMuI2V4aXQgPSBleGl0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzZXNzaW9uX3RpbWUuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgc2Vzc2lvbl90aW1lKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNzZXNzaW9uX3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2Vzc2lvbl90aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uX3RpbWVcbiAgICovXG4gIHNldCBzZXNzaW9uX3RpbWUoc2Vzc2lvbl90aW1lKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzZXNzaW9uX3RpbWUsIHJlZ2V4LkNNSVRpbWVzcGFuKSkge1xuICAgICAgdGhpcy4jc2Vzc2lvbl90aW1lID0gc2Vzc2lvbl90aW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBjdXJyZW50IHNlc3Npb24gdGltZSB0byB0aGUgZXhpc3RpbmcgdG90YWwgdGltZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0Q3VycmVudFRvdGFsVGltZSgpIHtcbiAgICByZXR1cm4gVXRpbGl0aWVzLmFkZEhITU1TU1RpbWVTdHJpbmdzKFxuICAgICAgICB0aGlzLiN0b3RhbF90aW1lLFxuICAgICAgICB0aGlzLiNzZXNzaW9uX3RpbWUsXG4gICAgICAgIG5ldyBSZWdFeHAoc2Nvcm0xMl9yZWdleC5DTUlUaW1lc3BhbilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmNvcmVcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBzdHVkZW50X25hbWU6IHN0cmluZyxcbiAgICogICAgICBlbnRyeTogc3RyaW5nLFxuICAgKiAgICAgIGV4aXQ6IHN0cmluZyxcbiAgICogICAgICBzY29yZTogQ01JU2NvcmUsXG4gICAqICAgICAgc3R1ZGVudF9pZDogc3RyaW5nLFxuICAgKiAgICAgIGxlc3Nvbl9tb2RlOiBzdHJpbmcsXG4gICAqICAgICAgbGVzc29uX2xvY2F0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgbGVzc29uX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIGNyZWRpdDogc3RyaW5nLFxuICAgKiAgICAgIHRvdGFsX3RpbWU6IHN0cmluZyxcbiAgICogICAgICBzZXNzaW9uX3RpbWU6ICpcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3N0dWRlbnRfaWQnOiB0aGlzLnN0dWRlbnRfaWQsXG4gICAgICAnc3R1ZGVudF9uYW1lJzogdGhpcy5zdHVkZW50X25hbWUsXG4gICAgICAnbGVzc29uX2xvY2F0aW9uJzogdGhpcy5sZXNzb25fbG9jYXRpb24sXG4gICAgICAnY3JlZGl0JzogdGhpcy5jcmVkaXQsXG4gICAgICAnbGVzc29uX3N0YXR1cyc6IHRoaXMubGVzc29uX3N0YXR1cyxcbiAgICAgICdlbnRyeSc6IHRoaXMuZW50cnksXG4gICAgICAndG90YWxfdGltZSc6IHRoaXMudG90YWxfdGltZSxcbiAgICAgICdsZXNzb25fbW9kZSc6IHRoaXMubGVzc29uX21vZGUsXG4gICAgICAnZXhpdCc6IHRoaXMuZXhpdCxcbiAgICAgICdzZXNzaW9uX3RpbWUnOiB0aGlzLnNlc3Npb25fdGltZSxcbiAgICAgICdzY29yZSc6IHRoaXMuc2NvcmUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLm9iamVjdGl2ZXMgb2JqZWN0XG4gKiBAZXh0ZW5kcyBDTUlBcnJheVxuICovXG5jbGFzcyBDTUlPYmplY3RpdmVzIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5vYmplY3RpdmVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBjaGlsZHJlbjogY29uc3RhbnRzLm9iamVjdGl2ZXNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLnN0dWRlbnRfZGF0YSBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSVN0dWRlbnREYXRhIGV4dGVuZHMgQmFzZUNNSSB7XG4gICNfY2hpbGRyZW47XG4gICNtYXN0ZXJ5X3Njb3JlID0gJyc7XG4gICNtYXhfdGltZV9hbGxvd2VkID0gJyc7XG4gICN0aW1lX2xpbWl0X2FjdGlvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLnN0dWRlbnRfZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9kYXRhX2NoaWxkcmVuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzdHVkZW50X2RhdGFfY2hpbGRyZW4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy4jX2NoaWxkcmVuID0gc3R1ZGVudF9kYXRhX2NoaWxkcmVuID9cbiAgICAgICAgc3R1ZGVudF9kYXRhX2NoaWxkcmVuIDpcbiAgICAgICAgY29uc3RhbnRzLnN0dWRlbnRfZGF0YV9jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7Kn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtYXN0ZXJfc2NvcmVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1hc3Rlcnlfc2NvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21hc3Rlcnlfc2NvcmU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWFzdGVyX3Njb3JlLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hc3Rlcnlfc2NvcmVcbiAgICovXG4gIHNldCBtYXN0ZXJ5X3Njb3JlKG1hc3Rlcnlfc2NvcmUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI21hc3Rlcnlfc2NvcmUgPSBtYXN0ZXJ5X3Njb3JlIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbWF4X3RpbWVfYWxsb3dlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWF4X3RpbWVfYWxsb3dlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X3RpbWVfYWxsb3dlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtYXhfdGltZV9hbGxvd2VkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heF90aW1lX2FsbG93ZWRcbiAgICovXG4gIHNldCBtYXhfdGltZV9hbGxvd2VkKG1heF90aW1lX2FsbG93ZWQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI21heF90aW1lX2FsbG93ZWQgPSBtYXhfdGltZV9hbGxvd2VkIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZV9saW1pdF9hY3Rpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWVfbGltaXRfYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lX2xpbWl0X2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0aW1lX2xpbWl0X2FjdGlvbi4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lX2xpbWl0X2FjdGlvblxuICAgKi9cbiAgc2V0IHRpbWVfbGltaXRfYWN0aW9uKHRpbWVfbGltaXRfYWN0aW9uKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiN0aW1lX2xpbWl0X2FjdGlvbiA9IHRpbWVfbGltaXRfYWN0aW9uIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuc3R1ZGVudF9kYXRhXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgbWF4X3RpbWVfYWxsb3dlZDogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVfbGltaXRfYWN0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgbWFzdGVyeV9zY29yZTogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdtYXN0ZXJ5X3Njb3JlJzogdGhpcy5tYXN0ZXJ5X3Njb3JlLFxuICAgICAgJ21heF90aW1lX2FsbG93ZWQnOiB0aGlzLm1heF90aW1lX2FsbG93ZWQsXG4gICAgICAndGltZV9saW1pdF9hY3Rpb24nOiB0aGlzLnRpbWVfbGltaXRfYWN0aW9uLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5zdHVkZW50X3ByZWZlcmVuY2Ugb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmNsYXNzIENNSVN0dWRlbnRQcmVmZXJlbmNlIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLnN0dWRlbnRfcHJlZmVyZW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNfY2hpbGRyZW4gPSBjb25zdGFudHMuc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuO1xuICAjYXVkaW8gPSAnJztcbiAgI2xhbmd1YWdlID0gJyc7XG4gICNzcGVlZCA9ICcnO1xuICAjdGV4dCA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2F1ZGlvXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBhdWRpbygpIHtcbiAgICByZXR1cm4gdGhpcy4jYXVkaW87XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjYXVkaW9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF1ZGlvXG4gICAqL1xuICBzZXQgYXVkaW8oYXVkaW8pIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGF1ZGlvLCByZWdleC5DTUlTSW50ZWdlcikgJiZcbiAgICAgICAgY2hlY2sxMlZhbGlkUmFuZ2UoYXVkaW8sIHJlZ2V4LmF1ZGlvX3JhbmdlKSkge1xuICAgICAgdGhpcy4jYXVkaW8gPSBhdWRpbztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGFuZ3VhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhbmd1YWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNsYW5ndWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYW5ndWFnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcbiAgICovXG4gIHNldCBsYW5ndWFnZShsYW5ndWFnZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGFuZ3VhZ2UsIHJlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI2xhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NwZWVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzcGVlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3BlZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3BlZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNwZWVkXG4gICAqL1xuICBzZXQgc3BlZWQoc3BlZWQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHNwZWVkLCByZWdleC5DTUlTSW50ZWdlcikgJiZcbiAgICAgICAgY2hlY2sxMlZhbGlkUmFuZ2Uoc3BlZWQsIHJlZ2V4LnNwZWVkX3JhbmdlKSkge1xuICAgICAgdGhpcy4jc3BlZWQgPSBzcGVlZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGV4dFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqL1xuICBzZXQgdGV4dCh0ZXh0KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdCh0ZXh0LCByZWdleC5DTUlTSW50ZWdlcikgJiZcbiAgICAgICAgY2hlY2sxMlZhbGlkUmFuZ2UodGV4dCwgcmVnZXgudGV4dF9yYW5nZSkpIHtcbiAgICAgIHRoaXMuI3RleHQgPSB0ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X3ByZWZlcmVuY2VcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBhdWRpbzogc3RyaW5nLFxuICAgKiAgICAgIGxhbmd1YWdlOiBzdHJpbmcsXG4gICAqICAgICAgc3BlZWQ6IHN0cmluZyxcbiAgICogICAgICB0ZXh0OiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2F1ZGlvJzogdGhpcy5hdWRpbyxcbiAgICAgICdsYW5ndWFnZSc6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAnc3BlZWQnOiB0aGlzLnNwZWVkLFxuICAgICAgJ3RleHQnOiB0aGlzLnRleHQsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLmludGVyYWN0aW9ucyBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuY2xhc3MgQ01JSW50ZXJhY3Rpb25zIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBjb25zdGFudHMuaW50ZXJhY3Rpb25zX2NoaWxkcmVuLFxuICAgICAgZXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5pbnRlcmFjdGlvbnMubiBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMubiBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9iamVjdGl2ZXMgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgY2hpbGRyZW46IGNvbnN0YW50cy5vYmplY3RpdmVzX2NoaWxkcmVuLFxuICAgIH0pO1xuICAgIHRoaXMuY29ycmVjdF9yZXNwb25zZXMgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgY2hpbGRyZW46IGNvbnN0YW50cy5jb3JyZWN0X3Jlc3BvbnNlc19jaGlsZHJlbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI2lkID0gJyc7XG4gICN0aW1lID0gJyc7XG4gICN0eXBlID0gJyc7XG4gICN3ZWlnaHRpbmcgPSAnJztcbiAgI3N0dWRlbnRfcmVzcG9uc2UgPSAnJztcbiAgI3Jlc3VsdCA9ICcnO1xuICAjbGF0ZW5jeSA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZC4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGlkLCByZWdleC5DTUlJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCB0aW1lKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiN0aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHNldCB0aW1lKHRpbWUpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHRpbWUsIHJlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICB0aGlzLiN0aW1lID0gdGltZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdHlwZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3R5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICovXG4gIHNldCB0eXBlKHR5cGUpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHR5cGUsIHJlZ2V4LkNNSVR5cGUpKSB7XG4gICAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjd2VpZ2h0aW5nLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHdlaWdodGluZygpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID9cbiAgICAgICAgdGhyb3dXcml0ZU9ubHlFcnJvcigpIDpcbiAgICAgICAgdGhpcy4jd2VpZ2h0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3dlaWdodGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gd2VpZ2h0aW5nXG4gICAqL1xuICBzZXQgd2VpZ2h0aW5nKHdlaWdodGluZykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQod2VpZ2h0aW5nLCByZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgICBjaGVjazEyVmFsaWRSYW5nZSh3ZWlnaHRpbmcsIHJlZ2V4LndlaWdodGluZ19yYW5nZSkpIHtcbiAgICAgIHRoaXMuI3dlaWdodGluZyA9IHdlaWdodGluZztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3R1ZGVudF9yZXNwb25zZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBzdHVkZW50X3Jlc3BvbnNlKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNzdHVkZW50X3Jlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0dWRlbnRfcmVzcG9uc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0dWRlbnRfcmVzcG9uc2VcbiAgICovXG4gIHNldCBzdHVkZW50X3Jlc3BvbnNlKHN0dWRlbnRfcmVzcG9uc2UpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHN0dWRlbnRfcmVzcG9uc2UsIHJlZ2V4LkNNSUZlZWRiYWNrLCB0cnVlKSkge1xuICAgICAgdGhpcy4jc3R1ZGVudF9yZXNwb25zZSA9IHN0dWRlbnRfcmVzcG9uc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Jlc3VsdC4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCByZXN1bHQoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3Jlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNyZXN1bHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3VsdFxuICAgKi9cbiAgc2V0IHJlc3VsdChyZXN1bHQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHJlc3VsdCwgcmVnZXguQ01JUmVzdWx0KSkge1xuICAgICAgdGhpcy4jcmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYXRlbmN5LiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IGxhdGVuY3koKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI2xhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGF0ZW5jeVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0ZW5jeVxuICAgKi9cbiAgc2V0IGxhdGVuY3kobGF0ZW5jeSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGF0ZW5jeSwgcmVnZXguQ01JVGltZXNwYW4pKSB7XG4gICAgICB0aGlzLiNsYXRlbmN5ID0gbGF0ZW5jeTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLm5cbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBpZDogc3RyaW5nLFxuICAgKiAgICAgIHRpbWU6IHN0cmluZyxcbiAgICogICAgICB0eXBlOiBzdHJpbmcsXG4gICAqICAgICAgd2VpZ2h0aW5nOiBzdHJpbmcsXG4gICAqICAgICAgc3R1ZGVudF9yZXNwb25zZTogc3RyaW5nLFxuICAgKiAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgKiAgICAgIGxhdGVuY3k6IHN0cmluZyxcbiAgICogICAgICBvYmplY3RpdmVzOiBDTUlBcnJheSxcbiAgICogICAgICBjb3JyZWN0X3Jlc3BvbnNlczogQ01JQXJyYXlcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICAgICd0aW1lJzogdGhpcy50aW1lLFxuICAgICAgJ3R5cGUnOiB0aGlzLnR5cGUsXG4gICAgICAnd2VpZ2h0aW5nJzogdGhpcy53ZWlnaHRpbmcsXG4gICAgICAnc3R1ZGVudF9yZXNwb25zZSc6IHRoaXMuc3R1ZGVudF9yZXNwb25zZSxcbiAgICAgICdyZXN1bHQnOiB0aGlzLnJlc3VsdCxcbiAgICAgICdsYXRlbmN5JzogdGhpcy5sYXRlbmN5LFxuICAgICAgJ29iamVjdGl2ZXMnOiB0aGlzLm9iamVjdGl2ZXMsXG4gICAgICAnY29ycmVjdF9yZXNwb25zZXMnOiB0aGlzLmNvcnJlY3RfcmVzcG9uc2VzLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5vYmplY3RpdmVzLm4gb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlPYmplY3RpdmVzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLm9iamVjdGl2ZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc2NvcmUgPSBuZXcgQ01JU2NvcmUoXG4gICAgICAgIHtcbiAgICAgICAgICBzY29yZV9jaGlsZHJlbjogY29uc3RhbnRzLnNjb3JlX2NoaWxkcmVuLFxuICAgICAgICAgIHNjb3JlX3JhbmdlOiByZWdleC5zY29yZV9yYW5nZSxcbiAgICAgICAgICBpbnZhbGlkRXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgICAgIGludmFsaWRUeXBlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgICB9KTtcbiAgfVxuXG4gICNpZCA9ICcnO1xuICAjc3RhdHVzID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkXG4gICAqIEByZXR1cm4ge1wiXCJ9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChpZCwgcmVnZXguQ01JSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcmV0dXJuIHtcIlwifVxuICAgKi9cbiAgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzXG4gICAqL1xuICBzZXQgc3RhdHVzKHN0YXR1cykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc3RhdHVzLCByZWdleC5DTUlTdGF0dXMyKSkge1xuICAgICAgdGhpcy4jc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5vYmplY3RpdmVzLm5cbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBpZDogc3RyaW5nLFxuICAgKiAgICAgIHN0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBDTUlTY29yZVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgICAgJ3N0YXR1cyc6IHRoaXMuc3RhdHVzLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMubi5vYmplY3RpdmVzLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjaWQgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaWRcbiAgICogQHJldHVybiB7XCJcIn1cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGlkLCByZWdleC5DTUlJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5pbnRlcmFjdGlvbnMuY29ycmVjdF9yZXNwb25zZXMubiBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zLmNvcnJlY3RfcmVzcG9uc2VzLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjcGF0dGVybiA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNwYXR0ZXJuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBwYXR0ZXJuKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNwYXR0ZXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3BhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cbiAgICovXG4gIHNldCBwYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHBhdHRlcm4sIHJlZ2V4LkNNSUZlZWRiYWNrLCB0cnVlKSkge1xuICAgICAgdGhpcy4jcGF0dGVybiA9IHBhdHRlcm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmludGVyYWN0aW9ucy5jb3JyZWN0X3Jlc3BvbnNlcy5uXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgcGF0dGVybjogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdwYXR0ZXJuJzogdGhpcy5wYXR0ZXJuLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIEFJQ0MgTmF2aWdhdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIE5BViBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIE5BViBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjZXZlbnQgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZXZlbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGV2ZW50KCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNldmVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICovXG4gIHNldCBldmVudChldmVudCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoZXZlbnQsIHJlZ2V4Lk5BVkV2ZW50KSkge1xuICAgICAgdGhpcy4jZXZlbnQgPSBldmVudDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBuYXYgb2JqZWN0XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgZXZlbnQ6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnZXZlbnQnOiB0aGlzLmV2ZW50LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtcbiAgQmFzZUNNSSxcbiAgY2hlY2tWYWxpZEZvcm1hdCxcbiAgY2hlY2tWYWxpZFJhbmdlLFxuICBDTUlBcnJheSxcbiAgQ01JU2NvcmUsXG59IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7c2Nvcm0yMDA0X2NvbnN0YW50c30gZnJvbSAnLi4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IHtzY29ybTIwMDRfcmVnZXh9IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge3Njb3JtMjAwNF9lcnJvcl9jb2Rlc30gZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCB7bGVhcm5lcl9yZXNwb25zZXN9IGZyb20gJy4uL2NvbnN0YW50cy9yZXNwb25zZV9jb25zdGFudHMnO1xuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gJy4uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0ICogYXMgVXRpbCBmcm9tICcuLi91dGlsaXRpZXMnO1xuXG5jb25zdCBjb25zdGFudHMgPSBzY29ybTIwMDRfY29uc3RhbnRzO1xuY29uc3QgcmVnZXggPSBzY29ybTIwMDRfcmVnZXg7XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgUmVhZCBPbmx5IGVycm9yXG4gKi9cbmZ1bmN0aW9uIHRocm93UmVhZE9ubHlFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFdyaXRlIE9ubHkgZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dXcml0ZU9ubHlFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuV1JJVEVfT05MWV9FTEVNRU5UKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBUeXBlIE1pc21hdGNoIGVycm9yXG4gKi9cbmZ1bmN0aW9uIHRocm93VHlwZU1pc21hdGNoRXJyb3IoKSB7XG4gIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QsIG5vIHJlYXNvbiB0byBoYXZlIHRvIHBhc3MgdGhlIHNhbWUgZXJyb3IgY29kZXMgZXZlcnkgdGltZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4UGF0dGVyblxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0VtcHR5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjaGVjazIwMDRWYWxpZEZvcm1hdChcbiAgICB2YWx1ZTogU3RyaW5nLFxuICAgIHJlZ2V4UGF0dGVybjogU3RyaW5nLFxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuKSB7XG4gIHJldHVybiBjaGVja1ZhbGlkRm9ybWF0KHZhbHVlLCByZWdleFBhdHRlcm4sXG4gICAgICBzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCwgYWxsb3dFbXB0eVN0cmluZyk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCwgbm8gcmVhc29uIHRvIGhhdmUgdG8gcGFzcyB0aGUgc2FtZSBlcnJvciBjb2RlcyBldmVyeSB0aW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmFuZ2VQYXR0ZXJuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjaGVjazIwMDRWYWxpZFJhbmdlKHZhbHVlOiBhbnksIHJhbmdlUGF0dGVybjogU3RyaW5nKSB7XG4gIHJldHVybiBjaGVja1ZhbGlkUmFuZ2UodmFsdWUsIHJhbmdlUGF0dGVybixcbiAgICAgIHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UpO1xufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBjbWkgb2JqZWN0IGZvciBTQ09STSAyMDA0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUkgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciB0aGUgU0NPUk0gMjAwNCBjbWkgb2JqZWN0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdGlhbGl6ZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxpemVkOiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubGVhcm5lcl9wcmVmZXJlbmNlID0gbmV3IENNSUxlYXJuZXJQcmVmZXJlbmNlKCk7XG4gICAgdGhpcy5zY29yZSA9IG5ldyBTY29ybTIwMDRDTUlTY29yZSgpO1xuICAgIHRoaXMuY29tbWVudHNfZnJvbV9sZWFybmVyID0gbmV3IENNSUNvbW1lbnRzRnJvbUxlYXJuZXIoKTtcbiAgICB0aGlzLmNvbW1lbnRzX2Zyb21fbG1zID0gbmV3IENNSUNvbW1lbnRzRnJvbUxNUygpO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25zID0gbmV3IENNSUludGVyYWN0aW9ucygpO1xuICAgIHRoaXMub2JqZWN0aXZlcyA9IG5ldyBDTUlPYmplY3RpdmVzKCk7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI192ZXJzaW9uID0gJzEuMCc7XG4gICNfY2hpbGRyZW4gPSBjb25zdGFudHMuY21pX2NoaWxkcmVuO1xuICAjY29tcGxldGlvbl9zdGF0dXMgPSAndW5rbm93bic7XG4gICNjb21wbGV0aW9uX3RocmVzaG9sZCA9ICcnO1xuICAjY3JlZGl0ID0gJ2NyZWRpdCc7XG4gICNlbnRyeSA9ICcnO1xuICAjZXhpdCA9ICcnO1xuICAjbGF1bmNoX2RhdGEgPSAnJztcbiAgI2xlYXJuZXJfaWQgPSAnJztcbiAgI2xlYXJuZXJfbmFtZSA9ICcnO1xuICAjbG9jYXRpb24gPSAnJztcbiAgI21heF90aW1lX2FsbG93ZWQgPSAnJztcbiAgI21vZGUgPSAnbm9ybWFsJztcbiAgI3Byb2dyZXNzX21lYXN1cmUgPSAnJztcbiAgI3NjYWxlZF9wYXNzaW5nX3Njb3JlID0gJyc7XG4gICNzZXNzaW9uX3RpbWUgPSAnUFQwSDBNMFMnO1xuICAjc3VjY2Vzc19zdGF0dXMgPSAndW5rbm93bic7XG4gICNzdXNwZW5kX2RhdGEgPSAnJztcbiAgI3RpbWVfbGltaXRfYWN0aW9uID0gJ2NvbnRpbnVlLG5vIG1lc3NhZ2UnO1xuICAjdG90YWxfdGltZSA9ICcwJztcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMubGVhcm5lcl9wcmVmZXJlbmNlPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zY29yZT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29tbWVudHNfZnJvbV9sZWFybmVyPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb21tZW50c19mcm9tX2xtcz8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25zPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX3ZlcnNpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF92ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNfdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfdmVyc2lvbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfdmVyc2lvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF92ZXJzaW9uKF92ZXJzaW9uKSB7XG4gICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbXBsZXRpb25fc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21wbGV0aW9uX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcGxldGlvbl9zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tcGxldGlvbl9zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbXBsZXRpb25fc3RhdHVzXG4gICAqL1xuICBzZXQgY29tcGxldGlvbl9zdGF0dXMoY29tcGxldGlvbl9zdGF0dXMpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoY29tcGxldGlvbl9zdGF0dXMsIHJlZ2V4LkNNSUNTdGF0dXMpKSB7XG4gICAgICB0aGlzLiNjb21wbGV0aW9uX3N0YXR1cyA9IGNvbXBsZXRpb25fc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21wbGV0aW9uX3RocmVzaG9sZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29tcGxldGlvbl90aHJlc2hvbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbXBsZXRpb25fdGhyZXNob2xkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbXBsZXRpb25fdGhyZXNob2xkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbXBsZXRpb25fdGhyZXNob2xkXG4gICAqL1xuICBzZXQgY29tcGxldGlvbl90aHJlc2hvbGQoY29tcGxldGlvbl90aHJlc2hvbGQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI2NvbXBsZXRpb25fdGhyZXNob2xkID0gY29tcGxldGlvbl90aHJlc2hvbGQgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjcmVkaXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNyZWRpdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3JlZGl0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NyZWRpdC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcmVkaXRcbiAgICovXG4gIHNldCBjcmVkaXQoY3JlZGl0KSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNjcmVkaXQgPSBjcmVkaXQgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlbnRyeVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZW50cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2VudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2VudHJ5LiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVudHJ5XG4gICAqL1xuICBzZXQgZW50cnkoZW50cnkpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2VudHJ5ID0gZW50cnkgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNleGl0LiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZXhpdCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jZXhpdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNleGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleGl0XG4gICAqL1xuICBzZXQgZXhpdChleGl0KSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGV4aXQsIHJlZ2V4LkNNSUV4aXQpKSB7XG4gICAgICB0aGlzLiNleGl0ID0gZXhpdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGF1bmNoX2RhdGFcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhdW5jaF9kYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXVuY2hfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYXVuY2hfZGF0YS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYXVuY2hfZGF0YVxuICAgKi9cbiAgc2V0IGxhdW5jaF9kYXRhKGxhdW5jaF9kYXRhKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNsYXVuY2hfZGF0YSA9IGxhdW5jaF9kYXRhIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVhcm5lcl9pZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVhcm5lcl9pZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVhcm5lcl9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZWFybmVyX2lkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlYXJuZXJfaWRcbiAgICovXG4gIHNldCBsZWFybmVyX2lkKGxlYXJuZXJfaWQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2xlYXJuZXJfaWQgPSBsZWFybmVyX2lkIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVhcm5lcl9uYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZWFybmVyX25hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlYXJuZXJfbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZWFybmVyX25hbWUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVhcm5lcl9uYW1lXG4gICAqL1xuICBzZXQgbGVhcm5lcl9uYW1lKGxlYXJuZXJfbmFtZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jbGVhcm5lcl9uYW1lID0gbGVhcm5lcl9uYW1lIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNsb2NhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsb2NhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAgICovXG4gIHNldCBsb2NhdGlvbihsb2NhdGlvbikge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChsb2NhdGlvbiwgcmVnZXguQ01JU3RyaW5nMTAwMCkpIHtcbiAgICAgIHRoaXMuI2xvY2F0aW9uID0gbG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21heF90aW1lX2FsbG93ZWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1heF90aW1lX2FsbG93ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21heF90aW1lX2FsbG93ZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWF4X3RpbWVfYWxsb3dlZC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXhfdGltZV9hbGxvd2VkXG4gICAqL1xuICBzZXQgbWF4X3RpbWVfYWxsb3dlZChtYXhfdGltZV9hbGxvd2VkKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNtYXhfdGltZV9hbGxvd2VkID0gbWF4X3RpbWVfYWxsb3dlZCA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21vZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21vZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbW9kZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlXG4gICAqL1xuICBzZXQgbW9kZShtb2RlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNtb2RlID0gbW9kZSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Byb2dyZXNzX21lYXN1cmVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHByb2dyZXNzX21lYXN1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Byb2dyZXNzX21lYXN1cmU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKi9cbiAgc2V0IHByb2dyZXNzX21lYXN1cmUocHJvZ3Jlc3NfbWVhc3VyZSkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChwcm9ncmVzc19tZWFzdXJlLCByZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgICBjaGVjazIwMDRWYWxpZFJhbmdlKHByb2dyZXNzX21lYXN1cmUsIHJlZ2V4LnByb2dyZXNzX3JhbmdlKSkge1xuICAgICAgdGhpcy4jcHJvZ3Jlc3NfbWVhc3VyZSA9IHByb2dyZXNzX21lYXN1cmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NjYWxlZF9wYXNzaW5nX3Njb3JlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzY2FsZWRfcGFzc2luZ19zY29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc2NhbGVkX3Bhc3Npbmdfc2NvcmU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2NhbGVkX3Bhc3Npbmdfc2NvcmUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NhbGVkX3Bhc3Npbmdfc2NvcmVcbiAgICovXG4gIHNldCBzY2FsZWRfcGFzc2luZ19zY29yZShzY2FsZWRfcGFzc2luZ19zY29yZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jc2NhbGVkX3Bhc3Npbmdfc2NvcmUgPSBzY2FsZWRfcGFzc2luZ19zY29yZSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Nlc3Npb25fdGltZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHNlc3Npb25fdGltZSgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jc2Vzc2lvbl90aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Nlc3Npb25fdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbl90aW1lXG4gICAqL1xuICBzZXQgc2Vzc2lvbl90aW1lKHNlc3Npb25fdGltZSkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChzZXNzaW9uX3RpbWUsIHJlZ2V4LkNNSVRpbWVzcGFuKSkge1xuICAgICAgdGhpcy4jc2Vzc2lvbl90aW1lID0gc2Vzc2lvbl90aW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdWNjZXNzX3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3VjY2Vzc19zdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N1Y2Nlc3Nfc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N1Y2Nlc3Nfc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWNjZXNzX3N0YXR1c1xuICAgKi9cbiAgc2V0IHN1Y2Nlc3Nfc3RhdHVzKHN1Y2Nlc3Nfc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHN1Y2Nlc3Nfc3RhdHVzLCByZWdleC5DTUlTU3RhdHVzKSkge1xuICAgICAgdGhpcy4jc3VjY2Vzc19zdGF0dXMgPSBzdWNjZXNzX3N0YXR1cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdXNwZW5kX2RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N1c3BlbmRfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdXNwZW5kX2RhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1c3BlbmRfZGF0YVxuICAgKi9cbiAgc2V0IHN1c3BlbmRfZGF0YShzdXNwZW5kX2RhdGEpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc3VzcGVuZF9kYXRhLCByZWdleC5DTUlTdHJpbmc2NDAwMCwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI3N1c3BlbmRfZGF0YSA9IHN1c3BlbmRfZGF0YTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZV9saW1pdF9hY3Rpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWVfbGltaXRfYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lX2xpbWl0X2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0aW1lX2xpbWl0X2FjdGlvbi4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lX2xpbWl0X2FjdGlvblxuICAgKi9cbiAgc2V0IHRpbWVfbGltaXRfYWN0aW9uKHRpbWVfbGltaXRfYWN0aW9uKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiN0aW1lX2xpbWl0X2FjdGlvbiA9IHRpbWVfbGltaXRfYWN0aW9uIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdG90YWxfdGltZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdG90YWxfdGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdG90YWxfdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0b3RhbF90aW1lLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRvdGFsX3RpbWVcbiAgICovXG4gIHNldCB0b3RhbF90aW1lKHRvdGFsX3RpbWUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI3RvdGFsX3RpbWUgPSB0b3RhbF90aW1lIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgdG8gdGhlIGV4aXN0aW5nIHRvdGFsIHRpbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gSVNPODYwMSBEdXJhdGlvblxuICAgKi9cbiAgZ2V0Q3VycmVudFRvdGFsVGltZSgpIHtcbiAgICByZXR1cm4gVXRpbC5hZGRUd29EdXJhdGlvbnMoXG4gICAgICAgIHRoaXMuI3RvdGFsX3RpbWUsXG4gICAgICAgIHRoaXMuI3Nlc3Npb25fdGltZSxcbiAgICAgICAgc2Nvcm0yMDA0X3JlZ2V4LkNNSVRpbWVzcGFuLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWlcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBjb21tZW50c19mcm9tX2xlYXJuZXI6IENNSUNvbW1lbnRzRnJvbUxlYXJuZXIsXG4gICAqICAgICAgY29tbWVudHNfZnJvbV9sbXM6IENNSUNvbW1lbnRzRnJvbUxNUyxcbiAgICogICAgICBjb21wbGV0aW9uX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIGNvbXBsZXRpb25fdGhyZXNob2xkOiBzdHJpbmcsXG4gICAqICAgICAgY3JlZGl0OiBzdHJpbmcsXG4gICAqICAgICAgZW50cnk6IHN0cmluZyxcbiAgICogICAgICBleGl0OiBzdHJpbmcsXG4gICAqICAgICAgaW50ZXJhY3Rpb25zOiBDTUlJbnRlcmFjdGlvbnMsXG4gICAqICAgICAgbGF1bmNoX2RhdGE6IHN0cmluZyxcbiAgICogICAgICBsZWFybmVyX2lkOiBzdHJpbmcsXG4gICAqICAgICAgbGVhcm5lcl9uYW1lOiBzdHJpbmcsXG4gICAqICAgICAgbGVhcm5lcl9wcmVmZXJlbmNlOiBDTUlMZWFybmVyUHJlZmVyZW5jZSxcbiAgICogICAgICBsb2NhdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIG1heF90aW1lX2FsbG93ZWQ6IHN0cmluZyxcbiAgICogICAgICBtb2RlOiBzdHJpbmcsXG4gICAqICAgICAgb2JqZWN0aXZlczogQ01JT2JqZWN0aXZlcyxcbiAgICogICAgICBwcm9ncmVzc19tZWFzdXJlOiBzdHJpbmcsXG4gICAqICAgICAgc2NhbGVkX3Bhc3Npbmdfc2NvcmU6IHN0cmluZyxcbiAgICogICAgICBzY29yZTogU2Nvcm0yMDA0Q01JU2NvcmUsXG4gICAqICAgICAgc2Vzc2lvbl90aW1lOiBzdHJpbmcsXG4gICAqICAgICAgc3VjY2Vzc19zdGF0dXM6IHN0cmluZyxcbiAgICogICAgICBzdXNwZW5kX2RhdGE6IHN0cmluZyxcbiAgICogICAgICB0aW1lX2xpbWl0X2FjdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIHRvdGFsX3RpbWU6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnY29tbWVudHNfZnJvbV9sZWFybmVyJzogdGhpcy5jb21tZW50c19mcm9tX2xlYXJuZXIsXG4gICAgICAnY29tbWVudHNfZnJvbV9sbXMnOiB0aGlzLmNvbW1lbnRzX2Zyb21fbG1zLFxuICAgICAgJ2NvbXBsZXRpb25fc3RhdHVzJzogdGhpcy5jb21wbGV0aW9uX3N0YXR1cyxcbiAgICAgICdjb21wbGV0aW9uX3RocmVzaG9sZCc6IHRoaXMuY29tcGxldGlvbl90aHJlc2hvbGQsXG4gICAgICAnY3JlZGl0JzogdGhpcy5jcmVkaXQsXG4gICAgICAnZW50cnknOiB0aGlzLmVudHJ5LFxuICAgICAgJ2V4aXQnOiB0aGlzLmV4aXQsXG4gICAgICAnaW50ZXJhY3Rpb25zJzogdGhpcy5pbnRlcmFjdGlvbnMsXG4gICAgICAnbGF1bmNoX2RhdGEnOiB0aGlzLmxhdW5jaF9kYXRhLFxuICAgICAgJ2xlYXJuZXJfaWQnOiB0aGlzLmxlYXJuZXJfaWQsXG4gICAgICAnbGVhcm5lcl9uYW1lJzogdGhpcy5sZWFybmVyX25hbWUsXG4gICAgICAnbGVhcm5lcl9wcmVmZXJlbmNlJzogdGhpcy5sZWFybmVyX3ByZWZlcmVuY2UsXG4gICAgICAnbG9jYXRpb24nOiB0aGlzLmxvY2F0aW9uLFxuICAgICAgJ21heF90aW1lX2FsbG93ZWQnOiB0aGlzLm1heF90aW1lX2FsbG93ZWQsXG4gICAgICAnbW9kZSc6IHRoaXMubW9kZSxcbiAgICAgICdvYmplY3RpdmVzJzogdGhpcy5vYmplY3RpdmVzLFxuICAgICAgJ3Byb2dyZXNzX21lYXN1cmUnOiB0aGlzLnByb2dyZXNzX21lYXN1cmUsXG4gICAgICAnc2NhbGVkX3Bhc3Npbmdfc2NvcmUnOiB0aGlzLnNjYWxlZF9wYXNzaW5nX3Njb3JlLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICAgICdzZXNzaW9uX3RpbWUnOiB0aGlzLnNlc3Npb25fdGltZSxcbiAgICAgICdzdWNjZXNzX3N0YXR1cyc6IHRoaXMuc3VjY2Vzc19zdGF0dXMsXG4gICAgICAnc3VzcGVuZF9kYXRhJzogdGhpcy5zdXNwZW5kX2RhdGEsXG4gICAgICAndGltZV9saW1pdF9hY3Rpb24nOiB0aGlzLnRpbWVfbGltaXRfYWN0aW9uLFxuICAgICAgJ3RvdGFsX3RpbWUnOiB0aGlzLnRvdGFsX3RpbWUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgU0NPUk0gMjAwNCdzIGNtaS5sZWFybmVyX3ByZWZlcmVuY2Ugb2JqZWN0XG4gKi9cbmNsYXNzIENNSUxlYXJuZXJQcmVmZXJlbmNlIGV4dGVuZHMgQmFzZUNNSSB7XG4gICNfY2hpbGRyZW4gPSBjb25zdGFudHMuc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuO1xuICAjYXVkaW9fbGV2ZWwgPSAnMSc7XG4gICNsYW5ndWFnZSA9ICcnO1xuICAjZGVsaXZlcnlfc3BlZWQgPSAnMSc7XG4gICNhdWRpb19jYXB0aW9uaW5nID0gJzAnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmxlYXJuZXJfcHJlZmVyZW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjYXVkaW9fbGV2ZWxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGF1ZGlvX2xldmVsKCkge1xuICAgIHJldHVybiB0aGlzLiNhdWRpb19sZXZlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNhdWRpb19sZXZlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXVkaW9fbGV2ZWxcbiAgICovXG4gIHNldCBhdWRpb19sZXZlbChhdWRpb19sZXZlbCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChhdWRpb19sZXZlbCwgcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShhdWRpb19sZXZlbCwgcmVnZXguYXVkaW9fcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNhdWRpb19sZXZlbCA9IGF1ZGlvX2xldmVsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYW5ndWFnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGFuZ3VhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhbmd1YWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhbmd1YWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuICAgKi9cbiAgc2V0IGxhbmd1YWdlKGxhbmd1YWdlKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGxhbmd1YWdlLCByZWdleC5DTUlMYW5nKSkge1xuICAgICAgdGhpcy4jbGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZGVsaXZlcnlfc3BlZWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRlbGl2ZXJ5X3NwZWVkKCkge1xuICAgIHJldHVybiB0aGlzLiNkZWxpdmVyeV9zcGVlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNkZWxpdmVyeV9zcGVlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVsaXZlcnlfc3BlZWRcbiAgICovXG4gIHNldCBkZWxpdmVyeV9zcGVlZChkZWxpdmVyeV9zcGVlZCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChkZWxpdmVyeV9zcGVlZCwgcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShkZWxpdmVyeV9zcGVlZCwgcmVnZXguc3BlZWRfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNkZWxpdmVyeV9zcGVlZCA9IGRlbGl2ZXJ5X3NwZWVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNhdWRpb19jYXB0aW9uaW5nXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBhdWRpb19jYXB0aW9uaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNhdWRpb19jYXB0aW9uaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2F1ZGlvX2NhcHRpb25pbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF1ZGlvX2NhcHRpb25pbmdcbiAgICovXG4gIHNldCBhdWRpb19jYXB0aW9uaW5nKGF1ZGlvX2NhcHRpb25pbmcpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoYXVkaW9fY2FwdGlvbmluZywgcmVnZXguQ01JU0ludGVnZXIpICYmXG4gICAgICAgIGNoZWNrMjAwNFZhbGlkUmFuZ2UoYXVkaW9fY2FwdGlvbmluZywgcmVnZXgudGV4dF9yYW5nZSkpIHtcbiAgICAgIHRoaXMuI2F1ZGlvX2NhcHRpb25pbmcgPSBhdWRpb19jYXB0aW9uaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5sZWFybmVyX3ByZWZlcmVuY2VcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBhdWRpb19sZXZlbDogc3RyaW5nLFxuICAgKiAgICAgIGxhbmd1YWdlOiBzdHJpbmcsXG4gICAqICAgICAgZGVsaXZlcnlfc3BlZWQ6IHN0cmluZyxcbiAgICogICAgICBhdWRpb19jYXB0aW9uaW5nOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2F1ZGlvX2xldmVsJzogdGhpcy5hdWRpb19sZXZlbCxcbiAgICAgICdsYW5ndWFnZSc6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAnZGVsaXZlcnlfc3BlZWQnOiB0aGlzLmRlbGl2ZXJ5X3NwZWVkLFxuICAgICAgJ2F1ZGlvX2NhcHRpb25pbmcnOiB0aGlzLmF1ZGlvX2NhcHRpb25pbmcsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMjAwNCdzIGNtaS5pbnRlcmFjdGlvbnMgb2JqZWN0XG4gKi9cbmNsYXNzIENNSUludGVyYWN0aW9ucyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkub2JqZWN0aXZlcyBBcnJheVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgY2hpbGRyZW46IGNvbnN0YW50cy5pbnRlcmFjdGlvbnNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLm9iamVjdGl2ZXMgb2JqZWN0XG4gKi9cbmNsYXNzIENNSU9iamVjdGl2ZXMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLm9iamVjdGl2ZXMgQXJyYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBjb25zdGFudHMub2JqZWN0aXZlc19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuY29tbWVudHNfZnJvbV9sbXMgb2JqZWN0XG4gKi9cbmNsYXNzIENNSUNvbW1lbnRzRnJvbUxNUyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuY29tbWVudHNfZnJvbV9sbXMgQXJyYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBjb25zdGFudHMuY29tbWVudHNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmNvbW1lbnRzX2Zyb21fbGVhcm5lciBvYmplY3RcbiAqL1xuY2xhc3MgQ01JQ29tbWVudHNGcm9tTGVhcm5lciBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuY29tbWVudHNfZnJvbV9sZWFybmVyIEFycmF5XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBjaGlsZHJlbjogY29uc3RhbnRzLmNvbW1lbnRzX2NoaWxkcmVuLFxuICAgICAgZXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgU0NPUk0gMjAwNCdzIGNtaS5pbnRlcmFjdGlvbi5uIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNpZCA9ICcnO1xuICAjdHlwZSA9ICcnO1xuICAjdGltZXN0YW1wID0gJyc7XG4gICN3ZWlnaHRpbmcgPSAnJztcbiAgI2xlYXJuZXJfcmVzcG9uc2UgPSAnJztcbiAgI3Jlc3VsdCA9ICcnO1xuICAjbGF0ZW5jeSA9ICcnO1xuICAjZGVzY3JpcHRpb24gPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbi5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vYmplY3RpdmVzID0gbmV3IENNSUFycmF5KHtcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgICAgY2hpbGRyZW46IGNvbnN0YW50cy5vYmplY3RpdmVzX2NoaWxkcmVuLFxuICAgIH0pO1xuICAgIHRoaXMuY29ycmVjdF9yZXNwb25zZXMgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgICBjaGlsZHJlbjogY29uc3RhbnRzLmNvcnJlY3RfcmVzcG9uc2VzX2NoaWxkcmVuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLm9iamVjdGl2ZXM/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvcnJlY3RfcmVzcG9uc2VzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICovXG4gIHNldCBpZChpZCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChpZCwgcmVnZXguQ01JTG9uZ0lkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLiNpZCA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0eXBlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3R5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICovXG4gIHNldCB0eXBlKHR5cGUpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQodHlwZSwgcmVnZXguQ01JVHlwZSkpIHtcbiAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lc3RhbXBcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGltZXN0YW1wO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVzdGFtcFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wXG4gICAqL1xuICBzZXQgdGltZXN0YW1wKHRpbWVzdGFtcCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdCh0aW1lc3RhbXAsIHJlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICB0aGlzLiN0aW1lc3RhbXAgPSB0aW1lc3RhbXA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3dlaWdodGluZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgd2VpZ2h0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLiN3ZWlnaHRpbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjd2VpZ2h0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3ZWlnaHRpbmdcbiAgICovXG4gIHNldCB3ZWlnaHRpbmcod2VpZ2h0aW5nKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHdlaWdodGluZywgcmVnZXguQ01JRGVjaW1hbCkpIHtcbiAgICAgIHRoaXMuI3dlaWdodGluZyA9IHdlaWdodGluZztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVhcm5lcl9yZXNwb25zZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVhcm5lcl9yZXNwb25zZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVhcm5lcl9yZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZWFybmVyX3Jlc3BvbnNlLiBEb2VzIHR5cGUgdmFsaWRhdGlvbiB0byBtYWtlIHN1cmUgcmVzcG9uc2VcbiAgICogbWF0Y2hlcyBTQ09STSAyMDA0J3Mgc3BlY1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVhcm5lcl9yZXNwb25zZVxuICAgKi9cbiAgc2V0IGxlYXJuZXJfcmVzcG9uc2UobGVhcm5lcl9yZXNwb25zZSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBzY29ybTIwMDRfZXJyb3JfY29kZXMuREVQRU5ERU5DWV9OT1RfRVNUQUJMSVNIRUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbm9kZXMgPSBbXTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlX3R5cGUgPSBsZWFybmVyX3Jlc3BvbnNlc1t0aGlzLnR5cGVdO1xuICAgICAgaWYgKHJlc3BvbnNlX3R5cGUuZGVsaW1pdGVyICE9PSAnJykge1xuICAgICAgICBub2RlcyA9IGxlYXJuZXJfcmVzcG9uc2Uuc3BsaXQocmVzcG9uc2VfdHlwZS5kZWxpbWl0ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZXNbMF0gPSBsZWFybmVyX3Jlc3BvbnNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5vZGVzLmxlbmd0aCA+IDApICYmIChub2Rlcy5sZW5ndGggPD0gcmVzcG9uc2VfdHlwZS5tYXgpKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdFJlZ2V4ID0gbmV3IFJlZ0V4cChyZXNwb25zZV90eXBlLmZvcm1hdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlX3R5cGUuZGVsaW1pdGVyMiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5vZGVzW2ldLnNwbGl0KHJlc3BvbnNlX3R5cGUuZGVsaW1pdGVyMik7XG4gICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICBpZiAoIXZhbHVlc1swXS5tYXRjaChmb3JtYXRSZWdleCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXNbMV0ubWF0Y2gobmV3IFJlZ0V4cChyZXNwb25zZV90eXBlLmZvcm1hdDIpKSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW5vZGVzW2ldLm1hdGNoKGZvcm1hdFJlZ2V4KSkge1xuICAgICAgICAgICAgICB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAobm9kZXNbaV0gIT09ICcnICYmIHJlc3BvbnNlX3R5cGUudW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGlmIChub2Rlc1tpXSA9PT0gbm9kZXNbal0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Jlc3VsdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcmVzdWx0KCkge1xuICAgIHJldHVybiB0aGlzLiNyZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXN1bHRcbiAgICovXG4gIHNldCByZXN1bHQocmVzdWx0KSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHJlc3VsdCwgcmVnZXguQ01JUmVzdWx0KSkge1xuICAgICAgdGhpcy4jcmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYXRlbmN5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsYXRlbmN5KCkge1xuICAgIHJldHVybiB0aGlzLiNsYXRlbmN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhdGVuY3lcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhdGVuY3lcbiAgICovXG4gIHNldCBsYXRlbmN5KGxhdGVuY3kpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQobGF0ZW5jeSwgcmVnZXguQ01JVGltZXNwYW4pKSB7XG4gICAgICB0aGlzLiNsYXRlbmN5ID0gbGF0ZW5jeTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZGVzY3JpcHRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNkZXNjcmlwdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAgICovXG4gIHNldCBkZXNjcmlwdGlvbihkZXNjcmlwdGlvbikge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChkZXNjcmlwdGlvbiwgcmVnZXguQ01JTGFuZ1N0cmluZzI1MCwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmludGVyYWN0aW9ucy5uXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZyxcbiAgICogICAgICB0eXBlOiBzdHJpbmcsXG4gICAqICAgICAgb2JqZWN0aXZlczogQ01JQXJyYXksXG4gICAqICAgICAgdGltZXN0YW1wOiBzdHJpbmcsXG4gICAqICAgICAgY29ycmVjdF9yZXNwb25zZXM6IENNSUFycmF5LFxuICAgKiAgICAgIHdlaWdodGluZzogc3RyaW5nLFxuICAgKiAgICAgIGxlYXJuZXJfcmVzcG9uc2U6IHN0cmluZyxcbiAgICogICAgICByZXN1bHQ6IHN0cmluZyxcbiAgICogICAgICBsYXRlbmN5OiBzdHJpbmcsXG4gICAqICAgICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgICAgJ3R5cGUnOiB0aGlzLnR5cGUsXG4gICAgICAnb2JqZWN0aXZlcyc6IHRoaXMub2JqZWN0aXZlcyxcbiAgICAgICd0aW1lc3RhbXAnOiB0aGlzLnRpbWVzdGFtcCxcbiAgICAgICd3ZWlnaHRpbmcnOiB0aGlzLndlaWdodGluZyxcbiAgICAgICdsZWFybmVyX3Jlc3BvbnNlJzogdGhpcy5sZWFybmVyX3Jlc3BvbnNlLFxuICAgICAgJ3Jlc3VsdCc6IHRoaXMucmVzdWx0LFxuICAgICAgJ2xhdGVuY3knOiB0aGlzLmxhdGVuY3ksXG4gICAgICAnZGVzY3JpcHRpb24nOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgJ2NvcnJlY3RfcmVzcG9uc2VzJzogdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBTQ09STSAyMDA0J3MgY21pLm9iamVjdGl2ZXMubiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSU9iamVjdGl2ZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2lkID0gJyc7XG4gICNzdWNjZXNzX3N0YXR1cyA9ICd1bmtub3duJztcbiAgI2NvbXBsZXRpb25fc3RhdHVzID0gJ3Vua25vd24nO1xuICAjcHJvZ3Jlc3NfbWVhc3VyZSA9ICcnO1xuICAjZGVzY3JpcHRpb24gPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5vYmplY3RpdmVzLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNjb3JlID0gbmV3IFNjb3JtMjAwNENNSVNjb3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc2NvcmU/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGlkLCByZWdleC5DTUlMb25nSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N1Y2Nlc3Nfc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdWNjZXNzX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3VjY2Vzc19zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3VjY2Vzc19zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3Nfc3RhdHVzXG4gICAqL1xuICBzZXQgc3VjY2Vzc19zdGF0dXMoc3VjY2Vzc19zdGF0dXMpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc3VjY2Vzc19zdGF0dXMsIHJlZ2V4LkNNSVNTdGF0dXMpKSB7XG4gICAgICB0aGlzLiNzdWNjZXNzX3N0YXR1cyA9IHN1Y2Nlc3Nfc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21wbGV0aW9uX3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29tcGxldGlvbl9zdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbXBsZXRpb25fc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbXBsZXRpb25fc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21wbGV0aW9uX3N0YXR1c1xuICAgKi9cbiAgc2V0IGNvbXBsZXRpb25fc3RhdHVzKGNvbXBsZXRpb25fc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGNvbXBsZXRpb25fc3RhdHVzLCByZWdleC5DTUlDU3RhdHVzKSkge1xuICAgICAgdGhpcy4jY29tcGxldGlvbl9zdGF0dXMgPSBjb21wbGV0aW9uX3N0YXR1cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcHJvZ3Jlc3NfbWVhc3VyZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcHJvZ3Jlc3NfbWVhc3VyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNwcm9ncmVzc19tZWFzdXJlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9ncmVzc19tZWFzdXJlXG4gICAqL1xuICBzZXQgcHJvZ3Jlc3NfbWVhc3VyZShwcm9ncmVzc19tZWFzdXJlKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHByb2dyZXNzX21lYXN1cmUsIHJlZ2V4LkNNSURlY2ltYWwpICYmXG4gICAgICAgIGNoZWNrMjAwNFZhbGlkUmFuZ2UocHJvZ3Jlc3NfbWVhc3VyZSwgcmVnZXgucHJvZ3Jlc3NfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNwcm9ncmVzc19tZWFzdXJlID0gcHJvZ3Jlc3NfbWVhc3VyZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZGVzY3JpcHRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNkZXNjcmlwdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAgICovXG4gIHNldCBkZXNjcmlwdGlvbihkZXNjcmlwdGlvbikge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChkZXNjcmlwdGlvbiwgcmVnZXguQ01JTGFuZ1N0cmluZzI1MCwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLm9iamVjdGl2ZXMublxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmcsXG4gICAqICAgICAgc3VjY2Vzc19zdGF0dXM6IHN0cmluZyxcbiAgICogICAgICBjb21wbGV0aW9uX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIHByb2dyZXNzX21lYXN1cmU6IHN0cmluZyxcbiAgICogICAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBTY29ybTIwMDRDTUlTY29yZVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgICAgJ3N1Y2Nlc3Nfc3RhdHVzJzogdGhpcy5zdWNjZXNzX3N0YXR1cyxcbiAgICAgICdjb21wbGV0aW9uX3N0YXR1cyc6IHRoaXMuY29tcGxldGlvbl9zdGF0dXMsXG4gICAgICAncHJvZ3Jlc3NfbWVhc3VyZSc6IHRoaXMucHJvZ3Jlc3NfbWVhc3VyZSxcbiAgICAgICdkZXNjcmlwdGlvbic6IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAnc2NvcmUnOiB0aGlzLnNjb3JlLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIFNDT1JNIDIwMDQncyBjbWkgKi5zY29yZSBvYmplY3RcbiAqL1xuY2xhc3MgU2Nvcm0yMDA0Q01JU2NvcmUgZXh0ZW5kcyBDTUlTY29yZSB7XG4gICNzY2FsZWQgPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaSAqLnNjb3JlXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgICAge1xuICAgICAgICAgIHNjb3JlX2NoaWxkcmVuOiBjb25zdGFudHMuc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgICAgbWF4OiAnJyxcbiAgICAgICAgICBpbnZhbGlkRXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgICAgICAgaW52YWxpZFR5cGVDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCxcbiAgICAgICAgICBpbnZhbGlkUmFuZ2VDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgICAgIGRlY2ltYWxSZWdleDogc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwsXG4gICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NjYWxlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc2NhbGVkKCkge1xuICAgIHJldHVybiB0aGlzLiNzY2FsZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2NhbGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2FsZWRcbiAgICovXG4gIHNldCBzY2FsZWQoc2NhbGVkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHNjYWxlZCwgcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShzY2FsZWQsIHJlZ2V4LnNjYWxlZF9yYW5nZSkpIHtcbiAgICAgIHRoaXMuI3NjYWxlZCA9IHNjYWxlZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkgKi5zY29yZVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHNjYWxlZDogc3RyaW5nLFxuICAgKiAgICAgIHJhdzogc3RyaW5nLFxuICAgKiAgICAgIG1pbjogc3RyaW5nLFxuICAgKiAgICAgIG1heDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdzY2FsZWQnOiB0aGlzLnNjYWxlZCxcbiAgICAgICdyYXcnOiBzdXBlci5yYXcsXG4gICAgICAnbWluJzogc3VwZXIubWluLFxuICAgICAgJ21heCc6IHN1cGVyLm1heCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmNvbW1lbnRzX2Zyb21fbGVhcm5lci5uIGFuZCBjbWkuY29tbWVudHNfZnJvbV9sbXMubiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUNvbW1lbnRzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNjb21tZW50ID0gJyc7XG4gICNsb2NhdGlvbiA9ICcnO1xuICAjdGltZXN0YW1wID0gJyc7XG4gICNyZWFkT25seUFmdGVySW5pdDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5jb21tZW50c19mcm9tX2xlYXJuZXIubiBhbmQgY21pLmNvbW1lbnRzX2Zyb21fbG1zLm5cbiAgICogQHBhcmFtIHtib29sZWFufSByZWFkT25seUFmdGVySW5pdFxuICAgKi9cbiAgY29uc3RydWN0b3IocmVhZE9ubHlBZnRlckluaXQgPSBmYWxzZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jY29tbWVudCA9ICcnO1xuICAgIHRoaXMuI2xvY2F0aW9uID0gJyc7XG4gICAgdGhpcy4jdGltZXN0YW1wID0gJyc7XG4gICAgdGhpcy4jcmVhZE9ubHlBZnRlckluaXQgPSByZWFkT25seUFmdGVySW5pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21tZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21tZW50KCkge1xuICAgIHJldHVybiB0aGlzLiNjb21tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbW1lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRcbiAgICovXG4gIHNldCBjb21tZW50KGNvbW1lbnQpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNyZWFkT25seUFmdGVySW5pdCkge1xuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChjb21tZW50LCByZWdleC5DTUlMYW5nU3RyaW5nNDAwMCwgdHJ1ZSkpIHtcbiAgICAgICAgdGhpcy4jY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xvY2F0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbG9jYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gICAqL1xuICBzZXQgbG9jYXRpb24obG9jYXRpb24pIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNyZWFkT25seUFmdGVySW5pdCkge1xuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChsb2NhdGlvbiwgcmVnZXguQ01JU3RyaW5nMjUwKSkge1xuICAgICAgICB0aGlzLiNsb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lc3RhbXBcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGltZXN0YW1wO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVzdGFtcFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wXG4gICAqL1xuICBzZXQgdGltZXN0YW1wKHRpbWVzdGFtcCkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI3JlYWRPbmx5QWZ0ZXJJbml0KSB7XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHRpbWVzdGFtcCwgcmVnZXguQ01JVGltZSkpIHtcbiAgICAgICAgdGhpcy4jdGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5jb21tZW50c19mcm9tX2xlYXJuZXIubiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBjb21tZW50OiBzdHJpbmcsXG4gICAqICAgICAgbG9jYXRpb246IHN0cmluZyxcbiAgICogICAgICB0aW1lc3RhbXA6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnY29tbWVudCc6IHRoaXMuY29tbWVudCxcbiAgICAgICdsb2NhdGlvbic6IHRoaXMubG9jYXRpb24sXG4gICAgICAndGltZXN0YW1wJzogdGhpcy50aW1lc3RhbXAsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMjAwNCdzIGNtaS5pbnRlcmFjdGlvbnMubi5vYmplY3RpdmVzLm4gb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNPYmplY3RpdmVzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNpZCA9ICcnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGlkLCByZWdleC5DTUlMb25nSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMublxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmludGVyYWN0aW9ucy5uLmNvcnJlY3RfcmVzcG9uc2VzLm4gb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNwYXR0ZXJuID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4uY29ycmVjdF9yZXNwb25zZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNwYXR0ZXJuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBwYXR0ZXJuKCkge1xuICAgIHJldHVybiB0aGlzLiNwYXR0ZXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3BhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cbiAgICovXG4gIHNldCBwYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQocGF0dGVybiwgcmVnZXguQ01JRmVlZGJhY2spKSB7XG4gICAgICB0aGlzLiNwYXR0ZXJuID0gcGF0dGVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGNtaS5pbnRlcmFjdGlvbnMubi5jb3JyZWN0X3Jlc3BvbnNlcy5uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHBhdHRlcm46IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAncGF0dGVybic6IHRoaXMucGF0dGVybixcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgYWRsIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQURMIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYWRsXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5uYXYgPSBuZXcgQURMTmF2KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMubmF2Py5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBhZGxcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBuYXY6IHtcbiAgICogICAgICAgIHJlcXVlc3Q6IHN0cmluZ1xuICAgKiAgICAgIH1cbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ25hdic6IHRoaXMubmF2LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBhZGwubmF2IG9iamVjdFxuICovXG5jbGFzcyBBRExOYXYgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI3JlcXVlc3QgPSAnX25vbmVfJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGFkbC5uYXZcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnJlcXVlc3RfdmFsaWQgPSBuZXcgQURMTmF2UmVxdWVzdFZhbGlkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMucmVxdWVzdF92YWxpZD8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3JlcXVlc3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JlcXVlc3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcmVxdWVzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdFxuICAgKi9cbiAgc2V0IHJlcXVlc3QocmVxdWVzdCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChyZXF1ZXN0LCByZWdleC5OQVZFdmVudCkpIHtcbiAgICAgIHRoaXMuI3JlcXVlc3QgPSByZXF1ZXN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGFkbC5uYXZcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICByZXF1ZXN0OiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3JlcXVlc3QnOiB0aGlzLnJlcXVlc3QsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMjAwNCdzIGFkbC5uYXYucmVxdWVzdF92YWxpZCBvYmplY3RcbiAqL1xuY2xhc3MgQURMTmF2UmVxdWVzdFZhbGlkIGV4dGVuZHMgQmFzZUNNSSB7XG4gICNjb250aW51ZSA9ICd1bmtub3duJztcbiAgI3ByZXZpb3VzID0gJ3Vua25vd24nO1xuICBjaG9pY2UgPSBjbGFzcyB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGFyZ2V0IGlzIHZhbGlkXG4gICAgICogQHBhcmFtIHsqfSBfdGFyZ2V0XG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIF9pc1RhcmdldFZhbGlkID0gKF90YXJnZXQpID0+ICd1bmtub3duJztcbiAgfTtcbiAganVtcCA9IGNsYXNzIHtcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0YXJnZXQgaXMgdmFsaWRcbiAgICAgKiBAcGFyYW0geyp9IF90YXJnZXRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgX2lzVGFyZ2V0VmFsaWQgPSAoX3RhcmdldCkgPT4gJ3Vua25vd24nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYWRsLm5hdi5yZXF1ZXN0X3ZhbGlkXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbnRpbnVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb250aW51ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29udGludWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29udGludWUuIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0geyp9IF9cbiAgICovXG4gIHNldCBjb250aW51ZShfKSB7XG4gICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcHJldmlvdXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHByZXZpb3VzKCkge1xuICAgIHJldHVybiB0aGlzLiNwcmV2aW91cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNwcmV2aW91cy4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7Kn0gX1xuICAgKi9cbiAgc2V0IHByZXZpb3VzKF8pIHtcbiAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGFkbC5uYXYucmVxdWVzdF92YWxpZFxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHByZXZpb3VzOiBzdHJpbmcsXG4gICAqICAgICAgY29udGludWU6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAncHJldmlvdXMnOiB0aGlzLnByZXZpb3VzLFxuICAgICAgJ2NvbnRpbnVlJzogdGhpcy5jb250aW51ZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGNvbnN0IGdsb2JhbF9jb25zdGFudHMgPSB7XG4gIFNDT1JNX1RSVUU6ICd0cnVlJyxcbiAgU0NPUk1fRkFMU0U6ICdmYWxzZScsXG4gIFNUQVRFX05PVF9JTklUSUFMSVpFRDogMCxcbiAgU1RBVEVfSU5JVElBTElaRUQ6IDEsXG4gIFNUQVRFX1RFUk1JTkFURUQ6IDIsXG4gIExPR19MRVZFTF9ERUJVRzogMSxcbiAgTE9HX0xFVkVMX0lORk86IDIsXG4gIExPR19MRVZFTF9XQVJOSU5HOiAzLFxuICBMT0dfTEVWRUxfRVJST1I6IDQsXG4gIExPR19MRVZFTF9OT05FOiA1LFxufTtcblxuZXhwb3J0IGNvbnN0IHNjb3JtMTJfY29uc3RhbnRzID0ge1xuICAvLyBDaGlsZHJlbiBsaXN0c1xuICBjbWlfY2hpbGRyZW46ICdjb3JlLHN1c3BlbmRfZGF0YSxsYXVuY2hfZGF0YSxjb21tZW50cyxvYmplY3RpdmVzLHN0dWRlbnRfZGF0YSxzdHVkZW50X3ByZWZlcmVuY2UsaW50ZXJhY3Rpb25zJyxcbiAgY29yZV9jaGlsZHJlbjogJ3N0dWRlbnRfaWQsc3R1ZGVudF9uYW1lLGxlc3Nvbl9sb2NhdGlvbixjcmVkaXQsbGVzc29uX3N0YXR1cyxlbnRyeSxzY29yZSx0b3RhbF90aW1lLGxlc3Nvbl9tb2RlLGV4aXQsc2Vzc2lvbl90aW1lJyxcbiAgc2NvcmVfY2hpbGRyZW46ICdyYXcsbWluLG1heCcsXG4gIGNvbW1lbnRzX2NoaWxkcmVuOiAnY29udGVudCxsb2NhdGlvbix0aW1lJyxcbiAgb2JqZWN0aXZlc19jaGlsZHJlbjogJ2lkLHNjb3JlLHN0YXR1cycsXG4gIGNvcnJlY3RfcmVzcG9uc2VzX2NoaWxkcmVuOiAncGF0dGVybicsXG4gIHN0dWRlbnRfZGF0YV9jaGlsZHJlbjogJ21hc3Rlcnlfc2NvcmUsbWF4X3RpbWVfYWxsb3dlZCx0aW1lX2xpbWl0X2FjdGlvbicsXG4gIHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbjogJ2F1ZGlvLGxhbmd1YWdlLHNwZWVkLHRleHQnLFxuICBpbnRlcmFjdGlvbnNfY2hpbGRyZW46ICdpZCxvYmplY3RpdmVzLHRpbWUsdHlwZSxjb3JyZWN0X3Jlc3BvbnNlcyx3ZWlnaHRpbmcsc3R1ZGVudF9yZXNwb25zZSxyZXN1bHQsbGF0ZW5jeScsXG5cbiAgZXJyb3JfZGVzY3JpcHRpb25zOiB7XG4gICAgJzEwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgRXhjZXB0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdObyBzcGVjaWZpYyBlcnJvciBjb2RlIGV4aXN0cyB0byBkZXNjcmliZSB0aGUgZXJyb3IuIFVzZSBMTVNHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uJyxcbiAgICB9LFxuICAgICcyMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdJbnZhbGlkIGFyZ3VtZW50IGVycm9yJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBhbiBhcmd1bWVudCByZXByZXNlbnRzIGFuIGludmFsaWQgZGF0YSBtb2RlbCBlbGVtZW50IG9yIGlzIG90aGVyd2lzZSBpbmNvcnJlY3QuJyxcbiAgICB9LFxuICAgICcyMDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IGNhbm5vdCBoYXZlIGNoaWxkcmVuJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBMTVNHZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSBkYXRhIG1vZGVsIGVsZW1lbnQgbmFtZSB0aGF0IGVuZHMgaW4gXCJfY2hpbGRyZW5cIiBmb3IgYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBcIl9jaGlsZHJlblwiIHN1ZmZpeC4nLFxuICAgIH0sXG4gICAgJzIwMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgbm90IGFuIGFycmF5IC0gY2Fubm90IGhhdmUgY291bnQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IExNU0dldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIGRhdGEgbW9kZWwgZWxlbWVudCBuYW1lIHRoYXQgZW5kcyBpbiBcIl9jb3VudFwiIGZvciBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFwiX2NvdW50XCIgc3VmZml4LicsXG4gICAgfSxcbiAgICAnMzAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnTm90IGluaXRpYWxpemVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBhbiBBUEkgY2FsbCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gbG1zSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzQwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ05vdCBpbXBsZW1lbnRlZCBlcnJvcicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBpbmRpY2F0ZWQgaW4gYSBjYWxsIHRvIExNU0dldFZhbHVlIG9yIExNU1NldFZhbHVlIGlzIHZhbGlkLCBidXQgd2FzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIExNUy4gU0NPUk0gMS4yIGRlZmluZXMgYSBzZXQgb2YgZGF0YSBtb2RlbCBlbGVtZW50cyBhcyBiZWluZyBvcHRpb25hbCBmb3IgYW4gTE1TIHRvIGltcGxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0ludmFsaWQgc2V0IHZhbHVlLCBlbGVtZW50IGlzIGEga2V5d29yZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgTE1TU2V0VmFsdWUgd2FzIGNhbGxlZCBvbiBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBrZXl3b3JkIChlbGVtZW50cyB0aGF0IGVuZCBpbiBcIl9jaGlsZHJlblwiIGFuZCBcIl9jb3VudFwiKS4nLFxuICAgIH0sXG4gICAgJzQwMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgaXMgcmVhZCBvbmx5JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdMTVNTZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBjYW4gb25seSBiZSByZWFkLicsXG4gICAgfSxcbiAgICAnNDA0Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBpcyB3cml0ZSBvbmx5JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdMTVNHZXRWYWx1ZSB3YXMgY2FsbGVkIG9uIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgY2FuIG9ubHkgYmUgd3JpdHRlbiB0by4nLFxuICAgIH0sXG4gICAgJzQwNSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0luY29ycmVjdCBEYXRhIFR5cGUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0xNU1NldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHRoYXQgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIHN1cHBsaWVkIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgYWljY19jb25zdGFudHMgPSB7XG4gIC4uLnNjb3JtMTJfY29uc3RhbnRzLCAuLi57XG4gICAgY21pX2NoaWxkcmVuOiAnY29yZSxzdXNwZW5kX2RhdGEsbGF1bmNoX2RhdGEsY29tbWVudHMsb2JqZWN0aXZlcyxzdHVkZW50X2RhdGEsc3R1ZGVudF9wcmVmZXJlbmNlLGludGVyYWN0aW9ucyxldmFsdWF0aW9uJyxcbiAgICBzdHVkZW50X2RhdGFfY2hpbGRyZW46ICdhdHRlbXB0X251bWJlcix0cmllcyxtYXN0ZXJ5X3Njb3JlLG1heF90aW1lX2FsbG93ZWQsdGltZV9saW1pdF9hY3Rpb24nLFxuICAgIHRyaWVzX2NoaWxkcmVuOiAndGltZSxzdGF0dXMsc2NvcmUnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHNjb3JtMjAwNF9jb25zdGFudHMgPSB7XG4gIC8vIENoaWxkcmVuIGxpc3RzXG4gIGNtaV9jaGlsZHJlbjogJ192ZXJzaW9uLGNvbW1lbnRzX2Zyb21fbGVhcm5lcixjb21tZW50c19mcm9tX2xtcyxjb21wbGV0aW9uX3N0YXR1cyxjcmVkaXQsZW50cnksZXhpdCxpbnRlcmFjdGlvbnMsbGF1bmNoX2RhdGEsbGVhcm5lcl9pZCxsZWFybmVyX25hbWUsbGVhcm5lcl9wcmVmZXJlbmNlLGxvY2F0aW9uLG1heF90aW1lX2FsbG93ZWQsbW9kZSxvYmplY3RpdmVzLHByb2dyZXNzX21lYXN1cmUsc2NhbGVkX3Bhc3Npbmdfc2NvcmUsc2NvcmUsc2Vzc2lvbl90aW1lLHN1Y2Nlc3Nfc3RhdHVzLHN1c3BlbmRfZGF0YSx0aW1lX2xpbWl0X2FjdGlvbix0b3RhbF90aW1lJyxcbiAgY29tbWVudHNfY2hpbGRyZW46ICdjb21tZW50LHRpbWVzdGFtcCxsb2NhdGlvbicsXG4gIHNjb3JlX2NoaWxkcmVuOiAnbWF4LHJhdyxzY2FsZWQsbWluJyxcbiAgb2JqZWN0aXZlc19jaGlsZHJlbjogJ3Byb2dyZXNzX21lYXN1cmUsY29tcGxldGlvbl9zdGF0dXMsc3VjY2Vzc19zdGF0dXMsZGVzY3JpcHRpb24sc2NvcmUsaWQnLFxuICBjb3JyZWN0X3Jlc3BvbnNlc19jaGlsZHJlbjogJ3BhdHRlcm4nLFxuICBzdHVkZW50X2RhdGFfY2hpbGRyZW46ICdtYXN0ZXJ5X3Njb3JlLG1heF90aW1lX2FsbG93ZWQsdGltZV9saW1pdF9hY3Rpb24nLFxuICBzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW46ICdhdWRpb19sZXZlbCxhdWRpb19jYXB0aW9uaW5nLGRlbGl2ZXJ5X3NwZWVkLGxhbmd1YWdlJyxcbiAgaW50ZXJhY3Rpb25zX2NoaWxkcmVuOiAnaWQsdHlwZSxvYmplY3RpdmVzLHRpbWVzdGFtcCxjb3JyZWN0X3Jlc3BvbnNlcyx3ZWlnaHRpbmcsbGVhcm5lcl9yZXNwb25zZSxyZXN1bHQsbGF0ZW5jeSxkZXNjcmlwdGlvbicsXG5cbiAgZXJyb3JfZGVzY3JpcHRpb25zOiB7XG4gICAgJzAnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdObyBFcnJvcicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTm8gZXJyb3Igb2NjdXJyZWQsIHRoZSBwcmV2aW91cyBBUEkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4nLFxuICAgIH0sXG4gICAgJzEwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgRXhjZXB0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdObyBzcGVjaWZpYyBlcnJvciBjb2RlIGV4aXN0cyB0byBkZXNjcmliZSB0aGUgZXJyb3IuIFVzZSBHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgfSxcbiAgICAnMTAyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBJbml0aWFsaXphdGlvbiBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEluaXRpYWxpemUgZmFpbGVkIGZvciBhbiB1bmtub3duIHJlYXNvbi4nLFxuICAgIH0sXG4gICAgJzEwMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0FscmVhZHkgSW5pdGlhbGl6ZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gSW5pdGlhbGl6ZSBmYWlsZWQgYmVjYXVzZSBJbml0aWFsaXplIHdhcyBhbHJlYWR5IGNhbGxlZC4nLFxuICAgIH0sXG4gICAgJzEwNCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0NvbnRlbnQgSW5zdGFuY2UgVGVybWluYXRlZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBJbml0aWFsaXplIGZhaWxlZCBiZWNhdXNlIFRlcm1pbmF0ZSB3YXMgYWxyZWFkeSBjYWxsZWQuJyxcbiAgICB9LFxuICAgICcxMTEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIFRlcm1pbmF0aW9uIEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gVGVybWluYXRlIGZhaWxlZCBmb3IgYW4gdW5rbm93biByZWFzb24uJyxcbiAgICB9LFxuICAgICcxMTInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdUZXJtaW5hdGlvbiBCZWZvcmUgSW5pdGlhbGl6YXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gVGVybWluYXRlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnMTEzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnVGVybWluYXRpb24gQWZ0ZXIgVGVybWluYXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gVGVybWluYXRlIGZhaWxlZCBiZWNhdXNlIFRlcm1pbmF0ZSB3YXMgYWxyZWFkeSBjYWxsZWQuJyxcbiAgICB9LFxuICAgICcxMjInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdSZXRyaWV2ZSBEYXRhIEJlZm9yZSBJbml0aWFsaXphdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBHZXRWYWx1ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzEyMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1JldHJpZXZlIERhdGEgQWZ0ZXIgVGVybWluYXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gR2V0VmFsdWUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYWZ0ZXIgdGhlIGNhbGwgdG8gVGVybWluYXRlLicsXG4gICAgfSxcbiAgICAnMTMyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnU3RvcmUgRGF0YSBCZWZvcmUgSW5pdGlhbGl6YXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gU2V0VmFsdWUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIEluaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICcxMzMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdTdG9yZSBEYXRhIEFmdGVyIFRlcm1pbmF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFNldFZhbHVlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGFmdGVyIHRoZSBjYWxsIHRvIFRlcm1pbmF0ZS4nLFxuICAgIH0sXG4gICAgJzE0Mic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0NvbW1pdCBCZWZvcmUgSW5pdGlhbGl6YXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gQ29tbWl0IGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnMTQzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnQ29tbWl0IEFmdGVyIFRlcm1pbmF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIENvbW1pdCBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBhZnRlciB0aGUgY2FsbCB0byBUZXJtaW5hdGUuJyxcbiAgICB9LFxuICAgICcyMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEFyZ3VtZW50IEVycm9yJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdBbiBpbnZhbGlkIGFyZ3VtZW50IHdhcyBwYXNzZWQgdG8gYW4gQVBJIG1ldGhvZCAodXN1YWxseSBpbmRpY2F0ZXMgdGhhdCBJbml0aWFsaXplLCBDb21taXQgb3IgVGVybWluYXRlIGRpZCBub3QgcmVjZWl2ZSB0aGUgZXhwZWN0ZWQgZW1wdHkgc3RyaW5nIGFyZ3VtZW50LicsXG4gICAgfSxcbiAgICAnMzAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBHZXQgRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIGEgZmFpbGVkIEdldFZhbHVlIGNhbGwgd2hlcmUgbm8gb3RoZXIgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBhcHBsaWNhYmxlLiBVc2UgR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgIH0sXG4gICAgJzM1MSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgU2V0IEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyBhIGZhaWxlZCBTZXRWYWx1ZSBjYWxsIHdoZXJlIG5vIG90aGVyIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgYXBwbGljYWJsZS4gVXNlIEdldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICB9LFxuICAgICczOTEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIENvbW1pdCBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgYSBmYWlsZWQgQ29tbWl0IGNhbGwgd2hlcmUgbm8gb3RoZXIgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBhcHBsaWNhYmxlLiBVc2UgR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgIH0sXG4gICAgJzQwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1VuZGVmaW5lZCBEYXRhIE1vZGVsIEVsZW1lbnQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBkYXRhIG1vZGVsIGVsZW1lbnQgbmFtZSBwYXNzZWQgdG8gR2V0VmFsdWUgb3IgU2V0VmFsdWUgaXMgbm90IGEgdmFsaWQgU0NPUk0gZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDAyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnVW5pbXBsZW1lbnRlZCBEYXRhIE1vZGVsIEVsZW1lbnQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBkYXRhIG1vZGVsIGVsZW1lbnQgaW5kaWNhdGVkIGluIGEgY2FsbCB0byBHZXRWYWx1ZSBvciBTZXRWYWx1ZSBpcyB2YWxpZCwgYnV0IHdhcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBMTVMuIEluIFNDT1JNIDIwMDQsIHRoaXMgZXJyb3Igd291bGQgaW5kaWNhdGUgYW4gTE1TIHRoYXQgaXMgbm90IGZ1bGx5IFNDT1JNIGNvbmZvcm1hbnQuJyxcbiAgICB9LFxuICAgICc0MDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgVmFsdWUgTm90IEluaXRpYWxpemVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdBdHRlbXB0IHRvIHJlYWQgYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgYnkgdGhlIExNUyBvciB0aHJvdWdoIGEgU2V0VmFsdWUgY2FsbC4gVGhpcyBlcnJvciBjb25kaXRpb24gaXMgb2Z0ZW4gcmVhY2hlZCBkdXJpbmcgbm9ybWFsIGV4ZWN1dGlvbiBvZiBhIFNDTy4nLFxuICAgIH0sXG4gICAgJzQwNCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBJcyBSZWFkIE9ubHknLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1NldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGNhbiBvbmx5IGJlIHJlYWQuJyxcbiAgICB9LFxuICAgICc0MDUnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgSXMgV3JpdGUgT25seScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnR2V0VmFsdWUgd2FzIGNhbGxlZCBvbiBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gdG8uJyxcbiAgICB9LFxuICAgICc0MDYnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgVHlwZSBNaXNtYXRjaCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnU2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgdmFsdWUgdGhhdCBpcyBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgc3VwcGxpZWQgZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDA3Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IFZhbHVlIE91dCBPZiBSYW5nZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIG51bWVyaWMgdmFsdWUgc3VwcGxpZWQgdG8gYSBTZXRWYWx1ZSBjYWxsIGlzIG91dHNpZGUgb2YgdGhlIG51bWVyaWMgcmFuZ2UgYWxsb3dlZCBmb3IgdGhlIHN1cHBsaWVkIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwOCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRGVwZW5kZW5jeSBOb3QgRXN0YWJsaXNoZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1NvbWUgZGF0YSBtb2RlbCBlbGVtZW50cyBjYW5ub3QgYmUgc2V0IHVudGlsIGFub3RoZXIgZGF0YSBtb2RlbCBlbGVtZW50IHdhcyBzZXQuIFRoaXMgZXJyb3IgY29uZGl0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBwcmVyZXF1aXNpdGUgZWxlbWVudCB3YXMgbm90IHNldCBiZWZvcmUgdGhlIGRlcGVuZGVudCBlbGVtZW50LicsXG4gICAgfSxcbiAgfSxcbn07XG4iLCIvLyBAZmxvd1xuZXhwb3J0IGNvbnN0IGVycm9yX2NvZGVzID0ge1xuICBHRU5FUkFMOiAxMDEsXG4gIElOSVRJQUxJWkFUSU9OX0ZBSUxFRDogMTAxLFxuICBJTklUSUFMSVpFRDogMTAxLFxuICBURVJNSU5BVEVEOiAxMDEsXG4gIFRFUk1JTkFUSU9OX0ZBSUxVUkU6IDEwMSxcbiAgVEVSTUlOQVRJT05fQkVGT1JFX0lOSVQ6IDEwMSxcbiAgTVVMVElQTEVfVEVSTUlOQVRJT046IDEwMSxcbiAgUkVUUklFVkVfQkVGT1JFX0lOSVQ6IDEwMSxcbiAgUkVUUklFVkVfQUZURVJfVEVSTTogMTAxLFxuICBTVE9SRV9CRUZPUkVfSU5JVDogMTAxLFxuICBTVE9SRV9BRlRFUl9URVJNOiAxMDEsXG4gIENPTU1JVF9CRUZPUkVfSU5JVDogMTAxLFxuICBDT01NSVRfQUZURVJfVEVSTTogMTAxLFxuICBBUkdVTUVOVF9FUlJPUjogMTAxLFxuICBDSElMRFJFTl9FUlJPUjogMTAxLFxuICBDT1VOVF9FUlJPUjogMTAxLFxuICBHRU5FUkFMX0dFVF9GQUlMVVJFOiAxMDEsXG4gIEdFTkVSQUxfU0VUX0ZBSUxVUkU6IDEwMSxcbiAgR0VORVJBTF9DT01NSVRfRkFJTFVSRTogMTAxLFxuICBVTkRFRklORURfREFUQV9NT0RFTDogMTAxLFxuICBVTklNUExFTUVOVEVEX0VMRU1FTlQ6IDEwMSxcbiAgVkFMVUVfTk9UX0lOSVRJQUxJWkVEOiAxMDEsXG4gIElOVkFMSURfU0VUX1ZBTFVFOiAxMDEsXG4gIFJFQURfT05MWV9FTEVNRU5UOiAxMDEsXG4gIFdSSVRFX09OTFlfRUxFTUVOVDogMTAxLFxuICBUWVBFX01JU01BVENIOiAxMDEsXG4gIFZBTFVFX09VVF9PRl9SQU5HRTogMTAxLFxuICBERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRDogMTAxLFxufTtcblxuZXhwb3J0IGNvbnN0IHNjb3JtMTJfZXJyb3JfY29kZXMgPSB7XG4gIC4uLmVycm9yX2NvZGVzLCAuLi57XG4gICAgUkVUUklFVkVfQkVGT1JFX0lOSVQ6IDMwMSxcbiAgICBTVE9SRV9CRUZPUkVfSU5JVDogMzAxLFxuICAgIENPTU1JVF9CRUZPUkVfSU5JVDogMzAxLFxuICAgIEFSR1VNRU5UX0VSUk9SOiAyMDEsXG4gICAgQ0hJTERSRU5fRVJST1I6IDIwMixcbiAgICBDT1VOVF9FUlJPUjogMjAzLFxuICAgIFVOREVGSU5FRF9EQVRBX01PREVMOiA0MDEsXG4gICAgVU5JTVBMRU1FTlRFRF9FTEVNRU5UOiA0MDEsXG4gICAgVkFMVUVfTk9UX0lOSVRJQUxJWkVEOiAzMDEsXG4gICAgSU5WQUxJRF9TRVRfVkFMVUU6IDQwMixcbiAgICBSRUFEX09OTFlfRUxFTUVOVDogNDAzLFxuICAgIFdSSVRFX09OTFlfRUxFTUVOVDogNDA0LFxuICAgIFRZUEVfTUlTTUFUQ0g6IDQwNSxcbiAgICBWQUxVRV9PVVRfT0ZfUkFOR0U6IDQwNyxcbiAgICBERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRDogNDA4LFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHNjb3JtMjAwNF9lcnJvcl9jb2RlcyA9IHtcbiAgLi4uZXJyb3JfY29kZXMsIC4uLntcbiAgICBJTklUSUFMSVpBVElPTl9GQUlMRUQ6IDEwMixcbiAgICBJTklUSUFMSVpFRDogMTAzLFxuICAgIFRFUk1JTkFURUQ6IDEwNCxcbiAgICBURVJNSU5BVElPTl9GQUlMVVJFOiAxMTEsXG4gICAgVEVSTUlOQVRJT05fQkVGT1JFX0lOSVQ6IDExMixcbiAgICBNVUxUSVBMRV9URVJNSU5BVElPTlM6IDExMyxcbiAgICBSRVRSSUVWRV9CRUZPUkVfSU5JVDogMTIyLFxuICAgIFJFVFJJRVZFX0FGVEVSX1RFUk06IDEyMyxcbiAgICBTVE9SRV9CRUZPUkVfSU5JVDogMTMyLFxuICAgIFNUT1JFX0FGVEVSX1RFUk06IDEzMyxcbiAgICBDT01NSVRfQkVGT1JFX0lOSVQ6IDE0MixcbiAgICBDT01NSVRfQUZURVJfVEVSTTogMTQzLFxuICAgIEFSR1VNRU5UX0VSUk9SOiAyMDEsXG4gICAgR0VORVJBTF9HRVRfRkFJTFVSRTogMzAxLFxuICAgIEdFTkVSQUxfU0VUX0ZBSUxVUkU6IDM1MSxcbiAgICBHRU5FUkFMX0NPTU1JVF9GQUlMVVJFOiAzOTEsXG4gICAgVU5ERUZJTkVEX0RBVEFfTU9ERUw6IDQwMSxcbiAgICBVTklNUExFTUVOVEVEX0VMRU1FTlQ6IDQwMixcbiAgICBWQUxVRV9OT1RfSU5JVElBTElaRUQ6IDQwMyxcbiAgICBSRUFEX09OTFlfRUxFTUVOVDogNDA0LFxuICAgIFdSSVRFX09OTFlfRUxFTUVOVDogNDA1LFxuICAgIFRZUEVfTUlTTUFUQ0g6IDQwNixcbiAgICBWQUxVRV9PVVRfT0ZfUkFOR0U6IDQwNyxcbiAgICBERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRDogNDA4LFxuICB9LFxufTtcbiIsImNvbnN0IGNvbW1vbl92YWx1ZXMgPSB7XG4gIHZhbGlkUmVzdWx0OiBbXG4gICAgJ2NvcnJlY3QnLFxuICAgICd3cm9uZycsXG4gICAgJ3VuYW50aWNpcGF0ZWQnLFxuICAgICduZXV0cmFsJyxcbiAgXSxcbiAgaW52YWxpZFJlc3VsdDogW1xuICAgICctMTAwMDAnLFxuICAgICcxMDAwMCcsXG4gICAgJ2ludmFsaWQnLFxuICBdLFxuXG4gIHZhbGlkMFRvMVJhbmdlOiBbXG4gICAgJzAuMCcsXG4gICAgJzAuMjUnLFxuICAgICcwLjUnLFxuICAgICcxLjAnLFxuICBdLFxuICBpbnZhbGlkMFRvMVJhbmdlOiBbXG4gICAgJy0xJyxcbiAgICAnLTAuMScsXG4gICAgJzEuMScsXG4gICAgJy4yNScsXG4gIF0sXG5cbiAgdmFsaWQwVG8xMDBSYW5nZTogW1xuICAgICcxJyxcbiAgICAnNTAnLFxuICAgICcxMDAnLFxuICBdLFxuICBpbnZhbGlkMFRvMTAwUmFuZ2U6IFtcbiAgICAnaW52YWxpZCcsXG4gICAgJ2ExMDAnLFxuICAgICctMScsXG4gIF0sXG5cbiAgdmFsaWRTY2FsZWRSYW5nZTogW1xuICAgICcxJyxcbiAgICAnMC41JyxcbiAgICAnMCcsXG4gICAgJy0wLjUnLFxuICAgICctMScsXG4gIF0sXG4gIGludmFsaWRTY2FsZWRSYW5nZTogW1xuICAgICctMTAxJyxcbiAgICAnMjUuMScsXG4gICAgJzUwLjUnLFxuICAgICc3NScsXG4gICAgJzEwMCcsXG4gIF0sXG5cbiAgdmFsaWRJbnRlZ2VyU2NhbGVkUmFuZ2U6IFtcbiAgICAnMScsXG4gICAgJzAnLFxuICAgICctMScsXG4gIF0sXG4gIGludmFsaWRJbnRlZ2VyU2NhbGVkUmFuZ2U6IFtcbiAgICAnLTEwMScsXG4gICAgJy0wLjUnLFxuICAgICcwLjUnLFxuICAgICcyNS4xJyxcbiAgICAnNTAuNScsXG4gICAgJzc1JyxcbiAgICAnMTAwJyxcbiAgXSxcbn07XG5cbmV4cG9ydCBjb25zdCBzY29ybTEyX3ZhbHVlcyA9IHtcbiAgLi4uY29tbW9uX3ZhbHVlcywgLi4ue1xuICAgIHZhbGlkTGVzc29uU3RhdHVzOiBbXG4gICAgICAncGFzc2VkJyxcbiAgICAgICdjb21wbGV0ZWQnLFxuICAgICAgJ2ZhaWxlZCcsXG4gICAgICAnaW5jb21wbGV0ZScsXG4gICAgICAnYnJvd3NlZCcsXG4gICAgXSxcbiAgICBpbnZhbGlkTGVzc29uU3RhdHVzOiBbXG4gICAgICAnUGFzc2VkJyxcbiAgICAgICdQJyxcbiAgICAgICdGJyxcbiAgICAgICdwJyxcbiAgICAgICd0cnVlJyxcbiAgICAgICdmYWxzZScsXG4gICAgICAnY29tcGxldGUnLFxuICAgIF0sXG5cbiAgICB2YWxpZEV4aXQ6IFtcbiAgICAgICd0aW1lLW91dCcsXG4gICAgICAnc3VzcGVuZCcsXG4gICAgICAnbG9nb3V0JyxcbiAgICBdLFxuICAgIGludmFsaWRFeGl0OiBbXG4gICAgICAnY2xvc2UnLFxuICAgICAgJ2V4aXQnLFxuICAgICAgJ2NyYXNoJyxcbiAgICBdLFxuXG4gICAgdmFsaWRUeXBlOiBbXG4gICAgICAndHJ1ZS1mYWxzZScsXG4gICAgICAnY2hvaWNlJyxcbiAgICAgICdmaWxsLWluJyxcbiAgICAgICdtYXRjaGluZycsXG4gICAgICAncGVyZm9ybWFuY2UnLFxuICAgICAgJ3NlcXVlbmNpbmcnLFxuICAgICAgJ2xpa2VydCcsXG4gICAgICAnbnVtZXJpYycsXG4gICAgXSxcbiAgICBpbnZhbGlkVHlwZTogW1xuICAgICAgJ2NvcnJlY3QnLFxuICAgICAgJ3dyb25nJyxcbiAgICAgICdsb2dvdXQnLFxuICAgIF0sXG5cbiAgICB2YWxpZFNwZWVkUmFuZ2U6IFtcbiAgICAgICcxJyxcbiAgICAgICc1MCcsXG4gICAgICAnMTAwJyxcbiAgICAgICctMScsXG4gICAgICAnLTUwJyxcbiAgICAgICctMTAwJyxcbiAgICBdLFxuICAgIGludmFsaWRTcGVlZFJhbmdlOiBbXG4gICAgICAnaW52YWxpZCcsXG4gICAgICAnYTEwMCcsXG4gICAgICAnLTEwMScsXG4gICAgICAnMTAxJyxcbiAgICAgICctMTAwMDAwJyxcbiAgICAgICcxMDAwMDAnLFxuICAgIF0sXG5cbiAgICB2YWxpZFNjb3JlUmFuZ2U6IFtcbiAgICAgICcxJyxcbiAgICAgICc1MC4yNScsXG4gICAgICAnMTAwJyxcbiAgICBdLFxuICAgIGludmFsaWRTY29yZVJhbmdlOiBbXG4gICAgICAnaW52YWxpZCcsXG4gICAgICAnYTEwMCcsXG4gICAgICAnLTEnLFxuICAgICAgJzEwMScsXG4gICAgICAnLTEwMDAwMCcsXG4gICAgICAnMTAwMDAwJyxcbiAgICBdLFxuICAgIGludmFsaWQwVG8xMDBSYW5nZTogW1xuICAgICAgJ2ludmFsaWQnLFxuICAgICAgJ2ExMDAnLFxuICAgICAgJy0yJyxcbiAgICBdLFxuXG4gICAgdmFsaWRUaW1lOiBbXG4gICAgICAnMTA6MDY6NTcnLFxuICAgICAgJzIzOjU5OjU5JyxcbiAgICAgICcwMDowMDowMCcsXG4gICAgXSxcbiAgICBpbnZhbGlkVGltZTogW1xuICAgICAgJzQ3OjU5OjU5JyxcbiAgICAgICcwMDowMDowMS41NicsXG4gICAgICAnMDY6NToxMycsXG4gICAgICAnMjM6NTk6NTkuMTIzJyxcbiAgICAgICdQMURUMjNINTlNNTlTJyxcbiAgICBdLFxuXG4gICAgdmFsaWRUaW1lc3BhbjogW1xuICAgICAgJzEwOjA2OjU3JyxcbiAgICAgICcwMDowMDowMS41NicsXG4gICAgICAnMjM6NTk6NTknLFxuICAgICAgJzQ3OjU5OjU5JyxcbiAgICBdLFxuICAgIGludmFsaWRUaW1lc3BhbjogW1xuICAgICAgJzA2OjU6MTMnLFxuICAgICAgJzIzOjU5OjU5LjEyMycsXG4gICAgICAnUDFEVDIzSDU5TTU5UycsXG4gICAgXSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzY29ybTIwMDRfdmFsdWVzID0ge1xuICAuLi5jb21tb25fdmFsdWVzLCAuLi57XG4gICAgLy8gdmFsaWQgZmllbGQgdmFsdWVzXG4gICAgdmFsaWRUaW1lc3RhbXBzOiBbXG4gICAgICAnMjAxOS0wNi0yNScsXG4gICAgICAnMjAxOS0wNi0yNVQyMzo1OScsXG4gICAgICAnMjAxOS0wNi0yNVQyMzo1OTo1OS45OScsXG4gICAgICAnMTk3MC0wMS0wMScsXG4gICAgXSxcbiAgICBpbnZhbGlkVGltZXN0YW1wczogW1xuICAgICAgJzIwMTktMDYtMjVUJyxcbiAgICAgICcyMDE5LTA2LTI1VDIzOjU5OjU5Ljk5OScsXG4gICAgICAnMjAxOS0wNi0yNVQyNTo1OTo1OS45OScsXG4gICAgICAnMjAxOS0xMy0zMScsXG4gICAgICAnMTk2OS0xMi0zMScsXG4gICAgICAnLTAwOjAwOjMwJyxcbiAgICAgICcwOjUwOjMwJyxcbiAgICAgICcyMzowMDozMC4nLFxuICAgIF0sXG5cbiAgICB2YWxpZENTdGF0dXM6IFtcbiAgICAgICdjb21wbGV0ZWQnLFxuICAgICAgJ2luY29tcGxldGUnLFxuICAgICAgJ25vdCBhdHRlbXB0ZWQnLFxuICAgICAgJ3Vua25vd24nLFxuICAgIF0sXG4gICAgaW52YWxpZENTdGF0dXM6IFtcbiAgICAgICdjb21wbGV0ZScsXG4gICAgICAncGFzc2VkJyxcbiAgICAgICdmYWlsZWQnLFxuICAgIF0sXG5cbiAgICB2YWxpZFNTdGF0dXM6IFtcbiAgICAgICdwYXNzZWQnLFxuICAgICAgJ2ZhaWxlZCcsXG4gICAgICAndW5rbm93bicsXG4gICAgXSxcbiAgICBpbnZhbGlkU1N0YXR1czogW1xuICAgICAgJ2NvbXBsZXRlJyxcbiAgICAgICdpbmNvbXBsZXRlJyxcbiAgICAgICdQJyxcbiAgICAgICdmJyxcbiAgICBdLFxuXG4gICAgdmFsaWRFeGl0OiBbXG4gICAgICAndGltZS1vdXQnLFxuICAgICAgJ3N1c3BlbmQnLFxuICAgICAgJ2xvZ291dCcsXG4gICAgICAnbm9ybWFsJyxcbiAgICBdLFxuICAgIGludmFsaWRFeGl0OiBbXG4gICAgICAnY2xvc2UnLFxuICAgICAgJ2V4aXQnLFxuICAgICAgJ2NyYXNoJyxcbiAgICBdLFxuXG4gICAgdmFsaWRUeXBlOiBbXG4gICAgICAndHJ1ZS1mYWxzZScsXG4gICAgICAnY2hvaWNlJyxcbiAgICAgICdmaWxsLWluJyxcbiAgICAgICdsb25nLWZpbGwtaW4nLFxuICAgICAgJ21hdGNoaW5nJyxcbiAgICAgICdwZXJmb3JtYW5jZScsXG4gICAgICAnc2VxdWVuY2luZycsXG4gICAgICAnbGlrZXJ0JyxcbiAgICAgICdudW1lcmljJyxcbiAgICAgICdvdGhlcicsXG4gICAgXSxcbiAgICBpbnZhbGlkVHlwZTogW1xuICAgICAgJ2NvcnJlY3QnLFxuICAgICAgJ3dyb25nJyxcbiAgICAgICdsb2dvdXQnLFxuICAgIF0sXG5cbiAgICB2YWxpZFNjb3JlUmFuZ2U6IFtcbiAgICAgICcxJyxcbiAgICAgICc1MCcsXG4gICAgICAnMTAwJyxcbiAgICAgICctMTAwMDAnLFxuICAgICAgJy0xJyxcbiAgICAgICcxMDAwMCcsXG4gICAgXSxcbiAgICBpbnZhbGlkU2NvcmVSYW5nZTogW1xuICAgICAgJ2ludmFsaWQnLFxuICAgICAgJ2ExMDAnLFxuICAgICAgJy0xMDAwMDAnLFxuICAgICAgJzEwMDAwMCcsXG4gICAgXSxcblxuICAgIHZhbGlkSVNPODYwMUR1cmF0aW9uczogW1xuICAgICAgJ1AxWTM0RFQyM0g0NU0xNVMnLFxuICAgICAgJ1BUMU00NVMnLFxuICAgICAgJ1AwUycsXG4gICAgICAnUFQ3NU0nLFxuICAgIF0sXG4gICAgaW52YWxpZElTTzg2MDFEdXJhdGlvbnM6IFtcbiAgICAgICcwMDowODo0NScsXG4gICAgICAnLVAxSCcsXG4gICAgICAnMXk0NUQnLFxuICAgICAgJzAnLFxuICAgIF0sXG5cbiAgICB2YWxpZENvbW1lbnQ6IFtcbiAgICAgICd7bGFuZz1lbi05OH0gbGVhcm5lciBjb21tZW50JyxcbiAgICAgICd7bGFuZz1lbmctOTgtOX0gbGVhcm5lciBjb21tZW50JyxcbiAgICAgICd7bGFuZz1lbmctOTgtOWZoZ2p9JyArICd4Jy5yZXBlYXQoNDAwMCksXG4gICAgICAnbGVhcm5lciBjb21tZW50JyxcbiAgICAgICdsZWFybmVyIGNvbW1lbnR9JyxcbiAgICAgICd7bGFuZz1pLXh4fScsXG4gICAgICAne2xhbmc9aX0nLFxuICAgICAgJycsXG4gICAgXSxcbiAgICBpbnZhbGlkQ29tbWVudDogW1xuICAgICAgJ3tsYW5nPWktfScsXG4gICAgICAne2xhbmc9aS14fScsXG4gICAgICAne2xhbmc9ZW5nLTk4LTlmaGdqfXsgbGVhcm5lciBjb21tZW50JyxcbiAgICAgICd7bGVhcm5lciBjb21tZW50JyxcbiAgICAgICd7bGFuZz1lbmctOTgtOWZoZ2p9JyArICd4Jy5yZXBlYXQoNDAwMSksXG4gICAgICAne2xhbmc9ZW5nLTk4LTlmaGdqfXsnICsgJ3gnLnJlcGVhdCgzOTk5KSxcbiAgICBdLFxuXG4gICAgdmFsaWREZXNjcmlwdGlvbjogW1xuICAgICAgJ3tsYW5nPWVuLTk4fSBsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ3tsYW5nPWVuZy05OC05fSBsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ3tsYW5nPWVuZy05OC05Zmhnan0nICsgJ3gnLnJlcGVhdCgyNTApLFxuICAgICAgJ2xlYXJuZXIgY29tbWVudCcsXG4gICAgICAnbGVhcm5lciBjb21tZW50fScsXG4gICAgICAne2xhbmc9aS14eH0nLFxuICAgICAgJ3tsYW5nPWl9JyxcbiAgICAgICcnLFxuICAgIF0sXG4gICAgaW52YWxpZERlc2NyaXB0aW9uOiBbXG4gICAgICAne2xhbmc9aS19JyxcbiAgICAgICd7bGFuZz1pLXh9JyxcbiAgICAgICd7bGFuZz1lbmctOTgtOWZoZ2p9eyBsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ3tsZWFybmVyIGNvbW1lbnQnLFxuICAgICAgJ3tsYW5nPWVuZy05OC05Zmhnan0nICsgJ3gnLnJlcGVhdCgyNTEpLFxuICAgICAgJ3tsYW5nPWVuZy05OC05Zmhnan17JyArICd4Jy5yZXBlYXQoMjQ5KSxcbiAgICBdLFxuXG4gICAgdmFsaWROYXZSZXF1ZXN0OiBbXG4gICAgICAncHJldmlvdXMnLFxuICAgICAgJ2NvbnRpbnVlJyxcbiAgICAgICdleGl0JyxcbiAgICAgICdleGl0QWxsJyxcbiAgICAgICdhYmFuZG9uJyxcbiAgICAgICdhYmFuZG9uQWxsJyxcbiAgICAgICdzdXNwZW5kQWxsJyxcbiAgICBdLFxuICAgIGludmFsaWROYXZSZXF1ZXN0OiBbXG4gICAgICAnY2xvc2UnLFxuICAgICAgJ3F1aXQnLFxuICAgICAgJ25leHQnLFxuICAgICAgJ2JlZm9yZScsXG4gICAgXSxcbiAgfSxcbn07XG4iLCJleHBvcnQgY29uc3QgdmFsaWRfbGFuZ3VhZ2VzID0ge1xuICAnYWEnOiAnYWEnLCAnYWInOiAnYWInLCAnYWUnOiAnYWUnLCAnYWYnOiAnYWYnLCAnYWsnOiAnYWsnLCAnYW0nOiAnYW0nLFxuICAnYW4nOiAnYW4nLCAnYXInOiAnYXInLCAnYXMnOiAnYXMnLCAnYXYnOiAnYXYnLCAnYXknOiAnYXknLCAnYXonOiAnYXonLFxuICAnYmEnOiAnYmEnLCAnYmUnOiAnYmUnLCAnYmcnOiAnYmcnLCAnYmgnOiAnYmgnLCAnYmknOiAnYmknLCAnYm0nOiAnYm0nLFxuICAnYm4nOiAnYm4nLCAnYm8nOiAnYm8nLCAnYnInOiAnYnInLCAnYnMnOiAnYnMnLCAnY2EnOiAnY2EnLCAnY2UnOiAnY2UnLFxuICAnY2gnOiAnY2gnLCAnY28nOiAnY28nLCAnY3InOiAnY3InLCAnY3MnOiAnY3MnLCAnY3UnOiAnY3UnLCAnY3YnOiAnY3YnLFxuICAnY3knOiAnY3knLCAnZGEnOiAnZGEnLCAnZGUnOiAnZGUnLCAnZHYnOiAnZHYnLCAnZHonOiAnZHonLCAnZWUnOiAnZWUnLFxuICAnZWwnOiAnZWwnLCAnZW4nOiAnZW4nLCAnZW8nOiAnZW8nLCAnZXMnOiAnZXMnLCAnZXQnOiAnZXQnLCAnZXUnOiAnZXUnLFxuICAnZmEnOiAnZmEnLCAnZmYnOiAnZmYnLCAnZmknOiAnZmknLCAnZmonOiAnZmonLCAnZm8nOiAnZm8nLCAnZnInOiAnZnInLFxuICAnZnknOiAnZnknLCAnZ2EnOiAnZ2EnLCAnZ2QnOiAnZ2QnLCAnZ2wnOiAnZ2wnLCAnZ24nOiAnZ24nLCAnZ3UnOiAnZ3UnLFxuICAnZ3YnOiAnZ3YnLCAnaGEnOiAnaGEnLCAnaGUnOiAnaGUnLCAnaGknOiAnaGknLCAnaG8nOiAnaG8nLCAnaHInOiAnaHInLFxuICAnaHQnOiAnaHQnLCAnaHUnOiAnaHUnLCAnaHknOiAnaHknLCAnaHonOiAnaHonLCAnaWEnOiAnaWEnLCAnaWQnOiAnaWQnLFxuICAnaWUnOiAnaWUnLCAnaWcnOiAnaWcnLCAnaWknOiAnaWknLCAnaWsnOiAnaWsnLCAnaW8nOiAnaW8nLCAnaXMnOiAnaXMnLFxuICAnaXQnOiAnaXQnLCAnaXUnOiAnaXUnLCAnamEnOiAnamEnLCAnanYnOiAnanYnLCAna2EnOiAna2EnLCAna2cnOiAna2cnLFxuICAna2knOiAna2knLCAna2onOiAna2onLCAna2snOiAna2snLCAna2wnOiAna2wnLCAna20nOiAna20nLCAna24nOiAna24nLFxuICAna28nOiAna28nLCAna3InOiAna3InLCAna3MnOiAna3MnLCAna3UnOiAna3UnLCAna3YnOiAna3YnLCAna3cnOiAna3cnLFxuICAna3knOiAna3knLCAnbGEnOiAnbGEnLCAnbGInOiAnbGInLCAnbGcnOiAnbGcnLCAnbGknOiAnbGknLCAnbG4nOiAnbG4nLFxuICAnbG8nOiAnbG8nLCAnbHQnOiAnbHQnLCAnbHUnOiAnbHUnLCAnbHYnOiAnbHYnLCAnbWcnOiAnbWcnLCAnbWgnOiAnbWgnLFxuICAnbWknOiAnbWknLCAnbWsnOiAnbWsnLCAnbWwnOiAnbWwnLCAnbW4nOiAnbW4nLCAnbW8nOiAnbW8nLCAnbXInOiAnbXInLFxuICAnbXMnOiAnbXMnLCAnbXQnOiAnbXQnLCAnbXknOiAnbXknLCAnbmEnOiAnbmEnLCAnbmInOiAnbmInLCAnbmQnOiAnbmQnLFxuICAnbmUnOiAnbmUnLCAnbmcnOiAnbmcnLCAnbmwnOiAnbmwnLCAnbm4nOiAnbm4nLCAnbm8nOiAnbm8nLCAnbnInOiAnbnInLFxuICAnbnYnOiAnbnYnLCAnbnknOiAnbnknLCAnb2MnOiAnb2MnLCAnb2onOiAnb2onLCAnb20nOiAnb20nLCAnb3InOiAnb3InLFxuICAnb3MnOiAnb3MnLCAncGEnOiAncGEnLCAncGknOiAncGknLCAncGwnOiAncGwnLCAncHMnOiAncHMnLCAncHQnOiAncHQnLFxuICAncXUnOiAncXUnLCAncm0nOiAncm0nLCAncm4nOiAncm4nLCAncm8nOiAncm8nLCAncnUnOiAncnUnLCAncncnOiAncncnLFxuICAnc2EnOiAnc2EnLCAnc2MnOiAnc2MnLCAnc2QnOiAnc2QnLCAnc2UnOiAnc2UnLCAnc2cnOiAnc2cnLCAnc2gnOiAnc2gnLFxuICAnc2knOiAnc2knLCAnc2snOiAnc2snLCAnc2wnOiAnc2wnLCAnc20nOiAnc20nLCAnc24nOiAnc24nLCAnc28nOiAnc28nLFxuICAnc3EnOiAnc3EnLCAnc3InOiAnc3InLCAnc3MnOiAnc3MnLCAnc3QnOiAnc3QnLCAnc3UnOiAnc3UnLCAnc3YnOiAnc3YnLFxuICAnc3cnOiAnc3cnLCAndGEnOiAndGEnLCAndGUnOiAndGUnLCAndGcnOiAndGcnLCAndGgnOiAndGgnLCAndGknOiAndGknLFxuICAndGsnOiAndGsnLCAndGwnOiAndGwnLCAndG4nOiAndG4nLCAndG8nOiAndG8nLCAndHInOiAndHInLCAndHMnOiAndHMnLFxuICAndHQnOiAndHQnLCAndHcnOiAndHcnLCAndHknOiAndHknLCAndWcnOiAndWcnLCAndWsnOiAndWsnLCAndXInOiAndXInLFxuICAndXonOiAndXonLCAndmUnOiAndmUnLCAndmknOiAndmknLCAndm8nOiAndm8nLCAnd2EnOiAnd2EnLCAnd28nOiAnd28nLFxuICAneGgnOiAneGgnLCAneWknOiAneWknLCAneW8nOiAneW8nLCAnemEnOiAnemEnLCAnemgnOiAnemgnLCAnenUnOiAnenUnLFxuICAnYWFyJzogJ2FhcicsICdhYmsnOiAnYWJrJywgJ2F2ZSc6ICdhdmUnLCAnYWZyJzogJ2FmcicsICdha2EnOiAnYWthJyxcbiAgJ2FtaCc6ICdhbWgnLCAnYXJnJzogJ2FyZycsICdhcmEnOiAnYXJhJywgJ2FzbSc6ICdhc20nLCAnYXZhJzogJ2F2YScsXG4gICdheW0nOiAnYXltJywgJ2F6ZSc6ICdhemUnLCAnYmFrJzogJ2JhaycsICdiZWwnOiAnYmVsJywgJ2J1bCc6ICdidWwnLFxuICAnYmloJzogJ2JpaCcsICdiaXMnOiAnYmlzJywgJ2JhbSc6ICdiYW0nLCAnYmVuJzogJ2JlbicsICd0aWInOiAndGliJyxcbiAgJ2JvZCc6ICdib2QnLCAnYnJlJzogJ2JyZScsICdib3MnOiAnYm9zJywgJ2NhdCc6ICdjYXQnLCAnY2hlJzogJ2NoZScsXG4gICdjaGEnOiAnY2hhJywgJ2Nvcyc6ICdjb3MnLCAnY3JlJzogJ2NyZScsICdjemUnOiAnY3plJywgJ2Nlcyc6ICdjZXMnLFxuICAnY2h1JzogJ2NodScsICdjaHYnOiAnY2h2JywgJ3dlbCc6ICd3ZWwnLCAnY3ltJzogJ2N5bScsICdkYW4nOiAnZGFuJyxcbiAgJ2dlcic6ICdnZXInLCAnZGV1JzogJ2RldScsICdkaXYnOiAnZGl2JywgJ2R6byc6ICdkem8nLCAnZXdlJzogJ2V3ZScsXG4gICdncmUnOiAnZ3JlJywgJ2VsbCc6ICdlbGwnLCAnZW5nJzogJ2VuZycsICdlcG8nOiAnZXBvJywgJ3NwYSc6ICdzcGEnLFxuICAnZXN0JzogJ2VzdCcsICdiYXEnOiAnYmFxJywgJ2V1cyc6ICdldXMnLCAncGVyJzogJ3BlcicsICdmYXMnOiAnZmFzJyxcbiAgJ2Z1bCc6ICdmdWwnLCAnZmluJzogJ2ZpbicsICdmaWonOiAnZmlqJywgJ2Zhbyc6ICdmYW8nLCAnZnJlJzogJ2ZyZScsXG4gICdmcmEnOiAnZnJhJywgJ2ZyeSc6ICdmcnknLCAnZ2xlJzogJ2dsZScsICdnbGEnOiAnZ2xhJywgJ2dsZyc6ICdnbGcnLFxuICAnZ3JuJzogJ2dybicsICdndWonOiAnZ3VqJywgJ2dsdic6ICdnbHYnLCAnaGF1JzogJ2hhdScsICdoZWInOiAnaGViJyxcbiAgJ2hpbic6ICdoaW4nLCAnaG1vJzogJ2htbycsICdocnYnOiAnaHJ2JywgJ2hhdCc6ICdoYXQnLCAnaHVuJzogJ2h1bicsXG4gICdhcm0nOiAnYXJtJywgJ2h5ZSc6ICdoeWUnLCAnaGVyJzogJ2hlcicsICdpbmEnOiAnaW5hJywgJ2luZCc6ICdpbmQnLFxuICAnaWxlJzogJ2lsZScsICdpYm8nOiAnaWJvJywgJ2lpaSc6ICdpaWknLCAnaXBrJzogJ2lwaycsICdpZG8nOiAnaWRvJyxcbiAgJ2ljZSc6ICdpY2UnLCAnaXNsJzogJ2lzbCcsICdpdGEnOiAnaXRhJywgJ2lrdSc6ICdpa3UnLCAnanBuJzogJ2pwbicsXG4gICdqYXYnOiAnamF2JywgJ2dlbyc6ICdnZW8nLCAna2F0JzogJ2thdCcsICdrb24nOiAna29uJywgJ2tpayc6ICdraWsnLFxuICAna3VhJzogJ2t1YScsICdrYXonOiAna2F6JywgJ2thbCc6ICdrYWwnLCAna2htJzogJ2tobScsICdrYW4nOiAna2FuJyxcbiAgJ2tvcic6ICdrb3InLCAna2F1JzogJ2thdScsICdrYXMnOiAna2FzJywgJ2t1cic6ICdrdXInLCAna29tJzogJ2tvbScsXG4gICdjb3InOiAnY29yJywgJ2tpcic6ICdraXInLCAnbGF0JzogJ2xhdCcsICdsdHonOiAnbHR6JywgJ2x1Zyc6ICdsdWcnLFxuICAnbGltJzogJ2xpbScsICdsaW4nOiAnbGluJywgJ2xhbyc6ICdsYW8nLCAnbGl0JzogJ2xpdCcsICdsdWInOiAnbHViJyxcbiAgJ2xhdic6ICdsYXYnLCAnbWxnJzogJ21sZycsICdtYWgnOiAnbWFoJywgJ21hbyc6ICdtYW8nLCAnbXJpJzogJ21yaScsXG4gICdtYWMnOiAnbWFjJywgJ21rZCc6ICdta2QnLCAnbWFsJzogJ21hbCcsICdtb24nOiAnbW9uJywgJ21vbCc6ICdtb2wnLFxuICAnbWFyJzogJ21hcicsICdtYXknOiAnbWF5JywgJ21zYSc6ICdtc2EnLCAnbWx0JzogJ21sdCcsICdidXInOiAnYnVyJyxcbiAgJ215YSc6ICdteWEnLCAnbmF1JzogJ25hdScsICdub2InOiAnbm9iJywgJ25kZSc6ICduZGUnLCAnbmVwJzogJ25lcCcsXG4gICduZG8nOiAnbmRvJywgJ2R1dCc6ICdkdXQnLCAnbmxkJzogJ25sZCcsICdubm8nOiAnbm5vJywgJ25vcic6ICdub3InLFxuICAnbmJsJzogJ25ibCcsICduYXYnOiAnbmF2JywgJ255YSc6ICdueWEnLCAnb2NpJzogJ29jaScsICdvamknOiAnb2ppJyxcbiAgJ29ybSc6ICdvcm0nLCAnb3JpJzogJ29yaScsICdvc3MnOiAnb3NzJywgJ3Bhbic6ICdwYW4nLCAncGxpJzogJ3BsaScsXG4gICdwb2wnOiAncG9sJywgJ3B1cyc6ICdwdXMnLCAncG9yJzogJ3BvcicsICdxdWUnOiAncXVlJywgJ3JvaCc6ICdyb2gnLFxuICAncnVuJzogJ3J1bicsICdydW0nOiAncnVtJywgJ3Jvbic6ICdyb24nLCAncnVzJzogJ3J1cycsICdraW4nOiAna2luJyxcbiAgJ3Nhbic6ICdzYW4nLCAnc3JkJzogJ3NyZCcsICdzbmQnOiAnc25kJywgJ3NtZSc6ICdzbWUnLCAnc2FnJzogJ3NhZycsXG4gICdzbG8nOiAnc2xvJywgJ3Npbic6ICdzaW4nLCAnc2xrJzogJ3NsaycsICdzbHYnOiAnc2x2JywgJ3Ntbyc6ICdzbW8nLFxuICAnc25hJzogJ3NuYScsICdzb20nOiAnc29tJywgJ2FsYic6ICdhbGInLCAnc3FpJzogJ3NxaScsICdzcnAnOiAnc3JwJyxcbiAgJ3Nzdyc6ICdzc3cnLCAnc290JzogJ3NvdCcsICdzdW4nOiAnc3VuJywgJ3N3ZSc6ICdzd2UnLCAnc3dhJzogJ3N3YScsXG4gICd0YW0nOiAndGFtJywgJ3RlbCc6ICd0ZWwnLCAndGdrJzogJ3RnaycsICd0aGEnOiAndGhhJywgJ3Rpcic6ICd0aXInLFxuICAndHVrJzogJ3R1aycsICd0Z2wnOiAndGdsJywgJ3Rzbic6ICd0c24nLCAndG9uJzogJ3RvbicsICd0dXInOiAndHVyJyxcbiAgJ3Rzbyc6ICd0c28nLCAndGF0JzogJ3RhdCcsICd0d2knOiAndHdpJywgJ3RhaCc6ICd0YWgnLCAndWlnJzogJ3VpZycsXG4gICd1a3InOiAndWtyJywgJ3VyZCc6ICd1cmQnLCAndXpiJzogJ3V6YicsICd2ZW4nOiAndmVuJywgJ3ZpZSc6ICd2aWUnLFxuICAndm9sJzogJ3ZvbCcsICd3bG4nOiAnd2xuJywgJ3dvbCc6ICd3b2wnLCAneGhvJzogJ3hobycsICd5aWQnOiAneWlkJyxcbiAgJ3lvcic6ICd5b3InLCAnemhhJzogJ3poYScsICdjaGknOiAnY2hpJywgJ3pobyc6ICd6aG8nLCAnenVsJzogJ3p1bCcsXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtzY29ybTEyX3ZhbHVlcywgc2Nvcm0yMDA0X3ZhbHVlc30gZnJvbSAnLi9maWVsZF92YWx1ZXMnO1xuXG5leHBvcnQgY29uc3Qgc2Nvcm0xMl9yZWdleCA9IHtcbiAgQ01JU3RyaW5nMjU2OiAnXi57MCwyNTV9JCcsXG4gIENNSVN0cmluZzQwOTY6ICdeLnswLDQwOTZ9JCcsXG4gIENNSVRpbWU6ICdeKD86WzAxXVxcXFxkfDJbMDEyM10pOig/OlswMTIzNDVdXFxcXGQpOig/OlswMTIzNDVdXFxcXGQpJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JVGltZXNwYW46ICdeKFswLTldezIsfSk6KFswLTldezJ9KTooWzAtOV17Mn0pKFxcLlswLTldezEsMn0pPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUludGVnZXI6ICdeXFxcXGQrJCcsXG4gIENNSVNJbnRlZ2VyOiAnXi0/KFswLTldKykkJyxcbiAgQ01JRGVjaW1hbDogJ14tPyhbMC05XXswLDN9KShcXC5bMC05XSopPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUlkZW50aWZpZXI6ICdeW1xcXFx1MDAyMS1cXFxcdTAwN0VdezAsMjU1fSQnLFxuICBDTUlGZWVkYmFjazogJ14uezAsMjU1fSQnLCAvLyBUaGlzIG11c3QgYmUgcmVkZWZpbmVkXG4gIENNSUluZGV4OiAnWy5fXShcXFxcZCspLicsXG5cbiAgLy8gVm9jYWJ1bGFyeSBEYXRhIFR5cGUgRGVmaW5pdGlvblxuICBDTUlTdGF0dXM6ICdeKCcgKyBzY29ybTEyX3ZhbHVlcy52YWxpZExlc3NvblN0YXR1cy5qb2luKCd8JykgKyAnKSQnLFxuICBDTUlTdGF0dXMyOiAnXignICsgc2Nvcm0xMl92YWx1ZXMudmFsaWRMZXNzb25TdGF0dXMuam9pbignfCcpICsgJ3xub3QgYXR0ZW1wdGVkKSQnLFxuICBDTUlFeGl0OiAnXignICsgc2Nvcm0xMl92YWx1ZXMudmFsaWRFeGl0LmpvaW4oJ3wnKSArICd8KSQnLFxuICBDTUlUeXBlOiAnXignICsgc2Nvcm0xMl92YWx1ZXMudmFsaWRUeXBlLmpvaW4oJ3wnKSArICcpJCcsXG4gIENNSVJlc3VsdDogJ14oJyArIHNjb3JtMTJfdmFsdWVzLnZhbGlkUmVzdWx0LmpvaW4oJ3wnKSArICd8KFswLTldezAsM30pPyhcXFxcLlswLTldKik/KSQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIE5BVkV2ZW50OiAnXihwcmV2aW91c3xjb250aW51ZSkkJyxcblxuICAvLyBEYXRhIHJhbmdlc1xuICBzY29yZV9yYW5nZTogJzAjMTAwJyxcbiAgYXVkaW9fcmFuZ2U6ICctMSMxMDAnLFxuICBzcGVlZF9yYW5nZTogJy0xMDAjMTAwJyxcbiAgd2VpZ2h0aW5nX3JhbmdlOiAnLTEwMCMxMDAnLFxuICB0ZXh0X3JhbmdlOiAnLTEjMScsXG59O1xuXG5leHBvcnQgY29uc3QgYWljY19yZWdleCA9IHtcbiAgLi4uc2Nvcm0xMl9yZWdleCwgLi4ue1xuICAgIENNSUlkZW50aWZpZXI6ICdeXFxcXHd7MSwyNTV9JCcsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2Nvcm0yMDA0X3JlZ2V4ID0ge1xuICBDTUlTdHJpbmcyMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsMjAwfSQnLFxuICBDTUlTdHJpbmcyNTA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsMjUwfSQnLFxuICBDTUlTdHJpbmcxMDAwOiAnXltcXFxcdTAwMDAtXFxcXHVGRkZGXXswLDEwMDB9JCcsXG4gIENNSVN0cmluZzQwMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsNDAwMH0kJyxcbiAgQ01JU3RyaW5nNjQwMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsNjQwMDB9JCcsXG4gIENNSUxhbmc6ICdeKFthLXpBLVpdezIsM318aXx4KShcXC1bYS16QS1aMC05XFwtXXsyLDh9KT8kfF4kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nU3RyaW5nMjUwOiAnXihcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCkoXFwtW2EtekEtWjAtOVxcLV17Miw4fSk/XFx9KT8oKD8hXFx7LiokKS57MCwyNTB9JCk/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTGFuZ2NyOiAnXigoXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpPyhcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pKSguKj8pJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTGFuZ1N0cmluZzI1MGNyOiAnXigoXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpPyhcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pPyguezAsMjUwfSk/KT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nU3RyaW5nNDAwMDogJ14oXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpKFxcLVthLXpBLVowLTlcXC1dezIsOH0pP1xcfSk/KCg/IVxcey4qJCkuezAsNDAwMH0kKT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlUaW1lOiAnXigxOVs3LTldezF9WzAtOV17MX18MjBbMC0yXXsxfVswLTldezF9fDIwM1swLThdezF9KSgoLSgwWzEtOV17MX18MVswLTJdezF9KSkoKC0oMFsxLTldezF9fFsxLTJdezF9WzAtOV17MX18M1swLTFdezF9KSkoVChbMC0xXXsxfVswLTldezF9fDJbMC0zXXsxfSkoKDpbMC01XXsxfVswLTldezF9KSgoOlswLTVdezF9WzAtOV17MX0pKChcXFxcLlswLTldezEsMn0pKChafChbK3wtXShbMC0xXXsxfVswLTldezF9fDJbMC0zXXsxfSkpKSg6WzAtNV17MX1bMC05XXsxfSk/KT8pPyk/KT8pPyk/KT8kJyxcbiAgQ01JVGltZXNwYW46ICdeUCg/OihbLixcXFxcZF0rKVkpPyg/OihbLixcXFxcZF0rKU0pPyg/OihbLixcXFxcZF0rKVcpPyg/OihbLixcXFxcZF0rKUQpPyg/OlQ/KD86KFsuLFxcXFxkXSspSCk/KD86KFsuLFxcXFxkXSspTSk/KD86KFsuLFxcXFxkXSspUyk/KT8kJyxcbiAgQ01JSW50ZWdlcjogJ15cXFxcZCskJyxcbiAgQ01JU0ludGVnZXI6ICdeLT8oWzAtOV0rKSQnLFxuICBDTUlEZWNpbWFsOiAnXi0/KFswLTldezEsNX0pKFxcXFwuWzAtOV17MSwxOH0pPyQnLFxuICBDTUlJZGVudGlmaWVyOiAnXlxcXFxTezEsMjUwfVthLXpBLVowLTldJCcsXG4gIENNSVNob3J0SWRlbnRpZmllcjogJ15bXFxcXHdcXC5dezEsMjUwfSQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxvbmdJZGVudGlmaWVyOiAnXig/Oig/IXVybjopXFxcXFN7MSw0MDAwfXx1cm46W0EtWmEtejAtOS1dezEsMzF9OlxcXFxTezEsNDAwMH0pJCcsXG4gIENNSUZlZWRiYWNrOiAnXi4qJCcsIC8vIFRoaXMgbXVzdCBiZSByZWRlZmluZWRcbiAgQ01JSW5kZXg6ICdbLl9dKFxcXFxkKykuJyxcbiAgQ01JSW5kZXhTdG9yZTogJy5OKFxcXFxkKykuJyxcblxuICAvLyBWb2NhYnVsYXJ5IERhdGEgVHlwZSBEZWZpbml0aW9uXG4gIENNSUNTdGF0dXM6ICdeKCcgKyBzY29ybTIwMDRfdmFsdWVzLnZhbGlkQ1N0YXR1cy5qb2luKCd8JykgKyAnKSQnLFxuICBDTUlTU3RhdHVzOiAnXignICsgc2Nvcm0yMDA0X3ZhbHVlcy52YWxpZFNTdGF0dXMuam9pbignfCcpICsgJykkJyxcbiAgQ01JRXhpdDogJ14oJyArIHNjb3JtMjAwNF92YWx1ZXMudmFsaWRFeGl0LmpvaW4oJ3wnKSArICcpJCcsXG4gIENNSVR5cGU6ICdeKCcgKyBzY29ybTIwMDRfdmFsdWVzLnZhbGlkVHlwZS5qb2luKCd8JykgKyAnKSQnLFxuICBDTUlSZXN1bHQ6ICdeKCcgKyBzY29ybTIwMDRfdmFsdWVzLnZhbGlkUmVzdWx0LmpvaW4oJ3wnKSArICd8LT8oWzAtOV17MSw0fSkoXFxcXC5bMC05XXsxLDE4fSk/KSQnLFxuICBOQVZFdmVudDogJ14oJyArIHNjb3JtMjAwNF92YWx1ZXMudmFsaWROYXZSZXF1ZXN0LmpvaW4oJ3wnKSArICd8XFx7dGFyZ2V0PVxcXFxTezAsMjAwfVthLXpBLVowLTldXFx9Y2hvaWNlfGp1bXApJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgTkFWQm9vbGVhbjogJ14odW5rbm93bnx0cnVlfGZhbHNlJCknLFxuICBOQVZUYXJnZXQ6ICdeKHByZXZpb3VzfGNvbnRpbnVlfGNob2ljZS57dGFyZ2V0PVxcXFxTezAsMjAwfVthLXpBLVowLTldfSkkJyxcblxuICAvLyBEYXRhIHJhbmdlc1xuICBzY2FsZWRfcmFuZ2U6ICctMSMxJyxcbiAgYXVkaW9fcmFuZ2U6ICcwIyonLFxuICBzcGVlZF9yYW5nZTogJzAjKicsXG4gIHRleHRfcmFuZ2U6ICctMSMxJyxcbiAgcHJvZ3Jlc3NfcmFuZ2U6ICcwIzEnLFxufTtcbiIsIi8vIEBmbG93XG5pbXBvcnQge3Njb3JtMjAwNF9yZWdleH0gZnJvbSAnLi9yZWdleCc7XG5cbmV4cG9ydCBjb25zdCBsZWFybmVyX3Jlc3BvbnNlcyA9IHtcbiAgJ3RydWUtZmFsc2UnOiB7XG4gICAgZm9ybWF0OiAnXnRydWUkfF5mYWxzZSQnLFxuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdjaG9pY2UnOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICB1bmlxdWU6IHRydWUsXG4gIH0sXG4gICdmaWxsLWluJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSUxhbmdTdHJpbmcyNTAsXG4gICAgbWF4OiAxMCxcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdsb25nLWZpbGwtaW4nOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzQwMDAsXG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ21hdGNoaW5nJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBmb3JtYXQyOiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICBkZWxpbWl0ZXIyOiAnWy5dJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAncGVyZm9ybWFuY2UnOiB7XG4gICAgZm9ybWF0OiAnXiR8JyArIHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgZm9ybWF0Mjogc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwgKyAnfF4kfCcgK1xuICAgICAgICBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMjUwLFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgZGVsaW1pdGVyMjogJ1suXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ3NlcXVlbmNpbmcnOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnbGlrZXJ0Jzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnbnVtZXJpYyc6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlEZWNpbWFsLFxuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdvdGhlcic6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTdHJpbmc0MDAwLFxuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY29ycmVjdF9yZXNwb25zZXMgPSB7XG4gICd0cnVlLWZhbHNlJzoge1xuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6ICdedHJ1ZSR8XmZhbHNlJCcsXG4gICAgbGltaXQ6IDEsXG4gIH0sXG4gICdjaG9pY2UnOiB7XG4gICAgbWF4OiAzNixcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgfSxcbiAgJ2ZpbGwtaW4nOiB7XG4gICAgbWF4OiAxMCxcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nMjUwY3IsXG4gIH0sXG4gICdsb25nLWZpbGwtaW4nOiB7XG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IHRydWUsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzQwMDAsXG4gIH0sXG4gICdtYXRjaGluZyc6IHtcbiAgICBtYXg6IDM2LFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgZGVsaW1pdGVyMjogJ1suXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBmb3JtYXQyOiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICB9LFxuICAncGVyZm9ybWFuY2UnOiB7XG4gICAgbWF4OiAyNTAsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICBkZWxpbWl0ZXIyOiAnWy5dJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiAnXiR8JyArIHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgZm9ybWF0Mjogc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwgKyAnfF4kfCcgK1xuICAgICAgICBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICB9LFxuICAnc2VxdWVuY2luZyc6IHtcbiAgICBtYXg6IDM2LFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgfSxcbiAgJ2xpa2VydCc6IHtcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIGxpbWl0OiAxLFxuICB9LFxuICAnbnVtZXJpYyc6IHtcbiAgICBtYXg6IDIsXG4gICAgZGVsaW1pdGVyOiAnWzpdJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCxcbiAgICBsaW1pdDogMSxcbiAgfSxcbiAgJ290aGVyJzoge1xuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTdHJpbmc0MDAwLFxuICAgIGxpbWl0OiAxLFxuICB9LFxufTtcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogRGF0YSBWYWxpZGF0aW9uIEV4Y2VwdGlvblxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgdG8gdGFrZSBpbiBhbiBlcnJvciBtZXNzYWdlIGFuZCBjb2RlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yQ29kZTogbnVtYmVyKSB7XG4gICAgc3VwZXIoZXJyb3JDb2RlKTtcbiAgICB0aGlzLiNlcnJvckNvZGUgPSBlcnJvckNvZGU7XG4gIH1cblxuICAjZXJyb3JDb2RlO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlcnJvckNvZGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGVycm9yQ29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXJyb3JDb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeWluZyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBFcnJvciBtZXNzYWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNlcnJvckNvZGUgKyAnJztcbiAgfVxufVxuIiwiaW1wb3J0IFNjb3JtMjAwNEFQSSBmcm9tICcuL1Njb3JtMjAwNEFQSSc7XG5pbXBvcnQgU2Nvcm0xMkFQSSBmcm9tICcuL1Njb3JtMTJBUEknO1xuaW1wb3J0IEFJQ0MgZnJvbSAnLi9BSUNDJztcblxud2luZG93LlNjb3JtMTJBUEkgPSBTY29ybTEyQVBJO1xud2luZG93LlNjb3JtMjAwNEFQSSA9IFNjb3JtMjAwNEFQSTtcbndpbmRvdy5BSUNDID0gQUlDQztcbiIsIi8vIEBmbG93XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfU0VDT05EID0gMS4wO1xuZXhwb3J0IGNvbnN0IFNFQ09ORFNfUEVSX01JTlVURSA9IDYwO1xuZXhwb3J0IGNvbnN0IFNFQ09ORFNfUEVSX0hPVVIgPSA2MCAqIFNFQ09ORFNfUEVSX01JTlVURTtcbmV4cG9ydCBjb25zdCBTRUNPTkRTX1BFUl9EQVkgPSAyNCAqIFNFQ09ORFNfUEVSX0hPVVI7XG5cbmNvbnN0IGRlc2lnbmF0aW9ucyA9IFtcbiAgWydEJywgU0VDT05EU19QRVJfREFZXSxcbiAgWydIJywgU0VDT05EU19QRVJfSE9VUl0sXG4gIFsnTScsIFNFQ09ORFNfUEVSX01JTlVURV0sXG4gIFsnUycsIFNFQ09ORFNfUEVSX1NFQ09ORF0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgTnVtYmVyIHRvIGEgU3RyaW5nIG9mIEhIOk1NOlNTXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvdGFsU2Vjb25kc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Vjb25kc0FzSEhNTVNTKHRvdGFsU2Vjb25kczogTnVtYmVyKSB7XG4gIC8vIFNDT1JNIHNwZWMgZG9lcyBub3QgZGVhbCB3aXRoIG5lZ2F0aXZlIGR1cmF0aW9ucywgZ2l2ZSB6ZXJvIGJhY2tcbiAgaWYgKCF0b3RhbFNlY29uZHMgfHwgdG90YWxTZWNvbmRzIDw9IDApIHtcbiAgICByZXR1cm4gJzAwOjAwOjAwJztcbiAgfVxuXG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyBTRUNPTkRTX1BFUl9IT1VSKTtcblxuICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUodG90YWxTZWNvbmRzICogMTAwMCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBkYXRlT2JqLmdldFVUQ01pbnV0ZXMoKTtcbiAgLy8gbWFrZSBzdXJlIHdlIGFkZCBhbnkgcG9zc2libGUgZGVjaW1hbCB2YWx1ZVxuICBjb25zdCBzZWNvbmRzID0gZGF0ZU9iai5nZXRTZWNvbmRzKCkgKyAodG90YWxTZWNvbmRzICUgMS4wKTtcblxuICByZXR1cm4gaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpICsgJzonICtcbiAgICAgIG1pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpICsgJzonICtcbiAgICAgIHNlY29uZHMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSBJU08gODYwMSBEdXJhdGlvblxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzZWNvbmRzXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRzQXNJU09EdXJhdGlvbihzZWNvbmRzOiBOdW1iZXIpIHtcbiAgLy8gU0NPUk0gc3BlYyBkb2VzIG5vdCBkZWFsIHdpdGggbmVnYXRpdmUgZHVyYXRpb25zLCBnaXZlIHplcm8gYmFja1xuICBpZiAoIXNlY29uZHMgfHwgc2Vjb25kcyA8PSAwKSB7XG4gICAgcmV0dXJuICdQVDBTJztcbiAgfVxuXG4gIGxldCBkdXJhdGlvbiA9ICdQJztcbiAgbGV0IHJlbWFpbmRlciA9IHNlY29uZHM7XG5cbiAgZGVzaWduYXRpb25zLmZvckVhY2goKFtzaWduLCBjdXJyZW50X3NlY29uZHNdKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gTWF0aC5mbG9vcihyZW1haW5kZXIgLyBjdXJyZW50X3NlY29uZHMpO1xuXG4gICAgcmVtYWluZGVyID0gcmVtYWluZGVyICUgY3VycmVudF9zZWNvbmRzO1xuICAgIC8vIElmIHdlIGhhdmUgYW55dGhpbmcgbGVmdCBpbiB0aGUgcmVtYWluZGVyLCBhbmQgd2UncmUgY3VycmVudGx5IGFkZGluZ1xuICAgIC8vIHNlY29uZHMgdG8gdGhlIGR1cmF0aW9uLCBnbyBhaGVhZCBhbmQgYWRkIHRoZSBkZWNpbWFsIHRvIHRoZSBzZWNvbmRzXG4gICAgaWYgKHNpZ24gPT09ICdTJyAmJiByZW1haW5kZXIgPiAwKSB7XG4gICAgICB2YWx1ZSArPSByZW1haW5kZXI7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAoKGR1cmF0aW9uLmluZGV4T2YoJ0QnKSA+IDAgfHxcbiAgICAgICAgICBzaWduID09PSAnSCcgfHwgc2lnbiA9PT0gJ00nIHx8IHNpZ24gPT09ICdTJykgJiZcbiAgICAgICAgICBkdXJhdGlvbi5pbmRleE9mKCdUJykgPT09IC0xKSB7XG4gICAgICAgIGR1cmF0aW9uICs9ICdUJztcbiAgICAgIH1cbiAgICAgIGR1cmF0aW9uICs9IGAke3ZhbHVlfSR7c2lnbn1gO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGR1cmF0aW9uO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSBISDpNTTpTUy5ERERERERcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGltZVN0cmluZ1xuICogQHBhcmFtIHtSZWdFeHB9IHRpbWVSZWdleFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZUFzU2Vjb25kcyh0aW1lU3RyaW5nOiBTdHJpbmcsIHRpbWVSZWdleDogUmVnRXhwKSB7XG4gIGlmICghdGltZVN0cmluZyB8fCB0eXBlb2YgdGltZVN0cmluZyAhPT0gJ3N0cmluZycgfHxcbiAgICAgICF0aW1lU3RyaW5nLm1hdGNoKHRpbWVSZWdleCkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBwYXJ0cyA9IHRpbWVTdHJpbmcuc3BsaXQoJzonKTtcbiAgY29uc3QgaG91cnMgPSBOdW1iZXIocGFydHNbMF0pO1xuICBjb25zdCBtaW51dGVzID0gTnVtYmVyKHBhcnRzWzFdKTtcbiAgY29uc3Qgc2Vjb25kcyA9IE51bWJlcihwYXJ0c1syXSk7XG4gIHJldHVybiAoaG91cnMgKiAzNjAwKSArIChtaW51dGVzICogNjApICsgc2Vjb25kcztcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZyb20gSVNPIDg2MDEgRHVyYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVyYXRpb25cbiAqIEBwYXJhbSB7UmVnRXhwfSBkdXJhdGlvblJlZ2V4XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREdXJhdGlvbkFzU2Vjb25kcyhkdXJhdGlvbjogU3RyaW5nLCBkdXJhdGlvblJlZ2V4OiBSZWdFeHApIHtcbiAgaWYgKCFkdXJhdGlvbiB8fCAhZHVyYXRpb24ubWF0Y2goZHVyYXRpb25SZWdleCkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IFssIHllYXJzLCBtb250aHMsICwgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHNdID0gbmV3IFJlZ0V4cChcbiAgICAgIGR1cmF0aW9uUmVnZXgpLmV4ZWMoZHVyYXRpb24pIHx8IFtdO1xuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGFuY2hvciA9IG5ldyBEYXRlKG5vdyk7XG4gIGFuY2hvci5zZXRGdWxsWWVhcihhbmNob3IuZ2V0RnVsbFllYXIoKSArIE51bWJlcih5ZWFycyB8fCAwKSk7XG4gIGFuY2hvci5zZXRNb250aChhbmNob3IuZ2V0TW9udGgoKSArIE51bWJlcihtb250aHMgfHwgMCkpO1xuICBhbmNob3Iuc2V0RGF0ZShhbmNob3IuZ2V0RGF0ZSgpICsgTnVtYmVyKGRheXMgfHwgMCkpO1xuICBhbmNob3Iuc2V0SG91cnMoYW5jaG9yLmdldEhvdXJzKCkgKyBOdW1iZXIoaG91cnMgfHwgMCkpO1xuICBhbmNob3Iuc2V0TWludXRlcyhhbmNob3IuZ2V0TWludXRlcygpICsgTnVtYmVyKG1pbnV0ZXMgfHwgMCkpO1xuICBhbmNob3Iuc2V0U2Vjb25kcyhhbmNob3IuZ2V0U2Vjb25kcygpICsgTnVtYmVyKHNlY29uZHMgfHwgMCkpO1xuICBpZiAoc2Vjb25kcyAmJiBTdHJpbmcoc2Vjb25kcykuaW5kZXhPZignLicpID4gMCkge1xuICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IE51bWJlcihOdW1iZXIoc2Vjb25kcykgJSAxKS50b0ZpeGVkKDYpICogMTAwMC4wO1xuICAgIGFuY2hvci5zZXRNaWxsaXNlY29uZHMoYW5jaG9yLmdldE1pbGxpc2Vjb25kcygpICsgbWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIHJldHVybiAoKGFuY2hvciAqIDEuMCkgLSBub3cpIC8gMTAwMC4wO1xufVxuXG4vKipcbiAqIEFkZHMgdG9nZXRoZXIgdHdvIElTTzg2MDEgRHVyYXRpb24gc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaXJzdFxuICogQHBhcmFtIHtzdHJpbmd9IHNlY29uZFxuICogQHBhcmFtIHtSZWdFeHB9IGR1cmF0aW9uUmVnZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFR3b0R1cmF0aW9ucyhcbiAgICBmaXJzdDogU3RyaW5nLFxuICAgIHNlY29uZDogU3RyaW5nLFxuICAgIGR1cmF0aW9uUmVnZXg6IFJlZ0V4cCkge1xuICBjb25zdCBmaXJzdFNlY29uZHMgPSBnZXREdXJhdGlvbkFzU2Vjb25kcyhmaXJzdCwgZHVyYXRpb25SZWdleCk7XG4gIGNvbnN0IHNlY29uZFNlY29uZHMgPSBnZXREdXJhdGlvbkFzU2Vjb25kcyhzZWNvbmQsIGR1cmF0aW9uUmVnZXgpO1xuXG4gIHJldHVybiBnZXRTZWNvbmRzQXNJU09EdXJhdGlvbihmaXJzdFNlY29uZHMgKyBzZWNvbmRTZWNvbmRzKTtcbn1cblxuLyoqXG4gKiBBZGQgdG9nZXRoZXIgdHdvIEhIOk1NOlNTLkREIHN0cmluZ3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlyc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWNvbmRcbiAqIEBwYXJhbSB7UmVnRXhwfSB0aW1lUmVnZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEhITU1TU1RpbWVTdHJpbmdzKFxuICAgIGZpcnN0OiBTdHJpbmcsXG4gICAgc2Vjb25kOiBTdHJpbmcsXG4gICAgdGltZVJlZ2V4OiBSZWdFeHApIHtcbiAgY29uc3QgZmlyc3RTZWNvbmRzID0gZ2V0VGltZUFzU2Vjb25kcyhmaXJzdCwgdGltZVJlZ2V4KTtcbiAgY29uc3Qgc2Vjb25kU2Vjb25kcyA9IGdldFRpbWVBc1NlY29uZHMoc2Vjb25kLCB0aW1lUmVnZXgpO1xuICByZXR1cm4gZ2V0U2Vjb25kc0FzSEhNTVNTKGZpcnN0U2Vjb25kcyArIHNlY29uZFNlY29uZHMpO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBKU09OIG9iamVjdCBkb3duIHRvIHN0cmluZyBwYXRocyBmb3IgZWFjaCB2YWx1ZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGRhdGEpIHtcbiAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2UgdGhyb3VnaCB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7Kn0gY3VyXG4gICAqIEBwYXJhbSB7Kn0gcHJvcFxuICAgKi9cbiAgZnVuY3Rpb24gcmVjdXJzZShjdXIsIHByb3ApIHtcbiAgICBpZiAoT2JqZWN0KGN1cikgIT09IGN1cikge1xuICAgICAgcmVzdWx0W3Byb3BdID0gY3VyO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXIpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGN1ci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcmVjdXJzZShjdXJbaV0sIHByb3AgKyAnWycgKyBpICsgJ10nKTtcbiAgICAgICAgaWYgKGwgPT09IDApIHJlc3VsdFtwcm9wXSA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaXNFbXB0eSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHAgaW4gY3VyKSB7XG4gICAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1ciwgcCkpIHtcbiAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgcmVjdXJzZShjdXJbcF0sIHByb3AgPyBwcm9wICsgJy4nICsgcCA6IHApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNFbXB0eSAmJiBwcm9wKSByZXN1bHRbcHJvcF0gPSB7fTtcbiAgICB9XG4gIH1cblxuICByZWN1cnNlKGRhdGEsICcnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBVbi1mbGF0dGVuIGEgZmxhdCBKU09OIG9iamVjdFxuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdHRlbihkYXRhKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgaWYgKE9iamVjdChkYXRhKSAhPT0gZGF0YSB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gZGF0YTtcbiAgY29uc3QgcmVnZXggPSAvXFwuPyhbXi5bXFxdXSspfFxcWyhcXGQrKV0vZztcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgcCBpbiBkYXRhKSB7XG4gICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgcCkpIHtcbiAgICAgIGxldCBjdXIgPSByZXN1bHQ7XG4gICAgICBsZXQgcHJvcCA9ICcnO1xuICAgICAgbGV0IG0gPSByZWdleC5leGVjKHApO1xuICAgICAgd2hpbGUgKG0pIHtcbiAgICAgICAgY3VyID0gY3VyW3Byb3BdIHx8IChjdXJbcHJvcF0gPSAobVsyXSA/IFtdIDoge30pKTtcbiAgICAgICAgcHJvcCA9IG1bMl0gfHwgbVsxXTtcbiAgICAgICAgbSA9IHJlZ2V4LmV4ZWMocCk7XG4gICAgICB9XG4gICAgICBjdXJbcHJvcF0gPSBkYXRhW3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0WycnXSB8fCByZXN1bHQ7XG59XG4iXX0= diff --git a/dist/scorm-again.js.map b/dist/scorm-again.js.map index a0aef1d..65fd027 100644 --- a/dist/scorm-again.js.map +++ b/dist/scorm-again.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/browser-pack/_prelude.js","src/AICC.js","src/BaseAPI.js","src/Scorm12API.js","src/Scorm2004API.js","src/cmi/aicc_cmi.js","src/cmi/common.js","src/cmi/scorm12_cmi.js","src/cmi/scorm2004_cmi.js","src/constants/api_constants.js","src/constants/error_codes.js","src/constants/field_values.js","src/constants/language_constants.js","src/constants/regex.js","src/constants/response_constants.js","src/exceptions.js","src/exports.js","src/utilities.js"],"names":["_Scorm12API2","_interopRequireDefault","require","_aicc_cmi","_scorm12_cmi","AICC","settings","_this","_classCallCheck","this","finalSettings","_objectSpread","mastery_override","_possibleConstructorReturn","_getPrototypeOf","call","cmi","CMI","nav","NAV","CMIElement","value","foundFirstIndex","newChild","_get","prototype","stringMatches","CMIEvaluationCommentsObject","CMITriesObject","newAPI","Scorm12API","_common","_exceptions","_error_codes2","_api_constants","_utilities","BaseAPI","error_codes","_timeout","set","writable","_scheduleCancelled","_error_codes","_settings","autocommit","autocommitSeconds","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","global_constants","LOG_LEVEL_ERROR","_defineProperty","constructor","TypeError","currentState","STATE_NOT_INITIALIZED","lastErrorCode","listenerArray","_classPrivateFieldSet","apiLogLevel","callbackName","initializeMessage","terminationMessage","returnValue","SCORM_FALSE","isInitialized","throwSCORMError","_classPrivateFieldGet","INITIALIZED","isTerminated","TERMINATED","STATE_INITIALIZED","SCORM_TRUE","processListeners","apiLog","LOG_LEVEL_INFO","clearSCORMError","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","result","storeData","errorCode","STATE_TERMINATED","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","e","ValidationError","GENERAL","undefined","String","scheduleCommit","clearScheduledCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","LOG_LEVEL_DEBUG","CMIErrorCode","getLmsErrorMessageDetails","beforeInitError","afterTermError","isNotInitialized","functionName","logMessage","messageLevel","formatMessage","console","error","LOG_LEVEL_WARNING","warn","info","debug","log","message","messageString","fillChars","length","i","j","str","tester","match","refObject","attribute","Object","hasOwnProperty","getOwnPropertyDescriptor","getPrototypeOf","_errorNumber","_detail","Error","_CMIElement","_value","methodName","scorm2004","structure","split","invalidErrorMessage","concat","invalidErrorCode","UNDEFINED_DATA_MODEL","substr","_isTargetValid","READ_ONLY_ELEMENT","_checkObjectHasProperty","validateCorrectResponse","CMIArray","index","parseInt","isNaN","item","childArray","getChildElement","initialized","initialize","push","_foundFirstIndex","uninitializedErrorMessage","target","VALUE_NOT_INITIALIZED","scorm12_error_codes","CHILDREN_ERROR","COUNT_ERROR","listenerName","callback","listenerFunctions","listenerSplit","replace","listener","functionsMatch","listenerHasCMIElement","CMIElementsMatch","errorNumber","success","_calculateTotalTime","json","loadFromJSON","unflatten","startingData","key","currentCMIElement","JSON","stringify","parse","renderCMIToJSONString","_terminateCommit","url","params","genericError","httpReq","XMLHttpRequest","open","Array","setRequestHeader","send","join","responseText","when","setTimeout","scheduledCallback","clearTimeout","commit","_BaseAPI2","Utilities","_interopRequireWildcard","constants","scorm12_constants","LMSInitialize","lmsInitialize","LMSFinish","lmsFinish","LMSGetValue","lmsGetValue","LMSSetValue","lmsSetValue","LMSCommit","lmsCommit","LMSGetLastError","lmsGetLastError","LMSGetErrorString","lmsGetErrorString","LMSGetDiagnostic","lmsGetDiagnostic","terminate","event","getValue","setValue","getLastError","getErrorString","getDiagnostic","_commonSetCMIValue","_commonGetCMIValue","CMIObjectivesObject","CMIInteractionsCorrectResponsesObject","CMIInteractionsObjectivesObject","CMIInteractionsObject","detail","basicMessage","detailMessage","error_descriptions","terminateCommit","cmiExport","renderCMIToJSONObject","core","total_time","getCurrentTotalTime","flattened","flatten","originalStatus","lesson_status","lesson_mode","credit","student_data","mastery_score","score","raw","parseFloat","_this$startingData","_this$startingData$cm","_this$startingData$cm2","commitObject","renderCommitCMI","processHttpRequest","_scorm2004_cmi","_response_constants","_language_constants","_regex","scorm2004_constants","Scorm2004API","scorm2004_error_codes","_version","_assertThisInitialized","correct_response","current_index","found","count","_count","adl","ADL","Initialize","Terminate","lmsTerminate","GetValue","SetValue","Commit","GetLastError","GetErrorString","GetDiagnostic","request","parts","Number","interaction","interactions","type","DEPENDENCY_NOT_ESTABLISHED","interaction_type","interaction_count","correct_responses","response","pattern","GENERAL_SET_FAILURE","response_type","nodes","delimiter","max","checkCorrectResponseValue","CMICommentsObject","pattern_index","limit","duplicate","checkDuplicatedPattern","formatRegex","RegExp","format","removeCorrectResponsePrefixes","delimiter2","values","matches","format2","TYPE_MISMATCH","unique","node","seenOrder","seenCase","seenLang","prefixRegex","langMatches","scorm2004_regex","CMILangcr","lang","valid_languages","toLowerCase","_this$startingData$ad","_this$startingData$ad2","mode","completion_threshold","progress_measure","completion_status","scaled_passing_score","scaled","success_status","navRequest","encodeURIComponent","Function","Scorm12CMI","aicc_constants","regex","aicc_regex","cmi_children","AICCCMIStudentData","evaluation","CMIEvaluation","_this$student_data","_this$evaluation","jsonString","suspend_data","launch_data","comments","comments_from_lms","objectives","student_preference","_this2","CMIEvaluationComments","_this$comments","BaseCMI","comments_children","INVALID_SET_VALUE","_this3","student_data_children","_tries_during_lesson","tries","CMITries","_this$tries","max_time_allowed","time_limit_action","tries_during_lesson","throwReadOnlyError","CMIStudentData","tries_children","_this4","_status","_time","CMIScore","score_children","score_range","invalidTypeCode","invalidRangeCode","VALUE_OUT_OF_RANGE","_this$score","status","time","check12ValidFormat","CMIStatus2","CMITime","_this5","_content","_location","_time2","content","location","CMIString256","checkValidFormat","regexPattern","allowEmptyString","checkValidRange","rangePattern","ranges","_initialized","_ref","decimalRegex","_children2","_score_range","_invalid_error_code","_invalid_type_code","_invalid_range_code","_decimal_regex","_raw","_min","_max","scorm12_regex","CMIDecimal","min","_children","_ref2","children","_errorCode","_children3","throwWriteOnlyError","WRITE_ONLY_ELEMENT","throwInvalidValueError","check12ValidRange","_version2","_suspend_data","_launch_data","_comments","_comments_from_lms","CMICore","CMIObjectives","CMIStudentPreference","CMIInteractions","_this$core","_this$objectives","_this$student_prefere","_this$interactions","CMIString4096","core_children","_student_id","_student_name","_lesson_location","_credit","_lesson_status","_entry","_total_time","_lesson_mode","_exit","_session_time","addHHMMSSTimeStrings","CMITimespan","student_id","student_name","lesson_location","entry","exit","session_time","CMIStatus","CMIExit","objectives_children","_children4","_mastery_score","_max_time_allowed","_time_limit_action","_children5","student_preference_children","_audio","_language","_speed","_text","audio","language","speed","text","CMISInteger","audio_range","speed_range","text_range","interactions_children","_id","_type","_weighting","_student_response","_result","_latency","correct_responses_children","_this$objectives2","_this$correct_respons","id","weighting","student_response","latency","CMIIdentifier","CMIType","weighting_range","CMIFeedback","CMIResult","_this6","_id2","_this7","_id3","_this8","_pattern","_this9","_event","NAVEvent","throwTypeMismatchError","check2004ValidFormat","check2004ValidRange","Util","_completion_status","_completion_threshold","_learner_id","_learner_name","_mode","_progress_measure","_scaled_passing_score","_success_status","learner_preference","CMILearnerPreference","Scorm2004CMIScore","comments_from_learner","CMICommentsFromLearner","CMICommentsFromLMS","_this$learner_prefere","_this$comments_from_l","_this$comments_from_l2","addTwoDurations","learner_id","learner_name","CMICStatus","CMIString1000","progress_range","CMISStatus","CMIString64000","_audio_level","_delivery_speed","_audio_captioning","audio_level","delivery_speed","audio_captioning","CMILang","_timestamp","_learner_response","_description","timestamp","learner_response","description","CMILongIdentifier","learner_responses","CMILangString250","_success_status2","_completion_status2","_progress_measure2","_description2","_this$score2","_scaled","scaled_range","readOnlyAfterInit","arguments","_comment","_location2","_timestamp2","_readOnlyAfterInit","comment","CMILangString4000","CMIString250","ADLNav","_this$nav","_this10","_request","request_valid","ADLNavRequestValid","_this$request_valid","_this11","_continue","_previous","_temp","_target","_temp2","previous","continue","_","LOG_LEVEL_NONE","101","201","202","203","301","401","402","403","404","405","0","102","103","104","111","112","113","122","123","132","133","142","143","351","391","406","407","408","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","MULTIPLE_TERMINATIONS","common_values","validResult","invalidResult","valid0To1Range","invalid0To1Range","valid0To100Range","invalid0To100Range","validScaledRange","invalidScaledRange","validIntegerScaledRange","invalidIntegerScaledRange","scorm12_values","validLessonStatus","invalidLessonStatus","validExit","invalidExit","validType","invalidType","validSpeedRange","invalidSpeedRange","validScoreRange","invalidScoreRange","validTime","invalidTime","validTimespan","invalidTimespan","scorm2004_values","validTimestamps","invalidTimestamps","validCStatus","invalidCStatus","validSStatus","invalidSStatus","validISO8601Durations","invalidISO8601Durations","validComment","repeat","invalidComment","validDescription","invalidDescription","validNavRequest","invalidNavRequest","aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","ba","be","bg","bh","bi","bm","bn","bo","br","bs","ca","ce","ch","co","cr","cs","cu","cv","cy","da","de","dv","dz","ee","el","en","eo","es","et","eu","fa","ff","fi","fj","fo","fr","fy","ga","gd","gl","gn","gu","gv","ha","he","hi","ho","hr","ht","hu","hy","hz","ia","ie","ig","ii","ik","io","is","it","iu","ja","jv","ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","la","lb","lg","li","ln","lo","lt","lu","lv","mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","oc","oj","om","or","os","pa","pi","pl","ps","pt","qu","rm","rn","ro","ru","rw","sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","ug","uk","ur","uz","ve","vi","vo","wa","wo","xh","yi","yo","za","zh","zu","aar","abk","ave","afr","aka","amh","arg","ara","asm","ava","aym","aze","bak","bel","bul","bih","bis","bam","ben","tib","bod","bre","bos","cat","che","cha","cos","cre","cze","ces","chu","chv","wel","cym","dan","ger","deu","div","dzo","ewe","gre","ell","eng","epo","spa","est","baq","eus","per","fas","ful","fin","fij","fao","fre","fra","fry","gle","gla","glg","grn","guj","glv","hau","heb","hin","hmo","hrv","hat","hun","arm","hye","her","ina","ind","ile","ibo","iii","ipk","ido","ice","isl","ita","iku","jpn","jav","geo","kat","kon","kik","kua","kaz","kal","khm","kan","kor","kau","kas","kur","kom","cor","kir","lat","ltz","lug","lim","lin","lao","lit","lub","lav","mlg","mah","mao","mri","mac","mkd","mal","mon","mol","mar","may","msa","mlt","bur","mya","nau","nob","nde","nep","ndo","dut","nld","nno","nor","nbl","nya","oci","oji","orm","ori","oss","pan","pli","pol","pus","por","que","roh","run","rum","ron","rus","kin","san","srd","snd","sme","sag","slo","sin","slk","slv","smo","sna","som","alb","sqi","srp","ssw","sot","sun","swe","swa","tam","tel","tgk","tha","tir","tuk","tgl","tsn","ton","tur","tso","tat","twi","tah","uig","ukr","urd","uzb","ven","vie","vol","wln","wol","xho","yid","yor","zha","chi","zho","zul","_field_values","CMIInteger","CMIIndex","CMIString200","CMIString4000","CMILangString250cr","CMIShortIdentifier","CMIIndexStore","NAVBoolean","NAVTarget","true-false","choice","fill-in","long-fill-in","matching","performance","sequencing","likert","numeric","other","_Scorm2004API","_Scorm12API","_AICC","window","getSecondsAsHHMMSS","totalSeconds","hours","Math","floor","SECONDS_PER_HOUR","dateObj","Date","minutes","getUTCMinutes","seconds","getSeconds","toString","padStart","getSecondsAsISODuration","duration","remainder","designations","forEach","_slicedToArray","sign","current_seconds","indexOf","getTimeAsSeconds","timeString","timeRegex","getDurationAsSeconds","durationRegex","_ref3","exec","_ref4","years","months","days","now","anchor","setFullYear","getFullYear","setMonth","getMonth","setDate","getDate","setHours","getHours","setMinutes","getMinutes","setSeconds","milliseconds","toFixed","setMilliseconds","getMilliseconds","first","second","data","recurse","cur","prop","isArray","l","isEmpty","p","m","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_DAY"],"mappings":"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e,qBAAsB,IACtBoe,sBAAuB,IACvBjd,sBAAuB,IACvB+M,kBAAmB,IACnB/N,kBAAmB,IACnB6R,mBAAoB,IACpB7G,cAAe,IACfoE,mBAAoB,IACpB7F,2BAA4B,oCAGvB,IAAMtI,qBAAmB3J,iBAC3B0B,gBACDkD,qBAAsB,IACtBG,kBAAmB,IACnBU,mBAAoB,IACpB+gB,eAAgB,IAChB5c,eAAgB,IAChBC,YAAa,IACbtB,qBAAsB,IACtBoe,sBAAuB,IACvBjd,sBAAuB,IACvB+M,kBAAmB,IACnB/N,kBAAmB,IACnB6R,mBAAoB,IACpB7G,cAAe,IACfoE,mBAAoB,IACpB7F,2BAA4B,qDAIzB,IAAMzB,uBAAqBxQ,iBAC7B0B,gBACD4kB,sBAAuB,IACvB3iB,YAAa,IACbE,WAAY,IACZ0iB,oBAAqB,IACrBjiB,wBAAyB,IACzBsiB,sBAAuB,IACvBhiB,qBAAsB,IACtBC,oBAAqB,IACrBE,kBAAmB,IACnBC,iBAAkB,IAClBS,mBAAoB,IACpBC,kBAAmB,IACnB8gB,eAAgB,IAChBC,oBAAqB,IACrBlU,oBAAqB,IACrBmU,uBAAwB,IACxBne,qBAAsB,IACtBoe,sBAAuB,IACvBjd,sBAAuB,IACvBhB,kBAAmB,IACnB6R,mBAAoB,IACpB7G,cAAe,IACfoE,mBAAoB,IACpB7F,2BAA4B;;q1BC7EhC,IAAM4U,gBACJC,aACE,UACA,QACA,gBACA,WAEFC,eACE,SACA,QACA,WAGFC,gBACE,MACA,OACA,MACA,OAEFC,kBACE,KACA,OACA,MACA,OAGFC,kBACE,IACA,KACA,OAEFC,oBACE,UACA,OACA,MAGFC,kBACE,IACA,MACA,IACA,OACA,MAEFC,oBACE,OACA,OACA,OACA,KACA,OAGFC,yBACE,IACA,IACA,MAEFC,2BACE,OACA,OACA,MACA,OACA,OACA,KACA,QAISC,eAAcxnB,iBACtB6mB,kBACDY,mBACE,SACA,YACA,SACA,aACA,WAEFC,qBACE,SACA,IACA,IACA,IACA,OACA,QACA,YAGFC,WACE,WACA,UACA,UAEFC,aACE,QACA,OACA,SAGFC,WACE,aACA,SACA,UACA,WACA,cACA,aACA,SACA,WAEFC,aACE,UACA,QACA,UAGFC,iBACE,IACA,KACA,MACA,KACA,MACA,QAEFC,mBACE,UACA,OACA,OACA,MACA,UACA,UAGFC,iBACE,IACA,QACA,OAEFC,mBACE,UACA,OACA,KACA,MACA,UACA,UAEFf,oBACE,UACA,OACA,MAGFgB,WACE,WACA,WACA,YAEFC,aACE,WACA,cACA,UACA,eACA,iBAGFC,eACE,WACA,cACA,WACA,YAEFC,iBACE,UACA,eACA,wDAKC,IAAMC,kBAAgBvoB,iBACxB6mB,kBAED2B,iBACE,aACA,mBACA,yBACA,cAEFC,mBACE,cACA,0BACA,yBACA,aACA,aACA,YACA,UACA,aAGFC,cACE,YACA,aACA,gBACA,WAEFC,gBACE,WACA,SACA,UAGFC,cACE,SACA,SACA,WAEFC,gBACE,WACA,aACA,IACA,KAGFlB,WACE,WACA,UACA,SACA,UAEFC,aACE,QACA,OACA,SAGFC,WACE,aACA,SACA,UACA,eACA,WACA,cACA,aACA,SACA,UACA,SAEFC,aACE,UACA,QACA,UAGFG,iBACE,IACA,KACA,MACA,SACA,KACA,SAEFC,mBACE,UACA,OACA,UACA,UAGFY,uBACE,mBACA,UACA,MACA,SAEFC,yBACE,WACA,OACA,QACA,KAGFC,cACE,+BACA,kCACA,sBAAwB,IAAIC,OAAO,KACnC,kBACA,mBACA,cACA,WACA,IAEFC,gBACE,YACA,aACA,uCACA,mBACA,sBAAwB,IAAID,OAAO,MACnC,uBAAyB,IAAIA,OAAO,OAGtCE,kBACE,+BACA,kCACA,sBAAwB,IAAIF,OAAO,KACnC,kBACA,mBACA,cACA,WACA,IAEFG,oBACE,YACA,aACA,uCACA,mBACA,sBAAwB,IAAIH,OAAO,KACnC,uBAAyB,IAAIA,OAAO,MAGtCI,iBACE,WACA,WACA,OACA,UACA,UACA,aACA,cAEFC,mBACE,QACA,OACA,OACA;;kGC1UC,IAAMjV,kBACXkV,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAM7O,GAAM,KAClE8O,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOh9B,IAAO,MAAOi9B,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = result.result ?\n result.result : global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = 0;\n this.currentState = global_constants.STATE_TERMINATED;\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(\n callbackName: String,\n checkTerminated: boolean,\n CMIElement: String) {\n let returnValue;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.RETRIEVE_BEFORE_INIT,\n this.#error_codes.RETRIEVE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n returnValue = this.getCMIValue(CMIElement);\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: String,\n checkTerminated: boolean,\n CMIElement,\n value) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.STORE_BEFORE_INIT,\n this.#error_codes.STORE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === '0') {\n if (this.settings.autocommit) {\n this.scheduleCommit(this.settings.autocommitSeconds * 1000);\n }\n }\n\n this.apiLog(callbackName, CMIElement,\n ': ' + value + ': result: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n commit(\n callbackName: String,\n checkTerminated: boolean) {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.COMMIT_BEFORE_INIT,\n this.#error_codes.COMMIT_AFTER_TERM)) {\n const result = this.storeData(false);\n if (result.errorCode && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = result.result ?\n result.result : global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue,\n global_constants.LOG_LEVEL_DEBUG);\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: String) {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError?: number) {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} logMessage\n * @param {number}messageLevel\n */\n apiLog(\n functionName: String,\n CMIElement: String,\n logMessage: String,\n messageLevel: number) {\n logMessage = this.formatMessage(functionName, CMIElement, logMessage);\n\n if (messageLevel >= this.apiLogLevel) {\n switch (messageLevel) {\n case global_constants.LOG_LEVEL_ERROR:\n console.error(logMessage);\n break;\n case global_constants.LOG_LEVEL_WARNING:\n console.warn(logMessage);\n break;\n case global_constants.LOG_LEVEL_INFO:\n console.info(logMessage);\n break;\n case global_constants.LOG_LEVEL_DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n }\n }\n\n /**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} message\n * @return {string}\n */\n formatMessage(functionName: String, CMIElement: String, message: String) {\n const baseLength = 20;\n let messageString = '';\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += ' ';\n }\n\n messageString += ': ';\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += ' ';\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n }\n\n /**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\n stringMatches(str: String, tester: String) {\n return str && tester && str.match(tester);\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {*} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n _checkObjectHasProperty(refObject, attribute: String) {\n return Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject), attribute) ||\n (attribute in refObject);\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber, _detail) {\n throw new Error(\n 'The getLmsErrorMessageDetails method has not been implemented');\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement) {\n throw new Error('The getCMIValue method has not been implemented');\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement, _value) {\n throw new Error('The setCMIValue method has not been implemented');\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: String, scorm2004: boolean, CMIElement, value) {\n if (!CMIElement || CMIElement === '') {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n const attribute = structure[i];\n\n if (i === structure.length - 1) {\n if (scorm2004 && (attribute.substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n this.throwSCORMError(this.#error_codes.READ_ONLY_ELEMENT);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (this.stringMatches(CMIElement, '\\\\.correct_responses\\\\.\\\\d')) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === 0) {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n const newChild = this.getChildElement(CMIElement, value,\n foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(methodName, null,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n global_constants.LOG_LEVEL_WARNING);\n }\n\n return returnValue;\n }\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement, _value) {\n // just a stub method\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {*}\n * @abstract\n */\n getChildElement(_CMIElement, _value, _foundFirstIndex) {\n throw new Error('The getChildElement method has not been implemented');\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {*}\n */\n _commonGetCMIValue(methodName: String, scorm2004: boolean, CMIElement) {\n if (!CMIElement || CMIElement === '') {\n return '';\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n attribute = structure[i];\n\n if (!scorm2004) {\n if (i === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if ((String(attribute).substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n const target = String(attribute).\n substr(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (refObject === undefined) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(this.#error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage);\n break;\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === '_children') {\n this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);\n } else if (attribute === '_count') {\n this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized() {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized() {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated() {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {*} value\n */\n processListeners(functionName: String, CMIElement: String, value: any) {\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n const CMIElementsMatch = listener.CMIElement === CMIElement;\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message: String) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog('throwSCORMError', null, errorNumber + ': ' + message,\n global_constants.LOG_LEVEL_ERROR);\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: String) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = 0;\n }\n }\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {string}\n * @abstract\n */\n storeData(_calculateTotalTime) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json, CMIElement) {\n this.loadFromJSON(unflatten(json), CMIElement);\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n CMIElement = CMIElement || 'cmi';\n\n this.startingData = json;\n\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = CMIElement + '.' + key;\n const value = json[key];\n\n if (value['childArray']) {\n for (let i = 0; i < value['childArray'].length; i++) {\n this.loadFromJSON(value['childArray'][i],\n currentCMIElement + '.' + i);\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString() {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.stringify({cmi});\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject() {\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {*}\n * @abstract\n */\n renderCommitCMI(_terminateCommit) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {object|Array} params\n * @return {object}\n */\n processHttpRequest(url: String, params) {\n const genericError = {\n 'result': global_constants.SCORM_FALSE,\n 'errorCode': this.#error_codes.GENERAL,\n };\n\n const httpReq = new XMLHttpRequest();\n httpReq.open('POST', url, false);\n try {\n if (params instanceof Array) {\n httpReq.setRequestHeader('Content-Type',\n 'application/x-www-form-urlencoded');\n httpReq.send(params.join('&'));\n } else {\n httpReq.setRequestHeader('Content-Type',\n this.settings.commitRequestDataType);\n httpReq.send(JSON.stringify(params));\n }\n } catch (e) {\n return genericError;\n }\n\n try {\n return JSON.parse(httpReq.responseText);\n } catch (e) {\n return genericError;\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n */\n scheduleCommit(when: number) {\n this.clearScheduledCommit();\n this.#timeout = setTimeout(this.scheduledCallback, when);\n this.apiLog('scheduleCommit', '', 'scheduled', global_constants.LOG_LEVEL_DEBUG);\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this.#timeout) {\n this.#scheduleCancelled = true;\n clearTimeout(this.#timeout);\n this.apiLog('clearScheduledCommit', '', 'cleared',\n global_constants.LOG_LEVEL_DEBUG);\n }\n }\n\n /**\n * Callback for scheduled commit timeout\n */\n scheduledCallback() {\n if (!this.#scheduleCancelled) {\n this.commit('Commit', false);\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n CMI,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject, NAV,\n} from './cmi/scorm12_cmi';\nimport * as Utilities from './utilities';\nimport {global_constants, scorm12_constants} from './constants/api_constants';\nimport {scorm12_error_codes} from './constants/error_codes';\n\nconst constants = scorm12_constants;\n\n/**\n * API class for SCORM 1.2\n */\nexport default class Scorm12API extends BaseAPI {\n /**\n * Constructor for SCORM 1.2 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm12_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n\n // Rename functions to match 1.2 Spec and expose to modules\n this.LMSInitialize = this.lmsInitialize;\n this.LMSFinish = this.lmsFinish;\n this.LMSGetValue = this.lmsGetValue;\n this.LMSSetValue = this.lmsSetValue;\n this.LMSCommit = this.lmsCommit;\n this.LMSGetLastError = this.lmsGetLastError;\n this.LMSGetErrorString = this.lmsGetErrorString;\n this.LMSGetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * lmsInitialize function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('LMSInitialize', 'LMS was already initialized!',\n 'LMS is already finished!');\n }\n\n /**\n * LMSFinish function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsFinish() {\n const result = this.terminate('LMSFinish', false);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.nav.event !== '') {\n if (this.nav.event === 'continue') {\n this.processListeners('SequenceNext');\n } else {\n this.processListeners('SequencePrevious');\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * LMSGetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('LMSGetValue', false, CMIElement);\n }\n\n /**\n * LMSSetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * LMSCommit function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('LMSCommit', false);\n }\n\n /**\n * LMSGetLastError function from SCORM 1.2 Spec\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('LMSGetLastError');\n }\n\n /**\n * LMSGetErrorString function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('LMSGetErrorString', CMIErrorCode);\n }\n\n /**\n * LMSGetDiagnostic function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('getCMIValue', false, CMIElement);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {*} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.correct_responses\\\\.\\\\d')) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d')) {\n newChild = new CMIInteractionsObject();\n }\n\n return newChild;\n }\n\n /**\n * Validates Correct Response values\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {boolean}\n */\n validateCorrectResponse(CMIElement, value) {\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {*} errorNumber\n * @param {boolean }detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = 'No Error';\n let detailMessage = 'No Error';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (constants.error_descriptions[errorNumber]) {\n basicMessage = constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {Scorm12API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n const originalStatus = this.cmi.core.lesson_status;\n if (originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'completed';\n }\n\n if (this.cmi.core.lesson_mode === 'normal') {\n if (this.cmi.core.credit === 'credit') {\n if (this.settings.mastery_override &&\n this.cmi.student_data.mastery_score !== '' &&\n this.cmi.core.score.raw !== '') {\n if (parseFloat(this.cmi.core.score.raw) >=\n parseFloat(this.cmi.student_data.mastery_score)) {\n this.cmi.core.lesson_status = 'passed';\n } else {\n this.cmi.core.lesson_status = 'failed';\n }\n }\n }\n } else if (this.cmi.core.lesson_mode === 'browse') {\n if ((this.startingData?.cmi?.core?.lesson_status || '') === '' &&\n originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'browsed';\n }\n }\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit);\n\n if (this.settings.lmsCommitUrl) {\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject);\n } else {\n console.log('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.log(commitObject);\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n ADL,\n CMI,\n CMICommentsObject,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject,\n} from './cmi/scorm2004_cmi';\nimport * as Utilities from './utilities';\nimport {global_constants, scorm2004_constants} from './constants/api_constants';\nimport {scorm2004_error_codes} from './constants/error_codes';\nimport {correct_responses} from './constants/response_constants';\nimport {valid_languages} from './constants/language_constants';\nimport {scorm2004_regex} from './constants/regex';\n\nconst constants = scorm2004_constants;\n\n/**\n * API class for SCORM 2004\n */\nexport default class Scorm2004API extends BaseAPI {\n #version: '1.0';\n\n /**\n * Constructor for SCORM 2004 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm2004_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.adl = new ADL();\n\n // Rename functions to match 2004 Spec and expose to modules\n this.Initialize = this.lmsInitialize;\n this.Terminate = this.lmsTerminate;\n this.GetValue = this.lmsGetValue;\n this.SetValue = this.lmsSetValue;\n this.Commit = this.lmsCommit;\n this.GetLastError = this.lmsGetLastError;\n this.GetErrorString = this.lmsGetErrorString;\n this.GetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * Getter for #version\n * @return {string}\n */\n get version() {\n return this.#version;\n }\n\n /**\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('Initialize');\n }\n\n /**\n * @return {string} bool\n */\n lmsTerminate() {\n const result = this.terminate('Terminate', true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.adl.nav.request !== '_none_') {\n switch (this.adl.nav.request) {\n case 'continue':\n this.processListeners('SequenceNext');\n break;\n case 'previous':\n this.processListeners('SequencePrevious');\n break;\n case 'choice':\n this.processListeners('SequenceChoice');\n break;\n case 'exit':\n this.processListeners('SequenceExit');\n break;\n case 'exitAll':\n this.processListeners('SequenceExitAll');\n break;\n case 'abandon':\n this.processListeners('SequenceAbandon');\n break;\n case 'abandonAll':\n this.processListeners('SequenceAbandonAll');\n break;\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('GetValue', true, CMIElement);\n }\n\n /**\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Orders LMS to store all content parameters\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('Commit');\n }\n\n /**\n * Returns last error code\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('GetLastError');\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('GetErrorString', CMIErrorCode);\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('GetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {any}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.correct_responses\\\\.\\\\d')) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const interaction = this.cmi.interactions.childArray[index];\n if (typeof interaction.type === 'undefined') {\n this.throwSCORMError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n const interaction_type = interaction.type;\n const interaction_count = interaction.correct_responses._count;\n if (interaction_type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode ===\n 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n const response_type = correct_responses[interaction_type];\n let nodes = [];\n if (response_type.delimiter !== '') {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n }\n if (this.lastErrorCode === 0) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n }\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d')) {\n newChild = new CMIInteractionsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_learner\\\\.\\\\d')) {\n newChild = new CMICommentsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_lms\\\\.\\\\d')) {\n newChild = new CMICommentsObject(true);\n }\n\n return newChild;\n }\n\n /**\n * Validate correct response.\n * @param {string} CMIElement\n * @param {*} value\n */\n validateCorrectResponse(CMIElement, value) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const pattern_index = Number(parts[4]);\n const interaction = this.cmi.interactions.childArray[index];\n\n const interaction_type = interaction.type;\n const interaction_count = interaction.correct_responses._count;\n if (interaction_type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode === 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n const response_type = scorm2004_constants.correct_responses[interaction_type];\n if (typeof response_type.limit !== 'undefined' || interaction_count <\n response_type.limit) {\n let nodes = [];\n if (response_type.delimiter !== '') {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n\n if (this.lastErrorCode === 0 &&\n (!response_type.duplicate ||\n !this.checkDuplicatedPattern(interaction.correct_responses,\n pattern_index, value)) ||\n (this.lastErrorCode === 0 && value === '')) {\n // do nothing, we want the inverse\n } else {\n if (this.lastErrorCode === 0) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Already Exists');\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Collection Limit Reached');\n }\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('GetValue', true, CMIElement);\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {(string|number)} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = '';\n let detailMessage = '';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (constants.error_descriptions[errorNumber]) {\n basicMessage = constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Check to see if a correct_response value has been duplicated\n * @param {CMIArray} correct_response\n * @param {number} current_index\n * @param {*} value\n * @return {boolean}\n */\n checkDuplicatedPattern = (correct_response, current_index, value) => {\n let found = false;\n const count = correct_response._count;\n for (let i = 0; i < count && !found; i++) {\n if (i !== current_index && correct_response.childArray[i] === value) {\n found = true;\n }\n }\n return found;\n };\n\n /**\n * Checks for a valid correct_response value\n * @param {string} interaction_type\n * @param {Array} nodes\n * @param {*} value\n */\n checkCorrectResponseValue(interaction_type, nodes, value) {\n const response = correct_responses[interaction_type];\n const formatRegex = new RegExp(response.format);\n for (let i = 0; i < nodes.length && this.lastErrorCode === 0; i++) {\n if (interaction_type.match(\n '^(fill-in|long-fill-in|matching|performance|sequencing)$')) {\n nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);\n }\n\n if (response.delimiter2 !== undefined) {\n const values = nodes[i].split(response.delimiter2);\n if (values.length === 2) {\n const matches = values[0].match(formatRegex);\n if (!matches) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (!values[1].match(new RegExp(response.format2))) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n const matches = nodes[i].match(formatRegex);\n if ((!matches && value !== '') ||\n (!matches && interaction_type === 'true-false')) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (interaction_type === 'numeric' && nodes.length > 1) {\n if (Number(nodes[0]) > Number(nodes[1])) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n if (nodes[i] !== '' && response.unique) {\n for (let j = 0; j < i && this.lastErrorCode === 0; j++) {\n if (nodes[i] === nodes[j]) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Remove prefixes from correct_response\n * @param {string} node\n * @return {*}\n */\n removeCorrectResponsePrefixes(node) {\n let seenOrder = false;\n let seenCase = false;\n let seenLang = false;\n\n const prefixRegex = new RegExp(\n '^({(lang|case_matters|order_matters)=([^}]+)})');\n let matches = node.match(prefixRegex);\n let langMatches = null;\n while (matches) {\n switch (matches[2]) {\n case 'lang':\n langMatches = node.match(scorm2004_regex.CMILangcr);\n if (langMatches) {\n const lang = langMatches[3];\n if (lang !== undefined && lang.length > 0) {\n if (valid_languages[lang.toLowerCase()] === undefined) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n seenLang = true;\n break;\n case 'case_matters':\n if (!seenLang && !seenOrder && !seenCase) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenCase = true;\n break;\n case 'order_matters':\n if (!seenCase && !seenLang && !seenOrder) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenOrder = true;\n break;\n default:\n break;\n }\n node = node.substr(matches[1].length);\n matches = node.match(prefixRegex);\n }\n\n return node;\n }\n\n /**\n * Replace the whole API with another\n * @param {Scorm2004API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.adl = newAPI.adl;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n if (this.cmi.mode === 'normal') {\n if (this.cmi.credit === 'credit') {\n if (this.cmi.completion_threshold && this.cmi.progress_measure) {\n if (this.cmi.progress_measure >= this.cmi.completion_threshold) {\n this.cmi.completion_status = 'completed';\n } else {\n this.cmi.completion_status = 'incomplete';\n }\n }\n if (this.cmi.scaled_passing_score !== null &&\n this.cmi.score.scaled !== '') {\n if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {\n this.cmi.success_status = 'passed';\n } else {\n this.cmi.success_status = 'failed';\n }\n }\n }\n }\n }\n\n let navRequest = false;\n if (this.adl.nav.request !== (this.startingData?.adl?.nav?.request) &&\n this.adl.nav.request !== '_none_') {\n this.adl.nav.request = encodeURIComponent(this.adl.nav.request);\n navRequest = true;\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit);\n\n if (this.settings.lmsCommitUrl) {\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n const result = this.processHttpRequest(this.settings.lmsCommitUrl,\n commitObject);\n // check if this is a sequencing call, and then call the necessary JS\n if (navRequest && result.navRequest !== undefined &&\n result.navRequest !== '') {\n Function(`\"use strict\";(() => { ${result.navRequest} })()`)();\n }\n return result;\n } else {\n console.log('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.log(commitObject);\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","import * as Scorm12CMI from './scorm12_cmi';\nimport {BaseCMI, CMIArray, CMIScore} from './common';\nimport {aicc_constants} from '../constants/api_constants';\nimport {aicc_regex} from '../constants/regex';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {\n check12ValidFormat,\n throwReadOnlyError,\n throwWriteOnlyError,\n} from './scorm12_cmi';\n\nconst constants = aicc_constants;\nconst regex = aicc_regex;\n\n/**\n * CMI Class for AICC\n */\nexport class CMI extends Scorm12CMI.CMI {\n /**\n * Constructor for AICC CMI object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super(constants.cmi_children);\n\n if (initialized) this.initialize();\n\n this.student_data = new AICCCMIStudentData();\n this.evaluation = new CMIEvaluation();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.student_data?.initialize();\n this.evaluation?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n 'evaluation': this.evaluation,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * AICC Evaluation object\n */\nclass CMIEvaluation extends BaseCMI {\n /**\n * Constructor for AICC Evaluation object\n */\n constructor() {\n super();\n\n this.comments = new CMIEvaluationComments();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.comments?.initialize();\n }\n\n /**\n * toJSON for cmi.evaluation object\n * @return {{comments: CMIEvaluationComments}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments': this.comments,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing AICC's cmi.evaluation.comments object\n */\nclass CMIEvaluationComments extends CMIArray {\n /**\n * Constructor for AICC Evaluation Comments object\n */\n constructor() {\n super(constants.comments_children,\n scorm12_error_codes.INVALID_SET_VALUE);\n }\n}\n\n/**\n * StudentData class for AICC\n */\nclass AICCCMIStudentData extends Scorm12CMI.CMIStudentData {\n /**\n * Constructor for AICC StudentData object\n */\n constructor() {\n super(constants.student_data_children);\n\n this.tries = new CMITries();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.tries?.initialize();\n }\n\n #tries_during_lesson = '';\n\n /**\n * Getter for tries_during_lesson\n * @return {string}\n */\n get tries_during_lesson() {\n return this.#tries_during_lesson;\n }\n\n /**\n * Setter for #tries_during_lesson. Sets an error if trying to set after\n * initialization.\n * @param {string} tries_during_lesson\n */\n set tries_during_lesson(tries_during_lesson) {\n !this.initialized ?\n this.#tries_during_lesson = tries_during_lesson :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data object\n * @return {\n * {\n * mastery_score: string,\n * max_time_allowed: string,\n * time_limit_action: string,\n * tries: CMITries\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n 'tries': this.tries,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.student_data.tries object\n */\nexport class CMITries extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super(aicc_constants.tries_children);\n }\n}\n\n/**\n * Class for AICC Tries\n */\nexport class CMITriesObject extends BaseCMI {\n /**\n * Constructor for AICC Tries object\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #status = '';\n #time = '';\n\n /**\n * Getter for #status\n * @return {string}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.student_data.tries.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'status': this.status,\n 'time': this.time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Evaluation Comments\n */\nexport class CMIEvaluationCommentsObject extends BaseCMI {\n /**\n * Constructor for Evaluation Comments\n */\n constructor() {\n super();\n }\n\n #content = '';\n #location = '';\n #time = '';\n\n /**\n * Getter for #content\n * @return {string}\n */\n get content() {\n return this.#content;\n }\n\n /**\n * Setter for #content\n * @param {string} content\n */\n set content(content) {\n if (check12ValidFormat(content, regex.CMIString256)) {\n this.#content = content;\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check12ValidFormat(location, regex.CMIString256)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setting for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.evaulation.comments.n object\n * @return {\n * {\n * content: string,\n * location: string,\n * time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'content': this.content,\n 'location': this.location,\n 'time': this.time,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {scorm12_constants} from '../constants/api_constants';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {ValidationError} from '../exceptions';\nimport {scorm12_regex} from '../constants/regex';\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: String,\n regexPattern: String,\n errorCode: number,\n allowEmptyString?: boolean) {\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === '') {\n return true;\n }\n if (value === undefined || !matches || matches[0] === '') {\n throw new ValidationError(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {*} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any, rangePattern: String, errorCode: number) {\n const ranges = rangePattern.split('#');\n value = value * 1.0;\n if (value >= ranges[0]) {\n if ((ranges[1] === '*') || (value <= ranges[1])) {\n return true;\n } else {\n throw new ValidationError(errorCode);\n }\n } else {\n throw new ValidationError(errorCode);\n }\n}\n\n/**\n * Base class for API cmi objects\n */\nexport class BaseCMI {\n jsonString = false;\n #initialized = false;\n\n /**\n * Constructor for BaseCMI, just marks the class as abstract\n */\n constructor() {\n if (new.target === BaseCMI) {\n throw new TypeError('Cannot construct BaseCMI instances directly');\n }\n }\n\n /**\n * Getter for #initialized\n * @return {boolean}\n */\n get initialized() {\n return this.#initialized;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n this.#initialized = true;\n }\n}\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n /**\n * Constructor for *.score\n * @param {string} score_children\n * @param {string} score_range\n * @param {string} max\n * @param {number} invalidErrorCode\n * @param {number} invalidTypeCode\n * @param {number} invalidRangeCode\n * @param {string} decimalRegex\n */\n constructor(\n {\n score_children,\n score_range,\n max,\n invalidErrorCode,\n invalidTypeCode,\n invalidRangeCode,\n decimalRegex,\n }) {\n super();\n\n this.#_children = score_children ||\n scorm12_constants.score_children;\n this.#_score_range = !score_range ? false : scorm12_regex.score_range;\n this.#max = (max || max === '') ? max : '100';\n this.#_invalid_error_code = invalidErrorCode ||\n scorm12_error_codes.INVALID_SET_VALUE;\n this.#_invalid_type_code = invalidTypeCode ||\n scorm12_error_codes.TYPE_MISMATCH;\n this.#_invalid_range_code = invalidRangeCode ||\n scorm12_error_codes.VALUE_OUT_OF_RANGE;\n this.#_decimal_regex = decimalRegex ||\n scorm12_regex.CMIDecimal;\n }\n\n #_children;\n #_score_range;\n #_invalid_error_code;\n #_invalid_type_code;\n #_invalid_range_code;\n #_decimal_regex;\n #raw = '';\n #min = '';\n #max;\n\n /**\n * Getter for _children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throw new ValidationError(this.#_invalid_error_code);\n }\n\n /**\n * Getter for #raw\n * @return {string}\n */\n get raw() {\n return this.#raw;\n }\n\n /**\n * Setter for #raw\n * @param {string} raw\n */\n set raw(raw) {\n if (checkValidFormat(raw, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(raw, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#raw = raw;\n }\n }\n\n /**\n * Getter for #min\n * @return {string}\n */\n get min() {\n return this.#min;\n }\n\n /**\n * Setter for #min\n * @param {string} min\n */\n set min(min) {\n if (checkValidFormat(min, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(min, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#min = min;\n }\n }\n\n /**\n * Getter for #max\n * @return {string}\n */\n get max() {\n return this.#max;\n }\n\n /**\n * Setter for #max\n * @param {string} max\n */\n set max(max) {\n if (checkValidFormat(max, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(max, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {{min: string, max: string, raw: string}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'raw': this.raw,\n 'min': this.min,\n 'max': this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n /**\n * Constructor cmi *.n arrays\n * @param {string} children\n * @param {number} errorCode\n */\n constructor({children, errorCode}) {\n super();\n this.#_children = children;\n this.#errorCode = errorCode;\n this.childArray = [];\n }\n\n #errorCode;\n #_children;\n\n /**\n * Getter for _children\n * @return {*}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throw new ValidationError(this.#errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count() {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count) {\n throw new ValidationError(this.#errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON() {\n this.jsonString = true;\n const result = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + ''] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport {scorm12_constants} from '../constants/api_constants';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {scorm12_regex} from '../constants/regex';\nimport {ValidationError} from '../exceptions';\nimport * as Utilities from '../utilities';\n\nconst constants = scorm12_constants;\nconst regex = scorm12_regex;\n\n/**\n * Helper method for throwing Read Only error\n */\nexport function throwReadOnlyError() {\n throw new ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nexport function throwWriteOnlyError() {\n throw new ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Invalid Set error\n */\nfunction throwInvalidValueError() {\n throw new ValidationError(scorm12_error_codes.INVALID_SET_VALUE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(value, regexPattern,\n scorm12_error_codes.TYPE_MISMATCH, allowEmptyString);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidRange(\n value: any,\n rangePattern: String,\n allowEmptyString?: boolean) {\n return checkValidRange(value, rangePattern,\n scorm12_error_codes.VALUE_OUT_OF_RANGE, allowEmptyString);\n}\n\n/**\n * Class representing the cmi object for SCORM 1.2\n */\nexport class CMI extends BaseCMI {\n #_children = '';\n #_version = '3.4';\n #suspend_data = '';\n #launch_data = '';\n #comments = '';\n #comments_from_lms = '';\n\n student_data = null;\n\n /**\n * Constructor for the SCORM 1.2 cmi object\n * @param {string} cmi_children\n * @param {(CMIStudentData|AICCCMIStudentData)} student_data\n * @param {boolean} initialized\n */\n constructor(cmi_children, student_data, initialized: boolean) {\n super();\n\n if (initialized) this.initialize();\n\n this.#_children = cmi_children ? cmi_children : constants.cmi_children;\n this.core = new CMICore();\n this.objectives = new CMIObjectives();\n this.student_data = student_data ? student_data : new CMIStudentData();\n this.student_preference = new CMIStudentPreference();\n this.interactions = new CMIInteractions();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.core?.initialize();\n this.objectives?.initialize();\n this.student_data?.initialize();\n this.student_preference?.initialize();\n this.interactions?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n };\n delete this.jsonString;\n return result;\n }\n\n /**\n * Getter for #_version\n * @return {string}\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n */\n set _version(_version) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check12ValidFormat(suspend_data, regex.CMIString4096)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #comments\n * @return {string}\n */\n get comments() {\n return this.#comments;\n }\n\n /**\n * Setter for #comments\n * @param {string} comments\n */\n set comments(comments) {\n if (check12ValidFormat(comments, regex.CMIString4096)) {\n this.#comments = comments;\n }\n }\n\n /**\n * Getter for #comments_from_lms\n * @return {string}\n */\n get comments_from_lms() {\n return this.#comments_from_lms;\n }\n\n /**\n * Setter for #comments_from_lms. Can only be called before initialization.\n * @param {string} comments_from_lms\n */\n set comments_from_lms(comments_from_lms) {\n !this.initialized ?\n this.#comments_from_lms = comments_from_lms :\n throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return this.core.getCurrentTotalTime();\n }\n}\n\n/**\n * Class representing the cmi.core object\n * @extends BaseCMI\n */\nclass CMICore extends BaseCMI {\n /**\n * Constructor for cmi.core\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #_children = constants.core_children;\n #student_id = '';\n #student_name = '';\n #lesson_location = '';\n #credit = '';\n #lesson_status = 'not attempted';\n #entry = '';\n #total_time = '';\n #lesson_mode = 'normal';\n #exit = '';\n #session_time = '00:00:00';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #student_id\n * @return {string}\n */\n get student_id() {\n return this.#student_id;\n }\n\n /**\n * Setter for #student_id. Can only be called before initialization.\n * @param {string} student_id\n */\n set student_id(student_id) {\n !this.initialized ? this.#student_id = student_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #student_name\n * @return {string}\n */\n get student_name() {\n return this.#student_name;\n }\n\n /**\n * Setter for #student_name. Can only be called before initialization.\n * @param {string} student_name\n */\n set student_name(student_name) {\n !this.initialized ?\n this.#student_name = student_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_location\n * @return {string}\n */\n get lesson_location() {\n return this.#lesson_location;\n }\n\n /**\n * Setter for #lesson_location\n * @param {string} lesson_location\n */\n set lesson_location(lesson_location) {\n if (check12ValidFormat(lesson_location, regex.CMIString256)) {\n this.#lesson_location = lesson_location;\n }\n }\n\n /**\n * Getter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (check12ValidFormat(lesson_status, regex.CMIStatus)) {\n this.#lesson_status = lesson_status;\n }\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_mode\n * @return {string}\n */\n get lesson_mode() {\n return this.#lesson_mode;\n }\n\n /**\n * Setter for #lesson_mode. Can only be called before initialization.\n * @param {string} lesson_mode\n */\n set lesson_mode(lesson_mode) {\n !this.initialized ? this.#lesson_mode = lesson_mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {*}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Setter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check12ValidFormat(exit, regex.CMIExit)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {*}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check12ValidFormat(session_time, regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return Utilities.addHHMMSSTimeStrings(\n this.#total_time,\n this.#session_time,\n new RegExp(scorm12_regex.CMITimespan)\n );\n }\n\n /**\n * toJSON for cmi.core\n *\n * @return {\n * {\n * student_name: string,\n * entry: string,\n * exit: string,\n * score: CMIScore,\n * student_id: string,\n * lesson_mode: string,\n * lesson_location: string,\n * lesson_status: string,\n * credit: string,\n * total_time: string,\n * session_time: *\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'student_id': this.student_id,\n 'student_name': this.student_name,\n 'lesson_location': this.lesson_location,\n 'credit': this.credit,\n 'lesson_status': this.lesson_status,\n 'entry': this.entry,\n 'total_time': this.total_time,\n 'lesson_mode': this.lesson_mode,\n 'exit': this.exit,\n 'session_time': this.session_time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives object\n * @extends CMIArray\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives\n */\n constructor() {\n super({\n children: constants.objectives_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_data object\n * @extends BaseCMI\n */\nexport class CMIStudentData extends BaseCMI {\n #_children;\n #mastery_score = '';\n #max_time_allowed = '';\n #time_limit_action = '';\n\n /**\n * Constructor for cmi.student_data\n * @param {string} student_data_children\n */\n constructor(student_data_children) {\n super();\n\n this.#_children = student_data_children ?\n student_data_children :\n constants.student_data_children;\n }\n\n /**\n * Getter for #_children\n * @return {*}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #master_score\n * @return {string}\n */\n get mastery_score() {\n return this.#mastery_score;\n }\n\n /**\n * Setter for #master_score. Can only be called before initialization.\n * @param {string} mastery_score\n */\n set mastery_score(mastery_score) {\n !this.initialized ?\n this.#mastery_score = mastery_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data\n *\n * @return {\n * {\n * max_time_allowed: string,\n * time_limit_action: string,\n * mastery_score: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_preference object\n * @extends BaseCMI\n */\nclass CMIStudentPreference extends BaseCMI {\n /**\n * Constructor for cmi.student_preference\n */\n constructor() {\n super();\n }\n\n #_children = constants.student_preference_children;\n #audio = '';\n #language = '';\n #speed = '';\n #text = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #audio\n * @return {string}\n */\n get audio() {\n return this.#audio;\n }\n\n /**\n * Setter for #audio\n * @param {string} audio\n */\n set audio(audio) {\n if (check12ValidFormat(audio, regex.CMISInteger) &&\n check12ValidRange(audio, regex.audio_range)) {\n this.#audio = audio;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check12ValidFormat(language, regex.CMIString256)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #speed\n * @return {string}\n */\n get speed() {\n return this.#speed;\n }\n\n /**\n * Setter for #speed\n * @param {string} speed\n */\n set speed(speed) {\n if (check12ValidFormat(speed, regex.CMISInteger) &&\n check12ValidRange(speed, regex.speed_range)) {\n this.#speed = speed;\n }\n }\n\n /**\n * Getter for #text\n * @return {string}\n */\n get text() {\n return this.#text;\n }\n\n /**\n * Setter for #text\n * @param {string} text\n */\n set text(text) {\n if (check12ValidFormat(text, regex.CMISInteger) &&\n check12ValidRange(text, regex.text_range)) {\n this.#text = text;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'speed': this.speed,\n 'text': this.text,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions object\n * @extends BaseCMI\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.interactions\n */\n constructor() {\n super({\n children: constants.interactions_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n object\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n children: constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n children: constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n #id = '';\n #time = '';\n #type = '';\n #weighting = '';\n #student_response = '';\n #result = '';\n #latency = '';\n\n /**\n * Getter for #id. Should only be called during JSON export.\n * @return {*}\n */\n get id() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #time. Should only be called during JSON export.\n * @return {*}\n */\n get time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #type. Should only be called during JSON export.\n * @return {*}\n */\n get type() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check12ValidFormat(type, regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #weighting. Should only be called during JSON export.\n * @return {*}\n */\n get weighting() {\n return (!this.jsonString) ?\n throwWriteOnlyError() :\n this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check12ValidFormat(weighting, regex.CMIDecimal) &&\n check12ValidRange(weighting, regex.weighting_range)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #student_response. Should only be called during JSON export.\n * @return {*}\n */\n get student_response() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#student_response;\n }\n\n /**\n * Setter for #student_response\n * @param {string} student_response\n */\n set student_response(student_response) {\n if (check12ValidFormat(student_response, regex.CMIFeedback, true)) {\n this.#student_response = student_response;\n }\n }\n\n /**\n * Getter for #result. Should only be called during JSON export.\n * @return {*}\n */\n get result() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check12ValidFormat(result, regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency. Should only be called during JSON export.\n * @return {*}\n */\n get latency() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check12ValidFormat(latency, regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * time: string,\n * type: string,\n * weighting: string,\n * student_response: string,\n * result: string,\n * latency: string,\n * objectives: CMIArray,\n * correct_responses: CMIArray\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'time': this.time,\n 'type': this.type,\n 'weighting': this.weighting,\n 'student_response': this.student_response,\n 'result': this.result,\n 'latency': this.latency,\n 'objectives': this.objectives,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n #id = '';\n #status = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #status\n * @return {\"\"}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n * @return {\n * {\n * id: string,\n * status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'status': this.status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n #id = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.correct_responses.n\n */\n constructor() {\n super();\n }\n\n #pattern = '';\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check12ValidFormat(pattern, regex.CMIFeedback, true)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON for cmi.interactions.correct_responses.n\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Navigation object\n */\nexport class NAV extends BaseCMI {\n /**\n * Constructor for NAV object\n */\n constructor() {\n super();\n }\n\n #event = '';\n\n /**\n * Getter for #event\n * @return {string}\n */\n get event() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#event;\n }\n\n /**\n * Setter for #event\n * @param {string} event\n */\n set event(event) {\n if (check12ValidFormat(event, regex.NAVEvent)) {\n this.#event = event;\n }\n }\n\n /**\n * toJSON for nav object\n * @return {\n * {\n * event: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'event': this.event,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport {scorm2004_constants} from '../constants/api_constants';\nimport {scorm2004_regex} from '../constants/regex';\nimport {scorm2004_error_codes} from '../constants/error_codes';\nimport {learner_responses} from '../constants/response_constants';\nimport {ValidationError} from '../exceptions';\nimport * as Util from '../utilities';\n\nconst constants = scorm2004_constants;\nconst regex = scorm2004_regex;\n\n/**\n * Helper method for throwing Read Only error\n */\nfunction throwReadOnlyError() {\n throw new ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nfunction throwWriteOnlyError() {\n throw new ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Type Mismatch error\n */\nfunction throwTypeMismatchError() {\n throw new ValidationError(scorm2004_error_codes.TYPE_MISMATCH);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nfunction check2004ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(value, regexPattern,\n scorm2004_error_codes.TYPE_MISMATCH, allowEmptyString);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @return {boolean}\n */\nfunction check2004ValidRange(value: any, rangePattern: String) {\n return checkValidRange(value, rangePattern,\n scorm2004_error_codes.VALUE_OUT_OF_RANGE);\n}\n\n/**\n * Class representing cmi object for SCORM 2004\n */\nexport class CMI extends BaseCMI {\n /**\n * Constructor for the SCORM 2004 cmi object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super();\n\n this.learner_preference = new CMILearnerPreference();\n this.score = new Scorm2004CMIScore();\n this.comments_from_learner = new CMICommentsFromLearner();\n this.comments_from_lms = new CMICommentsFromLMS();\n this.interactions = new CMIInteractions();\n this.objectives = new CMIObjectives();\n\n if (initialized) this.initialize();\n }\n\n #_version = '1.0';\n #_children = constants.cmi_children;\n #completion_status = 'unknown';\n #completion_threshold = '';\n #credit = 'credit';\n #entry = '';\n #exit = '';\n #launch_data = '';\n #learner_id = '';\n #learner_name = '';\n #location = '';\n #max_time_allowed = '';\n #mode = 'normal';\n #progress_measure = '';\n #scaled_passing_score = '';\n #session_time = 'PT0H0M0S';\n #success_status = 'unknown';\n #suspend_data = '';\n #time_limit_action = 'continue,no message';\n #total_time = '0';\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.learner_preference?.initialize();\n this.score?.initialize();\n this.comments_from_learner?.initialize();\n this.comments_from_lms?.initialize();\n this.interactions?.initialize();\n this.objectives?.initialize();\n }\n\n /**\n * Getter for #_version\n * @return {string}\n * @private\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n * @private\n */\n set _version(_version) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {number} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #completion_threshold\n * @return {string}\n */\n get completion_threshold() {\n return this.#completion_threshold;\n }\n\n /**\n * Setter for #completion_threshold. Can only be called before initialization.\n * @param {string} completion_threshold\n */\n set completion_threshold(completion_threshold) {\n !this.initialized ?\n this.#completion_threshold = completion_threshold :\n throwReadOnlyError();\n }\n\n /**\n * Setter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Getter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check2004ValidFormat(exit, regex.CMIExit)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_id\n * @return {string}\n */\n get learner_id() {\n return this.#learner_id;\n }\n\n /**\n * Setter for #learner_id. Can only be called before initialization.\n * @param {string} learner_id\n */\n set learner_id(learner_id) {\n !this.initialized ? this.#learner_id = learner_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_name\n * @return {string}\n */\n get learner_name() {\n return this.#learner_name;\n }\n\n /**\n * Setter for #learner_name. Can only be called before initialization.\n * @param {string} learner_name\n */\n set learner_name(learner_name) {\n !this.initialized ?\n this.#learner_name = learner_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check2004ValidFormat(location, regex.CMIString1000)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #mode\n * @return {string}\n */\n get mode() {\n return this.#mode;\n }\n\n /**\n * Setter for #mode. Can only be called before initialization.\n * @param {string} mode\n */\n set mode(mode) {\n !this.initialized ? this.#mode = mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #scaled_passing_score\n * @return {string}\n */\n get scaled_passing_score() {\n return this.#scaled_passing_score;\n }\n\n /**\n * Setter for #scaled_passing_score. Can only be called before initialization.\n * @param {string} scaled_passing_score\n */\n set scaled_passing_score(scaled_passing_score) {\n !this.initialized ?\n this.#scaled_passing_score = scaled_passing_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check2004ValidFormat(session_time, regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check2004ValidFormat(suspend_data, regex.CMIString64000, true)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string} ISO8601 Duration\n */\n getCurrentTotalTime() {\n return Util.addTwoDurations(\n this.#total_time,\n this.#session_time,\n scorm2004_regex.CMITimespan,\n );\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * comments_from_learner: CMICommentsFromLearner,\n * comments_from_lms: CMICommentsFromLMS,\n * completion_status: string,\n * completion_threshold: string,\n * credit: string,\n * entry: string,\n * exit: string,\n * interactions: CMIInteractions,\n * launch_data: string,\n * learner_id: string,\n * learner_name: string,\n * learner_preference: CMILearnerPreference,\n * location: string,\n * max_time_allowed: string,\n * mode: string,\n * objectives: CMIObjectives,\n * progress_measure: string,\n * scaled_passing_score: string,\n * score: Scorm2004CMIScore,\n * session_time: string,\n * success_status: string,\n * suspend_data: string,\n * time_limit_action: string,\n * total_time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments_from_learner': this.comments_from_learner,\n 'comments_from_lms': this.comments_from_lms,\n 'completion_status': this.completion_status,\n 'completion_threshold': this.completion_threshold,\n 'credit': this.credit,\n 'entry': this.entry,\n 'exit': this.exit,\n 'interactions': this.interactions,\n 'launch_data': this.launch_data,\n 'learner_id': this.learner_id,\n 'learner_name': this.learner_name,\n 'learner_preference': this.learner_preference,\n 'location': this.location,\n 'max_time_allowed': this.max_time_allowed,\n 'mode': this.mode,\n 'objectives': this.objectives,\n 'progress_measure': this.progress_measure,\n 'scaled_passing_score': this.scaled_passing_score,\n 'score': this.score,\n 'session_time': this.session_time,\n 'success_status': this.success_status,\n 'suspend_data': this.suspend_data,\n 'time_limit_action': this.time_limit_action,\n 'total_time': this.total_time,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.learner_preference object\n */\nclass CMILearnerPreference extends BaseCMI {\n #_children = constants.student_preference_children;\n #audio_level = '1';\n #language = '';\n #delivery_speed = '1';\n #audio_captioning = '0';\n\n /**\n * Constructor for cmi.learner_preference\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #audio_level\n * @return {string}\n */\n get audio_level() {\n return this.#audio_level;\n }\n\n /**\n * Setter for #audio_level\n * @param {string} audio_level\n */\n set audio_level(audio_level) {\n if (check2004ValidFormat(audio_level, regex.CMIDecimal) &&\n check2004ValidRange(audio_level, regex.audio_range)) {\n this.#audio_level = audio_level;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check2004ValidFormat(language, regex.CMILang)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #delivery_speed\n * @return {string}\n */\n get delivery_speed() {\n return this.#delivery_speed;\n }\n\n /**\n * Setter for #delivery_speed\n * @param {string} delivery_speed\n */\n set delivery_speed(delivery_speed) {\n if (check2004ValidFormat(delivery_speed, regex.CMIDecimal) &&\n check2004ValidRange(delivery_speed, regex.speed_range)) {\n this.#delivery_speed = delivery_speed;\n }\n }\n\n /**\n * Getter for #audio_captioning\n * @return {string}\n */\n get audio_captioning() {\n return this.#audio_captioning;\n }\n\n /**\n * Setter for #audio_captioning\n * @param {string} audio_captioning\n */\n set audio_captioning(audio_captioning) {\n if (check2004ValidFormat(audio_captioning, regex.CMISInteger) &&\n check2004ValidRange(audio_captioning, regex.text_range)) {\n this.#audio_captioning = audio_captioning;\n }\n }\n\n /**\n * toJSON for cmi.learner_preference\n *\n * @return {\n * {\n * audio_level: string,\n * language: string,\n * delivery_speed: string,\n * audio_captioning: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio_level': this.audio_level,\n 'language': this.language,\n 'delivery_speed': this.delivery_speed,\n 'audio_captioning': this.audio_captioning,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions object\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: constants.interactions_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.objectives object\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: constants.objectives_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_lms object\n */\nclass CMICommentsFromLMS extends CMIArray {\n /**\n * Constructor for cmi.comments_from_lms Array\n */\n constructor() {\n super({\n children: constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner object\n */\nclass CMICommentsFromLearner extends CMIArray {\n /**\n * Constructor for cmi.comments_from_learner Array\n */\n constructor() {\n super({\n children: constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.interaction.n object\n */\nexport class CMIInteractionsObject extends BaseCMI {\n #id = '';\n #type = '';\n #timestamp = '';\n #weighting = '';\n #learner_response = '';\n #result = '';\n #latency = '';\n #description = '';\n\n /**\n * Constructor for cmi.interaction.n\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n children: constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n children: constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #type\n * @return {string}\n */\n get type() {\n return this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check2004ValidFormat(type, regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (check2004ValidFormat(timestamp, regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n\n /**\n * Getter for #weighting\n * @return {string}\n */\n get weighting() {\n return this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check2004ValidFormat(weighting, regex.CMIDecimal)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #learner_response\n * @return {string}\n */\n get learner_response() {\n return this.#learner_response;\n }\n\n /**\n * Setter for #learner_response. Does type validation to make sure response\n * matches SCORM 2004's spec\n * @param {string} learner_response\n */\n set learner_response(learner_response) {\n if (typeof this.type === 'undefined') {\n throw new ValidationError(\n scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n let nodes = [];\n const response_type = learner_responses[this.type];\n if (response_type.delimiter !== '') {\n nodes = learner_response.split(response_type.delimiter);\n } else {\n nodes[0] = learner_response;\n }\n\n if ((nodes.length > 0) && (nodes.length <= response_type.max)) {\n const formatRegex = new RegExp(response_type.format);\n for (let i = 0; i < nodes.length; i++) {\n if (typeof response_type.delimiter2 !== 'undefined') {\n const values = nodes[i].split(response_type.delimiter2);\n if (values.length === 2) {\n if (!values[0].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (!values[1].match(new RegExp(response_type.format2))) {\n throwTypeMismatchError();\n }\n }\n } else {\n throwTypeMismatchError();\n }\n } else {\n if (!nodes[i].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (nodes[i] !== '' && response_type.unique) {\n for (let j = 0; j < i; j++) {\n if (nodes[i] === nodes[j]) {\n throwTypeMismatchError();\n }\n }\n }\n }\n }\n }\n } else {\n throw new ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n /**\n * Getter for #result\n * @return {string}\n */\n get result() {\n return this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check2004ValidFormat(result, regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency\n * @return {string}\n */\n get latency() {\n return this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check2004ValidFormat(latency, regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (check2004ValidFormat(description, regex.CMILangString250, true)) {\n this.#description = description;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * type: string,\n * objectives: CMIArray,\n * timestamp: string,\n * correct_responses: CMIArray,\n * weighting: string,\n * learner_response: string,\n * result: string,\n * latency: string,\n * description: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'type': this.type,\n 'objectives': this.objectives,\n 'timestamp': this.timestamp,\n 'weighting': this.weighting,\n 'learner_response': this.learner_response,\n 'result': this.result,\n 'latency': this.latency,\n 'description': this.description,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.objectives.n object\n */\nexport class CMIObjectivesObject extends BaseCMI {\n #id = '';\n #success_status = 'unknown';\n #completion_status = 'unknown';\n #progress_measure = '';\n #description = '';\n\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new Scorm2004CMIScore();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (check2004ValidFormat(description, regex.CMILangString250, true)) {\n this.#description = description;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n *\n * @return {\n * {\n * id: string,\n * success_status: string,\n * completion_status: string,\n * progress_measure: string,\n * description: string,\n * score: Scorm2004CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'success_status': this.success_status,\n 'completion_status': this.completion_status,\n 'progress_measure': this.progress_measure,\n 'description': this.description,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi *.score object\n */\nclass Scorm2004CMIScore extends CMIScore {\n #scaled = '';\n\n /**\n * Constructor for cmi *.score\n */\n constructor() {\n super(\n {\n score_children: constants.score_children,\n max: '',\n invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,\n decimalRegex: scorm2004_regex.CMIDecimal,\n });\n }\n\n /**\n * Getter for #scaled\n * @return {string}\n */\n get scaled() {\n return this.#scaled;\n }\n\n /**\n * Setter for #scaled\n * @param {string} scaled\n */\n set scaled(scaled) {\n if (check2004ValidFormat(scaled, regex.CMIDecimal) &&\n check2004ValidRange(scaled, regex.scaled_range)) {\n this.#scaled = scaled;\n }\n }\n\n /**\n * toJSON for cmi *.score\n *\n * @return {\n * {\n * scaled: string,\n * raw: string,\n * min: string,\n * max: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'scaled': this.scaled,\n 'raw': super.raw,\n 'min': super.min,\n 'max': super.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object\n */\nexport class CMICommentsObject extends BaseCMI {\n #comment = '';\n #location = '';\n #timestamp = '';\n #readOnlyAfterInit;\n\n /**\n * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n\n * @param {boolean} readOnlyAfterInit\n */\n constructor(readOnlyAfterInit = false) {\n super();\n this.#comment = '';\n this.#location = '';\n this.#timestamp = '';\n this.#readOnlyAfterInit = readOnlyAfterInit;\n }\n\n /**\n * Getter for #comment\n * @return {string}\n */\n get comment() {\n return this.#comment;\n }\n\n /**\n * Setter for #comment\n * @param {string} comment\n */\n set comment(comment) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(comment, regex.CMILangString4000, true)) {\n this.#comment = comment;\n }\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(location, regex.CMIString250)) {\n this.#location = location;\n }\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(timestamp, regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n }\n\n /**\n * toJSON for cmi.comments_from_learner.n object\n * @return {\n * {\n * comment: string,\n * location: string,\n * timestamp: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comment': this.comment,\n 'location': this.location,\n 'timestamp': this.timestamp,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.objectives.n object\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n #id = '';\n\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n #pattern = '';\n\n /**\n * Constructor for cmi.interactions.n.correct_responses.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check2004ValidFormat(pattern, regex.CMIFeedback)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON cmi.interactions.n.correct_responses.n object\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl object\n */\nexport class ADL extends BaseCMI {\n /**\n * Constructor for adl\n */\n constructor() {\n super();\n\n this.nav = new ADLNav();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.nav?.initialize();\n }\n\n /**\n * toJSON for adl\n * @return {\n * {\n * nav: {\n * request: string\n * }\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'nav': this.nav,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav object\n */\nclass ADLNav extends BaseCMI {\n #request = '_none_';\n\n /**\n * Constructor for adl.nav\n */\n constructor() {\n super();\n\n this.request_valid = new ADLNavRequestValid();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.request_valid?.initialize();\n }\n\n /**\n * Getter for #request\n * @return {string}\n */\n get request() {\n return this.#request;\n }\n\n /**\n * Setter for #request\n * @param {string} request\n */\n set request(request) {\n if (check2004ValidFormat(request, regex.NAVEvent)) {\n this.#request = request;\n }\n }\n\n /**\n * toJSON for adl.nav\n *\n * @return {\n * {\n * request: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'request': this.request,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav.request_valid object\n */\nclass ADLNavRequestValid extends BaseCMI {\n #continue = 'unknown';\n #previous = 'unknown';\n choice = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n jump = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n\n /**\n * Constructor for adl.nav.request_valid\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #continue\n * @return {string}\n */\n get continue() {\n return this.#continue;\n }\n\n /**\n * Setter for #continue. Just throws an error.\n * @param {*} _\n */\n set continue(_) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #previous\n * @return {string}\n */\n get previous() {\n return this.#previous;\n }\n\n /**\n * Setter for #previous. Just throws an error.\n * @param {*} _\n */\n set previous(_) {\n throwReadOnlyError();\n }\n\n /**\n * toJSON for adl.nav.request_valid\n *\n * @return {\n * {\n * previous: string,\n * continue: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'previous': this.previous,\n 'continue': this.continue,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\n\nexport const global_constants = {\n SCORM_TRUE: 'true',\n SCORM_FALSE: 'false',\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n LOG_LEVEL_DEBUG: 1,\n LOG_LEVEL_INFO: 2,\n LOG_LEVEL_WARNING: 3,\n LOG_LEVEL_ERROR: 4,\n LOG_LEVEL_NONE: 5,\n};\n\nexport const scorm12_constants = {\n // Children lists\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',\n core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',\n score_children: 'raw,min,max',\n comments_children: 'content,location,time',\n objectives_children: 'id,score,status',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio,language,speed,text',\n interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',\n\n error_descriptions: {\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information',\n },\n '201': {\n basicMessage: 'Invalid argument error',\n detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.',\n },\n '202': {\n basicMessage: 'Element cannot have children',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n '203': {\n basicMessage: 'Element not an array - cannot have count',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n '301': {\n basicMessage: 'Not initialized',\n detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.',\n },\n '401': {\n basicMessage: 'Not implemented error',\n detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.',\n },\n '402': {\n basicMessage: 'Invalid set value, element is a keyword',\n detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n '403': {\n basicMessage: 'Element is read only',\n detailMessage: 'LMSSetValue was called with a data model element that can only be read.',\n },\n '404': {\n basicMessage: 'Element is write only',\n detailMessage: 'LMSGetValue was called on a data model element that can only be written to.',\n },\n '405': {\n basicMessage: 'Incorrect Data Type',\n detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n },\n};\n\nexport const aicc_constants = {\n ...scorm12_constants, ...{\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',\n student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',\n tries_children: 'time,status,score',\n },\n};\n\nexport const scorm2004_constants = {\n // Children lists\n cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',\n comments_children: 'comment,timestamp,location',\n score_children: 'max,raw,scaled,min',\n objectives_children: 'progress_measure,completion_status,success_status,description,score,id',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',\n interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',\n\n error_descriptions: {\n '0': {\n basicMessage: 'No Error',\n detailMessage: 'No error occurred, the previous API call was successful.',\n },\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.',\n },\n '102': {\n basicMessage: 'General Initialization Failure',\n detailMessage: 'Call to Initialize failed for an unknown reason.',\n },\n '103': {\n basicMessage: 'Already Initialized',\n detailMessage: 'Call to Initialize failed because Initialize was already called.',\n },\n '104': {\n basicMessage: 'Content Instance Terminated',\n detailMessage: 'Call to Initialize failed because Terminate was already called.',\n },\n '111': {\n basicMessage: 'General Termination Failure',\n detailMessage: 'Call to Terminate failed for an unknown reason.',\n },\n '112': {\n basicMessage: 'Termination Before Initialization',\n detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.',\n },\n '113': {\n basicMessage: 'Termination After Termination',\n detailMessage: 'Call to Terminate failed because Terminate was already called.',\n },\n '122': {\n basicMessage: 'Retrieve Data Before Initialization',\n detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.',\n },\n '123': {\n basicMessage: 'Retrieve Data After Termination',\n detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.',\n },\n '132': {\n basicMessage: 'Store Data Before Initialization',\n detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.',\n },\n '133': {\n basicMessage: 'Store Data After Termination',\n detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.',\n },\n '142': {\n basicMessage: 'Commit Before Initialization',\n detailMessage: 'Call to Commit failed because it was made before the call to Initialize.',\n },\n '143': {\n basicMessage: 'Commit After Termination',\n detailMessage: 'Call to Commit failed because it was made after the call to Terminate.',\n },\n '201': {\n basicMessage: 'General Argument Error',\n detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.',\n },\n '301': {\n basicMessage: 'General Get Failure',\n detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '351': {\n basicMessage: 'General Set Failure',\n detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '391': {\n basicMessage: 'General Commit Failure',\n detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '401': {\n basicMessage: 'Undefined Data Model Element',\n detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.',\n },\n '402': {\n basicMessage: 'Unimplemented Data Model Element',\n detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.',\n },\n '403': {\n basicMessage: 'Data Model Element Value Not Initialized',\n detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.',\n },\n '404': {\n basicMessage: 'Data Model Element Is Read Only',\n detailMessage: 'SetValue was called with a data model element that can only be read.',\n },\n '405': {\n basicMessage: 'Data Model Element Is Write Only',\n detailMessage: 'GetValue was called on a data model element that can only be written to.',\n },\n '406': {\n basicMessage: 'Data Model Element Type Mismatch',\n detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Data Model Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n","// @flow\nexport const error_codes = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nexport const scorm12_error_codes = {\n ...error_codes, ...{\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nexport const scorm2004_error_codes = {\n ...error_codes, ...{\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n","const common_values = {\n validResult: [\n 'correct',\n 'wrong',\n 'unanticipated',\n 'neutral',\n ],\n invalidResult: [\n '-10000',\n '10000',\n 'invalid',\n ],\n\n valid0To1Range: [\n '0.0',\n '0.25',\n '0.5',\n '1.0',\n ],\n invalid0To1Range: [\n '-1',\n '-0.1',\n '1.1',\n '.25',\n ],\n\n valid0To100Range: [\n '1',\n '50',\n '100',\n ],\n invalid0To100Range: [\n 'invalid',\n 'a100',\n '-1',\n ],\n\n validScaledRange: [\n '1',\n '0.5',\n '0',\n '-0.5',\n '-1',\n ],\n invalidScaledRange: [\n '-101',\n '25.1',\n '50.5',\n '75',\n '100',\n ],\n\n validIntegerScaledRange: [\n '1',\n '0',\n '-1',\n ],\n invalidIntegerScaledRange: [\n '-101',\n '-0.5',\n '0.5',\n '25.1',\n '50.5',\n '75',\n '100',\n ],\n};\n\nexport const scorm12_values = {\n ...common_values, ...{\n validLessonStatus: [\n 'passed',\n 'completed',\n 'failed',\n 'incomplete',\n 'browsed',\n ],\n invalidLessonStatus: [\n 'Passed',\n 'P',\n 'F',\n 'p',\n 'true',\n 'false',\n 'complete',\n ],\n\n validExit: [\n 'time-out',\n 'suspend',\n 'logout',\n ],\n invalidExit: [\n 'close',\n 'exit',\n 'crash',\n ],\n\n validType: [\n 'true-false',\n 'choice',\n 'fill-in',\n 'matching',\n 'performance',\n 'sequencing',\n 'likert',\n 'numeric',\n ],\n invalidType: [\n 'correct',\n 'wrong',\n 'logout',\n ],\n\n validSpeedRange: [\n '1',\n '50',\n '100',\n '-1',\n '-50',\n '-100',\n ],\n invalidSpeedRange: [\n 'invalid',\n 'a100',\n '-101',\n '101',\n '-100000',\n '100000',\n ],\n\n validScoreRange: [\n '1',\n '50.25',\n '100',\n ],\n invalidScoreRange: [\n 'invalid',\n 'a100',\n '-1',\n '101',\n '-100000',\n '100000',\n ],\n invalid0To100Range: [\n 'invalid',\n 'a100',\n '-2',\n ],\n\n validTime: [\n '10:06:57',\n '23:59:59',\n '00:00:00',\n ],\n invalidTime: [\n '47:59:59',\n '00:00:01.56',\n '06:5:13',\n '23:59:59.123',\n 'P1DT23H59M59S',\n ],\n\n validTimespan: [\n '10:06:57',\n '00:00:01.56',\n '23:59:59',\n '47:59:59',\n ],\n invalidTimespan: [\n '06:5:13',\n '23:59:59.123',\n 'P1DT23H59M59S',\n ],\n },\n};\n\nexport const scorm2004_values = {\n ...common_values, ...{\n // valid field values\n validTimestamps: [\n '2019-06-25',\n '2019-06-25T23:59',\n '2019-06-25T23:59:59.99',\n '1970-01-01',\n ],\n invalidTimestamps: [\n '2019-06-25T',\n '2019-06-25T23:59:59.999',\n '2019-06-25T25:59:59.99',\n '2019-13-31',\n '1969-12-31',\n '-00:00:30',\n '0:50:30',\n '23:00:30.',\n ],\n\n validCStatus: [\n 'completed',\n 'incomplete',\n 'not attempted',\n 'unknown',\n ],\n invalidCStatus: [\n 'complete',\n 'passed',\n 'failed',\n ],\n\n validSStatus: [\n 'passed',\n 'failed',\n 'unknown',\n ],\n invalidSStatus: [\n 'complete',\n 'incomplete',\n 'P',\n 'f',\n ],\n\n validExit: [\n 'time-out',\n 'suspend',\n 'logout',\n 'normal',\n ],\n invalidExit: [\n 'close',\n 'exit',\n 'crash',\n ],\n\n validType: [\n 'true-false',\n 'choice',\n 'fill-in',\n 'long-fill-in',\n 'matching',\n 'performance',\n 'sequencing',\n 'likert',\n 'numeric',\n 'other',\n ],\n invalidType: [\n 'correct',\n 'wrong',\n 'logout',\n ],\n\n validScoreRange: [\n '1',\n '50',\n '100',\n '-10000',\n '-1',\n '10000',\n ],\n invalidScoreRange: [\n 'invalid',\n 'a100',\n '-100000',\n '100000',\n ],\n\n validISO8601Durations: [\n 'P1Y34DT23H45M15S',\n 'PT1M45S',\n 'P0S',\n 'PT75M',\n ],\n invalidISO8601Durations: [\n '00:08:45',\n '-P1H',\n '1y45D',\n '0',\n ],\n\n validComment: [\n '{lang=en-98} learner comment',\n '{lang=eng-98-9} learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(4000),\n 'learner comment',\n 'learner comment}',\n '{lang=i-xx}',\n '{lang=i}',\n '',\n ],\n invalidComment: [\n '{lang=i-}',\n '{lang=i-x}',\n '{lang=eng-98-9fhgj}{ learner comment',\n '{learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(4001),\n '{lang=eng-98-9fhgj}{' + 'x'.repeat(3999),\n ],\n\n validDescription: [\n '{lang=en-98} learner comment',\n '{lang=eng-98-9} learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(250),\n 'learner comment',\n 'learner comment}',\n '{lang=i-xx}',\n '{lang=i}',\n '',\n ],\n invalidDescription: [\n '{lang=i-}',\n '{lang=i-x}',\n '{lang=eng-98-9fhgj}{ learner comment',\n '{learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(251),\n '{lang=eng-98-9fhgj}{' + 'x'.repeat(249),\n ],\n\n validNavRequest: [\n 'previous',\n 'continue',\n 'exit',\n 'exitAll',\n 'abandon',\n 'abandonAll',\n 'suspendAll',\n ],\n invalidNavRequest: [\n 'close',\n 'quit',\n 'next',\n 'before',\n ],\n },\n};\n","export const valid_languages = {\n 'aa': 'aa', 'ab': 'ab', 'ae': 'ae', 'af': 'af', 'ak': 'ak', 'am': 'am',\n 'an': 'an', 'ar': 'ar', 'as': 'as', 'av': 'av', 'ay': 'ay', 'az': 'az',\n 'ba': 'ba', 'be': 'be', 'bg': 'bg', 'bh': 'bh', 'bi': 'bi', 'bm': 'bm',\n 'bn': 'bn', 'bo': 'bo', 'br': 'br', 'bs': 'bs', 'ca': 'ca', 'ce': 'ce',\n 'ch': 'ch', 'co': 'co', 'cr': 'cr', 'cs': 'cs', 'cu': 'cu', 'cv': 'cv',\n 'cy': 'cy', 'da': 'da', 'de': 'de', 'dv': 'dv', 'dz': 'dz', 'ee': 'ee',\n 'el': 'el', 'en': 'en', 'eo': 'eo', 'es': 'es', 'et': 'et', 'eu': 'eu',\n 'fa': 'fa', 'ff': 'ff', 'fi': 'fi', 'fj': 'fj', 'fo': 'fo', 'fr': 'fr',\n 'fy': 'fy', 'ga': 'ga', 'gd': 'gd', 'gl': 'gl', 'gn': 'gn', 'gu': 'gu',\n 'gv': 'gv', 'ha': 'ha', 'he': 'he', 'hi': 'hi', 'ho': 'ho', 'hr': 'hr',\n 'ht': 'ht', 'hu': 'hu', 'hy': 'hy', 'hz': 'hz', 'ia': 'ia', 'id': 'id',\n 'ie': 'ie', 'ig': 'ig', 'ii': 'ii', 'ik': 'ik', 'io': 'io', 'is': 'is',\n 'it': 'it', 'iu': 'iu', 'ja': 'ja', 'jv': 'jv', 'ka': 'ka', 'kg': 'kg',\n 'ki': 'ki', 'kj': 'kj', 'kk': 'kk', 'kl': 'kl', 'km': 'km', 'kn': 'kn',\n 'ko': 'ko', 'kr': 'kr', 'ks': 'ks', 'ku': 'ku', 'kv': 'kv', 'kw': 'kw',\n 'ky': 'ky', 'la': 'la', 'lb': 'lb', 'lg': 'lg', 'li': 'li', 'ln': 'ln',\n 'lo': 'lo', 'lt': 'lt', 'lu': 'lu', 'lv': 'lv', 'mg': 'mg', 'mh': 'mh',\n 'mi': 'mi', 'mk': 'mk', 'ml': 'ml', 'mn': 'mn', 'mo': 'mo', 'mr': 'mr',\n 'ms': 'ms', 'mt': 'mt', 'my': 'my', 'na': 'na', 'nb': 'nb', 'nd': 'nd',\n 'ne': 'ne', 'ng': 'ng', 'nl': 'nl', 'nn': 'nn', 'no': 'no', 'nr': 'nr',\n 'nv': 'nv', 'ny': 'ny', 'oc': 'oc', 'oj': 'oj', 'om': 'om', 'or': 'or',\n 'os': 'os', 'pa': 'pa', 'pi': 'pi', 'pl': 'pl', 'ps': 'ps', 'pt': 'pt',\n 'qu': 'qu', 'rm': 'rm', 'rn': 'rn', 'ro': 'ro', 'ru': 'ru', 'rw': 'rw',\n 'sa': 'sa', 'sc': 'sc', 'sd': 'sd', 'se': 'se', 'sg': 'sg', 'sh': 'sh',\n 'si': 'si', 'sk': 'sk', 'sl': 'sl', 'sm': 'sm', 'sn': 'sn', 'so': 'so',\n 'sq': 'sq', 'sr': 'sr', 'ss': 'ss', 'st': 'st', 'su': 'su', 'sv': 'sv',\n 'sw': 'sw', 'ta': 'ta', 'te': 'te', 'tg': 'tg', 'th': 'th', 'ti': 'ti',\n 'tk': 'tk', 'tl': 'tl', 'tn': 'tn', 'to': 'to', 'tr': 'tr', 'ts': 'ts',\n 'tt': 'tt', 'tw': 'tw', 'ty': 'ty', 'ug': 'ug', 'uk': 'uk', 'ur': 'ur',\n 'uz': 'uz', 've': 've', 'vi': 'vi', 'vo': 'vo', 'wa': 'wa', 'wo': 'wo',\n 'xh': 'xh', 'yi': 'yi', 'yo': 'yo', 'za': 'za', 'zh': 'zh', 'zu': 'zu',\n 'aar': 'aar', 'abk': 'abk', 'ave': 'ave', 'afr': 'afr', 'aka': 'aka',\n 'amh': 'amh', 'arg': 'arg', 'ara': 'ara', 'asm': 'asm', 'ava': 'ava',\n 'aym': 'aym', 'aze': 'aze', 'bak': 'bak', 'bel': 'bel', 'bul': 'bul',\n 'bih': 'bih', 'bis': 'bis', 'bam': 'bam', 'ben': 'ben', 'tib': 'tib',\n 'bod': 'bod', 'bre': 'bre', 'bos': 'bos', 'cat': 'cat', 'che': 'che',\n 'cha': 'cha', 'cos': 'cos', 'cre': 'cre', 'cze': 'cze', 'ces': 'ces',\n 'chu': 'chu', 'chv': 'chv', 'wel': 'wel', 'cym': 'cym', 'dan': 'dan',\n 'ger': 'ger', 'deu': 'deu', 'div': 'div', 'dzo': 'dzo', 'ewe': 'ewe',\n 'gre': 'gre', 'ell': 'ell', 'eng': 'eng', 'epo': 'epo', 'spa': 'spa',\n 'est': 'est', 'baq': 'baq', 'eus': 'eus', 'per': 'per', 'fas': 'fas',\n 'ful': 'ful', 'fin': 'fin', 'fij': 'fij', 'fao': 'fao', 'fre': 'fre',\n 'fra': 'fra', 'fry': 'fry', 'gle': 'gle', 'gla': 'gla', 'glg': 'glg',\n 'grn': 'grn', 'guj': 'guj', 'glv': 'glv', 'hau': 'hau', 'heb': 'heb',\n 'hin': 'hin', 'hmo': 'hmo', 'hrv': 'hrv', 'hat': 'hat', 'hun': 'hun',\n 'arm': 'arm', 'hye': 'hye', 'her': 'her', 'ina': 'ina', 'ind': 'ind',\n 'ile': 'ile', 'ibo': 'ibo', 'iii': 'iii', 'ipk': 'ipk', 'ido': 'ido',\n 'ice': 'ice', 'isl': 'isl', 'ita': 'ita', 'iku': 'iku', 'jpn': 'jpn',\n 'jav': 'jav', 'geo': 'geo', 'kat': 'kat', 'kon': 'kon', 'kik': 'kik',\n 'kua': 'kua', 'kaz': 'kaz', 'kal': 'kal', 'khm': 'khm', 'kan': 'kan',\n 'kor': 'kor', 'kau': 'kau', 'kas': 'kas', 'kur': 'kur', 'kom': 'kom',\n 'cor': 'cor', 'kir': 'kir', 'lat': 'lat', 'ltz': 'ltz', 'lug': 'lug',\n 'lim': 'lim', 'lin': 'lin', 'lao': 'lao', 'lit': 'lit', 'lub': 'lub',\n 'lav': 'lav', 'mlg': 'mlg', 'mah': 'mah', 'mao': 'mao', 'mri': 'mri',\n 'mac': 'mac', 'mkd': 'mkd', 'mal': 'mal', 'mon': 'mon', 'mol': 'mol',\n 'mar': 'mar', 'may': 'may', 'msa': 'msa', 'mlt': 'mlt', 'bur': 'bur',\n 'mya': 'mya', 'nau': 'nau', 'nob': 'nob', 'nde': 'nde', 'nep': 'nep',\n 'ndo': 'ndo', 'dut': 'dut', 'nld': 'nld', 'nno': 'nno', 'nor': 'nor',\n 'nbl': 'nbl', 'nav': 'nav', 'nya': 'nya', 'oci': 'oci', 'oji': 'oji',\n 'orm': 'orm', 'ori': 'ori', 'oss': 'oss', 'pan': 'pan', 'pli': 'pli',\n 'pol': 'pol', 'pus': 'pus', 'por': 'por', 'que': 'que', 'roh': 'roh',\n 'run': 'run', 'rum': 'rum', 'ron': 'ron', 'rus': 'rus', 'kin': 'kin',\n 'san': 'san', 'srd': 'srd', 'snd': 'snd', 'sme': 'sme', 'sag': 'sag',\n 'slo': 'slo', 'sin': 'sin', 'slk': 'slk', 'slv': 'slv', 'smo': 'smo',\n 'sna': 'sna', 'som': 'som', 'alb': 'alb', 'sqi': 'sqi', 'srp': 'srp',\n 'ssw': 'ssw', 'sot': 'sot', 'sun': 'sun', 'swe': 'swe', 'swa': 'swa',\n 'tam': 'tam', 'tel': 'tel', 'tgk': 'tgk', 'tha': 'tha', 'tir': 'tir',\n 'tuk': 'tuk', 'tgl': 'tgl', 'tsn': 'tsn', 'ton': 'ton', 'tur': 'tur',\n 'tso': 'tso', 'tat': 'tat', 'twi': 'twi', 'tah': 'tah', 'uig': 'uig',\n 'ukr': 'ukr', 'urd': 'urd', 'uzb': 'uzb', 'ven': 'ven', 'vie': 'vie',\n 'vol': 'vol', 'wln': 'wln', 'wol': 'wol', 'xho': 'xho', 'yid': 'yid',\n 'yor': 'yor', 'zha': 'zha', 'chi': 'chi', 'zho': 'zho', 'zul': 'zul',\n};\n","// @flow\n\nimport {scorm12_values, scorm2004_values} from './field_values';\n\nexport const scorm12_regex = {\n CMIString256: '^.{0,255}$',\n CMIString4096: '^.{0,4096}$',\n CMITime: '^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$', // eslint-disable-line\n CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\\.[0-9]{1,2})?$', // eslint-disable-line\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{0,3})(\\.[0-9]*)?$', // eslint-disable-line\n CMIIdentifier: '^[\\\\u0021-\\\\u007E]{0,255}$',\n CMIFeedback: '^.{0,255}$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMIStatus: '^(' + scorm12_values.validLessonStatus.join('|') + ')$',\n CMIStatus2: '^(' + scorm12_values.validLessonStatus.join('|') + '|not attempted)$',\n CMIExit: '^(' + scorm12_values.validExit.join('|') + '|)$',\n CMIType: '^(' + scorm12_values.validType.join('|') + ')$',\n CMIResult: '^(' + scorm12_values.validResult.join('|') + '|([0-9]{0,3})?(\\\\.[0-9]*)?)$', // eslint-disable-line\n NAVEvent: '^(previous|continue)$',\n\n // Data ranges\n score_range: '0#100',\n audio_range: '-1#100',\n speed_range: '-100#100',\n weighting_range: '-100#100',\n text_range: '-1#1',\n};\n\nexport const aicc_regex = {\n ...scorm12_regex, ...{\n CMIIdentifier: '^\\\\w{1,255}$',\n },\n};\n\nexport const scorm2004_regex = {\n CMIString200: '^[\\\\u0000-\\\\uFFFF]{0,200}$',\n CMIString250: '^[\\\\u0000-\\\\uFFFF]{0,250}$',\n CMIString1000: '^[\\\\u0000-\\\\uFFFF]{0,1000}$',\n CMIString4000: '^[\\\\u0000-\\\\uFFFF]{0,4000}$',\n CMIString64000: '^[\\\\u0000-\\\\uFFFF]{0,64000}$',\n CMILang: '^([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?$|^$', // eslint-disable-line\n CMILangString250: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,250}$)?$', // eslint-disable-line\n CMILangcr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\}))(.*?)$', // eslint-disable-line\n CMILangString250cr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\})?(.{0,250})?)?$', // eslint-disable-line\n CMILangString4000: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,4000}$)?$', // eslint-disable-line\n CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',\n CMITimespan: '^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$',\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$',\n CMIIdentifier: '^\\\\S{1,250}[a-zA-Z0-9]$',\n CMIShortIdentifier: '^[\\\\w\\.]{1,250}$', // eslint-disable-line\n CMILongIdentifier: '^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000})$',\n CMIFeedback: '^.*$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n CMIIndexStore: '.N(\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMICStatus: '^(' + scorm2004_values.validCStatus.join('|') + ')$',\n CMISStatus: '^(' + scorm2004_values.validSStatus.join('|') + ')$',\n CMIExit: '^(' + scorm2004_values.validExit.join('|') + ')$',\n CMIType: '^(' + scorm2004_values.validType.join('|') + ')$',\n CMIResult: '^(' + scorm2004_values.validResult.join('|') + '|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$',\n NAVEvent: '^(' + scorm2004_values.validNavRequest.join('|') + '|\\{target=\\\\S{0,200}[a-zA-Z0-9]\\}choice|jump)$', // eslint-disable-line\n NAVBoolean: '^(unknown|true|false$)',\n NAVTarget: '^(previous|continue|choice.{target=\\\\S{0,200}[a-zA-Z0-9]})$',\n\n // Data ranges\n scaled_range: '-1#1',\n audio_range: '0#*',\n speed_range: '0#*',\n text_range: '-1#1',\n progress_range: '0#1',\n};\n","// @flow\nimport {scorm2004_regex} from './regex';\n\nexport const learner_responses = {\n 'true-false': {\n format: '^true$|^false$',\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'choice': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: true,\n },\n 'fill-in': {\n format: scorm2004_regex.CMILangString250,\n max: 10,\n delimiter: '[,]',\n unique: false,\n },\n 'long-fill-in': {\n format: scorm2004_regex.CMILangString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'matching': {\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'performance': {\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'sequencing': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: false,\n },\n 'likert': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'numeric': {\n format: scorm2004_regex.CMIDecimal,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'other': {\n format: scorm2004_regex.CMIString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n};\n\nexport const correct_responses = {\n 'true-false': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: '^true$|^false$',\n limit: 1,\n },\n 'choice': {\n max: 36,\n delimiter: '[,]',\n unique: true,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'fill-in': {\n max: 10,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMILangString250cr,\n },\n 'long-fill-in': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: true,\n format: scorm2004_regex.CMILangString4000,\n },\n 'matching': {\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n },\n 'performance': {\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n },\n 'sequencing': {\n max: 36,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'likert': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n limit: 1,\n },\n 'numeric': {\n max: 2,\n delimiter: '[:]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIDecimal,\n limit: 1,\n },\n 'other': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIString4000,\n limit: 1,\n },\n};\n","// @flow\n\n/**\n * Data Validation Exception\n */\nexport class ValidationError extends Error {\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n super(errorCode);\n this.#errorCode = errorCode;\n }\n\n #errorCode;\n\n /**\n * Getter for #errorCode\n * @return {number}\n */\n get errorCode() {\n return this.#errorCode;\n }\n\n /**\n * Trying to override the default Error message\n * @return {string}\n */\n get message() {\n return this.#errorCode + '';\n }\n}\n","import Scorm2004API from './Scorm2004API';\nimport Scorm12API from './Scorm12API';\nimport AICC from './AICC';\n\nwindow.Scorm12API = Scorm12API;\nwindow.Scorm2004API = Scorm2004API;\nwindow.AICC = AICC;\n","// @flow\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\nconst designations = [\n ['D', SECONDS_PER_DAY],\n ['H', SECONDS_PER_HOUR],\n ['M', SECONDS_PER_MINUTE],\n ['S', SECONDS_PER_SECOND],\n];\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {Number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return '00:00:00';\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds() + (totalSeconds % 1.0);\n\n return hours.toString().padStart(2, '0') + ':' +\n minutes.toString().padStart(2, '0') + ':' +\n seconds.toString().padStart(2, '0');\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {Number} seconds\n * @return {String}\n */\nexport function getSecondsAsISODuration(seconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return 'PT0S';\n }\n\n let duration = 'P';\n let remainder = seconds;\n\n designations.forEach(([sign, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n\n remainder = remainder % current_seconds;\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (sign === 'S' && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if ((duration.indexOf('D') > 0 ||\n sign === 'H' || sign === 'M' || sign === 'S') &&\n duration.indexOf('T') === -1) {\n duration += 'T';\n }\n duration += `${value}${sign}`;\n }\n });\n\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {\n if (!timeString || typeof timeString !== 'string' ||\n !timeString.match(timeRegex)) {\n return 0;\n }\n const parts = timeString.split(':');\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return (hours * 3600) + (minutes * 60) + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(duration: String, durationRegex: RegExp) {\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, months, , days, hours, minutes, seconds] = new RegExp(\n durationRegex).exec(duration) || [];\n\n const now = new Date();\n const anchor = new Date(now);\n anchor.setFullYear(anchor.getFullYear() + Number(years || 0));\n anchor.setMonth(anchor.getMonth() + Number(months || 0));\n anchor.setDate(anchor.getDate() + Number(days || 0));\n anchor.setHours(anchor.getHours() + Number(hours || 0));\n anchor.setMinutes(anchor.getMinutes() + Number(minutes || 0));\n anchor.setSeconds(anchor.getSeconds() + Number(seconds || 0));\n if (seconds && String(seconds).indexOf('.') > 0) {\n const milliseconds = Number(Number(seconds) % 1).toFixed(6) * 1000.0;\n anchor.setMilliseconds(anchor.getMilliseconds() + milliseconds);\n }\n\n return ((anchor * 1.0) - now) / 1000.0;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: String,\n second: String,\n durationRegex: RegExp) {\n const firstSeconds = getDurationAsSeconds(first, durationRegex);\n const secondSeconds = getDurationAsSeconds(second, durationRegex);\n\n return getSecondsAsISODuration(firstSeconds + secondSeconds);\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: String,\n second: String,\n timeRegex: RegExp) {\n const firstSeconds = getTimeAsSeconds(first, timeRegex);\n const secondSeconds = getTimeAsSeconds(second, timeRegex);\n return getSecondsAsHHMMSS(firstSeconds + secondSeconds);\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data) {\n const result = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur, prop) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + '[' + i + ']');\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + '.' + p : p);\n }\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, '');\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data) {\n 'use strict';\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result = {};\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = '';\n let m = regex.exec(p);\n while (m) {\n cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n cur[prop] = data[p];\n }\n }\n return result[''] || result;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","src/AICC.js","src/BaseAPI.js","src/Scorm12API.js","src/Scorm2004API.js","src/cmi/aicc_cmi.js","src/cmi/common.js","src/cmi/scorm12_cmi.js","src/cmi/scorm2004_cmi.js","src/constants/api_constants.js","src/constants/error_codes.js","src/constants/field_values.js","src/constants/language_constants.js","src/constants/regex.js","src/constants/response_constants.js","src/exceptions.js","src/exports.js","src/utilities.js"],"names":["_Scorm12API2","_interopRequireDefault","require","_aicc_cmi","_scorm12_cmi","AICC","settings","_this","_classCallCheck","this","finalSettings","_objectSpread","mastery_override","_possibleConstructorReturn","_getPrototypeOf","call","cmi","CMI","nav","NAV","CMIElement","value","foundFirstIndex","newChild","_get","prototype","stringMatches","CMIEvaluationCommentsObject","CMITriesObject","newAPI","Scorm12API","_common","_exceptions","_error_codes2","_api_constants","_utilities","BaseAPI","error_codes","_timeout","set","writable","_scheduleCancelled","_error_codes","_settings","autocommit","autocommitSeconds","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","global_constants","LOG_LEVEL_ERROR","_defineProperty","constructor","TypeError","currentState","STATE_NOT_INITIALIZED","lastErrorCode","listenerArray","_classPrivateFieldSet","apiLogLevel","callbackName","initializeMessage","terminationMessage","returnValue","SCORM_FALSE","isInitialized","throwSCORMError","_classPrivateFieldGet","INITIALIZED","isTerminated","TERMINATED","STATE_INITIALIZED","SCORM_TRUE","processListeners","apiLog","LOG_LEVEL_INFO","clearSCORMError","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","result","storeData","errorCode","STATE_TERMINATED","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","e","ValidationError","GENERAL","undefined","String","scheduleCommit","clearScheduledCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","LOG_LEVEL_DEBUG","CMIErrorCode","getLmsErrorMessageDetails","beforeInitError","afterTermError","isNotInitialized","functionName","logMessage","messageLevel","formatMessage","console","error","LOG_LEVEL_WARNING","warn","info","debug","log","message","messageString","fillChars","length","i","j","str","tester","match","refObject","attribute","Object","hasOwnProperty","getOwnPropertyDescriptor","getPrototypeOf","_errorNumber","_detail","Error","_CMIElement","_value","methodName","scorm2004","structure","split","invalidErrorMessage","concat","invalidErrorCode","UNDEFINED_DATA_MODEL","substr","_isTargetValid","READ_ONLY_ELEMENT","_checkObjectHasProperty","validateCorrectResponse","CMIArray","index","parseInt","isNaN","item","childArray","getChildElement","initialized","initialize","push","_foundFirstIndex","uninitializedErrorMessage","target","VALUE_NOT_INITIALIZED","scorm12_error_codes","CHILDREN_ERROR","COUNT_ERROR","listenerName","callback","listenerFunctions","listenerSplit","replace","listener","functionsMatch","listenerHasCMIElement","CMIElementsMatch","errorNumber","success","_calculateTotalTime","json","loadFromJSON","unflatten","startingData","key","currentCMIElement","JSON","stringify","parse","renderCMIToJSONString","_terminateCommit","url","params","genericError","httpReq","XMLHttpRequest","open","Array","setRequestHeader","send","join","responseText","when","setTimeout","scheduledCallback","bind","clearTimeout","commit","_BaseAPI2","Utilities","_interopRequireWildcard","constants","scorm12_constants","LMSInitialize","lmsInitialize","LMSFinish","lmsFinish","LMSGetValue","lmsGetValue","LMSSetValue","lmsSetValue","LMSCommit","lmsCommit","LMSGetLastError","lmsGetLastError","LMSGetErrorString","lmsGetErrorString","LMSGetDiagnostic","lmsGetDiagnostic","terminate","event","getValue","setValue","getLastError","getErrorString","getDiagnostic","_commonSetCMIValue","_commonGetCMIValue","CMIObjectivesObject","CMIInteractionsCorrectResponsesObject","CMIInteractionsObjectivesObject","CMIInteractionsObject","detail","basicMessage","detailMessage","error_descriptions","terminateCommit","cmiExport","renderCMIToJSONObject","core","total_time","getCurrentTotalTime","flattened","flatten","originalStatus","lesson_status","lesson_mode","credit","student_data","mastery_score","score","raw","parseFloat","_this$startingData","_this$startingData$cm","_this$startingData$cm2","commitObject","renderCommitCMI","processHttpRequest","_scorm2004_cmi","_response_constants","_language_constants","_regex","scorm2004_constants","Scorm2004API","scorm2004_error_codes","_version","_assertThisInitialized","correct_response","current_index","found","count","_count","adl","ADL","Initialize","Terminate","lmsTerminate","GetValue","SetValue","Commit","GetLastError","GetErrorString","GetDiagnostic","request","parts","Number","interaction","interactions","type","DEPENDENCY_NOT_ESTABLISHED","interaction_type","interaction_count","correct_responses","response","pattern","GENERAL_SET_FAILURE","response_type","nodes","delimiter","max","checkCorrectResponseValue","CMICommentsObject","pattern_index","limit","duplicate","checkDuplicatedPattern","formatRegex","RegExp","format","removeCorrectResponsePrefixes","delimiter2","values","matches","format2","TYPE_MISMATCH","unique","node","seenOrder","seenCase","seenLang","prefixRegex","langMatches","scorm2004_regex","CMILangcr","lang","valid_languages","toLowerCase","_this$startingData$ad","_this$startingData$ad2","mode","completion_threshold","progress_measure","completion_status","scaled_passing_score","scaled","success_status","navRequest","encodeURIComponent","Function","Scorm12CMI","aicc_constants","regex","aicc_regex","cmi_children","AICCCMIStudentData","evaluation","CMIEvaluation","_this$student_data","_this$evaluation","jsonString","suspend_data","launch_data","comments","comments_from_lms","objectives","student_preference","_this2","CMIEvaluationComments","_this$comments","BaseCMI","comments_children","INVALID_SET_VALUE","_this3","student_data_children","_tries_during_lesson","tries","CMITries","_this$tries","max_time_allowed","time_limit_action","tries_during_lesson","throwReadOnlyError","CMIStudentData","tries_children","_this4","_status","_time","CMIScore","score_children","score_range","invalidTypeCode","invalidRangeCode","VALUE_OUT_OF_RANGE","_this$score","status","time","check12ValidFormat","CMIStatus2","CMITime","_this5","_content","_location","_time2","content","location","CMIString256","checkValidFormat","regexPattern","allowEmptyString","checkValidRange","rangePattern","ranges","_initialized","_ref","decimalRegex","_children2","_score_range","_invalid_error_code","_invalid_type_code","_invalid_range_code","_decimal_regex","_raw","_min","_max","scorm12_regex","CMIDecimal","min","_children","_ref2","children","_errorCode","_children3","throwWriteOnlyError","WRITE_ONLY_ELEMENT","throwInvalidValueError","check12ValidRange","_version2","_suspend_data","_launch_data","_comments","_comments_from_lms","CMICore","CMIObjectives","CMIStudentPreference","CMIInteractions","_this$core","_this$objectives","_this$student_prefere","_this$interactions","CMIString4096","core_children","_student_id","_student_name","_lesson_location","_credit","_lesson_status","_entry","_total_time","_lesson_mode","_exit","_session_time","addHHMMSSTimeStrings","CMITimespan","student_id","student_name","lesson_location","entry","exit","session_time","CMIStatus","CMIExit","objectives_children","_children4","_mastery_score","_max_time_allowed","_time_limit_action","_children5","student_preference_children","_audio","_language","_speed","_text","audio","language","speed","text","CMISInteger","audio_range","speed_range","text_range","interactions_children","_id","_type","_weighting","_student_response","_result","_latency","correct_responses_children","_this$objectives2","_this$correct_respons","id","weighting","student_response","latency","CMIIdentifier","CMIType","weighting_range","CMIFeedback","CMIResult","_this6","_id2","_this7","_id3","_this8","_pattern","_this9","_event","NAVEvent","throwTypeMismatchError","check2004ValidFormat","check2004ValidRange","Util","_completion_status","_completion_threshold","_learner_id","_learner_name","_mode","_progress_measure","_scaled_passing_score","_success_status","learner_preference","CMILearnerPreference","Scorm2004CMIScore","comments_from_learner","CMICommentsFromLearner","CMICommentsFromLMS","_this$learner_prefere","_this$comments_from_l","_this$comments_from_l2","addTwoDurations","learner_id","learner_name","CMICStatus","CMIString1000","progress_range","CMISStatus","CMIString64000","_audio_level","_delivery_speed","_audio_captioning","audio_level","delivery_speed","audio_captioning","CMILang","_timestamp","_learner_response","_description","timestamp","learner_response","description","CMILongIdentifier","learner_responses","CMILangString250","_success_status2","_completion_status2","_progress_measure2","_description2","_this$score2","_scaled","scaled_range","readOnlyAfterInit","arguments","_comment","_location2","_timestamp2","_readOnlyAfterInit","comment","CMILangString4000","CMIString250","ADLNav","_this$nav","_this10","_request","request_valid","ADLNavRequestValid","_this$request_valid","_this11","_continue","_previous","_temp","_target","_temp2","previous","continue","_","LOG_LEVEL_NONE","101","201","202","203","301","401","402","403","404","405","0","102","103","104","111","112","113","122","123","132","133","142","143","351","391","406","407","408","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","MULTIPLE_TERMINATIONS","common_values","validResult","invalidResult","valid0To1Range","invalid0To1Range","valid0To100Range","invalid0To100Range","validScaledRange","invalidScaledRange","validIntegerScaledRange","invalidIntegerScaledRange","scorm12_values","validLessonStatus","invalidLessonStatus","validExit","invalidExit","validType","invalidType","validSpeedRange","invalidSpeedRange","validScoreRange","invalidScoreRange","validTime","invalidTime","validTimespan","invalidTimespan","scorm2004_values","validTimestamps","invalidTimestamps","validCStatus","invalidCStatus","validSStatus","invalidSStatus","validISO8601Durations","invalidISO8601Durations","validComment","repeat","invalidComment","validDescription","invalidDescription","validNavRequest","invalidNavRequest","aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","ba","be","bg","bh","bi","bm","bn","bo","br","bs","ca","ce","ch","co","cr","cs","cu","cv","cy","da","de","dv","dz","ee","el","en","eo","es","et","eu","fa","ff","fi","fj","fo","fr","fy","ga","gd","gl","gn","gu","gv","ha","he","hi","ho","hr","ht","hu","hy","hz","ia","ie","ig","ii","ik","io","is","it","iu","ja","jv","ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","la","lb","lg","li","ln","lo","lt","lu","lv","mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","oc","oj","om","or","os","pa","pi","pl","ps","pt","qu","rm","rn","ro","ru","rw","sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","ug","uk","ur","uz","ve","vi","vo","wa","wo","xh","yi","yo","za","zh","zu","aar","abk","ave","afr","aka","amh","arg","ara","asm","ava","aym","aze","bak","bel","bul","bih","bis","bam","ben","tib","bod","bre","bos","cat","che","cha","cos","cre","cze","ces","chu","chv","wel","cym","dan","ger","deu","div","dzo","ewe","gre","ell","eng","epo","spa","est","baq","eus","per","fas","ful","fin","fij","fao","fre","fra","fry","gle","gla","glg","grn","guj","glv","hau","heb","hin","hmo","hrv","hat","hun","arm","hye","her","ina","ind","ile","ibo","iii","ipk","ido","ice","isl","ita","iku","jpn","jav","geo","kat","kon","kik","kua","kaz","kal","khm","kan","kor","kau","kas","kur","kom","cor","kir","lat","ltz","lug","lim","lin","lao","lit","lub","lav","mlg","mah","mao","mri","mac","mkd","mal","mon","mol","mar","may","msa","mlt","bur","mya","nau","nob","nde","nep","ndo","dut","nld","nno","nor","nbl","nya","oci","oji","orm","ori","oss","pan","pli","pol","pus","por","que","roh","run","rum","ron","rus","kin","san","srd","snd","sme","sag","slo","sin","slk","slv","smo","sna","som","alb","sqi","srp","ssw","sot","sun","swe","swa","tam","tel","tgk","tha","tir","tuk","tgl","tsn","ton","tur","tso","tat","twi","tah","uig","ukr","urd","uzb","ven","vie","vol","wln","wol","xho","yid","yor","zha","chi","zho","zul","_field_values","CMIInteger","CMIIndex","CMIString200","CMIString4000","CMILangString250cr","CMIShortIdentifier","CMIIndexStore","NAVBoolean","NAVTarget","true-false","choice","fill-in","long-fill-in","matching","performance","sequencing","likert","numeric","other","_Scorm2004API","_Scorm12API","_AICC","window","getSecondsAsHHMMSS","totalSeconds","hours","Math","floor","SECONDS_PER_HOUR","dateObj","Date","minutes","getUTCMinutes","seconds","getSeconds","toString","padStart","getSecondsAsISODuration","duration","remainder","designations","forEach","_slicedToArray","sign","current_seconds","indexOf","getTimeAsSeconds","timeString","timeRegex","getDurationAsSeconds","durationRegex","_ref3","exec","_ref4","years","months","days","now","anchor","setFullYear","getFullYear","setMonth","getMonth","setDate","getDate","setHours","getHours","setMinutes","getMinutes","setSeconds","milliseconds","toFixed","setMilliseconds","getMilliseconds","first","second","data","recurse","cur","prop","isArray","l","isEmpty","p","m","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_DAY"],"mappings":"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U,uBAAwB,IACxBpe,qBAAsB,IACtBqe,sBAAuB,IACvBld,sBAAuB,IACvBgN,kBAAmB,IACnBhO,kBAAmB,IACnB8R,mBAAoB,IACpB7G,cAAe,IACfoE,mBAAoB,IACpB7F,2BAA4B,oCAGvB,IAAMvI,qBAAmB3J,iBAC3B0B,gBACDkD,qBAAsB,IACtBG,kBAAmB,IACnBU,mBAAoB,IACpBghB,eAAgB,IAChB7c,eAAgB,IAChBC,YAAa,IACbtB,qBAAsB,IACtBqe,sBAAuB,IACvBld,sBAAuB,IACvBgN,kBAAmB,IACnBhO,kBAAmB,IACnB8R,mBAAoB,IACpB7G,cAAe,IACfoE,mBAAoB,IACpB7F,2BAA4B,qDAIzB,IAAMzB,uBAAqBzQ,iBAC7B0B,gBACD6kB,sBAAuB,IACvB5iB,YAAa,IACbE,WAAY,IACZ2iB,oBAAqB,IACrBliB,wBAAyB,IACzBuiB,sBAAuB,IACvBjiB,qBAAsB,IACtBC,oBAAqB,IACrBE,kBAAmB,IACnBC,iBAAkB,IAClBS,mBAAoB,IACpBC,kBAAmB,IACnB+gB,eAAgB,IAChBC,oBAAqB,IACrBlU,oBAAqB,IACrBmU,uBAAwB,IACxBpe,qBAAsB,IACtBqe,sBAAuB,IACvBld,sBAAuB,IACvBhB,kBAAmB,IACnB8R,mBAAoB,IACpB7G,cAAe,IACfoE,mBAAoB,IACpB7F,2BAA4B;;q1BC7EhC,IAAM4U,gBACJC,aACE,UACA,QACA,gBACA,WAEFC,eACE,SACA,QACA,WAGFC,gBACE,MACA,OACA,MACA,OAEFC,kBACE,KACA,OACA,MACA,OAGFC,kBACE,IACA,KACA,OAEFC,oBACE,UACA,OACA,MAGFC,kBACE,IACA,MACA,IACA,OACA,MAEFC,oBACE,OACA,OACA,OACA,KACA,OAGFC,yBACE,IACA,IACA,MAEFC,2BACE,OACA,OACA,MACA,OACA,OACA,KACA,QAISC,eAAcznB,iBACtB8mB,kBACDY,mBACE,SACA,YACA,SACA,aACA,WAEFC,qBACE,SACA,IACA,IACA,IACA,OACA,QACA,YAGFC,WACE,WACA,UACA,UAEFC,aACE,QACA,OACA,SAGFC,WACE,aACA,SACA,UACA,WACA,cACA,aACA,SACA,WAEFC,aACE,UACA,QACA,UAGFC,iBACE,IACA,KACA,MACA,KACA,MACA,QAEFC,mBACE,UACA,OACA,OACA,MACA,UACA,UAGFC,iBACE,IACA,QACA,OAEFC,mBACE,UACA,OACA,KACA,MACA,UACA,UAEFf,oBACE,UACA,OACA,MAGFgB,WACE,WACA,WACA,YAEFC,aACE,WACA,cACA,UACA,eACA,iBAGFC,eACE,WACA,cACA,WACA,YAEFC,iBACE,UACA,eACA,wDAKC,IAAMC,kBAAgBxoB,iBACxB8mB,kBAED2B,iBACE,aACA,mBACA,yBACA,cAEFC,mBACE,cACA,0BACA,yBACA,aACA,aACA,YACA,UACA,aAGFC,cACE,YACA,aACA,gBACA,WAEFC,gBACE,WACA,SACA,UAGFC,cACE,SACA,SACA,WAEFC,gBACE,WACA,aACA,IACA,KAGFlB,WACE,WACA,UACA,SACA,UAEFC,aACE,QACA,OACA,SAGFC,WACE,aACA,SACA,UACA,eACA,WACA,cACA,aACA,SACA,UACA,SAEFC,aACE,UACA,QACA,UAGFG,iBACE,IACA,KACA,MACA,SACA,KACA,SAEFC,mBACE,UACA,OACA,UACA,UAGFY,uBACE,mBACA,UACA,MACA,SAEFC,yBACE,WACA,OACA,QACA,KAGFC,cACE,+BACA,kCACA,sBAAwB,IAAIC,OAAO,KACnC,kBACA,mBACA,cACA,WACA,IAEFC,gBACE,YACA,aACA,uCACA,mBACA,sBAAwB,IAAID,OAAO,MACnC,uBAAyB,IAAIA,OAAO,OAGtCE,kBACE,+BACA,kCACA,sBAAwB,IAAIF,OAAO,KACnC,kBACA,mBACA,cACA,WACA,IAEFG,oBACE,YACA,aACA,uCACA,mBACA,sBAAwB,IAAIH,OAAO,KACnC,uBAAyB,IAAIA,OAAO,MAGtCI,iBACE,WACA,WACA,OACA,UACA,UACA,aACA,cAEFC,mBACE,QACA,OACA,OACA;;kGC1UC,IAAMjV,kBACXkV,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAM7O,GAAM,KAClE8O,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAAMC,GAAM,KAClEC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAAOC,IAAO,MAC/DC,IAAO,MAAOj9B,IAAO,MAAOk9B,IAAO,MAAOC,IAAO,MA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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = result.result ?\n result.result : global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = 0;\n this.currentState = global_constants.STATE_TERMINATED;\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(\n callbackName: String,\n checkTerminated: boolean,\n CMIElement: String) {\n let returnValue;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.RETRIEVE_BEFORE_INIT,\n this.#error_codes.RETRIEVE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n returnValue = this.getCMIValue(CMIElement);\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: String,\n checkTerminated: boolean,\n CMIElement,\n value) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.STORE_BEFORE_INIT,\n this.#error_codes.STORE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === '0') {\n if (this.settings.autocommit) {\n this.scheduleCommit(this.settings.autocommitSeconds * 1000);\n }\n }\n\n this.apiLog(callbackName, CMIElement,\n ': ' + value + ': result: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n commit(\n callbackName: String,\n checkTerminated: boolean) {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.COMMIT_BEFORE_INIT,\n this.#error_codes.COMMIT_AFTER_TERM)) {\n const result = this.storeData(false);\n if (result.errorCode && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = result.result ?\n result.result : global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue,\n global_constants.LOG_LEVEL_DEBUG);\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: String) {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError?: number) {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} logMessage\n * @param {number}messageLevel\n */\n apiLog(\n functionName: String,\n CMIElement: String,\n logMessage: String,\n messageLevel: number) {\n logMessage = this.formatMessage(functionName, CMIElement, logMessage);\n\n if (messageLevel >= this.apiLogLevel) {\n switch (messageLevel) {\n case global_constants.LOG_LEVEL_ERROR:\n console.error(logMessage);\n break;\n case global_constants.LOG_LEVEL_WARNING:\n console.warn(logMessage);\n break;\n case global_constants.LOG_LEVEL_INFO:\n console.info(logMessage);\n break;\n case global_constants.LOG_LEVEL_DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n }\n }\n\n /**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} message\n * @return {string}\n */\n formatMessage(functionName: String, CMIElement: String, message: String) {\n const baseLength = 20;\n let messageString = '';\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += ' ';\n }\n\n messageString += ': ';\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += ' ';\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n }\n\n /**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\n stringMatches(str: String, tester: String) {\n return str && tester && str.match(tester);\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {*} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n _checkObjectHasProperty(refObject, attribute: String) {\n return Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject), attribute) ||\n (attribute in refObject);\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber, _detail) {\n throw new Error(\n 'The getLmsErrorMessageDetails method has not been implemented');\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement) {\n throw new Error('The getCMIValue method has not been implemented');\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement, _value) {\n throw new Error('The setCMIValue method has not been implemented');\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: String, scorm2004: boolean, CMIElement, value) {\n if (!CMIElement || CMIElement === '') {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n const attribute = structure[i];\n\n if (i === structure.length - 1) {\n if (scorm2004 && (attribute.substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n this.throwSCORMError(this.#error_codes.READ_ONLY_ELEMENT);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (this.stringMatches(CMIElement, '\\\\.correct_responses\\\\.\\\\d')) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === 0) {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n const newChild = this.getChildElement(CMIElement, value,\n foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(methodName, null,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n global_constants.LOG_LEVEL_WARNING);\n }\n\n return returnValue;\n }\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement, _value) {\n // just a stub method\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {*}\n * @abstract\n */\n getChildElement(_CMIElement, _value, _foundFirstIndex) {\n throw new Error('The getChildElement method has not been implemented');\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {*}\n */\n _commonGetCMIValue(methodName: String, scorm2004: boolean, CMIElement) {\n if (!CMIElement || CMIElement === '') {\n return '';\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n attribute = structure[i];\n\n if (!scorm2004) {\n if (i === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if ((String(attribute).substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n const target = String(attribute).\n substr(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (refObject === undefined) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(this.#error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage);\n break;\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === '_children') {\n this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);\n } else if (attribute === '_count') {\n this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized() {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized() {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated() {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {*} value\n */\n processListeners(functionName: String, CMIElement: String, value: any) {\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n const CMIElementsMatch = listener.CMIElement === CMIElement;\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message: String) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog('throwSCORMError', null, errorNumber + ': ' + message,\n global_constants.LOG_LEVEL_ERROR);\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: String) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = 0;\n }\n }\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {string}\n * @abstract\n */\n storeData(_calculateTotalTime) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json, CMIElement) {\n this.loadFromJSON(unflatten(json), CMIElement);\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n CMIElement = CMIElement || 'cmi';\n\n this.startingData = json;\n\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = CMIElement + '.' + key;\n const value = json[key];\n\n if (value['childArray']) {\n for (let i = 0; i < value['childArray'].length; i++) {\n this.loadFromJSON(value['childArray'][i],\n currentCMIElement + '.' + i);\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString() {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.stringify({cmi});\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject() {\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {*}\n * @abstract\n */\n renderCommitCMI(_terminateCommit) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {object|Array} params\n * @return {object}\n */\n processHttpRequest(url: String, params) {\n const genericError = {\n 'result': global_constants.SCORM_FALSE,\n 'errorCode': this.#error_codes.GENERAL,\n };\n\n const httpReq = new XMLHttpRequest();\n httpReq.open('POST', url, false);\n try {\n if (params instanceof Array) {\n httpReq.setRequestHeader('Content-Type',\n 'application/x-www-form-urlencoded');\n httpReq.send(params.join('&'));\n } else {\n httpReq.setRequestHeader('Content-Type',\n this.settings.commitRequestDataType);\n httpReq.send(JSON.stringify(params));\n }\n } catch (e) {\n return genericError;\n }\n\n try {\n return JSON.parse(httpReq.responseText);\n } catch (e) {\n return genericError;\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n */\n scheduleCommit(when: number) {\n this.clearScheduledCommit();\n this.#timeout = setTimeout(this.scheduledCallback.bind(this), when);\n this.apiLog('scheduleCommit', '', 'scheduled', global_constants.LOG_LEVEL_DEBUG);\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this.#timeout) {\n this.#scheduleCancelled = true;\n clearTimeout(this.#timeout);\n this.apiLog('clearScheduledCommit', '', 'cleared',\n global_constants.LOG_LEVEL_DEBUG);\n }\n }\n\n /**\n * Callback for scheduled commit timeout\n */\n scheduledCallback() {\n if (!this.#scheduleCancelled) {\n this.commit('Commit', false);\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n CMI,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject, NAV,\n} from './cmi/scorm12_cmi';\nimport * as Utilities from './utilities';\nimport {global_constants, scorm12_constants} from './constants/api_constants';\nimport {scorm12_error_codes} from './constants/error_codes';\n\nconst constants = scorm12_constants;\n\n/**\n * API class for SCORM 1.2\n */\nexport default class Scorm12API extends BaseAPI {\n /**\n * Constructor for SCORM 1.2 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm12_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n\n // Rename functions to match 1.2 Spec and expose to modules\n this.LMSInitialize = this.lmsInitialize;\n this.LMSFinish = this.lmsFinish;\n this.LMSGetValue = this.lmsGetValue;\n this.LMSSetValue = this.lmsSetValue;\n this.LMSCommit = this.lmsCommit;\n this.LMSGetLastError = this.lmsGetLastError;\n this.LMSGetErrorString = this.lmsGetErrorString;\n this.LMSGetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * lmsInitialize function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('LMSInitialize', 'LMS was already initialized!',\n 'LMS is already finished!');\n }\n\n /**\n * LMSFinish function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsFinish() {\n const result = this.terminate('LMSFinish', false);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.nav.event !== '') {\n if (this.nav.event === 'continue') {\n this.processListeners('SequenceNext');\n } else {\n this.processListeners('SequencePrevious');\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * LMSGetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('LMSGetValue', false, CMIElement);\n }\n\n /**\n * LMSSetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * LMSCommit function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('LMSCommit', false);\n }\n\n /**\n * LMSGetLastError function from SCORM 1.2 Spec\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('LMSGetLastError');\n }\n\n /**\n * LMSGetErrorString function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('LMSGetErrorString', CMIErrorCode);\n }\n\n /**\n * LMSGetDiagnostic function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('getCMIValue', false, CMIElement);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {*} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.correct_responses\\\\.\\\\d')) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d')) {\n newChild = new CMIInteractionsObject();\n }\n\n return newChild;\n }\n\n /**\n * Validates Correct Response values\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {boolean}\n */\n validateCorrectResponse(CMIElement, value) {\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {*} errorNumber\n * @param {boolean }detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = 'No Error';\n let detailMessage = 'No Error';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (constants.error_descriptions[errorNumber]) {\n basicMessage = constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {Scorm12API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n const originalStatus = this.cmi.core.lesson_status;\n if (originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'completed';\n }\n\n if (this.cmi.core.lesson_mode === 'normal') {\n if (this.cmi.core.credit === 'credit') {\n if (this.settings.mastery_override &&\n this.cmi.student_data.mastery_score !== '' &&\n this.cmi.core.score.raw !== '') {\n if (parseFloat(this.cmi.core.score.raw) >=\n parseFloat(this.cmi.student_data.mastery_score)) {\n this.cmi.core.lesson_status = 'passed';\n } else {\n this.cmi.core.lesson_status = 'failed';\n }\n }\n }\n } else if (this.cmi.core.lesson_mode === 'browse') {\n if ((this.startingData?.cmi?.core?.lesson_status || '') === '' &&\n originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'browsed';\n }\n }\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit);\n\n if (this.settings.lmsCommitUrl) {\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject);\n } else {\n console.log('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.log(commitObject);\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n ADL,\n CMI,\n CMICommentsObject,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject,\n} from './cmi/scorm2004_cmi';\nimport * as Utilities from './utilities';\nimport {global_constants, scorm2004_constants} from './constants/api_constants';\nimport {scorm2004_error_codes} from './constants/error_codes';\nimport {correct_responses} from './constants/response_constants';\nimport {valid_languages} from './constants/language_constants';\nimport {scorm2004_regex} from './constants/regex';\n\nconst constants = scorm2004_constants;\n\n/**\n * API class for SCORM 2004\n */\nexport default class Scorm2004API extends BaseAPI {\n #version: '1.0';\n\n /**\n * Constructor for SCORM 2004 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm2004_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.adl = new ADL();\n\n // Rename functions to match 2004 Spec and expose to modules\n this.Initialize = this.lmsInitialize;\n this.Terminate = this.lmsTerminate;\n this.GetValue = this.lmsGetValue;\n this.SetValue = this.lmsSetValue;\n this.Commit = this.lmsCommit;\n this.GetLastError = this.lmsGetLastError;\n this.GetErrorString = this.lmsGetErrorString;\n this.GetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * Getter for #version\n * @return {string}\n */\n get version() {\n return this.#version;\n }\n\n /**\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('Initialize');\n }\n\n /**\n * @return {string} bool\n */\n lmsTerminate() {\n const result = this.terminate('Terminate', true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.adl.nav.request !== '_none_') {\n switch (this.adl.nav.request) {\n case 'continue':\n this.processListeners('SequenceNext');\n break;\n case 'previous':\n this.processListeners('SequencePrevious');\n break;\n case 'choice':\n this.processListeners('SequenceChoice');\n break;\n case 'exit':\n this.processListeners('SequenceExit');\n break;\n case 'exitAll':\n this.processListeners('SequenceExitAll');\n break;\n case 'abandon':\n this.processListeners('SequenceAbandon');\n break;\n case 'abandonAll':\n this.processListeners('SequenceAbandonAll');\n break;\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('GetValue', true, CMIElement);\n }\n\n /**\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Orders LMS to store all content parameters\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('Commit');\n }\n\n /**\n * Returns last error code\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('GetLastError');\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('GetErrorString', CMIErrorCode);\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('GetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {any}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.correct_responses\\\\.\\\\d')) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const interaction = this.cmi.interactions.childArray[index];\n if (typeof interaction.type === 'undefined') {\n this.throwSCORMError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n const interaction_type = interaction.type;\n const interaction_count = interaction.correct_responses._count;\n if (interaction_type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode ===\n 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n const response_type = correct_responses[interaction_type];\n let nodes = [];\n if (response_type.delimiter !== '') {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n }\n if (this.lastErrorCode === 0) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n }\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d\\\\.objectives\\\\.\\\\d')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d')) {\n newChild = new CMIInteractionsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_learner\\\\.\\\\d')) {\n newChild = new CMICommentsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_lms\\\\.\\\\d')) {\n newChild = new CMICommentsObject(true);\n }\n\n return newChild;\n }\n\n /**\n * Validate correct response.\n * @param {string} CMIElement\n * @param {*} value\n */\n validateCorrectResponse(CMIElement, value) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const pattern_index = Number(parts[4]);\n const interaction = this.cmi.interactions.childArray[index];\n\n const interaction_type = interaction.type;\n const interaction_count = interaction.correct_responses._count;\n if (interaction_type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode === 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n const response_type = scorm2004_constants.correct_responses[interaction_type];\n if (typeof response_type.limit !== 'undefined' || interaction_count <\n response_type.limit) {\n let nodes = [];\n if (response_type.delimiter !== '') {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n\n if (this.lastErrorCode === 0 &&\n (!response_type.duplicate ||\n !this.checkDuplicatedPattern(interaction.correct_responses,\n pattern_index, value)) ||\n (this.lastErrorCode === 0 && value === '')) {\n // do nothing, we want the inverse\n } else {\n if (this.lastErrorCode === 0) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Already Exists');\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Collection Limit Reached');\n }\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('GetValue', true, CMIElement);\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {(string|number)} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = '';\n let detailMessage = '';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (constants.error_descriptions[errorNumber]) {\n basicMessage = constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Check to see if a correct_response value has been duplicated\n * @param {CMIArray} correct_response\n * @param {number} current_index\n * @param {*} value\n * @return {boolean}\n */\n checkDuplicatedPattern = (correct_response, current_index, value) => {\n let found = false;\n const count = correct_response._count;\n for (let i = 0; i < count && !found; i++) {\n if (i !== current_index && correct_response.childArray[i] === value) {\n found = true;\n }\n }\n return found;\n };\n\n /**\n * Checks for a valid correct_response value\n * @param {string} interaction_type\n * @param {Array} nodes\n * @param {*} value\n */\n checkCorrectResponseValue(interaction_type, nodes, value) {\n const response = correct_responses[interaction_type];\n const formatRegex = new RegExp(response.format);\n for (let i = 0; i < nodes.length && this.lastErrorCode === 0; i++) {\n if (interaction_type.match(\n '^(fill-in|long-fill-in|matching|performance|sequencing)$')) {\n nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);\n }\n\n if (response.delimiter2 !== undefined) {\n const values = nodes[i].split(response.delimiter2);\n if (values.length === 2) {\n const matches = values[0].match(formatRegex);\n if (!matches) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (!values[1].match(new RegExp(response.format2))) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n const matches = nodes[i].match(formatRegex);\n if ((!matches && value !== '') ||\n (!matches && interaction_type === 'true-false')) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (interaction_type === 'numeric' && nodes.length > 1) {\n if (Number(nodes[0]) > Number(nodes[1])) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n if (nodes[i] !== '' && response.unique) {\n for (let j = 0; j < i && this.lastErrorCode === 0; j++) {\n if (nodes[i] === nodes[j]) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Remove prefixes from correct_response\n * @param {string} node\n * @return {*}\n */\n removeCorrectResponsePrefixes(node) {\n let seenOrder = false;\n let seenCase = false;\n let seenLang = false;\n\n const prefixRegex = new RegExp(\n '^({(lang|case_matters|order_matters)=([^}]+)})');\n let matches = node.match(prefixRegex);\n let langMatches = null;\n while (matches) {\n switch (matches[2]) {\n case 'lang':\n langMatches = node.match(scorm2004_regex.CMILangcr);\n if (langMatches) {\n const lang = langMatches[3];\n if (lang !== undefined && lang.length > 0) {\n if (valid_languages[lang.toLowerCase()] === undefined) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n seenLang = true;\n break;\n case 'case_matters':\n if (!seenLang && !seenOrder && !seenCase) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenCase = true;\n break;\n case 'order_matters':\n if (!seenCase && !seenLang && !seenOrder) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenOrder = true;\n break;\n default:\n break;\n }\n node = node.substr(matches[1].length);\n matches = node.match(prefixRegex);\n }\n\n return node;\n }\n\n /**\n * Replace the whole API with another\n * @param {Scorm2004API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.adl = newAPI.adl;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n if (this.cmi.mode === 'normal') {\n if (this.cmi.credit === 'credit') {\n if (this.cmi.completion_threshold && this.cmi.progress_measure) {\n if (this.cmi.progress_measure >= this.cmi.completion_threshold) {\n this.cmi.completion_status = 'completed';\n } else {\n this.cmi.completion_status = 'incomplete';\n }\n }\n if (this.cmi.scaled_passing_score !== null &&\n this.cmi.score.scaled !== '') {\n if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {\n this.cmi.success_status = 'passed';\n } else {\n this.cmi.success_status = 'failed';\n }\n }\n }\n }\n }\n\n let navRequest = false;\n if (this.adl.nav.request !== (this.startingData?.adl?.nav?.request) &&\n this.adl.nav.request !== '_none_') {\n this.adl.nav.request = encodeURIComponent(this.adl.nav.request);\n navRequest = true;\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit);\n\n if (this.settings.lmsCommitUrl) {\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n const result = this.processHttpRequest(this.settings.lmsCommitUrl,\n commitObject);\n // check if this is a sequencing call, and then call the necessary JS\n if (navRequest && result.navRequest !== undefined &&\n result.navRequest !== '') {\n Function(`\"use strict\";(() => { ${result.navRequest} })()`)();\n }\n return result;\n } else {\n console.log('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.log(commitObject);\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","import * as Scorm12CMI from './scorm12_cmi';\nimport {BaseCMI, CMIArray, CMIScore} from './common';\nimport {aicc_constants} from '../constants/api_constants';\nimport {aicc_regex} from '../constants/regex';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {\n check12ValidFormat,\n throwReadOnlyError,\n throwWriteOnlyError,\n} from './scorm12_cmi';\n\nconst constants = aicc_constants;\nconst regex = aicc_regex;\n\n/**\n * CMI Class for AICC\n */\nexport class CMI extends Scorm12CMI.CMI {\n /**\n * Constructor for AICC CMI object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super(constants.cmi_children);\n\n if (initialized) this.initialize();\n\n this.student_data = new AICCCMIStudentData();\n this.evaluation = new CMIEvaluation();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.student_data?.initialize();\n this.evaluation?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n 'evaluation': this.evaluation,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * AICC Evaluation object\n */\nclass CMIEvaluation extends BaseCMI {\n /**\n * Constructor for AICC Evaluation object\n */\n constructor() {\n super();\n\n this.comments = new CMIEvaluationComments();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.comments?.initialize();\n }\n\n /**\n * toJSON for cmi.evaluation object\n * @return {{comments: CMIEvaluationComments}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments': this.comments,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing AICC's cmi.evaluation.comments object\n */\nclass CMIEvaluationComments extends CMIArray {\n /**\n * Constructor for AICC Evaluation Comments object\n */\n constructor() {\n super(constants.comments_children,\n scorm12_error_codes.INVALID_SET_VALUE);\n }\n}\n\n/**\n * StudentData class for AICC\n */\nclass AICCCMIStudentData extends Scorm12CMI.CMIStudentData {\n /**\n * Constructor for AICC StudentData object\n */\n constructor() {\n super(constants.student_data_children);\n\n this.tries = new CMITries();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.tries?.initialize();\n }\n\n #tries_during_lesson = '';\n\n /**\n * Getter for tries_during_lesson\n * @return {string}\n */\n get tries_during_lesson() {\n return this.#tries_during_lesson;\n }\n\n /**\n * Setter for #tries_during_lesson. Sets an error if trying to set after\n * initialization.\n * @param {string} tries_during_lesson\n */\n set tries_during_lesson(tries_during_lesson) {\n !this.initialized ?\n this.#tries_during_lesson = tries_during_lesson :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data object\n * @return {\n * {\n * mastery_score: string,\n * max_time_allowed: string,\n * time_limit_action: string,\n * tries: CMITries\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n 'tries': this.tries,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.student_data.tries object\n */\nexport class CMITries extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super(aicc_constants.tries_children);\n }\n}\n\n/**\n * Class for AICC Tries\n */\nexport class CMITriesObject extends BaseCMI {\n /**\n * Constructor for AICC Tries object\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #status = '';\n #time = '';\n\n /**\n * Getter for #status\n * @return {string}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.student_data.tries.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'status': this.status,\n 'time': this.time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Evaluation Comments\n */\nexport class CMIEvaluationCommentsObject extends BaseCMI {\n /**\n * Constructor for Evaluation Comments\n */\n constructor() {\n super();\n }\n\n #content = '';\n #location = '';\n #time = '';\n\n /**\n * Getter for #content\n * @return {string}\n */\n get content() {\n return this.#content;\n }\n\n /**\n * Setter for #content\n * @param {string} content\n */\n set content(content) {\n if (check12ValidFormat(content, regex.CMIString256)) {\n this.#content = content;\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check12ValidFormat(location, regex.CMIString256)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setting for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.evaulation.comments.n object\n * @return {\n * {\n * content: string,\n * location: string,\n * time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'content': this.content,\n 'location': this.location,\n 'time': this.time,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {scorm12_constants} from '../constants/api_constants';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {ValidationError} from '../exceptions';\nimport {scorm12_regex} from '../constants/regex';\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: String,\n regexPattern: String,\n errorCode: number,\n allowEmptyString?: boolean) {\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === '') {\n return true;\n }\n if (value === undefined || !matches || matches[0] === '') {\n throw new ValidationError(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {*} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any, rangePattern: String, errorCode: number) {\n const ranges = rangePattern.split('#');\n value = value * 1.0;\n if (value >= ranges[0]) {\n if ((ranges[1] === '*') || (value <= ranges[1])) {\n return true;\n } else {\n throw new ValidationError(errorCode);\n }\n } else {\n throw new ValidationError(errorCode);\n }\n}\n\n/**\n * Base class for API cmi objects\n */\nexport class BaseCMI {\n jsonString = false;\n #initialized = false;\n\n /**\n * Constructor for BaseCMI, just marks the class as abstract\n */\n constructor() {\n if (new.target === BaseCMI) {\n throw new TypeError('Cannot construct BaseCMI instances directly');\n }\n }\n\n /**\n * Getter for #initialized\n * @return {boolean}\n */\n get initialized() {\n return this.#initialized;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n this.#initialized = true;\n }\n}\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n /**\n * Constructor for *.score\n * @param {string} score_children\n * @param {string} score_range\n * @param {string} max\n * @param {number} invalidErrorCode\n * @param {number} invalidTypeCode\n * @param {number} invalidRangeCode\n * @param {string} decimalRegex\n */\n constructor(\n {\n score_children,\n score_range,\n max,\n invalidErrorCode,\n invalidTypeCode,\n invalidRangeCode,\n decimalRegex,\n }) {\n super();\n\n this.#_children = score_children ||\n scorm12_constants.score_children;\n this.#_score_range = !score_range ? false : scorm12_regex.score_range;\n this.#max = (max || max === '') ? max : '100';\n this.#_invalid_error_code = invalidErrorCode ||\n scorm12_error_codes.INVALID_SET_VALUE;\n this.#_invalid_type_code = invalidTypeCode ||\n scorm12_error_codes.TYPE_MISMATCH;\n this.#_invalid_range_code = invalidRangeCode ||\n scorm12_error_codes.VALUE_OUT_OF_RANGE;\n this.#_decimal_regex = decimalRegex ||\n scorm12_regex.CMIDecimal;\n }\n\n #_children;\n #_score_range;\n #_invalid_error_code;\n #_invalid_type_code;\n #_invalid_range_code;\n #_decimal_regex;\n #raw = '';\n #min = '';\n #max;\n\n /**\n * Getter for _children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throw new ValidationError(this.#_invalid_error_code);\n }\n\n /**\n * Getter for #raw\n * @return {string}\n */\n get raw() {\n return this.#raw;\n }\n\n /**\n * Setter for #raw\n * @param {string} raw\n */\n set raw(raw) {\n if (checkValidFormat(raw, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(raw, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#raw = raw;\n }\n }\n\n /**\n * Getter for #min\n * @return {string}\n */\n get min() {\n return this.#min;\n }\n\n /**\n * Setter for #min\n * @param {string} min\n */\n set min(min) {\n if (checkValidFormat(min, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(min, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#min = min;\n }\n }\n\n /**\n * Getter for #max\n * @return {string}\n */\n get max() {\n return this.#max;\n }\n\n /**\n * Setter for #max\n * @param {string} max\n */\n set max(max) {\n if (checkValidFormat(max, this.#_decimal_regex,\n this.#_invalid_type_code) &&\n (!this.#_score_range ||\n checkValidRange(max, this.#_score_range,\n this.#_invalid_range_code))) {\n this.#max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {{min: string, max: string, raw: string}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'raw': this.raw,\n 'min': this.min,\n 'max': this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n /**\n * Constructor cmi *.n arrays\n * @param {string} children\n * @param {number} errorCode\n */\n constructor({children, errorCode}) {\n super();\n this.#_children = children;\n this.#errorCode = errorCode;\n this.childArray = [];\n }\n\n #errorCode;\n #_children;\n\n /**\n * Getter for _children\n * @return {*}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throw new ValidationError(this.#errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count() {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count) {\n throw new ValidationError(this.#errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON() {\n this.jsonString = true;\n const result = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + ''] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport {scorm12_constants} from '../constants/api_constants';\nimport {scorm12_error_codes} from '../constants/error_codes';\nimport {scorm12_regex} from '../constants/regex';\nimport {ValidationError} from '../exceptions';\nimport * as Utilities from '../utilities';\n\nconst constants = scorm12_constants;\nconst regex = scorm12_regex;\n\n/**\n * Helper method for throwing Read Only error\n */\nexport function throwReadOnlyError() {\n throw new ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nexport function throwWriteOnlyError() {\n throw new ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Invalid Set error\n */\nfunction throwInvalidValueError() {\n throw new ValidationError(scorm12_error_codes.INVALID_SET_VALUE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(value, regexPattern,\n scorm12_error_codes.TYPE_MISMATCH, allowEmptyString);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidRange(\n value: any,\n rangePattern: String,\n allowEmptyString?: boolean) {\n return checkValidRange(value, rangePattern,\n scorm12_error_codes.VALUE_OUT_OF_RANGE, allowEmptyString);\n}\n\n/**\n * Class representing the cmi object for SCORM 1.2\n */\nexport class CMI extends BaseCMI {\n #_children = '';\n #_version = '3.4';\n #suspend_data = '';\n #launch_data = '';\n #comments = '';\n #comments_from_lms = '';\n\n student_data = null;\n\n /**\n * Constructor for the SCORM 1.2 cmi object\n * @param {string} cmi_children\n * @param {(CMIStudentData|AICCCMIStudentData)} student_data\n * @param {boolean} initialized\n */\n constructor(cmi_children, student_data, initialized: boolean) {\n super();\n\n if (initialized) this.initialize();\n\n this.#_children = cmi_children ? cmi_children : constants.cmi_children;\n this.core = new CMICore();\n this.objectives = new CMIObjectives();\n this.student_data = student_data ? student_data : new CMIStudentData();\n this.student_preference = new CMIStudentPreference();\n this.interactions = new CMIInteractions();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.core?.initialize();\n this.objectives?.initialize();\n this.student_data?.initialize();\n this.student_preference?.initialize();\n this.interactions?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n };\n delete this.jsonString;\n return result;\n }\n\n /**\n * Getter for #_version\n * @return {string}\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n */\n set _version(_version) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check12ValidFormat(suspend_data, regex.CMIString4096)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #comments\n * @return {string}\n */\n get comments() {\n return this.#comments;\n }\n\n /**\n * Setter for #comments\n * @param {string} comments\n */\n set comments(comments) {\n if (check12ValidFormat(comments, regex.CMIString4096)) {\n this.#comments = comments;\n }\n }\n\n /**\n * Getter for #comments_from_lms\n * @return {string}\n */\n get comments_from_lms() {\n return this.#comments_from_lms;\n }\n\n /**\n * Setter for #comments_from_lms. Can only be called before initialization.\n * @param {string} comments_from_lms\n */\n set comments_from_lms(comments_from_lms) {\n !this.initialized ?\n this.#comments_from_lms = comments_from_lms :\n throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return this.core.getCurrentTotalTime();\n }\n}\n\n/**\n * Class representing the cmi.core object\n * @extends BaseCMI\n */\nclass CMICore extends BaseCMI {\n /**\n * Constructor for cmi.core\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #_children = constants.core_children;\n #student_id = '';\n #student_name = '';\n #lesson_location = '';\n #credit = '';\n #lesson_status = 'not attempted';\n #entry = '';\n #total_time = '';\n #lesson_mode = 'normal';\n #exit = '';\n #session_time = '00:00:00';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #student_id\n * @return {string}\n */\n get student_id() {\n return this.#student_id;\n }\n\n /**\n * Setter for #student_id. Can only be called before initialization.\n * @param {string} student_id\n */\n set student_id(student_id) {\n !this.initialized ? this.#student_id = student_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #student_name\n * @return {string}\n */\n get student_name() {\n return this.#student_name;\n }\n\n /**\n * Setter for #student_name. Can only be called before initialization.\n * @param {string} student_name\n */\n set student_name(student_name) {\n !this.initialized ?\n this.#student_name = student_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_location\n * @return {string}\n */\n get lesson_location() {\n return this.#lesson_location;\n }\n\n /**\n * Setter for #lesson_location\n * @param {string} lesson_location\n */\n set lesson_location(lesson_location) {\n if (check12ValidFormat(lesson_location, regex.CMIString256)) {\n this.#lesson_location = lesson_location;\n }\n }\n\n /**\n * Getter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (check12ValidFormat(lesson_status, regex.CMIStatus)) {\n this.#lesson_status = lesson_status;\n }\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_mode\n * @return {string}\n */\n get lesson_mode() {\n return this.#lesson_mode;\n }\n\n /**\n * Setter for #lesson_mode. Can only be called before initialization.\n * @param {string} lesson_mode\n */\n set lesson_mode(lesson_mode) {\n !this.initialized ? this.#lesson_mode = lesson_mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {*}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Setter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check12ValidFormat(exit, regex.CMIExit)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {*}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check12ValidFormat(session_time, regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return Utilities.addHHMMSSTimeStrings(\n this.#total_time,\n this.#session_time,\n new RegExp(scorm12_regex.CMITimespan)\n );\n }\n\n /**\n * toJSON for cmi.core\n *\n * @return {\n * {\n * student_name: string,\n * entry: string,\n * exit: string,\n * score: CMIScore,\n * student_id: string,\n * lesson_mode: string,\n * lesson_location: string,\n * lesson_status: string,\n * credit: string,\n * total_time: string,\n * session_time: *\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'student_id': this.student_id,\n 'student_name': this.student_name,\n 'lesson_location': this.lesson_location,\n 'credit': this.credit,\n 'lesson_status': this.lesson_status,\n 'entry': this.entry,\n 'total_time': this.total_time,\n 'lesson_mode': this.lesson_mode,\n 'exit': this.exit,\n 'session_time': this.session_time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives object\n * @extends CMIArray\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives\n */\n constructor() {\n super({\n children: constants.objectives_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_data object\n * @extends BaseCMI\n */\nexport class CMIStudentData extends BaseCMI {\n #_children;\n #mastery_score = '';\n #max_time_allowed = '';\n #time_limit_action = '';\n\n /**\n * Constructor for cmi.student_data\n * @param {string} student_data_children\n */\n constructor(student_data_children) {\n super();\n\n this.#_children = student_data_children ?\n student_data_children :\n constants.student_data_children;\n }\n\n /**\n * Getter for #_children\n * @return {*}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #master_score\n * @return {string}\n */\n get mastery_score() {\n return this.#mastery_score;\n }\n\n /**\n * Setter for #master_score. Can only be called before initialization.\n * @param {string} mastery_score\n */\n set mastery_score(mastery_score) {\n !this.initialized ?\n this.#mastery_score = mastery_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data\n *\n * @return {\n * {\n * max_time_allowed: string,\n * time_limit_action: string,\n * mastery_score: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_preference object\n * @extends BaseCMI\n */\nclass CMIStudentPreference extends BaseCMI {\n /**\n * Constructor for cmi.student_preference\n */\n constructor() {\n super();\n }\n\n #_children = constants.student_preference_children;\n #audio = '';\n #language = '';\n #speed = '';\n #text = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #audio\n * @return {string}\n */\n get audio() {\n return this.#audio;\n }\n\n /**\n * Setter for #audio\n * @param {string} audio\n */\n set audio(audio) {\n if (check12ValidFormat(audio, regex.CMISInteger) &&\n check12ValidRange(audio, regex.audio_range)) {\n this.#audio = audio;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check12ValidFormat(language, regex.CMIString256)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #speed\n * @return {string}\n */\n get speed() {\n return this.#speed;\n }\n\n /**\n * Setter for #speed\n * @param {string} speed\n */\n set speed(speed) {\n if (check12ValidFormat(speed, regex.CMISInteger) &&\n check12ValidRange(speed, regex.speed_range)) {\n this.#speed = speed;\n }\n }\n\n /**\n * Getter for #text\n * @return {string}\n */\n get text() {\n return this.#text;\n }\n\n /**\n * Setter for #text\n * @param {string} text\n */\n set text(text) {\n if (check12ValidFormat(text, regex.CMISInteger) &&\n check12ValidRange(text, regex.text_range)) {\n this.#text = text;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'speed': this.speed,\n 'text': this.text,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions object\n * @extends BaseCMI\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.interactions\n */\n constructor() {\n super({\n children: constants.interactions_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n object\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n children: constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n children: constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n #id = '';\n #time = '';\n #type = '';\n #weighting = '';\n #student_response = '';\n #result = '';\n #latency = '';\n\n /**\n * Getter for #id. Should only be called during JSON export.\n * @return {*}\n */\n get id() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #time. Should only be called during JSON export.\n * @return {*}\n */\n get time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #type. Should only be called during JSON export.\n * @return {*}\n */\n get type() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check12ValidFormat(type, regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #weighting. Should only be called during JSON export.\n * @return {*}\n */\n get weighting() {\n return (!this.jsonString) ?\n throwWriteOnlyError() :\n this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check12ValidFormat(weighting, regex.CMIDecimal) &&\n check12ValidRange(weighting, regex.weighting_range)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #student_response. Should only be called during JSON export.\n * @return {*}\n */\n get student_response() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#student_response;\n }\n\n /**\n * Setter for #student_response\n * @param {string} student_response\n */\n set student_response(student_response) {\n if (check12ValidFormat(student_response, regex.CMIFeedback, true)) {\n this.#student_response = student_response;\n }\n }\n\n /**\n * Getter for #result. Should only be called during JSON export.\n * @return {*}\n */\n get result() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check12ValidFormat(result, regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency. Should only be called during JSON export.\n * @return {*}\n */\n get latency() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check12ValidFormat(latency, regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * time: string,\n * type: string,\n * weighting: string,\n * student_response: string,\n * result: string,\n * latency: string,\n * objectives: CMIArray,\n * correct_responses: CMIArray\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'time': this.time,\n 'type': this.type,\n 'weighting': this.weighting,\n 'student_response': this.student_response,\n 'result': this.result,\n 'latency': this.latency,\n 'objectives': this.objectives,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: constants.score_children,\n score_range: regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n });\n }\n\n #id = '';\n #status = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #status\n * @return {\"\"}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n * @return {\n * {\n * id: string,\n * status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'status': this.status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n #id = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.correct_responses.n\n */\n constructor() {\n super();\n }\n\n #pattern = '';\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check12ValidFormat(pattern, regex.CMIFeedback, true)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON for cmi.interactions.correct_responses.n\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Navigation object\n */\nexport class NAV extends BaseCMI {\n /**\n * Constructor for NAV object\n */\n constructor() {\n super();\n }\n\n #event = '';\n\n /**\n * Getter for #event\n * @return {string}\n */\n get event() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#event;\n }\n\n /**\n * Setter for #event\n * @param {string} event\n */\n set event(event) {\n if (check12ValidFormat(event, regex.NAVEvent)) {\n this.#event = event;\n }\n }\n\n /**\n * toJSON for nav object\n * @return {\n * {\n * event: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'event': this.event,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport {scorm2004_constants} from '../constants/api_constants';\nimport {scorm2004_regex} from '../constants/regex';\nimport {scorm2004_error_codes} from '../constants/error_codes';\nimport {learner_responses} from '../constants/response_constants';\nimport {ValidationError} from '../exceptions';\nimport * as Util from '../utilities';\n\nconst constants = scorm2004_constants;\nconst regex = scorm2004_regex;\n\n/**\n * Helper method for throwing Read Only error\n */\nfunction throwReadOnlyError() {\n throw new ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nfunction throwWriteOnlyError() {\n throw new ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Type Mismatch error\n */\nfunction throwTypeMismatchError() {\n throw new ValidationError(scorm2004_error_codes.TYPE_MISMATCH);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nfunction check2004ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(value, regexPattern,\n scorm2004_error_codes.TYPE_MISMATCH, allowEmptyString);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @return {boolean}\n */\nfunction check2004ValidRange(value: any, rangePattern: String) {\n return checkValidRange(value, rangePattern,\n scorm2004_error_codes.VALUE_OUT_OF_RANGE);\n}\n\n/**\n * Class representing cmi object for SCORM 2004\n */\nexport class CMI extends BaseCMI {\n /**\n * Constructor for the SCORM 2004 cmi object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super();\n\n this.learner_preference = new CMILearnerPreference();\n this.score = new Scorm2004CMIScore();\n this.comments_from_learner = new CMICommentsFromLearner();\n this.comments_from_lms = new CMICommentsFromLMS();\n this.interactions = new CMIInteractions();\n this.objectives = new CMIObjectives();\n\n if (initialized) this.initialize();\n }\n\n #_version = '1.0';\n #_children = constants.cmi_children;\n #completion_status = 'unknown';\n #completion_threshold = '';\n #credit = 'credit';\n #entry = '';\n #exit = '';\n #launch_data = '';\n #learner_id = '';\n #learner_name = '';\n #location = '';\n #max_time_allowed = '';\n #mode = 'normal';\n #progress_measure = '';\n #scaled_passing_score = '';\n #session_time = 'PT0H0M0S';\n #success_status = 'unknown';\n #suspend_data = '';\n #time_limit_action = 'continue,no message';\n #total_time = '0';\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.learner_preference?.initialize();\n this.score?.initialize();\n this.comments_from_learner?.initialize();\n this.comments_from_lms?.initialize();\n this.interactions?.initialize();\n this.objectives?.initialize();\n }\n\n /**\n * Getter for #_version\n * @return {string}\n * @private\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n * @private\n */\n set _version(_version) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {number} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #completion_threshold\n * @return {string}\n */\n get completion_threshold() {\n return this.#completion_threshold;\n }\n\n /**\n * Setter for #completion_threshold. Can only be called before initialization.\n * @param {string} completion_threshold\n */\n set completion_threshold(completion_threshold) {\n !this.initialized ?\n this.#completion_threshold = completion_threshold :\n throwReadOnlyError();\n }\n\n /**\n * Setter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Getter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check2004ValidFormat(exit, regex.CMIExit)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_id\n * @return {string}\n */\n get learner_id() {\n return this.#learner_id;\n }\n\n /**\n * Setter for #learner_id. Can only be called before initialization.\n * @param {string} learner_id\n */\n set learner_id(learner_id) {\n !this.initialized ? this.#learner_id = learner_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_name\n * @return {string}\n */\n get learner_name() {\n return this.#learner_name;\n }\n\n /**\n * Setter for #learner_name. Can only be called before initialization.\n * @param {string} learner_name\n */\n set learner_name(learner_name) {\n !this.initialized ?\n this.#learner_name = learner_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check2004ValidFormat(location, regex.CMIString1000)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #mode\n * @return {string}\n */\n get mode() {\n return this.#mode;\n }\n\n /**\n * Setter for #mode. Can only be called before initialization.\n * @param {string} mode\n */\n set mode(mode) {\n !this.initialized ? this.#mode = mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #scaled_passing_score\n * @return {string}\n */\n get scaled_passing_score() {\n return this.#scaled_passing_score;\n }\n\n /**\n * Setter for #scaled_passing_score. Can only be called before initialization.\n * @param {string} scaled_passing_score\n */\n set scaled_passing_score(scaled_passing_score) {\n !this.initialized ?\n this.#scaled_passing_score = scaled_passing_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check2004ValidFormat(session_time, regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check2004ValidFormat(suspend_data, regex.CMIString64000, true)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string} ISO8601 Duration\n */\n getCurrentTotalTime() {\n return Util.addTwoDurations(\n this.#total_time,\n this.#session_time,\n scorm2004_regex.CMITimespan,\n );\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * comments_from_learner: CMICommentsFromLearner,\n * comments_from_lms: CMICommentsFromLMS,\n * completion_status: string,\n * completion_threshold: string,\n * credit: string,\n * entry: string,\n * exit: string,\n * interactions: CMIInteractions,\n * launch_data: string,\n * learner_id: string,\n * learner_name: string,\n * learner_preference: CMILearnerPreference,\n * location: string,\n * max_time_allowed: string,\n * mode: string,\n * objectives: CMIObjectives,\n * progress_measure: string,\n * scaled_passing_score: string,\n * score: Scorm2004CMIScore,\n * session_time: string,\n * success_status: string,\n * suspend_data: string,\n * time_limit_action: string,\n * total_time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments_from_learner': this.comments_from_learner,\n 'comments_from_lms': this.comments_from_lms,\n 'completion_status': this.completion_status,\n 'completion_threshold': this.completion_threshold,\n 'credit': this.credit,\n 'entry': this.entry,\n 'exit': this.exit,\n 'interactions': this.interactions,\n 'launch_data': this.launch_data,\n 'learner_id': this.learner_id,\n 'learner_name': this.learner_name,\n 'learner_preference': this.learner_preference,\n 'location': this.location,\n 'max_time_allowed': this.max_time_allowed,\n 'mode': this.mode,\n 'objectives': this.objectives,\n 'progress_measure': this.progress_measure,\n 'scaled_passing_score': this.scaled_passing_score,\n 'score': this.score,\n 'session_time': this.session_time,\n 'success_status': this.success_status,\n 'suspend_data': this.suspend_data,\n 'time_limit_action': this.time_limit_action,\n 'total_time': this.total_time,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.learner_preference object\n */\nclass CMILearnerPreference extends BaseCMI {\n #_children = constants.student_preference_children;\n #audio_level = '1';\n #language = '';\n #delivery_speed = '1';\n #audio_captioning = '0';\n\n /**\n * Constructor for cmi.learner_preference\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #audio_level\n * @return {string}\n */\n get audio_level() {\n return this.#audio_level;\n }\n\n /**\n * Setter for #audio_level\n * @param {string} audio_level\n */\n set audio_level(audio_level) {\n if (check2004ValidFormat(audio_level, regex.CMIDecimal) &&\n check2004ValidRange(audio_level, regex.audio_range)) {\n this.#audio_level = audio_level;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check2004ValidFormat(language, regex.CMILang)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #delivery_speed\n * @return {string}\n */\n get delivery_speed() {\n return this.#delivery_speed;\n }\n\n /**\n * Setter for #delivery_speed\n * @param {string} delivery_speed\n */\n set delivery_speed(delivery_speed) {\n if (check2004ValidFormat(delivery_speed, regex.CMIDecimal) &&\n check2004ValidRange(delivery_speed, regex.speed_range)) {\n this.#delivery_speed = delivery_speed;\n }\n }\n\n /**\n * Getter for #audio_captioning\n * @return {string}\n */\n get audio_captioning() {\n return this.#audio_captioning;\n }\n\n /**\n * Setter for #audio_captioning\n * @param {string} audio_captioning\n */\n set audio_captioning(audio_captioning) {\n if (check2004ValidFormat(audio_captioning, regex.CMISInteger) &&\n check2004ValidRange(audio_captioning, regex.text_range)) {\n this.#audio_captioning = audio_captioning;\n }\n }\n\n /**\n * toJSON for cmi.learner_preference\n *\n * @return {\n * {\n * audio_level: string,\n * language: string,\n * delivery_speed: string,\n * audio_captioning: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio_level': this.audio_level,\n 'language': this.language,\n 'delivery_speed': this.delivery_speed,\n 'audio_captioning': this.audio_captioning,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions object\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: constants.interactions_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.objectives object\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: constants.objectives_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_lms object\n */\nclass CMICommentsFromLMS extends CMIArray {\n /**\n * Constructor for cmi.comments_from_lms Array\n */\n constructor() {\n super({\n children: constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner object\n */\nclass CMICommentsFromLearner extends CMIArray {\n /**\n * Constructor for cmi.comments_from_learner Array\n */\n constructor() {\n super({\n children: constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.interaction.n object\n */\nexport class CMIInteractionsObject extends BaseCMI {\n #id = '';\n #type = '';\n #timestamp = '';\n #weighting = '';\n #learner_response = '';\n #result = '';\n #latency = '';\n #description = '';\n\n /**\n * Constructor for cmi.interaction.n\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n children: constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n children: constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #type\n * @return {string}\n */\n get type() {\n return this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check2004ValidFormat(type, regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (check2004ValidFormat(timestamp, regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n\n /**\n * Getter for #weighting\n * @return {string}\n */\n get weighting() {\n return this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check2004ValidFormat(weighting, regex.CMIDecimal)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #learner_response\n * @return {string}\n */\n get learner_response() {\n return this.#learner_response;\n }\n\n /**\n * Setter for #learner_response. Does type validation to make sure response\n * matches SCORM 2004's spec\n * @param {string} learner_response\n */\n set learner_response(learner_response) {\n if (typeof this.type === 'undefined') {\n throw new ValidationError(\n scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n let nodes = [];\n const response_type = learner_responses[this.type];\n if (response_type.delimiter !== '') {\n nodes = learner_response.split(response_type.delimiter);\n } else {\n nodes[0] = learner_response;\n }\n\n if ((nodes.length > 0) && (nodes.length <= response_type.max)) {\n const formatRegex = new RegExp(response_type.format);\n for (let i = 0; i < nodes.length; i++) {\n if (typeof response_type.delimiter2 !== 'undefined') {\n const values = nodes[i].split(response_type.delimiter2);\n if (values.length === 2) {\n if (!values[0].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (!values[1].match(new RegExp(response_type.format2))) {\n throwTypeMismatchError();\n }\n }\n } else {\n throwTypeMismatchError();\n }\n } else {\n if (!nodes[i].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (nodes[i] !== '' && response_type.unique) {\n for (let j = 0; j < i; j++) {\n if (nodes[i] === nodes[j]) {\n throwTypeMismatchError();\n }\n }\n }\n }\n }\n }\n } else {\n throw new ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n\n /**\n * Getter for #result\n * @return {string}\n */\n get result() {\n return this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check2004ValidFormat(result, regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency\n * @return {string}\n */\n get latency() {\n return this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check2004ValidFormat(latency, regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (check2004ValidFormat(description, regex.CMILangString250, true)) {\n this.#description = description;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * type: string,\n * objectives: CMIArray,\n * timestamp: string,\n * correct_responses: CMIArray,\n * weighting: string,\n * learner_response: string,\n * result: string,\n * latency: string,\n * description: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'type': this.type,\n 'objectives': this.objectives,\n 'timestamp': this.timestamp,\n 'weighting': this.weighting,\n 'learner_response': this.learner_response,\n 'result': this.result,\n 'latency': this.latency,\n 'description': this.description,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.objectives.n object\n */\nexport class CMIObjectivesObject extends BaseCMI {\n #id = '';\n #success_status = 'unknown';\n #completion_status = 'unknown';\n #progress_measure = '';\n #description = '';\n\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new Scorm2004CMIScore();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (check2004ValidFormat(description, regex.CMILangString250, true)) {\n this.#description = description;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n *\n * @return {\n * {\n * id: string,\n * success_status: string,\n * completion_status: string,\n * progress_measure: string,\n * description: string,\n * score: Scorm2004CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'success_status': this.success_status,\n 'completion_status': this.completion_status,\n 'progress_measure': this.progress_measure,\n 'description': this.description,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi *.score object\n */\nclass Scorm2004CMIScore extends CMIScore {\n #scaled = '';\n\n /**\n * Constructor for cmi *.score\n */\n constructor() {\n super(\n {\n score_children: constants.score_children,\n max: '',\n invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,\n decimalRegex: scorm2004_regex.CMIDecimal,\n });\n }\n\n /**\n * Getter for #scaled\n * @return {string}\n */\n get scaled() {\n return this.#scaled;\n }\n\n /**\n * Setter for #scaled\n * @param {string} scaled\n */\n set scaled(scaled) {\n if (check2004ValidFormat(scaled, regex.CMIDecimal) &&\n check2004ValidRange(scaled, regex.scaled_range)) {\n this.#scaled = scaled;\n }\n }\n\n /**\n * toJSON for cmi *.score\n *\n * @return {\n * {\n * scaled: string,\n * raw: string,\n * min: string,\n * max: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'scaled': this.scaled,\n 'raw': super.raw,\n 'min': super.min,\n 'max': super.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object\n */\nexport class CMICommentsObject extends BaseCMI {\n #comment = '';\n #location = '';\n #timestamp = '';\n #readOnlyAfterInit;\n\n /**\n * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n\n * @param {boolean} readOnlyAfterInit\n */\n constructor(readOnlyAfterInit = false) {\n super();\n this.#comment = '';\n this.#location = '';\n this.#timestamp = '';\n this.#readOnlyAfterInit = readOnlyAfterInit;\n }\n\n /**\n * Getter for #comment\n * @return {string}\n */\n get comment() {\n return this.#comment;\n }\n\n /**\n * Setter for #comment\n * @param {string} comment\n */\n set comment(comment) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(comment, regex.CMILangString4000, true)) {\n this.#comment = comment;\n }\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(location, regex.CMIString250)) {\n this.#location = location;\n }\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(timestamp, regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n }\n\n /**\n * toJSON for cmi.comments_from_learner.n object\n * @return {\n * {\n * comment: string,\n * location: string,\n * timestamp: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comment': this.comment,\n 'location': this.location,\n 'timestamp': this.timestamp,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.objectives.n object\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n #id = '';\n\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n #pattern = '';\n\n /**\n * Constructor for cmi.interactions.n.correct_responses.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check2004ValidFormat(pattern, regex.CMIFeedback)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON cmi.interactions.n.correct_responses.n object\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl object\n */\nexport class ADL extends BaseCMI {\n /**\n * Constructor for adl\n */\n constructor() {\n super();\n\n this.nav = new ADLNav();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.nav?.initialize();\n }\n\n /**\n * toJSON for adl\n * @return {\n * {\n * nav: {\n * request: string\n * }\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'nav': this.nav,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav object\n */\nclass ADLNav extends BaseCMI {\n #request = '_none_';\n\n /**\n * Constructor for adl.nav\n */\n constructor() {\n super();\n\n this.request_valid = new ADLNavRequestValid();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.request_valid?.initialize();\n }\n\n /**\n * Getter for #request\n * @return {string}\n */\n get request() {\n return this.#request;\n }\n\n /**\n * Setter for #request\n * @param {string} request\n */\n set request(request) {\n if (check2004ValidFormat(request, regex.NAVEvent)) {\n this.#request = request;\n }\n }\n\n /**\n * toJSON for adl.nav\n *\n * @return {\n * {\n * request: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'request': this.request,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav.request_valid object\n */\nclass ADLNavRequestValid extends BaseCMI {\n #continue = 'unknown';\n #previous = 'unknown';\n choice = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n jump = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n\n /**\n * Constructor for adl.nav.request_valid\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #continue\n * @return {string}\n */\n get continue() {\n return this.#continue;\n }\n\n /**\n * Setter for #continue. Just throws an error.\n * @param {*} _\n */\n set continue(_) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #previous\n * @return {string}\n */\n get previous() {\n return this.#previous;\n }\n\n /**\n * Setter for #previous. Just throws an error.\n * @param {*} _\n */\n set previous(_) {\n throwReadOnlyError();\n }\n\n /**\n * toJSON for adl.nav.request_valid\n *\n * @return {\n * {\n * previous: string,\n * continue: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'previous': this.previous,\n 'continue': this.continue,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\n\nexport const global_constants = {\n SCORM_TRUE: 'true',\n SCORM_FALSE: 'false',\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n LOG_LEVEL_DEBUG: 1,\n LOG_LEVEL_INFO: 2,\n LOG_LEVEL_WARNING: 3,\n LOG_LEVEL_ERROR: 4,\n LOG_LEVEL_NONE: 5,\n};\n\nexport const scorm12_constants = {\n // Children lists\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',\n core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',\n score_children: 'raw,min,max',\n comments_children: 'content,location,time',\n objectives_children: 'id,score,status',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio,language,speed,text',\n interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',\n\n error_descriptions: {\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information',\n },\n '201': {\n basicMessage: 'Invalid argument error',\n detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.',\n },\n '202': {\n basicMessage: 'Element cannot have children',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n '203': {\n basicMessage: 'Element not an array - cannot have count',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n '301': {\n basicMessage: 'Not initialized',\n detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.',\n },\n '401': {\n basicMessage: 'Not implemented error',\n detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.',\n },\n '402': {\n basicMessage: 'Invalid set value, element is a keyword',\n detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n '403': {\n basicMessage: 'Element is read only',\n detailMessage: 'LMSSetValue was called with a data model element that can only be read.',\n },\n '404': {\n basicMessage: 'Element is write only',\n detailMessage: 'LMSGetValue was called on a data model element that can only be written to.',\n },\n '405': {\n basicMessage: 'Incorrect Data Type',\n detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n },\n};\n\nexport const aicc_constants = {\n ...scorm12_constants, ...{\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',\n student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',\n tries_children: 'time,status,score',\n },\n};\n\nexport const scorm2004_constants = {\n // Children lists\n cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',\n comments_children: 'comment,timestamp,location',\n score_children: 'max,raw,scaled,min',\n objectives_children: 'progress_measure,completion_status,success_status,description,score,id',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',\n interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',\n\n error_descriptions: {\n '0': {\n basicMessage: 'No Error',\n detailMessage: 'No error occurred, the previous API call was successful.',\n },\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.',\n },\n '102': {\n basicMessage: 'General Initialization Failure',\n detailMessage: 'Call to Initialize failed for an unknown reason.',\n },\n '103': {\n basicMessage: 'Already Initialized',\n detailMessage: 'Call to Initialize failed because Initialize was already called.',\n },\n '104': {\n basicMessage: 'Content Instance Terminated',\n detailMessage: 'Call to Initialize failed because Terminate was already called.',\n },\n '111': {\n basicMessage: 'General Termination Failure',\n detailMessage: 'Call to Terminate failed for an unknown reason.',\n },\n '112': {\n basicMessage: 'Termination Before Initialization',\n detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.',\n },\n '113': {\n basicMessage: 'Termination After Termination',\n detailMessage: 'Call to Terminate failed because Terminate was already called.',\n },\n '122': {\n basicMessage: 'Retrieve Data Before Initialization',\n detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.',\n },\n '123': {\n basicMessage: 'Retrieve Data After Termination',\n detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.',\n },\n '132': {\n basicMessage: 'Store Data Before Initialization',\n detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.',\n },\n '133': {\n basicMessage: 'Store Data After Termination',\n detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.',\n },\n '142': {\n basicMessage: 'Commit Before Initialization',\n detailMessage: 'Call to Commit failed because it was made before the call to Initialize.',\n },\n '143': {\n basicMessage: 'Commit After Termination',\n detailMessage: 'Call to Commit failed because it was made after the call to Terminate.',\n },\n '201': {\n basicMessage: 'General Argument Error',\n detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.',\n },\n '301': {\n basicMessage: 'General Get Failure',\n detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '351': {\n basicMessage: 'General Set Failure',\n detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '391': {\n basicMessage: 'General Commit Failure',\n detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '401': {\n basicMessage: 'Undefined Data Model Element',\n detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.',\n },\n '402': {\n basicMessage: 'Unimplemented Data Model Element',\n detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.',\n },\n '403': {\n basicMessage: 'Data Model Element Value Not Initialized',\n detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.',\n },\n '404': {\n basicMessage: 'Data Model Element Is Read Only',\n detailMessage: 'SetValue was called with a data model element that can only be read.',\n },\n '405': {\n basicMessage: 'Data Model Element Is Write Only',\n detailMessage: 'GetValue was called on a data model element that can only be written to.',\n },\n '406': {\n basicMessage: 'Data Model Element Type Mismatch',\n detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Data Model Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n","// @flow\nexport const error_codes = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nexport const scorm12_error_codes = {\n ...error_codes, ...{\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nexport const scorm2004_error_codes = {\n ...error_codes, ...{\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n","const common_values = {\n validResult: [\n 'correct',\n 'wrong',\n 'unanticipated',\n 'neutral',\n ],\n invalidResult: [\n '-10000',\n '10000',\n 'invalid',\n ],\n\n valid0To1Range: [\n '0.0',\n '0.25',\n '0.5',\n '1.0',\n ],\n invalid0To1Range: [\n '-1',\n '-0.1',\n '1.1',\n '.25',\n ],\n\n valid0To100Range: [\n '1',\n '50',\n '100',\n ],\n invalid0To100Range: [\n 'invalid',\n 'a100',\n '-1',\n ],\n\n validScaledRange: [\n '1',\n '0.5',\n '0',\n '-0.5',\n '-1',\n ],\n invalidScaledRange: [\n '-101',\n '25.1',\n '50.5',\n '75',\n '100',\n ],\n\n validIntegerScaledRange: [\n '1',\n '0',\n '-1',\n ],\n invalidIntegerScaledRange: [\n '-101',\n '-0.5',\n '0.5',\n '25.1',\n '50.5',\n '75',\n '100',\n ],\n};\n\nexport const scorm12_values = {\n ...common_values, ...{\n validLessonStatus: [\n 'passed',\n 'completed',\n 'failed',\n 'incomplete',\n 'browsed',\n ],\n invalidLessonStatus: [\n 'Passed',\n 'P',\n 'F',\n 'p',\n 'true',\n 'false',\n 'complete',\n ],\n\n validExit: [\n 'time-out',\n 'suspend',\n 'logout',\n ],\n invalidExit: [\n 'close',\n 'exit',\n 'crash',\n ],\n\n validType: [\n 'true-false',\n 'choice',\n 'fill-in',\n 'matching',\n 'performance',\n 'sequencing',\n 'likert',\n 'numeric',\n ],\n invalidType: [\n 'correct',\n 'wrong',\n 'logout',\n ],\n\n validSpeedRange: [\n '1',\n '50',\n '100',\n '-1',\n '-50',\n '-100',\n ],\n invalidSpeedRange: [\n 'invalid',\n 'a100',\n '-101',\n '101',\n '-100000',\n '100000',\n ],\n\n validScoreRange: [\n '1',\n '50.25',\n '100',\n ],\n invalidScoreRange: [\n 'invalid',\n 'a100',\n '-1',\n '101',\n '-100000',\n '100000',\n ],\n invalid0To100Range: [\n 'invalid',\n 'a100',\n '-2',\n ],\n\n validTime: [\n '10:06:57',\n '23:59:59',\n '00:00:00',\n ],\n invalidTime: [\n '47:59:59',\n '00:00:01.56',\n '06:5:13',\n '23:59:59.123',\n 'P1DT23H59M59S',\n ],\n\n validTimespan: [\n '10:06:57',\n '00:00:01.56',\n '23:59:59',\n '47:59:59',\n ],\n invalidTimespan: [\n '06:5:13',\n '23:59:59.123',\n 'P1DT23H59M59S',\n ],\n },\n};\n\nexport const scorm2004_values = {\n ...common_values, ...{\n // valid field values\n validTimestamps: [\n '2019-06-25',\n '2019-06-25T23:59',\n '2019-06-25T23:59:59.99',\n '1970-01-01',\n ],\n invalidTimestamps: [\n '2019-06-25T',\n '2019-06-25T23:59:59.999',\n '2019-06-25T25:59:59.99',\n '2019-13-31',\n '1969-12-31',\n '-00:00:30',\n '0:50:30',\n '23:00:30.',\n ],\n\n validCStatus: [\n 'completed',\n 'incomplete',\n 'not attempted',\n 'unknown',\n ],\n invalidCStatus: [\n 'complete',\n 'passed',\n 'failed',\n ],\n\n validSStatus: [\n 'passed',\n 'failed',\n 'unknown',\n ],\n invalidSStatus: [\n 'complete',\n 'incomplete',\n 'P',\n 'f',\n ],\n\n validExit: [\n 'time-out',\n 'suspend',\n 'logout',\n 'normal',\n ],\n invalidExit: [\n 'close',\n 'exit',\n 'crash',\n ],\n\n validType: [\n 'true-false',\n 'choice',\n 'fill-in',\n 'long-fill-in',\n 'matching',\n 'performance',\n 'sequencing',\n 'likert',\n 'numeric',\n 'other',\n ],\n invalidType: [\n 'correct',\n 'wrong',\n 'logout',\n ],\n\n validScoreRange: [\n '1',\n '50',\n '100',\n '-10000',\n '-1',\n '10000',\n ],\n invalidScoreRange: [\n 'invalid',\n 'a100',\n '-100000',\n '100000',\n ],\n\n validISO8601Durations: [\n 'P1Y34DT23H45M15S',\n 'PT1M45S',\n 'P0S',\n 'PT75M',\n ],\n invalidISO8601Durations: [\n '00:08:45',\n '-P1H',\n '1y45D',\n '0',\n ],\n\n validComment: [\n '{lang=en-98} learner comment',\n '{lang=eng-98-9} learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(4000),\n 'learner comment',\n 'learner comment}',\n '{lang=i-xx}',\n '{lang=i}',\n '',\n ],\n invalidComment: [\n '{lang=i-}',\n '{lang=i-x}',\n '{lang=eng-98-9fhgj}{ learner comment',\n '{learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(4001),\n '{lang=eng-98-9fhgj}{' + 'x'.repeat(3999),\n ],\n\n validDescription: [\n '{lang=en-98} learner comment',\n '{lang=eng-98-9} learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(250),\n 'learner comment',\n 'learner comment}',\n '{lang=i-xx}',\n '{lang=i}',\n '',\n ],\n invalidDescription: [\n '{lang=i-}',\n '{lang=i-x}',\n '{lang=eng-98-9fhgj}{ learner comment',\n '{learner comment',\n '{lang=eng-98-9fhgj}' + 'x'.repeat(251),\n '{lang=eng-98-9fhgj}{' + 'x'.repeat(249),\n ],\n\n validNavRequest: [\n 'previous',\n 'continue',\n 'exit',\n 'exitAll',\n 'abandon',\n 'abandonAll',\n 'suspendAll',\n ],\n invalidNavRequest: [\n 'close',\n 'quit',\n 'next',\n 'before',\n ],\n },\n};\n","export const valid_languages = {\n 'aa': 'aa', 'ab': 'ab', 'ae': 'ae', 'af': 'af', 'ak': 'ak', 'am': 'am',\n 'an': 'an', 'ar': 'ar', 'as': 'as', 'av': 'av', 'ay': 'ay', 'az': 'az',\n 'ba': 'ba', 'be': 'be', 'bg': 'bg', 'bh': 'bh', 'bi': 'bi', 'bm': 'bm',\n 'bn': 'bn', 'bo': 'bo', 'br': 'br', 'bs': 'bs', 'ca': 'ca', 'ce': 'ce',\n 'ch': 'ch', 'co': 'co', 'cr': 'cr', 'cs': 'cs', 'cu': 'cu', 'cv': 'cv',\n 'cy': 'cy', 'da': 'da', 'de': 'de', 'dv': 'dv', 'dz': 'dz', 'ee': 'ee',\n 'el': 'el', 'en': 'en', 'eo': 'eo', 'es': 'es', 'et': 'et', 'eu': 'eu',\n 'fa': 'fa', 'ff': 'ff', 'fi': 'fi', 'fj': 'fj', 'fo': 'fo', 'fr': 'fr',\n 'fy': 'fy', 'ga': 'ga', 'gd': 'gd', 'gl': 'gl', 'gn': 'gn', 'gu': 'gu',\n 'gv': 'gv', 'ha': 'ha', 'he': 'he', 'hi': 'hi', 'ho': 'ho', 'hr': 'hr',\n 'ht': 'ht', 'hu': 'hu', 'hy': 'hy', 'hz': 'hz', 'ia': 'ia', 'id': 'id',\n 'ie': 'ie', 'ig': 'ig', 'ii': 'ii', 'ik': 'ik', 'io': 'io', 'is': 'is',\n 'it': 'it', 'iu': 'iu', 'ja': 'ja', 'jv': 'jv', 'ka': 'ka', 'kg': 'kg',\n 'ki': 'ki', 'kj': 'kj', 'kk': 'kk', 'kl': 'kl', 'km': 'km', 'kn': 'kn',\n 'ko': 'ko', 'kr': 'kr', 'ks': 'ks', 'ku': 'ku', 'kv': 'kv', 'kw': 'kw',\n 'ky': 'ky', 'la': 'la', 'lb': 'lb', 'lg': 'lg', 'li': 'li', 'ln': 'ln',\n 'lo': 'lo', 'lt': 'lt', 'lu': 'lu', 'lv': 'lv', 'mg': 'mg', 'mh': 'mh',\n 'mi': 'mi', 'mk': 'mk', 'ml': 'ml', 'mn': 'mn', 'mo': 'mo', 'mr': 'mr',\n 'ms': 'ms', 'mt': 'mt', 'my': 'my', 'na': 'na', 'nb': 'nb', 'nd': 'nd',\n 'ne': 'ne', 'ng': 'ng', 'nl': 'nl', 'nn': 'nn', 'no': 'no', 'nr': 'nr',\n 'nv': 'nv', 'ny': 'ny', 'oc': 'oc', 'oj': 'oj', 'om': 'om', 'or': 'or',\n 'os': 'os', 'pa': 'pa', 'pi': 'pi', 'pl': 'pl', 'ps': 'ps', 'pt': 'pt',\n 'qu': 'qu', 'rm': 'rm', 'rn': 'rn', 'ro': 'ro', 'ru': 'ru', 'rw': 'rw',\n 'sa': 'sa', 'sc': 'sc', 'sd': 'sd', 'se': 'se', 'sg': 'sg', 'sh': 'sh',\n 'si': 'si', 'sk': 'sk', 'sl': 'sl', 'sm': 'sm', 'sn': 'sn', 'so': 'so',\n 'sq': 'sq', 'sr': 'sr', 'ss': 'ss', 'st': 'st', 'su': 'su', 'sv': 'sv',\n 'sw': 'sw', 'ta': 'ta', 'te': 'te', 'tg': 'tg', 'th': 'th', 'ti': 'ti',\n 'tk': 'tk', 'tl': 'tl', 'tn': 'tn', 'to': 'to', 'tr': 'tr', 'ts': 'ts',\n 'tt': 'tt', 'tw': 'tw', 'ty': 'ty', 'ug': 'ug', 'uk': 'uk', 'ur': 'ur',\n 'uz': 'uz', 've': 've', 'vi': 'vi', 'vo': 'vo', 'wa': 'wa', 'wo': 'wo',\n 'xh': 'xh', 'yi': 'yi', 'yo': 'yo', 'za': 'za', 'zh': 'zh', 'zu': 'zu',\n 'aar': 'aar', 'abk': 'abk', 'ave': 'ave', 'afr': 'afr', 'aka': 'aka',\n 'amh': 'amh', 'arg': 'arg', 'ara': 'ara', 'asm': 'asm', 'ava': 'ava',\n 'aym': 'aym', 'aze': 'aze', 'bak': 'bak', 'bel': 'bel', 'bul': 'bul',\n 'bih': 'bih', 'bis': 'bis', 'bam': 'bam', 'ben': 'ben', 'tib': 'tib',\n 'bod': 'bod', 'bre': 'bre', 'bos': 'bos', 'cat': 'cat', 'che': 'che',\n 'cha': 'cha', 'cos': 'cos', 'cre': 'cre', 'cze': 'cze', 'ces': 'ces',\n 'chu': 'chu', 'chv': 'chv', 'wel': 'wel', 'cym': 'cym', 'dan': 'dan',\n 'ger': 'ger', 'deu': 'deu', 'div': 'div', 'dzo': 'dzo', 'ewe': 'ewe',\n 'gre': 'gre', 'ell': 'ell', 'eng': 'eng', 'epo': 'epo', 'spa': 'spa',\n 'est': 'est', 'baq': 'baq', 'eus': 'eus', 'per': 'per', 'fas': 'fas',\n 'ful': 'ful', 'fin': 'fin', 'fij': 'fij', 'fao': 'fao', 'fre': 'fre',\n 'fra': 'fra', 'fry': 'fry', 'gle': 'gle', 'gla': 'gla', 'glg': 'glg',\n 'grn': 'grn', 'guj': 'guj', 'glv': 'glv', 'hau': 'hau', 'heb': 'heb',\n 'hin': 'hin', 'hmo': 'hmo', 'hrv': 'hrv', 'hat': 'hat', 'hun': 'hun',\n 'arm': 'arm', 'hye': 'hye', 'her': 'her', 'ina': 'ina', 'ind': 'ind',\n 'ile': 'ile', 'ibo': 'ibo', 'iii': 'iii', 'ipk': 'ipk', 'ido': 'ido',\n 'ice': 'ice', 'isl': 'isl', 'ita': 'ita', 'iku': 'iku', 'jpn': 'jpn',\n 'jav': 'jav', 'geo': 'geo', 'kat': 'kat', 'kon': 'kon', 'kik': 'kik',\n 'kua': 'kua', 'kaz': 'kaz', 'kal': 'kal', 'khm': 'khm', 'kan': 'kan',\n 'kor': 'kor', 'kau': 'kau', 'kas': 'kas', 'kur': 'kur', 'kom': 'kom',\n 'cor': 'cor', 'kir': 'kir', 'lat': 'lat', 'ltz': 'ltz', 'lug': 'lug',\n 'lim': 'lim', 'lin': 'lin', 'lao': 'lao', 'lit': 'lit', 'lub': 'lub',\n 'lav': 'lav', 'mlg': 'mlg', 'mah': 'mah', 'mao': 'mao', 'mri': 'mri',\n 'mac': 'mac', 'mkd': 'mkd', 'mal': 'mal', 'mon': 'mon', 'mol': 'mol',\n 'mar': 'mar', 'may': 'may', 'msa': 'msa', 'mlt': 'mlt', 'bur': 'bur',\n 'mya': 'mya', 'nau': 'nau', 'nob': 'nob', 'nde': 'nde', 'nep': 'nep',\n 'ndo': 'ndo', 'dut': 'dut', 'nld': 'nld', 'nno': 'nno', 'nor': 'nor',\n 'nbl': 'nbl', 'nav': 'nav', 'nya': 'nya', 'oci': 'oci', 'oji': 'oji',\n 'orm': 'orm', 'ori': 'ori', 'oss': 'oss', 'pan': 'pan', 'pli': 'pli',\n 'pol': 'pol', 'pus': 'pus', 'por': 'por', 'que': 'que', 'roh': 'roh',\n 'run': 'run', 'rum': 'rum', 'ron': 'ron', 'rus': 'rus', 'kin': 'kin',\n 'san': 'san', 'srd': 'srd', 'snd': 'snd', 'sme': 'sme', 'sag': 'sag',\n 'slo': 'slo', 'sin': 'sin', 'slk': 'slk', 'slv': 'slv', 'smo': 'smo',\n 'sna': 'sna', 'som': 'som', 'alb': 'alb', 'sqi': 'sqi', 'srp': 'srp',\n 'ssw': 'ssw', 'sot': 'sot', 'sun': 'sun', 'swe': 'swe', 'swa': 'swa',\n 'tam': 'tam', 'tel': 'tel', 'tgk': 'tgk', 'tha': 'tha', 'tir': 'tir',\n 'tuk': 'tuk', 'tgl': 'tgl', 'tsn': 'tsn', 'ton': 'ton', 'tur': 'tur',\n 'tso': 'tso', 'tat': 'tat', 'twi': 'twi', 'tah': 'tah', 'uig': 'uig',\n 'ukr': 'ukr', 'urd': 'urd', 'uzb': 'uzb', 'ven': 'ven', 'vie': 'vie',\n 'vol': 'vol', 'wln': 'wln', 'wol': 'wol', 'xho': 'xho', 'yid': 'yid',\n 'yor': 'yor', 'zha': 'zha', 'chi': 'chi', 'zho': 'zho', 'zul': 'zul',\n};\n","// @flow\n\nimport {scorm12_values, scorm2004_values} from './field_values';\n\nexport const scorm12_regex = {\n CMIString256: '^.{0,255}$',\n CMIString4096: '^.{0,4096}$',\n CMITime: '^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$', // eslint-disable-line\n CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\\.[0-9]{1,2})?$', // eslint-disable-line\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{0,3})(\\.[0-9]*)?$', // eslint-disable-line\n CMIIdentifier: '^[\\\\u0021-\\\\u007E]{0,255}$',\n CMIFeedback: '^.{0,255}$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMIStatus: '^(' + scorm12_values.validLessonStatus.join('|') + ')$',\n CMIStatus2: '^(' + scorm12_values.validLessonStatus.join('|') + '|not attempted)$',\n CMIExit: '^(' + scorm12_values.validExit.join('|') + '|)$',\n CMIType: '^(' + scorm12_values.validType.join('|') + ')$',\n CMIResult: '^(' + scorm12_values.validResult.join('|') + '|([0-9]{0,3})?(\\\\.[0-9]*)?)$', // eslint-disable-line\n NAVEvent: '^(previous|continue)$',\n\n // Data ranges\n score_range: '0#100',\n audio_range: '-1#100',\n speed_range: '-100#100',\n weighting_range: '-100#100',\n text_range: '-1#1',\n};\n\nexport const aicc_regex = {\n ...scorm12_regex, ...{\n CMIIdentifier: '^\\\\w{1,255}$',\n },\n};\n\nexport const scorm2004_regex = {\n CMIString200: '^[\\\\u0000-\\\\uFFFF]{0,200}$',\n CMIString250: '^[\\\\u0000-\\\\uFFFF]{0,250}$',\n CMIString1000: '^[\\\\u0000-\\\\uFFFF]{0,1000}$',\n CMIString4000: '^[\\\\u0000-\\\\uFFFF]{0,4000}$',\n CMIString64000: '^[\\\\u0000-\\\\uFFFF]{0,64000}$',\n CMILang: '^([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?$|^$', // eslint-disable-line\n CMILangString250: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,250}$)?$', // eslint-disable-line\n CMILangcr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\}))(.*?)$', // eslint-disable-line\n CMILangString250cr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\})?(.{0,250})?)?$', // eslint-disable-line\n CMILangString4000: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,4000}$)?$', // eslint-disable-line\n CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',\n CMITimespan: '^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$',\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$',\n CMIIdentifier: '^\\\\S{1,250}[a-zA-Z0-9]$',\n CMIShortIdentifier: '^[\\\\w\\.]{1,250}$', // eslint-disable-line\n CMILongIdentifier: '^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000})$',\n CMIFeedback: '^.*$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n CMIIndexStore: '.N(\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMICStatus: '^(' + scorm2004_values.validCStatus.join('|') + ')$',\n CMISStatus: '^(' + scorm2004_values.validSStatus.join('|') + ')$',\n CMIExit: '^(' + scorm2004_values.validExit.join('|') + ')$',\n CMIType: '^(' + scorm2004_values.validType.join('|') + ')$',\n CMIResult: '^(' + scorm2004_values.validResult.join('|') + '|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$',\n NAVEvent: '^(' + scorm2004_values.validNavRequest.join('|') + '|\\{target=\\\\S{0,200}[a-zA-Z0-9]\\}choice|jump)$', // eslint-disable-line\n NAVBoolean: '^(unknown|true|false$)',\n NAVTarget: '^(previous|continue|choice.{target=\\\\S{0,200}[a-zA-Z0-9]})$',\n\n // Data ranges\n scaled_range: '-1#1',\n audio_range: '0#*',\n speed_range: '0#*',\n text_range: '-1#1',\n progress_range: '0#1',\n};\n","// @flow\nimport {scorm2004_regex} from './regex';\n\nexport const learner_responses = {\n 'true-false': {\n format: '^true$|^false$',\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'choice': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: true,\n },\n 'fill-in': {\n format: scorm2004_regex.CMILangString250,\n max: 10,\n delimiter: '[,]',\n unique: false,\n },\n 'long-fill-in': {\n format: scorm2004_regex.CMILangString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'matching': {\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'performance': {\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'sequencing': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: false,\n },\n 'likert': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'numeric': {\n format: scorm2004_regex.CMIDecimal,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'other': {\n format: scorm2004_regex.CMIString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n};\n\nexport const correct_responses = {\n 'true-false': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: '^true$|^false$',\n limit: 1,\n },\n 'choice': {\n max: 36,\n delimiter: '[,]',\n unique: true,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'fill-in': {\n max: 10,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMILangString250cr,\n },\n 'long-fill-in': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: true,\n format: scorm2004_regex.CMILangString4000,\n },\n 'matching': {\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n },\n 'performance': {\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n },\n 'sequencing': {\n max: 36,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'likert': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n limit: 1,\n },\n 'numeric': {\n max: 2,\n delimiter: '[:]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIDecimal,\n limit: 1,\n },\n 'other': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIString4000,\n limit: 1,\n },\n};\n","// @flow\n\n/**\n * Data Validation Exception\n */\nexport class ValidationError extends Error {\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n super(errorCode);\n this.#errorCode = errorCode;\n }\n\n #errorCode;\n\n /**\n * Getter for #errorCode\n * @return {number}\n */\n get errorCode() {\n return this.#errorCode;\n }\n\n /**\n * Trying to override the default Error message\n * @return {string}\n */\n get message() {\n return this.#errorCode + '';\n }\n}\n","import Scorm2004API from './Scorm2004API';\nimport Scorm12API from './Scorm12API';\nimport AICC from './AICC';\n\nwindow.Scorm12API = Scorm12API;\nwindow.Scorm2004API = Scorm2004API;\nwindow.AICC = AICC;\n","// @flow\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\nconst designations = [\n ['D', SECONDS_PER_DAY],\n ['H', SECONDS_PER_HOUR],\n ['M', SECONDS_PER_MINUTE],\n ['S', SECONDS_PER_SECOND],\n];\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {Number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return '00:00:00';\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds() + (totalSeconds % 1.0);\n\n return hours.toString().padStart(2, '0') + ':' +\n minutes.toString().padStart(2, '0') + ':' +\n seconds.toString().padStart(2, '0');\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {Number} seconds\n * @return {String}\n */\nexport function getSecondsAsISODuration(seconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return 'PT0S';\n }\n\n let duration = 'P';\n let remainder = seconds;\n\n designations.forEach(([sign, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n\n remainder = remainder % current_seconds;\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (sign === 'S' && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if ((duration.indexOf('D') > 0 ||\n sign === 'H' || sign === 'M' || sign === 'S') &&\n duration.indexOf('T') === -1) {\n duration += 'T';\n }\n duration += `${value}${sign}`;\n }\n });\n\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {\n if (!timeString || typeof timeString !== 'string' ||\n !timeString.match(timeRegex)) {\n return 0;\n }\n const parts = timeString.split(':');\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return (hours * 3600) + (minutes * 60) + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(duration: String, durationRegex: RegExp) {\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, months, , days, hours, minutes, seconds] = new RegExp(\n durationRegex).exec(duration) || [];\n\n const now = new Date();\n const anchor = new Date(now);\n anchor.setFullYear(anchor.getFullYear() + Number(years || 0));\n anchor.setMonth(anchor.getMonth() + Number(months || 0));\n anchor.setDate(anchor.getDate() + Number(days || 0));\n anchor.setHours(anchor.getHours() + Number(hours || 0));\n anchor.setMinutes(anchor.getMinutes() + Number(minutes || 0));\n anchor.setSeconds(anchor.getSeconds() + Number(seconds || 0));\n if (seconds && String(seconds).indexOf('.') > 0) {\n const milliseconds = Number(Number(seconds) % 1).toFixed(6) * 1000.0;\n anchor.setMilliseconds(anchor.getMilliseconds() + milliseconds);\n }\n\n return ((anchor * 1.0) - now) / 1000.0;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: String,\n second: String,\n durationRegex: RegExp) {\n const firstSeconds = getDurationAsSeconds(first, durationRegex);\n const secondSeconds = getDurationAsSeconds(second, durationRegex);\n\n return getSecondsAsISODuration(firstSeconds + secondSeconds);\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: String,\n second: String,\n timeRegex: RegExp) {\n const firstSeconds = getTimeAsSeconds(first, timeRegex);\n const secondSeconds = getTimeAsSeconds(second, timeRegex);\n return getSecondsAsHHMMSS(firstSeconds + secondSeconds);\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data) {\n const result = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur, prop) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + '[' + i + ']');\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + '.' + p : p);\n }\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, '');\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data) {\n 'use strict';\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result = {};\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = '';\n let m = regex.exec(p);\n while (m) {\n cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n cur[prop] = data[p];\n }\n }\n return result[''] || result;\n}\n"]} \ No newline at end of file diff --git a/dist/scorm-again.min.js b/dist/scorm-again.min.js index 24c07b0..854d6fa 100644 --- a/dist/scorm-again.min.js +++ b/dist/scorm-again.min.js @@ -1,7 +1,7 @@ (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i0&&this.throwSCORMError(s.errorCode),r=s.result?s.result:_api_constants.global_constants.SCORM_FALSE,e&&(this.lastErrorCode=0),this.currentState=_api_constants.global_constants.STATE_TERMINATED,r=_api_constants.global_constants.SCORM_TRUE,this.processListeners(t)}return this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(r),r}},{key:"getValue",value:function(t,e,r){var s;return this.checkState(e,_classPrivateFieldGet(this,_error_codes).RETRIEVE_BEFORE_INIT,_classPrivateFieldGet(this,_error_codes).RETRIEVE_AFTER_TERM)&&(e&&(this.lastErrorCode=0),s=this.getCMIValue(r),this.processListeners(t,r)),this.apiLog(t,r,": returned: "+s,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(s),s}},{key:"setValue",value:function(t,e,r,s){var o=_api_constants.global_constants.SCORM_FALSE;if(this.checkState(e,_classPrivateFieldGet(this,_error_codes).STORE_BEFORE_INIT,_classPrivateFieldGet(this,_error_codes).STORE_AFTER_TERM)){e&&(this.lastErrorCode=0);try{o=this.setCMIValue(r,s)}catch(t){t instanceof _exceptions.ValidationError?(this.lastErrorCode=t.errorCode,o=_api_constants.global_constants.SCORM_FALSE):this.throwSCORMError(_classPrivateFieldGet(this,_error_codes).GENERAL)}this.processListeners(t,r,s)}return void 0===o&&(o=_api_constants.global_constants.SCORM_FALSE),"0"===String(this.lastErrorCode)&&this.settings.autocommit&&this.scheduleCommit(1e3*this.settings.autocommitSeconds),this.apiLog(t,r,": "+s+": result: "+o,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(o),o}},{key:"commit",value:function(t,e){this.clearScheduledCommit();var r=_api_constants.global_constants.SCORM_FALSE;if(this.checkState(e,_classPrivateFieldGet(this,_error_codes).COMMIT_BEFORE_INIT,_classPrivateFieldGet(this,_error_codes).COMMIT_AFTER_TERM)){var s=this.storeData(!1);s.errorCode&&s.errorCode>0&&this.throwSCORMError(s.errorCode),r=s.result?s.result:_api_constants.global_constants.SCORM_FALSE,this.apiLog(t,"HttpRequest"," Result: "+r,_api_constants.global_constants.LOG_LEVEL_DEBUG),e&&(this.lastErrorCode=0),this.processListeners(t)}return this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(r),r}},{key:"getLastError",value:function(t){var e=String(this.lastErrorCode);return this.processListeners(t),this.apiLog(t,null,"returned: "+e,_api_constants.global_constants.LOG_LEVEL_INFO),e}},{key:"getErrorString",value:function(t,e){var r="";return null!==e&&""!==e&&(r=this.getLmsErrorMessageDetails(e),this.processListeners(t)),this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),r}},{key:"getDiagnostic",value:function(t,e){var r="";return null!==e&&""!==e&&(r=this.getLmsErrorMessageDetails(e,!0),this.processListeners(t)),this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),r}},{key:"checkState",value:function(t,e,r){return this.isNotInitialized()?(this.throwSCORMError(e),!1):!t||!this.isTerminated()||(this.throwSCORMError(r),!1)}},{key:"apiLog",value:function(t,e,r,s){if(r=this.formatMessage(t,e,r),s>=this.apiLogLevel)switch(s){case _api_constants.global_constants.LOG_LEVEL_ERROR:console.error(r);break;case _api_constants.global_constants.LOG_LEVEL_WARNING:console.warn(r);break;case _api_constants.global_constants.LOG_LEVEL_INFO:console.info(r);break;case _api_constants.global_constants.LOG_LEVEL_DEBUG:console.debug?console.debug(r):console.log(r)}}},{key:"formatMessage",value:function(t,e,r){var s="";s+=t;for(var o=20-s.length,a=0;a1&&(i=t.replace(a+".","")),this.listenerArray.push({functionName:a,CMIElement:i,callback:e})}}},{key:"processListeners",value:function(t,e,r){for(var s=0;s0&&this.throwSCORMError(s.errorCode),r=s.result?s.result:_api_constants.global_constants.SCORM_FALSE,e&&(this.lastErrorCode=0),this.currentState=_api_constants.global_constants.STATE_TERMINATED,r=_api_constants.global_constants.SCORM_TRUE,this.processListeners(t)}return this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(r),r}},{key:"getValue",value:function(t,e,r){var s;return this.checkState(e,_classPrivateFieldGet(this,_error_codes).RETRIEVE_BEFORE_INIT,_classPrivateFieldGet(this,_error_codes).RETRIEVE_AFTER_TERM)&&(e&&(this.lastErrorCode=0),s=this.getCMIValue(r),this.processListeners(t,r)),this.apiLog(t,r,": returned: "+s,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(s),s}},{key:"setValue",value:function(t,e,r,s){var o=_api_constants.global_constants.SCORM_FALSE;if(this.checkState(e,_classPrivateFieldGet(this,_error_codes).STORE_BEFORE_INIT,_classPrivateFieldGet(this,_error_codes).STORE_AFTER_TERM)){e&&(this.lastErrorCode=0);try{o=this.setCMIValue(r,s)}catch(t){t instanceof _exceptions.ValidationError?(this.lastErrorCode=t.errorCode,o=_api_constants.global_constants.SCORM_FALSE):this.throwSCORMError(_classPrivateFieldGet(this,_error_codes).GENERAL)}this.processListeners(t,r,s)}return void 0===o&&(o=_api_constants.global_constants.SCORM_FALSE),"0"===String(this.lastErrorCode)&&this.settings.autocommit&&this.scheduleCommit(1e3*this.settings.autocommitSeconds),this.apiLog(t,r,": "+s+": result: "+o,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(o),o}},{key:"commit",value:function(t,e){this.clearScheduledCommit();var r=_api_constants.global_constants.SCORM_FALSE;if(this.checkState(e,_classPrivateFieldGet(this,_error_codes).COMMIT_BEFORE_INIT,_classPrivateFieldGet(this,_error_codes).COMMIT_AFTER_TERM)){var s=this.storeData(!1);s.errorCode&&s.errorCode>0&&this.throwSCORMError(s.errorCode),r=s.result?s.result:_api_constants.global_constants.SCORM_FALSE,this.apiLog(t,"HttpRequest"," Result: "+r,_api_constants.global_constants.LOG_LEVEL_DEBUG),e&&(this.lastErrorCode=0),this.processListeners(t)}return this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),this.clearSCORMError(r),r}},{key:"getLastError",value:function(t){var e=String(this.lastErrorCode);return this.processListeners(t),this.apiLog(t,null,"returned: "+e,_api_constants.global_constants.LOG_LEVEL_INFO),e}},{key:"getErrorString",value:function(t,e){var r="";return null!==e&&""!==e&&(r=this.getLmsErrorMessageDetails(e),this.processListeners(t)),this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),r}},{key:"getDiagnostic",value:function(t,e){var r="";return null!==e&&""!==e&&(r=this.getLmsErrorMessageDetails(e,!0),this.processListeners(t)),this.apiLog(t,null,"returned: "+r,_api_constants.global_constants.LOG_LEVEL_INFO),r}},{key:"checkState",value:function(t,e,r){return this.isNotInitialized()?(this.throwSCORMError(e),!1):!t||!this.isTerminated()||(this.throwSCORMError(r),!1)}},{key:"apiLog",value:function(t,e,r,s){if(r=this.formatMessage(t,e,r),s>=this.apiLogLevel)switch(s){case _api_constants.global_constants.LOG_LEVEL_ERROR:console.error(r);break;case _api_constants.global_constants.LOG_LEVEL_WARNING:console.warn(r);break;case _api_constants.global_constants.LOG_LEVEL_INFO:console.info(r);break;case _api_constants.global_constants.LOG_LEVEL_DEBUG:console.debug?console.debug(r):console.log(r)}}},{key:"formatMessage",value:function(t,e,r){var s="";s+=t;for(var o=20-s.length,a=0;a1&&(i=t.replace(a+".","")),this.listenerArray.push({functionName:a,CMIElement:i,callback:e})}}},{key:"processListeners",value:function(t,e,r){for(var s=0;s=parseFloat(this.cmi.student_data.mastery_score)?this.cmi.core.lesson_status="passed":this.cmi.core.lesson_status="failed");else if("browse"===this.cmi.core.lesson_mode){var r,i,n;""===((null===(r=this.startingData)||void 0===r?void 0:null===(i=r.cmi)||void 0===i?void 0:null===(n=i.core)||void 0===n?void 0:n.lesson_status)||"")&&"not attempted"===t&&(this.cmi.core.lesson_status="browsed")}}var o=this.renderCommitCMI(e);return this.settings.lmsCommitUrl?(this.apiLogLevel===_api_constants.global_constants.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(o)),this.processHttpRequest(this.settings.lmsCommitUrl,o)):(console.log("Commit (terminated: "+(e?"yes":"no")+"): "),console.log(o),_api_constants.global_constants.SCORM_TRUE)}}]),t}(_BaseAPI2.default);exports.default=Scorm12API; },{"./BaseAPI":2,"./cmi/scorm12_cmi":7,"./constants/api_constants":9,"./constants/error_codes":10,"./utilities":17}],4:[function(require,module,exports){ diff --git a/src/BaseAPI.js b/src/BaseAPI.js index 487f951..1b89b76 100644 --- a/src/BaseAPI.js +++ b/src/BaseAPI.js @@ -907,7 +907,7 @@ export default class BaseAPI { */ scheduleCommit(when: number) { this.clearScheduledCommit(); - this.#timeout = setTimeout(this.scheduledCallback, when); + this.#timeout = setTimeout(this.scheduledCallback.bind(this), when); this.apiLog('scheduleCommit', '', 'scheduled', global_constants.LOG_LEVEL_DEBUG); }