parse-server 9.3.0-alpha.8 → 9.3.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33,7 +33,7 @@ class FilesAdapter {
33
33
  /** Responsible for storing the file in order to be retrieved later by its filename
34
34
  *
35
35
  * @param {string} filename - the filename to save
36
- * @param {*} data - the buffer of data from the file
36
+ * @param {Buffer|import('stream').Readable} data - the file data as a Buffer, or a Readable stream if the adapter supports streaming (see supportsStreaming)
37
37
  * @param {string} contentType - the supposed contentType
38
38
  * @discussion the contentType can be undefined if the controller was not able to determine it
39
39
  * @param {object} options - (Optional) options to be passed to file adapter (S3 File Adapter Only)
@@ -45,6 +45,16 @@ class FilesAdapter {
45
45
  */
46
46
  createFile(filename, data, contentType, options) {}
47
47
 
48
+ /** Whether this adapter supports receiving Readable streams in createFile().
49
+ * If false (default), streams are buffered to a Buffer before being passed.
50
+ * Override and return true to receive Readable streams directly.
51
+ *
52
+ * @return {boolean}
53
+ */
54
+ get supportsStreaming() {
55
+ return false;
56
+ }
57
+
48
58
  /** Responsible for deleting the specified file
49
59
  *
50
60
  * @param {string} filename - the filename to delete
@@ -116,4 +126,4 @@ function validateFilename(filename) {
116
126
  return null;
117
127
  }
118
128
  var _default = exports.default = FilesAdapter;
119
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiRmlsZXNBZGFwdGVyIiwiY3JlYXRlRmlsZSIsImZpbGVuYW1lIiwiZGF0YSIsImNvbnRlbnRUeXBlIiwib3B0aW9ucyIsImRlbGV0ZUZpbGUiLCJnZXRGaWxlRGF0YSIsImdldEZpbGVMb2NhdGlvbiIsImNvbmZpZyIsImV4cG9ydHMiLCJ2YWxpZGF0ZUZpbGVuYW1lIiwibGVuZ3RoIiwiUGFyc2UiLCJFcnJvciIsIklOVkFMSURfRklMRV9OQU1FIiwicmVneCIsIm1hdGNoIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvRmlsZXMvRmlsZXNBZGFwdGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHVudXNlZC1pbXBvcnRzL25vLXVudXNlZC12YXJzICovXG4vLyBGaWxlcyBBZGFwdGVyXG4vL1xuLy8gQWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGZpbGUgc3RvcmFnZSBtZWNoYW5pc20uXG4vL1xuLy8gQWRhcHRlciBjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOlxuLy8gKiBjcmVhdGVGaWxlKGZpbGVuYW1lLCBkYXRhLCBjb250ZW50VHlwZSlcbi8vICogZGVsZXRlRmlsZShmaWxlbmFtZSlcbi8vICogZ2V0RmlsZURhdGEoZmlsZW5hbWUpXG4vLyAqIGdldEZpbGVMb2NhdGlvbihjb25maWcsIGZpbGVuYW1lKVxuLy8gQWRhcHRlciBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6XG4vLyAqIHZhbGlkYXRlRmlsZW5hbWUoZmlsZW5hbWUpXG4vLyAqIGhhbmRsZUZpbGVTdHJlYW0oZmlsZW5hbWUsIHJlcSwgcmVzLCBjb250ZW50VHlwZSlcbi8vXG4vLyBEZWZhdWx0IGlzIEdyaWRGU0J1Y2tldEFkYXB0ZXIsIHdoaWNoIHJlcXVpcmVzIG1vbmdvXG4vLyBhbmQgZm9yIHRoZSBBUEkgc2VydmVyIHRvIGJlIHVzaW5nIHRoZSBEYXRhYmFzZUNvbnRyb2xsZXIgd2l0aCBNb25nb1xuLy8gZGF0YWJhc2UgYWRhcHRlci5cblxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tICcuLi8uLi9Db25maWcnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOkFkYXB0ZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlc0FkYXB0ZXIge1xuICAvKiogUmVzcG9uc2libGUgZm9yIHN0b3JpbmcgdGhlIGZpbGUgaW4gb3JkZXIgdG8gYmUgcmV0cmlldmVkIGxhdGVyIGJ5IGl0cyBmaWxlbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSB0aGUgZmlsZW5hbWUgdG8gc2F2ZVxuICAgKiBAcGFyYW0geyp9IGRhdGEgLSB0aGUgYnVmZmVyIG9mIGRhdGEgZnJvbSB0aGUgZmlsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFR5cGUgLSB0aGUgc3VwcG9zZWQgY29udGVudFR5cGVcbiAgICogQGRpc2N1c3Npb24gdGhlIGNvbnRlbnRUeXBlIGNhbiBiZSB1bmRlZmluZWQgaWYgdGhlIGNvbnRyb2xsZXIgd2FzIG5vdCBhYmxlIHRvIGRldGVybWluZSBpdFxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIChPcHRpb25hbCkgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gZmlsZSBhZGFwdGVyIChTMyBGaWxlIEFkYXB0ZXIgT25seSlcbiAgICogLSB0YWdzOiBvYmplY3QgY29udGFpbmluZyBrZXkgdmFsdWUgcGFpcnMgdGhhdCB3aWxsIGJlIHN0b3JlZCB3aXRoIGZpbGVcbiAgICogLSBtZXRhZGF0YTogb2JqZWN0IGNvbnRhaW5pbmcga2V5IHZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSBzb3RyZWQgd2l0aCBmaWxlIChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXItZ3VpZGUvYWRkLW9iamVjdC1tZXRhZGF0YS5odG1sKVxuICAgKiBAZGlzY3Vzc2lvbiBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBmaWxlIGFkYXB0ZXJzLiBDaGVjayB0aGUgeW91ciBhZGFwdGVyJ3MgZG9jdW1lbnRhdGlvbiBmb3IgY29tcGF0aWJpbGl0eVxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCBzaG91bGQgZmFpbCBpZiB0aGUgc3RvcmFnZSBkaWRuJ3Qgc3VjY2VlZFxuICAgKi9cbiAgY3JlYXRlRmlsZShmaWxlbmFtZTogc3RyaW5nLCBkYXRhLCBjb250ZW50VHlwZTogc3RyaW5nLCBvcHRpb25zOiBPYmplY3QpOiBQcm9taXNlIHt9XG5cbiAgLyoqIFJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgc3BlY2lmaWVkIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gdGhlIGZpbGVuYW1lIHRvIGRlbGV0ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCBzaG91bGQgZmFpbCBpZiB0aGUgZGVsZXRpb24gZGlkbid0IHN1Y2NlZWRcbiAgICovXG4gIGRlbGV0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2Uge31cblxuICAvKiogUmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdGhlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBmaWxlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIHRoZSBuYW1lIG9mIGZpbGUgdG8gcmV0cmlldmVcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgc2hvdWxkIHBhc3Mgd2l0aCB0aGUgZmlsZSBkYXRhIG9yIGZhaWwgb24gZXJyb3JcbiAgICovXG4gIGdldEZpbGVEYXRhKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge31cblxuICAvKiogUmV0dXJucyBhbiBhYnNvbHV0ZSBVUkwgd2hlcmUgdGhlIGZpbGUgY2FuIGJlIGFjY2Vzc2VkXG4gICAqXG4gICAqIEBwYXJhbSB7Q29uZmlnfSBjb25maWcgLSBzZXJ2ZXIgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+fSBBYnNvbHV0ZSBVUkxcbiAgICovXG4gIGdldEZpbGVMb2NhdGlvbihjb25maWc6IENvbmZpZywgZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB7fVxuXG4gIC8qKiBWYWxpZGF0ZSBhIGZpbGVuYW1lIGZvciB0aGlzIGFkYXB0ZXIgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAgICpcbiAgICogQHJldHVybnMge251bGx8UGFyc2UuRXJyb3J9IG51bGwgaWYgdGhlcmUgYXJlIG5vIGVycm9yc1xuICAgKi9cbiAgLy8gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZTogc3RyaW5nKTogP1BhcnNlLkVycm9yIHt9XG5cbiAgLyoqIEhhbmRsZXMgQnl0ZS1SYW5nZSBSZXF1ZXN0cyBmb3IgU3RyZWFtaW5nXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBEYXRhIGZvciBieXRlIHJhbmdlXG4gICAqL1xuICAvLyBoYW5kbGVGaWxlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHJlczogYW55LCByZXE6IGFueSwgY29udGVudFR5cGU6IHN0cmluZyk6IFByb21pc2VcblxuICAvKiogUmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgbWV0YWRhdGEgYW5kIHRhZ3NcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gdGhlIGZpbGVuYW1lIHRvIHJldHJpZXZlIG1ldGFkYXRhXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHNob3VsZCBwYXNzIHdpdGggbWV0YWRhdGFcbiAgICovXG4gIC8vIGdldE1ldGFkYXRhKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge31cbn1cblxuLyoqXG4gKiBTaW1wbGUgZmlsZW5hbWUgdmFsaWRhdGlvblxuICpcbiAqIEBwYXJhbSBmaWxlbmFtZVxuICogQHJldHVybnMge251bGx8UGFyc2UuRXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTogP1BhcnNlLkVycm9yIHtcbiAgaWYgKGZpbGVuYW1lLmxlbmd0aCA+IDEyOCkge1xuICAgIHJldHVybiBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9GSUxFX05BTUUsICdGaWxlbmFtZSB0b28gbG9uZy4nKTtcbiAgfVxuXG4gIGNvbnN0IHJlZ3ggPSAvXltfYS16QS1aMC05XVthLXpBLVowLTlALiB+Xy1dKiQvO1xuICBpZiAoIWZpbGVuYW1lLm1hdGNoKHJlZ3gpKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0ZJTEVfTkFNRSwgJ0ZpbGVuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4nKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsZXNBZGFwdGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBbUJBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUErQixTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQW5CL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1HLFlBQVksQ0FBQztFQUN4QjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxVQUFVQSxDQUFDQyxRQUFnQixFQUFFQyxJQUFJLEVBQUVDLFdBQW1CLEVBQUVDLE9BQWUsRUFBVyxDQUFDOztFQUVuRjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRUMsVUFBVUEsQ0FBQ0osUUFBZ0IsRUFBVyxDQUFDOztFQUV2QztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRUssV0FBV0EsQ0FBQ0wsUUFBZ0IsRUFBZ0IsQ0FBQzs7RUFFN0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRU0sZUFBZUEsQ0FBQ0MsTUFBYyxFQUFFUCxRQUFnQixFQUE0QixDQUFDOztFQUU3RTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRTs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRTs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBUSxPQUFBLENBQUFWLFlBQUEsR0FBQUEsWUFBQTtBQU1PLFNBQVNXLGdCQUFnQkEsQ0FBQ1QsUUFBUSxFQUFnQjtFQUN2RCxJQUFJQSxRQUFRLENBQUNVLE1BQU0sR0FBRyxHQUFHLEVBQUU7SUFDekIsT0FBTyxJQUFJQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUNDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDO0VBQzdFO0VBRUEsTUFBTUMsSUFBSSxHQUFHLGtDQUFrQztFQUMvQyxJQUFJLENBQUNkLFFBQVEsQ0FBQ2UsS0FBSyxDQUFDRCxJQUFJLENBQUMsRUFBRTtJQUN6QixPQUFPLElBQUlILGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQ0MsaUJBQWlCLEVBQUUsdUNBQXVDLENBQUM7RUFDaEc7RUFDQSxPQUFPLElBQUk7QUFDYjtBQUFDLElBQUFHLFFBQUEsR0FBQVIsT0FBQSxDQUFBWCxPQUFBLEdBRWNDLFlBQVkiLCJpZ25vcmVMaXN0IjpbXX0=
129
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiRmlsZXNBZGFwdGVyIiwiY3JlYXRlRmlsZSIsImZpbGVuYW1lIiwiZGF0YSIsImNvbnRlbnRUeXBlIiwib3B0aW9ucyIsInN1cHBvcnRzU3RyZWFtaW5nIiwiZGVsZXRlRmlsZSIsImdldEZpbGVEYXRhIiwiZ2V0RmlsZUxvY2F0aW9uIiwiY29uZmlnIiwiZXhwb3J0cyIsInZhbGlkYXRlRmlsZW5hbWUiLCJsZW5ndGgiLCJQYXJzZSIsIkVycm9yIiwiSU5WQUxJRF9GSUxFX05BTUUiLCJyZWd4IiwibWF0Y2giLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9GaWxlcy9GaWxlc0FkYXB0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnMgKi9cbi8vIEZpbGVzIEFkYXB0ZXJcbi8vXG4vLyBBbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgZmlsZSBzdG9yYWdlIG1lY2hhbmlzbS5cbi8vXG4vLyBBZGFwdGVyIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6XG4vLyAqIGNyZWF0ZUZpbGUoZmlsZW5hbWUsIGRhdGEsIGNvbnRlbnRUeXBlKVxuLy8gKiBkZWxldGVGaWxlKGZpbGVuYW1lKVxuLy8gKiBnZXRGaWxlRGF0YShmaWxlbmFtZSlcbi8vICogZ2V0RmlsZUxvY2F0aW9uKGNvbmZpZywgZmlsZW5hbWUpXG4vLyBBZGFwdGVyIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcbi8vICogdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSlcbi8vICogaGFuZGxlRmlsZVN0cmVhbShmaWxlbmFtZSwgcmVxLCByZXMsIGNvbnRlbnRUeXBlKVxuLy9cbi8vIERlZmF1bHQgaXMgR3JpZEZTQnVja2V0QWRhcHRlciwgd2hpY2ggcmVxdWlyZXMgbW9uZ29cbi8vIGFuZCBmb3IgdGhlIEFQSSBzZXJ2ZXIgdG8gYmUgdXNpbmcgdGhlIERhdGFiYXNlQ29udHJvbGxlciB3aXRoIE1vbmdvXG4vLyBkYXRhYmFzZSBhZGFwdGVyLlxuXG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gJy4uLy4uL0NvbmZpZyc7XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG4vKipcbiAqIEBpbnRlcmZhY2VcbiAqIEBtZW1iZXJvZiBtb2R1bGU6QWRhcHRlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVzQWRhcHRlciB7XG4gIC8qKiBSZXNwb25zaWJsZSBmb3Igc3RvcmluZyB0aGUgZmlsZSBpbiBvcmRlciB0byBiZSByZXRyaWV2ZWQgbGF0ZXIgYnkgaXRzIGZpbGVuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIHRoZSBmaWxlbmFtZSB0byBzYXZlXG4gICAqIEBwYXJhbSB7QnVmZmVyfGltcG9ydCgnc3RyZWFtJykuUmVhZGFibGV9IGRhdGEgLSB0aGUgZmlsZSBkYXRhIGFzIGEgQnVmZmVyLCBvciBhIFJlYWRhYmxlIHN0cmVhbSBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyBzdHJlYW1pbmcgKHNlZSBzdXBwb3J0c1N0cmVhbWluZylcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlIC0gdGhlIHN1cHBvc2VkIGNvbnRlbnRUeXBlXG4gICAqIEBkaXNjdXNzaW9uIHRoZSBjb250ZW50VHlwZSBjYW4gYmUgdW5kZWZpbmVkIGlmIHRoZSBjb250cm9sbGVyIHdhcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgaXRcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSAoT3B0aW9uYWwpIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIGZpbGUgYWRhcHRlciAoUzMgRmlsZSBBZGFwdGVyIE9ubHkpXG4gICAqIC0gdGFnczogb2JqZWN0IGNvbnRhaW5pbmcga2V5IHZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSBzdG9yZWQgd2l0aCBmaWxlXG4gICAqIC0gbWV0YWRhdGE6IG9iamVjdCBjb250YWluaW5nIGtleSB2YWx1ZSBwYWlycyB0aGF0IHdpbGwgYmUgc290cmVkIHdpdGggZmlsZSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyLWd1aWRlL2FkZC1vYmplY3QtbWV0YWRhdGEuaHRtbClcbiAgICogQGRpc2N1c3Npb24gb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSBhbGwgZmlsZSBhZGFwdGVycy4gQ2hlY2sgdGhlIHlvdXIgYWRhcHRlcidzIGRvY3VtZW50YXRpb24gZm9yIGNvbXBhdGliaWxpdHlcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgc2hvdWxkIGZhaWwgaWYgdGhlIHN0b3JhZ2UgZGlkbid0IHN1Y2NlZWRcbiAgICovXG4gIGNyZWF0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZywgZGF0YSwgY29udGVudFR5cGU6IHN0cmluZywgb3B0aW9uczogT2JqZWN0KTogUHJvbWlzZSB7fVxuXG4gIC8qKiBXaGV0aGVyIHRoaXMgYWRhcHRlciBzdXBwb3J0cyByZWNlaXZpbmcgUmVhZGFibGUgc3RyZWFtcyBpbiBjcmVhdGVGaWxlKCkuXG4gICAqIElmIGZhbHNlIChkZWZhdWx0KSwgc3RyZWFtcyBhcmUgYnVmZmVyZWQgdG8gYSBCdWZmZXIgYmVmb3JlIGJlaW5nIHBhc3NlZC5cbiAgICogT3ZlcnJpZGUgYW5kIHJldHVybiB0cnVlIHRvIHJlY2VpdmUgUmVhZGFibGUgc3RyZWFtcyBkaXJlY3RseS5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBzdXBwb3J0c1N0cmVhbWluZygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogUmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBzcGVjaWZpZWQgZmlsZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSB0aGUgZmlsZW5hbWUgdG8gZGVsZXRlXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHNob3VsZCBmYWlsIGlmIHRoZSBkZWxldGlvbiBkaWRuJ3Qgc3VjY2VlZFxuICAgKi9cbiAgZGVsZXRlRmlsZShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZSB7fVxuXG4gIC8qKiBSZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB0aGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gdGhlIG5hbWUgb2YgZmlsZSB0byByZXRyaWV2ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCBzaG91bGQgcGFzcyB3aXRoIHRoZSBmaWxlIGRhdGEgb3IgZmFpbCBvbiBlcnJvclxuICAgKi9cbiAgZ2V0RmlsZURhdGEoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7fVxuXG4gIC8qKiBSZXR1cm5zIGFuIGFic29sdXRlIFVSTCB3aGVyZSB0aGUgZmlsZSBjYW4gYmUgYWNjZXNzZWRcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWd9IGNvbmZpZyAtIHNlcnZlciBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBQcm9taXNlPHN0cmluZz59IEFic29sdXRlIFVSTFxuICAgKi9cbiAgZ2V0RmlsZUxvY2F0aW9uKGNvbmZpZzogQ29uZmlnLCBmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHt9XG5cbiAgLyoqIFZhbGlkYXRlIGEgZmlsZW5hbWUgZm9yIHRoaXMgYWRhcHRlciB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVsbHxQYXJzZS5FcnJvcn0gbnVsbCBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzXG4gICAqL1xuICAvLyB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpOiA/UGFyc2UuRXJyb3Ige31cblxuICAvKiogSGFuZGxlcyBCeXRlLVJhbmdlIFJlcXVlc3RzIGZvciBTdHJlYW1pbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFR5cGVcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IERhdGEgZm9yIGJ5dGUgcmFuZ2VcbiAgICovXG4gIC8vIGhhbmRsZUZpbGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgcmVzOiBhbnksIHJlcTogYW55LCBjb250ZW50VHlwZTogc3RyaW5nKTogUHJvbWlzZVxuXG4gIC8qKiBSZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyBtZXRhZGF0YSBhbmQgdGFnc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSB0aGUgZmlsZW5hbWUgdG8gcmV0cmlldmUgbWV0YWRhdGFcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgc2hvdWxkIHBhc3Mgd2l0aCBtZXRhZGF0YVxuICAgKi9cbiAgLy8gZ2V0TWV0YWRhdGEoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7fVxufVxuXG4vKipcbiAqIFNpbXBsZSBmaWxlbmFtZSB2YWxpZGF0aW9uXG4gKlxuICogQHBhcmFtIGZpbGVuYW1lXG4gKiBAcmV0dXJucyB7bnVsbHxQYXJzZS5FcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmlsZW5hbWUoZmlsZW5hbWUpOiA/UGFyc2UuRXJyb3Ige1xuICBpZiAoZmlsZW5hbWUubGVuZ3RoID4gMTI4KSB7XG4gICAgcmV0dXJuIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0ZJTEVfTkFNRSwgJ0ZpbGVuYW1lIHRvbyBsb25nLicpO1xuICB9XG5cbiAgY29uc3QgcmVneCA9IC9eW19hLXpBLVowLTldW2EtekEtWjAtOUAuIH5fLV0qJC87XG4gIGlmICghZmlsZW5hbWUubWF0Y2gocmVneCkpIHtcbiAgICByZXR1cm4gbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfRklMRV9OQU1FLCAnRmlsZW5hbWUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLicpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlc0FkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFtQkEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQStCLFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBbkIvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUcsWUFBWSxDQUFDO0VBQ3hCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLFVBQVVBLENBQUNDLFFBQWdCLEVBQUVDLElBQUksRUFBRUMsV0FBbUIsRUFBRUMsT0FBZSxFQUFXLENBQUM7O0VBRW5GO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFLElBQUlDLGlCQUFpQkEsQ0FBQSxFQUFHO0lBQ3RCLE9BQU8sS0FBSztFQUNkOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxVQUFVQSxDQUFDTCxRQUFnQixFQUFXLENBQUM7O0VBRXZDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFTSxXQUFXQSxDQUFDTixRQUFnQixFQUFnQixDQUFDOztFQUU3QztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFTyxlQUFlQSxDQUFDQyxNQUFjLEVBQUVSLFFBQWdCLEVBQTRCLENBQUM7O0VBRTdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEFTLE9BQUEsQ0FBQVgsWUFBQSxHQUFBQSxZQUFBO0FBTU8sU0FBU1ksZ0JBQWdCQSxDQUFDVixRQUFRLEVBQWdCO0VBQ3ZELElBQUlBLFFBQVEsQ0FBQ1csTUFBTSxHQUFHLEdBQUcsRUFBRTtJQUN6QixPQUFPLElBQUlDLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQ0MsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUM7RUFDN0U7RUFFQSxNQUFNQyxJQUFJLEdBQUcsa0NBQWtDO0VBQy9DLElBQUksQ0FBQ2YsUUFBUSxDQUFDZ0IsS0FBSyxDQUFDRCxJQUFJLENBQUMsRUFBRTtJQUN6QixPQUFPLElBQUlILGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQ0MsaUJBQWlCLEVBQUUsdUNBQXVDLENBQUM7RUFDaEc7RUFDQSxPQUFPLElBQUk7QUFDYjtBQUFDLElBQUFHLFFBQUEsR0FBQVIsT0FBQSxDQUFBWixPQUFBLEdBRWNDLFlBQVkiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -34,6 +34,9 @@ class GridFSBucketAdapter extends _FilesAdapter.FilesAdapter {
34
34
  }
35
35
  this._mongoOptions = _mongoOptions;
36
36
  }
37
+ get supportsStreaming() {
38
+ return true;
39
+ }
37
40
  _connect() {
38
41
  if (!this._connectionPromise) {
39
42
  // Only use driverInfo if clientMetadata option is set
@@ -64,6 +67,31 @@ class GridFSBucketAdapter extends _FilesAdapter.FilesAdapter {
64
67
  const stream = await bucket.openUploadStream(filename, {
65
68
  metadata: options.metadata
66
69
  });
70
+
71
+ // If data is a stream and encryption is enabled, buffer first
72
+ // (AES-256-GCM needs complete data for format: [encrypted][IV][authTag])
73
+ if (typeof data?.pipe === 'function' && this._encryptionKey !== null) {
74
+ data = await new Promise((resolve, reject) => {
75
+ const chunks = [];
76
+ data.on('data', chunk => chunks.push(chunk));
77
+ data.on('end', () => resolve(Buffer.concat(chunks)));
78
+ data.on('error', reject);
79
+ });
80
+ }
81
+ if (typeof data?.pipe === 'function') {
82
+ // Pipe readable stream directly into GridFS upload stream
83
+ return new Promise((resolve, reject) => {
84
+ data.pipe(stream);
85
+ stream.on('finish', resolve);
86
+ stream.on('error', reject);
87
+ data.on('error', err => {
88
+ stream.destroy(err);
89
+ reject(err);
90
+ });
91
+ });
92
+ }
93
+
94
+ // Buffer path (existing behavior)
67
95
  if (this._encryptionKey !== null) {
68
96
  try {
69
97
  const iv = crypto.randomBytes(16);
@@ -239,4 +267,4 @@ class GridFSBucketAdapter extends _FilesAdapter.FilesAdapter {
239
267
  }
240
268
  exports.GridFSBucketAdapter = GridFSBucketAdapter;
241
269
  var _default = exports.default = GridFSBucketAdapter;
242
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9uZ29kYiIsInJlcXVpcmUiLCJfRmlsZXNBZGFwdGVyIiwiX2RlZmF1bHRzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJjcnlwdG8iLCJHcmlkRlNCdWNrZXRBZGFwdGVyIiwiRmlsZXNBZGFwdGVyIiwiY29uc3RydWN0b3IiLCJtb25nb0RhdGFiYXNlVVJJIiwiZGVmYXVsdHMiLCJEZWZhdWx0TW9uZ29VUkkiLCJtb25nb09wdGlvbnMiLCJlbmNyeXB0aW9uS2V5IiwidW5kZWZpbmVkIiwiX2RhdGFiYXNlVVJJIiwiX2FsZ29yaXRobSIsIl9lbmNyeXB0aW9uS2V5IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIlN0cmluZyIsImRpZ2VzdCIsInN1YnN0cmluZyIsImRlZmF1bHRNb25nb09wdGlvbnMiLCJfbW9uZ29PcHRpb25zIiwiYXNzaWduIiwiX2NsaWVudE1ldGFkYXRhIiwiY2xpZW50TWV0YWRhdGEiLCJrZXkiLCJQYXJzZVNlcnZlckRhdGFiYXNlT3B0aW9ucyIsIl9jb25uZWN0IiwiX2Nvbm5lY3Rpb25Qcm9taXNlIiwib3B0aW9ucyIsImRyaXZlckluZm8iLCJuYW1lIiwidmVyc2lvbiIsIk1vbmdvQ2xpZW50IiwiY29ubmVjdCIsInRoZW4iLCJjbGllbnQiLCJfY2xpZW50IiwiZGIiLCJzIiwiZGJOYW1lIiwiX2dldEJ1Y2tldCIsImRhdGFiYXNlIiwiR3JpZEZTQnVja2V0IiwiY3JlYXRlRmlsZSIsImZpbGVuYW1lIiwiZGF0YSIsImNvbnRlbnRUeXBlIiwiYnVja2V0Iiwic3RyZWFtIiwib3BlblVwbG9hZFN0cmVhbSIsIm1ldGFkYXRhIiwiaXYiLCJyYW5kb21CeXRlcyIsImNpcGhlciIsImNyZWF0ZUNpcGhlcml2IiwiZW5jcnlwdGVkUmVzdWx0IiwiQnVmZmVyIiwiY29uY2F0IiwiZmluYWwiLCJnZXRBdXRoVGFnIiwid3JpdGUiLCJlcnIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImVuZCIsIm9uIiwiZGVsZXRlRmlsZSIsImRvY3VtZW50cyIsImZpbmQiLCJ0b0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJhbGwiLCJtYXAiLCJkb2MiLCJkZWxldGUiLCJfaWQiLCJnZXRGaWxlRGF0YSIsIm9wZW5Eb3dubG9hZFN0cmVhbUJ5TmFtZSIsInJlYWQiLCJjaHVua3MiLCJwdXNoIiwiYXV0aFRhZ0xvY2F0aW9uIiwiaXZMb2NhdGlvbiIsImF1dGhUYWciLCJzbGljZSIsImVuY3J5cHRlZCIsImRlY2lwaGVyIiwiY3JlYXRlRGVjaXBoZXJpdiIsInNldEF1dGhUYWciLCJkZWNyeXB0ZWQiLCJyb3RhdGVFbmNyeXB0aW9uS2V5IiwiZmlsZU5hbWVzIiwib2xkS2V5RmlsZUFkYXB0ZXIiLCJvbGRLZXkiLCJmaWxlTmFtZXNJdGVyYXRvciIsImZvckVhY2giLCJmaWxlIiwiZmlsZU5hbWVzTm90Um90YXRlZCIsImZpbGVOYW1lc1JvdGF0ZWQiLCJmaWxlTmFtZSIsInBsYWluVGV4dERhdGEiLCJmaWx0ZXIiLCJ2YWx1ZSIsInJvdGF0ZWQiLCJub3RSb3RhdGVkIiwiZ2V0RmlsZUxvY2F0aW9uIiwiY29uZmlnIiwibW91bnQiLCJhcHBsaWNhdGlvbklkIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZ2V0TWV0YWRhdGEiLCJmaWxlcyIsImhhbmRsZUZpbGVTdHJlYW0iLCJyZXEiLCJyZXMiLCJwYXJ0cyIsInJlcGxhY2UiLCJzcGxpdCIsInBhcnRpYWxzdGFydCIsInBhcnRpYWxlbmQiLCJmaWxlTGVuZ3RoIiwiZmlsZVN0YXJ0IiwicGFyc2VJbnQiLCJmaWxlRW5kIiwic3RhcnQiLCJNYXRoIiwibWluIiwibWF4IiwiaXNOYU4iLCJzdGF0dXMiLCJoZWFkZXIiLCJjaHVuayIsInNlbmQiLCJtZXNzYWdlIiwiaGFuZGxlU2h1dGRvd24iLCJjbG9zZSIsInZhbGlkYXRlRmlsZW5hbWUiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvRmlsZXMvR3JpZEZTQnVja2V0QWRhcHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiBHcmlkRlNCdWNrZXRBZGFwdGVyXG4gU3RvcmVzIGZpbGVzIGluIE1vbmdvIHVzaW5nIEdyaWRGU1xuIFJlcXVpcmVzIHRoZSBkYXRhYmFzZSBhZGFwdGVyIHRvIGJlIGJhc2VkIG9uIG1vbmdvY2xpZW50XG5cbiBAZmxvdyB3ZWFrXG4gKi9cblxuLy8gQGZsb3ctZGlzYWJsZS1uZXh0XG5pbXBvcnQgeyBNb25nb0NsaWVudCwgR3JpZEZTQnVja2V0LCBEYiB9IGZyb20gJ21vbmdvZGInO1xuaW1wb3J0IHsgRmlsZXNBZGFwdGVyLCB2YWxpZGF0ZUZpbGVuYW1lIH0gZnJvbSAnLi9GaWxlc0FkYXB0ZXInO1xuaW1wb3J0IGRlZmF1bHRzLCB7IFBhcnNlU2VydmVyRGF0YWJhc2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGVmYXVsdHMnO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBHcmlkRlNCdWNrZXRBZGFwdGVyIGV4dGVuZHMgRmlsZXNBZGFwdGVyIHtcbiAgX2RhdGFiYXNlVVJJOiBzdHJpbmc7XG4gIF9jb25uZWN0aW9uUHJvbWlzZTogUHJvbWlzZTxEYj47XG4gIF9tb25nb09wdGlvbnM6IE9iamVjdDtcbiAgX2FsZ29yaXRobTogc3RyaW5nO1xuICBfY2xpZW50TWV0YWRhdGE6ID97IG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbW9uZ29EYXRhYmFzZVVSSSA9IGRlZmF1bHRzLkRlZmF1bHRNb25nb1VSSSxcbiAgICBtb25nb09wdGlvbnMgPSB7fSxcbiAgICBlbmNyeXB0aW9uS2V5ID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZGF0YWJhc2VVUkkgPSBtb25nb0RhdGFiYXNlVVJJO1xuICAgIHRoaXMuX2FsZ29yaXRobSA9ICdhZXMtMjU2LWdjbSc7XG4gICAgdGhpcy5fZW5jcnlwdGlvbktleSA9XG4gICAgICBlbmNyeXB0aW9uS2V5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBjcnlwdG9cbiAgICAgICAgICAuY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgICAgICAudXBkYXRlKFN0cmluZyhlbmNyeXB0aW9uS2V5KSlcbiAgICAgICAgICAuZGlnZXN0KCdiYXNlNjQnKVxuICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMzIpXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBkZWZhdWx0TW9uZ29PcHRpb25zID0ge307XG4gICAgY29uc3QgX21vbmdvT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdE1vbmdvT3B0aW9ucywgbW9uZ29PcHRpb25zKTtcbiAgICB0aGlzLl9jbGllbnRNZXRhZGF0YSA9IG1vbmdvT3B0aW9ucy5jbGllbnRNZXRhZGF0YTtcbiAgICAvLyBSZW1vdmUgUGFyc2UgU2VydmVyLXNwZWNpZmljIG9wdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIHBhc3NlZCB0byBNb25nb0RCIGNsaWVudFxuICAgIGZvciAoY29uc3Qga2V5IG9mIFBhcnNlU2VydmVyRGF0YWJhc2VPcHRpb25zKSB7XG4gICAgICBkZWxldGUgX21vbmdvT3B0aW9uc1trZXldO1xuICAgIH1cbiAgICB0aGlzLl9tb25nb09wdGlvbnMgPSBfbW9uZ29PcHRpb25zO1xuICB9XG5cbiAgX2Nvbm5lY3QoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25uZWN0aW9uUHJvbWlzZSkge1xuICAgICAgLy8gT25seSB1c2UgZHJpdmVySW5mbyBpZiBjbGllbnRNZXRhZGF0YSBvcHRpb24gaXMgc2V0XG4gICAgICBjb25zdCBvcHRpb25zID0geyAuLi50aGlzLl9tb25nb09wdGlvbnMgfTtcbiAgICAgIGlmICh0aGlzLl9jbGllbnRNZXRhZGF0YSkge1xuICAgICAgICBvcHRpb25zLmRyaXZlckluZm8gPSB7XG4gICAgICAgICAgbmFtZTogdGhpcy5fY2xpZW50TWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiB0aGlzLl9jbGllbnRNZXRhZGF0YS52ZXJzaW9uXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25Qcm9taXNlID0gTW9uZ29DbGllbnQuY29ubmVjdCh0aGlzLl9kYXRhYmFzZVVSSSwgb3B0aW9ucykudGhlbihcbiAgICAgICAgY2xpZW50ID0+IHtcbiAgICAgICAgICB0aGlzLl9jbGllbnQgPSBjbGllbnQ7XG4gICAgICAgICAgcmV0dXJuIGNsaWVudC5kYihjbGllbnQucy5vcHRpb25zLmRiTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uUHJvbWlzZTtcbiAgfVxuXG4gIF9nZXRCdWNrZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3QoKS50aGVuKGRhdGFiYXNlID0+IG5ldyBHcmlkRlNCdWNrZXQoZGF0YWJhc2UpKTtcbiAgfVxuXG4gIC8vIEZvciBhIGdpdmVuIGNvbmZpZyBvYmplY3QsIGZpbGVuYW1lLCBhbmQgZGF0YSwgc3RvcmUgYSBmaWxlXG4gIC8vIFJldHVybnMgYSBwcm9taXNlXG4gIGFzeW5jIGNyZWF0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZywgZGF0YSwgY29udGVudFR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuX2dldEJ1Y2tldCgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGJ1Y2tldC5vcGVuVXBsb2FkU3RyZWFtKGZpbGVuYW1lLCB7XG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5fZW5jcnlwdGlvbktleSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXYgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpO1xuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYodGhpcy5fYWxnb3JpdGhtLCB0aGlzLl9lbmNyeXB0aW9uS2V5LCBpdik7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJlc3VsdCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICAgIGNpcGhlci51cGRhdGUoZGF0YSksXG4gICAgICAgICAgY2lwaGVyLmZpbmFsKCksXG4gICAgICAgICAgaXYsXG4gICAgICAgICAgY2lwaGVyLmdldEF1dGhUYWcoKSxcbiAgICAgICAgXSk7XG4gICAgICAgIGF3YWl0IHN0cmVhbS53cml0ZShlbmNyeXB0ZWRSZXN1bHQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc3RyZWFtLndyaXRlKGRhdGEpO1xuICAgIH1cbiAgICBzdHJlYW0uZW5kKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHN0cmVhbS5vbignZmluaXNoJywgcmVzb2x2ZSk7XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuX2dldEJ1Y2tldCgpO1xuICAgIGNvbnN0IGRvY3VtZW50cyA9IGF3YWl0IGJ1Y2tldC5maW5kKHsgZmlsZW5hbWUgfSkudG9BcnJheSgpO1xuICAgIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGVOb3RGb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBkb2N1bWVudHMubWFwKGRvYyA9PiB7XG4gICAgICAgIHJldHVybiBidWNrZXQuZGVsZXRlKGRvYy5faWQpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0RmlsZURhdGEoZmlsZW5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuX2dldEJ1Y2tldCgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGJ1Y2tldC5vcGVuRG93bmxvYWRTdHJlYW1CeU5hbWUoZmlsZW5hbWUpO1xuICAgIHN0cmVhbS5yZWFkKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAgc3RyZWFtLm9uKCdkYXRhJywgZGF0YSA9PiB7XG4gICAgICAgIGNodW5rcy5wdXNoKGRhdGEpO1xuICAgICAgfSk7XG4gICAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKTtcbiAgICAgICAgaWYgKHRoaXMuX2VuY3J5cHRpb25LZXkgIT09IG51bGwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYXV0aFRhZ0xvY2F0aW9uID0gZGF0YS5sZW5ndGggLSAxNjtcbiAgICAgICAgICAgIGNvbnN0IGl2TG9jYXRpb24gPSBkYXRhLmxlbmd0aCAtIDMyO1xuICAgICAgICAgICAgY29uc3QgYXV0aFRhZyA9IGRhdGEuc2xpY2UoYXV0aFRhZ0xvY2F0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IGl2ID0gZGF0YS5zbGljZShpdkxvY2F0aW9uLCBhdXRoVGFnTG9jYXRpb24pO1xuICAgICAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gZGF0YS5zbGljZSgwLCBpdkxvY2F0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYodGhpcy5fYWxnb3JpdGhtLCB0aGlzLl9lbmNyeXB0aW9uS2V5LCBpdik7XG4gICAgICAgICAgICBkZWNpcGhlci5zZXRBdXRoVGFnKGF1dGhUYWcpO1xuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKGVuY3J5cHRlZCksIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGRlY3J5cHRlZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9KTtcbiAgICAgIHN0cmVhbS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcm90YXRlRW5jcnlwdGlvbktleShvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZmlsZU5hbWVzID0gW107XG4gICAgbGV0IG9sZEtleUZpbGVBZGFwdGVyID0ge307XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5fZ2V0QnVja2V0KCk7XG4gICAgaWYgKG9wdGlvbnMub2xkS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9sZEtleUZpbGVBZGFwdGVyID0gbmV3IEdyaWRGU0J1Y2tldEFkYXB0ZXIoXG4gICAgICAgIHRoaXMuX2RhdGFiYXNlVVJJLFxuICAgICAgICB0aGlzLl9tb25nb09wdGlvbnMsXG4gICAgICAgIG9wdGlvbnMub2xkS2V5XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbGRLZXlGaWxlQWRhcHRlciA9IG5ldyBHcmlkRlNCdWNrZXRBZGFwdGVyKHRoaXMuX2RhdGFiYXNlVVJJLCB0aGlzLl9tb25nb09wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5maWxlTmFtZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlsZU5hbWVzID0gb3B0aW9ucy5maWxlTmFtZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVOYW1lc0l0ZXJhdG9yID0gYXdhaXQgYnVja2V0LmZpbmQoKS50b0FycmF5KCk7XG4gICAgICBmaWxlTmFtZXNJdGVyYXRvci5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICBmaWxlTmFtZXMucHVzaChmaWxlLmZpbGVuYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgZmlsZU5hbWVzTm90Um90YXRlZCA9IGZpbGVOYW1lcztcbiAgICBjb25zdCBmaWxlTmFtZXNSb3RhdGVkID0gW107XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBsYWluVGV4dERhdGEgPSBhd2FpdCBvbGRLZXlGaWxlQWRhcHRlci5nZXRGaWxlRGF0YShmaWxlTmFtZSk7XG4gICAgICAgIC8vIE92ZXJ3cml0ZSBmaWxlIHdpdGggZGF0YSBlbmNyeXB0ZWQgd2l0aCBuZXcga2V5XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRmlsZShmaWxlTmFtZSwgcGxhaW5UZXh0RGF0YSk7XG4gICAgICAgIGZpbGVOYW1lc1JvdGF0ZWQucHVzaChmaWxlTmFtZSk7XG4gICAgICAgIGZpbGVOYW1lc05vdFJvdGF0ZWQgPSBmaWxlTmFtZXNOb3RSb3RhdGVkLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IGZpbGVOYW1lO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgcm90YXRlZDogZmlsZU5hbWVzUm90YXRlZCwgbm90Um90YXRlZDogZmlsZU5hbWVzTm90Um90YXRlZCB9O1xuICB9XG5cbiAgZ2V0RmlsZUxvY2F0aW9uKGNvbmZpZywgZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gY29uZmlnLm1vdW50ICsgJy9maWxlcy8nICsgY29uZmlnLmFwcGxpY2F0aW9uSWQgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWV0YWRhdGEoZmlsZW5hbWUpIHtcbiAgICBjb25zdCBidWNrZXQgPSBhd2FpdCB0aGlzLl9nZXRCdWNrZXQoKTtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGJ1Y2tldC5maW5kKHsgZmlsZW5hbWUgfSkudG9BcnJheSgpO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgeyBtZXRhZGF0YSB9ID0gZmlsZXNbMF07XG4gICAgcmV0dXJuIHsgbWV0YWRhdGEgfTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgcmVxLCByZXMsIGNvbnRlbnRUeXBlKSB7XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5fZ2V0QnVja2V0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBidWNrZXQuZmluZCh7IGZpbGVuYW1lIH0pLnRvQXJyYXkoKTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGVOb3RGb3VuZCcpO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IHJlcVxuICAgICAgLmdldCgnUmFuZ2UnKVxuICAgICAgLnJlcGxhY2UoL2J5dGVzPS8sICcnKVxuICAgICAgLnNwbGl0KCctJyk7XG4gICAgY29uc3QgcGFydGlhbHN0YXJ0ID0gcGFydHNbMF07XG4gICAgY29uc3QgcGFydGlhbGVuZCA9IHBhcnRzWzFdO1xuXG4gICAgY29uc3QgZmlsZUxlbmd0aCA9IGZpbGVzWzBdLmxlbmd0aDtcbiAgICBjb25zdCBmaWxlU3RhcnQgPSBwYXJzZUludChwYXJ0aWFsc3RhcnQsIDEwKTtcbiAgICBjb25zdCBmaWxlRW5kID0gcGFydGlhbGVuZCA/IHBhcnNlSW50KHBhcnRpYWxlbmQsIDEwKSA6IGZpbGVMZW5ndGg7XG5cbiAgICBsZXQgc3RhcnQgPSBNYXRoLm1pbihmaWxlU3RhcnQgfHwgMCwgZmlsZUVuZCwgZmlsZUxlbmd0aCk7XG4gICAgbGV0IGVuZCA9IE1hdGgubWF4KGZpbGVTdGFydCB8fCAwLCBmaWxlRW5kKSArIDEgfHwgZmlsZUxlbmd0aDtcbiAgICBpZiAoaXNOYU4oZmlsZVN0YXJ0KSkge1xuICAgICAgc3RhcnQgPSBmaWxlTGVuZ3RoIC0gZW5kICsgMTtcbiAgICAgIGVuZCA9IGZpbGVMZW5ndGg7XG4gICAgfVxuICAgIGVuZCA9IE1hdGgubWluKGVuZCwgZmlsZUxlbmd0aCk7XG4gICAgc3RhcnQgPSBNYXRoLm1heChzdGFydCwgMCk7XG5cbiAgICByZXMuc3RhdHVzKDIwNik7XG4gICAgcmVzLmhlYWRlcignQWNjZXB0LVJhbmdlcycsICdieXRlcycpO1xuICAgIHJlcy5oZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgZW5kIC0gc3RhcnQpO1xuICAgIHJlcy5oZWFkZXIoJ0NvbnRlbnQtUmFuZ2UnLCAnYnl0ZXMgJyArIHN0YXJ0ICsgJy0nICsgZW5kICsgJy8nICsgZmlsZUxlbmd0aCk7XG4gICAgcmVzLmhlYWRlcignQ29udGVudC1UeXBlJywgY29udGVudFR5cGUpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGJ1Y2tldC5vcGVuRG93bmxvYWRTdHJlYW1CeU5hbWUoZmlsZW5hbWUpO1xuICAgIHN0cmVhbS5zdGFydChzdGFydCk7XG4gICAgaWYgKGVuZCkge1xuICAgICAgc3RyZWFtLmVuZChlbmQpO1xuICAgIH1cbiAgICBzdHJlYW0ub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICByZXMud3JpdGUoY2h1bmspO1xuICAgIH0pO1xuICAgIHN0cmVhbS5vbignZXJyb3InLCBlID0+IHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgIHJlcy5zZW5kKGUubWVzc2FnZSk7XG4gICAgfSk7XG4gICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVTaHV0ZG93bigpIHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmNsb3NlKGZhbHNlKTtcbiAgfVxuXG4gIHZhbGlkYXRlRmlsZW5hbWUoZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR3JpZEZTQnVja2V0QWRhcHRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0EsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQXNFLFNBQUFHLHdCQUFBQyxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBSCx1QkFBQSxZQUFBQSxDQUFBQyxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdBQUEsQ0FBQVgsQ0FBQSxVQUFBTSxDQUFBLENB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
270
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9uZ29kYiIsInJlcXVpcmUiLCJfRmlsZXNBZGFwdGVyIiwiX2RlZmF1bHRzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJjcnlwdG8iLCJHcmlkRlNCdWNrZXRBZGFwdGVyIiwiRmlsZXNBZGFwdGVyIiwiY29uc3RydWN0b3IiLCJtb25nb0RhdGFiYXNlVVJJIiwiZGVmYXVsdHMiLCJEZWZhdWx0TW9uZ29VUkkiLCJtb25nb09wdGlvbnMiLCJlbmNyeXB0aW9uS2V5IiwidW5kZWZpbmVkIiwiX2RhdGFiYXNlVVJJIiwiX2FsZ29yaXRobSIsIl9lbmNyeXB0aW9uS2V5IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIlN0cmluZyIsImRpZ2VzdCIsInN1YnN0cmluZyIsImRlZmF1bHRNb25nb09wdGlvbnMiLCJfbW9uZ29PcHRpb25zIiwiYXNzaWduIiwiX2NsaWVudE1ldGFkYXRhIiwiY2xpZW50TWV0YWRhdGEiLCJrZXkiLCJQYXJzZVNlcnZlckRhdGFiYXNlT3B0aW9ucyIsInN1cHBvcnRzU3RyZWFtaW5nIiwiX2Nvbm5lY3QiLCJfY29ubmVjdGlvblByb21pc2UiLCJvcHRpb25zIiwiZHJpdmVySW5mbyIsIm5hbWUiLCJ2ZXJzaW9uIiwiTW9uZ29DbGllbnQiLCJjb25uZWN0IiwidGhlbiIsImNsaWVudCIsIl9jbGllbnQiLCJkYiIsInMiLCJkYk5hbWUiLCJfZ2V0QnVja2V0IiwiZGF0YWJhc2UiLCJHcmlkRlNCdWNrZXQiLCJjcmVhdGVGaWxlIiwiZmlsZW5hbWUiLCJkYXRhIiwiY29udGVudFR5cGUiLCJidWNrZXQiLCJzdHJlYW0iLCJvcGVuVXBsb2FkU3RyZWFtIiwibWV0YWRhdGEiLCJwaXBlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJjaHVua3MiLCJvbiIsImNodW5rIiwicHVzaCIsIkJ1ZmZlciIsImNvbmNhdCIsImVyciIsImRlc3Ryb3kiLCJpdiIsInJhbmRvbUJ5dGVzIiwiY2lwaGVyIiwiY3JlYXRlQ2lwaGVyaXYiLCJlbmNyeXB0ZWRSZXN1bHQiLCJmaW5hbCIsImdldEF1dGhUYWciLCJ3cml0ZSIsImVuZCIsImRlbGV0ZUZpbGUiLCJkb2N1bWVudHMiLCJmaW5kIiwidG9BcnJheSIsImxlbmd0aCIsIkVycm9yIiwiYWxsIiwibWFwIiwiZG9jIiwiZGVsZXRlIiwiX2lkIiwiZ2V0RmlsZURhdGEiLCJvcGVuRG93bmxvYWRTdHJlYW1CeU5hbWUiLCJyZWFkIiwiYXV0aFRhZ0xvY2F0aW9uIiwiaXZMb2NhdGlvbiIsImF1dGhUYWciLCJzbGljZSIsImVuY3J5cHRlZCIsImRlY2lwaGVyIiwiY3JlYXRlRGVjaXBoZXJpdiIsInNldEF1dGhUYWciLCJkZWNyeXB0ZWQiLCJyb3RhdGVFbmNyeXB0aW9uS2V5IiwiZmlsZU5hbWVzIiwib2xkS2V5RmlsZUFkYXB0ZXIiLCJvbGRLZXkiLCJmaWxlTmFtZXNJdGVyYXRvciIsImZvckVhY2giLCJmaWxlIiwiZmlsZU5hbWVzTm90Um90YXRlZCIsImZpbGVOYW1lc1JvdGF0ZWQiLCJmaWxlTmFtZSIsInBsYWluVGV4dERhdGEiLCJmaWx0ZXIiLCJ2YWx1ZSIsInJvdGF0ZWQiLCJub3RSb3RhdGVkIiwiZ2V0RmlsZUxvY2F0aW9uIiwiY29uZmlnIiwibW91bnQiLCJhcHBsaWNhdGlvbklkIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZ2V0TWV0YWRhdGEiLCJmaWxlcyIsImhhbmRsZUZpbGVTdHJlYW0iLCJyZXEiLCJyZXMiLCJwYXJ0cyIsInJlcGxhY2UiLCJzcGxpdCIsInBhcnRpYWxzdGFydCIsInBhcnRpYWxlbmQiLCJmaWxlTGVuZ3RoIiwiZmlsZVN0YXJ0IiwicGFyc2VJbnQiLCJmaWxlRW5kIiwic3RhcnQiLCJNYXRoIiwibWluIiwibWF4IiwiaXNOYU4iLCJzdGF0dXMiLCJoZWFkZXIiLCJzZW5kIiwibWVzc2FnZSIsImhhbmRsZVNodXRkb3duIiwiY2xvc2UiLCJ2YWxpZGF0ZUZpbGVuYW1lIiwiZXhwb3J0cyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0ZpbGVzL0dyaWRGU0J1Y2tldEFkYXB0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gR3JpZEZTQnVja2V0QWRhcHRlclxuIFN0b3JlcyBmaWxlcyBpbiBNb25nbyB1c2luZyBHcmlkRlNcbiBSZXF1aXJlcyB0aGUgZGF0YWJhc2UgYWRhcHRlciB0byBiZSBiYXNlZCBvbiBtb25nb2NsaWVudFxuXG4gQGZsb3cgd2Vha1xuICovXG5cbi8vIEBmbG93LWRpc2FibGUtbmV4dFxuaW1wb3J0IHsgTW9uZ29DbGllbnQsIEdyaWRGU0J1Y2tldCwgRGIgfSBmcm9tICdtb25nb2RiJztcbmltcG9ydCB7IEZpbGVzQWRhcHRlciwgdmFsaWRhdGVGaWxlbmFtZSB9IGZyb20gJy4vRmlsZXNBZGFwdGVyJztcbmltcG9ydCBkZWZhdWx0cywgeyBQYXJzZVNlcnZlckRhdGFiYXNlT3B0aW9ucyB9IGZyb20gJy4uLy4uL2RlZmF1bHRzJztcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5leHBvcnQgY2xhc3MgR3JpZEZTQnVja2V0QWRhcHRlciBleHRlbmRzIEZpbGVzQWRhcHRlciB7XG4gIF9kYXRhYmFzZVVSSTogc3RyaW5nO1xuICBfY29ubmVjdGlvblByb21pc2U6IFByb21pc2U8RGI+O1xuICBfbW9uZ29PcHRpb25zOiBPYmplY3Q7XG4gIF9hbGdvcml0aG06IHN0cmluZztcbiAgX2NsaWVudE1ldGFkYXRhOiA/eyBuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1vbmdvRGF0YWJhc2VVUkkgPSBkZWZhdWx0cy5EZWZhdWx0TW9uZ29VUkksXG4gICAgbW9uZ29PcHRpb25zID0ge30sXG4gICAgZW5jcnlwdGlvbktleSA9IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RhdGFiYXNlVVJJID0gbW9uZ29EYXRhYmFzZVVSSTtcbiAgICB0aGlzLl9hbGdvcml0aG0gPSAnYWVzLTI1Ni1nY20nO1xuICAgIHRoaXMuX2VuY3J5cHRpb25LZXkgPVxuICAgICAgZW5jcnlwdGlvbktleSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gY3J5cHRvXG4gICAgICAgICAgLmNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAgICAgLnVwZGF0ZShTdHJpbmcoZW5jcnlwdGlvbktleSkpXG4gICAgICAgICAgLmRpZ2VzdCgnYmFzZTY0JylcbiAgICAgICAgICAuc3Vic3RyaW5nKDAsIDMyKVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3QgZGVmYXVsdE1vbmdvT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IF9tb25nb09wdGlvbnMgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRNb25nb09wdGlvbnMsIG1vbmdvT3B0aW9ucyk7XG4gICAgdGhpcy5fY2xpZW50TWV0YWRhdGEgPSBtb25nb09wdGlvbnMuY2xpZW50TWV0YWRhdGE7XG4gICAgLy8gUmVtb3ZlIFBhcnNlIFNlcnZlci1zcGVjaWZpYyBvcHRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBwYXNzZWQgdG8gTW9uZ29EQiBjbGllbnRcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBQYXJzZVNlcnZlckRhdGFiYXNlT3B0aW9ucykge1xuICAgICAgZGVsZXRlIF9tb25nb09wdGlvbnNba2V5XTtcbiAgICB9XG4gICAgdGhpcy5fbW9uZ29PcHRpb25zID0gX21vbmdvT3B0aW9ucztcbiAgfVxuXG4gIGdldCBzdXBwb3J0c1N0cmVhbWluZygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIF9jb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5fY29ubmVjdGlvblByb21pc2UpIHtcbiAgICAgIC8vIE9ubHkgdXNlIGRyaXZlckluZm8gaWYgY2xpZW50TWV0YWRhdGEgb3B0aW9uIGlzIHNldFxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4udGhpcy5fbW9uZ29PcHRpb25zIH07XG4gICAgICBpZiAodGhpcy5fY2xpZW50TWV0YWRhdGEpIHtcbiAgICAgICAgb3B0aW9ucy5kcml2ZXJJbmZvID0ge1xuICAgICAgICAgIG5hbWU6IHRoaXMuX2NsaWVudE1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogdGhpcy5fY2xpZW50TWV0YWRhdGEudmVyc2lvblxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb25uZWN0aW9uUHJvbWlzZSA9IE1vbmdvQ2xpZW50LmNvbm5lY3QodGhpcy5fZGF0YWJhc2VVUkksIG9wdGlvbnMpLnRoZW4oXG4gICAgICAgIGNsaWVudCA9PiB7XG4gICAgICAgICAgdGhpcy5fY2xpZW50ID0gY2xpZW50O1xuICAgICAgICAgIHJldHVybiBjbGllbnQuZGIoY2xpZW50LnMub3B0aW9ucy5kYk5hbWUpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvblByb21pc2U7XG4gIH1cblxuICBfZ2V0QnVja2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0KCkudGhlbihkYXRhYmFzZSA9PiBuZXcgR3JpZEZTQnVja2V0KGRhdGFiYXNlKSk7XG4gIH1cblxuICAvLyBGb3IgYSBnaXZlbiBjb25maWcgb2JqZWN0LCBmaWxlbmFtZSwgYW5kIGRhdGEsIHN0b3JlIGEgZmlsZVxuICAvLyBSZXR1cm5zIGEgcHJvbWlzZVxuICBhc3luYyBjcmVhdGVGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGRhdGEsIGNvbnRlbnRUeXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBidWNrZXQgPSBhd2FpdCB0aGlzLl9nZXRCdWNrZXQoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBidWNrZXQub3BlblVwbG9hZFN0cmVhbShmaWxlbmFtZSwge1xuICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgfSk7XG5cbiAgICAvLyBJZiBkYXRhIGlzIGEgc3RyZWFtIGFuZCBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGJ1ZmZlciBmaXJzdFxuICAgIC8vIChBRVMtMjU2LUdDTSBuZWVkcyBjb21wbGV0ZSBkYXRhIGZvciBmb3JtYXQ6IFtlbmNyeXB0ZWRdW0lWXVthdXRoVGFnXSlcbiAgICBpZiAodHlwZW9mIGRhdGE/LnBpcGUgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5fZW5jcnlwdGlvbktleSAhPT0gbnVsbCkge1xuICAgICAgZGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgIGRhdGEub24oJ2RhdGEnLCBjaHVuayA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgICAgICBkYXRhLm9uKCdlbmQnLCAoKSA9PiByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSkpO1xuICAgICAgICBkYXRhLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGE/LnBpcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFBpcGUgcmVhZGFibGUgc3RyZWFtIGRpcmVjdGx5IGludG8gR3JpZEZTIHVwbG9hZCBzdHJlYW1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRhdGEucGlwZShzdHJlYW0pO1xuICAgICAgICBzdHJlYW0ub24oJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgICAgZGF0YS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgc3RyZWFtLmRlc3Ryb3koZXJyKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCdWZmZXIgcGF0aCAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gICAgaWYgKHRoaXMuX2VuY3J5cHRpb25LZXkgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGl2ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KTtcbiAgICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KHRoaXMuX2FsZ29yaXRobSwgdGhpcy5fZW5jcnlwdGlvbktleSwgaXYpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRSZXN1bHQgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgICBjaXBoZXIudXBkYXRlKGRhdGEpLFxuICAgICAgICAgIGNpcGhlci5maW5hbCgpLFxuICAgICAgICAgIGl2LFxuICAgICAgICAgIGNpcGhlci5nZXRBdXRoVGFnKCksXG4gICAgICAgIF0pO1xuICAgICAgICBhd2FpdCBzdHJlYW0ud3JpdGUoZW5jcnlwdGVkUmVzdWx0KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHN0cmVhbS53cml0ZShkYXRhKTtcbiAgICB9XG4gICAgc3RyZWFtLmVuZCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdHJlYW0ub24oJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGaWxlKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWNrZXQgPSBhd2FpdCB0aGlzLl9nZXRCdWNrZXQoKTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSBhd2FpdCBidWNrZXQuZmluZCh7IGZpbGVuYW1lIH0pLnRvQXJyYXkoKTtcbiAgICBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlTm90Rm91bmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgZG9jdW1lbnRzLm1hcChkb2MgPT4ge1xuICAgICAgICByZXR1cm4gYnVja2V0LmRlbGV0ZShkb2MuX2lkKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZpbGVEYXRhKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWNrZXQgPSBhd2FpdCB0aGlzLl9nZXRCdWNrZXQoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBidWNrZXQub3BlbkRvd25sb2FkU3RyZWFtQnlOYW1lKGZpbGVuYW1lKTtcbiAgICBzdHJlYW0ucmVhZCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIGRhdGEgPT4ge1xuICAgICAgICBjaHVua3MucHVzaChkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gICAgICAgIGlmICh0aGlzLl9lbmNyeXB0aW9uS2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhUYWdMb2NhdGlvbiA9IGRhdGEubGVuZ3RoIC0gMTY7XG4gICAgICAgICAgICBjb25zdCBpdkxvY2F0aW9uID0gZGF0YS5sZW5ndGggLSAzMjtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhUYWcgPSBkYXRhLnNsaWNlKGF1dGhUYWdMb2NhdGlvbik7XG4gICAgICAgICAgICBjb25zdCBpdiA9IGRhdGEuc2xpY2UoaXZMb2NhdGlvbiwgYXV0aFRhZ0xvY2F0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGRhdGEuc2xpY2UoMCwgaXZMb2NhdGlvbik7XG4gICAgICAgICAgICBjb25zdCBkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KHRoaXMuX2FsZ29yaXRobSwgdGhpcy5fZW5jcnlwdGlvbktleSwgaXYpO1xuICAgICAgICAgICAgZGVjaXBoZXIuc2V0QXV0aFRhZyhhdXRoVGFnKTtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2RlY2lwaGVyLnVwZGF0ZShlbmNyeXB0ZWQpLCBkZWNpcGhlci5maW5hbCgpXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWNyeXB0ZWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSk7XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJvdGF0ZUVuY3J5cHRpb25LZXkob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGZpbGVOYW1lcyA9IFtdO1xuICAgIGxldCBvbGRLZXlGaWxlQWRhcHRlciA9IHt9O1xuICAgIGNvbnN0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuX2dldEJ1Y2tldCgpO1xuICAgIGlmIChvcHRpb25zLm9sZEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvbGRLZXlGaWxlQWRhcHRlciA9IG5ldyBHcmlkRlNCdWNrZXRBZGFwdGVyKFxuICAgICAgICB0aGlzLl9kYXRhYmFzZVVSSSxcbiAgICAgICAgdGhpcy5fbW9uZ29PcHRpb25zLFxuICAgICAgICBvcHRpb25zLm9sZEtleVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2xkS2V5RmlsZUFkYXB0ZXIgPSBuZXcgR3JpZEZTQnVja2V0QWRhcHRlcih0aGlzLl9kYXRhYmFzZVVSSSwgdGhpcy5fbW9uZ29PcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZmlsZU5hbWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbGVOYW1lcyA9IG9wdGlvbnMuZmlsZU5hbWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlTmFtZXNJdGVyYXRvciA9IGF3YWl0IGJ1Y2tldC5maW5kKCkudG9BcnJheSgpO1xuICAgICAgZmlsZU5hbWVzSXRlcmF0b3IuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgZmlsZU5hbWVzLnB1c2goZmlsZS5maWxlbmFtZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGZpbGVOYW1lc05vdFJvdGF0ZWQgPSBmaWxlTmFtZXM7XG4gICAgY29uc3QgZmlsZU5hbWVzUm90YXRlZCA9IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwbGFpblRleHREYXRhID0gYXdhaXQgb2xkS2V5RmlsZUFkYXB0ZXIuZ2V0RmlsZURhdGEoZmlsZU5hbWUpO1xuICAgICAgICAvLyBPdmVyd3JpdGUgZmlsZSB3aXRoIGRhdGEgZW5jcnlwdGVkIHdpdGggbmV3IGtleVxuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUZpbGUoZmlsZU5hbWUsIHBsYWluVGV4dERhdGEpO1xuICAgICAgICBmaWxlTmFtZXNSb3RhdGVkLnB1c2goZmlsZU5hbWUpO1xuICAgICAgICBmaWxlTmFtZXNOb3RSb3RhdGVkID0gZmlsZU5hbWVzTm90Um90YXRlZC5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBmaWxlTmFtZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJvdGF0ZWQ6IGZpbGVOYW1lc1JvdGF0ZWQsIG5vdFJvdGF0ZWQ6IGZpbGVOYW1lc05vdFJvdGF0ZWQgfTtcbiAgfVxuXG4gIGdldEZpbGVMb2NhdGlvbihjb25maWcsIGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5tb3VudCArICcvZmlsZXMvJyArIGNvbmZpZy5hcHBsaWNhdGlvbklkICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGdldE1ldGFkYXRhKGZpbGVuYW1lKSB7XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5fZ2V0QnVja2V0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBidWNrZXQuZmluZCh7IGZpbGVuYW1lIH0pLnRvQXJyYXkoKTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHsgbWV0YWRhdGEgfSA9IGZpbGVzWzBdO1xuICAgIHJldHVybiB7IG1ldGFkYXRhIH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHJlcSwgcmVzLCBjb250ZW50VHlwZSkge1xuICAgIGNvbnN0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuX2dldEJ1Y2tldCgpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgYnVja2V0LmZpbmQoeyBmaWxlbmFtZSB9KS50b0FycmF5KCk7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlTm90Rm91bmQnKTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSByZXFcbiAgICAgIC5nZXQoJ1JhbmdlJylcbiAgICAgIC5yZXBsYWNlKC9ieXRlcz0vLCAnJylcbiAgICAgIC5zcGxpdCgnLScpO1xuICAgIGNvbnN0IHBhcnRpYWxzdGFydCA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHBhcnRpYWxlbmQgPSBwYXJ0c1sxXTtcblxuICAgIGNvbnN0IGZpbGVMZW5ndGggPSBmaWxlc1swXS5sZW5ndGg7XG4gICAgY29uc3QgZmlsZVN0YXJ0ID0gcGFyc2VJbnQocGFydGlhbHN0YXJ0LCAxMCk7XG4gICAgY29uc3QgZmlsZUVuZCA9IHBhcnRpYWxlbmQgPyBwYXJzZUludChwYXJ0aWFsZW5kLCAxMCkgOiBmaWxlTGVuZ3RoO1xuXG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5taW4oZmlsZVN0YXJ0IHx8IDAsIGZpbGVFbmQsIGZpbGVMZW5ndGgpO1xuICAgIGxldCBlbmQgPSBNYXRoLm1heChmaWxlU3RhcnQgfHwgMCwgZmlsZUVuZCkgKyAxIHx8IGZpbGVMZW5ndGg7XG4gICAgaWYgKGlzTmFOKGZpbGVTdGFydCkpIHtcbiAgICAgIHN0YXJ0ID0gZmlsZUxlbmd0aCAtIGVuZCArIDE7XG4gICAgICBlbmQgPSBmaWxlTGVuZ3RoO1xuICAgIH1cbiAgICBlbmQgPSBNYXRoLm1pbihlbmQsIGZpbGVMZW5ndGgpO1xuICAgIHN0YXJ0ID0gTWF0aC5tYXgoc3RhcnQsIDApO1xuXG4gICAgcmVzLnN0YXR1cygyMDYpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2VwdC1SYW5nZXMnLCAnYnl0ZXMnKTtcbiAgICByZXMuaGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIGVuZCAtIHN0YXJ0KTtcbiAgICByZXMuaGVhZGVyKCdDb250ZW50LVJhbmdlJywgJ2J5dGVzICcgKyBzdGFydCArICctJyArIGVuZCArICcvJyArIGZpbGVMZW5ndGgpO1xuICAgIHJlcy5oZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlKTtcbiAgICBjb25zdCBzdHJlYW0gPSBidWNrZXQub3BlbkRvd25sb2FkU3RyZWFtQnlOYW1lKGZpbGVuYW1lKTtcbiAgICBzdHJlYW0uc3RhcnQoc3RhcnQpO1xuICAgIGlmIChlbmQpIHtcbiAgICAgIHN0cmVhbS5lbmQoZW5kKTtcbiAgICB9XG4gICAgc3RyZWFtLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgcmVzLndyaXRlKGNodW5rKTtcbiAgICB9KTtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgZSA9PiB7XG4gICAgICByZXMuc3RhdHVzKDQwNCk7XG4gICAgICByZXMuc2VuZChlLm1lc3NhZ2UpO1xuICAgIH0pO1xuICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU2h1dGRvd24oKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5jbG9zZShmYWxzZSk7XG4gIH1cblxuICB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlRmlsZW5hbWUoZmlsZW5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdyaWRGU0J1Y2tldEFkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQVNBLElBQUFBLFFBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUMsdUJBQUEsQ0FBQUgsT0FBQTtBQUFzRSxTQUFBRyx3QkFBQUMsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUgsdUJBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FB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
@@ -47,6 +47,11 @@ class AdaptableController {
47
47
 
48
48
  // Makes sure the prototype matches
49
49
  const mismatches = Object.getOwnPropertyNames(Type.prototype).reduce((obj, key) => {
50
+ // Skip getters — they provide optional defaults that adapters don't need to implement
51
+ const descriptor = Object.getOwnPropertyDescriptor(Type.prototype, key);
52
+ if (descriptor && typeof descriptor.get === 'function') {
53
+ return obj;
54
+ }
50
55
  const adapterType = typeof adapter[key];
51
56
  const expectedType = typeof Type.prototype[key];
52
57
  if (adapterType !== expectedType) {
@@ -64,4 +69,4 @@ class AdaptableController {
64
69
  }
65
70
  exports.AdaptableController = AdaptableController;
66
71
  var _default = exports.default = AdaptableController;
67
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWRhcHRlciIsIlN5bWJvbCIsIkFkYXB0YWJsZUNvbnRyb2xsZXIiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJhcHBJZCIsIm9wdGlvbnMiLCJ2YWxpZGF0ZUFkYXB0ZXIiLCJleHBlY3RlZEFkYXB0ZXJUeXBlIiwiRXJyb3IiLCJzZWxmIiwiRXhwZWN0ZWRUeXBlIiwibmFtZSIsIlR5cGUiLCJtaXNtYXRjaGVzIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsInJlZHVjZSIsIm9iaiIsImtleSIsImFkYXB0ZXJUeXBlIiwiZXhwZWN0ZWRUeXBlIiwiZXhwZWN0ZWQiLCJhY3R1YWwiLCJrZXlzIiwibGVuZ3RoIiwiZXhwb3J0cyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9BZGFwdGFibGVDb250cm9sbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5BZGFwdGFibGVDb250cm9sbGVyLmpzXG5cbkFkYXB0YWJsZUNvbnRyb2xsZXIgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBjb250cm9sbGVyc1xudGhhdCBzdXBwb3J0IGFkYXB0ZXIsXG5UaGUgc3VwZXIgY2xhc3MgdGFrZXMgY2FyZSBvZiBjcmVhdGluZyB0aGUgcmlnaHQgaW5zdGFuY2UgZm9yIHRoZSBhZGFwdGVyXG5iYXNlZCBvbiB0aGUgcGFyYW1ldGVycyBwYXNzZWRcblxuICovXG5cbi8vIF9hZGFwdGVyIGlzIHByaXZhdGUsIHVzZSBTeW1ib2xcbnZhciBfYWRhcHRlciA9IFN5bWJvbCgpO1xuXG5leHBvcnQgY2xhc3MgQWRhcHRhYmxlQ29udHJvbGxlciB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXIsIGFwcElkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmFwcElkID0gYXBwSWQ7XG4gICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjtcbiAgfVxuXG4gIHNldCBhZGFwdGVyKGFkYXB0ZXIpIHtcbiAgICB0aGlzLnZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKTtcbiAgICB0aGlzW19hZGFwdGVyXSA9IGFkYXB0ZXI7XG4gIH1cblxuICBnZXQgYWRhcHRlcigpIHtcbiAgICByZXR1cm4gdGhpc1tfYWRhcHRlcl07XG4gIH1cblxuICBleHBlY3RlZEFkYXB0ZXJUeXBlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IGV4cGVjdGVkQWRhcHRlclR5cGUoKScpO1xuICB9XG5cbiAgdmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIpIHtcbiAgICBBZGFwdGFibGVDb250cm9sbGVyLnZhbGlkYXRlQWRhcHRlcihhZGFwdGVyLCB0aGlzKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUFkYXB0ZXIoYWRhcHRlciwgc2VsZiwgRXhwZWN0ZWRUeXBlKSB7XG4gICAgaWYgKCFhZGFwdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJyByZXF1aXJlcyBhbiBhZGFwdGVyJyk7XG4gICAgfVxuXG4gICAgY29uc3QgVHlwZSA9IEV4cGVjdGVkVHlwZSB8fCBzZWxmLmV4cGVjdGVkQWRhcHRlclR5cGUoKTtcbiAgICAvLyBBbGxvdyBza2lwcGluZyBmb3IgdGVzdGluZ1xuICAgIGlmICghVHlwZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1ha2VzIHN1cmUgdGhlIHByb3RvdHlwZSBtYXRjaGVzXG4gICAgY29uc3QgbWlzbWF0Y2hlcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFR5cGUucHJvdG90eXBlKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG4gICAgICBjb25zdCBhZGFwdGVyVHlwZSA9IHR5cGVvZiBhZGFwdGVyW2tleV07XG4gICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSB0eXBlb2YgVHlwZS5wcm90b3R5cGVba2V5XTtcbiAgICAgIGlmIChhZGFwdGVyVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgIG9ialtrZXldID0ge1xuICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZFR5cGUsXG4gICAgICAgICAgYWN0dWFsOiBhZGFwdGVyVHlwZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30pO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKG1pc21hdGNoZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkYXB0ZXIgcHJvdG90eXBlIGRvbid0IG1hdGNoIGV4cGVjdGVkIHByb3RvdHlwZVwiLCBhZGFwdGVyLCBtaXNtYXRjaGVzKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWRhcHRhYmxlQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxNQUFNLENBQUMsQ0FBQztBQUVoQixNQUFNQyxtQkFBbUIsQ0FBQztFQUMvQkMsV0FBV0EsQ0FBQ0MsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sRUFBRTtJQUNuQyxJQUFJLENBQUNBLE9BQU8sR0FBR0EsT0FBTztJQUN0QixJQUFJLENBQUNELEtBQUssR0FBR0EsS0FBSztJQUNsQixJQUFJLENBQUNELE9BQU8sR0FBR0EsT0FBTztFQUN4QjtFQUVBLElBQUlBLE9BQU9BLENBQUNBLE9BQU8sRUFBRTtJQUNuQixJQUFJLENBQUNHLGVBQWUsQ0FBQ0gsT0FBTyxDQUFDO0lBQzdCLElBQUksQ0FBQ0osUUFBUSxDQUFDLEdBQUdJLE9BQU87RUFDMUI7RUFFQSxJQUFJQSxPQUFPQSxDQUFBLEVBQUc7SUFDWixPQUFPLElBQUksQ0FBQ0osUUFBUSxDQUFDO0VBQ3ZCO0VBRUFRLG1CQUFtQkEsQ0FBQSxFQUFHO0lBQ3BCLE1BQU0sSUFBSUMsS0FBSyxDQUFDLG1EQUFtRCxDQUFDO0VBQ3RFO0VBRUFGLGVBQWVBLENBQUNILE9BQU8sRUFBRTtJQUN2QkYsbUJBQW1CLENBQUNLLGVBQWUsQ0FBQ0gsT0FBTyxFQUFFLElBQUksQ0FBQztFQUNwRDtFQUVBLE9BQU9HLGVBQWVBLENBQUNILE9BQU8sRUFBRU0sSUFBSSxFQUFFQyxZQUFZLEVBQUU7SUFDbEQsSUFBSSxDQUFDUCxPQUFPLEVBQUU7TUFDWixNQUFNLElBQUlLLEtBQUssQ0FBQyxJQUFJLENBQUNOLFdBQVcsQ0FBQ1MsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0lBQ2pFO0lBRUEsTUFBTUMsSUFBSSxHQUFHRixZQUFZLElBQUlELElBQUksQ0FBQ0YsbUJBQW1CLENBQUMsQ0FBQztJQUN2RDtJQUNBLElBQUksQ0FBQ0ssSUFBSSxFQUFFO01BQ1Q7SUFDRjs7SUFFQTtJQUNBLE1BQU1DLFVBQVUsR0FBR0MsTUFBTSxDQUFDQyxtQkFBbUIsQ0FBQ0gsSUFBSSxDQUFDSSxTQUFTLENBQUMsQ0FBQ0MsTUFBTSxDQUFDLENBQUNDLEdBQUcsRUFBRUMsR0FBRyxLQUFLO01BQ2pGLE1BQU1DLFdBQVcsR0FBRyxPQUFPakIsT0FBTyxDQUFDZ0IsR0FBRyxDQUFDO01BQ3ZDLE1BQU1FLFlBQVksR0FBRyxPQUFPVCxJQUFJLENBQUNJLFNBQVMsQ0FBQ0csR0FBRyxDQUFDO01BQy9DLElBQUlDLFdBQVcsS0FBS0MsWUFBWSxFQUFFO1FBQ2hDSCxHQUFHLENBQUNDLEdBQUcsQ0FBQyxHQUFHO1VBQ1RHLFFBQVEsRUFBRUQsWUFBWTtVQUN0QkUsTUFBTSxFQUFFSDtRQUNWLENBQUM7TUFDSDtNQUNBLE9BQU9GLEdBQUc7SUFDWixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFTixJQUFJSixNQUFNLENBQUNVLElBQUksQ0FBQ1gsVUFBVSxDQUFDLENBQUNZLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDdEMsTUFBTSxJQUFJakIsS0FBSyxDQUFDLGtEQUFrRCxFQUFFTCxPQUFPLEVBQUVVLFVBQVUsQ0FBQztJQUMxRjtFQUNGO0FBQ0Y7QUFBQ2EsT0FBQSxDQUFBekIsbUJBQUEsR0FBQUEsbUJBQUE7QUFBQSxJQUFBMEIsUUFBQSxHQUFBRCxPQUFBLENBQUFFLE9BQUEsR0FFYzNCLG1CQUFtQiIsImlnbm9yZUxpc3QiOltdfQ==
72
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWRhcHRlciIsIlN5bWJvbCIsIkFkYXB0YWJsZUNvbnRyb2xsZXIiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJhcHBJZCIsIm9wdGlvbnMiLCJ2YWxpZGF0ZUFkYXB0ZXIiLCJleHBlY3RlZEFkYXB0ZXJUeXBlIiwiRXJyb3IiLCJzZWxmIiwiRXhwZWN0ZWRUeXBlIiwibmFtZSIsIlR5cGUiLCJtaXNtYXRjaGVzIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsInJlZHVjZSIsIm9iaiIsImtleSIsImRlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJnZXQiLCJhZGFwdGVyVHlwZSIsImV4cGVjdGVkVHlwZSIsImV4cGVjdGVkIiwiYWN0dWFsIiwia2V5cyIsImxlbmd0aCIsImV4cG9ydHMiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvQ29udHJvbGxlcnMvQWRhcHRhYmxlQ29udHJvbGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQWRhcHRhYmxlQ29udHJvbGxlci5qc1xuXG5BZGFwdGFibGVDb250cm9sbGVyIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgY29udHJvbGxlcnNcbnRoYXQgc3VwcG9ydCBhZGFwdGVyLFxuVGhlIHN1cGVyIGNsYXNzIHRha2VzIGNhcmUgb2YgY3JlYXRpbmcgdGhlIHJpZ2h0IGluc3RhbmNlIGZvciB0aGUgYWRhcHRlclxuYmFzZWQgb24gdGhlIHBhcmFtZXRlcnMgcGFzc2VkXG5cbiAqL1xuXG4vLyBfYWRhcHRlciBpcyBwcml2YXRlLCB1c2UgU3ltYm9sXG52YXIgX2FkYXB0ZXIgPSBTeW1ib2woKTtcblxuZXhwb3J0IGNsYXNzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5hcHBJZCA9IGFwcElkO1xuICAgIHRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7XG4gIH1cblxuICBzZXQgYWRhcHRlcihhZGFwdGVyKSB7XG4gICAgdGhpcy52YWxpZGF0ZUFkYXB0ZXIoYWRhcHRlcik7XG4gICAgdGhpc1tfYWRhcHRlcl0gPSBhZGFwdGVyO1xuICB9XG5cbiAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXNbX2FkYXB0ZXJdO1xuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCBleHBlY3RlZEFkYXB0ZXJUeXBlKCknKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgQWRhcHRhYmxlQ29udHJvbGxlci52YWxpZGF0ZUFkYXB0ZXIoYWRhcHRlciwgdGhpcyk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIsIHNlbGYsIEV4cGVjdGVkVHlwZSkge1xuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSArICcgcmVxdWlyZXMgYW4gYWRhcHRlcicpO1xuICAgIH1cblxuICAgIGNvbnN0IFR5cGUgPSBFeHBlY3RlZFR5cGUgfHwgc2VsZi5leHBlY3RlZEFkYXB0ZXJUeXBlKCk7XG4gICAgLy8gQWxsb3cgc2tpcHBpbmcgZm9yIHRlc3RpbmdcbiAgICBpZiAoIVR5cGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNYWtlcyBzdXJlIHRoZSBwcm90b3R5cGUgbWF0Y2hlc1xuICAgIGNvbnN0IG1pc21hdGNoZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhUeXBlLnByb3RvdHlwZSkucmVkdWNlKChvYmosIGtleSkgPT4ge1xuICAgICAgLy8gU2tpcCBnZXR0ZXJzIOKAlCB0aGV5IHByb3ZpZGUgb3B0aW9uYWwgZGVmYXVsdHMgdGhhdCBhZGFwdGVycyBkb24ndCBuZWVkIHRvIGltcGxlbWVudFxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoVHlwZS5wcm90b3R5cGUsIGtleSk7XG4gICAgICBpZiAoZGVzY3JpcHRvciAmJiB0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFkYXB0ZXJUeXBlID0gdHlwZW9mIGFkYXB0ZXJba2V5XTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHR5cGVvZiBUeXBlLnByb3RvdHlwZVtrZXldO1xuICAgICAgaWYgKGFkYXB0ZXJUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgb2JqW2tleV0gPSB7XG4gICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkVHlwZSxcbiAgICAgICAgICBhY3R1YWw6IGFkYXB0ZXJUeXBlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMobWlzbWF0Y2hlcykubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRhcHRlciBwcm90b3R5cGUgZG9uJ3QgbWF0Y2ggZXhwZWN0ZWQgcHJvdG90eXBlXCIsIGFkYXB0ZXIsIG1pc21hdGNoZXMpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBZGFwdGFibGVDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJQSxRQUFRLEdBQUdDLE1BQU0sQ0FBQyxDQUFDO0FBRWhCLE1BQU1DLG1CQUFtQixDQUFDO0VBQy9CQyxXQUFXQSxDQUFDQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsT0FBTyxFQUFFO0lBQ25DLElBQUksQ0FBQ0EsT0FBTyxHQUFHQSxPQUFPO0lBQ3RCLElBQUksQ0FBQ0QsS0FBSyxHQUFHQSxLQUFLO0lBQ2xCLElBQUksQ0FBQ0QsT0FBTyxHQUFHQSxPQUFPO0VBQ3hCO0VBRUEsSUFBSUEsT0FBT0EsQ0FBQ0EsT0FBTyxFQUFFO0lBQ25CLElBQUksQ0FBQ0csZUFBZSxDQUFDSCxPQUFPLENBQUM7SUFDN0IsSUFBSSxDQUFDSixRQUFRLENBQUMsR0FBR0ksT0FBTztFQUMxQjtFQUVBLElBQUlBLE9BQU9BLENBQUEsRUFBRztJQUNaLE9BQU8sSUFBSSxDQUFDSixRQUFRLENBQUM7RUFDdkI7RUFFQVEsbUJBQW1CQSxDQUFBLEVBQUc7SUFDcEIsTUFBTSxJQUFJQyxLQUFLLENBQUMsbURBQW1ELENBQUM7RUFDdEU7RUFFQUYsZUFBZUEsQ0FBQ0gsT0FBTyxFQUFFO0lBQ3ZCRixtQkFBbUIsQ0FBQ0ssZUFBZSxDQUFDSCxPQUFPLEVBQUUsSUFBSSxDQUFDO0VBQ3BEO0VBRUEsT0FBT0csZUFBZUEsQ0FBQ0gsT0FBTyxFQUFFTSxJQUFJLEVBQUVDLFlBQVksRUFBRTtJQUNsRCxJQUFJLENBQUNQLE9BQU8sRUFBRTtNQUNaLE1BQU0sSUFBSUssS0FBSyxDQUFDLElBQUksQ0FBQ04sV0FBVyxDQUFDUyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDakU7SUFFQSxNQUFNQyxJQUFJLEdBQUdGLFlBQVksSUFBSUQsSUFBSSxDQUFDRixtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZEO0lBQ0EsSUFBSSxDQUFDSyxJQUFJLEVBQUU7TUFDVDtJQUNGOztJQUVBO0lBQ0EsTUFBTUMsVUFBVSxHQUFHQyxNQUFNLENBQUNDLG1CQUFtQixDQUFDSCxJQUFJLENBQUNJLFNBQVMsQ0FBQyxDQUFDQyxNQUFNLENBQUMsQ0FBQ0MsR0FBRyxFQUFFQyxHQUFHLEtBQUs7TUFDakY7TUFDQSxNQUFNQyxVQUFVLEdBQUdOLE1BQU0sQ0FBQ08sd0JBQXdCLENBQUNULElBQUksQ0FBQ0ksU0FBUyxFQUFFRyxHQUFHLENBQUM7TUFDdkUsSUFBSUMsVUFBVSxJQUFJLE9BQU9BLFVBQVUsQ0FBQ0UsR0FBRyxLQUFLLFVBQVUsRUFBRTtRQUN0RCxPQUFPSixHQUFHO01BQ1o7TUFDQSxNQUFNSyxXQUFXLEdBQUcsT0FBT3BCLE9BQU8sQ0FBQ2dCLEdBQUcsQ0FBQztNQUN2QyxNQUFNSyxZQUFZLEdBQUcsT0FBT1osSUFBSSxDQUFDSSxTQUFTLENBQUNHLEdBQUcsQ0FBQztNQUMvQyxJQUFJSSxXQUFXLEtBQUtDLFlBQVksRUFBRTtRQUNoQ04sR0FBRyxDQUFDQyxHQUFHLENBQUMsR0FBRztVQUNUTSxRQUFRLEVBQUVELFlBQVk7VUFDdEJFLE1BQU0sRUFBRUg7UUFDVixDQUFDO01BQ0g7TUFDQSxPQUFPTCxHQUFHO0lBQ1osQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRU4sSUFBSUosTUFBTSxDQUFDYSxJQUFJLENBQUNkLFVBQVUsQ0FBQyxDQUFDZSxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQ3RDLE1BQU0sSUFBSXBCLEtBQUssQ0FBQyxrREFBa0QsRUFBRUwsT0FBTyxFQUFFVSxVQUFVLENBQUM7SUFDMUY7RUFDRjtBQUNGO0FBQUNnQixPQUFBLENBQUE1QixtQkFBQSxHQUFBQSxtQkFBQTtBQUFBLElBQUE2QixRQUFBLEdBQUFELE9BQUEsQ0FBQUUsT0FBQSxHQUVjOUIsbUJBQW1CIiwiaWdub3JlTGlzdCI6W119
@@ -29,6 +29,16 @@ class FilesController extends _AdaptableController.default {
29
29
  if (!this.options.preserveFileName) {
30
30
  filename = (0, _cryptoUtils.randomHexString)(32) + '_' + filename;
31
31
  }
32
+
33
+ // Fallback: buffer stream for adapters that don't support streaming
34
+ if (typeof data?.pipe === 'function' && !this.adapter.supportsStreaming) {
35
+ data = await new Promise((resolve, reject) => {
36
+ const chunks = [];
37
+ data.on('data', chunk => chunks.push(chunk));
38
+ data.on('end', () => resolve(Buffer.concat(chunks)));
39
+ data.on('error', reject);
40
+ });
41
+ }
32
42
  const location = await this.adapter.getFileLocation(config, filename);
33
43
  await this.adapter.createFile(filename, data, contentType, options);
34
44
  return {
@@ -103,4 +113,4 @@ class FilesController extends _AdaptableController.default {
103
113
  }
104
114
  exports.FilesController = FilesController;
105
115
  var _default = exports.default = FilesController;
106
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvVXRpbHMiLCJyZXF1aXJlIiwiX0FkYXB0YWJsZUNvbnRyb2xsZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0ZpbGVzQWRhcHRlciIsIl9wYXRoIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiUGFyc2UiLCJsZWdhY3lGaWxlc1JlZ2V4IiwiUmVnRXhwIiwiRmlsZXNDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImdldEZpbGVEYXRhIiwiY29uZmlnIiwiZmlsZW5hbWUiLCJhZGFwdGVyIiwiY3JlYXRlRmlsZSIsImRhdGEiLCJjb250ZW50VHlwZSIsIm9wdGlvbnMiLCJleHRuYW1lIiwicGF0aCIsImhhc0V4dGVuc2lvbiIsImxlbmd0aCIsIm1pbWUiLCJnZXRFeHRlbnNpb24iLCJnZXRUeXBlIiwicHJlc2VydmVGaWxlTmFtZSIsInJhbmRvbUhleFN0cmluZyIsImxvY2F0aW9uIiwiZ2V0RmlsZUxvY2F0aW9uIiwidXJsIiwibmFtZSIsImRlbGV0ZUZpbGUiLCJnZXRNZXRhZGF0YSIsIlByb21pc2UiLCJyZXNvbHZlIiwiZXhwYW5kRmlsZXNJbk9iamVjdCIsIm9iamVjdCIsIkFycmF5IiwicHJvbWlzZXMiLCJtYXAiLCJvYmoiLCJhbGwiLCJrZXkiLCJmaWxlT2JqZWN0IiwiZmlsZUtleSIsInVuZGVmaW5lZCIsImluZGV4T2YiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ0ZXN0IiwiZXhwZWN0ZWRBZGFwdGVyVHlwZSIsIkZpbGVzQWRhcHRlciIsImhhbmRsZUZpbGVTdHJlYW0iLCJyZXEiLCJyZXMiLCJ2YWxpZGF0ZUZpbGVuYW1lIiwiZXJyb3IiLCJFcnJvciIsIklOVkFMSURfRklMRV9OQU1FIiwiZXhwb3J0cyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbnRyb2xsZXJzL0ZpbGVzQ29udHJvbGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlc0NvbnRyb2xsZXIuanNcbmltcG9ydCB7IHJhbmRvbUhleFN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCBBZGFwdGFibGVDb250cm9sbGVyIGZyb20gJy4vQWRhcHRhYmxlQ29udHJvbGxlcic7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpbGVuYW1lLCBGaWxlc0FkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9GaWxlcy9GaWxlc0FkYXB0ZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5jb25zdCBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcblxuY29uc3QgbGVnYWN5RmlsZXNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9LS4qJ1xuKTtcblxuZXhwb3J0IGNsYXNzIEZpbGVzQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBnZXRGaWxlRGF0YShjb25maWcsIGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRGaWxlRGF0YShmaWxlbmFtZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaWxlKGNvbmZpZywgZmlsZW5hbWUsIGRhdGEsIGNvbnRlbnRUeXBlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZXh0bmFtZSA9IHBhdGguZXh0bmFtZShmaWxlbmFtZSk7XG5cbiAgICBjb25zdCBoYXNFeHRlbnNpb24gPSBleHRuYW1lLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbWltZSA9IChhd2FpdCBpbXBvcnQoJ21pbWUnKSkuZGVmYXVsdFxuICAgIGlmICghaGFzRXh0ZW5zaW9uICYmIGNvbnRlbnRUeXBlICYmIG1pbWUuZ2V0RXh0ZW5zaW9uKGNvbnRlbnRUeXBlKSkge1xuICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSArICcuJyArIG1pbWUuZ2V0RXh0ZW5zaW9uKGNvbnRlbnRUeXBlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0V4dGVuc2lvbiAmJiAhY29udGVudFR5cGUpIHtcbiAgICAgIGNvbnRlbnRUeXBlID0gbWltZS5nZXRUeXBlKGZpbGVuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wcmVzZXJ2ZUZpbGVOYW1lKSB7XG4gICAgICBmaWxlbmFtZSA9IHJhbmRvbUhleFN0cmluZygzMikgKyAnXycgKyBmaWxlbmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IGF3YWl0IHRoaXMuYWRhcHRlci5nZXRGaWxlTG9jYXRpb24oY29uZmlnLCBmaWxlbmFtZSk7XG4gICAgYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUZpbGUoZmlsZW5hbWUsIGRhdGEsIGNvbnRlbnRUeXBlLCBvcHRpb25zKTtcbiAgICByZXR1cm4ge1xuICAgICAgdXJsOiBsb2NhdGlvbixcbiAgICAgIG5hbWU6IGZpbGVuYW1lLFxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZUZpbGUoY29uZmlnLCBmaWxlbmFtZSkge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZGVsZXRlRmlsZShmaWxlbmFtZSk7XG4gIH1cblxuICBnZXRNZXRhZGF0YShmaWxlbmFtZSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5hZGFwdGVyLmdldE1ldGFkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmdldE1ldGFkYXRhKGZpbGVuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBmaWxlIHJlZmVyZW5jZXMgaW4gUkVTVC1mb3JtYXQgb2JqZWN0IGFuZCBhZGRzIHRoZSB1cmwga2V5XG4gICAqIHdpdGggdGhlIGN1cnJlbnQgbW91bnQgcG9pbnQgYW5kIGFwcCBpZC5cbiAgICogT2JqZWN0IG1heSBiZSBhIHNpbmdsZSBvYmplY3Qgb3IgbGlzdCBvZiBSRVNULWZvcm1hdCBvYmplY3RzLlxuICAgKi9cbiAgYXN5bmMgZXhwYW5kRmlsZXNJbk9iamVjdChjb25maWcsIG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSBvYmplY3QubWFwKG9iaiA9PiB0aGlzLmV4cGFuZEZpbGVzSW5PYmplY3QoY29uZmlnLCBvYmopKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgY29uc3QgZmlsZU9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKGZpbGVPYmplY3QgJiYgZmlsZU9iamVjdFsnX190eXBlJ10gPT09ICdGaWxlJykge1xuICAgICAgICBpZiAoZmlsZU9iamVjdFsndXJsJ10pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGVPYmplY3RbJ25hbWUnXTtcbiAgICAgICAgLy8gYWxsIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIFwidGZzcy1cIiBzaG91bGQgYmUgZnJvbSBmaWxlcy5wYXJzZXRmc3MuY29tXG4gICAgICAgIC8vIGFsbCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhIFwiLVwiIHNlcGVyYXRlZCBVVUlEIHNob3VsZCBiZSBmcm9tIGZpbGVzLnBhcnNlLmNvbVxuICAgICAgICAvLyBhbGwgb3RoZXIgZmlsZW5hbWVzIGhhdmUgYmVlbiBtaWdyYXRlZCBvciBjcmVhdGVkIGZyb20gUGFyc2UgU2VydmVyXG4gICAgICAgIGlmIChjb25maWcuZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZmlsZU9iamVjdFsndXJsJ10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZ2V0RmlsZUxvY2F0aW9uKGNvbmZpZywgZmlsZW5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChmaWxlbmFtZS5pbmRleE9mKCd0ZnNzLScpID09PSAwKSB7XG4gICAgICAgICAgICBmaWxlT2JqZWN0Wyd1cmwnXSA9XG4gICAgICAgICAgICAgICdodHRwOi8vZmlsZXMucGFyc2V0ZnNzLmNvbS8nICsgY29uZmlnLmZpbGVLZXkgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobGVnYWN5RmlsZXNSZWdleC50ZXN0KGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgZmlsZU9iamVjdFsndXJsJ10gPVxuICAgICAgICAgICAgICAnaHR0cDovL2ZpbGVzLnBhcnNlLmNvbS8nICsgY29uZmlnLmZpbGVLZXkgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWxlT2JqZWN0Wyd1cmwnXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5nZXRGaWxlTG9jYXRpb24oY29uZmlnLCBmaWxlbmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gRmlsZXNBZGFwdGVyO1xuICB9XG5cbiAgaGFuZGxlRmlsZVN0cmVhbShjb25maWcsIGZpbGVuYW1lLCByZXEsIHJlcywgY29udGVudFR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmhhbmRsZUZpbGVTdHJlYW0oZmlsZW5hbWUsIHJlcSwgcmVzLCBjb250ZW50VHlwZSk7XG4gIH1cblxuICB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmFkYXB0ZXIudmFsaWRhdGVGaWxlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmFkYXB0ZXIudmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSk7XG4gICAgICBpZiAodHlwZW9mIGVycm9yICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfRklMRV9OQU1FLCBlcnJvcik7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlc0NvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLElBQUFBLFlBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLG9CQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxLQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFBd0IsU0FBQUUsdUJBQUFHLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFKeEI7O0FBS0EsTUFBTUcsS0FBSyxHQUFHUixPQUFPLENBQUMsWUFBWSxDQUFDLENBQUNRLEtBQUs7QUFFekMsTUFBTUMsZ0JBQWdCLEdBQUcsSUFBSUMsTUFBTSxDQUNqQyxpRkFDRixDQUFDO0FBRU0sTUFBTUMsZUFBZSxTQUFTQyw0QkFBbUIsQ0FBQztFQUN2REMsV0FBV0EsQ0FBQ0MsTUFBTSxFQUFFQyxRQUFRLEVBQUU7SUFDNUIsT0FBTyxJQUFJLENBQUNDLE9BQU8sQ0FBQ0gsV0FBVyxDQUFDRSxRQUFRLENBQUM7RUFDM0M7RUFFQSxNQUFNRSxVQUFVQSxDQUFDSCxNQUFNLEVBQUVDLFFBQVEsRUFBRUcsSUFBSSxFQUFFQyxXQUFXLEVBQUVDLE9BQU8sRUFBRTtJQUM3RCxNQUFNQyxPQUFPLEdBQUdDLGFBQUksQ0FBQ0QsT0FBTyxDQUFDTixRQUFRLENBQUM7SUFFdEMsTUFBTVEsWUFBWSxHQUFHRixPQUFPLENBQUNHLE1BQU0sR0FBRyxDQUFDO0lBQ3ZDLE1BQU1DLElBQUksR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFbEIsT0FBTztJQUMzQyxJQUFJLENBQUNnQixZQUFZLElBQUlKLFdBQVcsSUFBSU0sSUFBSSxDQUFDQyxZQUFZLENBQUNQLFdBQVcsQ0FBQyxFQUFFO01BQ2xFSixRQUFRLEdBQUdBLFFBQVEsR0FBRyxHQUFHLEdBQUdVLElBQUksQ0FBQ0MsWUFBWSxDQUFDUCxXQUFXLENBQUM7SUFDNUQsQ0FBQyxNQUFNLElBQUlJLFlBQVksSUFBSSxDQUFDSixXQUFXLEVBQUU7TUFDdkNBLFdBQVcsR0FBR00sSUFBSSxDQUFDRSxPQUFPLENBQUNaLFFBQVEsQ0FBQztJQUN0QztJQUVBLElBQUksQ0FBQyxJQUFJLENBQUNLLE9BQU8sQ0FBQ1EsZ0JBQWdCLEVBQUU7TUFDbENiLFFBQVEsR0FBRyxJQUFBYyw0QkFBZSxFQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBR2QsUUFBUTtJQUNqRDtJQUVBLE1BQU1lLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQ2QsT0FBTyxDQUFDZSxlQUFlLENBQUNqQixNQUFNLEVBQUVDLFFBQVEsQ0FBQztJQUNyRSxNQUFNLElBQUksQ0FBQ0MsT0FBTyxDQUFDQyxVQUFVLENBQUNGLFFBQVEsRUFBRUcsSUFBSSxFQUFFQyxXQUFXLEVBQUVDLE9BQU8sQ0FBQztJQUNuRSxPQUFPO01BQ0xZLEdBQUcsRUFBRUYsUUFBUTtNQUNiRyxJQUFJLEVBQUVsQjtJQUNSLENBQUM7RUFDSDtFQUVBbUIsVUFBVUEsQ0FBQ3BCLE1BQU0sRUFBRUMsUUFBUSxFQUFFO0lBQzNCLE9BQU8sSUFBSSxDQUFDQyxPQUFPLENBQUNrQixVQUFVLENBQUNuQixRQUFRLENBQUM7RUFDMUM7RUFFQW9CLFdBQVdBLENBQUNwQixRQUFRLEVBQUU7SUFDcEIsSUFBSSxPQUFPLElBQUksQ0FBQ0MsT0FBTyxDQUFDbUIsV0FBVyxLQUFLLFVBQVUsRUFBRTtNQUNsRCxPQUFPLElBQUksQ0FBQ25CLE9BQU8sQ0FBQ21CLFdBQVcsQ0FBQ3BCLFFBQVEsQ0FBQztJQUMzQztJQUNBLE9BQU9xQixPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM1Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsTUFBTUMsbUJBQW1CQSxDQUFDeEIsTUFBTSxFQUFFeUIsTUFBTSxFQUFFO0lBQ3hDLElBQUlBLE1BQU0sWUFBWUMsS0FBSyxFQUFFO01BQzNCLE1BQU1DLFFBQVEsR0FBR0YsTUFBTSxDQUFDRyxHQUFHLENBQUNDLEdBQUcsSUFBSSxJQUFJLENBQUNMLG1CQUFtQixDQUFDeEIsTUFBTSxFQUFFNkIsR0FBRyxDQUFDLENBQUM7TUFDekUsTUFBTVAsT0FBTyxDQUFDUSxHQUFHLENBQUNILFFBQVEsQ0FBQztNQUMzQjtJQUNGO0lBQ0EsSUFBSSxPQUFPRixNQUFNLEtBQUssUUFBUSxFQUFFO01BQzlCO0lBQ0Y7SUFDQSxLQUFLLE1BQU1NLEdBQUcsSUFBSU4sTUFBTSxFQUFFO01BQ3hCLE1BQU1PLFVBQVUsR0FBR1AsTUFBTSxDQUFDTSxHQUFHLENBQUM7TUFDOUIsSUFBSUMsVUFBVSxJQUFJQSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssTUFBTSxFQUFFO1FBQ2pELElBQUlBLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtVQUNyQjtRQUNGO1FBQ0EsTUFBTS9CLFFBQVEsR0FBRytCLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDbkM7UUFDQTtRQUNBO1FBQ0EsSUFBSWhDLE1BQU0sQ0FBQ2lDLE9BQU8sS0FBS0MsU0FBUyxFQUFFO1VBQ2hDRixVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUM5QixPQUFPLENBQUNlLGVBQWUsQ0FBQ2pCLE1BQU0sRUFBRUMsUUFBUSxDQUFDO1FBQzFFLENBQUMsTUFBTTtVQUNMLElBQUlBLFFBQVEsQ0FBQ2tDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkNILFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FDZiw2QkFBNkIsR0FBR2hDLE1BQU0sQ0FBQ2lDLE9BQU8sR0FBRyxHQUFHLEdBQUdHLGtCQUFrQixDQUFDbkMsUUFBUSxDQUFDO1VBQ3ZGLENBQUMsTUFBTSxJQUFJTixnQkFBZ0IsQ0FBQzBDLElBQUksQ0FBQ3BDLFFBQVEsQ0FBQyxFQUFFO1lBQzFDK0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUNmLHlCQUF5QixHQUFHaEMsTUFBTSxDQUFDaUMsT0FBTyxHQUFHLEdBQUcsR0FBR0csa0JBQWtCLENBQUNuQyxRQUFRLENBQUM7VUFDbkYsQ0FBQyxNQUFNO1lBQ0wrQixVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUM5QixPQUFPLENBQUNlLGVBQWUsQ0FBQ2pCLE1BQU0sRUFBRUMsUUFBUSxDQUFDO1VBQzFFO1FBQ0Y7TUFDRjtJQUNGO0VBQ0Y7RUFFQXFDLG1CQUFtQkEsQ0FBQSxFQUFHO0lBQ3BCLE9BQU9DLDBCQUFZO0VBQ3JCO0VBRUFDLGdCQUFnQkEsQ0FBQ3hDLE1BQU0sRUFBRUMsUUFBUSxFQUFFd0MsR0FBRyxFQUFFQyxHQUFHLEVBQUVyQyxXQUFXLEVBQUU7SUFDeEQsT0FBTyxJQUFJLENBQUNILE9BQU8sQ0FBQ3NDLGdCQUFnQixDQUFDdkMsUUFBUSxFQUFFd0MsR0FBRyxFQUFFQyxHQUFHLEVBQUVyQyxXQUFXLENBQUM7RUFDdkU7RUFFQXNDLGdCQUFnQkEsQ0FBQzFDLFFBQVEsRUFBRTtJQUN6QixJQUFJLE9BQU8sSUFBSSxDQUFDQyxPQUFPLENBQUN5QyxnQkFBZ0IsS0FBSyxVQUFVLEVBQUU7TUFDdkQsTUFBTUMsS0FBSyxHQUFHLElBQUksQ0FBQzFDLE9BQU8sQ0FBQ3lDLGdCQUFnQixDQUFDMUMsUUFBUSxDQUFDO01BQ3JELElBQUksT0FBTzJDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBT0EsS0FBSztNQUNkO01BQ0EsT0FBTyxJQUFJbEQsS0FBSyxDQUFDbUQsS0FBSyxDQUFDbkQsS0FBSyxDQUFDbUQsS0FBSyxDQUFDQyxpQkFBaUIsRUFBRUYsS0FBSyxDQUFDO0lBQzlEO0lBQ0EsT0FBTyxJQUFBRCw4QkFBZ0IsRUFBQzFDLFFBQVEsQ0FBQztFQUNuQztBQUNGO0FBQUM4QyxPQUFBLENBQUFsRCxlQUFBLEdBQUFBLGVBQUE7QUFBQSxJQUFBbUQsUUFBQSxHQUFBRCxPQUFBLENBQUF0RCxPQUFBLEdBRWNJLGVBQWUiLCJpZ25vcmVMaXN0IjpbXX0=
116
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvVXRpbHMiLCJyZXF1aXJlIiwiX0FkYXB0YWJsZUNvbnRyb2xsZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0ZpbGVzQWRhcHRlciIsIl9wYXRoIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiUGFyc2UiLCJsZWdhY3lGaWxlc1JlZ2V4IiwiUmVnRXhwIiwiRmlsZXNDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImdldEZpbGVEYXRhIiwiY29uZmlnIiwiZmlsZW5hbWUiLCJhZGFwdGVyIiwiY3JlYXRlRmlsZSIsImRhdGEiLCJjb250ZW50VHlwZSIsIm9wdGlvbnMiLCJleHRuYW1lIiwicGF0aCIsImhhc0V4dGVuc2lvbiIsImxlbmd0aCIsIm1pbWUiLCJnZXRFeHRlbnNpb24iLCJnZXRUeXBlIiwicHJlc2VydmVGaWxlTmFtZSIsInJhbmRvbUhleFN0cmluZyIsInBpcGUiLCJzdXBwb3J0c1N0cmVhbWluZyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY2h1bmtzIiwib24iLCJjaHVuayIsInB1c2giLCJCdWZmZXIiLCJjb25jYXQiLCJsb2NhdGlvbiIsImdldEZpbGVMb2NhdGlvbiIsInVybCIsIm5hbWUiLCJkZWxldGVGaWxlIiwiZ2V0TWV0YWRhdGEiLCJleHBhbmRGaWxlc0luT2JqZWN0Iiwib2JqZWN0IiwiQXJyYXkiLCJwcm9taXNlcyIsIm1hcCIsIm9iaiIsImFsbCIsImtleSIsImZpbGVPYmplY3QiLCJmaWxlS2V5IiwidW5kZWZpbmVkIiwiaW5kZXhPZiIsImVuY29kZVVSSUNvbXBvbmVudCIsInRlc3QiLCJleHBlY3RlZEFkYXB0ZXJUeXBlIiwiRmlsZXNBZGFwdGVyIiwiaGFuZGxlRmlsZVN0cmVhbSIsInJlcSIsInJlcyIsInZhbGlkYXRlRmlsZW5hbWUiLCJlcnJvciIsIkVycm9yIiwiSU5WQUxJRF9GSUxFX05BTUUiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvQ29udHJvbGxlcnMvRmlsZXNDb250cm9sbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGVzQ29udHJvbGxlci5qc1xuaW1wb3J0IHsgcmFuZG9tSGV4U3RyaW5nIH0gZnJvbSAnLi4vY3J5cHRvVXRpbHMnO1xuaW1wb3J0IEFkYXB0YWJsZUNvbnRyb2xsZXIgZnJvbSAnLi9BZGFwdGFibGVDb250cm9sbGVyJztcbmltcG9ydCB7IHZhbGlkYXRlRmlsZW5hbWUsIEZpbGVzQWRhcHRlciB9IGZyb20gJy4uL0FkYXB0ZXJzL0ZpbGVzL0ZpbGVzQWRhcHRlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmNvbnN0IFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuXG5jb25zdCBsZWdhY3lGaWxlc1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0tLionXG4pO1xuXG5leHBvcnQgY2xhc3MgRmlsZXNDb250cm9sbGVyIGV4dGVuZHMgQWRhcHRhYmxlQ29udHJvbGxlciB7XG4gIGdldEZpbGVEYXRhKGNvbmZpZywgZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmdldEZpbGVEYXRhKGZpbGVuYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZpbGUoY29uZmlnLCBmaWxlbmFtZSwgZGF0YSwgY29udGVudFR5cGUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBleHRuYW1lID0gcGF0aC5leHRuYW1lKGZpbGVuYW1lKTtcblxuICAgIGNvbnN0IGhhc0V4dGVuc2lvbiA9IGV4dG5hbWUubGVuZ3RoID4gMDtcbiAgICBjb25zdCBtaW1lID0gKGF3YWl0IGltcG9ydCgnbWltZScpKS5kZWZhdWx0XG4gICAgaWYgKCFoYXNFeHRlbnNpb24gJiYgY29udGVudFR5cGUgJiYgbWltZS5nZXRFeHRlbnNpb24oY29udGVudFR5cGUpKSB7XG4gICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgJy4nICsgbWltZS5nZXRFeHRlbnNpb24oY29udGVudFR5cGUpO1xuICAgIH0gZWxzZSBpZiAoaGFzRXh0ZW5zaW9uICYmICFjb250ZW50VHlwZSkge1xuICAgICAgY29udGVudFR5cGUgPSBtaW1lLmdldFR5cGUoZmlsZW5hbWUpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRpb25zLnByZXNlcnZlRmlsZU5hbWUpIHtcbiAgICAgIGZpbGVuYW1lID0gcmFuZG9tSGV4U3RyaW5nKDMyKSArICdfJyArIGZpbGVuYW1lO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBidWZmZXIgc3RyZWFtIGZvciBhZGFwdGVycyB0aGF0IGRvbid0IHN1cHBvcnQgc3RyZWFtaW5nXG4gICAgaWYgKHR5cGVvZiBkYXRhPy5waXBlID09PSAnZnVuY3Rpb24nICYmICF0aGlzLmFkYXB0ZXIuc3VwcG9ydHNTdHJlYW1pbmcpIHtcbiAgICAgIGRhdGEgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAgICBkYXRhLm9uKCdkYXRhJywgY2h1bmsgPT4gY2h1bmtzLnB1c2goY2h1bmspKTtcbiAgICAgICAgZGF0YS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykpKTtcbiAgICAgICAgZGF0YS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYXRpb24gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZ2V0RmlsZUxvY2F0aW9uKGNvbmZpZywgZmlsZW5hbWUpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVGaWxlKGZpbGVuYW1lLCBkYXRhLCBjb250ZW50VHlwZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogbG9jYXRpb24sXG4gICAgICBuYW1lOiBmaWxlbmFtZSxcbiAgICB9XG4gIH1cblxuICBkZWxldGVGaWxlKGNvbmZpZywgZmlsZW5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmRlbGV0ZUZpbGUoZmlsZW5hbWUpO1xuICB9XG5cbiAgZ2V0TWV0YWRhdGEoZmlsZW5hbWUpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuYWRhcHRlci5nZXRNZXRhZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRNZXRhZGF0YShmaWxlbmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZmlsZSByZWZlcmVuY2VzIGluIFJFU1QtZm9ybWF0IG9iamVjdCBhbmQgYWRkcyB0aGUgdXJsIGtleVxuICAgKiB3aXRoIHRoZSBjdXJyZW50IG1vdW50IHBvaW50IGFuZCBhcHAgaWQuXG4gICAqIE9iamVjdCBtYXkgYmUgYSBzaW5nbGUgb2JqZWN0IG9yIGxpc3Qgb2YgUkVTVC1mb3JtYXQgb2JqZWN0cy5cbiAgICovXG4gIGFzeW5jIGV4cGFuZEZpbGVzSW5PYmplY3QoY29uZmlnLCBvYmplY3QpIHtcbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGNvbnN0IHByb21pc2VzID0gb2JqZWN0Lm1hcChvYmogPT4gdGhpcy5leHBhbmRGaWxlc0luT2JqZWN0KGNvbmZpZywgb2JqKSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGNvbnN0IGZpbGVPYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmIChmaWxlT2JqZWN0ICYmIGZpbGVPYmplY3RbJ19fdHlwZSddID09PSAnRmlsZScpIHtcbiAgICAgICAgaWYgKGZpbGVPYmplY3RbJ3VybCddKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBmaWxlT2JqZWN0WyduYW1lJ107XG4gICAgICAgIC8vIGFsbCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBcInRmc3MtXCIgc2hvdWxkIGJlIGZyb20gZmlsZXMucGFyc2V0ZnNzLmNvbVxuICAgICAgICAvLyBhbGwgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYSBcIi1cIiBzZXBlcmF0ZWQgVVVJRCBzaG91bGQgYmUgZnJvbSBmaWxlcy5wYXJzZS5jb21cbiAgICAgICAgLy8gYWxsIG90aGVyIGZpbGVuYW1lcyBoYXZlIGJlZW4gbWlncmF0ZWQgb3IgY3JlYXRlZCBmcm9tIFBhcnNlIFNlcnZlclxuICAgICAgICBpZiAoY29uZmlnLmZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZpbGVPYmplY3RbJ3VybCddID0gYXdhaXQgdGhpcy5hZGFwdGVyLmdldEZpbGVMb2NhdGlvbihjb25maWcsIGZpbGVuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZigndGZzcy0nKSA9PT0gMCkge1xuICAgICAgICAgICAgZmlsZU9iamVjdFsndXJsJ10gPVxuICAgICAgICAgICAgICAnaHR0cDovL2ZpbGVzLnBhcnNldGZzcy5jb20vJyArIGNvbmZpZy5maWxlS2V5ICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGxlZ2FjeUZpbGVzUmVnZXgudGVzdChmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgIGZpbGVPYmplY3RbJ3VybCddID1cbiAgICAgICAgICAgICAgJ2h0dHA6Ly9maWxlcy5wYXJzZS5jb20vJyArIGNvbmZpZy5maWxlS2V5ICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsZU9iamVjdFsndXJsJ10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZ2V0RmlsZUxvY2F0aW9uKGNvbmZpZywgZmlsZW5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4cGVjdGVkQWRhcHRlclR5cGUoKSB7XG4gICAgcmV0dXJuIEZpbGVzQWRhcHRlcjtcbiAgfVxuXG4gIGhhbmRsZUZpbGVTdHJlYW0oY29uZmlnLCBmaWxlbmFtZSwgcmVxLCByZXMsIGNvbnRlbnRUeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5oYW5kbGVGaWxlU3RyZWFtKGZpbGVuYW1lLCByZXEsIHJlcywgY29udGVudFR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5hZGFwdGVyLnZhbGlkYXRlRmlsZW5hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5hZGFwdGVyLnZhbGlkYXRlRmlsZW5hbWUoZmlsZW5hbWUpO1xuICAgICAgaWYgKHR5cGVvZiBlcnJvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0ZJTEVfTkFNRSwgZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsZXNDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSxZQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxvQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsYUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQXdC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LEtBQUssQ0FBQyxFQUFFO1lBQ25DSCxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQ2YsNkJBQTZCLEdBQUd6QyxNQUFNLENBQUMwQyxPQUFPLEdBQUcsR0FBRyxHQUFHRyxrQkFBa0IsQ0FBQzVDLFFBQVEsQ0FBQztVQUN2RixDQUFDLE1BQU0sSUFBSU4sZ0JBQWdCLENBQUNtRCxJQUFJLENBQUM3QyxRQUFRLENBQUMsRUFBRTtZQUMxQ3dDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FDZix5QkFBeUIsR0FBR3pDLE1BQU0sQ0FBQzBDLE9BQU8sR0FBRyxHQUFHLEdBQUdHLGtCQUFrQixDQUFDNUMsUUFBUSxDQUFDO1VBQ25GLENBQUMsTUFBTTtZQUNMd0MsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDdkMsT0FBTyxDQUFDMEIsZUFBZSxDQUFDNUIsTUFBTSxFQUFFQyxRQUFRLENBQUM7VUFDMUU7UUFDRjtNQUNGO0lBQ0Y7RUFDRjtFQUVBOEMsbUJBQW1CQSxDQUFBLEVBQUc7SUFDcEIsT0FBT0MsMEJBQVk7RUFDckI7RUFFQUMsZ0JBQWdCQSxDQUFDakQsTUFBTSxFQUFFQyxRQUFRLEVBQUVpRCxHQUFHLEVBQUVDLEdBQUcsRUFBRTlDLFdBQVcsRUFBRTtJQUN4RCxPQUFPLElBQUksQ0FBQ0gsT0FBTyxDQUFDK0MsZ0JBQWdCLENBQUNoRCxRQUFRLEVBQUVpRCxHQUFHLEVBQUVDLEdBQUcsRUFBRTlDLFdBQVcsQ0FBQztFQUN2RTtFQUVBK0MsZ0JBQWdCQSxDQUFDbkQsUUFBUSxFQUFFO0lBQ3pCLElBQUksT0FBTyxJQUFJLENBQUNDLE9BQU8sQ0FBQ2tELGdCQUFnQixLQUFLLFVBQVUsRUFBRTtNQUN2RCxNQUFNQyxLQUFLLEdBQUcsSUFBSSxDQUFDbkQsT0FBTyxDQUFDa0QsZ0JBQWdCLENBQUNuRCxRQUFRLENBQUM7TUFDckQsSUFBSSxPQUFPb0QsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPQSxLQUFLO01BQ2Q7TUFDQSxPQUFPLElBQUkzRCxLQUFLLENBQUM0RCxLQUFLLENBQUM1RCxLQUFLLENBQUM0RCxLQUFLLENBQUNDLGlCQUFpQixFQUFFRixLQUFLLENBQUM7SUFDOUQ7SUFDQSxPQUFPLElBQUFELDhCQUFnQixFQUFDbkQsUUFBUSxDQUFDO0VBQ25DO0FBQ0Y7QUFBQ3VELE9BQUEsQ0FBQTNELGVBQUEsR0FBQUEsZUFBQTtBQUFBLElBQUE0RCxRQUFBLEdBQUFELE9BQUEsQ0FBQS9ELE9BQUEsR0FFY0ksZUFBZSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -4,15 +4,77 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.FilesRouter = void 0;
7
+ exports.createSizeLimitedStream = createSizeLimitedStream;
7
8
  var _express = _interopRequireDefault(require("express"));
8
9
  var Middlewares = _interopRequireWildcard(require("../middlewares"));
9
10
  var _node = _interopRequireDefault(require("parse/node"));
10
11
  var _Config = _interopRequireDefault(require("../Config"));
11
12
  var _logger = _interopRequireDefault(require("../logger"));
13
+ var _stream = require("stream");
12
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
16
  const triggers = require('../triggers');
15
17
  const Utils = require('../Utils');
18
+ /**
19
+ * Wraps a readable stream in a Readable that enforces a byte size limit.
20
+ * Data flow is lazy: the source is not read until a consumer starts reading
21
+ * from the returned stream (via pipe or 'data' listener). This ensures the
22
+ * consumer's error listener is attached before any data (or error) is emitted.
23
+ */
24
+ function createSizeLimitedStream(source, maxBytes) {
25
+ let totalBytes = 0;
26
+ let started = false;
27
+ let sourceEnded = false;
28
+ let onData, onEnd, onError;
29
+ const output = new _stream.Readable({
30
+ read() {
31
+ if (!started) {
32
+ started = true;
33
+ onData = chunk => {
34
+ totalBytes += chunk.length;
35
+ if (totalBytes > maxBytes) {
36
+ output.destroy(new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, `File size exceeds maximum allowed: ${maxBytes} bytes.`));
37
+ return;
38
+ }
39
+ if (!output.push(chunk)) {
40
+ source.pause();
41
+ }
42
+ };
43
+ onEnd = () => {
44
+ sourceEnded = true;
45
+ output.push(null);
46
+ };
47
+ onError = err => output.destroy(err);
48
+ source.on('data', onData);
49
+ source.on('end', onEnd);
50
+ source.on('error', onError);
51
+ }
52
+
53
+ // Resume source in case it was paused due to backpressure
54
+ if (!sourceEnded) {
55
+ source.resume();
56
+ }
57
+ },
58
+ destroy(err, callback) {
59
+ if (onData) {
60
+ source.removeListener('data', onData);
61
+ }
62
+ if (onEnd) {
63
+ source.removeListener('end', onEnd);
64
+ }
65
+ if (onError) {
66
+ source.removeListener('error', onError);
67
+ }
68
+ // Suppress errors emitted during drain (e.g. client disconnect)
69
+ source.on('error', () => {});
70
+ if (!sourceEnded) {
71
+ source.resume();
72
+ }
73
+ callback(err);
74
+ }
75
+ });
76
+ return output;
77
+ }
16
78
  class FilesRouter {
17
79
  expressRouter({
18
80
  maxUploadSize = '20Mb'
@@ -23,14 +85,7 @@ class FilesRouter {
23
85
  router.post('/files', function (req, res, next) {
24
86
  next(new _node.default.Error(_node.default.Error.INVALID_FILE_NAME, 'Filename not provided.'));
25
87
  });
26
- router.post('/files/:filename', _express.default.raw({
27
- type: () => {
28
- return true;
29
- },
30
- limit: maxUploadSize
31
- }),
32
- // Allow uploads without Content-Type, or with any Content-Type.
33
- Middlewares.handleParseHeaders, Middlewares.handleParseSession, this.createHandler);
88
+ router.post('/files/:filename', this._bodyParsingMiddleware(maxUploadSize), Middlewares.handleParseHeaders, Middlewares.handleParseSession, this.createHandler.bind(this));
34
89
  router.delete('/files/:filename', Middlewares.handleParseHeaders, Middlewares.handleParseSession, Middlewares.enforceMasterKeyAccess, this.deleteHandler);
35
90
  return router;
36
91
  }
@@ -105,6 +160,19 @@ class FilesRouter {
105
160
  });
106
161
  }
107
162
  }
163
+ _bodyParsingMiddleware(maxUploadSize) {
164
+ const rawParser = _express.default.raw({
165
+ type: () => true,
166
+ limit: maxUploadSize
167
+ });
168
+ return (req, res, next) => {
169
+ if (req.get('X-Parse-Upload-Mode') === 'stream') {
170
+ req._maxUploadSizeBytes = Utils.parseSizeToBytes(maxUploadSize);
171
+ return next();
172
+ }
173
+ return rawParser(req, res, next);
174
+ };
175
+ }
108
176
  async createHandler(req, res, next) {
109
177
  const config = req.config;
110
178
  const user = req.auth.user;
@@ -127,10 +195,6 @@ class FilesRouter {
127
195
  filename
128
196
  } = req.params;
129
197
  const contentType = req.get('Content-type');
130
- if (!req.body || !req.body.length) {
131
- next(new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, 'Invalid file upload.'));
132
- return;
133
- }
134
198
  const error = filesController.validateFilename(filename);
135
199
  if (error) {
136
200
  next(error);
@@ -161,6 +225,24 @@ class FilesRouter {
161
225
  return;
162
226
  }
163
227
  }
228
+
229
+ // Dispatch to the appropriate handler based on whether the body was buffered
230
+ if (req.body instanceof Buffer) {
231
+ return this._handleBufferedUpload(req, res, next);
232
+ }
233
+ return this._handleStreamUpload(req, res, next);
234
+ }
235
+ async _handleBufferedUpload(req, res, next) {
236
+ const config = req.config;
237
+ const filesController = config.filesController;
238
+ const {
239
+ filename
240
+ } = req.params;
241
+ const contentType = req.get('Content-type');
242
+ if (!req.body || !req.body.length) {
243
+ next(new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, 'Invalid file upload.'));
244
+ return;
245
+ }
164
246
  const base64 = req.body.toString('base64');
165
247
  const file = new _node.default.File(filename, {
166
248
  base64
@@ -203,7 +285,12 @@ class FilesRouter {
203
285
  // if the file returned by the trigger has already been saved skip saving anything
204
286
  if (!saveResult) {
205
287
  // update fileSize
206
- const bufferData = Buffer.from(fileObject.file._data, 'base64');
288
+ let bufferData;
289
+ if (fileObject.file._source?.format === 'buffer') {
290
+ bufferData = fileObject.file._source.buffer;
291
+ } else {
292
+ bufferData = Buffer.from(fileObject.file._data, 'base64');
293
+ }
207
294
  fileObject.fileSize = Buffer.byteLength(bufferData);
208
295
  // prepare file options
209
296
  const fileOptions = {
@@ -241,6 +328,126 @@ class FilesRouter {
241
328
  next(error);
242
329
  }
243
330
  }
331
+ async _handleStreamUpload(req, res, next) {
332
+ const config = req.config;
333
+ const filesController = config.filesController;
334
+ const {
335
+ filename
336
+ } = req.params;
337
+ let contentType = req.get('Content-Type');
338
+ const maxBytes = req._maxUploadSizeBytes;
339
+ let stream;
340
+ try {
341
+ // Early rejection via Content-Length header
342
+ const contentLength = req.get('Content-Length');
343
+ if (contentLength && parseInt(contentLength, 10) > maxBytes) {
344
+ req.resume();
345
+ next(new _node.default.Error(_node.default.Error.FILE_SAVE_ERROR, `File size exceeds maximum allowed: ${maxBytes} bytes.`));
346
+ return;
347
+ }
348
+ const mime = (await import('mime')).default;
349
+
350
+ // Infer content type from extension or add extension from content type
351
+ const hasExtension = filename && filename.includes('.');
352
+ if (hasExtension && !contentType) {
353
+ contentType = mime.getType(filename);
354
+ } else if (!hasExtension && contentType) {
355
+ // extension will be added by filesController.createFile
356
+ }
357
+
358
+ // Create size-limited stream wrapping the request
359
+ stream = createSizeLimitedStream(req, maxBytes);
360
+
361
+ // Build a Parse.File with no _data (streaming mode)
362
+ const file = new _node.default.File(filename, {
363
+ base64: ''
364
+ }, contentType);
365
+ const {
366
+ metadata = {},
367
+ tags = {}
368
+ } = req.fileData || {};
369
+
370
+ // Validate metadata and tags for prohibited keywords
371
+ try {
372
+ Utils.checkProhibitedKeywords(config, metadata);
373
+ Utils.checkProhibitedKeywords(config, tags);
374
+ } catch (error) {
375
+ stream.destroy();
376
+ next(new _node.default.Error(_node.default.Error.INVALID_KEY_NAME, error));
377
+ return;
378
+ }
379
+ file.setTags(tags);
380
+ file.setMetadata(metadata);
381
+ const fileSize = req.get('Content-Length') ? parseInt(req.get('Content-Length'), 10) : null;
382
+ const fileObject = {
383
+ file,
384
+ fileSize,
385
+ stream: true
386
+ };
387
+
388
+ // Run beforeSaveFile trigger
389
+ const triggerResult = await triggers.maybeRunFileTrigger(triggers.Types.beforeSave, fileObject, config, req.auth);
390
+ let saveResult;
391
+ // If a new ParseFile is returned, check if it's an already saved file
392
+ if (triggerResult instanceof _node.default.File) {
393
+ fileObject.file = triggerResult;
394
+ if (triggerResult.url()) {
395
+ fileObject.fileSize = null;
396
+ saveResult = {
397
+ url: triggerResult.url(),
398
+ name: triggerResult._name
399
+ };
400
+ // Destroy stream to remove listeners and drain request
401
+ stream.destroy();
402
+ }
403
+ }
404
+
405
+ // If the file returned by the trigger has already been saved, skip saving
406
+ if (!saveResult) {
407
+ // Prepare file options
408
+ const fileOptions = {
409
+ metadata: fileObject.file._metadata
410
+ };
411
+ const fileTags = Object.keys(fileObject.file._tags).length > 0 ? {
412
+ tags: fileObject.file._tags
413
+ } : {};
414
+ Object.assign(fileOptions, fileTags);
415
+
416
+ // Pass stream directly to filesController — it will buffer if adapter doesn't support streaming
417
+ const sourceType = fileObject.file._source?.type || contentType;
418
+ const createFileResult = await filesController.createFile(config, fileObject.file._name, stream, sourceType, fileOptions);
419
+
420
+ // Update file with new data
421
+ fileObject.file._name = createFileResult.name;
422
+ fileObject.file._url = createFileResult.url;
423
+ fileObject.file._requestTask = null;
424
+ fileObject.file._previousSave = Promise.resolve(fileObject.file);
425
+ saveResult = {
426
+ url: createFileResult.url,
427
+ name: createFileResult.name
428
+ };
429
+ }
430
+
431
+ // Run afterSaveFile trigger
432
+ await triggers.maybeRunFileTrigger(triggers.Types.afterSave, fileObject, config, req.auth);
433
+ res.status(201);
434
+ res.set('Location', saveResult.url);
435
+ res.json(saveResult);
436
+ } catch (e) {
437
+ // Destroy stream to remove listeners and drain request, or resume directly
438
+ if (stream) {
439
+ stream.destroy();
440
+ } else {
441
+ req.resume();
442
+ }
443
+ _logger.default.error('Error creating a file: ', e);
444
+ const error = triggers.resolveError(e, {
445
+ code: _node.default.Error.FILE_SAVE_ERROR,
446
+ message: `Could not store file: ${filename}.`
447
+ });
448
+ next(error);
449
+ }
450
+ }
244
451
  async deleteHandler(req, res, next) {
245
452
  try {
246
453
  const {
@@ -298,4 +505,4 @@ function isFileStreamable(req, filesController) {
298
505
  const end = Number(range[1]);
299
506
  return (!isNaN(start) || !isNaN(end)) && typeof filesController.adapter.handleFileStream === 'function';
300
507
  }
301
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXhwcmVzcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiTWlkZGxld2FyZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9ub2RlIiwiX0NvbmZpZyIsIl9sb2dnZXIiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ0cmlnZ2VycyIsIlV0aWxzIiwiRmlsZXNSb3V0ZXIiLCJleHByZXNzUm91dGVyIiwibWF4VXBsb2FkU2l6ZSIsInJvdXRlciIsImV4cHJlc3MiLCJSb3V0ZXIiLCJnZXRIYW5kbGVyIiwibWV0YWRhdGFIYW5kbGVyIiwicG9zdCIsInJlcSIsInJlcyIsIm5leHQiLCJQYXJzZSIsIkVycm9yIiwiSU5WQUxJRF9GSUxFX05BTUUiLCJyYXciLCJ0eXBlIiwibGltaXQiLCJoYW5kbGVQYXJzZUhlYWRlcnMiLCJoYW5kbGVQYXJzZVNlc3Npb24iLCJjcmVhdGVIYW5kbGVyIiwiZGVsZXRlIiwiZW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImRlbGV0ZUhhbmRsZXIiLCJjb25maWciLCJDb25maWciLCJwYXJhbXMiLCJhcHBJZCIsInN0YXR1cyIsImpzb24iLCJjb2RlIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsImVycm9yIiwiZmlsZW5hbWUiLCJmaWxlc0NvbnRyb2xsZXIiLCJtaW1lIiwiY29udGVudFR5cGUiLCJnZXRUeXBlIiwiZmlsZSIsIkZpbGUiLCJiYXNlNjQiLCJ0cmlnZ2VyUmVzdWx0IiwibWF5YmVSdW5GaWxlVHJpZ2dlciIsIlR5cGVzIiwiYmVmb3JlRmluZCIsImF1dGgiLCJfbmFtZSIsImlzRmlsZVN0cmVhbWFibGUiLCJoYW5kbGVGaWxlU3RyZWFtIiwiY2F0Y2giLCJlbmQiLCJkYXRhIiwiZ2V0RmlsZURhdGEiLCJ0b1N0cmluZyIsImFmdGVyRmluZCIsImZvcmNlRG93bmxvYWQiLCJCdWZmZXIiLCJmcm9tIiwiX2RhdGEiLCJsZW5ndGgiLCJlcnIiLCJyZXNvbHZlRXJyb3IiLCJTQ1JJUFRfRkFJTEVEIiwibWVzc2FnZSIsInVzZXIiLCJpc01hc3RlciIsImlzTGlua2VkIiwiQW5vbnltb3VzVXRpbHMiLCJmaWxlVXBsb2FkIiwiZW5hYmxlRm9yQW5vbnltb3VzVXNlciIsIkZJTEVfU0FWRV9FUlJPUiIsImVuYWJsZUZvckF1dGhlbnRpY2F0ZWRVc2VyIiwiZW5hYmxlRm9yUHVibGljIiwiYm9keSIsInZhbGlkYXRlRmlsZW5hbWUiLCJmaWxlRXh0ZW5zaW9ucyIsImlzVmFsaWRFeHRlbnNpb24iLCJleHRlbnNpb24iLCJzb21lIiwiZXh0IiwicmVnZXgiLCJSZWdFeHAiLCJ0ZXN0IiwiaW5jbHVkZXMiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInNwbGl0Iiwiam9pbiIsIm1ldGFkYXRhIiwidGFncyIsImZpbGVEYXRhIiwiY2hlY2tQcm9oaWJpdGVkS2V5d29yZHMiLCJJTlZBTElEX0tFWV9OQU1FIiwic2V0VGFncyIsInNldE1ldGFkYXRhIiwiZmlsZVNpemUiLCJieXRlTGVuZ3RoIiwiZmlsZU9iamVjdCIsImJlZm9yZVNhdmUiLCJzYXZlUmVzdWx0IiwidXJsIiwibmFtZSIsImJ1ZmZlckRhdGEiLCJmaWxlT3B0aW9ucyIsIl9tZXRhZGF0YSIsImZpbGVUYWdzIiwia2V5cyIsIl90YWdzIiwiYXNzaWduIiwiY3JlYXRlRmlsZVJlc3VsdCIsImNyZWF0ZUZpbGUiLCJfc291cmNlIiwiX3VybCIsIl9yZXF1ZXN0VGFzayIsIl9wcmV2aW91c1NhdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImFmdGVyU2F2ZSIsImxvZ2dlciIsImFkYXB0ZXIiLCJnZXRGaWxlTG9jYXRpb24iLCJiZWZvcmVEZWxldGUiLCJkZWxldGVGaWxlIiwiYWZ0ZXJEZWxldGUiLCJGSUxFX0RFTEVURV9FUlJPUiIsImdldE1ldGFkYXRhIiwiZXhwb3J0cyIsInJhbmdlIiwic3RhcnQiLCJOdW1iZXIiLCJpc05hTiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0ZpbGVzUm91dGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0ICogYXMgTWlkZGxld2FyZXMgZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IENvbmZpZyBmcm9tICcuLi9Db25maWcnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuY29uc3QgdHJpZ2dlcnMgPSByZXF1aXJlKCcuLi90cmlnZ2VycycpO1xuY29uc3QgVXRpbHMgPSByZXF1aXJlKCcuLi9VdGlscycpO1xuXG5leHBvcnQgY2xhc3MgRmlsZXNSb3V0ZXIge1xuICBleHByZXNzUm91dGVyKHsgbWF4VXBsb2FkU2l6ZSA9ICcyME1iJyB9ID0ge30pIHtcbiAgICB2YXIgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcbiAgICByb3V0ZXIuZ2V0KCcvZmlsZXMvOmFwcElkLzpmaWxlbmFtZScsIHRoaXMuZ2V0SGFuZGxlcik7XG4gICAgcm91dGVyLmdldCgnL2ZpbGVzLzphcHBJZC9tZXRhZGF0YS86ZmlsZW5hbWUnLCB0aGlzLm1ldGFkYXRhSGFuZGxlcik7XG5cbiAgICByb3V0ZXIucG9zdCgnL2ZpbGVzJywgZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgICBuZXh0KG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0ZJTEVfTkFNRSwgJ0ZpbGVuYW1lIG5vdCBwcm92aWRlZC4nKSk7XG4gICAgfSk7XG5cbiAgICByb3V0ZXIucG9zdChcbiAgICAgICcvZmlsZXMvOmZpbGVuYW1lJyxcbiAgICAgIGV4cHJlc3MucmF3KHtcbiAgICAgICAgdHlwZTogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBsaW1pdDogbWF4VXBsb2FkU2l6ZSxcbiAgICAgIH0pLCAvLyBBbGxvdyB1cGxvYWRzIHdpdGhvdXQgQ29udGVudC1UeXBlLCBvciB3aXRoIGFueSBDb250ZW50LVR5cGUuXG4gICAgICBNaWRkbGV3YXJlcy5oYW5kbGVQYXJzZUhlYWRlcnMsXG4gICAgICBNaWRkbGV3YXJlcy5oYW5kbGVQYXJzZVNlc3Npb24sXG4gICAgICB0aGlzLmNyZWF0ZUhhbmRsZXJcbiAgICApO1xuXG4gICAgcm91dGVyLmRlbGV0ZShcbiAgICAgICcvZmlsZXMvOmZpbGVuYW1lJyxcbiAgICAgIE1pZGRsZXdhcmVzLmhhbmRsZVBhcnNlSGVhZGVycyxcbiAgICAgIE1pZGRsZXdhcmVzLmhhbmRsZVBhcnNlU2Vzc2lvbixcbiAgICAgIE1pZGRsZXdhcmVzLmVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsXG4gICAgICB0aGlzLmRlbGV0ZUhhbmRsZXJcbiAgICApO1xuICAgIHJldHVybiByb3V0ZXI7XG4gIH1cblxuICBhc3luYyBnZXRIYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChyZXEucGFyYW1zLmFwcElkKTtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmVzLnN0YXR1cyg0MDMpO1xuICAgICAgcmVzLmpzb24oeyBjb2RlOiBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLCBlcnJvcjogJ0ludmFsaWQgYXBwbGljYXRpb24gSUQuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZmlsZW5hbWUgPSByZXEucGFyYW1zLmZpbGVuYW1lO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlc0NvbnRyb2xsZXIgPSBjb25maWcuZmlsZXNDb250cm9sbGVyO1xuICAgICAgY29uc3QgbWltZSA9IChhd2FpdCBpbXBvcnQoJ21pbWUnKSkuZGVmYXVsdDtcbiAgICAgIGxldCBjb250ZW50VHlwZSA9IG1pbWUuZ2V0VHlwZShmaWxlbmFtZSk7XG4gICAgICBsZXQgZmlsZSA9IG5ldyBQYXJzZS5GaWxlKGZpbGVuYW1lLCB7IGJhc2U2NDogJycgfSwgY29udGVudFR5cGUpO1xuICAgICAgY29uc3QgdHJpZ2dlclJlc3VsdCA9IGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuRmlsZVRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZUZpbmQsXG4gICAgICAgIHsgZmlsZSB9LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcS5hdXRoXG4gICAgICApO1xuICAgICAgaWYgKHRyaWdnZXJSZXN1bHQ/LmZpbGU/Ll9uYW1lKSB7XG4gICAgICAgIGZpbGVuYW1lID0gdHJpZ2dlclJlc3VsdD8uZmlsZT8uX25hbWU7XG4gICAgICAgIGNvbnRlbnRUeXBlID0gbWltZS5nZXRUeXBlKGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRmlsZVN0cmVhbWFibGUocmVxLCBmaWxlc0NvbnRyb2xsZXIpKSB7XG4gICAgICAgIGZpbGVzQ29udHJvbGxlci5oYW5kbGVGaWxlU3RyZWFtKGNvbmZpZywgZmlsZW5hbWUsIHJlcSwgcmVzLCBjb250ZW50VHlwZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgICAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicpO1xuICAgICAgICAgIHJlcy5lbmQoJ0ZpbGUgbm90IGZvdW5kLicpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YSA9IGF3YWl0IGZpbGVzQ29udHJvbGxlci5nZXRGaWxlRGF0YShjb25maWcsIGZpbGVuYW1lKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgICAgcmVzLnNldCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgcmVzLmVuZCgnRmlsZSBub3QgZm91bmQuJyk7XG4gICAgICB9KTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZW5hbWUsIHsgYmFzZTY0OiBkYXRhLnRvU3RyaW5nKCdiYXNlNjQnKSB9LCBjb250ZW50VHlwZSk7XG4gICAgICBjb25zdCBhZnRlckZpbmQgPSBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1bkZpbGVUcmlnZ2VyKFxuICAgICAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlckZpbmQsXG4gICAgICAgIHsgZmlsZSwgZm9yY2VEb3dubG9hZDogZmFsc2UgfSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXEuYXV0aFxuICAgICAgKTtcblxuICAgICAgaWYgKGFmdGVyRmluZD8uZmlsZSkge1xuICAgICAgICBjb250ZW50VHlwZSA9IG1pbWUuZ2V0VHlwZShhZnRlckZpbmQuZmlsZS5fbmFtZSk7XG4gICAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShhZnRlckZpbmQuZmlsZS5fZGF0YSwgJ2Jhc2U2NCcpO1xuICAgICAgfVxuXG4gICAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZSk7XG4gICAgICByZXMuc2V0KCdDb250ZW50LUxlbmd0aCcsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGlmIChhZnRlckZpbmQuZm9yY2VEb3dubG9hZCkge1xuICAgICAgICByZXMuc2V0KCdDb250ZW50LURpc3Bvc2l0aW9uJywgYGF0dGFjaG1lbnQ7ZmlsZW5hbWU9JHthZnRlckZpbmQuZmlsZS5fbmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIHJlcy5lbmQoZGF0YSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyID0gdHJpZ2dlcnMucmVzb2x2ZUVycm9yKGUsIHtcbiAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuU0NSSVBUX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogYENvdWxkIG5vdCBmaW5kIGZpbGU6ICR7ZmlsZW5hbWV9LmAsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDAzKTtcbiAgICAgIHJlcy5qc29uKHsgY29kZTogZXJyLmNvZGUsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVIYW5kbGVyKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZztcbiAgICBjb25zdCB1c2VyID0gcmVxLmF1dGgudXNlcjtcbiAgICBjb25zdCBpc01hc3RlciA9IHJlcS5hdXRoLmlzTWFzdGVyO1xuICAgIGNvbnN0IGlzTGlua2VkID0gdXNlciAmJiBQYXJzZS5Bbm9ueW1vdXNVdGlscy5pc0xpbmtlZCh1c2VyKTtcbiAgICBpZiAoIWlzTWFzdGVyICYmICFjb25maWcuZmlsZVVwbG9hZC5lbmFibGVGb3JBbm9ueW1vdXNVc2VyICYmIGlzTGlua2VkKSB7XG4gICAgICBuZXh0KFxuICAgICAgICBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLCAnRmlsZSB1cGxvYWQgYnkgYW5vbnltb3VzIHVzZXIgaXMgZGlzYWJsZWQuJylcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNNYXN0ZXIgJiYgIWNvbmZpZy5maWxlVXBsb2FkLmVuYWJsZUZvckF1dGhlbnRpY2F0ZWRVc2VyICYmICFpc0xpbmtlZCAmJiB1c2VyKSB7XG4gICAgICBuZXh0KFxuICAgICAgICBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLFxuICAgICAgICAgICdGaWxlIHVwbG9hZCBieSBhdXRoZW50aWNhdGVkIHVzZXIgaXMgZGlzYWJsZWQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzTWFzdGVyICYmICFjb25maWcuZmlsZVVwbG9hZC5lbmFibGVGb3JQdWJsaWMgJiYgIXVzZXIpIHtcbiAgICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkZJTEVfU0FWRV9FUlJPUiwgJ0ZpbGUgdXBsb2FkIGJ5IHB1YmxpYyBpcyBkaXNhYmxlZC4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbGVzQ29udHJvbGxlciA9IGNvbmZpZy5maWxlc0NvbnRyb2xsZXI7XG4gICAgY29uc3QgeyBmaWxlbmFtZSB9ID0gcmVxLnBhcmFtcztcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlcS5nZXQoJ0NvbnRlbnQtdHlwZScpO1xuXG4gICAgaWYgKCFyZXEuYm9keSB8fCAhcmVxLmJvZHkubGVuZ3RoKSB7XG4gICAgICBuZXh0KG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5GSUxFX1NBVkVfRVJST1IsICdJbnZhbGlkIGZpbGUgdXBsb2FkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvciA9IGZpbGVzQ29udHJvbGxlci52YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIG5leHQoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVFeHRlbnNpb25zID0gY29uZmlnLmZpbGVVcGxvYWQ/LmZpbGVFeHRlbnNpb25zO1xuICAgIGlmICghaXNNYXN0ZXIgJiYgZmlsZUV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWRFeHRlbnNpb24gPSBleHRlbnNpb24gPT4ge1xuICAgICAgICByZXR1cm4gZmlsZUV4dGVuc2lvbnMuc29tZShleHQgPT4ge1xuICAgICAgICAgIGlmIChleHQgPT09ICcqJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChleHQpO1xuICAgICAgICAgIGlmIChyZWdleC50ZXN0KGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbGV0IGV4dGVuc2lvbiA9IGNvbnRlbnRUeXBlO1xuICAgICAgaWYgKGZpbGVuYW1lICYmIGZpbGVuYW1lLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgZXh0ZW5zaW9uID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICBleHRlbnNpb24gPSBjb250ZW50VHlwZS5zcGxpdCgnLycpWzFdO1xuICAgICAgfVxuICAgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uPy5zcGxpdCgnICcpPy5qb2luKCcnKTtcblxuICAgICAgaWYgKGV4dGVuc2lvbiAmJiAhaXNWYWxpZEV4dGVuc2lvbihleHRlbnNpb24pKSB7XG4gICAgICAgIG5leHQoXG4gICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLFxuICAgICAgICAgICAgYEZpbGUgdXBsb2FkIG9mIGV4dGVuc2lvbiAke2V4dGVuc2lvbn0gaXMgZGlzYWJsZWQuYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJhc2U2NCA9IHJlcS5ib2R5LnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBjb25zdCBmaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZW5hbWUsIHsgYmFzZTY0IH0sIGNvbnRlbnRUeXBlKTtcbiAgICBjb25zdCB7IG1ldGFkYXRhID0ge30sIHRhZ3MgPSB7fSB9ID0gcmVxLmZpbGVEYXRhIHx8IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyBTY2FuIHJlcXVlc3QgZGF0YSBmb3IgZGVuaWVkIGtleXdvcmRzXG4gICAgICBVdGlscy5jaGVja1Byb2hpYml0ZWRLZXl3b3Jkcyhjb25maWcsIG1ldGFkYXRhKTtcbiAgICAgIFV0aWxzLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzKGNvbmZpZywgdGFncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsIGVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpbGUuc2V0VGFncyh0YWdzKTtcbiAgICBmaWxlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICBjb25zdCBmaWxlU2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlcS5ib2R5KTtcbiAgICBjb25zdCBmaWxlT2JqZWN0ID0geyBmaWxlLCBmaWxlU2l6ZSB9O1xuICAgIHRyeSB7XG4gICAgICAvLyBydW4gYmVmb3JlU2F2ZUZpbGUgdHJpZ2dlclxuICAgICAgY29uc3QgdHJpZ2dlclJlc3VsdCA9IGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuRmlsZVRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZVNhdmUsXG4gICAgICAgIGZpbGVPYmplY3QsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxLmF1dGhcbiAgICAgICk7XG4gICAgICBsZXQgc2F2ZVJlc3VsdDtcbiAgICAgIC8vIGlmIGEgbmV3IFBhcnNlRmlsZSBpcyByZXR1cm5lZCBjaGVjayBpZiBpdCdzIGFuIGFscmVhZHkgc2F2ZWQgZmlsZVxuICAgICAgaWYgKHRyaWdnZXJSZXN1bHQgaW5zdGFuY2VvZiBQYXJzZS5GaWxlKSB7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZSA9IHRyaWdnZXJSZXN1bHQ7XG4gICAgICAgIGlmICh0cmlnZ2VyUmVzdWx0LnVybCgpKSB7XG4gICAgICAgICAgLy8gc2V0IGZpbGVTaXplIHRvIG51bGwgYmVjYXVzZSB3ZSB3b250IGtub3cgaG93IGJpZyBpdCBpcyBoZXJlXG4gICAgICAgICAgZmlsZU9iamVjdC5maWxlU2l6ZSA9IG51bGw7XG4gICAgICAgICAgc2F2ZVJlc3VsdCA9IHtcbiAgICAgICAgICAgIHVybDogdHJpZ2dlclJlc3VsdC51cmwoKSxcbiAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJSZXN1bHQuX25hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIGZpbGUgcmV0dXJuZWQgYnkgdGhlIHRyaWdnZXIgaGFzIGFscmVhZHkgYmVlbiBzYXZlZCBza2lwIHNhdmluZyBhbnl0aGluZ1xuICAgICAgaWYgKCFzYXZlUmVzdWx0KSB7XG4gICAgICAgIC8vIHVwZGF0ZSBmaWxlU2l6ZVxuICAgICAgICBjb25zdCBidWZmZXJEYXRhID0gQnVmZmVyLmZyb20oZmlsZU9iamVjdC5maWxlLl9kYXRhLCAnYmFzZTY0Jyk7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZVNpemUgPSBCdWZmZXIuYnl0ZUxlbmd0aChidWZmZXJEYXRhKTtcbiAgICAgICAgLy8gcHJlcGFyZSBmaWxlIG9wdGlvbnNcbiAgICAgICAgY29uc3QgZmlsZU9wdGlvbnMgPSB7XG4gICAgICAgICAgbWV0YWRhdGE6IGZpbGVPYmplY3QuZmlsZS5fbWV0YWRhdGEsXG4gICAgICAgIH07XG4gICAgICAgIC8vIHNvbWUgczMtY29tcGF0aWJsZSBwcm92aWRlcnMgKERpZ2l0YWxPY2VhbiwgTGlub2RlKSBkbyBub3QgYWNjZXB0IHRhZ3NcbiAgICAgICAgLy8gc28gd2UgZG8gbm90IGluY2x1ZGUgdGhlIHRhZ3Mgb3B0aW9uIGlmIGl0IGlzIGVtcHR5LlxuICAgICAgICBjb25zdCBmaWxlVGFncyA9XG4gICAgICAgICAgT2JqZWN0LmtleXMoZmlsZU9iamVjdC5maWxlLl90YWdzKS5sZW5ndGggPiAwID8geyB0YWdzOiBmaWxlT2JqZWN0LmZpbGUuX3RhZ3MgfSA6IHt9O1xuICAgICAgICBPYmplY3QuYXNzaWduKGZpbGVPcHRpb25zLCBmaWxlVGFncyk7XG4gICAgICAgIC8vIHNhdmUgZmlsZVxuICAgICAgICBjb25zdCBjcmVhdGVGaWxlUmVzdWx0ID0gYXdhaXQgZmlsZXNDb250cm9sbGVyLmNyZWF0ZUZpbGUoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGZpbGVPYmplY3QuZmlsZS5fbmFtZSxcbiAgICAgICAgICBidWZmZXJEYXRhLFxuICAgICAgICAgIGZpbGVPYmplY3QuZmlsZS5fc291cmNlLnR5cGUsXG4gICAgICAgICAgZmlsZU9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGZpbGUgd2l0aCBuZXcgZGF0YVxuICAgICAgICBmaWxlT2JqZWN0LmZpbGUuX25hbWUgPSBjcmVhdGVGaWxlUmVzdWx0Lm5hbWU7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZS5fdXJsID0gY3JlYXRlRmlsZVJlc3VsdC51cmw7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZS5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICBmaWxlT2JqZWN0LmZpbGUuX3ByZXZpb3VzU2F2ZSA9IFByb21pc2UucmVzb2x2ZShmaWxlT2JqZWN0LmZpbGUpO1xuICAgICAgICBzYXZlUmVzdWx0ID0ge1xuICAgICAgICAgIHVybDogY3JlYXRlRmlsZVJlc3VsdC51cmwsXG4gICAgICAgICAgbmFtZTogY3JlYXRlRmlsZVJlc3VsdC5uYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gcnVuIGFmdGVyU2F2ZUZpbGUgdHJpZ2dlclxuICAgICAgYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5GaWxlVHJpZ2dlcih0cmlnZ2Vycy5UeXBlcy5hZnRlclNhdmUsIGZpbGVPYmplY3QsIGNvbmZpZywgcmVxLmF1dGgpO1xuICAgICAgcmVzLnN0YXR1cygyMDEpO1xuICAgICAgcmVzLnNldCgnTG9jYXRpb24nLCBzYXZlUmVzdWx0LnVybCk7XG4gICAgICByZXMuanNvbihzYXZlUmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIGEgZmlsZTogJywgZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHRyaWdnZXJzLnJlc29sdmVFcnJvcihlLCB7XG4gICAgICAgIGNvZGU6IFBhcnNlLkVycm9yLkZJTEVfU0FWRV9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogYENvdWxkIG5vdCBzdG9yZSBmaWxlOiAke2ZpbGVPYmplY3QuZmlsZS5fbmFtZX0uYCxcbiAgICAgIH0pO1xuICAgICAgbmV4dChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlSGFuZGxlcihyZXEsIHJlcywgbmV4dCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZpbGVzQ29udHJvbGxlciB9ID0gcmVxLmNvbmZpZztcbiAgICAgIGNvbnN0IHsgZmlsZW5hbWUgfSA9IHJlcS5wYXJhbXM7XG4gICAgICAvLyBydW4gYmVmb3JlRGVsZXRlRmlsZSB0cmlnZ2VyXG4gICAgICBjb25zdCBmaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZW5hbWUpO1xuICAgICAgZmlsZS5fdXJsID0gYXdhaXQgZmlsZXNDb250cm9sbGVyLmFkYXB0ZXIuZ2V0RmlsZUxvY2F0aW9uKHJlcS5jb25maWcsIGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVPYmplY3QgPSB7IGZpbGUsIGZpbGVTaXplOiBudWxsIH07XG4gICAgICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1bkZpbGVUcmlnZ2VyKFxuICAgICAgICB0cmlnZ2Vycy5UeXBlcy5iZWZvcmVEZWxldGUsXG4gICAgICAgIGZpbGVPYmplY3QsXG4gICAgICAgIHJlcS5jb25maWcsXG4gICAgICAgIHJlcS5hdXRoXG4gICAgICApO1xuICAgICAgLy8gZGVsZXRlIGZpbGVcbiAgICAgIGF3YWl0IGZpbGVzQ29udHJvbGxlci5kZWxldGVGaWxlKHJlcS5jb25maWcsIGZpbGVuYW1lKTtcbiAgICAgIC8vIHJ1biBhZnRlckRlbGV0ZUZpbGUgdHJpZ2dlclxuICAgICAgYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5GaWxlVHJpZ2dlcihcbiAgICAgICAgdHJpZ2dlcnMuVHlwZXMuYWZ0ZXJEZWxldGUsXG4gICAgICAgIGZpbGVPYmplY3QsXG4gICAgICAgIHJlcS5jb25maWcsXG4gICAgICAgIHJlcS5hdXRoXG4gICAgICApO1xuICAgICAgcmVzLnN0YXR1cygyMDApO1xuICAgICAgLy8gVE9ETzogcmV0dXJuIHVzZWZ1bCBKU09OIGhlcmU/XG4gICAgICByZXMuZW5kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkZWxldGluZyBhIGZpbGU6ICcsIGUpO1xuICAgICAgY29uc3QgZXJyb3IgPSB0cmlnZ2Vycy5yZXNvbHZlRXJyb3IoZSwge1xuICAgICAgICBjb2RlOiBQYXJzZS5FcnJvci5GSUxFX0RFTEVURV9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBkZWxldGUgZmlsZS4nLFxuICAgICAgfSk7XG4gICAgICBuZXh0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBtZXRhZGF0YUhhbmRsZXIocmVxLCByZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChyZXEucGFyYW1zLmFwcElkKTtcbiAgICAgIGNvbnN0IHsgZmlsZXNDb250cm9sbGVyIH0gPSBjb25maWc7XG4gICAgICBjb25zdCB7IGZpbGVuYW1lIH0gPSByZXEucGFyYW1zO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGZpbGVzQ29udHJvbGxlci5nZXRNZXRhZGF0YShmaWxlbmFtZSk7XG4gICAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgICByZXMuanNvbihkYXRhKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKTtcbiAgICAgIHJlcy5qc29uKHt9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNGaWxlU3RyZWFtYWJsZShyZXEsIGZpbGVzQ29udHJvbGxlcikge1xuICBjb25zdCByYW5nZSA9IChyZXEuZ2V0KCdSYW5nZScpIHx8ICcvLS8nKS5zcGxpdCgnLScpO1xuICBjb25zdCBzdGFydCA9IE51bWJlcihyYW5nZVswXSk7XG4gIGNvbnN0IGVuZCA9IE51bWJlcihyYW5nZVsxXSk7XG4gIHJldHVybiAoXG4gICAgKCFpc05hTihzdGFydCkgfHwgIWlzTmFOKGVuZCkpICYmIHR5cGVvZiBmaWxlc0NvbnRyb2xsZXIuYWRhcHRlci5oYW5kbGVGaWxlU3RyZWFtID09PSAnZnVuY3Rpb24nXG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUErQixTQUFBRSx3QkFBQUksQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQU4sdUJBQUEsWUFBQUEsQ0FBQUksQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxHQUFBLENBQUFYLENBQUEsVUFBQU0sQ0FBQSxDQUFBTSxHQUFBLENBQUFaLENBQUEsR0FBQU0sQ0FBQSxDQUFBTyxHQUFBLENBQUFiLENBQUEsRUFBQVEsQ0FBQSxnQkFBQVAsQ0FBQSxJQUFBRCxDQUFBLGdCQUFBQyxDQUFBLE9BQUFhLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZixDQUFBLEVBQUFDLENBQUEsT0FBQU0sQ0FBQSxJQUFBRCxDQUFBLEdBQUFVLE1BQUEsQ0FBQUMsY0FBQSxLQUFBRCxNQUFBLENBQUFFLHdCQUFBLENBQUFsQixDQUFBLEVBQUFDLENBQUEsT0FBQU0sQ0FBQSxDQUFBSyxHQUFBLElBQUFMLENBQUEsQ0FBQU0sR0FBQSxJQUFBUCxDQUFBLENBQUFFLENBQUEsRUFBQVAsQ0FBQSxFQUFBTSxDQUFBLElBQUFDLENBQUEsQ0FBQVAsQ0FBQSxJQUFBRCxDQUFBLENBQUFDLENBQUEsV0FBQU8sQ0FBQSxLQUFBUixDQUFBLEVBQUFDLENBQUE7QUFBQSxTQUFBUix1QkFBQU8sQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxHQUFBTCxDQUFBLEtBQUFVLE9BQUEsRUFBQVYsQ0FBQTtBQUMvQixNQUFNbUIsUUFBUSxHQUFHekIsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUN2QyxNQUFNMEIsS0FBSyxHQUFHMUIsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUUxQixNQUFNMkIsV0FBVyxDQUFDO0VBQ3ZCQyxhQUFhQSxDQUFDO0lBQUVDLGFBQWEsR0FBRztFQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtJQUM3QyxJQUFJQyxNQUFNLEdBQUdDLGdCQUFPLENBQUNDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCRixNQUFNLENBQUNaLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUNlLFVBQVUsQ0FBQztJQUN0REgsTUFBTSxDQUFDWixHQUFHLENBQUMsa0NBQWtDLEVBQUUsSUFBSSxDQUFDZ0IsZUFBZSxDQUFDO0lBRXBFSixNQUFNLENBQUNLLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVUMsR0FBRyxFQUFFQyxHQUFHLEVBQUVDLElBQUksRUFBRTtNQUM5Q0EsSUFBSSxDQUFDLElBQUlDLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQ0MsaUJBQWlCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUNoRixDQUFDLENBQUM7SUFFRlgsTUFBTSxDQUFDSyxJQUFJLENBQ1Qsa0JBQWtCLEVBQ2xCSixnQkFBTyxDQUFDVyxHQUFHLENBQUM7TUFDVkMsSUFBSSxFQUFFQSxDQUFBLEtBQU07UUFDVixPQUFPLElBQUk7TUFDYixDQUFDO01BQ0RDLEtBQUssRUFBRWY7SUFDVCxDQUFDLENBQUM7SUFBRTtJQUNKNUIsV0FBVyxDQUFDNEMsa0JBQWtCLEVBQzlCNUMsV0FBVyxDQUFDNkMsa0JBQWtCLEVBQzlCLElBQUksQ0FBQ0MsYUFDUCxDQUFDO0lBRURqQixNQUFNLENBQUNrQixNQUFNLENBQ1gsa0JBQWtCLEVBQ2xCL0MsV0FBVyxDQUFDNEMsa0JBQWtCLEVBQzlCNUMsV0FBVyxDQUFDNkMsa0JBQWtCLEVBQzlCN0MsV0FBVyxDQUFDZ0Qsc0JBQXNCLEVBQ2xDLElBQUksQ0FBQ0MsYUFDUCxDQUFDO0lBQ0QsT0FBT3BCLE1BQU07RUFDZjtFQUVBLE1BQU1HLFVBQVVBLENBQUNHLEdBQUcsRUFBRUMsR0FBRyxFQUFFO0lBQ3pCLE1BQU1jLE1BQU0sR0FBR0MsZUFBTSxDQUFDbEMsR0FBRyxDQUFDa0IsR0FBRyxDQUFDaUIsTUFBTSxDQUFDQyxLQUFLLENBQUM7SUFDM0MsSUFBSSxDQUFDSCxNQUFNLEVBQUU7TUFDWGQsR0FBRyxDQUFDa0IsTUFBTSxDQUFDLEdBQUcsQ0FBQztNQUNmbEIsR0FBRyxDQUFDbUIsSUFBSSxDQUFDO1FBQUVDLElBQUksRUFBRWxCLGFBQUssQ0FBQ0MsS0FBSyxDQUFDa0IsbUJBQW1CO1FBQUVDLEtBQUssRUFBRTtNQUEwQixDQUFDLENBQUM7TUFDckY7SUFDRjtJQUVBLElBQUlDLFFBQVEsR0FBR3hCLEdBQUcsQ0FBQ2lCLE1BQU0sQ0FBQ08sUUFBUTtJQUNsQyxJQUFJO01BQ0YsTUFBTUMsZUFBZSxHQUFHVixNQUFNLENBQUNVLGVBQWU7TUFDOUMsTUFBTUMsSUFBSSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU5QyxPQUFPO01BQzNDLElBQUkrQyxXQUFXLEdBQUdELElBQUksQ0FBQ0UsT0FBTyxDQUFDSixRQUFRLENBQUM7TUFDeEMsSUFBSUssSUFBSSxHQUFHLElBQUkxQixhQUFLLENBQUMyQixJQUFJLENBQUNOLFFBQVEsRUFBRTtRQUFFTyxNQUFNLEVBQUU7TUFBRyxDQUFDLEVBQUVKLFdBQVcsQ0FBQztNQUNoRSxNQUFNSyxhQUFhLEdBQUcsTUFBTTNDLFFBQVEsQ0FBQzRDLG1CQUFtQixDQUN0RDVDLFFBQVEsQ0FBQzZDLEtBQUssQ0FBQ0MsVUFBVSxFQUN6QjtRQUFFTjtNQUFLLENBQUMsRUFDUmQsTUFBTSxFQUNOZixHQUFHLENBQUNvQyxJQUNOLENBQUM7TUFDRCxJQUFJSixhQUFhLEVBQUVILElBQUksRUFBRVEsS0FBSyxFQUFFO1FBQzlCYixRQUFRLEdBQUdRLGFBQWEsRUFBRUgsSUFBSSxFQUFFUSxLQUFLO1FBQ3JDVixXQUFXLEdBQUdELElBQUksQ0FBQ0UsT0FBTyxDQUFDSixRQUFRLENBQUM7TUFDdEM7TUFFQSxJQUFJYyxnQkFBZ0IsQ0FBQ3RDLEdBQUcsRUFBRXlCLGVBQWUsQ0FBQyxFQUFFO1FBQzFDQSxlQUFlLENBQUNjLGdCQUFnQixDQUFDeEIsTUFBTSxFQUFFUyxRQUFRLEVBQUV4QixHQUFHLEVBQUVDLEdBQUcsRUFBRTBCLFdBQVcsQ0FBQyxDQUFDYSxLQUFLLENBQUMsTUFBTTtVQUNwRnZDLEdBQUcsQ0FBQ2tCLE1BQU0sQ0FBQyxHQUFHLENBQUM7VUFDZmxCLEdBQUcsQ0FBQ2xCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDO1VBQ3JDa0IsR0FBRyxDQUFDd0MsR0FBRyxDQUFDLGlCQUFpQixDQUFDO1FBQzVCLENBQUMsQ0FBQztRQUNGO01BQ0Y7TUFFQSxJQUFJQyxJQUFJLEdBQUcsTUFBTWpCLGVBQWUsQ0FBQ2tCLFdBQVcsQ0FBQzVCLE1BQU0sRUFBRVMsUUFBUSxDQUFDLENBQUNnQixLQUFLLENBQUMsTUFBTTtRQUN6RXZDLEdBQUcsQ0FBQ2tCLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDZmxCLEdBQUcsQ0FBQ2xCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDO1FBQ3JDa0IsR0FBRyxDQUFDd0MsR0FBRyxDQUFDLGlCQUFpQixDQUFDO01BQzVCLENBQUMsQ0FBQztNQUNGLElBQUksQ0FBQ0MsSUFBSSxFQUFFO1FBQ1Q7TUFDRjtNQUNBYixJQUFJLEdBQUcsSUFBSTFCLGFBQUssQ0FBQzJCLElBQUksQ0FBQ04sUUFBUSxFQUFFO1FBQUVPLE1BQU0sRUFBRVcsSUFBSSxDQUFDRSxRQUFRLENBQUMsUUFBUTtNQUFFLENBQUMsRUFBRWpCLFdBQVcsQ0FBQztNQUNqRixNQUFNa0IsU0FBUyxHQUFHLE1BQU14RCxRQUFRLENBQUM0QyxtQkFBbUIsQ0FDbEQ1QyxRQUFRLENBQUM2QyxLQUFLLENBQUNXLFNBQVMsRUFDeEI7UUFBRWhCLElBQUk7UUFBRWlCLGFBQWEsRUFBRTtNQUFNLENBQUMsRUFDOUIvQixNQUFNLEVBQ05mLEdBQUcsQ0FBQ29DLElBQ04sQ0FBQztNQUVELElBQUlTLFNBQVMsRUFBRWhCLElBQUksRUFBRTtRQUNuQkYsV0FBVyxHQUFHRCxJQUFJLENBQUNFLE9BQU8sQ0FBQ2lCLFNBQVMsQ0FBQ2hCLElBQUksQ0FBQ1EsS0FBSyxDQUFDO1FBQ2hESyxJQUFJLEdBQUdLLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSCxTQUFTLENBQUNoQixJQUFJLENBQUNvQixLQUFLLEVBQUUsUUFBUSxDQUFDO01BQ3BEO01BRUFoRCxHQUFHLENBQUNrQixNQUFNLENBQUMsR0FBRyxDQUFDO01BQ2ZsQixHQUFHLENBQUNsQixHQUFHLENBQUMsY0FBYyxFQUFFNEMsV0FBVyxDQUFDO01BQ3BDMUIsR0FBRyxDQUFDbEIsR0FBRyxDQUFDLGdCQUFnQixFQUFFMkQsSUFBSSxDQUFDUSxNQUFNLENBQUM7TUFDdEMsSUFBSUwsU0FBUyxDQUFDQyxhQUFhLEVBQUU7UUFDM0I3QyxHQUFHLENBQUNsQixHQUFHLENBQUMscUJBQXFCLEVBQUUsdUJBQXVCOEQsU0FBUyxDQUFDaEIsSUFBSSxDQUFDUSxLQUFLLEVBQUUsQ0FBQztNQUMvRTtNQUNBcEMsR0FBRyxDQUFDd0MsR0FBRyxDQUFDQyxJQUFJLENBQUM7SUFDZixDQUFDLENBQUMsT0FBT3hFLENBQUMsRUFBRTtNQUNWLE1BQU1pRixHQUFHLEdBQUc5RCxRQUFRLENBQUMrRCxZQUFZLENBQUNsRixDQUFDLEVBQUU7UUFDbkNtRCxJQUFJLEVBQUVsQixhQUFLLENBQUNDLEtBQUssQ0FBQ2lELGFBQWE7UUFDL0JDLE9BQU8sRUFBRSx3QkFBd0I5QixRQUFRO01BQzNDLENBQUMsQ0FBQztNQUNGdkIsR0FBRyxDQUFDa0IsTUFBTSxDQUFDLEdBQUcsQ0FBQztNQUNmbEIsR0FBRyxDQUFDbUIsSUFBSSxDQUFDO1FBQUVDLElBQUksRUFBRThCLEdBQUcsQ0FBQzlCLElBQUk7UUFBRUUsS0FBSyxFQUFFNEIsR0FBRyxDQUFDRztNQUFRLENBQUMsQ0FBQztJQUNsRDtFQUNGO0VBRUEsTUFBTTNDLGFBQWFBLENBQUNYLEdBQUcsRUFBRUMsR0FBRyxFQUFFQyxJQUFJLEVBQUU7SUFDbEMsTUFBTWEsTUFBTSxHQUFHZixHQUFHLENBQUNlLE1BQU07SUFDekIsTUFBTXdDLElBQUksR0FBR3ZELEdBQUcsQ0FBQ29DLElBQUksQ0FBQ21CLElBQUk7SUFDMUIsTUFBTUMsUUFBUSxHQUFHeEQsR0FBRyxDQUFDb0MsSUFBSSxDQUFDb0IsUUFBUTtJQUNsQyxNQUFNQyxRQUFRLEdBQUdGLElBQUksSUFBSXBELGFBQUssQ0FBQ3VELGNBQWMsQ0FBQ0QsUUFBUSxDQUFDRixJQUFJLENBQUM7SUFDNUQsSUFBSSxDQUFDQyxRQUFRLElBQUksQ0FBQ3pDLE1BQU0sQ0FBQzRDLFVBQVUsQ0FBQ0Msc0JBQXNCLElBQUlILFFBQVEsRUFBRTtNQUN0RXZELElBQUksQ0FDRixJQUFJQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUN5RCxlQUFlLEVBQUUsNENBQTRDLENBQzNGLENBQUM7TUFDRDtJQUNGO0lBQ0EsSUFBSSxDQUFDTCxRQUFRLElBQUksQ0FBQ3pDLE1BQU0sQ0FBQzRDLFVBQVUsQ0FBQ0csMEJBQTBCLElBQUksQ0FBQ0wsUUFBUSxJQUFJRixJQUFJLEVBQUU7TUFDbkZyRCxJQUFJLENBQ0YsSUFBSUMsYUFBSyxDQUFDQyxLQUFLLENBQ2JELGFBQUssQ0FBQ0MsS0FBSyxDQUFDeUQsZUFBZSxFQUMzQixnREFDRixDQUNGLENBQUM7TUFDRDtJQUNGO0lBQ0EsSUFBSSxDQUFDTCxRQUFRLElBQUksQ0FBQ3pDLE1BQU0sQ0FBQzRDLFVBQVUsQ0FBQ0ksZUFBZSxJQUFJLENBQUNSLElBQUksRUFBRTtNQUM1RHJELElBQUksQ0FBQyxJQUFJQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUN5RCxlQUFlLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztNQUN4RjtJQUNGO0lBQ0EsTUFBTXBDLGVBQWUsR0FBR1YsTUFBTSxDQUFDVSxlQUFlO0lBQzlDLE1BQU07TUFBRUQ7SUFBUyxDQUFDLEdBQUd4QixHQUFHLENBQUNpQixNQUFNO0lBQy9CLE1BQU1VLFdBQVcsR0FBRzNCLEdBQUcsQ0FBQ2xCLEdBQUcsQ0FBQyxjQUFjLENBQUM7SUFFM0MsSUFBSSxDQUFDa0IsR0FBRyxDQUFDZ0UsSUFBSSxJQUFJLENBQUNoRSxHQUFHLENBQUNnRSxJQUFJLENBQUNkLE1BQU0sRUFBRTtNQUNqQ2hELElBQUksQ0FBQyxJQUFJQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUN5RCxlQUFlLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztNQUMxRTtJQUNGO0lBRUEsTUFBTXRDLEtBQUssR0FBR0UsZUFBZSxDQUFDd0MsZ0JBQWdCLENBQUN6QyxRQUFRLENBQUM7SUFDeEQsSUFBSUQsS0FBSyxFQUFFO01BQ1RyQixJQUFJLENBQUNxQixLQUFLLENBQUM7TUFDWDtJQUNGO0lBRUEsTUFBTTJDLGNBQWMsR0FBR25ELE1BQU0sQ0FBQzRDLFVBQVUsRUFBRU8sY0FBYztJQUN4RCxJQUFJLENBQUNWLFFBQVEsSUFBSVUsY0FBYyxFQUFFO01BQy9CLE1BQU1DLGdCQUFnQixHQUFHQyxTQUFTLElBQUk7UUFDcEMsT0FBT0YsY0FBYyxDQUFDRyxJQUFJLENBQUNDLEdBQUcsSUFBSTtVQUNoQyxJQUFJQSxHQUFHLEtBQUssR0FBRyxFQUFFO1lBQ2YsT0FBTyxJQUFJO1VBQ2I7VUFDQSxNQUFNQyxLQUFLLEdBQUcsSUFBSUMsTUFBTSxDQUFDRixHQUFHLENBQUM7VUFDN0IsSUFBSUMsS0FBSyxDQUFDRSxJQUFJLENBQUNMLFNBQVMsQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sSUFBSTtVQUNiO1FBQ0YsQ0FBQyxDQUFDO01BQ0osQ0FBQztNQUNELElBQUlBLFNBQVMsR0FBR3pDLFdBQVc7TUFDM0IsSUFBSUgsUUFBUSxJQUFJQSxRQUFRLENBQUNrRCxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDdENOLFNBQVMsR0FBRzVDLFFBQVEsQ0FBQ21ELFNBQVMsQ0FBQ25ELFFBQVEsQ0FBQ29ELFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDL0QsQ0FBQyxNQUFNLElBQUlqRCxXQUFXLElBQUlBLFdBQVcsQ0FBQytDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNuRE4sU0FBUyxHQUFHekMsV0FBVyxDQUFDa0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN2QztNQUNBVCxTQUFTLEdBQUdBLFNBQVMsRUFBRVMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFQyxJQUFJLENBQUMsRUFBRSxDQUFDO01BRTNDLElBQUlWLFNBQVMsSUFBSSxDQUFDRCxnQkFBZ0IsQ0FBQ0MsU0FBUyxDQUFDLEVBQUU7UUFDN0NsRSxJQUFJLENBQ0YsSUFBSUMsYUFBSyxDQUFDQyxLQUFLLENBQ2JELGFBQUssQ0FBQ0MsS0FBSyxDQUFDeUQsZUFBZSxFQUMzQiw0QkFBNEJPLFNBQVMsZUFDdkMsQ0FDRixDQUFDO1FBQ0Q7TUFDRjtJQUNGO0lBRUEsTUFBTXJDLE1BQU0sR0FBRy9CLEdBQUcsQ0FBQ2dFLElBQUksQ0FBQ3BCLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDMUMsTUFBTWYsSUFBSSxHQUFHLElBQUkxQixhQUFLLENBQUMyQixJQUFJLENBQUNOLFFBQVEsRUFBRTtNQUFFTztJQUFPLENBQUMsRUFBRUosV0FBVyxDQUFDO0lBQzlELE1BQU07TUFBRW9ELFFBQVEsR0FBRyxDQUFDLENBQUM7TUFBRUMsSUFBSSxHQUFHLENBQUM7SUFBRSxDQUFDLEdBQUdoRixHQUFHLENBQUNpRixRQUFRLElBQUksQ0FBQyxDQUFDO0lBQ3ZELElBQUk7TUFDRjtNQUNBM0YsS0FBSyxDQUFDNEYsdUJBQXVCLENBQUNuRSxNQUFNLEVBQUVnRSxRQUFRLENBQUM7TUFDL0N6RixLQUFLLENBQUM0Rix1QkFBdUIsQ0FBQ25FLE1BQU0sRUFBRWlFLElBQUksQ0FBQztJQUM3QyxDQUFDLENBQUMsT0FBT3pELEtBQUssRUFBRTtNQUNkckIsSUFBSSxDQUFDLElBQUlDLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQytFLGdCQUFnQixFQUFFNUQsS0FBSyxDQUFDLENBQUM7TUFDMUQ7SUFDRjtJQUNBTSxJQUFJLENBQUN1RCxPQUFPLENBQUNKLElBQUksQ0FBQztJQUNsQm5ELElBQUksQ0FBQ3dELFdBQVcsQ0FBQ04sUUFBUSxDQUFDO0lBQzFCLE1BQU1PLFFBQVEsR0FBR3ZDLE1BQU0sQ0FBQ3dDLFVBQVUsQ0FBQ3ZGLEdBQUcsQ0FBQ2dFLElBQUksQ0FBQztJQUM1QyxNQUFNd0IsVUFBVSxHQUFHO01BQUUzRCxJQUFJO01BQUV5RDtJQUFTLENBQUM7SUFDckMsSUFBSTtNQUNGO01BQ0EsTUFBTXRELGFBQWEsR0FBRyxNQUFNM0MsUUFBUSxDQUFDNEMsbUJBQW1CLENBQ3RENUMsUUFBUSxDQUFDNkMsS0FBSyxDQUFDdUQsVUFBVSxFQUN6QkQsVUFBVSxFQUNWekUsTUFBTSxFQUNOZixHQUFHLENBQUNvQyxJQUNOLENBQUM7TUFDRCxJQUFJc0QsVUFBVTtNQUNkO01BQ0EsSUFBSTFELGFBQWEsWUFBWTdCLGFBQUssQ0FBQzJCLElBQUksRUFBRTtRQUN2QzBELFVBQVUsQ0FBQzNELElBQUksR0FBR0csYUFBYTtRQUMvQixJQUFJQSxhQUFhLENBQUMyRCxHQUFHLENBQUMsQ0FBQyxFQUFFO1VBQ3ZCO1VBQ0FILFVBQVUsQ0FBQ0YsUUFBUSxHQUFHLElBQUk7VUFDMUJJLFVBQVUsR0FBRztZQUNYQyxHQUFHLEVBQUUzRCxhQUFhLENBQUMyRCxHQUFHLENBQUMsQ0FBQztZQUN4QkMsSUFBSSxFQUFFNUQsYUFBYSxDQUFDSztVQUN0QixDQUFDO1FBQ0g7TUFDRjtNQUNBO01BQ0EsSUFBSSxDQUFDcUQsVUFBVSxFQUFFO1FBQ2Y7UUFDQSxNQUFNRyxVQUFVLEdBQUc5QyxNQUFNLENBQUNDLElBQUksQ0FBQ3dDLFVBQVUsQ0FBQzNELElBQUksQ0FBQ29CLEtBQUssRUFBRSxRQUFRLENBQUM7UUFDL0R1QyxVQUFVLENBQUNGLFFBQVEsR0FBR3ZDLE1BQU0sQ0FBQ3dDLFVBQVUsQ0FBQ00sVUFBVSxDQUFDO1FBQ25EO1FBQ0EsTUFBTUMsV0FBVyxHQUFHO1VBQ2xCZixRQUFRLEVBQUVTLFVBQVUsQ0FBQzNELElBQUksQ0FBQ2tFO1FBQzVCLENBQUM7UUFDRDtRQUNBO1FBQ0EsTUFBTUMsUUFBUSxHQUNaOUcsTUFBTSxDQUFDK0csSUFBSSxDQUFDVCxVQUFVLENBQUMzRCxJQUFJLENBQUNxRSxLQUFLLENBQUMsQ0FBQ2hELE1BQU0sR0FBRyxDQUFDLEdBQUc7VUFBRThCLElBQUksRUFBRVEsVUFBVSxDQUFDM0QsSUFBSSxDQUFDcUU7UUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RGaEgsTUFBTSxDQUFDaUgsTUFBTSxDQUFDTCxXQUFXLEVBQUVFLFFBQVEsQ0FBQztRQUNwQztRQUNBLE1BQU1JLGdCQUFnQixHQUFHLE1BQU0zRSxlQUFlLENBQUM0RSxVQUFVLENBQ3ZEdEYsTUFBTSxFQUNOeUUsVUFBVSxDQUFDM0QsSUFBSSxDQUFDUSxLQUFLLEVBQ3JCd0QsVUFBVSxFQUNWTCxVQUFVLENBQUMzRCxJQUFJLENBQUN5RSxPQUFPLENBQUMvRixJQUFJLEVBQzVCdUYsV0FDRixDQUFDO1FBQ0Q7UUFDQU4sVUFBVSxDQUFDM0QsSUFBSSxDQUFDUSxLQUFLLEdBQUcrRCxnQkFBZ0IsQ0FBQ1IsSUFBSTtRQUM3Q0osVUFBVSxDQUFDM0QsSUFBSSxDQUFDMEUsSUFBSSxHQUFHSCxnQkFBZ0IsQ0FBQ1QsR0FBRztRQUMzQ0gsVUFBVSxDQUFDM0QsSUFBSSxDQUFDMkUsWUFBWSxHQUFHLElBQUk7UUFDbkNoQixVQUFVLENBQUMzRCxJQUFJLENBQUM0RSxhQUFhLEdBQUdDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDbkIsVUFBVSxDQUFDM0QsSUFBSSxDQUFDO1FBQ2hFNkQsVUFBVSxHQUFHO1VBQ1hDLEdBQUcsRUFBRVMsZ0JBQWdCLENBQUNULEdBQUc7VUFDekJDLElBQUksRUFBRVEsZ0JBQWdCLENBQUNSO1FBQ3pCLENBQUM7TUFDSDtNQUNBO01BQ0EsTUFBTXZHLFFBQVEsQ0FBQzRDLG1CQUFtQixDQUFDNUMsUUFBUSxDQUFDNkMsS0FBSyxDQUFDMEUsU0FBUyxFQUFFcEIsVUFBVSxFQUFFekUsTUFBTSxFQUFFZixHQUFHLENBQUNvQyxJQUFJLENBQUM7TUFDMUZuQyxHQUFHLENBQUNrQixNQUFNLENBQUMsR0FBRyxDQUFDO01BQ2ZsQixHQUFHLENBQUNsQixHQUFHLENBQUMsVUFBVSxFQUFFMkcsVUFBVSxDQUFDQyxHQUFHLENBQUM7TUFDbkMxRixHQUFHLENBQUNtQixJQUFJLENBQUNzRSxVQUFVLENBQUM7SUFDdEIsQ0FBQyxDQUFDLE9BQU94SCxDQUFDLEVBQUU7TUFDVjJJLGVBQU0sQ0FBQ3RGLEtBQUssQ0FBQyx5QkFBeUIsRUFBRXJELENBQUMsQ0FBQztNQUMxQyxNQUFNcUQsS0FBSyxHQUFHbEMsUUFBUSxDQUFDK0QsWUFBWSxDQUFDbEYsQ0FBQyxFQUFFO1FBQ3JDbUQsSUFBSSxFQUFFbEIsYUFBSyxDQUFDQyxLQUFLLENBQUN5RCxlQUFlO1FBQ2pDUCxPQUFPLEVBQUUseUJBQXlCa0MsVUFBVSxDQUFDM0QsSUFBSSxDQUFDUSxLQUFLO01BQ3pELENBQUMsQ0FBQztNQUNGbkMsSUFBSSxDQUFDcUIsS0FBSyxDQUFDO0lBQ2I7RUFDRjtFQUVBLE1BQU1ULGFBQWFBLENBQUNkLEdBQUcsRUFBRUMsR0FBRyxFQUFFQyxJQUFJLEVBQUU7SUFDbEMsSUFBSTtNQUNGLE1BQU07UUFBRXVCO01BQWdCLENBQUMsR0FBR3pCLEdBQUcsQ0FBQ2UsTUFBTTtNQUN0QyxNQUFNO1FBQUVTO01BQVMsQ0FBQyxHQUFHeEIsR0FBRyxDQUFDaUIsTUFBTTtNQUMvQjtNQUNBLE1BQU1ZLElBQUksR0FBRyxJQUFJMUIsYUFBSyxDQUFDMkIsSUFBSSxDQUFDTixRQUFRLENBQUM7TUFDckNLLElBQUksQ0FBQzBFLElBQUksR0FBRyxNQUFNOUUsZUFBZSxDQUFDcUYsT0FBTyxDQUFDQyxlQUFlLENBQUMvRyxHQUFHLENBQUNlLE1BQU0sRUFBRVMsUUFBUSxDQUFDO01BQy9FLE1BQU1nRSxVQUFVLEdBQUc7UUFBRTNELElBQUk7UUFBRXlELFFBQVEsRUFBRTtNQUFLLENBQUM7TUFDM0MsTUFBTWpHLFFBQVEsQ0FBQzRDLG1CQUFtQixDQUNoQzVDLFFBQVEsQ0FBQzZDLEtBQUssQ0FBQzhFLFlBQVksRUFDM0J4QixVQUFVLEVBQ1Z4RixHQUFHLENBQUNlLE1BQU0sRUFDVmYsR0FBRyxDQUFDb0MsSUFDTixDQUFDO01BQ0Q7TUFDQSxNQUFNWCxlQUFlLENBQUN3RixVQUFVLENBQUNqSCxHQUFHLENBQUNlLE1BQU0sRUFBRVMsUUFBUSxDQUFDO01BQ3REO01BQ0EsTUFBTW5DLFFBQVEsQ0FBQzRDLG1CQUFtQixDQUNoQzVDLFFBQVEsQ0FBQzZDLEtBQUssQ0FBQ2dGLFdBQVcsRUFDMUIxQixVQUFVLEVBQ1Z4RixHQUFHLENBQUNlLE1BQU0sRUFDVmYsR0FBRyxDQUFDb0MsSUFDTixDQUFDO01BQ0RuQyxHQUFHLENBQUNrQixNQUFNLENBQUMsR0FBRyxDQUFDO01BQ2Y7TUFDQWxCLEdBQUcsQ0FBQ3dDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLE9BQU92RSxDQUFDLEVBQUU7TUFDVjJJLGVBQU0sQ0FBQ3RGLEtBQUssQ0FBQyx5QkFBeUIsRUFBRXJELENBQUMsQ0FBQztNQUMxQyxNQUFNcUQsS0FBSyxHQUFHbEMsUUFBUSxDQUFDK0QsWUFBWSxDQUFDbEYsQ0FBQyxFQUFFO1FBQ3JDbUQsSUFBSSxFQUFFbEIsYUFBSyxDQUFDQyxLQUFLLENBQUMrRyxpQkFBaUI7UUFDbkM3RCxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQUM7TUFDRnBELElBQUksQ0FBQ3FCLEtBQUssQ0FBQztJQUNiO0VBQ0Y7RUFFQSxNQUFNekIsZUFBZUEsQ0FBQ0UsR0FBRyxFQUFFQyxHQUFHLEVBQUU7SUFDOUIsSUFBSTtNQUNGLE1BQU1jLE1BQU0sR0FBR0MsZUFBTSxDQUFDbEMsR0FBRyxDQUFDa0IsR0FBRyxDQUFDaUIsTUFBTSxDQUFDQyxLQUFLLENBQUM7TUFDM0MsTUFBTTtRQUFFTztNQUFnQixDQUFDLEdBQUdWLE1BQU07TUFDbEMsTUFBTTtRQUFFUztNQUFTLENBQUMsR0FBR3hCLEdBQUcsQ0FBQ2lCLE1BQU07TUFDL0IsTUFBTXlCLElBQUksR0FBRyxNQUFNakIsZUFBZSxDQUFDMkYsV0FBVyxDQUFDNUYsUUFBUSxDQUFDO01BQ3hEdkIsR0FBRyxDQUFDa0IsTUFBTSxDQUFDLEdBQUcsQ0FBQztNQUNmbEIsR0FBRyxDQUFDbUIsSUFBSSxDQUFDc0IsSUFBSSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxNQUFNO01BQ056QyxHQUFHLENBQUNrQixNQUFNLENBQUMsR0FBRyxDQUFDO01BQ2ZsQixHQUFHLENBQUNtQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZDtFQUNGO0FBQ0Y7QUFBQ2lHLE9BQUEsQ0FBQTlILFdBQUEsR0FBQUEsV0FBQTtBQUVELFNBQVMrQyxnQkFBZ0JBLENBQUN0QyxHQUFHLEVBQUV5QixlQUFlLEVBQUU7RUFDOUMsTUFBTTZGLEtBQUssR0FBRyxDQUFDdEgsR0FBRyxDQUFDbEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssRUFBRStGLEtBQUssQ0FBQyxHQUFHLENBQUM7RUFDcEQsTUFBTTBDLEtBQUssR0FBR0MsTUFBTSxDQUFDRixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsTUFBTTdFLEdBQUcsR0FBRytFLE1BQU0sQ0FBQ0YsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzVCLE9BQ0UsQ0FBQyxDQUFDRyxLQUFLLENBQUNGLEtBQUssQ0FBQyxJQUFJLENBQUNFLEtBQUssQ0FBQ2hGLEdBQUcsQ0FBQyxLQUFLLE9BQU9oQixlQUFlLENBQUNxRixPQUFPLENBQUN2RSxnQkFBZ0IsS0FBSyxVQUFVO0FBRXBHIiwiaWdub3JlTGlzdCI6W119
508
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXhwcmVzcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiTWlkZGxld2FyZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9ub2RlIiwiX0NvbmZpZyIsIl9sb2dnZXIiLCJfc3RyZWFtIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidHJpZ2dlcnMiLCJVdGlscyIsImNyZWF0ZVNpemVMaW1pdGVkU3RyZWFtIiwic291cmNlIiwibWF4Qnl0ZXMiLCJ0b3RhbEJ5dGVzIiwic3RhcnRlZCIsInNvdXJjZUVuZGVkIiwib25EYXRhIiwib25FbmQiLCJvbkVycm9yIiwib3V0cHV0IiwiUmVhZGFibGUiLCJyZWFkIiwiY2h1bmsiLCJsZW5ndGgiLCJkZXN0cm95IiwiUGFyc2UiLCJFcnJvciIsIkZJTEVfU0FWRV9FUlJPUiIsInB1c2giLCJwYXVzZSIsImVyciIsIm9uIiwicmVzdW1lIiwiY2FsbGJhY2siLCJyZW1vdmVMaXN0ZW5lciIsIkZpbGVzUm91dGVyIiwiZXhwcmVzc1JvdXRlciIsIm1heFVwbG9hZFNpemUiLCJyb3V0ZXIiLCJleHByZXNzIiwiUm91dGVyIiwiZ2V0SGFuZGxlciIsIm1ldGFkYXRhSGFuZGxlciIsInBvc3QiLCJyZXEiLCJyZXMiLCJuZXh0IiwiSU5WQUxJRF9GSUxFX05BTUUiLCJfYm9keVBhcnNpbmdNaWRkbGV3YXJlIiwiaGFuZGxlUGFyc2VIZWFkZXJzIiwiaGFuZGxlUGFyc2VTZXNzaW9uIiwiY3JlYXRlSGFuZGxlciIsImJpbmQiLCJkZWxldGUiLCJlbmZvcmNlTWFzdGVyS2V5QWNjZXNzIiwiZGVsZXRlSGFuZGxlciIsImNvbmZpZyIsIkNvbmZpZyIsInBhcmFtcyIsImFwcElkIiwic3RhdHVzIiwianNvbiIsImNvZGUiLCJPUEVSQVRJT05fRk9SQklEREVOIiwiZXJyb3IiLCJmaWxlbmFtZSIsImZpbGVzQ29udHJvbGxlciIsIm1pbWUiLCJjb250ZW50VHlwZSIsImdldFR5cGUiLCJmaWxlIiwiRmlsZSIsImJhc2U2NCIsInRyaWdnZXJSZXN1bHQiLCJtYXliZVJ1bkZpbGVUcmlnZ2VyIiwiVHlwZXMiLCJiZWZvcmVGaW5kIiwiYXV0aCIsIl9uYW1lIiwiaXNGaWxlU3RyZWFtYWJsZSIsImhhbmRsZUZpbGVTdHJlYW0iLCJjYXRjaCIsImVuZCIsImRhdGEiLCJnZXRGaWxlRGF0YSIsInRvU3RyaW5nIiwiYWZ0ZXJGaW5kIiwiZm9yY2VEb3dubG9hZCIsIkJ1ZmZlciIsImZyb20iLCJfZGF0YSIsInJlc29sdmVFcnJvciIsIlNDUklQVF9GQUlMRUQiLCJtZXNzYWdlIiwicmF3UGFyc2VyIiwicmF3IiwidHlwZSIsImxpbWl0IiwiX21heFVwbG9hZFNpemVCeXRlcyIsInBhcnNlU2l6ZVRvQnl0ZXMiLCJ1c2VyIiwiaXNNYXN0ZXIiLCJpc0xpbmtlZCIsIkFub255bW91c1V0aWxzIiwiZmlsZVVwbG9hZCIsImVuYWJsZUZvckFub255bW91c1VzZXIiLCJlbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciIsImVuYWJsZUZvclB1YmxpYyIsInZhbGlkYXRlRmlsZW5hbWUiLCJmaWxlRXh0ZW5zaW9ucyIsImlzVmFsaWRFeHRlbnNpb24iLCJleHRlbnNpb24iLCJzb21lIiwiZXh0IiwicmVnZXgiLCJSZWdFeHAiLCJ0ZXN0IiwiaW5jbHVkZXMiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInNwbGl0Iiwiam9pbiIsImJvZHkiLCJfaGFuZGxlQnVmZmVyZWRVcGxvYWQiLCJfaGFuZGxlU3RyZWFtVXBsb2FkIiwibWV0YWRhdGEiLCJ0YWdzIiwiZmlsZURhdGEiLCJjaGVja1Byb2hpYml0ZWRLZXl3b3JkcyIsIklOVkFMSURfS0VZX05BTUUiLCJzZXRUYWdzIiwic2V0TWV0YWRhdGEiLCJmaWxlU2l6ZSIsImJ5dGVMZW5ndGgiLCJmaWxlT2JqZWN0IiwiYmVmb3JlU2F2ZSIsInNhdmVSZXN1bHQiLCJ1cmwiLCJuYW1lIiwiYnVmZmVyRGF0YSIsIl9zb3VyY2UiLCJmb3JtYXQiLCJidWZmZXIiLCJmaWxlT3B0aW9ucyIsIl9tZXRhZGF0YSIsImZpbGVUYWdzIiwia2V5cyIsIl90YWdzIiwiYXNzaWduIiwiY3JlYXRlRmlsZVJlc3VsdCIsImNyZWF0ZUZpbGUiLCJfdXJsIiwiX3JlcXVlc3RUYXNrIiwiX3ByZXZpb3VzU2F2ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiYWZ0ZXJTYXZlIiwibG9nZ2VyIiwic3RyZWFtIiwiY29udGVudExlbmd0aCIsInBhcnNlSW50IiwiaGFzRXh0ZW5zaW9uIiwic291cmNlVHlwZSIsImFkYXB0ZXIiLCJnZXRGaWxlTG9jYXRpb24iLCJiZWZvcmVEZWxldGUiLCJkZWxldGVGaWxlIiwiYWZ0ZXJEZWxldGUiLCJGSUxFX0RFTEVURV9FUlJPUiIsImdldE1ldGFkYXRhIiwiZXhwb3J0cyIsInJhbmdlIiwic3RhcnQiLCJOdW1iZXIiLCJpc05hTiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0ZpbGVzUm91dGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0ICogYXMgTWlkZGxld2FyZXMgZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IENvbmZpZyBmcm9tICcuLi9Db25maWcnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuY29uc3QgdHJpZ2dlcnMgPSByZXF1aXJlKCcuLi90cmlnZ2VycycpO1xuY29uc3QgVXRpbHMgPSByZXF1aXJlKCcuLi9VdGlscycpO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuXG4vKipcbiAqIFdyYXBzIGEgcmVhZGFibGUgc3RyZWFtIGluIGEgUmVhZGFibGUgdGhhdCBlbmZvcmNlcyBhIGJ5dGUgc2l6ZSBsaW1pdC5cbiAqIERhdGEgZmxvdyBpcyBsYXp5OiB0aGUgc291cmNlIGlzIG5vdCByZWFkIHVudGlsIGEgY29uc3VtZXIgc3RhcnRzIHJlYWRpbmdcbiAqIGZyb20gdGhlIHJldHVybmVkIHN0cmVhbSAodmlhIHBpcGUgb3IgJ2RhdGEnIGxpc3RlbmVyKS4gVGhpcyBlbnN1cmVzIHRoZVxuICogY29uc3VtZXIncyBlcnJvciBsaXN0ZW5lciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IGRhdGEgKG9yIGVycm9yKSBpcyBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2l6ZUxpbWl0ZWRTdHJlYW0oc291cmNlLCBtYXhCeXRlcykge1xuICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gIGxldCBzdGFydGVkID0gZmFsc2U7XG4gIGxldCBzb3VyY2VFbmRlZCA9IGZhbHNlO1xuICBsZXQgb25EYXRhLCBvbkVuZCwgb25FcnJvcjtcblxuICBjb25zdCBvdXRwdXQgPSBuZXcgUmVhZGFibGUoe1xuICAgIHJlYWQoKSB7XG4gICAgICBpZiAoIXN0YXJ0ZWQpIHtcbiAgICAgICAgc3RhcnRlZCA9IHRydWU7XG5cbiAgICAgICAgb25EYXRhID0gKGNodW5rKSA9PiB7XG4gICAgICAgICAgdG90YWxCeXRlcyArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsQnl0ZXMgPiBtYXhCeXRlcykge1xuICAgICAgICAgICAgb3V0cHV0LmRlc3Ryb3koXG4gICAgICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5GSUxFX1NBVkVfRVJST1IsXG4gICAgICAgICAgICAgICAgYEZpbGUgc2l6ZSBleGNlZWRzIG1heGltdW0gYWxsb3dlZDogJHttYXhCeXRlc30gYnl0ZXMuYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW91dHB1dC5wdXNoKGNodW5rKSkge1xuICAgICAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG9uRW5kID0gKCkgPT4ge1xuICAgICAgICAgIHNvdXJjZUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgICBvdXRwdXQucHVzaChudWxsKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvbkVycm9yID0gKGVycikgPT4gb3V0cHV0LmRlc3Ryb3koZXJyKTtcblxuICAgICAgICBzb3VyY2Uub24oJ2RhdGEnLCBvbkRhdGEpO1xuICAgICAgICBzb3VyY2Uub24oJ2VuZCcsIG9uRW5kKTtcbiAgICAgICAgc291cmNlLm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXN1bWUgc291cmNlIGluIGNhc2UgaXQgd2FzIHBhdXNlZCBkdWUgdG8gYmFja3ByZXNzdXJlXG4gICAgICBpZiAoIXNvdXJjZUVuZGVkKSB7XG4gICAgICAgIHNvdXJjZS5yZXN1bWUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlc3Ryb3koZXJyLCBjYWxsYmFjaykge1xuICAgICAgaWYgKG9uRGF0YSkge1xuICAgICAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbkRhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKG9uRW5kKSB7XG4gICAgICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25FbmQpO1xuICAgICAgfVxuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgfVxuICAgICAgLy8gU3VwcHJlc3MgZXJyb3JzIGVtaXR0ZWQgZHVyaW5nIGRyYWluIChlLmcuIGNsaWVudCBkaXNjb25uZWN0KVxuICAgICAgc291cmNlLm9uKCdlcnJvcicsICgpID0+IHt9KTtcbiAgICAgIGlmICghc291cmNlRW5kZWQpIHtcbiAgICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBGaWxlc1JvdXRlciB7XG4gIGV4cHJlc3NSb3V0ZXIoeyBtYXhVcGxvYWRTaXplID0gJzIwTWInIH0gPSB7fSkge1xuICAgIHZhciByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuICAgIHJvdXRlci5nZXQoJy9maWxlcy86YXBwSWQvOmZpbGVuYW1lJywgdGhpcy5nZXRIYW5kbGVyKTtcbiAgICByb3V0ZXIuZ2V0KCcvZmlsZXMvOmFwcElkL21ldGFkYXRhLzpmaWxlbmFtZScsIHRoaXMubWV0YWRhdGFIYW5kbGVyKTtcblxuICAgIHJvdXRlci5wb3N0KCcvZmlsZXMnLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbiAgICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfRklMRV9OQU1FLCAnRmlsZW5hbWUgbm90IHByb3ZpZGVkLicpKTtcbiAgICB9KTtcblxuICAgIHJvdXRlci5wb3N0KFxuICAgICAgJy9maWxlcy86ZmlsZW5hbWUnLFxuICAgICAgdGhpcy5fYm9keVBhcnNpbmdNaWRkbGV3YXJlKG1heFVwbG9hZFNpemUpLFxuICAgICAgTWlkZGxld2FyZXMuaGFuZGxlUGFyc2VIZWFkZXJzLFxuICAgICAgTWlkZGxld2FyZXMuaGFuZGxlUGFyc2VTZXNzaW9uLFxuICAgICAgdGhpcy5jcmVhdGVIYW5kbGVyLmJpbmQodGhpcylcbiAgICApO1xuXG4gICAgcm91dGVyLmRlbGV0ZShcbiAgICAgICcvZmlsZXMvOmZpbGVuYW1lJyxcbiAgICAgIE1pZGRsZXdhcmVzLmhhbmRsZVBhcnNlSGVhZGVycyxcbiAgICAgIE1pZGRsZXdhcmVzLmhhbmRsZVBhcnNlU2Vzc2lvbixcbiAgICAgIE1pZGRsZXdhcmVzLmVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsXG4gICAgICB0aGlzLmRlbGV0ZUhhbmRsZXJcbiAgICApO1xuICAgIHJldHVybiByb3V0ZXI7XG4gIH1cblxuICBhc3luYyBnZXRIYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChyZXEucGFyYW1zLmFwcElkKTtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmVzLnN0YXR1cyg0MDMpO1xuICAgICAgcmVzLmpzb24oeyBjb2RlOiBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLCBlcnJvcjogJ0ludmFsaWQgYXBwbGljYXRpb24gSUQuJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZmlsZW5hbWUgPSByZXEucGFyYW1zLmZpbGVuYW1lO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlc0NvbnRyb2xsZXIgPSBjb25maWcuZmlsZXNDb250cm9sbGVyO1xuICAgICAgY29uc3QgbWltZSA9IChhd2FpdCBpbXBvcnQoJ21pbWUnKSkuZGVmYXVsdDtcbiAgICAgIGxldCBjb250ZW50VHlwZSA9IG1pbWUuZ2V0VHlwZShmaWxlbmFtZSk7XG4gICAgICBsZXQgZmlsZSA9IG5ldyBQYXJzZS5GaWxlKGZpbGVuYW1lLCB7IGJhc2U2NDogJycgfSwgY29udGVudFR5cGUpO1xuICAgICAgY29uc3QgdHJpZ2dlclJlc3VsdCA9IGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuRmlsZVRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZUZpbmQsXG4gICAgICAgIHsgZmlsZSB9LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcS5hdXRoXG4gICAgICApO1xuICAgICAgaWYgKHRyaWdnZXJSZXN1bHQ/LmZpbGU/Ll9uYW1lKSB7XG4gICAgICAgIGZpbGVuYW1lID0gdHJpZ2dlclJlc3VsdD8uZmlsZT8uX25hbWU7XG4gICAgICAgIGNvbnRlbnRUeXBlID0gbWltZS5nZXRUeXBlKGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRmlsZVN0cmVhbWFibGUocmVxLCBmaWxlc0NvbnRyb2xsZXIpKSB7XG4gICAgICAgIGZpbGVzQ29udHJvbGxlci5oYW5kbGVGaWxlU3RyZWFtKGNvbmZpZywgZmlsZW5hbWUsIHJlcSwgcmVzLCBjb250ZW50VHlwZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgICAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicpO1xuICAgICAgICAgIHJlcy5lbmQoJ0ZpbGUgbm90IGZvdW5kLicpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YSA9IGF3YWl0IGZpbGVzQ29udHJvbGxlci5nZXRGaWxlRGF0YShjb25maWcsIGZpbGVuYW1lKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgICAgcmVzLnNldCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgcmVzLmVuZCgnRmlsZSBub3QgZm91bmQuJyk7XG4gICAgICB9KTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZW5hbWUsIHsgYmFzZTY0OiBkYXRhLnRvU3RyaW5nKCdiYXNlNjQnKSB9LCBjb250ZW50VHlwZSk7XG4gICAgICBjb25zdCBhZnRlckZpbmQgPSBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1bkZpbGVUcmlnZ2VyKFxuICAgICAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlckZpbmQsXG4gICAgICAgIHsgZmlsZSwgZm9yY2VEb3dubG9hZDogZmFsc2UgfSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXEuYXV0aFxuICAgICAgKTtcblxuICAgICAgaWYgKGFmdGVyRmluZD8uZmlsZSkge1xuICAgICAgICBjb250ZW50VHlwZSA9IG1pbWUuZ2V0VHlwZShhZnRlckZpbmQuZmlsZS5fbmFtZSk7XG4gICAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShhZnRlckZpbmQuZmlsZS5fZGF0YSwgJ2Jhc2U2NCcpO1xuICAgICAgfVxuXG4gICAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZSk7XG4gICAgICByZXMuc2V0KCdDb250ZW50LUxlbmd0aCcsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGlmIChhZnRlckZpbmQuZm9yY2VEb3dubG9hZCkge1xuICAgICAgICByZXMuc2V0KCdDb250ZW50LURpc3Bvc2l0aW9uJywgYGF0dGFjaG1lbnQ7ZmlsZW5hbWU9JHthZnRlckZpbmQuZmlsZS5fbmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIHJlcy5lbmQoZGF0YSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyID0gdHJpZ2dlcnMucmVzb2x2ZUVycm9yKGUsIHtcbiAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuU0NSSVBUX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogYENvdWxkIG5vdCBmaW5kIGZpbGU6ICR7ZmlsZW5hbWV9LmAsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDAzKTtcbiAgICAgIHJlcy5qc29uKHsgY29kZTogZXJyLmNvZGUsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICBfYm9keVBhcnNpbmdNaWRkbGV3YXJlKG1heFVwbG9hZFNpemUpIHtcbiAgICBjb25zdCByYXdQYXJzZXIgPSBleHByZXNzLnJhdyh7XG4gICAgICB0eXBlOiAoKSA9PiB0cnVlLFxuICAgICAgbGltaXQ6IG1heFVwbG9hZFNpemUsXG4gICAgfSk7XG4gICAgcmV0dXJuIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgaWYgKHJlcS5nZXQoJ1gtUGFyc2UtVXBsb2FkLU1vZGUnKSA9PT0gJ3N0cmVhbScpIHtcbiAgICAgICAgcmVxLl9tYXhVcGxvYWRTaXplQnl0ZXMgPSBVdGlscy5wYXJzZVNpemVUb0J5dGVzKG1heFVwbG9hZFNpemUpO1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJhd1BhcnNlcihyZXEsIHJlcywgbmV4dCk7XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUhhbmRsZXIocmVxLCByZXMsIG5leHQpIHtcbiAgICBjb25zdCBjb25maWcgPSByZXEuY29uZmlnO1xuICAgIGNvbnN0IHVzZXIgPSByZXEuYXV0aC51c2VyO1xuICAgIGNvbnN0IGlzTWFzdGVyID0gcmVxLmF1dGguaXNNYXN0ZXI7XG4gICAgY29uc3QgaXNMaW5rZWQgPSB1c2VyICYmIFBhcnNlLkFub255bW91c1V0aWxzLmlzTGlua2VkKHVzZXIpO1xuICAgIGlmICghaXNNYXN0ZXIgJiYgIWNvbmZpZy5maWxlVXBsb2FkLmVuYWJsZUZvckFub255bW91c1VzZXIgJiYgaXNMaW5rZWQpIHtcbiAgICAgIG5leHQoXG4gICAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5GSUxFX1NBVkVfRVJST1IsICdGaWxlIHVwbG9hZCBieSBhbm9ueW1vdXMgdXNlciBpcyBkaXNhYmxlZC4nKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc01hc3RlciAmJiAhY29uZmlnLmZpbGVVcGxvYWQuZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIgJiYgIWlzTGlua2VkICYmIHVzZXIpIHtcbiAgICAgIG5leHQoXG4gICAgICAgIG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5GSUxFX1NBVkVfRVJST1IsXG4gICAgICAgICAgJ0ZpbGUgdXBsb2FkIGJ5IGF1dGhlbnRpY2F0ZWQgdXNlciBpcyBkaXNhYmxlZC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNNYXN0ZXIgJiYgIWNvbmZpZy5maWxlVXBsb2FkLmVuYWJsZUZvclB1YmxpYyAmJiAhdXNlcikge1xuICAgICAgbmV4dChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLCAnRmlsZSB1cGxvYWQgYnkgcHVibGljIGlzIGRpc2FibGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlsZXNDb250cm9sbGVyID0gY29uZmlnLmZpbGVzQ29udHJvbGxlcjtcbiAgICBjb25zdCB7IGZpbGVuYW1lIH0gPSByZXEucGFyYW1zO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVxLmdldCgnQ29udGVudC10eXBlJyk7XG5cbiAgICBjb25zdCBlcnJvciA9IGZpbGVzQ29udHJvbGxlci52YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIG5leHQoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVFeHRlbnNpb25zID0gY29uZmlnLmZpbGVVcGxvYWQ/LmZpbGVFeHRlbnNpb25zO1xuICAgIGlmICghaXNNYXN0ZXIgJiYgZmlsZUV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWRFeHRlbnNpb24gPSBleHRlbnNpb24gPT4ge1xuICAgICAgICByZXR1cm4gZmlsZUV4dGVuc2lvbnMuc29tZShleHQgPT4ge1xuICAgICAgICAgIGlmIChleHQgPT09ICcqJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChleHQpO1xuICAgICAgICAgIGlmIChyZWdleC50ZXN0KGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbGV0IGV4dGVuc2lvbiA9IGNvbnRlbnRUeXBlO1xuICAgICAgaWYgKGZpbGVuYW1lICYmIGZpbGVuYW1lLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgZXh0ZW5zaW9uID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICBleHRlbnNpb24gPSBjb250ZW50VHlwZS5zcGxpdCgnLycpWzFdO1xuICAgICAgfVxuICAgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uPy5zcGxpdCgnICcpPy5qb2luKCcnKTtcblxuICAgICAgaWYgKGV4dGVuc2lvbiAmJiAhaXNWYWxpZEV4dGVuc2lvbihleHRlbnNpb24pKSB7XG4gICAgICAgIG5leHQoXG4gICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLFxuICAgICAgICAgICAgYEZpbGUgdXBsb2FkIG9mIGV4dGVuc2lvbiAke2V4dGVuc2lvbn0gaXMgZGlzYWJsZWQuYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGJvZHkgd2FzIGJ1ZmZlcmVkXG4gICAgaWYgKHJlcS5ib2R5IGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlQnVmZmVyZWRVcGxvYWQocmVxLCByZXMsIG5leHQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faGFuZGxlU3RyZWFtVXBsb2FkKHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGFzeW5jIF9oYW5kbGVCdWZmZXJlZFVwbG9hZChyZXEsIHJlcywgbmV4dCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlcS5jb25maWc7XG4gICAgY29uc3QgZmlsZXNDb250cm9sbGVyID0gY29uZmlnLmZpbGVzQ29udHJvbGxlcjtcbiAgICBjb25zdCB7IGZpbGVuYW1lIH0gPSByZXEucGFyYW1zO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVxLmdldCgnQ29udGVudC10eXBlJyk7XG5cbiAgICBpZiAoIXJlcS5ib2R5IHx8ICFyZXEuYm9keS5sZW5ndGgpIHtcbiAgICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkZJTEVfU0FWRV9FUlJPUiwgJ0ludmFsaWQgZmlsZSB1cGxvYWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2U2NCA9IHJlcS5ib2R5LnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBjb25zdCBmaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZW5hbWUsIHsgYmFzZTY0IH0sIGNvbnRlbnRUeXBlKTtcbiAgICBjb25zdCB7IG1ldGFkYXRhID0ge30sIHRhZ3MgPSB7fSB9ID0gcmVxLmZpbGVEYXRhIHx8IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyBTY2FuIHJlcXVlc3QgZGF0YSBmb3IgZGVuaWVkIGtleXdvcmRzXG4gICAgICBVdGlscy5jaGVja1Byb2hpYml0ZWRLZXl3b3Jkcyhjb25maWcsIG1ldGFkYXRhKTtcbiAgICAgIFV0aWxzLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzKGNvbmZpZywgdGFncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsIGVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpbGUuc2V0VGFncyh0YWdzKTtcbiAgICBmaWxlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICBjb25zdCBmaWxlU2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlcS5ib2R5KTtcbiAgICBjb25zdCBmaWxlT2JqZWN0ID0geyBmaWxlLCBmaWxlU2l6ZSB9O1xuICAgIHRyeSB7XG4gICAgICAvLyBydW4gYmVmb3JlU2F2ZUZpbGUgdHJpZ2dlclxuICAgICAgY29uc3QgdHJpZ2dlclJlc3VsdCA9IGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuRmlsZVRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZVNhdmUsXG4gICAgICAgIGZpbGVPYmplY3QsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxLmF1dGhcbiAgICAgICk7XG4gICAgICBsZXQgc2F2ZVJlc3VsdDtcbiAgICAgIC8vIGlmIGEgbmV3IFBhcnNlRmlsZSBpcyByZXR1cm5lZCBjaGVjayBpZiBpdCdzIGFuIGFscmVhZHkgc2F2ZWQgZmlsZVxuICAgICAgaWYgKHRyaWdnZXJSZXN1bHQgaW5zdGFuY2VvZiBQYXJzZS5GaWxlKSB7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZSA9IHRyaWdnZXJSZXN1bHQ7XG4gICAgICAgIGlmICh0cmlnZ2VyUmVzdWx0LnVybCgpKSB7XG4gICAgICAgICAgLy8gc2V0IGZpbGVTaXplIHRvIG51bGwgYmVjYXVzZSB3ZSB3b250IGtub3cgaG93IGJpZyBpdCBpcyBoZXJlXG4gICAgICAgICAgZmlsZU9iamVjdC5maWxlU2l6ZSA9IG51bGw7XG4gICAgICAgICAgc2F2ZVJlc3VsdCA9IHtcbiAgICAgICAgICAgIHVybDogdHJpZ2dlclJlc3VsdC51cmwoKSxcbiAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJSZXN1bHQuX25hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgdGhlIGZpbGUgcmV0dXJuZWQgYnkgdGhlIHRyaWdnZXIgaGFzIGFscmVhZHkgYmVlbiBzYXZlZCBza2lwIHNhdmluZyBhbnl0aGluZ1xuICAgICAgaWYgKCFzYXZlUmVzdWx0KSB7XG4gICAgICAgIC8vIHVwZGF0ZSBmaWxlU2l6ZVxuICAgICAgICBsZXQgYnVmZmVyRGF0YTtcbiAgICAgICAgaWYgKGZpbGVPYmplY3QuZmlsZS5fc291cmNlPy5mb3JtYXQgPT09ICdidWZmZXInKSB7XG4gICAgICAgICAgYnVmZmVyRGF0YSA9IGZpbGVPYmplY3QuZmlsZS5fc291cmNlLmJ1ZmZlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWZmZXJEYXRhID0gQnVmZmVyLmZyb20oZmlsZU9iamVjdC5maWxlLl9kYXRhLCAnYmFzZTY0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsZU9iamVjdC5maWxlU2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGJ1ZmZlckRhdGEpO1xuICAgICAgICAvLyBwcmVwYXJlIGZpbGUgb3B0aW9uc1xuICAgICAgICBjb25zdCBmaWxlT3B0aW9ucyA9IHtcbiAgICAgICAgICBtZXRhZGF0YTogZmlsZU9iamVjdC5maWxlLl9tZXRhZGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gc29tZSBzMy1jb21wYXRpYmxlIHByb3ZpZGVycyAoRGlnaXRhbE9jZWFuLCBMaW5vZGUpIGRvIG5vdCBhY2NlcHQgdGFnc1xuICAgICAgICAvLyBzbyB3ZSBkbyBub3QgaW5jbHVkZSB0aGUgdGFncyBvcHRpb24gaWYgaXQgaXMgZW1wdHkuXG4gICAgICAgIGNvbnN0IGZpbGVUYWdzID1cbiAgICAgICAgICBPYmplY3Qua2V5cyhmaWxlT2JqZWN0LmZpbGUuX3RhZ3MpLmxlbmd0aCA+IDAgPyB7IHRhZ3M6IGZpbGVPYmplY3QuZmlsZS5fdGFncyB9IDoge307XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZU9wdGlvbnMsIGZpbGVUYWdzKTtcbiAgICAgICAgLy8gc2F2ZSBmaWxlXG4gICAgICAgIGNvbnN0IGNyZWF0ZUZpbGVSZXN1bHQgPSBhd2FpdCBmaWxlc0NvbnRyb2xsZXIuY3JlYXRlRmlsZShcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgZmlsZU9iamVjdC5maWxlLl9uYW1lLFxuICAgICAgICAgIGJ1ZmZlckRhdGEsXG4gICAgICAgICAgZmlsZU9iamVjdC5maWxlLl9zb3VyY2UudHlwZSxcbiAgICAgICAgICBmaWxlT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICAvLyB1cGRhdGUgZmlsZSB3aXRoIG5ldyBkYXRhXG4gICAgICAgIGZpbGVPYmplY3QuZmlsZS5fbmFtZSA9IGNyZWF0ZUZpbGVSZXN1bHQubmFtZTtcbiAgICAgICAgZmlsZU9iamVjdC5maWxlLl91cmwgPSBjcmVhdGVGaWxlUmVzdWx0LnVybDtcbiAgICAgICAgZmlsZU9iamVjdC5maWxlLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZS5fcHJldmlvdXNTYXZlID0gUHJvbWlzZS5yZXNvbHZlKGZpbGVPYmplY3QuZmlsZSk7XG4gICAgICAgIHNhdmVSZXN1bHQgPSB7XG4gICAgICAgICAgdXJsOiBjcmVhdGVGaWxlUmVzdWx0LnVybCxcbiAgICAgICAgICBuYW1lOiBjcmVhdGVGaWxlUmVzdWx0Lm5hbWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBydW4gYWZ0ZXJTYXZlRmlsZSB0cmlnZ2VyXG4gICAgICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1bkZpbGVUcmlnZ2VyKHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSwgZmlsZU9iamVjdCwgY29uZmlnLCByZXEuYXV0aCk7XG4gICAgICByZXMuc3RhdHVzKDIwMSk7XG4gICAgICByZXMuc2V0KCdMb2NhdGlvbicsIHNhdmVSZXN1bHQudXJsKTtcbiAgICAgIHJlcy5qc29uKHNhdmVSZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY3JlYXRpbmcgYSBmaWxlOiAnLCBlKTtcbiAgICAgIGNvbnN0IGVycm9yID0gdHJpZ2dlcnMucmVzb2x2ZUVycm9yKGUsIHtcbiAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiBgQ291bGQgbm90IHN0b3JlIGZpbGU6ICR7ZmlsZU9iamVjdC5maWxlLl9uYW1lfS5gLFxuICAgICAgfSk7XG4gICAgICBuZXh0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfaGFuZGxlU3RyZWFtVXBsb2FkKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZztcbiAgICBjb25zdCBmaWxlc0NvbnRyb2xsZXIgPSBjb25maWcuZmlsZXNDb250cm9sbGVyO1xuICAgIGNvbnN0IHsgZmlsZW5hbWUgfSA9IHJlcS5wYXJhbXM7XG4gICAgbGV0IGNvbnRlbnRUeXBlID0gcmVxLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSByZXEuX21heFVwbG9hZFNpemVCeXRlcztcbiAgICBsZXQgc3RyZWFtO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVhcmx5IHJlamVjdGlvbiB2aWEgQ29udGVudC1MZW5ndGggaGVhZGVyXG4gICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gcmVxLmdldCgnQ29udGVudC1MZW5ndGgnKTtcbiAgICAgIGlmIChjb250ZW50TGVuZ3RoICYmIHBhcnNlSW50KGNvbnRlbnRMZW5ndGgsIDEwKSA+IG1heEJ5dGVzKSB7XG4gICAgICAgIHJlcS5yZXN1bWUoKTtcbiAgICAgICAgbmV4dChuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLFxuICAgICAgICAgIGBGaWxlIHNpemUgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQ6ICR7bWF4Qnl0ZXN9IGJ5dGVzLmBcbiAgICAgICAgKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWltZSA9IChhd2FpdCBpbXBvcnQoJ21pbWUnKSkuZGVmYXVsdDtcblxuICAgICAgLy8gSW5mZXIgY29udGVudCB0eXBlIGZyb20gZXh0ZW5zaW9uIG9yIGFkZCBleHRlbnNpb24gZnJvbSBjb250ZW50IHR5cGVcbiAgICAgIGNvbnN0IGhhc0V4dGVuc2lvbiA9IGZpbGVuYW1lICYmIGZpbGVuYW1lLmluY2x1ZGVzKCcuJyk7XG4gICAgICBpZiAoaGFzRXh0ZW5zaW9uICYmICFjb250ZW50VHlwZSkge1xuICAgICAgICBjb250ZW50VHlwZSA9IG1pbWUuZ2V0VHlwZShmaWxlbmFtZSk7XG4gICAgICB9IGVsc2UgaWYgKCFoYXNFeHRlbnNpb24gJiYgY29udGVudFR5cGUpIHtcbiAgICAgICAgLy8gZXh0ZW5zaW9uIHdpbGwgYmUgYWRkZWQgYnkgZmlsZXNDb250cm9sbGVyLmNyZWF0ZUZpbGVcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpemUtbGltaXRlZCBzdHJlYW0gd3JhcHBpbmcgdGhlIHJlcXVlc3RcbiAgICAgIHN0cmVhbSA9IGNyZWF0ZVNpemVMaW1pdGVkU3RyZWFtKHJlcSwgbWF4Qnl0ZXMpO1xuXG4gICAgICAvLyBCdWlsZCBhIFBhcnNlLkZpbGUgd2l0aCBubyBfZGF0YSAoc3RyZWFtaW5nIG1vZGUpXG4gICAgICBjb25zdCBmaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZW5hbWUsIHsgYmFzZTY0OiAnJyB9LCBjb250ZW50VHlwZSk7XG4gICAgICBjb25zdCB7IG1ldGFkYXRhID0ge30sIHRhZ3MgPSB7fSB9ID0gcmVxLmZpbGVEYXRhIHx8IHt9O1xuXG4gICAgICAvLyBWYWxpZGF0ZSBtZXRhZGF0YSBhbmQgdGFncyBmb3IgcHJvaGliaXRlZCBrZXl3b3Jkc1xuICAgICAgdHJ5IHtcbiAgICAgICAgVXRpbHMuY2hlY2tQcm9oaWJpdGVkS2V5d29yZHMoY29uZmlnLCBtZXRhZGF0YSk7XG4gICAgICAgIFV0aWxzLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzKGNvbmZpZywgdGFncyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzdHJlYW0uZGVzdHJveSgpO1xuICAgICAgICBuZXh0KG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCBlcnJvcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZpbGUuc2V0VGFncyh0YWdzKTtcbiAgICAgIGZpbGUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuXG4gICAgICBjb25zdCBmaWxlU2l6ZSA9IHJlcS5nZXQoJ0NvbnRlbnQtTGVuZ3RoJylcbiAgICAgICAgPyBwYXJzZUludChyZXEuZ2V0KCdDb250ZW50LUxlbmd0aCcpLCAxMClcbiAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3QgZmlsZU9iamVjdCA9IHsgZmlsZSwgZmlsZVNpemUsIHN0cmVhbTogdHJ1ZSB9O1xuXG4gICAgICAvLyBSdW4gYmVmb3JlU2F2ZUZpbGUgdHJpZ2dlclxuICAgICAgY29uc3QgdHJpZ2dlclJlc3VsdCA9IGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuRmlsZVRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZVNhdmUsXG4gICAgICAgIGZpbGVPYmplY3QsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxLmF1dGhcbiAgICAgICk7XG5cbiAgICAgIGxldCBzYXZlUmVzdWx0O1xuICAgICAgLy8gSWYgYSBuZXcgUGFyc2VGaWxlIGlzIHJldHVybmVkLCBjaGVjayBpZiBpdCdzIGFuIGFscmVhZHkgc2F2ZWQgZmlsZVxuICAgICAgaWYgKHRyaWdnZXJSZXN1bHQgaW5zdGFuY2VvZiBQYXJzZS5GaWxlKSB7XG4gICAgICAgIGZpbGVPYmplY3QuZmlsZSA9IHRyaWdnZXJSZXN1bHQ7XG4gICAgICAgIGlmICh0cmlnZ2VyUmVzdWx0LnVybCgpKSB7XG4gICAgICAgICAgZmlsZU9iamVjdC5maWxlU2l6ZSA9IG51bGw7XG4gICAgICAgICAgc2F2ZVJlc3VsdCA9IHtcbiAgICAgICAgICAgIHVybDogdHJpZ2dlclJlc3VsdC51cmwoKSxcbiAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJSZXN1bHQuX25hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBEZXN0cm95IHN0cmVhbSB0byByZW1vdmUgbGlzdGVuZXJzIGFuZCBkcmFpbiByZXF1ZXN0XG4gICAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgZmlsZSByZXR1cm5lZCBieSB0aGUgdHJpZ2dlciBoYXMgYWxyZWFkeSBiZWVuIHNhdmVkLCBza2lwIHNhdmluZ1xuICAgICAgaWYgKCFzYXZlUmVzdWx0KSB7XG4gICAgICAgIC8vIFByZXBhcmUgZmlsZSBvcHRpb25zXG4gICAgICAgIGNvbnN0IGZpbGVPcHRpb25zID0ge1xuICAgICAgICAgIG1ldGFkYXRhOiBmaWxlT2JqZWN0LmZpbGUuX21ldGFkYXRhLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaWxlVGFncyA9XG4gICAgICAgICAgT2JqZWN0LmtleXMoZmlsZU9iamVjdC5maWxlLl90YWdzKS5sZW5ndGggPiAwID8geyB0YWdzOiBmaWxlT2JqZWN0LmZpbGUuX3RhZ3MgfSA6IHt9O1xuICAgICAgICBPYmplY3QuYXNzaWduKGZpbGVPcHRpb25zLCBmaWxlVGFncyk7XG5cbiAgICAgICAgLy8gUGFzcyBzdHJlYW0gZGlyZWN0bHkgdG8gZmlsZXNDb250cm9sbGVyIOKAlCBpdCB3aWxsIGJ1ZmZlciBpZiBhZGFwdGVyIGRvZXNuJ3Qgc3VwcG9ydCBzdHJlYW1pbmdcbiAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IGZpbGVPYmplY3QuZmlsZS5fc291cmNlPy50eXBlIHx8IGNvbnRlbnRUeXBlO1xuICAgICAgICBjb25zdCBjcmVhdGVGaWxlUmVzdWx0ID0gYXdhaXQgZmlsZXNDb250cm9sbGVyLmNyZWF0ZUZpbGUoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGZpbGVPYmplY3QuZmlsZS5fbmFtZSxcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgc291cmNlVHlwZSxcbiAgICAgICAgICBmaWxlT3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBmaWxlIHdpdGggbmV3IGRhdGFcbiAgICAgICAgZmlsZU9iamVjdC5maWxlLl9uYW1lID0gY3JlYXRlRmlsZVJlc3VsdC5uYW1lO1xuICAgICAgICBmaWxlT2JqZWN0LmZpbGUuX3VybCA9IGNyZWF0ZUZpbGVSZXN1bHQudXJsO1xuICAgICAgICBmaWxlT2JqZWN0LmZpbGUuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgZmlsZU9iamVjdC5maWxlLl9wcmV2aW91c1NhdmUgPSBQcm9taXNlLnJlc29sdmUoZmlsZU9iamVjdC5maWxlKTtcbiAgICAgICAgc2F2ZVJlc3VsdCA9IHtcbiAgICAgICAgICB1cmw6IGNyZWF0ZUZpbGVSZXN1bHQudXJsLFxuICAgICAgICAgIG5hbWU6IGNyZWF0ZUZpbGVSZXN1bHQubmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUnVuIGFmdGVyU2F2ZUZpbGUgdHJpZ2dlclxuICAgICAgYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5GaWxlVHJpZ2dlcih0cmlnZ2Vycy5UeXBlcy5hZnRlclNhdmUsIGZpbGVPYmplY3QsIGNvbmZpZywgcmVxLmF1dGgpO1xuICAgICAgcmVzLnN0YXR1cygyMDEpO1xuICAgICAgcmVzLnNldCgnTG9jYXRpb24nLCBzYXZlUmVzdWx0LnVybCk7XG4gICAgICByZXMuanNvbihzYXZlUmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBEZXN0cm95IHN0cmVhbSB0byByZW1vdmUgbGlzdGVuZXJzIGFuZCBkcmFpbiByZXF1ZXN0LCBvciByZXN1bWUgZGlyZWN0bHlcbiAgICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcS5yZXN1bWUoKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY3JlYXRpbmcgYSBmaWxlOiAnLCBlKTtcbiAgICAgIGNvbnN0IGVycm9yID0gdHJpZ2dlcnMucmVzb2x2ZUVycm9yKGUsIHtcbiAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuRklMRV9TQVZFX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiBgQ291bGQgbm90IHN0b3JlIGZpbGU6ICR7ZmlsZW5hbWV9LmAsXG4gICAgICB9KTtcbiAgICAgIG5leHQoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUhhbmRsZXIocmVxLCByZXMsIG5leHQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmaWxlc0NvbnRyb2xsZXIgfSA9IHJlcS5jb25maWc7XG4gICAgICBjb25zdCB7IGZpbGVuYW1lIH0gPSByZXEucGFyYW1zO1xuICAgICAgLy8gcnVuIGJlZm9yZURlbGV0ZUZpbGUgdHJpZ2dlclxuICAgICAgY29uc3QgZmlsZSA9IG5ldyBQYXJzZS5GaWxlKGZpbGVuYW1lKTtcbiAgICAgIGZpbGUuX3VybCA9IGF3YWl0IGZpbGVzQ29udHJvbGxlci5hZGFwdGVyLmdldEZpbGVMb2NhdGlvbihyZXEuY29uZmlnLCBmaWxlbmFtZSk7XG4gICAgICBjb25zdCBmaWxlT2JqZWN0ID0geyBmaWxlLCBmaWxlU2l6ZTogbnVsbCB9O1xuICAgICAgYXdhaXQgdHJpZ2dlcnMubWF5YmVSdW5GaWxlVHJpZ2dlcihcbiAgICAgICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlRGVsZXRlLFxuICAgICAgICBmaWxlT2JqZWN0LFxuICAgICAgICByZXEuY29uZmlnLFxuICAgICAgICByZXEuYXV0aFxuICAgICAgKTtcbiAgICAgIC8vIGRlbGV0ZSBmaWxlXG4gICAgICBhd2FpdCBmaWxlc0NvbnRyb2xsZXIuZGVsZXRlRmlsZShyZXEuY29uZmlnLCBmaWxlbmFtZSk7XG4gICAgICAvLyBydW4gYWZ0ZXJEZWxldGVGaWxlIHRyaWdnZXJcbiAgICAgIGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuRmlsZVRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyRGVsZXRlLFxuICAgICAgICBmaWxlT2JqZWN0LFxuICAgICAgICByZXEuY29uZmlnLFxuICAgICAgICByZXEuYXV0aFxuICAgICAgKTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKTtcbiAgICAgIC8vIFRPRE86IHJldHVybiB1c2VmdWwgSlNPTiBoZXJlP1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZGVsZXRpbmcgYSBmaWxlOiAnLCBlKTtcbiAgICAgIGNvbnN0IGVycm9yID0gdHJpZ2dlcnMucmVzb2x2ZUVycm9yKGUsIHtcbiAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuRklMRV9ERUxFVEVfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdDb3VsZCBub3QgZGVsZXRlIGZpbGUuJyxcbiAgICAgIH0pO1xuICAgICAgbmV4dChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbWV0YWRhdGFIYW5kbGVyKHJlcSwgcmVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IENvbmZpZy5nZXQocmVxLnBhcmFtcy5hcHBJZCk7XG4gICAgICBjb25zdCB7IGZpbGVzQ29udHJvbGxlciB9ID0gY29uZmlnO1xuICAgICAgY29uc3QgeyBmaWxlbmFtZSB9ID0gcmVxLnBhcmFtcztcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmaWxlc0NvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoZmlsZW5hbWUpO1xuICAgICAgcmVzLnN0YXR1cygyMDApO1xuICAgICAgcmVzLmpzb24oZGF0YSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXMuc3RhdHVzKDIwMCk7XG4gICAgICByZXMuanNvbih7fSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRmlsZVN0cmVhbWFibGUocmVxLCBmaWxlc0NvbnRyb2xsZXIpIHtcbiAgY29uc3QgcmFuZ2UgPSAocmVxLmdldCgnUmFuZ2UnKSB8fCAnLy0vJykuc3BsaXQoJy0nKTtcbiAgY29uc3Qgc3RhcnQgPSBOdW1iZXIocmFuZ2VbMF0pO1xuICBjb25zdCBlbmQgPSBOdW1iZXIocmFuZ2VbMV0pO1xuICByZXR1cm4gKFxuICAgICghaXNOYU4oc3RhcnQpIHx8ICFpc05hTihlbmQpKSAmJiB0eXBlb2YgZmlsZXNDb250cm9sbGVyLmFkYXB0ZXIuaGFuZGxlRmlsZVN0cmVh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
package/lib/Utils.js CHANGED
@@ -463,6 +463,40 @@ class Utils {
463
463
  }
464
464
  return current;
465
465
  }
466
+
467
+ /**
468
+ * Parses a human-readable size string into a byte count.
469
+ * @param {number | string} size - A number (floored to an integer), a numeric string
470
+ * (treated as bytes), or a string with a unit suffix: `b`, `kb`, `mb`, `gb`
471
+ * (case-insensitive). Examples: `'20mb'`, `'512kb'`, `'1.5gb'`, `1048576`.
472
+ * @returns {number} The size in bytes, floored to the nearest integer.
473
+ * @throws {Error} If the string does not match the expected format.
474
+ */
475
+ static parseSizeToBytes(size) {
476
+ if (typeof size === 'number') {
477
+ if (!Number.isFinite(size) || size < 0) {
478
+ throw new Error(`Invalid size value: ${size}`);
479
+ }
480
+ return Math.floor(size);
481
+ }
482
+ const str = String(size).trim().toLowerCase();
483
+ const match = str.match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);
484
+ if (!match) {
485
+ throw new Error(`Invalid size value: ${size}`);
486
+ }
487
+ const num = parseFloat(match[1]);
488
+ const unit = match[2];
489
+ switch (unit) {
490
+ case 'kb':
491
+ return Math.floor(num * 1024);
492
+ case 'mb':
493
+ return Math.floor(num * 1024 * 1024);
494
+ case 'gb':
495
+ return Math.floor(num * 1024 * 1024 * 1024);
496
+ default:
497
+ return Math.floor(num);
498
+ }
499
+ }
466
500
  }
467
501
  module.exports = Utils;
468
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsImZzIiwicHJvbWlzZXMiLCJVdGlscyIsImdldExvY2FsaXplZFBhdGgiLCJkZWZhdWx0UGF0aCIsImxvY2FsZSIsImZpbGUiLCJiYXNlbmFtZSIsImJhc2VQYXRoIiwiZGlybmFtZSIsImxvY2FsZVBhdGgiLCJqb2luIiwibG9jYWxlRmlsZUV4aXN0cyIsImZpbGVFeGlzdHMiLCJzdWJkaXIiLCJsYW5ndWFnZSIsInNwbGl0IiwibGFuZ3VhZ2VQYXRoIiwibGFuZ3VhZ2VGaWxlRXhpc3RzIiwiYWNjZXNzIiwiaXNQYXRoIiwicyIsInRlc3QiLCJmbGF0dGVuT2JqZWN0Iiwib2JqIiwicGFyZW50S2V5IiwiZGVsaW1pdGVyIiwicmVzdWx0Iiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibmV3S2V5IiwiaXNQcm9taXNlIiwib2JqZWN0IiwiUHJvbWlzZSIsImdldE9iamVjdEtleVBlcm11dGF0aW9ucyIsImluZGV4IiwiY3VycmVudCIsInJlc3VsdHMiLCJrZXlzIiwidmFsdWVzIiwidmFsdWUiLCJuZXh0SW5kZXgiLCJsZW5ndGgiLCJhc3NpZ24iLCJwdXNoIiwidmFsaWRhdGVQYXJhbXMiLCJwYXJhbXMiLCJ0eXBlcyIsInR5cGUiLCJpc09wdGlvbmFsIiwibyIsInBhcmFtIiwidiIsInQiLCJyZWxhdGl2ZVRpbWVUb0RhdGUiLCJ0ZXh0Iiwibm93IiwiRGF0ZSIsInRvTG93ZXJDYXNlIiwicGFydHMiLCJmaWx0ZXIiLCJwYXJ0IiwiZnV0dXJlIiwicGFzdCIsInN0YXR1cyIsImluZm8iLCJzbGljZSIsInBhaXJzIiwic2hpZnQiLCJzZWNvbmRzIiwibnVtIiwiaW50ZXJ2YWwiLCJ2YWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJtaWxsaXNlY29uZHMiLCJ2YWx1ZU9mIiwib2JqZWN0Q29udGFpbnNLZXlWYWx1ZSIsImlzTWF0Y2giLCJhIiwiYiIsIlJlZ0V4cCIsImlzS2V5TWF0Y2giLCJrIiwiaXNWYWx1ZU1hdGNoIiwiZW50cmllcyIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwidG9TdHJpbmciLCJjaGVja1Byb2hpYml0ZWRLZXl3b3JkcyIsImNvbmZpZyIsImRhdGEiLCJyZXF1ZXN0S2V5d29yZERlbnlsaXN0Iiwia2V5d29yZCIsIm1hdGNoIiwiSlNPTiIsInN0cmluZ2lmeSIsImFkZE5lc3RlZEtleXNUb1Jvb3QiLCJlbmNvZGVGb3JVcmwiLCJpbnB1dCIsImVuY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2UiLCJjaGFyIiwiY2hhckNvZGVBdCIsInRvVXBwZXJDYXNlIiwiZ2V0Q2lyY3VsYXJSZXBsYWNlciIsInNlZW4iLCJXZWFrU2V0IiwiTWFwIiwiZnJvbUVudHJpZXMiLCJTZXQiLCJBcnJheSIsImZyb20iLCJoYXMiLCJhZGQiLCJnZXROZXN0ZWRQcm9wZXJ0eSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvVXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB1dGlscy5qc1xuICogQGZpbGUgR2VuZXJhbCBwdXJwb3NlIHV0aWxpdGllc1xuICogQGRlc2NyaXB0aW9uIEdlbmVyYWwgcHVycG9zZSB1dGlsaXRpZXMuXG4gKi9cblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKS5wcm9taXNlcztcblxuLyoqXG4gKiBUaGUgZ2VuZXJhbCBwdXJwb3NlIHV0aWxpdGllcy5cbiAqL1xuY2xhc3MgVXRpbHMge1xuICAvKipcbiAgICogQGZ1bmN0aW9uIGdldExvY2FsaXplZFBhdGhcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBsb2NhbGl6ZWQgZmlsZSBwYXRoIGFjY29yaW5nIHRvIHRoZSBsb2NhbGUuXG4gICAqXG4gICAqIExvY2FsaXplZCBmaWxlcyBhcmUgc2VhcmNoZWQgaW4gc3ViZm9sZGVycyBvZiBhIGdpdmVuIHBhdGgsIGUuZy5cbiAgICpcbiAgICogcm9vdC9cbiAgICog4pSc4pSA4pSAIGJhc2UvICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIHBhdGggdG8gZmlsZXNcbiAgICog4pSCICAg4pSc4pSA4pSAIGV4YW1wbGUuaHRtbCAgICAgICAgIC8vIGRlZmF1bHQgZmlsZVxuICAgKiDilIIgICDilJTilIDilIAgZGUvICAgICAgICAgICAgICAgICAgLy8gZGUgbGFuZ3VhZ2UgZm9sZGVyXG4gICAqIOKUgiAgIOKUgiAgIOKUlOKUgOKUgCBleGFtcGxlLmh0bWwgICAgIC8vIGRlIGxvY2FsaXplZCBmaWxlXG4gICAqIOKUgiAgIOKUlOKUgOKUgCBkZS1BVC8gICAgICAgICAgICAgICAvLyBkZS1BVCBsb2NhbGUgZm9sZGVyXG4gICAqIOKUgiAgIOKUgiAgIOKUlOKUgOKUgCBleGFtcGxlLmh0bWwgICAgIC8vIGRlLUFUIGxvY2FsaXplZCBmaWxlXG4gICAqXG4gICAqIEZpbGVzIGFyZSBtYXRjaGVkIHdpdGggdGhlIGxvY2FsZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuICAgKiAxLiBMb2NhbGUgbWF0Y2gsIGUuZy4gbG9jYWxlIGBkZS1BVGAgbWF0Y2hlcyBmaWxlIGluIGZvbGRlciBgZGUtQVRgLlxuICAgKiAyLiBMYW5ndWFnZSBtYXRjaCwgZS5nLiBsb2NhbGUgYGRlLUFUYCBtYXRjaGVzIGZpbGUgaW4gZm9sZGVyIGBkZWAuXG4gICAqIDMuIERlZmF1bHQ7IGZpbGUgaW4gYmFzZSBmb2xkZXIgaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkZWZhdWx0UGF0aCBUaGUgYWJzb2x1dGUgZmlsZSBwYXRoLCB3aGljaCBpcyBhbHNvXG4gICAqIHRoZSBkZWZhdWx0IHBhdGggcmV0dXJuZWQgaWYgbG9jYWxpemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgVGhlIGxvY2FsZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gVGhlIG9iamVjdCBjb250YWluczpcbiAgICogLSBgcGF0aGA6IFRoZSBwYXRoIHRvIHRoZSBsb2NhbGl6ZWQgZmlsZSwgb3IgdGhlIG9yaWdpbmFsIHBhdGggaWZcbiAgICogICBsb2NhbGl6YXRpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAgICogLSBgc3ViZGlyYDogVGhlIHN1YmRpcmVjdG9yeSBvZiB0aGUgbG9jYWxpemVkIGZpbGUsIG9yIHVuZGVmaW5lZCBpZlxuICAgKiAgIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGxvY2FsaXplZCBmaWxlLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldExvY2FsaXplZFBhdGgoZGVmYXVsdFBhdGgsIGxvY2FsZSkge1xuICAgIC8vIEdldCBmaWxlIG5hbWUgYW5kIHBhdGhzXG4gICAgY29uc3QgZmlsZSA9IHBhdGguYmFzZW5hbWUoZGVmYXVsdFBhdGgpO1xuICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aC5kaXJuYW1lKGRlZmF1bHRQYXRoKTtcblxuICAgIC8vIElmIGxvY2FsZSBpcyBub3Qgc2V0IHJldHVybiBkZWZhdWx0IGZpbGVcbiAgICBpZiAoIWxvY2FsZSkge1xuICAgICAgcmV0dXJuIHsgcGF0aDogZGVmYXVsdFBhdGggfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmaWxlIGZvciBsb2NhbGUgZXhpc3RzXG4gICAgY29uc3QgbG9jYWxlUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgbG9jYWxlLCBmaWxlKTtcbiAgICBjb25zdCBsb2NhbGVGaWxlRXhpc3RzID0gYXdhaXQgVXRpbHMuZmlsZUV4aXN0cyhsb2NhbGVQYXRoKTtcblxuICAgIC8vIElmIGZpbGUgZm9yIGxvY2FsZSBleGlzdHMgcmV0dXJuIGZpbGVcbiAgICBpZiAobG9jYWxlRmlsZUV4aXN0cykge1xuICAgICAgcmV0dXJuIHsgcGF0aDogbG9jYWxlUGF0aCwgc3ViZGlyOiBsb2NhbGUgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmaWxlIGZvciBsYW5ndWFnZSBleGlzdHNcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxvY2FsZS5zcGxpdCgnLScpWzBdO1xuICAgIGNvbnN0IGxhbmd1YWdlUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgbGFuZ3VhZ2UsIGZpbGUpO1xuICAgIGNvbnN0IGxhbmd1YWdlRmlsZUV4aXN0cyA9IGF3YWl0IFV0aWxzLmZpbGVFeGlzdHMobGFuZ3VhZ2VQYXRoKTtcblxuICAgIC8vIElmIGZpbGUgZm9yIGxhbmd1YWdlIGV4aXN0cyByZXR1cm4gZmlsZVxuICAgIGlmIChsYW5ndWFnZUZpbGVFeGlzdHMpIHtcbiAgICAgIHJldHVybiB7IHBhdGg6IGxhbmd1YWdlUGF0aCwgc3ViZGlyOiBsYW5ndWFnZSB9O1xuICAgIH1cblxuICAgIC8vIFJldHVybiBkZWZhdWx0IGZpbGVcbiAgICByZXR1cm4geyBwYXRoOiBkZWZhdWx0UGF0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBmdW5jdGlvbiBmaWxlRXhpc3RzXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3Mgd2hldGhlciBhIGZpbGUgZXhpc3RzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgZmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gSXMgdHJ1ZSBpZiB0aGUgZmlsZSBjYW4gYmUgYWNjZXNzZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaWxlRXhpc3RzKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKHBhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBmdW5jdGlvbiBpc1BhdGhcbiAgICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgZmlsZSBwYXRoIChhcyBvcHBvc2VkIHRvIGEgVVJMIGZvciBleGFtcGxlKS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHMgVGhlIHN0cmluZyB0byBldmFsdWF0ZS5cbiAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZhbHVhdGVkIHN0cmluZyBpcyBhIHBhdGguXG4gICAqL1xuICBzdGF0aWMgaXNQYXRoKHMpIHtcbiAgICByZXR1cm4gLyheXFwvKXwoXlxcLlxcLyl8KF5cXC5cXC5cXC8pLy50ZXN0KHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGFuIG9iamVjdCBhbmQgY3JhdGVzIG5ldyBrZXlzIHdpdGggY3VzdG9tIGRlbGltaXRlcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBmbGF0dGVuLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2RlbGltaXRlcj0nLiddIFRoZSBkZWxpbWl0ZXIgb2YgdGhlIG5ld2x5IGdlbmVyYXRlZCBrZXlzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0XG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBmbGF0dGVuZWQgb2JqZWN0LlxuICAgKiovXG4gIHN0YXRpYyBmbGF0dGVuT2JqZWN0KG9iaiwgcGFyZW50S2V5LCBkZWxpbWl0ZXIgPSAnLicsIHJlc3VsdCA9IHt9KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICBjb25zdCBuZXdLZXkgPSBwYXJlbnRLZXkgPyBwYXJlbnRLZXkgKyBkZWxpbWl0ZXIgKyBrZXkgOiBrZXk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgb2JqW2tleV0gIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZsYXR0ZW5PYmplY3Qob2JqW2tleV0sIG5ld0tleSwgZGVsaW1pdGVyLCByZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtuZXdLZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGEgUHJvbWlzZS5cbiAgICogQHBhcmFtIHthbnl9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBwcm9taXNlLlxuICAgKi9cbiAgc3RhdGljIGlzUHJvbWlzZShvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIGFsbCBwZXJtdXRhdGlvbnMgb2YgdGhlIG9yaWdpbmFsIGtleXMuXG4gICAqIEZvciBleGFtcGxlLCB0aGlzIGRlZmluaXRpb246XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgYTogW3RydWUsIGZhbHNlXSxcbiAgICogICBiOiBbMSwgMl0sXG4gICAqICAgYzogWyd4J11cbiAgICogfVxuICAgKiBgYGBcbiAgICogcGVybXV0YXRlcyB0bzpcbiAgICogYGBgXG4gICAqIFtcbiAgICogICB7IGE6IHRydWUsIGI6IDEsIGM6ICd4JyB9LFxuICAgKiAgIHsgYTogdHJ1ZSwgYjogMiwgYzogJ3gnIH0sXG4gICAqICAgeyBhOiBmYWxzZSwgYjogMSwgYzogJ3gnIH0sXG4gICAqICAgeyBhOiBmYWxzZSwgYjogMiwgYzogJ3gnIH1cbiAgICogXVxuICAgKiBgYGBcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHBlcm11dGF0ZS5cbiAgICogQHBhcmFtIHtJbnRlZ2VyfSBbaW5kZXg9MF0gVGhlIGN1cnJlbnQga2V5IGluZGV4LlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2N1cnJlbnQ9e31dIFRoZSBjdXJyZW50IHJlc3VsdCBlbnRyeSBiZWluZyBjb21wb3NlZC5cbiAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHM9W11dIFRoZSByZXN1bHRpbmcgYXJyYXkgb2YgcGVybXV0YXRpb25zLlxuICAgKi9cbiAgc3RhdGljIGdldE9iamVjdEtleVBlcm11dGF0aW9ucyhvYmplY3QsIGluZGV4ID0gMCwgY3VycmVudCA9IHt9LCByZXN1bHRzID0gW10pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgICBjb25zdCBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICBjb25zdCB2YWx1ZXMgPSBvYmplY3Rba2V5XTtcblxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgMTtcblxuICAgICAgaWYgKG5leHRJbmRleCA8IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIFV0aWxzLmdldE9iamVjdEtleVBlcm11dGF0aW9ucyhvYmplY3QsIG5leHRJbmRleCwgY3VycmVudCwgcmVzdWx0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBwYXJhbWV0ZXJzIGFuZCB0aHJvd3MgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cbiAgICogRXhhbXBsZSBwYXJhbWV0ZXIgdHlwZXMgc3ludGF4OlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIHBhcmFtZXRlck5hbWU6IHtcbiAgICogICAgICB0OiAnYm9vbGVhbicsXG4gICAqICAgICAgdjogaXNCb29sZWFuLFxuICAgKiAgICAgIG86IHRydWVcbiAgICogICB9LFxuICAgKiAgIC4uLlxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IHR5cGVzIFRoZSBwYXJhbWV0ZXIgdHlwZXMgdXNlZCBmb3IgdmFsaWRhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVzLnQgVGhlIHBhcmFtZXRlciB0eXBlOyB1c2VkIGZvciBlcnJvciBtZXNzYWdlLCBub3QgZm9yIHZhbGlkYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlcy52IFRoZSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFt0eXBlcy5vPWZhbHNlXSBJcyB0cnVlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVQYXJhbXMocGFyYW1zLCB0eXBlcykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFtcykpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlc1trZXldO1xuICAgICAgY29uc3QgaXNPcHRpb25hbCA9ICEhdHlwZS5vO1xuICAgICAgY29uc3QgcGFyYW0gPSBwYXJhbXNba2V5XTtcbiAgICAgIGlmICghKGlzT3B0aW9uYWwgJiYgcGFyYW0gPT0gbnVsbCkgJiYgIXR5cGUudihwYXJhbSkpIHtcbiAgICAgICAgdGhyb3cgYEludmFsaWQgcGFyYW1ldGVyICR7a2V5fSBtdXN0IGJlIG9mIHR5cGUgJHt0eXBlLnR9IGJ1dCBpcyAke3R5cGVvZiBwYXJhbX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgcmVsYXRpdmUgZGF0ZSBiYXNlZCBvbiBhIHN0cmluZy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHN0cmluZyB0byBpbnRlcnByZXQgdGhlIGRhdGUgZnJvbS5cbiAgICogQHBhcmFtIHtEYXRlfSBub3cgVGhlIGRhdGUgdGhlIHN0cmluZyBpcyBjb21wYXJpbmcgYWdhaW5zdC5cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbGF0aXZlIGRhdGUgb2JqZWN0LlxuICAgKiovXG4gIHN0YXRpYyByZWxhdGl2ZVRpbWVUb0RhdGUodGV4dCwgbm93ID0gbmV3IERhdGUoKSkge1xuICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IHBhcnRzID0gdGV4dC5zcGxpdCgnICcpO1xuXG4gICAgLy8gRmlsdGVyIG91dCB3aGl0ZXNwYWNlXG4gICAgcGFydHMgPSBwYXJ0cy5maWx0ZXIocGFydCA9PiBwYXJ0ICE9PSAnJyk7XG5cbiAgICBjb25zdCBmdXR1cmUgPSBwYXJ0c1swXSA9PT0gJ2luJztcbiAgICBjb25zdCBwYXN0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT09ICdhZ28nO1xuXG4gICAgaWYgKCFmdXR1cmUgJiYgIXBhc3QgJiYgdGV4dCAhPT0gJ25vdycpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgaW5mbzogXCJUaW1lIHNob3VsZCBlaXRoZXIgc3RhcnQgd2l0aCAnaW4nIG9yIGVuZCB3aXRoICdhZ28nXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChmdXR1cmUgJiYgcGFzdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICBpbmZvOiBcIlRpbWUgY2Fubm90IGhhdmUgYm90aCAnaW4nIGFuZCAnYWdvJ1wiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBzdHJpcCB0aGUgJ2Fnbycgb3IgJ2luJ1xuICAgIGlmIChmdXR1cmUpIHtcbiAgICAgIHBhcnRzID0gcGFydHMuc2xpY2UoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHBhc3RcbiAgICAgIHBhcnRzID0gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCAlIDIgIT09IDAgJiYgdGV4dCAhPT0gJ25vdycpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgaW5mbzogJ0ludmFsaWQgdGltZSBzdHJpbmcuIERhbmdsaW5nIHVuaXQgb3IgbnVtYmVyLicsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgd2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuICAgICAgcGFpcnMucHVzaChbcGFydHMuc2hpZnQoKSwgcGFydHMuc2hpZnQoKV0pO1xuICAgIH1cblxuICAgIGxldCBzZWNvbmRzID0gMDtcbiAgICBmb3IgKGNvbnN0IFtudW0sIGludGVydmFsXSBvZiBwYWlycykge1xuICAgICAgY29uc3QgdmFsID0gTnVtYmVyKG51bSk7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICBpbmZvOiBgJyR7bnVtfScgaXMgbm90IGFuIGludGVnZXIuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3lycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgICAgc2Vjb25kcyArPSB2YWwgKiAzMTUzNjAwMDsgLy8gMzY1ICogMjQgKiA2MCAqIDYwXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnd2snOlxuICAgICAgICBjYXNlICd3a3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICAgIHNlY29uZHMgKz0gdmFsICogNjA0ODAwOyAvLyA3ICogMjQgKiA2MCAqIDYwXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICAgIHNlY29uZHMgKz0gdmFsICogODY0MDA7IC8vIDI0ICogNjAgKiA2MFxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDM2MDA7IC8vIDYwICogNjBcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtaW5zJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgICAgc2Vjb25kcyArPSB2YWwgKiA2MDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgc2Vjb25kcyArPSB2YWw7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgaW5mbzogYEludmFsaWQgaW50ZXJ2YWw6ICcke2ludGVydmFsfSdgLFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gc2Vjb25kcyAqIDEwMDA7XG4gICAgaWYgKGZ1dHVyZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICAgIGluZm86ICdmdXR1cmUnLFxuICAgICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMpLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhc3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICBpbmZvOiAncGFzdCcsXG4gICAgICAgIHJlc3VsdDogbmV3IERhdGUobm93LnZhbHVlT2YoKSAtIG1pbGxpc2Vjb25kcyksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgICAgaW5mbzogJ3ByZXNlbnQnLFxuICAgICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVlcC1zY2FucyBhbiBvYmplY3QgZm9yIGEgbWF0Y2hpbmcga2V5L3ZhbHVlIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBzY2FuLlxuICAgKiBAcGFyYW0ge1N0cmluZyB8IHVuZGVmaW5lZH0ga2V5IFRoZSBrZXkgdG8gbWF0Y2gsIG9yIHVuZGVmaW5lZCBpZiBvbmx5IHRoZSB2YWx1ZSBzaG91bGQgYmUgbWF0Y2hlZC5cbiAgICogQHBhcmFtIHthbnkgfCB1bmRlZmluZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaCwgb3IgdW5kZWZpbmVkIGlmIG9ubHkgdGhlIGtleSBzaG91bGQgYmUgbWF0Y2hlZC5cbiAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHN0YXRpYyBvYmplY3RDb250YWluc0tleVZhbHVlKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IGlzTWF0Y2ggPSAoYSwgYikgPT4gKHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiBuZXcgUmVnRXhwKGIpLnRlc3QoYSkpIHx8IGEgPT09IGI7XG4gICAgY29uc3QgaXNLZXlNYXRjaCA9IGsgPT4gaXNNYXRjaChrLCBrZXkpO1xuICAgIGNvbnN0IGlzVmFsdWVNYXRjaCA9IHYgPT4gaXNNYXRjaCh2LCB2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQgJiYgaXNLZXlNYXRjaChrKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpc1ZhbHVlTWF0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgaXNLZXlNYXRjaChrKSAmJiBpc1ZhbHVlTWF0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoWydbb2JqZWN0IE9iamVjdF0nLCAnW29iamVjdCBBcnJheV0nXS5pbmNsdWRlcyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodikpKSB7XG4gICAgICAgIHJldHVybiBVdGlscy5vYmplY3RDb250YWluc0tleVZhbHVlKHYsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tQcm9oaWJpdGVkS2V5d29yZHMoY29uZmlnLCBkYXRhKSB7XG4gICAgaWYgKGNvbmZpZz8ucmVxdWVzdEtleXdvcmREZW55bGlzdCkge1xuICAgICAgLy8gU2NhbiByZXF1ZXN0IGRhdGEgZm9yIGRlbmllZCBrZXl3b3Jkc1xuICAgICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIGNvbmZpZy5yZXF1ZXN0S2V5d29yZERlbnlsaXN0KSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gVXRpbHMub2JqZWN0Q29udGFpbnNLZXlWYWx1ZShkYXRhLCBrZXl3b3JkLmtleSwga2V5d29yZC52YWx1ZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHRocm93IGBQcm9oaWJpdGVkIGtleXdvcmQgaW4gcmVxdWVzdCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGtleXdvcmQpfS5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBuZXN0ZWQga2V5cyBvZiBhIHNwZWNpZmllZCBrZXkgaW4gYW4gb2JqZWN0IHRvIHRoZSByb290IG9mIHRoZSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB3aG9zZSBuZXN0ZWQga2V5cyB3aWxsIGJlIG1vdmVkIHRvIHJvb3QuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBtb2RpZmllZCBvYmplY3QsIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgaWYgbm8gbW9kaWZpY2F0aW9uIGhhcHBlbmVkLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBvYmogPSB7XG4gICAqICAgYTogMSxcbiAgICogICBiOiB7XG4gICAqICAgICBjOiAyLFxuICAgKiAgICAgZDogM1xuICAgKiAgIH0sXG4gICAqICAgZTogNFxuICAgKiB9O1xuICAgKiBhZGROZXN0ZWRLZXlzVG9Sb290KG9iaiwgJ2InKTtcbiAgICogY29uc29sZS5sb2cob2JqKTtcbiAgICogLy8gT3V0cHV0OiB7IGE6IDEsIGU6IDQsIGM6IDIsIGQ6IDMgfVxuICAqL1xuICBzdGF0aWMgYWRkTmVzdGVkS2V5c1RvUm9vdChvYmosIGtleSkge1xuICAgIGlmIChvYmpba2V5XSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBBZGQgbmVzdGVkIGtleXMgdG8gcm9vdFxuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHsgLi4ub2JqW2tleV0gfSk7XG4gICAgICAvLyBEZWxldGUgb3JpZ2luYWwgbmVzdGVkIGtleVxuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgYSBzdHJpbmcgdG8gYmUgdXNlZCBpbiBhIFVSTC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgZW5jb2RlRm9yVXJsKGlucHV0KSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCkucmVwbGFjZSgvWyEnLigpKl0vZywgY2hhciA9PlxuICAgICAgJyUnICsgY2hhci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgSlNPTiByZXBsYWNlciBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgTWFwLCBTZXQsIGFuZCBjaXJjdWxhciByZWZlcmVuY2VzLlxuICAgKiBUaGlzIHJlcGxhY2VyIGNhbiBiZSB1c2VkIHdpdGggSlNPTi5zdHJpbmdpZnkgdG8gc2FmZWx5IHNlcmlhbGl6ZSBjb21wbGV4IG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZXBsYWNlciBmdW5jdGlvbiBmb3IgSlNPTi5zdHJpbmdpZnkgdGhhdDpcbiAgICogLSBDb252ZXJ0cyBNYXAgaW5zdGFuY2VzIHRvIHBsYWluIG9iamVjdHNcbiAgICogLSBDb252ZXJ0cyBTZXQgaW5zdGFuY2VzIHRvIGFycmF5c1xuICAgKiAtIFJlcGxhY2VzIGNpcmN1bGFyIHJlZmVyZW5jZXMgd2l0aCAnW0NpcmN1bGFyXScgbWFya2VyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IG9iaiA9IHsgbmFtZTogJ3Rlc3QnLCBtYXA6IG5ldyBNYXAoW1sna2V5JywgJ3ZhbHVlJ11dKSB9O1xuICAgKiBvYmouc2VsZiA9IG9iajsgLy8gY2lyY3VsYXIgcmVmZXJlbmNlXG4gICAqIEpTT04uc3RyaW5naWZ5KG9iaiwgVXRpbHMuZ2V0Q2lyY3VsYXJSZXBsYWNlcigpKTtcbiAgICogLy8gT3V0cHV0OiB7XCJuYW1lXCI6XCJ0ZXN0XCIsXCJtYXBcIjp7XCJrZXlcIjpcInZhbHVlXCJ9LFwic2VsZlwiOlwiW0NpcmN1bGFyXVwifVxuICAgKi9cbiAgc3RhdGljIGdldENpcmN1bGFyUmVwbGFjZXIoKSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrU2V0KCk7XG4gICAgcmV0dXJuIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBnZXQgdGhlIHByb3BlcnR5IGZyb20uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIGluIGRvdCBub3RhdGlvbiwgZS5nLiAnZGF0YWJhc2VPcHRpb25zLmFsbG93UHVibGljRXhwbGFpbicuXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBvYmogPSB7IGRhdGFiYXNlOiB7IG9wdGlvbnM6IHsgZW5hYmxlZDogdHJ1ZSB9IH0gfTtcbiAgICogVXRpbHMuZ2V0TmVzdGVkUHJvcGVydHkob2JqLCAnZGF0YWJhc2Uub3B0aW9ucy5lbmFibGVkJyk7XG4gICAqIC8vIE91dHB1dDogdHJ1ZVxuICAgKi9cbiAgc3RhdGljIGdldE5lc3RlZFByb3BlcnR5KG9iaiwgcGF0aCkge1xuICAgIGlmICghb2JqIHx8ICFwYXRoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFV0aWxzO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTUEsSUFBSSxHQUFHQyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQzVCLE1BQU1DLEVBQUUsR0FBR0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDRSxRQUFROztBQUVqQztBQUNBO0FBQ0E7QUFDQSxNQUFNQyxLQUFLLENBQUM7RUFDVjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFLGFBQWFDLGdCQUFnQkEsQ0FBQ0MsV0FBVyxFQUFFQyxNQUFNLEVBQUU7SUFDakQ7SUFDQSxNQUFNQyxJQUFJLEdBQUdSLElBQUksQ0FBQ1MsUUFBUSxDQUFDSCxXQUFXLENBQUM7SUFDdkMsTUFBTUksUUFBUSxHQUFHVixJQUFJLENBQUNXLE9BQU8sQ0FBQ0wsV0FBVyxDQUFDOztJQUUxQztJQUNBLElBQUksQ0FBQ0MsTUFBTSxFQUFFO01BQ1gsT0FBTztRQUFFUCxJQUFJLEVBQUVNO01BQVksQ0FBQztJQUM5Qjs7SUFFQTtJQUNBLE1BQU1NLFVBQVUsR0FBR1osSUFBSSxDQUFDYSxJQUFJLENBQUNILFFBQVEsRUFBRUgsTUFBTSxFQUFFQyxJQUFJLENBQUM7SUFDcEQsTUFBTU0sZ0JBQWdCLEdBQUcsTUFBTVYsS0FBSyxDQUFDVyxVQUFVLENBQUNILFVBQVUsQ0FBQzs7SUFFM0Q7SUFDQSxJQUFJRSxnQkFBZ0IsRUFBRTtNQUNwQixPQUFPO1FBQUVkLElBQUksRUFBRVksVUFBVTtRQUFFSSxNQUFNLEVBQUVUO01BQU8sQ0FBQztJQUM3Qzs7SUFFQTtJQUNBLE1BQU1VLFFBQVEsR0FBR1YsTUFBTSxDQUFDVyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE1BQU1DLFlBQVksR0FBR25CLElBQUksQ0FBQ2EsSUFBSSxDQUFDSCxRQUFRLEVBQUVPLFFBQVEsRUFBRVQsSUFBSSxDQUFDO0lBQ3hELE1BQU1ZLGtCQUFrQixHQUFHLE1BQU1oQixLQUFLLENBQUNXLFVBQVUsQ0FBQ0ksWUFBWSxDQUFDOztJQUUvRDtJQUNBLElBQUlDLGtCQUFrQixFQUFFO01BQ3RCLE9BQU87UUFBRXBCLElBQUksRUFBRW1CLFlBQVk7UUFBRUgsTUFBTSxFQUFFQztNQUFTLENBQUM7SUFDakQ7O0lBRUE7SUFDQSxPQUFPO01BQUVqQixJQUFJLEVBQUVNO0lBQVksQ0FBQztFQUM5Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxhQUFhUyxVQUFVQSxDQUFDZixJQUFJLEVBQUU7SUFDNUIsSUFBSTtNQUNGLE1BQU1FLEVBQUUsQ0FBQ21CLE1BQU0sQ0FBQ3JCLElBQUksQ0FBQztNQUNyQixPQUFPLElBQUk7SUFDYixDQUFDLENBQUMsTUFBTTtNQUNOLE9BQU8sS0FBSztJQUNkO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsT0FBT3NCLE1BQU1BLENBQUNDLENBQUMsRUFBRTtJQUNmLE9BQU8seUJBQXlCLENBQUNDLElBQUksQ0FBQ0QsQ0FBQyxDQUFDO0VBQzFDOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsT0FBT0UsYUFBYUEsQ0FBQ0MsR0FBRyxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsR0FBRyxHQUFHLEVBQUVDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtJQUNqRSxLQUFLLE1BQU1DLEdBQUcsSUFBSUosR0FBRyxFQUFFO01BQ3JCLElBQUlLLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ1IsR0FBRyxFQUFFSSxHQUFHLENBQUMsRUFBRTtRQUNsRCxNQUFNSyxNQUFNLEdBQUdSLFNBQVMsR0FBR0EsU0FBUyxHQUFHQyxTQUFTLEdBQUdFLEdBQUcsR0FBR0EsR0FBRztRQUU1RCxJQUFJLE9BQU9KLEdBQUcsQ0FBQ0ksR0FBRyxDQUFDLEtBQUssUUFBUSxJQUFJSixHQUFHLENBQUNJLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtVQUNyRCxJQUFJLENBQUNMLGFBQWEsQ0FBQ0MsR0FBRyxDQUFDSSxHQUFHLENBQUMsRUFBRUssTUFBTSxFQUFFUCxTQUFTLEVBQUVDLE1BQU0sQ0FBQztRQUN6RCxDQUFDLE1BQU07VUFDTEEsTUFBTSxDQUFDTSxNQUFNLENBQUMsR0FBR1QsR0FBRyxDQUFDSSxHQUFHLENBQUM7UUFDM0I7TUFDRjtJQUNGO0lBQ0EsT0FBT0QsTUFBTTtFQUNmOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxPQUFPTyxTQUFTQSxDQUFDQyxNQUFNLEVBQUU7SUFDdkIsT0FBT0EsTUFBTSxZQUFZQyxPQUFPO0VBQ2xDOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFLE9BQU9DLHdCQUF3QkEsQ0FBQ0YsTUFBTSxFQUFFRyxLQUFLLEdBQUcsQ0FBQyxFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUVDLE9BQU8sR0FBRyxFQUFFLEVBQUU7SUFDN0UsTUFBTUMsSUFBSSxHQUFHWixNQUFNLENBQUNZLElBQUksQ0FBQ04sTUFBTSxDQUFDO0lBQ2hDLE1BQU1QLEdBQUcsR0FBR2EsSUFBSSxDQUFDSCxLQUFLLENBQUM7SUFDdkIsTUFBTUksTUFBTSxHQUFHUCxNQUFNLENBQUNQLEdBQUcsQ0FBQztJQUUxQixLQUFLLE1BQU1lLEtBQUssSUFBSUQsTUFBTSxFQUFFO01BQzFCSCxPQUFPLENBQUNYLEdBQUcsQ0FBQyxHQUFHZSxLQUFLO01BQ3BCLE1BQU1DLFNBQVMsR0FBR04sS0FBSyxHQUFHLENBQUM7TUFFM0IsSUFBSU0sU0FBUyxHQUFHSCxJQUFJLENBQUNJLE1BQU0sRUFBRTtRQUMzQjNDLEtBQUssQ0FBQ21DLHdCQUF3QixDQUFDRixNQUFNLEVBQUVTLFNBQVMsRUFBRUwsT0FBTyxFQUFFQyxPQUFPLENBQUM7TUFDckUsQ0FBQyxNQUFNO1FBQ0wsTUFBTWIsTUFBTSxHQUFHRSxNQUFNLENBQUNpQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVQLE9BQU8sQ0FBQztRQUN6Q0MsT0FBTyxDQUFDTyxJQUFJLENBQUNwQixNQUFNLENBQUM7TUFDdEI7SUFDRjtJQUNBLE9BQU9hLE9BQU87RUFDaEI7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxPQUFPUSxjQUFjQSxDQUFDQyxNQUFNLEVBQUVDLEtBQUssRUFBRTtJQUNuQyxLQUFLLE1BQU10QixHQUFHLElBQUlDLE1BQU0sQ0FBQ1ksSUFBSSxDQUFDUSxNQUFNLENBQUMsRUFBRTtNQUNyQyxNQUFNRSxJQUFJLEdBQUdELEtBQUssQ0FBQ3RCLEdBQUcsQ0FBQztNQUN2QixNQUFNd0IsVUFBVSxHQUFHLENBQUMsQ0FBQ0QsSUFBSSxDQUFDRSxDQUFDO01BQzNCLE1BQU1DLEtBQUssR0FBR0wsTUFBTSxDQUFDckIsR0FBRyxDQUFDO01BQ3pCLElBQUksRUFBRXdCLFVBQVUsSUFBSUUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUNILElBQUksQ0FBQ0ksQ0FBQyxDQUFDRCxLQUFLLENBQUMsRUFBRTtRQUNwRCxNQUFNLHFCQUFxQjFCLEdBQUcsb0JBQW9CdUIsSUFBSSxDQUFDSyxDQUFDLFdBQVcsT0FBT0YsS0FBSyxFQUFFO01BQ25GO0lBQ0Y7RUFDRjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxPQUFPRyxrQkFBa0JBLENBQUNDLElBQUksRUFBRUMsR0FBRyxHQUFHLElBQUlDLElBQUksQ0FBQyxDQUFDLEVBQUU7SUFDaERGLElBQUksR0FBR0EsSUFBSSxDQUFDRyxXQUFXLENBQUMsQ0FBQztJQUN6QixJQUFJQyxLQUFLLEdBQUdKLElBQUksQ0FBQzFDLEtBQUssQ0FBQyxHQUFHLENBQUM7O0lBRTNCO0lBQ0E4QyxLQUFLLEdBQUdBLEtBQUssQ0FBQ0MsTUFBTSxDQUFDQyxJQUFJLElBQUlBLElBQUksS0FBSyxFQUFFLENBQUM7SUFFekMsTUFBTUMsTUFBTSxHQUFHSCxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtJQUNoQyxNQUFNSSxJQUFJLEdBQUdKLEtBQUssQ0FBQ0EsS0FBSyxDQUFDakIsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUs7SUFFOUMsSUFBSSxDQUFDb0IsTUFBTSxJQUFJLENBQUNDLElBQUksSUFBSVIsSUFBSSxLQUFLLEtBQUssRUFBRTtNQUN0QyxPQUFPO1FBQ0xTLE1BQU0sRUFBRSxPQUFPO1FBQ2ZDLElBQUksRUFBRTtNQUNSLENBQUM7SUFDSDtJQUVBLElBQUlILE1BQU0sSUFBSUMsSUFBSSxFQUFFO01BQ2xCLE9BQU87UUFDTEMsTUFBTSxFQUFFLE9BQU87UUFDZkMsSUFBSSxFQUFFO01BQ1IsQ0FBQztJQUNIOztJQUVBO0lBQ0EsSUFBSUgsTUFBTSxFQUFFO01BQ1ZILEtBQUssR0FBR0EsS0FBSyxDQUFDTyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsTUFBTTtNQUNMO01BQ0FQLEtBQUssR0FBR0EsS0FBSyxDQUFDTyxLQUFLLENBQUMsQ0FBQyxFQUFFUCxLQUFLLENBQUNqQixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzFDO0lBRUEsSUFBSWlCLEtBQUssQ0FBQ2pCLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJYSxJQUFJLEtBQUssS0FBSyxFQUFFO01BQzVDLE9BQU87UUFDTFMsTUFBTSxFQUFFLE9BQU87UUFDZkMsSUFBSSxFQUFFO01BQ1IsQ0FBQztJQUNIO0lBRUEsTUFBTUUsS0FBSyxHQUFHLEVBQUU7SUFDaEIsT0FBT1IsS0FBSyxDQUFDakIsTUFBTSxFQUFFO01BQ25CeUIsS0FBSyxDQUFDdkIsSUFBSSxDQUFDLENBQUNlLEtBQUssQ0FBQ1MsS0FBSyxDQUFDLENBQUMsRUFBRVQsS0FBSyxDQUFDUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUM7SUFFQSxJQUFJQyxPQUFPLEdBQUcsQ0FBQztJQUNmLEtBQUssTUFBTSxDQUFDQyxHQUFHLEVBQUVDLFFBQVEsQ0FBQyxJQUFJSixLQUFLLEVBQUU7TUFDbkMsTUFBTUssR0FBRyxHQUFHQyxNQUFNLENBQUNILEdBQUcsQ0FBQztNQUN2QixJQUFJLENBQUNHLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDRixHQUFHLENBQUMsRUFBRTtRQUMxQixPQUFPO1VBQ0xSLE1BQU0sRUFBRSxPQUFPO1VBQ2ZDLElBQUksRUFBRSxJQUFJSyxHQUFHO1FBQ2YsQ0FBQztNQUNIO01BRUEsUUFBUUMsUUFBUTtRQUNkLEtBQUssSUFBSTtRQUNULEtBQUssS0FBSztRQUNWLEtBQUssTUFBTTtRQUNYLEtBQUssT0FBTztVQUNWRixPQUFPLElBQUlHLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQztVQUMzQjtRQUVGLEtBQUssSUFBSTtRQUNULEtBQUssS0FBSztRQUNWLEtBQUssTUFBTTtRQUNYLEtBQUssT0FBTztVQUNWSCxPQUFPLElBQUlHLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztVQUN6QjtRQUVGLEtBQUssR0FBRztRQUNSLEtBQUssS0FBSztRQUNWLEtBQUssTUFBTTtVQUNUSCxPQUFPLElBQUlHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztVQUN4QjtRQUVGLEtBQUssSUFBSTtRQUNULEtBQUssS0FBSztRQUNWLEtBQUssTUFBTTtRQUNYLEtBQUssT0FBTztVQUNWSCxPQUFPLElBQUlHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztVQUN2QjtRQUVGLEtBQUssS0FBSztRQUNWLEtBQUssTUFBTTtRQUNYLEtBQUssUUFBUTtRQUNiLEtBQUssU0FBUztVQUNaSCxPQUFPLElBQUlHLEdBQUcsR0FBRyxFQUFFO1VBQ25CO1FBRUYsS0FBSyxLQUFLO1FBQ1YsS0FBSyxNQUFNO1FBQ1gsS0FBSyxRQUFRO1FBQ2IsS0FBSyxTQUFTO1VBQ1pILE9BQU8sSUFBSUcsR0FBRztVQUNkO1FBRUY7VUFDRSxPQUFPO1lBQ0xSLE1BQU0sRUFBRSxPQUFPO1lBQ2ZDLElBQUksRUFBRSxzQkFBc0JNLFFBQVE7VUFDdEMsQ0FBQztNQUNMO0lBQ0Y7SUFFQSxNQUFNSSxZQUFZLEdBQUdOLE9BQU8sR0FBRyxJQUFJO0lBQ25DLElBQUlQLE1BQU0sRUFBRTtNQUNWLE9BQU87UUFDTEUsTUFBTSxFQUFFLFNBQVM7UUFDakJDLElBQUksRUFBRSxRQUFRO1FBQ2R6QyxNQUFNLEVBQUUsSUFBSWlDLElBQUksQ0FBQ0QsR0FBRyxDQUFDb0IsT0FBTyxDQUFDLENBQUMsR0FBR0QsWUFBWTtNQUMvQyxDQUFDO0lBQ0gsQ0FBQyxNQUFNLElBQUlaLElBQUksRUFBRTtNQUNmLE9BQU87UUFDTEMsTUFBTSxFQUFFLFNBQVM7UUFDakJDLElBQUksRUFBRSxNQUFNO1FBQ1p6QyxNQUFNLEVBQUUsSUFBSWlDLElBQUksQ0FBQ0QsR0FBRyxDQUFDb0IsT0FBTyxDQUFDLENBQUMsR0FBR0QsWUFBWTtNQUMvQyxDQUFDO0lBQ0gsQ0FBQyxNQUFNO01BQ0wsT0FBTztRQUNMWCxNQUFNLEVBQUUsU0FBUztRQUNqQkMsSUFBSSxFQUFFLFNBQVM7UUFDZnpDLE1BQU0sRUFBRSxJQUFJaUMsSUFBSSxDQUFDRCxHQUFHLENBQUNvQixPQUFPLENBQUMsQ0FBQztNQUNoQyxDQUFDO0lBQ0g7RUFDRjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFLE9BQU9DLHNCQUFzQkEsQ0FBQ3hELEdBQUcsRUFBRUksR0FBRyxFQUFFZSxLQUFLLEVBQUU7SUFDN0MsTUFBTXNDLE9BQU8sR0FBR0EsQ0FBQ0MsQ0FBQyxFQUFFQyxDQUFDLEtBQU0sT0FBT0QsQ0FBQyxLQUFLLFFBQVEsSUFBSSxJQUFJRSxNQUFNLENBQUNELENBQUMsQ0FBQyxDQUFDN0QsSUFBSSxDQUFDNEQsQ0FBQyxDQUFDLElBQUtBLENBQUMsS0FBS0MsQ0FBQztJQUNyRixNQUFNRSxVQUFVLEdBQUdDLENBQUMsSUFBSUwsT0FBTyxDQUFDSyxDQUFDLEVBQUUxRCxHQUFHLENBQUM7SUFDdkMsTUFBTTJELFlBQVksR0FBR2hDLENBQUMsSUFBSTBCLE9BQU8sQ0FBQzFCLENBQUMsRUFBRVosS0FBSyxDQUFDO0lBQzNDLEtBQUssTUFBTSxDQUFDMkMsQ0FBQyxFQUFFL0IsQ0FBQyxDQUFDLElBQUkxQixNQUFNLENBQUMyRCxPQUFPLENBQUNoRSxHQUFHLENBQUMsRUFBRTtNQUN4QyxJQUFJSSxHQUFHLEtBQUs2RCxTQUFTLElBQUk5QyxLQUFLLEtBQUs4QyxTQUFTLElBQUlKLFVBQVUsQ0FBQ0MsQ0FBQyxDQUFDLEVBQUU7UUFDN0QsT0FBTyxJQUFJO01BQ2IsQ0FBQyxNQUFNLElBQUkxRCxHQUFHLEtBQUs2RCxTQUFTLElBQUk5QyxLQUFLLEtBQUs4QyxTQUFTLElBQUlGLFlBQVksQ0FBQ2hDLENBQUMsQ0FBQyxFQUFFO1FBQ3RFLE9BQU8sSUFBSTtNQUNiLENBQUMsTUFBTSxJQUFJM0IsR0FBRyxLQUFLNkQsU0FBUyxJQUFJOUMsS0FBSyxLQUFLOEMsU0FBUyxJQUFJSixVQUFVLENBQUNDLENBQUMsQ0FBQyxJQUFJQyxZQUFZLENBQUNoQyxDQUFDLENBQUMsRUFBRTtRQUN2RixPQUFPLElBQUk7TUFDYjtNQUNBLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDbUMsUUFBUSxDQUFDN0QsTUFBTSxDQUFDQyxTQUFTLENBQUM2RCxRQUFRLENBQUMzRCxJQUFJLENBQUN1QixDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3JGLE9BQU9yRCxLQUFLLENBQUM4RSxzQkFBc0IsQ0FBQ3pCLENBQUMsRUFBRTNCLEdBQUcsRUFBRWUsS0FBSyxDQUFDO01BQ3BEO0lBQ0Y7SUFDQSxPQUFPLEtBQUs7RUFDZDtFQUVBLE9BQU9pRCx1QkFBdUJBLENBQUNDLE1BQU0sRUFBRUMsSUFBSSxFQUFFO0lBQzNDLElBQUlELE1BQU0sRUFBRUUsc0JBQXNCLEVBQUU7TUFDbEM7TUFDQSxLQUFLLE1BQU1DLE9BQU8sSUFBSUgsTUFBTSxDQUFDRSxzQkFBc0IsRUFBRTtRQUNuRCxNQUFNRSxLQUFLLEdBQUcvRixLQUFLLENBQUM4RSxzQkFBc0IsQ0FBQ2MsSUFBSSxFQUFFRSxPQUFPLENBQUNwRSxHQUFHLEVBQUVvRSxPQUFPLENBQUNyRCxLQUFLLENBQUM7UUFDNUUsSUFBSXNELEtBQUssRUFBRTtVQUNULE1BQU0sdUNBQXVDQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0gsT0FBTyxDQUFDLEdBQUc7UUFDekU7TUFDRjtJQUNGO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxPQUFPSSxtQkFBbUJBLENBQUM1RSxHQUFHLEVBQUVJLEdBQUcsRUFBRTtJQUNuQyxJQUFJSixHQUFHLENBQUNJLEdBQUcsQ0FBQyxJQUFJLE9BQU9KLEdBQUcsQ0FBQ0ksR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFO01BQzVDO01BQ0FDLE1BQU0sQ0FBQ2lCLE1BQU0sQ0FBQ3RCLEdBQUcsRUFBRTtRQUFFLEdBQUdBLEdBQUcsQ0FBQ0ksR0FBRztNQUFFLENBQUMsQ0FBQztNQUNuQztNQUNBLE9BQU9KLEdBQUcsQ0FBQ0ksR0FBRyxDQUFDO0lBQ2pCO0lBQ0EsT0FBT0osR0FBRztFQUNaOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxPQUFPNkUsWUFBWUEsQ0FBQ0MsS0FBSyxFQUFFO0lBQ3pCLE9BQU9DLGtCQUFrQixDQUFDRCxLQUFLLENBQUMsQ0FBQ0UsT0FBTyxDQUFDLFdBQVcsRUFBRUMsSUFBSSxJQUN4RCxHQUFHLEdBQUdBLElBQUksQ0FBQ0MsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDZixRQUFRLENBQUMsRUFBRSxDQUFDLENBQUNnQixXQUFXLENBQUMsQ0FDcEQsQ0FBQztFQUNIOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFLE9BQU9DLG1CQUFtQkEsQ0FBQSxFQUFHO0lBQzNCLE1BQU1DLElBQUksR0FBRyxJQUFJQyxPQUFPLENBQUMsQ0FBQztJQUMxQixPQUFPLENBQUNsRixHQUFHLEVBQUVlLEtBQUssS0FBSztNQUNyQixJQUFJQSxLQUFLLFlBQVlvRSxHQUFHLEVBQUU7UUFDeEIsT0FBT2xGLE1BQU0sQ0FBQ21GLFdBQVcsQ0FBQ3JFLEtBQUssQ0FBQztNQUNsQztNQUNBLElBQUlBLEtBQUssWUFBWXNFLEdBQUcsRUFBRTtRQUN4QixPQUFPQyxLQUFLLENBQUNDLElBQUksQ0FBQ3hFLEtBQUssQ0FBQztNQUMxQjtNQUNBLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBSUEsS0FBSyxLQUFLLElBQUksRUFBRTtRQUMvQyxJQUFJa0UsSUFBSSxDQUFDTyxHQUFHLENBQUN6RSxLQUFLLENBQUMsRUFBRTtVQUNuQixPQUFPLFlBQVk7UUFDckI7UUFDQWtFLElBQUksQ0FBQ1EsR0FBRyxDQUFDMUUsS0FBSyxDQUFDO01BQ2pCO01BQ0EsT0FBT0EsS0FBSztJQUNkLENBQUM7RUFDSDs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFLE9BQU8yRSxpQkFBaUJBLENBQUM5RixHQUFHLEVBQUUxQixJQUFJLEVBQUU7SUFDbEMsSUFBSSxDQUFDMEIsR0FBRyxJQUFJLENBQUMxQixJQUFJLEVBQUU7TUFDakIsT0FBTzJGLFNBQVM7SUFDbEI7SUFDQSxNQUFNaEQsSUFBSSxHQUFHM0MsSUFBSSxDQUFDa0IsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUM1QixJQUFJdUIsT0FBTyxHQUFHZixHQUFHO0lBQ2pCLEtBQUssTUFBTUksR0FBRyxJQUFJYSxJQUFJLEVBQUU7TUFDdEIsSUFBSUYsT0FBTyxJQUFJLElBQUksSUFBSSxPQUFPQSxPQUFPLEtBQUssUUFBUSxFQUFFO1FBQ2xELE9BQU9rRCxTQUFTO01BQ2xCO01BQ0FsRCxPQUFPLEdBQUdBLE9BQU8sQ0FBQ1gsR0FBRyxDQUFDO0lBQ3hCO0lBQ0EsT0FBT1csT0FBTztFQUNoQjtBQUNGO0FBRUFnRixNQUFNLENBQUNDLE9BQU8sR0FBR3RILEtBQUsiLCJpZ25vcmVMaXN0IjpbXX0=
502
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsImZzIiwicHJvbWlzZXMiLCJVdGlscyIsImdldExvY2FsaXplZFBhdGgiLCJkZWZhdWx0UGF0aCIsImxvY2FsZSIsImZpbGUiLCJiYXNlbmFtZSIsImJhc2VQYXRoIiwiZGlybmFtZSIsImxvY2FsZVBhdGgiLCJqb2luIiwibG9jYWxlRmlsZUV4aXN0cyIsImZpbGVFeGlzdHMiLCJzdWJkaXIiLCJsYW5ndWFnZSIsInNwbGl0IiwibGFuZ3VhZ2VQYXRoIiwibGFuZ3VhZ2VGaWxlRXhpc3RzIiwiYWNjZXNzIiwiaXNQYXRoIiwicyIsInRlc3QiLCJmbGF0dGVuT2JqZWN0Iiwib2JqIiwicGFyZW50S2V5IiwiZGVsaW1pdGVyIiwicmVzdWx0Iiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibmV3S2V5IiwiaXNQcm9taXNlIiwib2JqZWN0IiwiUHJvbWlzZSIsImdldE9iamVjdEtleVBlcm11dGF0aW9ucyIsImluZGV4IiwiY3VycmVudCIsInJlc3VsdHMiLCJrZXlzIiwidmFsdWVzIiwidmFsdWUiLCJuZXh0SW5kZXgiLCJsZW5ndGgiLCJhc3NpZ24iLCJwdXNoIiwidmFsaWRhdGVQYXJhbXMiLCJwYXJhbXMiLCJ0eXBlcyIsInR5cGUiLCJpc09wdGlvbmFsIiwibyIsInBhcmFtIiwidiIsInQiLCJyZWxhdGl2ZVRpbWVUb0RhdGUiLCJ0ZXh0Iiwibm93IiwiRGF0ZSIsInRvTG93ZXJDYXNlIiwicGFydHMiLCJmaWx0ZXIiLCJwYXJ0IiwiZnV0dXJlIiwicGFzdCIsInN0YXR1cyIsImluZm8iLCJzbGljZSIsInBhaXJzIiwic2hpZnQiLCJzZWNvbmRzIiwibnVtIiwiaW50ZXJ2YWwiLCJ2YWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJtaWxsaXNlY29uZHMiLCJ2YWx1ZU9mIiwib2JqZWN0Q29udGFpbnNLZXlWYWx1ZSIsImlzTWF0Y2giLCJhIiwiYiIsIlJlZ0V4cCIsImlzS2V5TWF0Y2giLCJrIiwiaXNWYWx1ZU1hdGNoIiwiZW50cmllcyIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwidG9TdHJpbmciLCJjaGVja1Byb2hpYml0ZWRLZXl3b3JkcyIsImNvbmZpZyIsImRhdGEiLCJyZXF1ZXN0S2V5d29yZERlbnlsaXN0Iiwia2V5d29yZCIsIm1hdGNoIiwiSlNPTiIsInN0cmluZ2lmeSIsImFkZE5lc3RlZEtleXNUb1Jvb3QiLCJlbmNvZGVGb3JVcmwiLCJpbnB1dCIsImVuY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2UiLCJjaGFyIiwiY2hhckNvZGVBdCIsInRvVXBwZXJDYXNlIiwiZ2V0Q2lyY3VsYXJSZXBsYWNlciIsInNlZW4iLCJXZWFrU2V0IiwiTWFwIiwiZnJvbUVudHJpZXMiLCJTZXQiLCJBcnJheSIsImZyb20iLCJoYXMiLCJhZGQiLCJnZXROZXN0ZWRQcm9wZXJ0eSIsInBhcnNlU2l6ZVRvQnl0ZXMiLCJzaXplIiwiaXNGaW5pdGUiLCJFcnJvciIsIk1hdGgiLCJmbG9vciIsInN0ciIsIlN0cmluZyIsInRyaW0iLCJwYXJzZUZsb2F0IiwidW5pdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvVXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB1dGlscy5qc1xuICogQGZpbGUgR2VuZXJhbCBwdXJwb3NlIHV0aWxpdGllc1xuICogQGRlc2NyaXB0aW9uIEdlbmVyYWwgcHVycG9zZSB1dGlsaXRpZXMuXG4gKi9cblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKS5wcm9taXNlcztcblxuLyoqXG4gKiBUaGUgZ2VuZXJhbCBwdXJwb3NlIHV0aWxpdGllcy5cbiAqL1xuY2xhc3MgVXRpbHMge1xuICAvKipcbiAgICogQGZ1bmN0aW9uIGdldExvY2FsaXplZFBhdGhcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBsb2NhbGl6ZWQgZmlsZSBwYXRoIGFjY29yaW5nIHRvIHRoZSBsb2NhbGUuXG4gICAqXG4gICAqIExvY2FsaXplZCBmaWxlcyBhcmUgc2VhcmNoZWQgaW4gc3ViZm9sZGVycyBvZiBhIGdpdmVuIHBhdGgsIGUuZy5cbiAgICpcbiAgICogcm9vdC9cbiAgICog4pSc4pSA4pSAIGJhc2UvICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIHBhdGggdG8gZmlsZXNcbiAgICog4pSCICAg4pSc4pSA4pSAIGV4YW1wbGUuaHRtbCAgICAgICAgIC8vIGRlZmF1bHQgZmlsZVxuICAgKiDilIIgICDilJTilIDilIAgZGUvICAgICAgICAgICAgICAgICAgLy8gZGUgbGFuZ3VhZ2UgZm9sZGVyXG4gICAqIOKUgiAgIOKUgiAgIOKUlOKUgOKUgCBleGFtcGxlLmh0bWwgICAgIC8vIGRlIGxvY2FsaXplZCBmaWxlXG4gICAqIOKUgiAgIOKUlOKUgOKUgCBkZS1BVC8gICAgICAgICAgICAgICAvLyBkZS1BVCBsb2NhbGUgZm9sZGVyXG4gICAqIOKUgiAgIOKUgiAgIOKUlOKUgOKUgCBleGFtcGxlLmh0bWwgICAgIC8vIGRlLUFUIGxvY2FsaXplZCBmaWxlXG4gICAqXG4gICAqIEZpbGVzIGFyZSBtYXRjaGVkIHdpdGggdGhlIGxvY2FsZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuICAgKiAxLiBMb2NhbGUgbWF0Y2gsIGUuZy4gbG9jYWxlIGBkZS1BVGAgbWF0Y2hlcyBmaWxlIGluIGZvbGRlciBgZGUtQVRgLlxuICAgKiAyLiBMYW5ndWFnZSBtYXRjaCwgZS5nLiBsb2NhbGUgYGRlLUFUYCBtYXRjaGVzIGZpbGUgaW4gZm9sZGVyIGBkZWAuXG4gICAqIDMuIERlZmF1bHQ7IGZpbGUgaW4gYmFzZSBmb2xkZXIgaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkZWZhdWx0UGF0aCBUaGUgYWJzb2x1dGUgZmlsZSBwYXRoLCB3aGljaCBpcyBhbHNvXG4gICAqIHRoZSBkZWZhdWx0IHBhdGggcmV0dXJuZWQgaWYgbG9jYWxpemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsb2NhbGUgVGhlIGxvY2FsZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gVGhlIG9iamVjdCBjb250YWluczpcbiAgICogLSBgcGF0aGA6IFRoZSBwYXRoIHRvIHRoZSBsb2NhbGl6ZWQgZmlsZSwgb3IgdGhlIG9yaWdpbmFsIHBhdGggaWZcbiAgICogICBsb2NhbGl6YXRpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAgICogLSBgc3ViZGlyYDogVGhlIHN1YmRpcmVjdG9yeSBvZiB0aGUgbG9jYWxpemVkIGZpbGUsIG9yIHVuZGVmaW5lZCBpZlxuICAgKiAgIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGxvY2FsaXplZCBmaWxlLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldExvY2FsaXplZFBhdGgoZGVmYXVsdFBhdGgsIGxvY2FsZSkge1xuICAgIC8vIEdldCBmaWxlIG5hbWUgYW5kIHBhdGhzXG4gICAgY29uc3QgZmlsZSA9IHBhdGguYmFzZW5hbWUoZGVmYXVsdFBhdGgpO1xuICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aC5kaXJuYW1lKGRlZmF1bHRQYXRoKTtcblxuICAgIC8vIElmIGxvY2FsZSBpcyBub3Qgc2V0IHJldHVybiBkZWZhdWx0IGZpbGVcbiAgICBpZiAoIWxvY2FsZSkge1xuICAgICAgcmV0dXJuIHsgcGF0aDogZGVmYXVsdFBhdGggfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmaWxlIGZvciBsb2NhbGUgZXhpc3RzXG4gICAgY29uc3QgbG9jYWxlUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgbG9jYWxlLCBmaWxlKTtcbiAgICBjb25zdCBsb2NhbGVGaWxlRXhpc3RzID0gYXdhaXQgVXRpbHMuZmlsZUV4aXN0cyhsb2NhbGVQYXRoKTtcblxuICAgIC8vIElmIGZpbGUgZm9yIGxvY2FsZSBleGlzdHMgcmV0dXJuIGZpbGVcbiAgICBpZiAobG9jYWxlRmlsZUV4aXN0cykge1xuICAgICAgcmV0dXJuIHsgcGF0aDogbG9jYWxlUGF0aCwgc3ViZGlyOiBsb2NhbGUgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmaWxlIGZvciBsYW5ndWFnZSBleGlzdHNcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxvY2FsZS5zcGxpdCgnLScpWzBdO1xuICAgIGNvbnN0IGxhbmd1YWdlUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgbGFuZ3VhZ2UsIGZpbGUpO1xuICAgIGNvbnN0IGxhbmd1YWdlRmlsZUV4aXN0cyA9IGF3YWl0IFV0aWxzLmZpbGVFeGlzdHMobGFuZ3VhZ2VQYXRoKTtcblxuICAgIC8vIElmIGZpbGUgZm9yIGxhbmd1YWdlIGV4aXN0cyByZXR1cm4gZmlsZVxuICAgIGlmIChsYW5ndWFnZUZpbGVFeGlzdHMpIHtcbiAgICAgIHJldHVybiB7IHBhdGg6IGxhbmd1YWdlUGF0aCwgc3ViZGlyOiBsYW5ndWFnZSB9O1xuICAgIH1cblxuICAgIC8vIFJldHVybiBkZWZhdWx0IGZpbGVcbiAgICByZXR1cm4geyBwYXRoOiBkZWZhdWx0UGF0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBmdW5jdGlvbiBmaWxlRXhpc3RzXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3Mgd2hldGhlciBhIGZpbGUgZXhpc3RzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgZmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gSXMgdHJ1ZSBpZiB0aGUgZmlsZSBjYW4gYmUgYWNjZXNzZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaWxlRXhpc3RzKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKHBhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBmdW5jdGlvbiBpc1BhdGhcbiAgICogQGRlc2NyaXB0aW9uIEV2YWx1YXRlcyB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgZmlsZSBwYXRoIChhcyBvcHBvc2VkIHRvIGEgVVJMIGZvciBleGFtcGxlKS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHMgVGhlIHN0cmluZyB0byBldmFsdWF0ZS5cbiAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZhbHVhdGVkIHN0cmluZyBpcyBhIHBhdGguXG4gICAqL1xuICBzdGF0aWMgaXNQYXRoKHMpIHtcbiAgICByZXR1cm4gLyheXFwvKXwoXlxcLlxcLyl8KF5cXC5cXC5cXC8pLy50ZXN0KHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGFuIG9iamVjdCBhbmQgY3JhdGVzIG5ldyBrZXlzIHdpdGggY3VzdG9tIGRlbGltaXRlcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBmbGF0dGVuLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2RlbGltaXRlcj0nLiddIFRoZSBkZWxpbWl0ZXIgb2YgdGhlIG5ld2x5IGdlbmVyYXRlZCBrZXlzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0XG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBmbGF0dGVuZWQgb2JqZWN0LlxuICAgKiovXG4gIHN0YXRpYyBmbGF0dGVuT2JqZWN0KG9iaiwgcGFyZW50S2V5LCBkZWxpbWl0ZXIgPSAnLicsIHJlc3VsdCA9IHt9KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICBjb25zdCBuZXdLZXkgPSBwYXJlbnRLZXkgPyBwYXJlbnRLZXkgKyBkZWxpbWl0ZXIgKyBrZXkgOiBrZXk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgb2JqW2tleV0gIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZsYXR0ZW5PYmplY3Qob2JqW2tleV0sIG5ld0tleSwgZGVsaW1pdGVyLCByZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtuZXdLZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGEgUHJvbWlzZS5cbiAgICogQHBhcmFtIHthbnl9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBwcm9taXNlLlxuICAgKi9cbiAgc3RhdGljIGlzUHJvbWlzZShvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIGFsbCBwZXJtdXRhdGlvbnMgb2YgdGhlIG9yaWdpbmFsIGtleXMuXG4gICAqIEZvciBleGFtcGxlLCB0aGlzIGRlZmluaXRpb246XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgYTogW3RydWUsIGZhbHNlXSxcbiAgICogICBiOiBbMSwgMl0sXG4gICAqICAgYzogWyd4J11cbiAgICogfVxuICAgKiBgYGBcbiAgICogcGVybXV0YXRlcyB0bzpcbiAgICogYGBgXG4gICAqIFtcbiAgICogICB7IGE6IHRydWUsIGI6IDEsIGM6ICd4JyB9LFxuICAgKiAgIHsgYTogdHJ1ZSwgYjogMiwgYzogJ3gnIH0sXG4gICAqICAgeyBhOiBmYWxzZSwgYjogMSwgYzogJ3gnIH0sXG4gICAqICAgeyBhOiBmYWxzZSwgYjogMiwgYzogJ3gnIH1cbiAgICogXVxuICAgKiBgYGBcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHBlcm11dGF0ZS5cbiAgICogQHBhcmFtIHtJbnRlZ2VyfSBbaW5kZXg9MF0gVGhlIGN1cnJlbnQga2V5IGluZGV4LlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2N1cnJlbnQ9e31dIFRoZSBjdXJyZW50IHJlc3VsdCBlbnRyeSBiZWluZyBjb21wb3NlZC5cbiAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHM9W11dIFRoZSByZXN1bHRpbmcgYXJyYXkgb2YgcGVybXV0YXRpb25zLlxuICAgKi9cbiAgc3RhdGljIGdldE9iamVjdEtleVBlcm11dGF0aW9ucyhvYmplY3QsIGluZGV4ID0gMCwgY3VycmVudCA9IHt9LCByZXN1bHRzID0gW10pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgICBjb25zdCBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICBjb25zdCB2YWx1ZXMgPSBvYmplY3Rba2V5XTtcblxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgMTtcblxuICAgICAgaWYgKG5leHRJbmRleCA8IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIFV0aWxzLmdldE9iamVjdEtleVBlcm11dGF0aW9ucyhvYmplY3QsIG5leHRJbmRleCwgY3VycmVudCwgcmVzdWx0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBwYXJhbWV0ZXJzIGFuZCB0aHJvd3MgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cbiAgICogRXhhbXBsZSBwYXJhbWV0ZXIgdHlwZXMgc3ludGF4OlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIHBhcmFtZXRlck5hbWU6IHtcbiAgICogICAgICB0OiAnYm9vbGVhbicsXG4gICAqICAgICAgdjogaXNCb29sZWFuLFxuICAgKiAgICAgIG86IHRydWVcbiAgICogICB9LFxuICAgKiAgIC4uLlxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IHR5cGVzIFRoZSBwYXJhbWV0ZXIgdHlwZXMgdXNlZCBmb3IgdmFsaWRhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVzLnQgVGhlIHBhcmFtZXRlciB0eXBlOyB1c2VkIGZvciBlcnJvciBtZXNzYWdlLCBub3QgZm9yIHZhbGlkYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlcy52IFRoZSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFt0eXBlcy5vPWZhbHNlXSBJcyB0cnVlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVQYXJhbXMocGFyYW1zLCB0eXBlcykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFtcykpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlc1trZXldO1xuICAgICAgY29uc3QgaXNPcHRpb25hbCA9ICEhdHlwZS5vO1xuICAgICAgY29uc3QgcGFyYW0gPSBwYXJhbXNba2V5XTtcbiAgICAgIGlmICghKGlzT3B0aW9uYWwgJiYgcGFyYW0gPT0gbnVsbCkgJiYgIXR5cGUudihwYXJhbSkpIHtcbiAgICAgICAgdGhyb3cgYEludmFsaWQgcGFyYW1ldGVyICR7a2V5fSBtdXN0IGJlIG9mIHR5cGUgJHt0eXBlLnR9IGJ1dCBpcyAke3R5cGVvZiBwYXJhbX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgcmVsYXRpdmUgZGF0ZSBiYXNlZCBvbiBhIHN0cmluZy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHN0cmluZyB0byBpbnRlcnByZXQgdGhlIGRhdGUgZnJvbS5cbiAgICogQHBhcmFtIHtEYXRlfSBub3cgVGhlIGRhdGUgdGhlIHN0cmluZyBpcyBjb21wYXJpbmcgYWdhaW5zdC5cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIHJlbGF0aXZlIGRhdGUgb2JqZWN0LlxuICAgKiovXG4gIHN0YXRpYyByZWxhdGl2ZVRpbWVUb0RhdGUodGV4dCwgbm93ID0gbmV3IERhdGUoKSkge1xuICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IHBhcnRzID0gdGV4dC5zcGxpdCgnICcpO1xuXG4gICAgLy8gRmlsdGVyIG91dCB3aGl0ZXNwYWNlXG4gICAgcGFydHMgPSBwYXJ0cy5maWx0ZXIocGFydCA9PiBwYXJ0ICE9PSAnJyk7XG5cbiAgICBjb25zdCBmdXR1cmUgPSBwYXJ0c1swXSA9PT0gJ2luJztcbiAgICBjb25zdCBwYXN0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT09ICdhZ28nO1xuXG4gICAgaWYgKCFmdXR1cmUgJiYgIXBhc3QgJiYgdGV4dCAhPT0gJ25vdycpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgaW5mbzogXCJUaW1lIHNob3VsZCBlaXRoZXIgc3RhcnQgd2l0aCAnaW4nIG9yIGVuZCB3aXRoICdhZ28nXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChmdXR1cmUgJiYgcGFzdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICBpbmZvOiBcIlRpbWUgY2Fubm90IGhhdmUgYm90aCAnaW4nIGFuZCAnYWdvJ1wiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBzdHJpcCB0aGUgJ2Fnbycgb3IgJ2luJ1xuICAgIGlmIChmdXR1cmUpIHtcbiAgICAgIHBhcnRzID0gcGFydHMuc2xpY2UoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHBhc3RcbiAgICAgIHBhcnRzID0gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCAlIDIgIT09IDAgJiYgdGV4dCAhPT0gJ25vdycpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgaW5mbzogJ0ludmFsaWQgdGltZSBzdHJpbmcuIERhbmdsaW5nIHVuaXQgb3IgbnVtYmVyLicsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgd2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuICAgICAgcGFpcnMucHVzaChbcGFydHMuc2hpZnQoKSwgcGFydHMuc2hpZnQoKV0pO1xuICAgIH1cblxuICAgIGxldCBzZWNvbmRzID0gMDtcbiAgICBmb3IgKGNvbnN0IFtudW0sIGludGVydmFsXSBvZiBwYWlycykge1xuICAgICAgY29uc3QgdmFsID0gTnVtYmVyKG51bSk7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICBpbmZvOiBgJyR7bnVtfScgaXMgbm90IGFuIGludGVnZXIuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3lycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgICAgc2Vjb25kcyArPSB2YWwgKiAzMTUzNjAwMDsgLy8gMzY1ICogMjQgKiA2MCAqIDYwXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnd2snOlxuICAgICAgICBjYXNlICd3a3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICAgIHNlY29uZHMgKz0gdmFsICogNjA0ODAwOyAvLyA3ICogMjQgKiA2MCAqIDYwXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICAgIHNlY29uZHMgKz0gdmFsICogODY0MDA7IC8vIDI0ICogNjAgKiA2MFxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDM2MDA7IC8vIDYwICogNjBcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtaW5zJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgICAgc2Vjb25kcyArPSB2YWwgKiA2MDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgc2Vjb25kcyArPSB2YWw7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgaW5mbzogYEludmFsaWQgaW50ZXJ2YWw6ICcke2ludGVydmFsfSdgLFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gc2Vjb25kcyAqIDEwMDA7XG4gICAgaWYgKGZ1dHVyZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICAgIGluZm86ICdmdXR1cmUnLFxuICAgICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMpLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhc3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICBpbmZvOiAncGFzdCcsXG4gICAgICAgIHJlc3VsdDogbmV3IERhdGUobm93LnZhbHVlT2YoKSAtIG1pbGxpc2Vjb25kcyksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgICAgaW5mbzogJ3ByZXNlbnQnLFxuICAgICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVlcC1zY2FucyBhbiBvYmplY3QgZm9yIGEgbWF0Y2hpbmcga2V5L3ZhbHVlIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBzY2FuLlxuICAgKiBAcGFyYW0ge1N0cmluZyB8IHVuZGVmaW5lZH0ga2V5IFRoZSBrZXkgdG8gbWF0Y2gsIG9yIHVuZGVmaW5lZCBpZiBvbmx5IHRoZSB2YWx1ZSBzaG91bGQgYmUgbWF0Y2hlZC5cbiAgICogQHBhcmFtIHthbnkgfCB1bmRlZmluZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaCwgb3IgdW5kZWZpbmVkIGlmIG9ubHkgdGhlIGtleSBzaG91bGQgYmUgbWF0Y2hlZC5cbiAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHN0YXRpYyBvYmplY3RDb250YWluc0tleVZhbHVlKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IGlzTWF0Y2ggPSAoYSwgYikgPT4gKHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiBuZXcgUmVnRXhwKGIpLnRlc3QoYSkpIHx8IGEgPT09IGI7XG4gICAgY29uc3QgaXNLZXlNYXRjaCA9IGsgPT4gaXNNYXRjaChrLCBrZXkpO1xuICAgIGNvbnN0IGlzVmFsdWVNYXRjaCA9IHYgPT4gaXNNYXRjaCh2LCB2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQgJiYgaXNLZXlNYXRjaChrKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpc1ZhbHVlTWF0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgaXNLZXlNYXRjaChrKSAmJiBpc1ZhbHVlTWF0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoWydbb2JqZWN0IE9iamVjdF0nLCAnW29iamVjdCBBcnJheV0nXS5pbmNsdWRlcyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodikpKSB7XG4gICAgICAgIHJldHVybiBVdGlscy5vYmplY3RDb250YWluc0tleVZhbHVlKHYsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tQcm9oaWJpdGVkS2V5d29yZHMoY29uZmlnLCBkYXRhKSB7XG4gICAgaWYgKGNvbmZpZz8ucmVxdWVzdEtleXdvcmREZW55bGlzdCkge1xuICAgICAgLy8gU2NhbiByZXF1ZXN0IGRhdGEgZm9yIGRlbmllZCBrZXl3b3Jkc1xuICAgICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIGNvbmZpZy5yZXF1ZXN0S2V5d29yZERlbnlsaXN0KSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gVXRpbHMub2JqZWN0Q29udGFpbnNLZXlWYWx1ZShkYXRhLCBrZXl3b3JkLmtleSwga2V5d29yZC52YWx1ZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHRocm93IGBQcm9oaWJpdGVkIGtleXdvcmQgaW4gcmVxdWVzdCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGtleXdvcmQpfS5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBuZXN0ZWQga2V5cyBvZiBhIHNwZWNpZmllZCBrZXkgaW4gYW4gb2JqZWN0IHRvIHRoZSByb290IG9mIHRoZSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB3aG9zZSBuZXN0ZWQga2V5cyB3aWxsIGJlIG1vdmVkIHRvIHJvb3QuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBtb2RpZmllZCBvYmplY3QsIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgaWYgbm8gbW9kaWZpY2F0aW9uIGhhcHBlbmVkLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBvYmogPSB7XG4gICAqICAgYTogMSxcbiAgICogICBiOiB7XG4gICAqICAgICBjOiAyLFxuICAgKiAgICAgZDogM1xuICAgKiAgIH0sXG4gICAqICAgZTogNFxuICAgKiB9O1xuICAgKiBhZGROZXN0ZWRLZXlzVG9Sb290KG9iaiwgJ2InKTtcbiAgICogY29uc29sZS5sb2cob2JqKTtcbiAgICogLy8gT3V0cHV0OiB7IGE6IDEsIGU6IDQsIGM6IDIsIGQ6IDMgfVxuICAqL1xuICBzdGF0aWMgYWRkTmVzdGVkS2V5c1RvUm9vdChvYmosIGtleSkge1xuICAgIGlmIChvYmpba2V5XSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBBZGQgbmVzdGVkIGtleXMgdG8gcm9vdFxuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHsgLi4ub2JqW2tleV0gfSk7XG4gICAgICAvLyBEZWxldGUgb3JpZ2luYWwgbmVzdGVkIGtleVxuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgYSBzdHJpbmcgdG8gYmUgdXNlZCBpbiBhIFVSTC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgZW5jb2RlRm9yVXJsKGlucHV0KSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCkucmVwbGFjZSgvWyEnLigpKl0vZywgY2hhciA9PlxuICAgICAgJyUnICsgY2hhci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgSlNPTiByZXBsYWNlciBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgTWFwLCBTZXQsIGFuZCBjaXJjdWxhciByZWZlcmVuY2VzLlxuICAgKiBUaGlzIHJlcGxhY2VyIGNhbiBiZSB1c2VkIHdpdGggSlNPTi5zdHJpbmdpZnkgdG8gc2FmZWx5IHNlcmlhbGl6ZSBjb21wbGV4IG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZXBsYWNlciBmdW5jdGlvbiBmb3IgSlNPTi5zdHJpbmdpZnkgdGhhdDpcbiAgICogLSBDb252ZXJ0cyBNYXAgaW5zdGFuY2VzIHRvIHBsYWluIG9iamVjdHNcbiAgICogLSBDb252ZXJ0cyBTZXQgaW5zdGFuY2VzIHRvIGFycmF5c1xuICAgKiAtIFJlcGxhY2VzIGNpcmN1bGFyIHJlZmVyZW5jZXMgd2l0aCAnW0NpcmN1bGFyXScgbWFya2VyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IG9iaiA9IHsgbmFtZTogJ3Rlc3QnLCBtYXA6IG5ldyBNYXAoW1sna2V5JywgJ3ZhbHVlJ11dKSB9O1xuICAgKiBvYmouc2VsZiA9IG9iajsgLy8gY2lyY3VsYXIgcmVmZXJlbmNlXG4gICAqIEpTT04uc3RyaW5naWZ5KG9iaiwgVXRpbHMuZ2V0Q2lyY3VsYXJSZXBsYWNlcigpKTtcbiAgICogLy8gT3V0cHV0OiB7XCJuYW1lXCI6XCJ0ZXN0XCIsXCJtYXBcIjp7XCJrZXlcIjpcInZhbHVlXCJ9LFwic2VsZlwiOlwiW0NpcmN1bGFyXVwifVxuICAgKi9cbiAgc3RhdGljIGdldENpcmN1bGFyUmVwbGFjZXIoKSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrU2V0KCk7XG4gICAgcmV0dXJuIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBnZXQgdGhlIHByb3BlcnR5IGZyb20uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIGluIGRvdCBub3RhdGlvbiwgZS5nLiAnZGF0YWJhc2VPcHRpb25zLmFsbG93UHVibGljRXhwbGFpbicuXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBvYmogPSB7IGRhdGFiYXNlOiB7IG9wdGlvbnM6IHsgZW5hYmxlZDogdHJ1ZSB9IH0gfTtcbiAgICogVXRpbHMuZ2V0TmVzdGVkUHJvcGVydHkob2JqLCAnZGF0YWJhc2Uub3B0aW9ucy5lbmFibGVkJyk7XG4gICAqIC8vIE91dHB1dDogdHJ1ZVxuICAgKi9cbiAgc3RhdGljIGdldE5lc3RlZFByb3BlcnR5KG9iaiwgcGF0aCkge1xuICAgIGlmICghb2JqIHx8ICFwYXRoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSBodW1hbi1yZWFkYWJsZSBzaXplIHN0cmluZyBpbnRvIGEgYnl0ZSBjb3VudC5cbiAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IHNpemUgLSBBIG51bWJlciAoZmxvb3JlZCB0byBhbiBpbnRlZ2VyKSwgYSBudW1lcmljIHN0cmluZ1xuICAgKiAgICh0cmVhdGVkIGFzIGJ5dGVzKSwgb3IgYSBzdHJpbmcgd2l0aCBhIHVuaXQgc3VmZml4OiBgYmAsIGBrYmAsIGBtYmAsIGBnYmBcbiAgICogICAoY2FzZS1pbnNlbnNpdGl2ZSkuIEV4YW1wbGVzOiBgJzIwbWInYCwgYCc1MTJrYidgLCBgJzEuNWdiJ2AsIGAxMDQ4NTc2YC5cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIHNpemUgaW4gYnl0ZXMsIGZsb29yZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvcm1hdC5cbiAgICovXG4gIHN0YXRpYyBwYXJzZVNpemVUb0J5dGVzKHNpemUpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzaXplKSB8fCBzaXplIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSB2YWx1ZTogJHtzaXplfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioc2l6ZSk7XG4gICAgfVxuICAgIGNvbnN0IHN0ciA9IFN0cmluZyhzaXplKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCgvXihcXGQrKD86XFwuXFxkKyk/KVxccyooYnxrYnxtYnxnYik/JC8pO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIHZhbHVlOiAke3NpemV9YCk7XG4gICAgfVxuICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICAgIGNvbnN0IHVuaXQgPSBtYXRjaFsyXTtcbiAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgIGNhc2UgJ2tiJzpcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtICogMTAyNCk7XG4gICAgICBjYXNlICdtYic6XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bSAqIDEwMjQgKiAxMDI0KTtcbiAgICAgIGNhc2UgJ2diJzpcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtICogMTAyNCAqIDEwMjQgKiAxMDI0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bSk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVXRpbHM7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNQSxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDNUIsTUFBTUMsRUFBRSxHQUFHRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUNFLFFBQVE7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLEtBQUssQ0FBQztFQUNWO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsYUFBYUMsZ0JBQWdCQSxDQUFDQyxXQUFXLEVBQUVDLE1BQU0sRUFBRTtJQUNqRDtJQUNBLE1BQU1DLElBQUksR0FBR1IsSUFBSSxDQUFDUyxRQUFRLENBQUNILFdBQVcsQ0FBQztJQUN2QyxNQUFNSSxRQUFRLEdBQUdWLElBQUksQ0FBQ1csT0FBTyxDQUFDTCxXQUFXLENBQUM7O0lBRTFDO0lBQ0EsSUFBSSxDQUFDQyxNQUFNLEVBQUU7TUFDWCxPQUFPO1FBQUVQLElBQUksRUFBRU07TUFBWSxDQUFDO0lBQzlCOztJQUVBO0lBQ0EsTUFBTU0sVUFBVSxHQUFHWixJQUFJLENBQUNhLElBQUksQ0FBQ0gsUUFBUSxFQUFFSCxNQUFNLEVBQUVDLElBQUksQ0FBQztJQUNwRCxNQUFNTSxnQkFBZ0IsR0FBRyxNQUFNVixLQUFLLENBQUNXLFVBQVUsQ0FBQ0gsVUFBVSxDQUFDOztJQUUzRDtJQUNBLElBQUlFLGdCQUFnQixFQUFF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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "parse-server",
3
- "version": "9.3.0-alpha.8",
3
+ "version": "9.3.0-alpha.9",
4
4
  "description": "An express module providing a Parse-compatible API server",
5
5
  "main": "lib/index.js",
6
6
  "repository": {