@esfaenza/httpservice 15.2.9 → 15.2.11

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.
@@ -51,13 +51,10 @@ export class HTTPService {
51
51
  /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */
52
52
  this.LastThreeCompletedCalls = [];
53
53
  this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();
54
- this.me = this.ExtensionsImpl.retrieveIdentity();
55
54
  this.localStorageHttpCacheKey = (this.APP_NAME).replace(/\s/g, '_') + "_HttpCache";
56
55
  this.localStorageHttpTimedCacheKey = (this.APP_NAME).replace(/\s/g, '_') + "_HttpTimedCache";
57
56
  this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + "_Expire";
58
57
  this.adjustOldStorageSystem();
59
- if (this.untimedCacheExpired())
60
- this.resetHttpUntimedCacheStorage();
61
58
  }
62
59
  /**
63
60
  * Se vedo che ci sono elementi salvati nel localStorage provo a toglierli e a risalvarli via preference.
@@ -722,6 +719,7 @@ export class HTTPService {
722
719
  * @returns {string} Chiave che rappresenta in maniera univoca la chiamata
723
720
  */
724
721
  makeCacheKey(url, params) {
722
+ this.me = this.me || this.ExtensionsImpl.retrieveIdentity();
725
723
  let authKeyPart = (this.me ? this.me.Idtenant : "") + (this.me && this.CACHE_BY_USER ? this.me.IdUser : "");
726
724
  let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev, next) => prev + "," + next + '=' + params.get(next), "") : "";
727
725
  return authKeyPart + "_" + url.substring(url.indexOf("api") + 4) + "?" + paramsKeyPart;
@@ -781,4 +779,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
781
779
  type: Inject,
782
780
  args: [HTTP_DEBUG_MODE]
783
781
  }] }, { type: i2.BaseLocalization }, { type: i3.HttpClient }, { type: i4.CacheService }, { type: i5.UtilityService }]; } });
784
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFjLGlCQUFpQixFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQStDLE1BQU0sc0JBQXNCLENBQUM7QUFDekosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTzdELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEUsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVoSCxXQUFXO0FBQ1gsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7O0FBUWpEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBMkJ0Qjs7T0FFRztJQUNILFlBQ1UsZUFBc0MsRUFDQyxpQkFBaUIsRUFDdEMsUUFBUSxFQUNPLHVCQUF1QixFQUNqQyxhQUFzQixFQUNwQixlQUF3QixFQUNqRCxFQUFvQixFQUNwQixJQUFnQixFQUNoQixZQUEwQixFQUMxQixRQUF3QjtRQVR4QixvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFDQyxz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RSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDbkUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxHQUFHLENBQUMsT0FBZTtRQUN6QixJQUFJLElBQUksQ0FBQyxlQUFlO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLEdBQUcsQ0FBQyxPQUFlO1FBQ3pCLHNEQUFzRDtRQUN0RCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzt3R0E1M0JVLFdBQVcsdURBZ0NBLGlCQUFpQiw2QkFDN0IsUUFBUSxhQUNSLHVCQUF1QixhQUN2QixhQUFhLGFBQ2IsZUFBZTs0R0FwQ2QsV0FBVyxjQURDLE1BQU07MkZBQ2xCLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOzswQkFpQzNCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDcEMsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLHVCQUF1Qjs7MEJBQzlCLE1BQU07MkJBQUMsYUFBYTs7MEJBQ3BCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBQcm9ncmVzc0V2ZW50LCBIdHRwUmVzcG9uc2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBFcyBGYWVuemFcclxuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9wcmVmZXJlbmNlc1wiO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvZXh0ZW5zaW9uc1wiO1xyXG5pbXBvcnQgeyBCYXNlTG9jYWxpemF0aW9uIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBEaXJldHRpdmUsIENvbXBvbmVudGksIExpYnJlcmllXHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZGVsYXksIGZpbmFsaXplLCBmaXJzdCwgbWFwLCBzY2FuIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG4vLyBDaGlhbWF0ZSBhaSBSZXBvc2l0b3J5IC8gdG9rZW5zXHJcbmltcG9ydCB7IEhUVFBfSU5WQUxJREFUSU9OLCBDTElFTlRfQ0FDSEVfRFVSQVRJT05fUywgQVBQX05BTUUsIENBQ0hFX0JZX1VTRVIsIEhUVFBfREVCVUdfTU9ERSB9IGZyb20gJy4vdG9rZW5zJztcclxuXHJcbi8vIE1vZGVsbGkgXHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyB9IGZyb20gJy4vY29uZmlnL0h0dHBTZXJ2aWNlRXh0ZW5zaW9ucyc7XHJcbmltcG9ydCB7IERvd25sb2FkIH0gZnJvbSAnLi9tb2RlbHMvRG93bmxvYWQnO1xyXG5pbXBvcnQgeyBDYWNoZUluZm9zIH0gZnJvbSBcIi4vbW9kZWxzL0NhY2hlSW5mb3NcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuZGVjbGFyZSB2YXIgZGF5anM6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aXppbyB1dGlsaXp6YXRvIHBlciBlZmZldHR1YXJlIHF1YWxzaWFzaSB0aXBvIGRpIGNoaWFtYXRhIEhUVFAgZGFsbCdhcHBsaWNhemlvbmUsIGdlc3Rpc2NlIGVycm9yaSBlIGNhY2hlIGRlbGxlIHJpc3Bvc3RlIG5hdGl2YW1lbnRlIGUgbmUgcHXDsiBlc3NlcmUgXHJcbiAqIGVzdGVzby9tb2RpZmljYXRvIGlsIGNvbXBvcnRhbWVudG8gaW1wbGVtZW50YW5kbyBsYSBjbGFzc2UgZGkgXCJob29rXCIgKipJSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogZSByZWdpc3RyYW5kb2xhIG5lbCBwcm92aWRlciBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKlxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXHJcbmV4cG9ydCBjbGFzcyBIVFRQU2VydmljZSB7XHJcblxyXG4gIC8qKiBDYWNoZSBkZWxsbyBzdGF0byBkZWxsZSBjaGlhbWF0ZSBIVFRQIGF0dHVhbG1lbnRlIGVmZmV0dHVhdGUuIE9nbmkgY2hpYW1hdGEgw6ggcmFwcHJlc2VudGF0YSBkYSB1biBHVUlEIGUgbG8gc3RhdHVzIGFzc3VtZSB2YWxvcmUgKipmYWxzZSoqIHNvbG8gc3VnbGkgZXJyb3JpICovXHJcbiAgcHJpdmF0ZSBjYWxsU3RhdHVzOiB7IFtpZDogc3RyaW5nXTogeyB1cmw6IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiB9IH0gPSB7fTtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIHJpc3Bvc3RlIGRlbGxlIGNoaWFtYXRlIHNvdHRvIGZvcm1hIGRpIGRpY3Rpb25hcnkgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSA9IG51bGw7XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsZSByaXNwb3N0ZSBkZWxsZSBjaGlhbWF0ZSBzb3R0byBmb3JtYSBkaSBkaWN0aW9uYXJ5LCBzb2xvIHBlciBsZSBjaGlhbWF0ZSBjb24gdW4gdGVtcG8gZGVmaW5pdG8gZGkgY2FjaGluZyAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkgPSBudWxsO1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbG8gc2NhZGVyZSBkZWxsYSBjYWNoZSBzdGVzc2EgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBDYWNoZUV4cGlyZUtleSA9IG51bGw7XHJcbiAgLyoqIElkZW50aXTDoCBjb2xsZWdhdGEgYWwgdG9rZW4gZGkgYXV0ZW50aWNhemlvbmUgZGEgdXNhcmUsIHJpY2hpZXN0YSBhbCBwcm9ncmFtbWEgY2hlIHV0aWxpenphIGxhIGxpYnJlcmlhIGF0dHJhdmVyc28gbCdob29rICoqcmV0cmlldmVJZGVudGl0eSoqIGRlbGxhICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogKi9cclxuICBwcml2YXRlIG1lOiB7IElkdGVuYW50OiBzdHJpbmcsIElkVXNlcjogc3RyaW5nIH0gPSBudWxsO1xyXG4gIC8qKiBJbmRpY2EgY2hlIGxhIGNhY2hlIGEgdGVtcG8gZGV2J2Vzc2VyZSBwZXJzaXN0aXRhIGlsIHByaW1hIHBvc3NpYmlsZSAqL1xyXG4gIHByaXZhdGUgUGVyc2lzdFRpbWVkQ2FjaGVBU0FQOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEluZGljYSBjaGUgbGEgY2FjaGUgc2VuemEgbGltaXRpIGRpIHRlbXBvIGRldidlc3NlcmUgcGVyc2lzdGl0YSBpbCBwcmltYSBwb3NzaWJpbGUgKi9cclxuICBwcml2YXRlIFBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcGxlbWVudGF6aW9uZSBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZSBwZXIgY29sbGVnYXJlIGkgY29tcG9ydGFtZW50aSBkZWxsYSBsaWJyZXJpYSBhbGwnYXBwbGljYXppb25lIGluIGN1aSDDqCB1c2F0YS4gXHJcbiAgICogXHJcbiAgICogU2Ugw6ggc3RhdG8gZWZmZXR0dWF0byBpbCBwcm92aWRlIGRlbGxhIGNsYXNzZSAqKkh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqIHZlcnLDoCB1c2F0byBxdWVsIHByb3ZpZGVyLCBhbHRyaW1lbnRpIHZlcnLDoCBjcmVhdGEgdW5hIG51b3ZhIGlzdGFuemEgZGkgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgRXh0ZW5zaW9uc0ltcGw6IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucztcclxuXHJcbiAgLyoqIExpc3RhIGRlbGxlIHVsdGltZSAzIGNoaWFtYXRlIGNvbXBsZXRhdGUgY29uIHN1Y2Nlc3NvIGluIG9yZGluZSBkaSBjb21wbGV0YW1lbnRvIChpbiBwb3NpemlvbmUgMCBjJ8OoIGwndWx0aW1hIGNvbXBsZXRhdGEgZWNjZXRlcmEuLi4pICovXHJcbiAgcHVibGljIExhc3RUaHJlZUNvbXBsZXRlZENhbGxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIEVYVEVOU0lPTl9DTEFTUzogSHR0cFNlcnZpY2VFeHRlbnNpb25zLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChIVFRQX0lOVkFMSURBVElPTikgcHJpdmF0ZSBIVFRQX0lOVkFMSURBVElPTixcclxuICAgIEBJbmplY3QoQVBQX05BTUUpIHByaXZhdGUgQVBQX05BTUUsXHJcbiAgICBASW5qZWN0KENMSUVOVF9DQUNIRV9EVVJBVElPTl9TKSBwcml2YXRlIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLFxyXG4gICAgQEluamVjdChDQUNIRV9CWV9VU0VSKSBwcml2YXRlIENBQ0hFX0JZX1VTRVI6IGJvb2xlYW4sXHJcbiAgICBASW5qZWN0KEhUVFBfREVCVUdfTU9ERSkgcHJpdmF0ZSBIVFRQX0RFQlVHX01PREU6IGJvb2xlYW4sXHJcbiAgICBwcml2YXRlIGJjOiBCYXNlTG9jYWxpemF0aW9uLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2U6IENhY2hlU2VydmljZSxcclxuICAgIHByaXZhdGUgdXRpc0V4dHM6IFV0aWxpdHlTZXJ2aWNlXHJcbiAgKSB7XHJcblxyXG4gICAgdGhpcy5FeHRlbnNpb25zSW1wbCA9IHRoaXMuRVhURU5TSU9OX0NMQVNTIHx8IG5ldyBIdHRwU2VydmljZUV4dGVuc2lvbnMoKTtcclxuICAgIHRoaXMubWUgPSB0aGlzLkV4dGVuc2lvbnNJbXBsLnJldHJpZXZlSWRlbnRpdHkoKTtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5ID0gKHRoaXMuQVBQX05BTUUpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cENhY2hlXCI7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5ID0gKHRoaXMuQVBQX05BTUUpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cFRpbWVkQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgKyBcIl9FeHBpcmVcIjtcclxuXHJcbiAgICB0aGlzLmFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy51bnRpbWVkQ2FjaGVFeHBpcmVkKCkpXHJcbiAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgdmVkbyBjaGUgY2kgc29ubyBlbGVtZW50aSBzYWx2YXRpIG5lbCBsb2NhbFN0b3JhZ2UgcHJvdm8gYSB0b2dsaWVybGkgZSBhIHJpc2FsdmFybGkgdmlhIHByZWZlcmVuY2UuXHJcbiAgICogTmVsIGNhc28gbWlnbGlvcmUgbGkgc3Bvc3RvIGRhbCBsb2NhbFN0b3JhZ2UgYWwgREIgZGkgcHJlZmVyZW5jZSwgbmVsIGNhc28gcGVnZ2lvcmUgbGkgdG9sZ28gZSBsaSByaXNhbHZvIG5lbCBsb2NhbFN0b3JhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKSB7XHJcbiAgICB2YXIgbHNUaW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkpO1xyXG4gICAgdmFyIGxzVW50aW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGlmICghbHNUaW1lZCAmJiAhbHNVbnRpbWVkKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsc1RpbWVkID0gbHNUaW1lZCA/IEpTT04ucGFyc2UobHNUaW1lZCkgOiB7fTtcclxuICAgIGxzVW50aW1lZCA9IGxzVW50aW1lZCA/IEpTT04ucGFyc2UobHNVbnRpbWVkKSA6IHt9O1xyXG5cclxuICAgIGF3YWl0IGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5LCBsc1RpbWVkKSxcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgbHNVbnRpbWVkKVxyXG4gICAgXSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJDb252ZXJ0ZWQgb2xkIHN0b3JhZ2Ugc3lzdGVtIHRvIG5ldyBvbmVcIikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgICBsZXQgY2FjaGVkSW5mb3MgPSB0aGlzLnRyeUdldENhY2hlSW5mb3JtYXRpb25zKHVybCwgcGFyYW1zKTtcclxuICAgICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSAmJiBjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwgKyBcIiBcIiArIHRoaXMubG9jKFwicmV0cmlldmVkIGZyb20gY2FjaGVcIikpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2Y8VD4oY2FjaGVkSW5mb3MuY2FjaGVJdGVtKS5waXBlKGRlbGF5KDApLCBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0PFQ+KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXQubG9jYWxlLCB0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKHJlczogVCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCByZXNwb25zZUl0ZW0gPSA8VD5yZXM7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVJlc3BvbnNlKHRoaXMudXRpc0V4dHMuZGVlcENsb25lKHJlc3BvbnNlSXRlbSksIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVkIHJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VJdGVtO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgcmV0Lm15R3VpZCk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCwgY2FjaGVkSW5mb3MpOyB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQ2FzbyBzcGVjaWZpY28gZGkgY2hpYW1hdGEgY2hlIGRldmUgcmVzdGl0dWlyZSB1biBCbG9iIG8gdW4gQXJyYXlCdWZmZXIgbmF0aXZvIGRhIGVsYWJvcmFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtcImFycmF5YnVmZmVyXCJ8IFwiYmxvYlwifSB0eXBlIFRpcG8gZGkgcml0b3JubyByaWNoaWVzdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEJsb2IgfCBBcnJheUJ1ZmZlcj59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRSYXcodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHR5cGU6IFwiYXJyYXlidWZmZXJcIiB8IFwiYmxvYlwiID0gXCJhcnJheWJ1ZmZlclwiLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2sgPSBudWxsKTogT2JzZXJ2YWJsZTxCbG9iIHwgQXJyYXlCdWZmZXI+IHtcclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAge1xyXG4gICAgICAgIG15R3VpZDogZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKSxcclxuICAgICAgICBsb2NhbGU6IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSlcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBjb25jYXRNYXAoKHJldDogeyBteUd1aWQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgfSkgPT4ge1xyXG4gICAgICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSAmJiBjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pIHtcclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgICAgIHJldHVybiBvZjxhbnk+KGNhY2hlZEluZm9zLmNhY2hlSXRlbSkucGlwZShkZWxheSgwKSwgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQpOyB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogPGFueT50eXBlLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IgfCBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZVJlc3BvbnNlKGJsb2IsIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlZCByZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYmxvYjtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPEJsb2I+ID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIGVycm9yQ2FsbGJhY2soKTtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCByZXQubXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQsIGNhY2hlZEluZm9zKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgUE9TVCBIVFRQXHJcbiAgKiBcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgcG9zdDxUPih1cmw6IHN0cmluZywgYm9keURhdGE6IGFueSwgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLnBvc3Q8VD4odXJsLCBib2R5RGF0YSwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgREVMRVRFIEhUVFBcclxuICAqXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAge1xyXG4gICAgICAgIG15R3VpZDogZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKSxcclxuICAgICAgICBsb2NhbGU6IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSlcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBjb25jYXRNYXAoKHJldDogeyBteUd1aWQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgfSkgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZGVsZXRlPFQ+KHVybCwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQVVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5wdXQ8VD4odXJsLCBib2R5RGF0YSwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIGJpc29nbmEgYW5jaGUgaW52aWFyZSBkZWkgRmlsZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0ZpbGVbXSB8IEZpbGV9IGZpbGVBcnJheU9yRmlsZSBTaW5nb2xvIGZpbGUgbyBsaXN0YSBkaSBmaWxlIGRhIGludmlhcmUuIElsIHRpcG8gKipGaWxlKiogw6ggcXVlbGxvIG5hdGl2byBkZWwgSmF2YXNjcmlwdFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgcG9zdHdpdGhGaWxlczxUPih1cmw6IHN0cmluZywgYm9keURhdGE6IGFueSwgZmlsZUFycmF5T3JGaWxlOiBGaWxlW10gfCBGaWxlLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGZvcm1EYXRhID0gdGhpcy5nZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZSk7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiYm9keVwiLCBKU09OLnN0cmluZ2lmeShib2R5RGF0YSkpO1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGZvcm1EYXRhLCB7IHBhcmFtczogcGFyYW1zLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgbnVsbCwgdHJ1ZSwgbnVsbCwgbnVsbCkgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpOyB9KSxcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtLfSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcG9zdEdldEZpbGU8Sz4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBLLCBmaWxlbmFtZTogc3RyaW5nLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55LCBhZnRlckdldEZpbGU6ICgpID0+IGFueSA9IG51bGwsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSwgcGFycz86IEh0dHBQYXJhbXMpIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuICAgIGxldCBsb2NhbGUgPSBhd2FpdCB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYm9keURhdGEsIHsgcGFyYW1zOiBwYXJzLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMobG9jYWxlKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcmVzcG9uc2VUeXBlOiBcImJsb2JcIiB9KS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XHJcbiAgICAgICAgaWYgKGFmdGVyR2V0RmlsZSAmJiAhaGFuZGxlRXJyb3IpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQsIGhhbmRsZUVycm9yKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8QmxvYj4pID0+IHtcclxuICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICBsZXQgZm4gPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpPy5zcGxpdCgnOycpWzFdPy5zcGxpdCgnZmlsZW5hbWUnKVsxXT8uc3BsaXQoJz0nKVsxXT8udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpO1xyXG5cclxuICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgZmlsZW5hbWUgfHwgZm4pO1xyXG4gICAgICBpZiAoYWZ0ZXJHZXRGaWxlKSBhZnRlckdldEZpbGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIHZpZW5lIHJlc3RpdHVpdG8gdW4gZmlsZSBnZXN0aXRvIGNvbWUgT2JqZWN0VVJMIGlsIGN1aSBVUkwgc2kgcHXDsiBnZXN0aXJlIGRhbCBwYXJhbWV0cm8gZGkgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKi4gXHJcbiAgICogTGEgY2hpYW1hdGEgbm9uIGhhIHVuIHRpcG8gcmVzdGl0dWl0byBpbiBxdWFudG8gaWwgcmlzdWx0YXRvIGRldidlc3NlcmUgZ2VzdGl0byBhdHRyYXZlcnNvIGxhIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBOb21lIGRlbCBmaWxlIGNoZSBzaSBzdGEgcmljaGllZGVuZG8sIHJpbWFuZSBsYXRvIEZyb250ZW5kIGUgc2VydmUgcGVyIGFzc2VnbmFyZSBhcmJpdHJhcmlhbWVudGUgdW4gbm9tZSBhbCBmaWxlIHJlc3RpdHVpdG8sIHNlIHZ1b3RvIHZpZW5lIHV0aWxpenphdGEgbGEgQ29udGVudC1EaXNwb3NpdGlvbiBkZWxsYSByaXNwb3N0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlckdldEZpbGUgQ2FsbGJhY2sgZGEgY2hpYW1hcmUgZG9wbyBhdmVyIGdlc3RpdG8gbGEgcmlzcG9zdGEgZGVsICoqZ2V0RmlsZUNhbGxiYWNrKiosIGluIGNhc28gKipoYW5kbGVFcnJvcioqIGZvc3NlICoqZmFsc2UqKiB2ZXJyw6AgcmljaGlhbWF0byBhbmNoZSBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGRpIGRlZmF1bHQgZ2xpIGVycm9yaSBkZXZvbm8gZXNzZXJlIGdlc3RpdGkgZGFsbGEgbGlicmVyaWEgbyBzZSBkZXZvbm8gZXNzZXJlIGlnbm9yYXRpXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldEZpbGUodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIGZpbGVuYW1lOiBzdHJpbmcsIGdldEZpbGVDYWxsYmFjazogKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBhbnksIGFmdGVyR2V0RmlsZTogKCkgPT4gYW55ID0gbnVsbCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcbiAgICBsZXQgbG9jYWxlID0gYXdhaXQgdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyBwYXJhbXM6IHBhcmFtcywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKGxvY2FsZSksIG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgICAgIGlmIChhZnRlckdldEZpbGUgJiYgIWhhbmRsZUVycm9yKSBhZnRlckdldEZpbGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkLCBoYW5kbGVFcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPEJsb2I+KSA9PiB7XHJcbiAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgbGV0IGZuID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKT8uc3BsaXQoJzsnKVsxXT8uc3BsaXQoJ2ZpbGVuYW1lJylbMV0/LnNwbGl0KCc9JylbMV0/LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuXHJcbiAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGZpbGVuYW1lIHx8IGZuKTtcclxuICAgICAgaWYgKGFmdGVyR2V0RmlsZSkgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIG5hdGl2byBkaSB1biBmaWxlLiBJbnRlcm5hbWVudGUgdXRpbGl6emEgaWwgcGF0dGVybiAqKndpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi5cIioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZU5hdGl2ZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCk6IHZvaWQge1xyXG5cclxuICAgIC8vIEVuY29kbyB0dXR0aSBpIHBhcmFtZXRyaSBwZXIgZXZpdGFyZSBjYXNpIHBhcnRpY29sYXJpXHJcbiAgICAvLyB2YXIgZW5jb2RlZFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAvLyBsZXQgcGFyS2V5cyA9IHBhcmFtcy5rZXlzKCk7XHJcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBhcktleXMubGVuZ3RoOyBpKyspXHJcbiAgICAvLyAgIGVuY29kZWRQYXJhbXMgPSBlbmNvZGVkUGFyYW1zLnNldChwYXJLZXlzW2ldLCBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmdldChwYXJLZXlzW2ldKSkpO1xyXG5cclxuICAgIGxldCBmaW5hbFVybCA9IHVybCArIChwYXJhbXMgPyBcIj9cIiArIHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoL1xcKy9nLCAnJTJiJykgOiBcIlwiKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZmluYWxVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgZGkgdW4gZmlsZSBjaGUgZW1ldHRlIGkgdmFyaSBldmVudGkgZGkgcHJvZ3Jlc3NvIGRpIGRvd25sb2FkLlxyXG4gICAqIFV0aWxpenphcmxhIHBlciBvdmVycmlkYXJlIGxhIGRpYWxvZyBuYXRpdmEgZGkgcHJvZ3Jlc3MgZGVsIGJyb3dzZXIgZSBzb3N0aXR1aXJsYSBjb24gcXVhbGNvc2EgdGlwbyBxdWVsbG8gY2hlIGZhIE1FR0EuXHJcbiAgICogXHJcbiAgICogSW4gY2FzbyBzaSB2b2dsaWEgb3R0ZW5lcmUgaWwgcmlzdWx0YXRvIG5hdGl2byBkZWwgYnJvd3NlciBkZWwgZG93bmxvYWQgdXRpbGl6emFyZSAqKmdldEZpbGVOYXRpdmUodXJsLCBwYXJzKSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8RG93bmxvYWQ+fSBPYnNlcnZhYmxlIGRlaSB2YXJpIHN0ZXAgZGkgcHJvZ3Jlc3NvIGRlbCBkb3dubG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55KTogT2JzZXJ2YWJsZTxEb3dubG9hZD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcclxuICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICBzY2FuKChwcmV2aW91czogRG93bmxvYWQsIGV2ZW50OiBIdHRwRXZlbnQ8QmxvYj4pOiBEb3dubG9hZCA9PiB7XHJcbiAgICBcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0h0dHBQcm9ncmVzc0V2ZW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gZXZlbnQudG90YWwgPyAoZXZlbnQubG9hZGVkID4gZXZlbnQudG90YWwgPyAxMDAgOiBNYXRoLnJvdW5kKCgxMDAgKiBldmVudC5sb2FkZWQpIC8gZXZlbnQudG90YWwpKSA6IHByZXZpb3VzLnByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvZ3Jlc3M6IHByb2dyZXNzLCBzdGF0ZTogJ0lOX1BST0dSRVNTJywgY29udGVudDogbnVsbCB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNIdHRwUmVzcG9uc2UoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2Rpc3AgPSBldmVudC5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2Rpc3BGaWxlbmFtZSA9IGNkaXNwLnNwbGl0KCc7JylbMV0uc3BsaXQoJ2ZpbGVuYW1lJylbMV0uc3BsaXQoJz0nKVsxXS50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChldmVudC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgY2Rpc3BGaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9ncmVzczogMTAwLCBzdGF0ZTogJ0RPTkUnLCBjb250ZW50OiBldmVudC5ib2R5IH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICAgICAgICAgIH0sIHsgc3RhdGU6ICdQRU5ESU5HJywgcHJvZ3Jlc3M6IDAsIGNvbnRlbnQ6IG51bGwgfSksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgXyk6IE9ic2VydmFibGU8RG93bmxvYWQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpIH0pLFxyXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2V2ZW50byBIVFRQIMOoIGRpIHRpcG8gKipIdHRwUmVzcG9uc2UqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqL1xyXG4gICBwcml2YXRlIGlzSHR0cFJlc3BvbnNlPFQ+KGV2ZW50OiBIdHRwRXZlbnQ8VD4pOiBldmVudCBpcyBIdHRwUmVzcG9uc2U8VD4ge1xyXG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2VcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXZlbnRvIEhUVFAgw6ggZGkgdGlwbyAqKkh0dHBQcm9ncmVzc0V2ZW50KiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKi9cclxuICBwcml2YXRlIGlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQ6IEh0dHBFdmVudDx1bmtub3duPik6IGV2ZW50IGlzIEh0dHBQcm9ncmVzc0V2ZW50IHtcclxuICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3MgfHwgZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGVsbCdpbml6aW8gZGkgdW5hIGNoaWFtYXRhIGFkIHVuIGNlcnRvIFVSTCwgdmllbmUgZ2VuZXJhdG8gdW4gR1VJRCBkYSBhc3NlZ25hcmNpLCBjb250cm9sbGF0YSBsYSBzY2FkZW56YSBkZWxsYSBjYWNoZSwgXHJcbiAgICogZSBldmVudHVhbG1lbnRlIGxvZ2dhdG8gaWwgZmF0dG8gY2hlIHN0YSBwZXIgZXNzZXJlIGVmZmV0dHVhdGEgdW5hIGNoaWFtYXRhIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVybCBhIGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gR1VJRCBhc3NlZ25hdG8gYWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGVmYXVsdFN0YXJ0Q2FsbCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5nZXRHVUlEKCk7XHJcbiAgICB0aGlzLmNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsKTtcclxuICAgIHRoaXMuY2FsbFN0YXR1c1tteUd1aWRdID0geyB1cmw6IHVybCwgc3VjY2VzczogdHJ1ZSB9O1xyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJTdGFydGluZyBjYWxsXCIpICsgXCIgXCIgKyBteUd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwiYXQgVVJMXCIpICsgXCI6IFwiICsgdXJsKTtcclxuICAgIHJldHVybiBteUd1aWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIHVybCB2ZW5nb25vIGNvbnRyb2xsYXRlIGxlIGluZm9ybWF6aW9uaSBzdSB0dXR0aSBnbGkgdXJsIGRhIGludmFsaWRhcmUgY29sbGVnYXRpIGFsbCd1cmwgY2hpYW1hdG8gZSwgc2UgcHJlc2VudGkgaW4gY2FjaGUsIGludmFsaWRhdGlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBwZXIgY3VpIGNvbnRyb2xsYXJlIHNlIGNpIHNvbm8gY2hpYW1hdGUgaW4gY2FjaGUgZGEgaW52YWxpZGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tDYWNoZUludmFsaWRhdGlvbih1cmw6IHN0cmluZykge1xyXG4gICAgbGV0IGNhY2hlID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtPGFueT4odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkpO1xyXG4gICAgbGV0IHRtcCA9IC8jY2FjaGUoOj8tKFxcZCspKS9naS5leGVjKHVybCk7XHJcbiAgICBsZXQgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuICAgIGxldCBub3JtYWxpemVkVXJsX3RtcCA9ICB1cmwucmVwbGFjZShcIiNjYWNoZVwiICsgKGNhY2hlVGltZSA/IFwiLVwiICsgY2FjaGVUaW1lIDogXCJcIiksIFwiXCIpO1xyXG4gICAgbGV0IG5vcm1hbGl6ZWRVcmwgPSBub3JtYWxpemVkVXJsX3RtcC5zdWJzdHJpbmcobm9ybWFsaXplZFVybF90bXAuaW5kZXhPZignL2FwaScpKVxyXG5cclxuICAgIGlmICghY2FjaGUgfHwgIXRoaXMuSFRUUF9JTlZBTElEQVRJT04gfHwgIXRoaXMuSFRUUF9JTlZBTElEQVRJT05bbm9ybWFsaXplZFVybF0pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgYXBpc1RvSW52YWxpZGF0ZTogc3RyaW5nW10gPSB0aGlzLkhUVFBfSU5WQUxJREFUSU9OW25vcm1hbGl6ZWRVcmxdO1xyXG4gICAgaWYgKCFhcGlzVG9JbnZhbGlkYXRlIHx8IGFwaXNUb0ludmFsaWRhdGUubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQga2V5c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgYXBpc1RvSW52YWxpZGF0ZS5mb3JFYWNoKGFwaSA9PiB7XHJcbiAgICAgIGxldCBjYWNoZUtleSA9IHRoaXMubWFrZUNhY2hlS2V5KGFwaSwgbnVsbCk7XHJcbiAgICAgIGZvciAobGV0IGl0ZW0gaW4gY2FjaGUpXHJcbiAgICAgICAgaWYgKGl0ZW0uaW5kZXhPZihjYWNoZUtleSkgIT0gLTEpXHJcbiAgICAgICAgICBrZXlzVG9SZW1vdmUucHVzaChpdGVtKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBrID0ga2V5c1RvUmVtb3ZlW2ldO1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkludmxhbGlkYXRpbmcgY2FjaGUgZWxlbWVudFwiKSArIFwiIFwiICsgayk7XHJcbiAgICAgIGRlbGV0ZSBjYWNoZVtrXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCBjYWNoZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5hbGl6emF6aW9uZSBkaSB1bmEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBHVUlEIGNvbGxlZ2F0byBhbGxhIGNoaWFtYXRhIGFwcGVuYSB0ZXJtaW5hdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RDYWNoZUlmSWRsZSBFZmZldHR1YSBpbCBwZXJzaXN0IGRlbGxhIGNhY2hlIEhUVFAgc29sbyBzZSBub24gY2kgc29ubyBhbHRyZSBjaGlhbWF0ZSBpbiBjb3JzbywgcGVyIGV2aXRhcmVcclxuICAgKiBjaGUgbWkgY2FtYmkgc290dG8gbCdvZ2dldHRvIGRpIGNhY2hlIG1lbnRyZSBzdG8gc2FsdmFuZG8gbGUgaW5mb3JtYXppb25pXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyB0cnlGaW5hbGl6ZUJ5R3VpZChndWlkOiBzdHJpbmcsIGNhY2hlSW5mb3M/OiBDYWNoZUluZm9zKSB7XHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkZpbmFsaXppbmcgY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHN0YXR1c1wiKSArIFwiOiBcIiArICghdGhpcy5jYWxsU3RhdHVzW2d1aWRdID8gJ1Vua25vd24nIDogdGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgPyB0aGlzLmxvYygnU3VjY2VzcycpIDogdGhpcy5sb2MoJ0ZhaWx1cmUnKSkpO1xyXG5cclxuICAgIC8vIFRPRE86IFBlcmRlcmUgMy00IG9yZSBwZXIgY2FwaXJlIHBlcmNow6kgb2duaSB0YW50byBhcnJpdmEgbnVsbCBpbiBjYXNpIHBlc2FudGkgZGkgT2JzZXJ2YWJsZSBzcGFtbWF0aSBhIHJhbmRvbVxyXG4gICAgaWYgKHRoaXMuY2FsbFN0YXR1c1tndWlkXSkge1xyXG4gICAgICAvLyBBbGxhIHByaW1hIGNoaWFtYXRhIGJ1b25hLCBzaWduaWZpY2EgY2hlIGFsbWVubyBpbCBsb2dpbiBjZSBsJ2hvLiBQb3NzbyBtZXR0ZXJtaSBpbiBtb2RhbGl0w6AgcmVkaXJlY3RJblByb2dyZXNzIGZhbHNlXHJcbiAgICAgIC8vIGUgcmlpbml6aWFyZSBhIHZhbHV0YXJlIGVycm9yaSBkaSBqYXZhc2hpdFxyXG4gICAgICBpZiAodGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgJiYgdGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlUmVkaXJlY3Rpb25TdGF0dXMoZmFsc2UpO1xyXG5cclxuICAgICAgLy8gQWdnaXVuZ28gbGEgY2hpYW1hdGEgYWxsYSBsaXN0YSBkZWxsZSB1bHRpbWUgMyBjb21wbGV0YXRlXHJcbiAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMudW5zaGlmdCh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0udXJsKVxyXG4gICAgICBpZiAodGhpcy5MYXN0VGhyZWVDb21wbGV0ZWRDYWxscy5sZW5ndGggPiAzKVxyXG4gICAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMucG9wKCk7XHJcblxyXG4gICAgICAvLyBJbiBvZ25pIGNhc28gcXVlc3RhIHBvc3NvIHJpbXVvdmVybGFcclxuICAgICAgZGVsZXRlIHRoaXMuY2FsbFN0YXR1c1tndWlkXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZSB2ZW5nbyBkYSB1bmEgY2hpYW1hdGEgY2hlIGhhIGFnZ2lvcm5hdG8gbGEgY2FjaGUgYSB0aW1lciBvIGdsb2JhbGUgbWFyY28gaWwgZmF0dG8gY2hlIHF1ZWxsYSBjYWNoZSBkZXYnZXNzZXJlIGFnZ2lvcm5hdGFcclxuICAgIGlmIChjYWNoZUluZm9zICYmIGNhY2hlSW5mb3MuY2FjaGUpIHtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCAhIWNhY2hlSW5mb3MuY2FjaGVUaW1lO1xyXG4gICAgICB0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQID0gdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgIWNhY2hlSW5mb3MuY2FjaGVUaW1lO1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIk1hcmtpbmcgY2FjaGUgdG8gYmUgcGVyc2lzdGVkIGFzIHNvb24gYXMgcG9zc2libGVcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlIHVuYSBkZWxsZSBkdWUgY2FjaGUgZGV2b25vIGVzc2VyZSBhZ2dpb3JuYXRlIGUgbm9uIGhvIG5lc3N1bmEgY2hpYW1hdGEgaW4gY29yc28gZWZmZXR0dW8gbCdhZ2dpb3JuYW1lbnRvIGluIGJhc2UgYSBxdWFsZSBkZWxsZSBkdWUgdmEgYWdnaW9ybmF0YVxyXG4gICAgLy8gQWxsYSBmaW5lIGRpIHR1dHRvIG1hcmNvIGNvbWUgZmF0dG9cclxuICAgIGlmICgodGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCkgJiYgT2JqZWN0LmtleXModGhpcy5jYWxsU3RhdHVzKS5sZW5ndGggPT0gMCkge1xyXG5cclxuICAgICAgdmFyIHRvQ2FsbCA9IFtdO1xyXG4gICAgICBsZXQgdG1wS2V5ID0gXCJcIjtcclxuICAgICAgaWYgKHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQKSB7XHJcbiAgICAgICAgdG1wS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleTtcclxuICAgICAgICB0b0NhbGwucHVzaCh0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVApIHtcclxuICAgICAgICB0bXBLZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleTtcclxuICAgICAgICB0b0NhbGwucHVzaCh0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJObyBtb3JlIEhUVFAgY2FsbHMgdG8gYmUgZXhlY3V0ZWQsIGVudGVyaW5nIGlkbGUgc3RhdGUgYW5kIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpICsgXCIuLi5cIik7XHJcbiAgICAgIHZhciByZXQgPSBhd2FpdCBmb3JrSm9pbih0b0NhbGwpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmV0KVxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVzIHN1Y2Nlc2Z1bGx5IHBlcnNpc3RlZFwiKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9ycyBwZXJzaXN0aW5nIG1vZGlmaWVkIGNhY2hlc1wiKSk7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVAgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBjaGUgZGF0byB1biB1bmljbyBGaWxlIG8gdW5hIGxpc3RhIGRpIEZpbGUgY3JlYSB1biBvZ2dldHRvIEZvcm1EYXRhIGNoZSBwdcOyIGVzc2VyZSBpbnZpYXRvIGNvbW9kYW1lbnRlIFxyXG4gICAqIGFkIHVuIGJhY2tlbmQgQVNQLk5FVCBkYSBjdWkgc2kgcG90csOgIGFjY2VkZXJlIGEgUmVxdWVzdC5Gb3JtLkZpbGVzXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtGaWxlIHwgRmlsZVtdfSBmaWxlQXJyYXlPckZpbGUgU2luZ29sbyBGaWxlIG8gbGlzdGEgZGkgRmlsZS4gTi5COiBuZWxsYSBmaXJtYSBkZWxsYSBmdW56aW9uZSB2aWVuZSBjb25zaWRlcmF0byAqKmFueSoqIHBlciBmYXJlIHRlc3Qgc3VsbGUgcHJvcHJpZXTDoCBcclxuICAgKiBpbnZlY2UgY2hlIGZhcmUgdGVzdCBjb24gbCcqKmlzdGFuY2VvZioqXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSBGb3JtRGF0YSBjb250ZW5lbnRlIHR1dHRpIGkgZmlsZSBwYXNzYXRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZTogYW55KTogRm9ybURhdGEge1xyXG4gICAgdmFyIGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG5cclxuICAgIGlmIChmaWxlQXJyYXlPckZpbGUpIHtcclxuICAgICAgaWYgKGZpbGVBcnJheU9yRmlsZS5sZW5ndGgpXHJcbiAgICAgICAgZmlsZUFycmF5T3JGaWxlLmZvckVhY2godCA9PiB7IGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgdCwgdC5uYW1lKTsgfSk7XHJcbiAgICAgIGVsc2UgaWYgKGZpbGVBcnJheU9yRmlsZS5uYW1lKVxyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVzXCIsIGZpbGVBcnJheU9yRmlsZSwgZmlsZUFycmF5T3JGaWxlLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JtRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBjaGUgaW4gYmFzZSBhaSBwYXJhbWV0cmkgZGlzcG9uaWJpbGkgZ2VuZXJhIGdsaSBIZWFkZXIgSFRUUCBwZXIgbGEgY2hpYW1hdGEgZGEgZWZmZXR0dWFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZSBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkNvbnRlbnQtVHlwZVwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NlcHQgSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBY2NlcHRcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBdXRoIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQXV0aG9yaXphdGlvblwiLCB2YWxvcml6emF0byBjb2wgdG9rZW4gcmVjdXBlcmF0byBkYWxsJ2hvb2sgKipyZXRyaWV2ZUFjY2Vzc1Rva2VuKiogZGVsbGEgY2xhc3NlIGRpIGVzdGVuc2lvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb25JZCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIlgtVFgtSURcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7SHR0cEhlYWRlcnN9IEhlYWRlciBnZW5lcmF0aSBpbiBiYXNlIGFpIHBhcmFtZXRyaVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SGVhZGVycyhsb2NhbGUgPSAnaXQtSVQnLCB0cmFuc2FjdGlvbklkID0gXCJcIiwgaW5jbHVkZUF1dGg6IGJvb2xlYW4gPSB0cnVlLCBjb250ZW50VHlwZTogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIsIGFjY2VwdDogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpOiBIdHRwSGVhZGVycyB7XHJcbiAgICB2YXIgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgdmFyIGF1dGh0b2tlbiA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVBY2Nlc3NUb2tlbigpO1xyXG5cclxuICAgIGlmIChjb250ZW50VHlwZSlcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQ29udGVudC1UeXBlXCIsIGNvbnRlbnRUeXBlKTtcclxuXHJcbiAgICBpZiAodHJhbnNhY3Rpb25JZClcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiWC1UWC1JRFwiLCB0cmFuc2FjdGlvbklkKTtcclxuXHJcbiAgICBpZiAoYXV0aHRva2VuICYmIGluY2x1ZGVBdXRoKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgYXV0aHRva2VuKTtcclxuXHJcbiAgICBpZiAoYWNjZXB0KVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBY2NlcHRcIiwgYWNjZXB0KTtcclxuXHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBY2NlcHQtTGFuZ3VhZ2VcIiwgbG9jYWxlKTtcclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGkgZGVmYXVsdCBkZWdsaSBlcnJvcmlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gcmVzIFJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgSWRlbnRpZmljYXRpdm8gR1VJRCBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkVycm9yKHJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBUeXBlRXJyb3IsIGd1aWQ6IHN0cmluZykge1xyXG4gICAgaWYodGhpcy5jYWxsU3RhdHVzW2d1aWRdKVxyXG4gICAgICB0aGlzLmNhbGxTdGF0dXNbZ3VpZF0uc3VjY2VzcyA9IGZhbHNlO1xyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHR1dHRpIGdsaSBlcnJvcmkgZHVyYW50ZSBpbCByZWRpcmVjdCBhbCBsb2dpbiB2ZW5nYW5vIGlnbm9yYXRpXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3RpbmdUb0xvZ2luKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZWRpcmVjdGluZyB0byBMb2dpbiwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHZlbmdhIGdlc3RpdG8gdW4gc29sbyBlcnJvcmUgcGVyIHZvbHRhXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkSGFuZGxpbmdFcnJvclN0YXR1cygpKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQWxyZWFkeSBIYW5kbGluZyBhbiBlcnJvciwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlSGFuZGxpbmdFcnJvclN0YXR1cyh0cnVlKTtcclxuXHJcbiAgICBsZXQgZmluYWxFcnJvciA9IFwiXCI7XHJcbiAgICBsZXQgZmluYWxTdGF0dXMgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuaXNUeXBlRXJyb3IocmVzKSkge1xyXG4gICAgICBmaW5hbEVycm9yID0gcmVzLm1lc3NhZ2U7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gXCJIVFRQIFNlcnZpY2UgSW50ZXJuYWwgRXJyb3JcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNIdHRwRXJyb3JSZXNwb25zZShyZXMpKSB7XHJcblxyXG4gICAgICBmaW5hbEVycm9yID0gYXdhaXQgdGhpcy5nZXRIdHRwRXJyb3JUZXh0KHJlcy5lcnJvcik7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gcmVzLnN0YXR1cy50b1N0cmluZygpO1xyXG5cclxuICAgICAgc3dpdGNoIChyZXMuc3RhdHVzKSB7XHJcbiAgICAgICAgLy8gVW5hdXRob3JpemVkXHJcbiAgICAgICAgY2FzZSA0MDE6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQwMSBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwicmVkaXJlY3RpbmcgdG8gbG9naW4uXCIpKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGlvblN0YXR1cyh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGluZ1RvTG9naW4odHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLnJlZGlyZWN0VG9Mb2dpbigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIEhhbmRsZWQgZXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0MDA6XHJcbiAgICAgICAgLy8gTm8gUGVybWlzc2lvbnNcclxuICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gTm90IGZvdW5kXHJcbiAgICAgICAgY2FzZSA0MDQ6XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIHRoaXMubG9jKFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3RDb25maWd1cmVkRXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0NDQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0NDQgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHJlZGlyZWN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIElnbm9yaW5nIHRoaXMgZXZlbnRcIikpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoIXRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlTm90Q29uZmlndXJlZEV4Y2VwdGlvbigpKVxyXG4gICAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZpbmFsRXJyb3IgPSBcIlNlcnZlciBtaWdodCBiZSBvZmZsaW5lXCIgKyAocmVzLnN0YXR1c1RleHQgPyBcIiAoXCIgKyByZXMuc3RhdHVzVGV4dCArIFwiKSBcIiA6IFwiXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVFeGNlcHRpb24oZmluYWxTdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBlcnJvcmUgcmVzdGl0dWlzY2UgdW5hIHByb21pc2UgY29uIGxhIHN0cmluZ2EgZmluYWxlIGRlbGwnZXJyb3JlIGluIG1vZG8gZGEgcG90ZXIgZmFyZSB1biBhd2FpdFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSBjaGUgcmlzb2x2ZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEh0dHBFcnJvclRleHQoZXJyOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgLy8gU2UgaG8gdW4gQmxvYiBwdcOyIGVzc2VyZSBvIHVuIENhbGxSZXN1bHQgbyBzdXBwb25nbyB1bmEgc2VtcGxpY2Ugc3RyaW5nYSxcclxuICAgIC8vIGFsdHJpbWVudGkgcG90cmViYmUgZXNzZXJlIGRpcmV0dGFtZW50ZSB1biBDYWxsUmVzdWx0LCBvcHB1cmUgdW5hIHNlbXBsaWNlIHN0cmluZ2FcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVyck1zZyA9ICg8YW55PmUudGFyZ2V0KS5yZXN1bHQ7XHJcbiAgICAgICAgICBsZXQganNvbmVyck1zZzogYW55O1xyXG4gICAgICAgICAgdHJ5IHsganNvbmVyck1zZyA9IEpTT04ucGFyc2UoZXJyTXNnKTsgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShqc29uZXJyTXNnICYmIHRoaXMuaXNDYWxsUmVzdWx0KGpzb25lcnJNc2cpID8ganNvbmVyck1zZy5lcnJvci5tZXNzYWdlIDogZXJyTXNnKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGVycilcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmlzQ2FsbFJlc3VsdChlcnIpKVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVyci5lcnJvci5tZXNzYWdlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVycj8udG9TdHJpbmcoKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ29nZ2V0dG8gw6ggZGkgdGlwbyAqKkNhbGxSZXN1bHQqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0NhbGxSZXN1bHQoZXJyOiBhbnkpOiBlcnIgaXMgeyBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSB9IHtcclxuICAgIHJldHVybiAhIWVycj8uZXJyb3I/Lm1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKkh0dHBFcnJvclJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNIdHRwRXJyb3JSZXNwb25zZShlcnI6IGFueSk6IGVyciBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XHJcbiAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXJyb3JlIMOoIGRpIHRpcG8gKipUeXBlRXJyb3IqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1R5cGVFcnJvcihlcnI6IGFueSk6IGVyciBpcyBUeXBlRXJyb3Ige1xyXG4gICAgcmV0dXJuIGVyci5uYW1lID09IFwiVHlwZUVycm9yXCI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21lIGRpY2UgaWwgbm9tZSwgcmVnaXN0cmEgdW4gZXJyb3JlIGUgcmVzdGl0dWlzY2UgdW4gT2JzZXJ2YWJsZSB2dW90byBjb21lIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBnZXN0aXJlIGwnZXJyb3JlIHZpYSBsaWJyZXJpYSBvIHNlIGxpbWl0YXJzaSBhIHJlc3RpdHVpcmUgbCdPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8YW55Pn0gT2JzZXJ2YWJsZSB2dW90b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShyZXM6IGFueSwgZ3VpZDogc3RyaW5nLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKGhhbmRsZUVycm9yKVxyXG4gICAgICB0aGlzLm9uRXJyb3IocmVzLCBndWlkKTtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKSA9PiB7IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBVcmwgZSBkZWkgcGFyYW1ldHJpIGNlcmNhIGRpIHJlY3VwZXJhcmUgbCdldmVudHVhbGUgb2dnZXR0byBnacOgIHNhbHZhdG8gaW4gY2FjaGUgY29uIGxlIGluZm9ybWF6aW9uaSBiYXNlIGRlbGxhIGNhY2hlIHN0ZXNzYVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhIChudWxsaSBpbiBjYXNvIGRpIFBPU1QpXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NhY2hlSW5mb3N9IE9nZ2V0dG8gY29udGVuZW50ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGEgY2FjaGUgcGVyIGwnb2dnZXR0byBzcGVjaWZpY2F0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyk6IENhY2hlSW5mb3Mge1xyXG5cclxuICAgIGxldCBjYWNoaW5nS2V5ID0gbnVsbCwgY2FjaGVUaW1lID0gbnVsbCwgaXRlbSA9IG51bGw7XHJcbiAgICBsZXQgdXNlQ2FjaGluZyA9ICEhKC8jY2FjaGUvZ2kuZXhlYyh1cmwpKTtcclxuXHJcbiAgICBpZiAodXNlQ2FjaGluZykge1xyXG4gICAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgICAgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIik7XHJcbiAgICAgIGlmICh0aGlzLnVudGltZWRDYWNoZUV4cGlyZWQoKSAmJiAhY2FjaGVUaW1lKVxyXG4gICAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG5cclxuICAgICAgY2FjaGluZ0tleSA9IHRoaXMubWFrZUNhY2hlS2V5KHVybCwgcGFyYW1zKTtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICAgIGxldCBjYWNoZUxzID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKGNhY2hlS2V5KTtcclxuICAgICAgbGV0IGNhY2hlID0gY2FjaGVMcyA/IGNhY2hlTHMgOiB7fTtcclxuXHJcbiAgICAgIGlmIChjYWNoZSAmJiBjYWNoZVtjYWNoaW5nS2V5XSAmJiAhdGhpcy50aW1lZENhY2hlSXRlbUV4cGlyZWQoY2FjaGVbY2FjaGluZ0tleV0pKSB7XHJcbiAgICAgICAgLy8gU2UgZ2VzdGlzY28gaWwgdGVtcG8gZXNhdHRvIGRlbGxhIGNhY2hlIHByaW1hIGRpIHJlc3RpdHVpcmUgbCdvZ2dldHRvIGNhY2hhdG8gbG8gcmlwdWxpc2NvIFxyXG4gICAgICAgIC8vIGRhbGxlIHByb3ByaWV0w6AgaW50ZXJuZSBjaGUgZ2xpIGhvIGFnZ2l1bnRvIHBlciBjb250cm9sbGFybmUgbGEgc2NhZGVuemFcclxuICAgICAgICBpZiAoY2FjaGVUaW1lKVxyXG4gICAgICAgICAgZGVsZXRlIGNhY2hlW2NhY2hpbmdLZXldLl9fZXhwaXJlO1xyXG5cclxuICAgICAgICBpdGVtID0gY2FjaGVbY2FjaGluZ0tleV1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlciBhc3NpY3VyYXJtaSBjaGUgaWwgcmlmZWlybWVudG8gZGVnbGkgb2dnZXR0aSBzaWEgZGl2ZXJzbyB1dGlsaXp6byBpbCBkZWVwQ2xvbmVcclxuICAgIHJldHVybiBuZXcgQ2FjaGVJbmZvcyh1cmwsIHVzZUNhY2hpbmcsIGNhY2hpbmdLZXksIGNhY2hlVGltZSwgdGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUoaXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJpc2NlIHVuIG9nZ2V0dG8gbmVsbGEgY2FjaGUgYXBwcm9wcmlhdGEgaW4gYmFzZSBhbGxlIGluZm9ybWF6aW9uaSBjb250ZW51dGUgbmVsIHBhcmFtZXRybyAqKmNhY2hlSW5mb3MqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7VH0gaXRlbSBPZ2dldHRvIGRhIGluc2VyaXJlIG5lbGxhIGNhY2hlXHJcbiAgICogQHBhcmFtIHtDYWNoZUluZm9zfSBjYWNoZUluZm9zIEluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSByZWN1cGVyYXRlIGRhIHVuYSBjaGlhbWF0YSBwcmVjZWRlbnRlIGEgKip0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWNoZVJlc3BvbnNlPFQ+KGl0ZW06IFQsIGNhY2hlSW5mb3M6IENhY2hlSW5mb3MpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZUtleSA9IGNhY2hlSW5mb3MuY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICBsZXQgY2FjaGVMcyA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbShjYWNoZUtleSk7XHJcbiAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gY2FjaGVMcyA6IHt9O1xyXG5cclxuICAgIGNhY2hlW2NhY2hlSW5mb3MuY2FjaGVLZXldID0gaXRlbTtcclxuICAgIGlmIChjYWNoZUluZm9zLmNhY2hlVGltZSlcclxuICAgICAgY2FjaGVbY2FjaGVJbmZvcy5jYWNoZUtleV0uX19leHBpcmUgPSBkYXlqcygpLmFkZChjYWNoZUluZm9zLmNhY2hlVGltZSwgXCJzZWNvbmRzXCIpO1xyXG5cclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldExvY2FsSXRlbShjYWNoZUtleSwgY2FjaGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbGxhIHNlIGxhIGNhY2hlIHBlciBsZSBjaGlhbWF0ZSBzZW56YSBleHBpcmUgdGltZSDDqCBzY2FkdXRhXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGxhIGNhY2hlIMOoIHNjYWR1dGEgZSBkZXYnZXNzZXJlIHJpcHVsaXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdW50aW1lZENhY2hlRXhwaXJlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBleHBpcmUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5KSk7XHJcbiAgICByZXR1cm4gIWV4cGlyZSB8fCBleHBpcmUgJiYgZGF5anMoZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIHVuYSBjaGlhbWF0YSBjaGUgaGEgdW4gdGVtcG8gZGkgdml0YSBiZW4gZGVmaW5pdG8gw6ggc2NhZHV0YSBvIG1lbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHJlY3VwZXJhdG8gZGFsbGEgY2FjaGUgYSBjdWkgaG8gYWdnaXVudG8gbGEgY2hpYXZlIGludGVybmEgX19leHBpcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0aW1lZENhY2hlSXRlbUV4cGlyZWQoaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZGF5anMoaXRlbS5fX2V4cGlyZSkgPCBkYXlqcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGUgaW1wb3N0YSBsYSBwcm9zc2ltYSBzY2FkZW56YSBhZCBhZGVzc28gKyAqKkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TKiogKHRva2VuIHZhbG9yaXp6YXRvIGluIGZhc2UgZGkgY29uZmlndXJhemlvbmUgZGFsbGEgcHJvcHJpZXTDoCAqKmNsaWVudENhY2hlRHVyYXRpb25TKiogZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VNb2R1bGVDb25maWcqKilcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGF3YWl0IHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5LCBKU09OLnN0cmluZ2lmeShkYXlqcygpLmFkZCh0aGlzLkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TLCBcInNlY29uZFwiKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGRlbGxlIGNoaWFtYXRlIGNvbiB1biB0ZW1wbyBkaSBleHBpcmUgZGVmaW5pdG9cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVGltZWRDYWNoZVN0b3JhZ2UoKSB7XHJcbiAgICBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYSB1bmEgY2hpYXZlIHBlciBsYSBjYWNoZSBkZWxsZSBjaGlhbWF0ZSBpbiBiYXNlIGFkIFVSTCBlIFBhcmFtZXRyaSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGlhdmUgY2hlIHJhcHByZXNlbnRhIGluIG1hbmllcmEgdW5pdm9jYSBsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gICBwcml2YXRlIG1ha2VDYWNoZUtleSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zKTogc3RyaW5nIHtcclxuICAgIGxldCBhdXRoS2V5UGFydCA9ICh0aGlzLm1lID8gdGhpcy5tZS5JZHRlbmFudCA6IFwiXCIpICsgKHRoaXMubWUgJiYgdGhpcy5DQUNIRV9CWV9VU0VSID8gdGhpcy5tZS5JZFVzZXIgOiBcIlwiKTtcclxuICAgIGxldCBwYXJhbXNLZXlQYXJ0ID0gcGFyYW1zICYmIHBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMCA/IHBhcmFtcy5rZXlzKCkucmVkdWNlKChwcmV2OiBhbnksIG5leHQ6IGFueSkgPT4gcHJldiArIFwiLFwiICsgbmV4dCArICc9JyArIHBhcmFtcy5nZXQobmV4dCksIFwiXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBhdXRoS2V5UGFydCArIFwiX1wiICsgdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZihcImFwaVwiKSArIDQpICsgXCI/XCIgKyBwYXJhbXNLZXlQYXJ0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhemlvbmUgR1VJRFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE51b3ZvIEdVSUQgZ2VuZXJhdG8gaW4gbWFuaWVyYSBjYXN1YWxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHVUlEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBzY3JpdmVyZSBsb2cgYSBjb25zb2xlIHF1YWxvcmEgKipERUJVR19NT0RFKiogcmlzdWx0YXNzZSAqKnRydWUqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkaSBsb2dcclxuICAgKi9cclxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkhUVFBfREVCVUdfTU9ERSlcclxuICAgICAgY29uc29sZS5sb2coXCJAaHR0cHNlcnZpY2U6IFwiICsgbWVzc2FnZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBwZXIgbGEgbG9jYWxpenphemlvbmUgZGVpIG1lc3NhZ2dpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIGxvY2FsaXp6YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZ2lvIGxvY2FsaXp6YXRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2MobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIC8vIFRvZ2xpYW1vIHZlbG9jZW1lbnRlIHN0ZSBsb2NhbGl6emF6aW9uaSBpbnV0aWxpLi4uLlxyXG4gICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgfVxyXG59Il19
782
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFjLGlCQUFpQixFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQStDLE1BQU0sc0JBQXNCLENBQUM7QUFDekosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTzdELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEUsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVoSCxXQUFXO0FBQ1gsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7O0FBUWpEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBMkJ0Qjs7T0FFRztJQUNILFlBQ1UsZUFBc0MsRUFDQyxpQkFBaUIsRUFDdEMsUUFBUSxFQUNPLHVCQUF1QixFQUNqQyxhQUFzQixFQUNwQixlQUF3QixFQUNqRCxFQUFvQixFQUNwQixJQUFnQixFQUNoQixZQUEwQixFQUMxQixRQUF3QjtRQVR4QixvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFDQyxz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LEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNuRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEdBQUcsQ0FBQyxPQUFlO1FBQ3pCLElBQUksSUFBSSxDQUFDLGVBQWU7WUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssR0FBRyxDQUFDLE9BQWU7UUFDekIsc0RBQXNEO1FBQ3RELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7O3dHQTEzQlUsV0FBVyx1REFnQ0EsaUJBQWlCLDZCQUM3QixRQUFRLGFBQ1IsdUJBQXVCLGFBQ3ZCLGFBQWEsYUFDYixlQUFlOzRHQXBDZCxXQUFXLGNBREMsTUFBTTsyRkFDbEIsV0FBVztrQkFEdkIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OzBCQWlDM0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUNwQyxNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsdUJBQXVCOzswQkFDOUIsTUFBTTsyQkFBQyxhQUFhOzswQkFDcEIsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlLCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFByb2dyZXNzRXZlbnQsIEh0dHBSZXNwb25zZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIEVzIEZhZW56YVxyXG5pbXBvcnQgeyBDYWNoZVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL3ByZWZlcmVuY2VzXCI7XHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcbmltcG9ydCB7IEJhc2VMb2NhbGl6YXRpb24gfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIERpcmV0dGl2ZSwgQ29tcG9uZW50aSwgTGlicmVyaWVcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29uY2F0TWFwLCBkZWxheSwgZmluYWxpemUsIGZpcnN0LCBtYXAsIHNjYW4gfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgZm9ya0pvaW4sIGZyb20sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8vIENoaWFtYXRlIGFpIFJlcG9zaXRvcnkgLyB0b2tlbnNcclxuaW1wb3J0IHsgSFRUUF9JTlZBTElEQVRJT04sIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLCBBUFBfTkFNRSwgQ0FDSEVfQllfVVNFUiwgSFRUUF9ERUJVR19NT0RFIH0gZnJvbSAnLi90b2tlbnMnO1xyXG5cclxuLy8gTW9kZWxsaSBcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2VFeHRlbnNpb25zIH0gZnJvbSAnLi9jb25maWcvSHR0cFNlcnZpY2VFeHRlbnNpb25zJztcclxuaW1wb3J0IHsgRG93bmxvYWQgfSBmcm9tICcuL21vZGVscy9Eb3dubG9hZCc7XHJcbmltcG9ydCB7IENhY2hlSW5mb3MgfSBmcm9tIFwiLi9tb2RlbHMvQ2FjaGVJbmZvc1wiO1xyXG5cclxuLyoqXHJcbiAqIERpY2hpYXJhemlvbmUgZGVsbGEgdmFyaWFiaWxlIGdsb2JhbGUgZGF5anMuIEwnb25lcmUgZGkgXCJjcmVhcmxhXCIgw6ggYWZmaWRhdG8gYWxsJ2FwcGxpY2F6aW9uZSBjaGUgdXRpbGl6emEgcXVlc3RhIGxpYnJlcmlhLCBcclxuICogY2hlIGRvdnLDoCBpbXBvcnRhcmUgbG8gc2NyaXB0IGdsb2JhbGUgZGkgZGF5anMgbmVsbGEgQ0xJXHJcbiAqL1xyXG5kZWNsYXJlIHZhciBkYXlqczogYW55O1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpemlvIHV0aWxpenphdG8gcGVyIGVmZmV0dHVhcmUgcXVhbHNpYXNpIHRpcG8gZGkgY2hpYW1hdGEgSFRUUCBkYWxsJ2FwcGxpY2F6aW9uZSwgZ2VzdGlzY2UgZXJyb3JpIGUgY2FjaGUgZGVsbGUgcmlzcG9zdGUgbmF0aXZhbWVudGUgZSBuZSBwdcOyIGVzc2VyZSBcclxuICogZXN0ZXNvL21vZGlmaWNhdG8gaWwgY29tcG9ydGFtZW50byBpbXBsZW1lbnRhbmRvIGxhIGNsYXNzZSBkaSBcImhvb2tcIiAqKklIdHRwU2VydmljZUV4dGVuc2lvbnMqKiBlIHJlZ2lzdHJhbmRvbGEgbmVsIHByb3ZpZGVyIGRlbGxhIGNsYXNzZSAqKkh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcclxuZXhwb3J0IGNsYXNzIEhUVFBTZXJ2aWNlIHtcclxuXHJcbiAgLyoqIENhY2hlIGRlbGxvIHN0YXRvIGRlbGxlIGNoaWFtYXRlIEhUVFAgYXR0dWFsbWVudGUgZWZmZXR0dWF0ZS4gT2duaSBjaGlhbWF0YSDDqCByYXBwcmVzZW50YXRhIGRhIHVuIEdVSUQgZSBsbyBzdGF0dXMgYXNzdW1lIHZhbG9yZSAqKmZhbHNlKiogc29sbyBzdWdsaSBlcnJvcmkgKi9cclxuICBwcml2YXRlIGNhbGxTdGF0dXM6IHsgW2lkOiBzdHJpbmddOiB7IHVybDogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuIH0gfSA9IHt9O1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGUgcmlzcG9zdGUgZGVsbGUgY2hpYW1hdGUgc290dG8gZm9ybWEgZGkgZGljdGlvbmFyeSAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5ID0gbnVsbDtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIHJpc3Bvc3RlIGRlbGxlIGNoaWFtYXRlIHNvdHRvIGZvcm1hIGRpIGRpY3Rpb25hcnksIHNvbG8gcGVyIGxlIGNoaWFtYXRlIGNvbiB1biB0ZW1wbyBkZWZpbml0byBkaSBjYWNoaW5nICovXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9IG51bGw7XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsbyBzY2FkZXJlIGRlbGxhIGNhY2hlIHN0ZXNzYSAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gbnVsbDtcclxuICAvKiogSWRlbnRpdMOgIGNvbGxlZ2F0YSBhbCB0b2tlbiBkaSBhdXRlbnRpY2F6aW9uZSBkYSB1c2FyZSwgcmljaGllc3RhIGFsIHByb2dyYW1tYSBjaGUgdXRpbGl6emEgbGEgbGlicmVyaWEgYXR0cmF2ZXJzbyBsJ2hvb2sgKipyZXRyaWV2ZUlkZW50aXR5KiogZGVsbGEgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKiAqL1xyXG4gIHByaXZhdGUgbWU6IHsgSWR0ZW5hbnQ6IHN0cmluZywgSWRVc2VyOiBzdHJpbmcgfSA9IG51bGw7XHJcbiAgLyoqIEluZGljYSBjaGUgbGEgY2FjaGUgYSB0ZW1wbyBkZXYnZXNzZXJlIHBlcnNpc3RpdGEgaWwgcHJpbWEgcG9zc2liaWxlICovXHJcbiAgcHJpdmF0ZSBQZXJzaXN0VGltZWRDYWNoZUFTQVA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogSW5kaWNhIGNoZSBsYSBjYWNoZSBzZW56YSBsaW1pdGkgZGkgdGVtcG8gZGV2J2Vzc2VyZSBwZXJzaXN0aXRhIGlsIHByaW1hIHBvc3NpYmlsZSAqL1xyXG4gIHByaXZhdGUgUGVyc2lzdFVudGltZWRDYWNoZUFTQVA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50YXppb25lIGRlbGxhIGNsYXNzZSBkaSBlc3RlbnNpb25lIHBlciBjb2xsZWdhcmUgaSBjb21wb3J0YW1lbnRpIGRlbGxhIGxpYnJlcmlhIGFsbCdhcHBsaWNhemlvbmUgaW4gY3VpIMOoIHVzYXRhLiBcclxuICAgKiBcclxuICAgKiBTZSDDqCBzdGF0byBlZmZldHR1YXRvIGlsIHByb3ZpZGUgZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogdmVycsOgIHVzYXRvIHF1ZWwgcHJvdmlkZXIsIGFsdHJpbWVudGkgdmVycsOgIGNyZWF0YSB1bmEgbnVvdmEgaXN0YW56YSBkaSBkZWZhdWx0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBFeHRlbnNpb25zSW1wbDogSHR0cFNlcnZpY2VFeHRlbnNpb25zO1xyXG5cclxuICAvKiogTGlzdGEgZGVsbGUgdWx0aW1lIDMgY2hpYW1hdGUgY29tcGxldGF0ZSBjb24gc3VjY2Vzc28gaW4gb3JkaW5lIGRpIGNvbXBsZXRhbWVudG8gKGluIHBvc2l6aW9uZSAwIGMnw6ggbCd1bHRpbWEgY29tcGxldGF0YSBlY2NldGVyYS4uLikgKi9cclxuICBwdWJsaWMgTGFzdFRocmVlQ29tcGxldGVkQ2FsbHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgRVhURU5TSU9OX0NMQVNTOiBIdHRwU2VydmljZUV4dGVuc2lvbnMsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhUVFBfSU5WQUxJREFUSU9OKSBwcml2YXRlIEhUVFBfSU5WQUxJREFUSU9OLFxyXG4gICAgQEluamVjdChBUFBfTkFNRSkgcHJpdmF0ZSBBUFBfTkFNRSxcclxuICAgIEBJbmplY3QoQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MpIHByaXZhdGUgQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MsXHJcbiAgICBASW5qZWN0KENBQ0hFX0JZX1VTRVIpIHByaXZhdGUgQ0FDSEVfQllfVVNFUjogYm9vbGVhbixcclxuICAgIEBJbmplY3QoSFRUUF9ERUJVR19NT0RFKSBwcml2YXRlIEhUVFBfREVCVUdfTU9ERTogYm9vbGVhbixcclxuICAgIHByaXZhdGUgYmM6IEJhc2VMb2NhbGl6YXRpb24sXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGxvY2FsU3RvcmFnZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1dGlzRXh0czogVXRpbGl0eVNlcnZpY2VcclxuICApIHtcclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsID0gdGhpcy5FWFRFTlNJT05fQ0xBU1MgfHwgbmV3IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSAodGhpcy5BUFBfTkFNRSkucmVwbGFjZSgvXFxzL2csICdfJykgKyBcIl9IdHRwQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkgPSAodGhpcy5BUFBfTkFNRSkucmVwbGFjZSgvXFxzL2csICdfJykgKyBcIl9IdHRwVGltZWRDYWNoZVwiO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSArIFwiX0V4cGlyZVwiO1xyXG5cclxuICAgIHRoaXMuYWRqdXN0T2xkU3RvcmFnZVN5c3RlbSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgdmVkbyBjaGUgY2kgc29ubyBlbGVtZW50aSBzYWx2YXRpIG5lbCBsb2NhbFN0b3JhZ2UgcHJvdm8gYSB0b2dsaWVybGkgZSBhIHJpc2FsdmFybGkgdmlhIHByZWZlcmVuY2UuXHJcbiAgICogTmVsIGNhc28gbWlnbGlvcmUgbGkgc3Bvc3RvIGRhbCBsb2NhbFN0b3JhZ2UgYWwgREIgZGkgcHJlZmVyZW5jZSwgbmVsIGNhc28gcGVnZ2lvcmUgbGkgdG9sZ28gZSBsaSByaXNhbHZvIG5lbCBsb2NhbFN0b3JhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKSB7XHJcbiAgICB2YXIgbHNUaW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkpO1xyXG4gICAgdmFyIGxzVW50aW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGlmICghbHNUaW1lZCAmJiAhbHNVbnRpbWVkKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsc1RpbWVkID0gbHNUaW1lZCA/IEpTT04ucGFyc2UobHNUaW1lZCkgOiB7fTtcclxuICAgIGxzVW50aW1lZCA9IGxzVW50aW1lZCA/IEpTT04ucGFyc2UobHNVbnRpbWVkKSA6IHt9O1xyXG5cclxuICAgIGF3YWl0IGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5LCBsc1RpbWVkKSxcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgbHNVbnRpbWVkKVxyXG4gICAgXSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJDb252ZXJ0ZWQgb2xkIHN0b3JhZ2Ugc3lzdGVtIHRvIG5ldyBvbmVcIikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgICBsZXQgY2FjaGVkSW5mb3MgPSB0aGlzLnRyeUdldENhY2hlSW5mb3JtYXRpb25zKHVybCwgcGFyYW1zKTtcclxuICAgICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSAmJiBjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwgKyBcIiBcIiArIHRoaXMubG9jKFwicmV0cmlldmVkIGZyb20gY2FjaGVcIikpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2Y8VD4oY2FjaGVkSW5mb3MuY2FjaGVJdGVtKS5waXBlKGRlbGF5KDApLCBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0PFQ+KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhyZXQubG9jYWxlLCB0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKHJlczogVCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCByZXNwb25zZUl0ZW0gPSA8VD5yZXM7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVJlc3BvbnNlKHRoaXMudXRpc0V4dHMuZGVlcENsb25lKHJlc3BvbnNlSXRlbSksIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVkIHJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VJdGVtO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgcmV0Lm15R3VpZCk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCwgY2FjaGVkSW5mb3MpOyB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQ2FzbyBzcGVjaWZpY28gZGkgY2hpYW1hdGEgY2hlIGRldmUgcmVzdGl0dWlyZSB1biBCbG9iIG8gdW4gQXJyYXlCdWZmZXIgbmF0aXZvIGRhIGVsYWJvcmFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtcImFycmF5YnVmZmVyXCJ8IFwiYmxvYlwifSB0eXBlIFRpcG8gZGkgcml0b3JubyByaWNoaWVzdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEJsb2IgfCBBcnJheUJ1ZmZlcj59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRSYXcodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHR5cGU6IFwiYXJyYXlidWZmZXJcIiB8IFwiYmxvYlwiID0gXCJhcnJheWJ1ZmZlclwiLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2sgPSBudWxsKTogT2JzZXJ2YWJsZTxCbG9iIHwgQXJyYXlCdWZmZXI+IHtcclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAge1xyXG4gICAgICAgIG15R3VpZDogZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKSxcclxuICAgICAgICBsb2NhbGU6IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSlcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBjb25jYXRNYXAoKHJldDogeyBteUd1aWQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgfSkgPT4ge1xyXG4gICAgICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSAmJiBjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pIHtcclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgICAgIHJldHVybiBvZjxhbnk+KGNhY2hlZEluZm9zLmNhY2hlSXRlbSkucGlwZShkZWxheSgwKSwgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQpOyB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogPGFueT50eXBlLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IgfCBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZVJlc3BvbnNlKGJsb2IsIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlZCByZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYmxvYjtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPEJsb2I+ID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIGVycm9yQ2FsbGJhY2soKTtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCByZXQubXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKHJldC5teUd1aWQsIGNhY2hlZEluZm9zKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgUE9TVCBIVFRQXHJcbiAgKiBcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgcG9zdDxUPih1cmw6IHN0cmluZywgYm9keURhdGE6IGFueSwgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLnBvc3Q8VD4odXJsLCBib2R5RGF0YSwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgREVMRVRFIEhUVFBcclxuICAqXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAge1xyXG4gICAgICAgIG15R3VpZDogZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKSxcclxuICAgICAgICBsb2NhbGU6IHRoaXMuYmMuTG9jYWxlLnBpcGUoZmlyc3QoKSlcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBjb25jYXRNYXAoKHJldDogeyBteUd1aWQ6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgfSkgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZGVsZXRlPFQ+KHVybCwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQVVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5wdXQ8VD4odXJsLCBib2R5RGF0YSwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgdHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIGJpc29nbmEgYW5jaGUgaW52aWFyZSBkZWkgRmlsZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0ZpbGVbXSB8IEZpbGV9IGZpbGVBcnJheU9yRmlsZSBTaW5nb2xvIGZpbGUgbyBsaXN0YSBkaSBmaWxlIGRhIGludmlhcmUuIElsIHRpcG8gKipGaWxlKiogw6ggcXVlbGxvIG5hdGl2byBkZWwgSmF2YXNjcmlwdFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgcG9zdHdpdGhGaWxlczxUPih1cmw6IHN0cmluZywgYm9keURhdGE6IGFueSwgZmlsZUFycmF5T3JGaWxlOiBGaWxlW10gfCBGaWxlLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgIHtcclxuICAgICAgICBteUd1aWQ6IGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSksXHJcbiAgICAgICAgbG9jYWxlOiB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChyZXQ6IHsgbXlHdWlkOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nIH0pID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGZvcm1EYXRhID0gdGhpcy5nZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZSk7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiYm9keVwiLCBKU09OLnN0cmluZ2lmeShib2R5RGF0YSkpO1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGZvcm1EYXRhLCB7IHBhcmFtczogcGFyYW1zLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSwgbnVsbCwgdHJ1ZSwgbnVsbCwgbnVsbCkgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpOyB9KSxcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChyZXQubXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtLfSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcG9zdEdldEZpbGU8Sz4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBLLCBmaWxlbmFtZTogc3RyaW5nLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55LCBhZnRlckdldEZpbGU6ICgpID0+IGFueSA9IG51bGwsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSwgcGFycz86IEh0dHBQYXJhbXMpIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuICAgIGxldCBsb2NhbGUgPSBhd2FpdCB0aGlzLmJjLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYm9keURhdGEsIHsgcGFyYW1zOiBwYXJzLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMobG9jYWxlKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcmVzcG9uc2VUeXBlOiBcImJsb2JcIiB9KS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XHJcbiAgICAgICAgaWYgKGFmdGVyR2V0RmlsZSAmJiAhaGFuZGxlRXJyb3IpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQsIGhhbmRsZUVycm9yKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8QmxvYj4pID0+IHtcclxuICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICBsZXQgZm4gPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpPy5zcGxpdCgnOycpWzFdPy5zcGxpdCgnZmlsZW5hbWUnKVsxXT8uc3BsaXQoJz0nKVsxXT8udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpO1xyXG5cclxuICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgZmlsZW5hbWUgfHwgZm4pO1xyXG4gICAgICBpZiAoYWZ0ZXJHZXRGaWxlKSBhZnRlckdldEZpbGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIHZpZW5lIHJlc3RpdHVpdG8gdW4gZmlsZSBnZXN0aXRvIGNvbWUgT2JqZWN0VVJMIGlsIGN1aSBVUkwgc2kgcHXDsiBnZXN0aXJlIGRhbCBwYXJhbWV0cm8gZGkgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKi4gXHJcbiAgICogTGEgY2hpYW1hdGEgbm9uIGhhIHVuIHRpcG8gcmVzdGl0dWl0byBpbiBxdWFudG8gaWwgcmlzdWx0YXRvIGRldidlc3NlcmUgZ2VzdGl0byBhdHRyYXZlcnNvIGxhIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBOb21lIGRlbCBmaWxlIGNoZSBzaSBzdGEgcmljaGllZGVuZG8sIHJpbWFuZSBsYXRvIEZyb250ZW5kIGUgc2VydmUgcGVyIGFzc2VnbmFyZSBhcmJpdHJhcmlhbWVudGUgdW4gbm9tZSBhbCBmaWxlIHJlc3RpdHVpdG8sIHNlIHZ1b3RvIHZpZW5lIHV0aWxpenphdGEgbGEgQ29udGVudC1EaXNwb3NpdGlvbiBkZWxsYSByaXNwb3N0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlckdldEZpbGUgQ2FsbGJhY2sgZGEgY2hpYW1hcmUgZG9wbyBhdmVyIGdlc3RpdG8gbGEgcmlzcG9zdGEgZGVsICoqZ2V0RmlsZUNhbGxiYWNrKiosIGluIGNhc28gKipoYW5kbGVFcnJvcioqIGZvc3NlICoqZmFsc2UqKiB2ZXJyw6AgcmljaGlhbWF0byBhbmNoZSBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGRpIGRlZmF1bHQgZ2xpIGVycm9yaSBkZXZvbm8gZXNzZXJlIGdlc3RpdGkgZGFsbGEgbGlicmVyaWEgbyBzZSBkZXZvbm8gZXNzZXJlIGlnbm9yYXRpXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldEZpbGUodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIGZpbGVuYW1lOiBzdHJpbmcsIGdldEZpbGVDYWxsYmFjazogKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBhbnksIGFmdGVyR2V0RmlsZTogKCkgPT4gYW55ID0gbnVsbCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcbiAgICBsZXQgbG9jYWxlID0gYXdhaXQgdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyBwYXJhbXM6IHBhcmFtcywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKGxvY2FsZSksIG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgICAgIGlmIChhZnRlckdldEZpbGUgJiYgIWhhbmRsZUVycm9yKSBhZnRlckdldEZpbGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkLCBoYW5kbGVFcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPEJsb2I+KSA9PiB7XHJcbiAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgbGV0IGZuID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKT8uc3BsaXQoJzsnKVsxXT8uc3BsaXQoJ2ZpbGVuYW1lJylbMV0/LnNwbGl0KCc9JylbMV0/LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuXHJcbiAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGZpbGVuYW1lIHx8IGZuKTtcclxuICAgICAgaWYgKGFmdGVyR2V0RmlsZSkgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIG5hdGl2byBkaSB1biBmaWxlLiBJbnRlcm5hbWVudGUgdXRpbGl6emEgaWwgcGF0dGVybiAqKndpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi5cIioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZU5hdGl2ZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCk6IHZvaWQge1xyXG5cclxuICAgIC8vIEVuY29kbyB0dXR0aSBpIHBhcmFtZXRyaSBwZXIgZXZpdGFyZSBjYXNpIHBhcnRpY29sYXJpXHJcbiAgICAvLyB2YXIgZW5jb2RlZFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAvLyBsZXQgcGFyS2V5cyA9IHBhcmFtcy5rZXlzKCk7XHJcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBhcktleXMubGVuZ3RoOyBpKyspXHJcbiAgICAvLyAgIGVuY29kZWRQYXJhbXMgPSBlbmNvZGVkUGFyYW1zLnNldChwYXJLZXlzW2ldLCBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmdldChwYXJLZXlzW2ldKSkpO1xyXG5cclxuICAgIGxldCBmaW5hbFVybCA9IHVybCArIChwYXJhbXMgPyBcIj9cIiArIHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoL1xcKy9nLCAnJTJiJykgOiBcIlwiKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZmluYWxVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgZGkgdW4gZmlsZSBjaGUgZW1ldHRlIGkgdmFyaSBldmVudGkgZGkgcHJvZ3Jlc3NvIGRpIGRvd25sb2FkLlxyXG4gICAqIFV0aWxpenphcmxhIHBlciBvdmVycmlkYXJlIGxhIGRpYWxvZyBuYXRpdmEgZGkgcHJvZ3Jlc3MgZGVsIGJyb3dzZXIgZSBzb3N0aXR1aXJsYSBjb24gcXVhbGNvc2EgdGlwbyBxdWVsbG8gY2hlIGZhIE1FR0EuXHJcbiAgICogXHJcbiAgICogSW4gY2FzbyBzaSB2b2dsaWEgb3R0ZW5lcmUgaWwgcmlzdWx0YXRvIG5hdGl2byBkZWwgYnJvd3NlciBkZWwgZG93bmxvYWQgdXRpbGl6emFyZSAqKmdldEZpbGVOYXRpdmUodXJsLCBwYXJzKSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8RG93bmxvYWQ+fSBPYnNlcnZhYmxlIGRlaSB2YXJpIHN0ZXAgZGkgcHJvZ3Jlc3NvIGRlbCBkb3dubG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55KTogT2JzZXJ2YWJsZTxEb3dubG9hZD4ge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICB7XHJcbiAgICAgICAgbXlHdWlkOiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLFxyXG4gICAgICAgIGxvY2FsZTogdGhpcy5iYy5Mb2NhbGUucGlwZShmaXJzdCgpKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgocmV0OiB7IG15R3VpZDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyB9KSA9PiB7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMocmV0LmxvY2FsZSksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcclxuICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICBzY2FuKChwcmV2aW91czogRG93bmxvYWQsIGV2ZW50OiBIdHRwRXZlbnQ8QmxvYj4pOiBEb3dubG9hZCA9PiB7XHJcbiAgICBcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0h0dHBQcm9ncmVzc0V2ZW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gZXZlbnQudG90YWwgPyAoZXZlbnQubG9hZGVkID4gZXZlbnQudG90YWwgPyAxMDAgOiBNYXRoLnJvdW5kKCgxMDAgKiBldmVudC5sb2FkZWQpIC8gZXZlbnQudG90YWwpKSA6IHByZXZpb3VzLnByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvZ3Jlc3M6IHByb2dyZXNzLCBzdGF0ZTogJ0lOX1BST0dSRVNTJywgY29udGVudDogbnVsbCB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNIdHRwUmVzcG9uc2UoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2Rpc3AgPSBldmVudC5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2Rpc3BGaWxlbmFtZSA9IGNkaXNwLnNwbGl0KCc7JylbMV0uc3BsaXQoJ2ZpbGVuYW1lJylbMV0uc3BsaXQoJz0nKVsxXS50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChldmVudC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgY2Rpc3BGaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9ncmVzczogMTAwLCBzdGF0ZTogJ0RPTkUnLCBjb250ZW50OiBldmVudC5ib2R5IH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICAgICAgICAgIH0sIHsgc3RhdGU6ICdQRU5ESU5HJywgcHJvZ3Jlc3M6IDAsIGNvbnRlbnQ6IG51bGwgfSksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgXyk6IE9ic2VydmFibGU8RG93bmxvYWQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIHJldC5teUd1aWQpIH0pLFxyXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQocmV0Lm15R3VpZCk7IH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2V2ZW50byBIVFRQIMOoIGRpIHRpcG8gKipIdHRwUmVzcG9uc2UqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqL1xyXG4gICBwcml2YXRlIGlzSHR0cFJlc3BvbnNlPFQ+KGV2ZW50OiBIdHRwRXZlbnQ8VD4pOiBldmVudCBpcyBIdHRwUmVzcG9uc2U8VD4ge1xyXG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2VcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXZlbnRvIEhUVFAgw6ggZGkgdGlwbyAqKkh0dHBQcm9ncmVzc0V2ZW50KiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKi9cclxuICBwcml2YXRlIGlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQ6IEh0dHBFdmVudDx1bmtub3duPik6IGV2ZW50IGlzIEh0dHBQcm9ncmVzc0V2ZW50IHtcclxuICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3MgfHwgZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGVsbCdpbml6aW8gZGkgdW5hIGNoaWFtYXRhIGFkIHVuIGNlcnRvIFVSTCwgdmllbmUgZ2VuZXJhdG8gdW4gR1VJRCBkYSBhc3NlZ25hcmNpLCBjb250cm9sbGF0YSBsYSBzY2FkZW56YSBkZWxsYSBjYWNoZSwgXHJcbiAgICogZSBldmVudHVhbG1lbnRlIGxvZ2dhdG8gaWwgZmF0dG8gY2hlIHN0YSBwZXIgZXNzZXJlIGVmZmV0dHVhdGEgdW5hIGNoaWFtYXRhIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVybCBhIGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gR1VJRCBhc3NlZ25hdG8gYWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGVmYXVsdFN0YXJ0Q2FsbCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5nZXRHVUlEKCk7XHJcbiAgICB0aGlzLmNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsKTtcclxuICAgIHRoaXMuY2FsbFN0YXR1c1tteUd1aWRdID0geyB1cmw6IHVybCwgc3VjY2VzczogdHJ1ZSB9O1xyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJTdGFydGluZyBjYWxsXCIpICsgXCIgXCIgKyBteUd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwiYXQgVVJMXCIpICsgXCI6IFwiICsgdXJsKTtcclxuICAgIHJldHVybiBteUd1aWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIHVybCB2ZW5nb25vIGNvbnRyb2xsYXRlIGxlIGluZm9ybWF6aW9uaSBzdSB0dXR0aSBnbGkgdXJsIGRhIGludmFsaWRhcmUgY29sbGVnYXRpIGFsbCd1cmwgY2hpYW1hdG8gZSwgc2UgcHJlc2VudGkgaW4gY2FjaGUsIGludmFsaWRhdGlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBwZXIgY3VpIGNvbnRyb2xsYXJlIHNlIGNpIHNvbm8gY2hpYW1hdGUgaW4gY2FjaGUgZGEgaW52YWxpZGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tDYWNoZUludmFsaWRhdGlvbih1cmw6IHN0cmluZykge1xyXG4gICAgbGV0IGNhY2hlID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtPGFueT4odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkpO1xyXG4gICAgbGV0IHRtcCA9IC8jY2FjaGUoOj8tKFxcZCspKS9naS5leGVjKHVybCk7XHJcbiAgICBsZXQgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuICAgIGxldCBub3JtYWxpemVkVXJsX3RtcCA9ICB1cmwucmVwbGFjZShcIiNjYWNoZVwiICsgKGNhY2hlVGltZSA/IFwiLVwiICsgY2FjaGVUaW1lIDogXCJcIiksIFwiXCIpO1xyXG4gICAgbGV0IG5vcm1hbGl6ZWRVcmwgPSBub3JtYWxpemVkVXJsX3RtcC5zdWJzdHJpbmcobm9ybWFsaXplZFVybF90bXAuaW5kZXhPZignL2FwaScpKVxyXG5cclxuICAgIGlmICghY2FjaGUgfHwgIXRoaXMuSFRUUF9JTlZBTElEQVRJT04gfHwgIXRoaXMuSFRUUF9JTlZBTElEQVRJT05bbm9ybWFsaXplZFVybF0pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgYXBpc1RvSW52YWxpZGF0ZTogc3RyaW5nW10gPSB0aGlzLkhUVFBfSU5WQUxJREFUSU9OW25vcm1hbGl6ZWRVcmxdO1xyXG4gICAgaWYgKCFhcGlzVG9JbnZhbGlkYXRlIHx8IGFwaXNUb0ludmFsaWRhdGUubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQga2V5c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgYXBpc1RvSW52YWxpZGF0ZS5mb3JFYWNoKGFwaSA9PiB7XHJcbiAgICAgIGxldCBjYWNoZUtleSA9IHRoaXMubWFrZUNhY2hlS2V5KGFwaSwgbnVsbCk7XHJcbiAgICAgIGZvciAobGV0IGl0ZW0gaW4gY2FjaGUpXHJcbiAgICAgICAgaWYgKGl0ZW0uaW5kZXhPZihjYWNoZUtleSkgIT0gLTEpXHJcbiAgICAgICAgICBrZXlzVG9SZW1vdmUucHVzaChpdGVtKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBrID0ga2V5c1RvUmVtb3ZlW2ldO1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkludmxhbGlkYXRpbmcgY2FjaGUgZWxlbWVudFwiKSArIFwiIFwiICsgayk7XHJcbiAgICAgIGRlbGV0ZSBjYWNoZVtrXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCBjYWNoZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5hbGl6emF6aW9uZSBkaSB1bmEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBHVUlEIGNvbGxlZ2F0byBhbGxhIGNoaWFtYXRhIGFwcGVuYSB0ZXJtaW5hdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RDYWNoZUlmSWRsZSBFZmZldHR1YSBpbCBwZXJzaXN0IGRlbGxhIGNhY2hlIEhUVFAgc29sbyBzZSBub24gY2kgc29ubyBhbHRyZSBjaGlhbWF0ZSBpbiBjb3JzbywgcGVyIGV2aXRhcmVcclxuICAgKiBjaGUgbWkgY2FtYmkgc290dG8gbCdvZ2dldHRvIGRpIGNhY2hlIG1lbnRyZSBzdG8gc2FsdmFuZG8gbGUgaW5mb3JtYXppb25pXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyB0cnlGaW5hbGl6ZUJ5R3VpZChndWlkOiBzdHJpbmcsIGNhY2hlSW5mb3M/OiBDYWNoZUluZm9zKSB7XHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkZpbmFsaXppbmcgY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHN0YXR1c1wiKSArIFwiOiBcIiArICghdGhpcy5jYWxsU3RhdHVzW2d1aWRdID8gJ1Vua25vd24nIDogdGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgPyB0aGlzLmxvYygnU3VjY2VzcycpIDogdGhpcy5sb2MoJ0ZhaWx1cmUnKSkpO1xyXG5cclxuICAgIC8vIFRPRE86IFBlcmRlcmUgMy00IG9yZSBwZXIgY2FwaXJlIHBlcmNow6kgb2duaSB0YW50byBhcnJpdmEgbnVsbCBpbiBjYXNpIHBlc2FudGkgZGkgT2JzZXJ2YWJsZSBzcGFtbWF0aSBhIHJhbmRvbVxyXG4gICAgaWYgKHRoaXMuY2FsbFN0YXR1c1tndWlkXSkge1xyXG4gICAgICAvLyBBbGxhIHByaW1hIGNoaWFtYXRhIGJ1b25hLCBzaWduaWZpY2EgY2hlIGFsbWVubyBpbCBsb2dpbiBjZSBsJ2hvLiBQb3NzbyBtZXR0ZXJtaSBpbiBtb2RhbGl0w6AgcmVkaXJlY3RJblByb2dyZXNzIGZhbHNlXHJcbiAgICAgIC8vIGUgcmlpbml6aWFyZSBhIHZhbHV0YXJlIGVycm9yaSBkaSBqYXZhc2hpdFxyXG4gICAgICBpZiAodGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgJiYgdGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlUmVkaXJlY3Rpb25TdGF0dXMoZmFsc2UpO1xyXG5cclxuICAgICAgLy8gQWdnaXVuZ28gbGEgY2hpYW1hdGEgYWxsYSBsaXN0YSBkZWxsZSB1bHRpbWUgMyBjb21wbGV0YXRlXHJcbiAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMudW5zaGlmdCh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0udXJsKVxyXG4gICAgICBpZiAodGhpcy5MYXN0VGhyZWVDb21wbGV0ZWRDYWxscy5sZW5ndGggPiAzKVxyXG4gICAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMucG9wKCk7XHJcblxyXG4gICAgICAvLyBJbiBvZ25pIGNhc28gcXVlc3RhIHBvc3NvIHJpbXVvdmVybGFcclxuICAgICAgZGVsZXRlIHRoaXMuY2FsbFN0YXR1c1tndWlkXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZSB2ZW5nbyBkYSB1bmEgY2hpYW1hdGEgY2hlIGhhIGFnZ2lvcm5hdG8gbGEgY2FjaGUgYSB0aW1lciBvIGdsb2JhbGUgbWFyY28gaWwgZmF0dG8gY2hlIHF1ZWxsYSBjYWNoZSBkZXYnZXNzZXJlIGFnZ2lvcm5hdGFcclxuICAgIGlmIChjYWNoZUluZm9zICYmIGNhY2hlSW5mb3MuY2FjaGUpIHtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCAhIWNhY2hlSW5mb3MuY2FjaGVUaW1lO1xyXG4gICAgICB0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQID0gdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgIWNhY2hlSW5mb3MuY2FjaGVUaW1lO1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIk1hcmtpbmcgY2FjaGUgdG8gYmUgcGVyc2lzdGVkIGFzIHNvb24gYXMgcG9zc2libGVcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlIHVuYSBkZWxsZSBkdWUgY2FjaGUgZGV2b25vIGVzc2VyZSBhZ2dpb3JuYXRlIGUgbm9uIGhvIG5lc3N1bmEgY2hpYW1hdGEgaW4gY29yc28gZWZmZXR0dW8gbCdhZ2dpb3JuYW1lbnRvIGluIGJhc2UgYSBxdWFsZSBkZWxsZSBkdWUgdmEgYWdnaW9ybmF0YVxyXG4gICAgLy8gQWxsYSBmaW5lIGRpIHR1dHRvIG1hcmNvIGNvbWUgZmF0dG9cclxuICAgIGlmICgodGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCkgJiYgT2JqZWN0LmtleXModGhpcy5jYWxsU3RhdHVzKS5sZW5ndGggPT0gMCkge1xyXG5cclxuICAgICAgdmFyIHRvQ2FsbCA9IFtdO1xyXG4gICAgICBsZXQgdG1wS2V5ID0gXCJcIjtcclxuICAgICAgaWYgKHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQKSB7XHJcbiAgICAgICAgdG1wS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleTtcclxuICAgICAgICB0b0NhbGwucHVzaCh0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVApIHtcclxuICAgICAgICB0bXBLZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleTtcclxuICAgICAgICB0b0NhbGwucHVzaCh0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJObyBtb3JlIEhUVFAgY2FsbHMgdG8gYmUgZXhlY3V0ZWQsIGVudGVyaW5nIGlkbGUgc3RhdGUgYW5kIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpICsgXCIuLi5cIik7XHJcbiAgICAgIHZhciByZXQgPSBhd2FpdCBmb3JrSm9pbih0b0NhbGwpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmV0KVxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVzIHN1Y2Nlc2Z1bGx5IHBlcnNpc3RlZFwiKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9ycyBwZXJzaXN0aW5nIG1vZGlmaWVkIGNhY2hlc1wiKSk7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVAgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBjaGUgZGF0byB1biB1bmljbyBGaWxlIG8gdW5hIGxpc3RhIGRpIEZpbGUgY3JlYSB1biBvZ2dldHRvIEZvcm1EYXRhIGNoZSBwdcOyIGVzc2VyZSBpbnZpYXRvIGNvbW9kYW1lbnRlIFxyXG4gICAqIGFkIHVuIGJhY2tlbmQgQVNQLk5FVCBkYSBjdWkgc2kgcG90csOgIGFjY2VkZXJlIGEgUmVxdWVzdC5Gb3JtLkZpbGVzXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtGaWxlIHwgRmlsZVtdfSBmaWxlQXJyYXlPckZpbGUgU2luZ29sbyBGaWxlIG8gbGlzdGEgZGkgRmlsZS4gTi5COiBuZWxsYSBmaXJtYSBkZWxsYSBmdW56aW9uZSB2aWVuZSBjb25zaWRlcmF0byAqKmFueSoqIHBlciBmYXJlIHRlc3Qgc3VsbGUgcHJvcHJpZXTDoCBcclxuICAgKiBpbnZlY2UgY2hlIGZhcmUgdGVzdCBjb24gbCcqKmlzdGFuY2VvZioqXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSBGb3JtRGF0YSBjb250ZW5lbnRlIHR1dHRpIGkgZmlsZSBwYXNzYXRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZTogYW55KTogRm9ybURhdGEge1xyXG4gICAgdmFyIGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG5cclxuICAgIGlmIChmaWxlQXJyYXlPckZpbGUpIHtcclxuICAgICAgaWYgKGZpbGVBcnJheU9yRmlsZS5sZW5ndGgpXHJcbiAgICAgICAgZmlsZUFycmF5T3JGaWxlLmZvckVhY2godCA9PiB7IGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgdCwgdC5uYW1lKTsgfSk7XHJcbiAgICAgIGVsc2UgaWYgKGZpbGVBcnJheU9yRmlsZS5uYW1lKVxyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVzXCIsIGZpbGVBcnJheU9yRmlsZSwgZmlsZUFycmF5T3JGaWxlLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JtRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBjaGUgaW4gYmFzZSBhaSBwYXJhbWV0cmkgZGlzcG9uaWJpbGkgZ2VuZXJhIGdsaSBIZWFkZXIgSFRUUCBwZXIgbGEgY2hpYW1hdGEgZGEgZWZmZXR0dWFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZSBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkNvbnRlbnQtVHlwZVwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NlcHQgSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBY2NlcHRcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBdXRoIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQXV0aG9yaXphdGlvblwiLCB2YWxvcml6emF0byBjb2wgdG9rZW4gcmVjdXBlcmF0byBkYWxsJ2hvb2sgKipyZXRyaWV2ZUFjY2Vzc1Rva2VuKiogZGVsbGEgY2xhc3NlIGRpIGVzdGVuc2lvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb25JZCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIlgtVFgtSURcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7SHR0cEhlYWRlcnN9IEhlYWRlciBnZW5lcmF0aSBpbiBiYXNlIGFpIHBhcmFtZXRyaVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SGVhZGVycyhsb2NhbGUgPSAnaXQtSVQnLCB0cmFuc2FjdGlvbklkID0gXCJcIiwgaW5jbHVkZUF1dGg6IGJvb2xlYW4gPSB0cnVlLCBjb250ZW50VHlwZTogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIsIGFjY2VwdDogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpOiBIdHRwSGVhZGVycyB7XHJcbiAgICB2YXIgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgdmFyIGF1dGh0b2tlbiA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVBY2Nlc3NUb2tlbigpO1xyXG5cclxuICAgIGlmIChjb250ZW50VHlwZSlcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQ29udGVudC1UeXBlXCIsIGNvbnRlbnRUeXBlKTtcclxuXHJcbiAgICBpZiAodHJhbnNhY3Rpb25JZClcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiWC1UWC1JRFwiLCB0cmFuc2FjdGlvbklkKTtcclxuXHJcbiAgICBpZiAoYXV0aHRva2VuICYmIGluY2x1ZGVBdXRoKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgYXV0aHRva2VuKTtcclxuXHJcbiAgICBpZiAoYWNjZXB0KVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBY2NlcHRcIiwgYWNjZXB0KTtcclxuXHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBY2NlcHQtTGFuZ3VhZ2VcIiwgbG9jYWxlKTtcclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGkgZGVmYXVsdCBkZWdsaSBlcnJvcmlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gcmVzIFJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgSWRlbnRpZmljYXRpdm8gR1VJRCBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkVycm9yKHJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBUeXBlRXJyb3IsIGd1aWQ6IHN0cmluZykge1xyXG4gICAgaWYodGhpcy5jYWxsU3RhdHVzW2d1aWRdKVxyXG4gICAgICB0aGlzLmNhbGxTdGF0dXNbZ3VpZF0uc3VjY2VzcyA9IGZhbHNlO1xyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHR1dHRpIGdsaSBlcnJvcmkgZHVyYW50ZSBpbCByZWRpcmVjdCBhbCBsb2dpbiB2ZW5nYW5vIGlnbm9yYXRpXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3RpbmdUb0xvZ2luKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZWRpcmVjdGluZyB0byBMb2dpbiwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHZlbmdhIGdlc3RpdG8gdW4gc29sbyBlcnJvcmUgcGVyIHZvbHRhXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkSGFuZGxpbmdFcnJvclN0YXR1cygpKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQWxyZWFkeSBIYW5kbGluZyBhbiBlcnJvciwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlSGFuZGxpbmdFcnJvclN0YXR1cyh0cnVlKTtcclxuXHJcbiAgICBsZXQgZmluYWxFcnJvciA9IFwiXCI7XHJcbiAgICBsZXQgZmluYWxTdGF0dXMgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuaXNUeXBlRXJyb3IocmVzKSkge1xyXG4gICAgICBmaW5hbEVycm9yID0gcmVzLm1lc3NhZ2U7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gXCJIVFRQIFNlcnZpY2UgSW50ZXJuYWwgRXJyb3JcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNIdHRwRXJyb3JSZXNwb25zZShyZXMpKSB7XHJcblxyXG4gICAgICBmaW5hbEVycm9yID0gYXdhaXQgdGhpcy5nZXRIdHRwRXJyb3JUZXh0KHJlcy5lcnJvcik7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gcmVzLnN0YXR1cy50b1N0cmluZygpO1xyXG5cclxuICAgICAgc3dpdGNoIChyZXMuc3RhdHVzKSB7XHJcbiAgICAgICAgLy8gVW5hdXRob3JpemVkXHJcbiAgICAgICAgY2FzZSA0MDE6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQwMSBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwicmVkaXJlY3RpbmcgdG8gbG9naW4uXCIpKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGlvblN0YXR1cyh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGluZ1RvTG9naW4odHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLnJlZGlyZWN0VG9Mb2dpbigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIEhhbmRsZWQgZXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0MDA6XHJcbiAgICAgICAgLy8gTm8gUGVybWlzc2lvbnNcclxuICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gTm90IGZvdW5kXHJcbiAgICAgICAgY2FzZSA0MDQ6XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIHRoaXMubG9jKFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3RDb25maWd1cmVkRXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0NDQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0NDQgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHJlZGlyZWN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIElnbm9yaW5nIHRoaXMgZXZlbnRcIikpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoIXRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlTm90Q29uZmlndXJlZEV4Y2VwdGlvbigpKVxyXG4gICAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZpbmFsRXJyb3IgPSBcIlNlcnZlciBtaWdodCBiZSBvZmZsaW5lXCIgKyAocmVzLnN0YXR1c1RleHQgPyBcIiAoXCIgKyByZXMuc3RhdHVzVGV4dCArIFwiKSBcIiA6IFwiXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVFeGNlcHRpb24oZmluYWxTdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBlcnJvcmUgcmVzdGl0dWlzY2UgdW5hIHByb21pc2UgY29uIGxhIHN0cmluZ2EgZmluYWxlIGRlbGwnZXJyb3JlIGluIG1vZG8gZGEgcG90ZXIgZmFyZSB1biBhd2FpdFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSBjaGUgcmlzb2x2ZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEh0dHBFcnJvclRleHQoZXJyOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgLy8gU2UgaG8gdW4gQmxvYiBwdcOyIGVzc2VyZSBvIHVuIENhbGxSZXN1bHQgbyBzdXBwb25nbyB1bmEgc2VtcGxpY2Ugc3RyaW5nYSxcclxuICAgIC8vIGFsdHJpbWVudGkgcG90cmViYmUgZXNzZXJlIGRpcmV0dGFtZW50ZSB1biBDYWxsUmVzdWx0LCBvcHB1cmUgdW5hIHNlbXBsaWNlIHN0cmluZ2FcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVyck1zZyA9ICg8YW55PmUudGFyZ2V0KS5yZXN1bHQ7XHJcbiAgICAgICAgICBsZXQganNvbmVyck1zZzogYW55O1xyXG4gICAgICAgICAgdHJ5IHsganNvbmVyck1zZyA9IEpTT04ucGFyc2UoZXJyTXNnKTsgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShqc29uZXJyTXNnICYmIHRoaXMuaXNDYWxsUmVzdWx0KGpzb25lcnJNc2cpID8ganNvbmVyck1zZy5lcnJvci5tZXNzYWdlIDogZXJyTXNnKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGVycilcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmlzQ2FsbFJlc3VsdChlcnIpKVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVyci5lcnJvci5tZXNzYWdlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVycj8udG9TdHJpbmcoKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ29nZ2V0dG8gw6ggZGkgdGlwbyAqKkNhbGxSZXN1bHQqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0NhbGxSZXN1bHQoZXJyOiBhbnkpOiBlcnIgaXMgeyBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSB9IHtcclxuICAgIHJldHVybiAhIWVycj8uZXJyb3I/Lm1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKkh0dHBFcnJvclJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNIdHRwRXJyb3JSZXNwb25zZShlcnI6IGFueSk6IGVyciBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XHJcbiAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXJyb3JlIMOoIGRpIHRpcG8gKipUeXBlRXJyb3IqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1R5cGVFcnJvcihlcnI6IGFueSk6IGVyciBpcyBUeXBlRXJyb3Ige1xyXG4gICAgcmV0dXJuIGVyci5uYW1lID09IFwiVHlwZUVycm9yXCI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21lIGRpY2UgaWwgbm9tZSwgcmVnaXN0cmEgdW4gZXJyb3JlIGUgcmVzdGl0dWlzY2UgdW4gT2JzZXJ2YWJsZSB2dW90byBjb21lIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBnZXN0aXJlIGwnZXJyb3JlIHZpYSBsaWJyZXJpYSBvIHNlIGxpbWl0YXJzaSBhIHJlc3RpdHVpcmUgbCdPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8YW55Pn0gT2JzZXJ2YWJsZSB2dW90b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShyZXM6IGFueSwgZ3VpZDogc3RyaW5nLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKGhhbmRsZUVycm9yKVxyXG4gICAgICB0aGlzLm9uRXJyb3IocmVzLCBndWlkKTtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKSA9PiB7IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBVcmwgZSBkZWkgcGFyYW1ldHJpIGNlcmNhIGRpIHJlY3VwZXJhcmUgbCdldmVudHVhbGUgb2dnZXR0byBnacOgIHNhbHZhdG8gaW4gY2FjaGUgY29uIGxlIGluZm9ybWF6aW9uaSBiYXNlIGRlbGxhIGNhY2hlIHN0ZXNzYVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhIChudWxsaSBpbiBjYXNvIGRpIFBPU1QpXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NhY2hlSW5mb3N9IE9nZ2V0dG8gY29udGVuZW50ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGEgY2FjaGUgcGVyIGwnb2dnZXR0byBzcGVjaWZpY2F0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyk6IENhY2hlSW5mb3Mge1xyXG5cclxuICAgIGxldCBjYWNoaW5nS2V5ID0gbnVsbCwgY2FjaGVUaW1lID0gbnVsbCwgaXRlbSA9IG51bGw7XHJcbiAgICBsZXQgdXNlQ2FjaGluZyA9ICEhKC8jY2FjaGUvZ2kuZXhlYyh1cmwpKTtcclxuXHJcbiAgICBpZiAodXNlQ2FjaGluZykge1xyXG4gICAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgICAgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIik7XHJcbiAgICAgIGlmICh0aGlzLnVudGltZWRDYWNoZUV4cGlyZWQoKSAmJiAhY2FjaGVUaW1lKVxyXG4gICAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG5cclxuICAgICAgY2FjaGluZ0tleSA9IHRoaXMubWFrZUNhY2hlS2V5KHVybCwgcGFyYW1zKTtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICAgIGxldCBjYWNoZUxzID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKGNhY2hlS2V5KTtcclxuICAgICAgbGV0IGNhY2hlID0gY2FjaGVMcyA/IGNhY2hlTHMgOiB7fTtcclxuXHJcbiAgICAgIGlmIChjYWNoZSAmJiBjYWNoZVtjYWNoaW5nS2V5XSAmJiAhdGhpcy50aW1lZENhY2hlSXRlbUV4cGlyZWQoY2FjaGVbY2FjaGluZ0tleV0pKSB7XHJcbiAgICAgICAgLy8gU2UgZ2VzdGlzY28gaWwgdGVtcG8gZXNhdHRvIGRlbGxhIGNhY2hlIHByaW1hIGRpIHJlc3RpdHVpcmUgbCdvZ2dldHRvIGNhY2hhdG8gbG8gcmlwdWxpc2NvIFxyXG4gICAgICAgIC8vIGRhbGxlIHByb3ByaWV0w6AgaW50ZXJuZSBjaGUgZ2xpIGhvIGFnZ2l1bnRvIHBlciBjb250cm9sbGFybmUgbGEgc2NhZGVuemFcclxuICAgICAgICBpZiAoY2FjaGVUaW1lKVxyXG4gICAgICAgICAgZGVsZXRlIGNhY2hlW2NhY2hpbmdLZXldLl9fZXhwaXJlO1xyXG5cclxuICAgICAgICBpdGVtID0gY2FjaGVbY2FjaGluZ0tleV1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlciBhc3NpY3VyYXJtaSBjaGUgaWwgcmlmZWlybWVudG8gZGVnbGkgb2dnZXR0aSBzaWEgZGl2ZXJzbyB1dGlsaXp6byBpbCBkZWVwQ2xvbmVcclxuICAgIHJldHVybiBuZXcgQ2FjaGVJbmZvcyh1cmwsIHVzZUNhY2hpbmcsIGNhY2hpbmdLZXksIGNhY2hlVGltZSwgdGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUoaXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJpc2NlIHVuIG9nZ2V0dG8gbmVsbGEgY2FjaGUgYXBwcm9wcmlhdGEgaW4gYmFzZSBhbGxlIGluZm9ybWF6aW9uaSBjb250ZW51dGUgbmVsIHBhcmFtZXRybyAqKmNhY2hlSW5mb3MqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7VH0gaXRlbSBPZ2dldHRvIGRhIGluc2VyaXJlIG5lbGxhIGNhY2hlXHJcbiAgICogQHBhcmFtIHtDYWNoZUluZm9zfSBjYWNoZUluZm9zIEluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSByZWN1cGVyYXRlIGRhIHVuYSBjaGlhbWF0YSBwcmVjZWRlbnRlIGEgKip0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWNoZVJlc3BvbnNlPFQ+KGl0ZW06IFQsIGNhY2hlSW5mb3M6IENhY2hlSW5mb3MpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZUtleSA9IGNhY2hlSW5mb3MuY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICBsZXQgY2FjaGVMcyA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbShjYWNoZUtleSk7XHJcbiAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gY2FjaGVMcyA6IHt9O1xyXG5cclxuICAgIGNhY2hlW2NhY2hlSW5mb3MuY2FjaGVLZXldID0gaXRlbTtcclxuICAgIGlmIChjYWNoZUluZm9zLmNhY2hlVGltZSlcclxuICAgICAgY2FjaGVbY2FjaGVJbmZvcy5jYWNoZUtleV0uX19leHBpcmUgPSBkYXlqcygpLmFkZChjYWNoZUluZm9zLmNhY2hlVGltZSwgXCJzZWNvbmRzXCIpO1xyXG5cclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldExvY2FsSXRlbShjYWNoZUtleSwgY2FjaGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbGxhIHNlIGxhIGNhY2hlIHBlciBsZSBjaGlhbWF0ZSBzZW56YSBleHBpcmUgdGltZSDDqCBzY2FkdXRhXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGxhIGNhY2hlIMOoIHNjYWR1dGEgZSBkZXYnZXNzZXJlIHJpcHVsaXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdW50aW1lZENhY2hlRXhwaXJlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBleHBpcmUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5KSk7XHJcbiAgICByZXR1cm4gIWV4cGlyZSB8fCBleHBpcmUgJiYgZGF5anMoZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIHVuYSBjaGlhbWF0YSBjaGUgaGEgdW4gdGVtcG8gZGkgdml0YSBiZW4gZGVmaW5pdG8gw6ggc2NhZHV0YSBvIG1lbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHJlY3VwZXJhdG8gZGFsbGEgY2FjaGUgYSBjdWkgaG8gYWdnaXVudG8gbGEgY2hpYXZlIGludGVybmEgX19leHBpcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0aW1lZENhY2hlSXRlbUV4cGlyZWQoaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZGF5anMoaXRlbS5fX2V4cGlyZSkgPCBkYXlqcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGUgaW1wb3N0YSBsYSBwcm9zc2ltYSBzY2FkZW56YSBhZCBhZGVzc28gKyAqKkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TKiogKHRva2VuIHZhbG9yaXp6YXRvIGluIGZhc2UgZGkgY29uZmlndXJhemlvbmUgZGFsbGEgcHJvcHJpZXTDoCAqKmNsaWVudENhY2hlRHVyYXRpb25TKiogZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VNb2R1bGVDb25maWcqKilcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGF3YWl0IHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5LCBKU09OLnN0cmluZ2lmeShkYXlqcygpLmFkZCh0aGlzLkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TLCBcInNlY29uZFwiKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGRlbGxlIGNoaWFtYXRlIGNvbiB1biB0ZW1wbyBkaSBleHBpcmUgZGVmaW5pdG9cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVGltZWRDYWNoZVN0b3JhZ2UoKSB7XHJcbiAgICBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYSB1bmEgY2hpYXZlIHBlciBsYSBjYWNoZSBkZWxsZSBjaGlhbWF0ZSBpbiBiYXNlIGFkIFVSTCBlIFBhcmFtZXRyaSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGlhdmUgY2hlIHJhcHByZXNlbnRhIGluIG1hbmllcmEgdW5pdm9jYSBsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gICBwcml2YXRlIG1ha2VDYWNoZUtleSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zKTogc3RyaW5nIHtcclxuICAgIHRoaXMubWUgPSB0aGlzLm1lIHx8IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVJZGVudGl0eSgpO1xyXG5cclxuICAgIGxldCBhdXRoS2V5UGFydCA9ICh0aGlzLm1lID8gdGhpcy5tZS5JZHRlbmFudCA6IFwiXCIpICsgKHRoaXMubWUgJiYgdGhpcy5DQUNIRV9CWV9VU0VSID8gdGhpcy5tZS5JZFVzZXIgOiBcIlwiKTtcclxuICAgIGxldCBwYXJhbXNLZXlQYXJ0ID0gcGFyYW1zICYmIHBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMCA/IHBhcmFtcy5rZXlzKCkucmVkdWNlKChwcmV2OiBhbnksIG5leHQ6IGFueSkgPT4gcHJldiArIFwiLFwiICsgbmV4dCArICc9JyArIHBhcmFtcy5nZXQobmV4dCksIFwiXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBhdXRoS2V5UGFydCArIFwiX1wiICsgdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZihcImFwaVwiKSArIDQpICsgXCI/XCIgKyBwYXJhbXNLZXlQYXJ0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhemlvbmUgR1VJRFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE51b3ZvIEdVSUQgZ2VuZXJhdG8gaW4gbWFuaWVyYSBjYXN1YWxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHVUlEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBzY3JpdmVyZSBsb2cgYSBjb25zb2xlIHF1YWxvcmEgKipERUJVR19NT0RFKiogcmlzdWx0YXNzZSAqKnRydWUqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkaSBsb2dcclxuICAgKi9cclxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkhUVFBfREVCVUdfTU9ERSlcclxuICAgICAgY29uc29sZS5sb2coXCJAaHR0cHNlcnZpY2U6IFwiICsgbWVzc2FnZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBwZXIgbGEgbG9jYWxpenphemlvbmUgZGVpIG1lc3NhZ2dpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIGxvY2FsaXp6YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZ2lvIGxvY2FsaXp6YXRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2MobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIC8vIFRvZ2xpYW1vIHZlbG9jZW1lbnRlIHN0ZSBsb2NhbGl6emF6aW9uaSBpbnV0aWxpLi4uLlxyXG4gICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgfVxyXG59Il19
@@ -162,13 +162,10 @@ class HTTPService {
162
162
  /** Lista delle ultime 3 chiamate completate con successo in ordine di completamento (in posizione 0 c'è l'ultima completata eccetera...) */
163
163
  this.LastThreeCompletedCalls = [];
164
164
  this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();
165
- this.me = this.ExtensionsImpl.retrieveIdentity();
166
165
  this.localStorageHttpCacheKey = (this.APP_NAME).replace(/\s/g, '_') + "_HttpCache";
167
166
  this.localStorageHttpTimedCacheKey = (this.APP_NAME).replace(/\s/g, '_') + "_HttpTimedCache";
168
167
  this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + "_Expire";
169
168
  this.adjustOldStorageSystem();
170
- if (this.untimedCacheExpired())
171
- this.resetHttpUntimedCacheStorage();
172
169
  }
173
170
  /**
174
171
  * Se vedo che ci sono elementi salvati nel localStorage provo a toglierli e a risalvarli via preference.
@@ -850,6 +847,7 @@ class HTTPService {
850
847
  * @returns {string} Chiave che rappresenta in maniera univoca la chiamata
851
848
  */
852
849
  makeCacheKey(url, params) {
850
+ this.me = this.me || this.ExtensionsImpl.retrieveIdentity();
853
851
  let authKeyPart = (this.me ? this.me.Idtenant : "") + (this.me && this.CACHE_BY_USER ? this.me.IdUser : "");
854
852
  let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev, next) => prev + "," + next + '=' + params.get(next), "") : "";
855
853
  return authKeyPart + "_" + url.substring(url.indexOf("api") + 4) + "?" + paramsKeyPart;