breeze-client 2.1.6 → 2.1.7

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.
@@ -1,7 +1,7 @@
1
1
  import { core } from './core';
2
2
  import { config } from './config';
3
3
  import { JsonResultsAdapter } from './data-service';
4
- import { MetadataStore } from './entity-metadata';
4
+ import { EntityType, MetadataStore } from './entity-metadata';
5
5
  /** For use by breeze plugin authors only. The class is used as the base class for most [[IDataServiceAdapter]] implementations
6
6
  @adapter (see [[IDataServiceAdapter]])
7
7
  @hidden
@@ -93,52 +93,83 @@ var AbstractDataServiceAdapter = /** @class */ (function () {
93
93
  });
94
94
  return promise;
95
95
  };
96
+ /** Execute the query in the mappingContext using the ajaxImpl. */
96
97
  AbstractDataServiceAdapter.prototype.executeQuery = function (mappingContext) {
97
98
  var _this = this;
98
99
  mappingContext.adapter = this;
100
+ var usePost = mappingContext.query.usePostEnabled;
101
+ var params = usePost ? this._makeQueryPostParams(mappingContext) : this._makeQueryGetParams(mappingContext);
99
102
  var promise = new Promise(function (resolve, reject) {
100
- var url = mappingContext.getUrl();
101
- var params = {
102
- type: "GET",
103
- url: url,
104
- params: mappingContext.query.parameters,
105
- dataType: 'json',
106
- success: function (httpResponse) {
107
- var data = httpResponse.data;
108
- try {
109
- var rData = void 0;
110
- var results = data && (data.results || data.Results);
111
- if (results) {
112
- rData = { results: results, inlineCount: data.inlineCount || data.InlineCount,
113
- httpResponse: httpResponse, query: mappingContext.query };
114
- }
115
- else {
116
- rData = { results: data, httpResponse: httpResponse, query: mappingContext.query };
117
- }
118
- resolve(rData);
103
+ params.success = function (httpResponse) {
104
+ var data = httpResponse.data;
105
+ try {
106
+ var rData = void 0;
107
+ var results = data && (data.results || data.Results);
108
+ if (results) {
109
+ rData = { results: results, inlineCount: data.inlineCount || data.InlineCount,
110
+ httpResponse: httpResponse, query: mappingContext.query };
119
111
  }
120
- catch (e) {
121
- if (e instanceof Error) {
122
- reject(e);
123
- }
124
- else {
125
- handleHttpError(reject, httpResponse);
126
- }
112
+ else {
113
+ rData = { results: data, httpResponse: httpResponse, query: mappingContext.query };
127
114
  }
128
- },
129
- error: function (httpResponse) {
130
- handleHttpError(reject, httpResponse);
131
- },
132
- crossDomain: false
115
+ resolve(rData);
116
+ }
117
+ catch (e) {
118
+ if (e instanceof Error) {
119
+ reject(e);
120
+ }
121
+ else {
122
+ handleHttpError(reject, httpResponse);
123
+ }
124
+ }
125
+ };
126
+ params.error = function (httpResponse) {
127
+ handleHttpError(reject, httpResponse);
133
128
  };
134
- if (mappingContext.dataService.useJsonp) {
135
- params.dataType = 'jsonp';
136
- params.crossDomain = true;
137
- }
138
129
  _this.ajaxImpl.ajax(params);
139
130
  });
140
131
  return promise;
141
132
  };
133
+ /** Set up ajax parameters for query GET. This puts the query into the request querystring in either JSON or OData-style syntax, depending upon the UriBuilder. */
134
+ AbstractDataServiceAdapter.prototype._makeQueryGetParams = function (mappingContext) {
135
+ var url = mappingContext.getUrl();
136
+ var params = {
137
+ type: "GET",
138
+ url: url,
139
+ params: mappingContext.query.parameters,
140
+ dataType: 'json',
141
+ crossDomain: false,
142
+ };
143
+ if (mappingContext.dataService.useJsonp) {
144
+ params.dataType = 'jsonp';
145
+ params.crossDomain = true;
146
+ }
147
+ return params;
148
+ };
149
+ /** Set up ajax parameters for query POST. This put the query into the request body as JSON. */
150
+ AbstractDataServiceAdapter.prototype._makeQueryPostParams = function (mappingContext) {
151
+ var entityQuery = mappingContext.query;
152
+ var metadataStore = mappingContext.entityManager.metadataStore;
153
+ var url = mappingContext.dataService.qualifyUrl(entityQuery.resourceName);
154
+ var entityType = entityQuery._getFromEntityType(metadataStore, false);
155
+ if (!entityType) {
156
+ entityType = new EntityType(metadataStore);
157
+ }
158
+ var json = entityQuery.toJSONExt({ entityType: entityType, toNameOnServer: true });
159
+ json.from = undefined;
160
+ json.queryOptions = undefined;
161
+ var params = {
162
+ type: "POST",
163
+ url: url,
164
+ params: mappingContext.query.parameters,
165
+ dataType: 'json',
166
+ processData: false,
167
+ contentType: "application/json; charset=UTF-8",
168
+ data: JSON.stringify(json),
169
+ crossDomain: false,
170
+ };
171
+ return params;
172
+ };
142
173
  AbstractDataServiceAdapter.prototype.saveChanges = function (saveContext, saveBundle) {
143
174
  var _this = this;
144
175
  var adapter = saveContext.adapter = this;
@@ -299,4 +330,4 @@ var DefaultChangeRequestInterceptor = /** @class */ (function () {
299
330
  };
300
331
  return DefaultChangeRequestInterceptor;
301
332
  }());
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGF0YS1zZXJ2aWNlLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL2Fic3RyYWN0LWRhdGEtc2VydmljZS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUtsQyxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEQ7OztFQUdFO0FBQ0Y7SUFBQTtRQTRKRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQXlCRztRQUNILDZCQUF3QixHQUFpQywrQkFBK0IsQ0FBQztRQTJDekYsdUJBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQztZQUMxQyxJQUFJLEVBQUUsTUFBTTtZQUVaLFNBQVMsRUFBRSxXQUFVLHVDQUF1QztnQkFDMUQsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQWhPQyxxQkFBcUI7SUFDckIsMERBQXFCLEdBQXJCLFVBQXNCLHdCQUE2QjtRQUNqRCxJQUFJLHdCQUF3QixDQUFDLGFBQWEsS0FBSyxNQUFNLElBQUksd0JBQXdCLENBQUMsU0FBUyxFQUFFO1lBQzNGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRCwrQ0FBVSxHQUFWO1FBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQWMsTUFBTSxDQUFHLENBQUM7UUFFakUsbUhBQW1IO1FBQ25ILElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUN2QyxPQUFPO1NBQ1I7UUFDRCxNQUFNLElB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QUMsU0FBUztnQkFDdEIsY0FBYyxFQUFFLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO2dCQUNqRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVM7Z0JBQ3RCLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtnQkFDNUIsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO2dCQUM1QixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07YUFDakIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxJQUFJLFdBQVcsSUFBSSxZQUFZLEVBQUU7UUFFL0IsSUFBSSxZQUFVLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUM7UUFDckcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDOUIsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxJQUFJLFlBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFDRixHQUEyQixDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7S0FDMUQ7SUFFRCxHQUFHLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxpR0FBaUcsQ0FBQztJQUMzSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFHRCwyRUFBMkU7QUFDM0U7SUFDRSx5Q0FBWSxXQUF3QixFQUFFLFVBQXNCO0lBRTVELENBQUM7SUFFRCxvREFBVSxHQUFWLFVBQVcsT0FBWSxFQUFFLE1BQWMsRUFBRSxLQUFhO1FBQ3BELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCw4Q0FBSSxHQUFKLFVBQUssUUFBa0I7SUFDdkIsQ0FBQztJQUNILHNDQUFDO0FBQUQsQ0FBQyxBQVhELElBV0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBFbnRpdHlRdWVyeSB9IGZyb20gJy4vZW50aXR5LXF1ZXJ5JztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VBZGFwdGVyLCBBamF4QWRhcHRlciwgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yQ3RvciwgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yIH0gZnJvbSAnLi9pbnRlcmZhY2UtcmVnaXN0cnknO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuL2VudGl0eS1hc3BlY3QnO1xyXG5pbXBvcnQgeyBNYXBwaW5nQ29udGV4dCB9IGZyb20gJy4vbWFwcGluZy1jb250ZXh0JztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2UsIEpzb25SZXN1bHRzQWRhcHRlciB9IGZyb20gJy4vZGF0YS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cFJlc3BvbnNlLCBTYXZlQ29udGV4dCwgU2F2ZUJ1bmRsZSwgU2VydmVyRXJyb3IsIFNhdmVSZXN1bHQsIFNhdmVFcnJvckZyb21TZXJ2ZXIsIFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9lbnRpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IE1ldGFkYXRhU3RvcmUgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gIFRoZSBjbGFzcyBpcyB1c2VkIGFzIHRoZSBiYXNlIGNsYXNzIGZvciBtb3N0IFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlblxyXG4qL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRhU2VydmljZUFkYXB0ZXIge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGRlY2xhcmUgXyRpbXBsPzogYW55O1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIGFkYXB0ZXIuICovXHJcbiAgZGVjbGFyZSBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBbW0lBamF4QWRhcHRlcl1dIHVzZWQgYnkgdGhpcyBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXS4gKi9cclxuICBkZWNsYXJlIGFqYXhJbXBsOiBBamF4QWRhcHRlcjtcclxuXHJcbiAgLy8gVE9ETyB1c2UgaW50ZXJmYWNlXHJcbiAgY2hlY2tGb3JSZWNvbXBvc2l0aW9uKGludGVyZmFjZUluaXRpYWxpemVkQXJnczogYW55KSB7XHJcbiAgICBpZiAoaW50ZXJmYWNlSW5pdGlhbGl6ZWRBcmdzLmludGVyZmFjZU5hbWUgPT09IFwiYWpheFwiICYmIGludGVyZmFjZUluaXRpYWxpemVkQXJncy5pc0RlZmF1bHQpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgdGhpcy5hamF4SW1wbCA9IGNvbmZpZy5nZXRBZGFwdGVySW5zdGFuY2U8QWpheEFkYXB0ZXI+KFwiYWpheFwiKSAhO1xyXG5cclxuICAgIC8vIGRvbid0IGNhY2hlICdhamF4JyBiZWNhdXNlIHRoZW4gd2Ugd291bGQgbmVlZCB0byBcIi5iaW5kXCIgaXQsIGFuZCBkb24ndCB3YW50IHRvIGJlY2F1c2Ugb2YgYnJvd2VyIHN1cHBvcnQgaXNzdWVzLlxyXG4gICAgaWYgKHRoaXMuYWpheEltcGwgJiYgdGhpcy5hamF4SW1wbC5hamF4KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBmaW5kIGFqYXggYWRhcHRlciBmb3IgZGF0YXNlcnZpY2UgYWRhcHRlciAnXCIgKyAodGhpcy5uYW1lIHx8ICcnKSArIFwiJy5cIik7XHJcbiAgfVxyXG5cclxuICBmZXRjaE1ldGFkYXRhKG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmUsIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSkge1xyXG4gICAgbGV0IHNlcnZpY2VOYW1lID0gZGF0YVNlcnZpY2Uuc2VydmljZU5hbWU7XHJcbiAgICBsZXQgdXJsID0gZGF0YVNlcnZpY2UucXVhbGlmeVVybChcIk1ldGFkYXRhXCIpO1xyXG5cclxuICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5hamF4SW1wbC5hamF4KHtcclxuICAgICAgICB0eXBlOiBcIkdFVFwiLFxyXG4gICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgc3VjY2VzczogKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSA9PiB7XHJcblxyXG4gICAgICAgICAgLy8gbWlnaHQgaGF2ZSBiZWVuIGZldGNoZWQgYnkgYW5vdGhlciBxdWVyeVxyXG4gICAgICAgICAgaWYgKG1ldGFkYXRhU3RvcmUuaGFzTWV0YWRhdGFGb3Ioc2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiYWxyZWFkeSBmZXRjaGVkXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGRhdGEgPSBodHRwUmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgIGxldCBtZXRhZGF0YTogYW55O1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbWV0YWRhdGEgPSB0eXBlb2YgKGRhdGEpID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGE7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhU3RvcmUuaW1wb3J0TWV0YWRhdGEobWV0YWRhdGEpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyTXNnID0gXCJVbmFibGUgdG8gZWl0aGVyIHBhcnNlIG9yIGltcG9ydCBtZXRhZGF0YTogXCIgKyBlLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSwgXCJNZXRhZGF0YSBxdWVyeSBmYWlsZWQgZm9yOiBcIiArIHVybCArIFwiLiBcIiArIGVyck1zZyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaW1wb3J0IG1heSBoYXZlIGJyb3VnaHQgaW4gdGhlIHNlcnZpY2UuXHJcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhU3RvcmUuaGFzTWV0YWRhdGFGb3Ioc2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhU3RvcmUuYWRkRGF0YVNlcnZpY2UoZGF0YVNlcnZpY2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlc29sdmUobWV0YWRhdGEpO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSwgXCJNZXRhZGF0YSBxdWVyeSBmYWlsZWQgZm9yOiBcIiArIHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuICBleGVjdXRlUXVlcnkobWFwcGluZ0NvbnRleHQ6IE1hcHBpbmdDb250ZXh0KSB7XHJcbiAgICBtYXBwaW5nQ29udGV4dC5hZGFwdGVyID0gdGhpcztcclxuICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2U8UXVlcnlSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbGV0IHVybCA9IG1hcHBpbmdDb250ZXh0LmdldFVybCgpO1xyXG5cclxuICAgICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgICB0eXBlOiBcIkdFVFwiLFxyXG4gICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgIHBhcmFtczogKG1hcHBpbmdDb250ZXh0LnF1ZXJ5IGFzIEVudGl0eVF1ZXJ5KS5wYXJhbWV0ZXJzLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBsZXQgZGF0YSA9IGh0dHBSZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJEYXRhOiBRdWVyeVJlc3VsdDtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBkYXRhICYmIChkYXRhLnJlc3VsdHMgfHwgZGF0YS5SZXN1bHRzKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtcclxuICAgICAgICAgICAgICByRGF0YSA9IHsgcmVzdWx0czogcmVzdWx0cywgaW5saW5lQ291bnQ6IGRhdGEuaW5saW5lQ291bnQgfHwgZGF0YS5JbmxpbmVDb3VudCwgXHJcbiAgICAgICAgICAgICAgICBodHRwUmVzcG9uc2U6IGh0dHBSZXNwb25zZSwgcXVlcnk6IG1hcHBpbmdDb250ZXh0LnF1ZXJ5IH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgckRhdGEgPSB7IHJlc3VsdHM6IGRhdGEsIGh0dHBSZXNwb25zZTogaHR0cFJlc3BvbnNlLCBxdWVyeTogbWFwcGluZ0NvbnRleHQucXVlcnkgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZShyRGF0YSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaGFuZGxlSHR0cEVycm9yKHJlamVjdCwgaHR0cFJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjcm9zc0RvbWFpbjogZmFsc2VcclxuICAgICAgfTtcclxuICAgICAgaWYgKG1hcHBpbmdDb250ZXh0LmRhdGFTZXJ2aWNlLnVzZUpzb25wKSB7XHJcbiAgICAgICAgcGFyYW1zLmRhdGFUeXBlID0gJ2pzb25wJztcclxuICAgICAgICBwYXJhbXMuY3Jvc3NEb21haW4gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYWpheEltcGwuYWpheChwYXJhbXMpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIHNhdmVDaGFuZ2VzKHNhdmVDb250ZXh0OiBTYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZTogU2F2ZUJ1bmRsZSkge1xyXG4gICAgbGV0IGFkYXB0ZXIgPSBzYXZlQ29udGV4dC5hZGFwdGVyID0gdGhpcztcclxuXHJcbiAgICBsZXQgc2F2ZUJ1bmRsZVNlciA9IGFkYXB0ZXIuX3ByZXBhcmVTYXZlQnVuZGxlKHNhdmVDb250ZXh0LCBzYXZlQnVuZGxlKTtcclxuICAgIGxldCBidW5kbGUgPSBKU09OLnN0cmluZ2lmeShzYXZlQnVuZGxlU2VyKTtcclxuXHJcbiAgICBsZXQgdXJsID0gc2F2ZUNvbnRleHQuZGF0YVNlcnZpY2UucXVhbGlmeVVybChzYXZlQ29udGV4dC5yZXNvdXJjZU5hbWUpO1xyXG4gICAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxTYXZlUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuYWpheEltcGwuYWpheCh7XHJcbiAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgZGF0YTogYnVuZGxlLFxyXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xyXG4gICAgICAgICAgaHR0cFJlc3BvbnNlLnNhdmVDb250ZXh0ID0gc2F2ZUNvbnRleHQ7XHJcbiAgICAgICAgICBsZXQgZGF0YSA9IGh0dHBSZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgaWYgKGRhdGEuRXJyb3JzIHx8IGRhdGEuZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgc2F2ZVJlc3VsdCA9IGFkYXB0ZXIuX3ByZXBhcmVTYXZlUmVzdWx0KHNhdmVDb250ZXh0LCBkYXRhKTtcclxuICAgICAgICAgICAgc2F2ZVJlc3VsdC5odHRwUmVzcG9uc2UgPSBodHRwUmVzcG9uc2U7XHJcbiAgICAgICAgICAgIHJlc29sdmUoc2F2ZVJlc3VsdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBodHRwUmVzcG9uc2Uuc2F2ZUNvbnRleHQgPSBzYXZlQ29udGV4dDtcclxuICAgICAgICAgIGhhbmRsZUh0dHBFcnJvcihyZWplY3QsIGh0dHBSZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwcm9taXNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFic3RyYWN0IG1ldGhvZCB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGluIGFueSBjb25jcmV0ZSBEYXRhU2VydmljZUFkYXB0ZXIgc3ViY2xhc3MuIFxyXG4gIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYSBzZXJpYWxpemFibGUgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIgYWZ0ZXIgY2FsbGluZyBKU09OLnN0cmluZ2lmeSBvbiBpdC5cclxuICAqL1xyXG4gIF9wcmVwYXJlU2F2ZUJ1bmRsZShzYXZlQ29udGV4dDogU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IFNhdmVCdW5kbGUpOiBhbnkge1xyXG4gICAgLy8gVGhlIGltcGxlbWVudG9yIHNob3VsZCBjYWxsIF9jcmVhdGVDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3JcclxuICAgIHRocm93IG5ldyBFcnJvcihcIk5lZWQgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBfcHJlcGFyZVNhdmVCdW5kbGVcIik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGEgXCJDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3JcIlxyXG4gIHRoYXQgY2FuIHR3ZWFrIHRoZSBzYXZlQnVuZGxlIGJvdGggYXMgaXQgaXMgYnVpbHQgYW5kIHdoZW4gaXQgaXMgY29tcGxldGVkXHJcbiAgYnkgYSBjb25jcmV0ZSBEYXRhU2VydmljZUFkYXBhdGVyLlxyXG5cclxuICBJbml0aWFsaXplZCB3aXRoIGEgZGVmYXVsdCwgbm8tb3AgaW1wbGVtZW50YXRpb24gdGhhdCBkZXZlbG9wZXJzIGNhbiByZXBsYWNlIHdpdGggYVxyXG4gIHN1YnN0YW50aXZlIGltcGxlbWVudGF0aW9uIHRoYXQgY2hhbmdlcyB0aGUgaW5kaXZpZHVhbCBlbnRpdHkgY2hhbmdlIHJlcXVlc3RzXHJcbiAgb3IgYXNwZWN0cyBvZiB0aGUgZW50aXJlICdzYXZlQnVuZGxlJyB3aXRob3V0IGhhdmluZyB0byB3cml0ZSB0aGVpciBvd24gRGF0YVNlcnZpY2UgYWRhcHRlcnMuXHJcbiAgPiAgICAgbGV0IGFkYXB0ZXIgPSBicmVlemUuY29uZmlnLmdldEFkYXB0ZXJJbnN0YW5jZSgnZGF0YVNlcnZpY2UnKTtcclxuICA+ICAgICBhZGFwdGVyLmNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvciA9IGZ1bmN0aW9uIChzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSkge1xyXG4gID4gICAgICAgICB0aGlzLmdldFJlcXVlc3QgPSBmdW5jdGlvbiAocmVxdWVzdCwgZW50aXR5LCBpbmRleCkge1xyXG4gID4gICAgICAgICAgICAvLyBhbHRlciB0aGUgcmVxdWVzdCB0aGF0IHRoZSBhZGFwdGVyIHByZXBhcmVkIGZvciB0aGlzIGVudGl0eVxyXG4gID4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgZW50aXR5LCBzYXZlQ29udGV4dCwgYW5kIHNhdmVCdW5kbGVcclxuICA+ICAgICAgICAgICAgLy8gZS5nLiwgYWRkIGEgY3VzdG9tIGhlYWRlciBvciBwcnVuZSB0aGUgb3JpZ2luYWxWYWx1ZXNNYXBcclxuICA+ICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgPiAgICAgICAgfTtcclxuICA+ICAgICAgICB0aGlzLmRvbmUgPSBmdW5jdGlvbiAocmVxdWVzdHMpIHtcclxuICA+ICAgICAgICAgICAgLy8gYWx0ZXIgdGhlIGFycmF5IG9mIHJlcXVlc3RzIHJlcHJlc2VudGluZyB0aGUgZW50aXJlIGNoYW5nZS1zZXRcclxuICA+ICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIHNhdmVDb250ZXh0IGFuZCBzYXZlQnVuZGxlXHJcbiAgPiAgICAgICAgfTtcclxuICA+ICAgICB9XHJcblxyXG4gIEBwYXJhbSBzYXZlQ29udGV4dCAtIFRoZSBCcmVlemVKUyBcImNvbnRleHRcIiBmb3IgdGhlIHNhdmUgb3BlcmF0aW9uLlxyXG4gIEBwYXJhbSBzYXZlQnVuZGxlIC0gQ29udGFpbnMgdGhlIGFycmF5IG9mIGVudGl0aWVzLXRvLWJlLXNhdmVkIChBS0EsIHRoZSBlbnRpdHkgY2hhbmdlLXNldCkuXHJcbiAgQHJldHVybiBDb25zdHJ1Y3RvciBmb3IgYSBcIkNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvclwiLlxyXG4gICoqL1xyXG4gIGNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcjogQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yQ3RvciA9IERlZmF1bHRDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3I7XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9jcmVhdGVDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3Ioc2F2ZUNvbnRleHQ6IFNhdmVDb250ZXh0LCBzYXZlQnVuZGxlOiBTYXZlQnVuZGxlKSB7XHJcbiAgICBsZXQgYWRhcHRlciA9IHNhdmVDb250ZXh0LmFkYXB0ZXIhO1xyXG4gICAgbGV0IGNyaSA9IGFkYXB0ZXIuY2hhbmdlUmVxdWVzdEludGVyY2VwdG9yO1xyXG4gICAgbGV0IGlzRm4gPSBjb3JlLmlzRnVuY3Rpb247XHJcblxyXG4gICAgaWYgKGlzRm4oY3JpKSkge1xyXG4gICAgICBsZXQgcHJlID0gYWRhcHRlci5uYW1lICsgXCIgRGF0YVNlcnZpY2VBZGFwdGVyJ3MgQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yXCI7XHJcbiAgICAgIGxldCBwb3N0ID0gXCIgaXMgbWlzc2luZyBvciBub3QgYSBmdW5jdGlvbi5cIjtcclxuICAgICAgbGV0IGludGVyY2VwdG9yID0gbmV3IGNyaShzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSk7XHJcbiAgICAgIGlmICghaXNGbihpbnRlcmNlcHRvci5nZXRSZXF1ZXN0KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcmUgKyAnLmdldFJlcXVlc3QnICsgcG9zdCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc0ZuKGludGVyY2VwdG9yLmRvbmUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByZSArICcuZG9uZScgKyBwb3N0KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3I7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbmV3IERlZmF1bHRDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3Ioc2F2ZUNvbnRleHQsIHNhdmVCdW5kbGUpIGFzIENoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBBYnN0cmFjdCBtZXRob2QgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBpbiBhbnkgY29uY3JldGUgRGF0YVNlcnZpY2VBZGFwdGVyIHN1YmxjbGFzcy4gXHJcbiAgVGhpcyBtZXRob2QgbmVlZHMgdG8gdGFrZSB0aGUgcmVzdWx0IHJldHVybmVkIHRoZSBzZXJ2ZXIgYW5kIGNvbnZlcnQgaXQgaW50byBhbiBJU2F2ZVJlc3VsdC4gXHJcbiAgKi9cclxuICBfcHJlcGFyZVNhdmVSZXN1bHQoc2F2ZUNvbnRleHQ6IFNhdmVDb250ZXh0LCBkYXRhOiBhbnkpOiBTYXZlUmVzdWx0IHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIk5lZWQgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBfcHJlcGFyZVNhdmVSZXN1bHRcIik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIFV0aWxpdHkgbWV0aG9kIHRoYXQgbWF5IGJlIHVzZWQgaW4gYW55IGNvbmNyZXRlIERhdGFTZXJ2aWNlQWRhcHRlciBzdWJsY2xhc3MgdG8gaGFuZGxlIGFueSBcclxuICBodHRwIGNvbm5lY3Rpb24gaXNzdWVzLiBcclxuICAqL1xyXG4gIC8vIFB1dCB0aGlzIGF0IHRoZSBib3R0b20gb2YgeW91ciBodHRwIGVycm9yIGFuYWx5c2lzXHJcbiAgc3RhdGljIF9jYXRjaE5vQ29ubmVjdGlvbkVycm9yKGVycjogU2VydmVyRXJyb3IpIHtcclxuICAgIGlmIChlcnIuc3RhdHVzID09PSAwICYmIGVyci5tZXNzYWdlID09IG51bGwpIHtcclxuICAgICAgZXJyLm1lc3NhZ2UgPSBcIkhUVFAgcmVzcG9uc2Ugc3RhdHVzIDAgYW5kIG5vIG1lc3NhZ2UuICBcIiArXHJcbiAgICAgICAgXCJMaWtlbHkgZGlkIG5vdCBvciBjb3VsZCBub3QgcmVhY2ggc2VydmVyLiBJcyB0aGUgc2VydmVyIHJ1bm5pbmc/XCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBqc29uUmVzdWx0c0FkYXB0ZXIgPSBuZXcgSnNvblJlc3VsdHNBZGFwdGVyKHtcclxuICAgIG5hbWU6IFwibm9vcFwiLFxyXG5cclxuICAgIHZpc2l0Tm9kZTogZnVuY3Rpb24gKC8qIG5vZGUsIG1hcHBpbmdDb250ZXh0LCBub2RlQ29udGV4dCAqLykge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUh0dHBFcnJvcihyZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQsIGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlLCBtZXNzYWdlUHJlZml4Pzogc3RyaW5nKSB7XHJcbiAgbGV0IGVyciA9IGNyZWF0ZUVycm9yKGh0dHBSZXNwb25zZSk7XHJcbiAgQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIuX2NhdGNoTm9Db25uZWN0aW9uRXJyb3IoZXJyKTtcclxuICBpZiAobWVzc2FnZVByZWZpeCkge1xyXG4gICAgZXJyLm1lc3NhZ2UgPSBtZXNzYWdlUHJlZml4ICsgXCI7IFwiICsgZXJyLm1lc3NhZ2U7XHJcbiAgfVxyXG4gIHJlamVjdChlcnIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVFcnJvcihodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xyXG4gIGxldCBlcnIgPSBuZXcgRXJyb3IoKSBhcyBTZXJ2ZXJFcnJvcjtcclxuICBlcnIuaHR0cFJlc3BvbnNlID0gaHR0cFJlc3BvbnNlO1xyXG4gIGVyci5zdGF0dXMgPSBodHRwUmVzcG9uc2Uuc3RhdHVzO1xyXG5cclxuICBsZXQgZXJyT2JqID0gaHR0cFJlc3BvbnNlLmRhdGE7XHJcblxyXG4gIGlmICghZXJyT2JqKSB7XHJcbiAgICBlcnIubWVzc2FnZSA9IGh0dHBSZXNwb25zZS5lcnJvciAmJiBodHRwUmVzcG9uc2UuZXJyb3IudG9TdHJpbmcoKTtcclxuICAgIHJldHVybiBlcnI7XHJcbiAgfVxyXG5cclxuICAvLyBzb21lIGFqYXggcHJvdmlkZXJzIHdpbGwgY29udmVydCBlcnJhbnQgcmVzdWx0IGludG8gYW4gb2JqZWN0IChhbmd1bGFyanMpLCBvdGhlcnMgd2lsbCBub3QgKGpRdWVyeSlcclxuICAvLyBpZiBub3QgZG8gaXQgaGVyZS5cclxuICBpZiAodHlwZW9mIGVyck9iaiA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgdHJ5IHtcclxuICAgICAgZXJyT2JqID0gSlNPTi5wYXJzZShlcnJPYmopO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBzb21ldGltZXMgaHR0cFJlc3BvbnNlLmRhdGEgaXMganVzdCB0aGUgZXJyb3IgbWVzc2FnZSBpdHNlbGZcclxuICAgICAgZXJyLm1lc3NhZ2UgPSBlcnJPYmo7XHJcbiAgICAgIHJldHVybiBlcnI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsZXQgc2F2ZUNvbnRleHQgPSBodHRwUmVzcG9uc2Uuc2F2ZUNvbnRleHQ7XHJcblxyXG4gIC8vIGlmIGFueSBvZiB0aGUgZm9sbG93IHByb3BlcnRpZXMgZXhpc3QgdGhlIHNvdXJjZSBpcyAuTkVUXHJcbiAgbGV0IHRtcCA9IGVyck9iai5NZXNzYWdlIHx8IGVyck9iai5FeGNlcHRpb25NZXNzYWdlIHx8IGVyck9iai5FbnRpdHlFcnJvcnMgfHwgZXJyT2JqLkVycm9ycztcclxuICBsZXQgaXNEb3ROZXQgPSAhIXRtcDtcclxuICBsZXQgbWVzc2FnZTogc3RyaW5nLCBlbnRpdHlFcnJvcnM6IGFueVtdO1xyXG4gIGlmICghaXNEb3ROZXQpIHtcclxuICAgIG1lc3NhZ2UgPSBlcnJPYmoubWVzc2FnZTtcclxuICAgIGVudGl0eUVycm9ycyA9IGVyck9iai5lcnJvcnMgfHwgZXJyT2JqLmVudGl0eUVycm9ycztcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IHRtcCA9IGVyck9iajtcclxuICAgIGRvIHtcclxuICAgICAgLy8gLk5FVCBleGNlcHRpb25zIGNhbiBwcm92aWRlIGJvdGggRXhjZXB0aW9uTWVzc2FnZSBhbmQgTWVzc2FnZSBidXQgRXhjZXB0aW9uTWV0aG9kIGlmIGl0XHJcbiAgICAgIC8vIGV4aXN0cyBoYXMgYSBtb3JlIGRldGFpbGVkIG1lc3NhZ2UuXHJcbiAgICAgIG1lc3NhZ2UgPSB0bXAuRXhjZXB0aW9uTWVzc2FnZSB8fCB0bXAuTWVzc2FnZTtcclxuICAgICAgdG1wID0gdG1wLklubmVyRXhjZXB0aW9uO1xyXG4gICAgfSB3aGlsZSAodG1wKTtcclxuICAgIC8vIC5FbnRpdHlFcnJvcnMgd2lsbCBvbmx5IG9jY3VyIGFzIGEgcmVzdWx0IG9mIGFuIEVudGl0eUVycm9yc0V4Y2VwdGlvbiBiZWluZyBkZWxpYmVyYXRlbHkgdGhyb3duIG9uIHRoZSBzZXJ2ZXJcclxuICAgIGVudGl0eUVycm9ycyA9IGVyck9iai5FcnJvcnMgfHwgZXJyT2JqLkVudGl0eUVycm9ycztcclxuICAgIGVudGl0eUVycm9ycyA9IGVudGl0eUVycm9ycyAmJiBlbnRpdHlFcnJvcnMubWFwKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZXJyb3JOYW1lOiBlLkVycm9yTmFtZSxcclxuICAgICAgICBlbnRpdHlUeXBlTmFtZTogTWV0YWRhdGFTdG9yZS5ub3JtYWxpemVUeXBlTmFtZShlLkVudGl0eVR5cGVOYW1lKSxcclxuICAgICAgICBrZXlWYWx1ZXM6IGUuS2V5VmFsdWVzLFxyXG4gICAgICAgIHByb3BlcnR5TmFtZTogZS5Qcm9wZXJ0eU5hbWUsXHJcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlLkVycm9yTWVzc2FnZSxcclxuICAgICAgICBjdXN0b206IGUuQ3VzdG9tXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlmIChzYXZlQ29udGV4dCAmJiBlbnRpdHlFcnJvcnMpIHtcclxuXHJcbiAgICBsZXQgcHJvcE5hbWVGbiA9IHNhdmVDb250ZXh0LmVudGl0eU1hbmFnZXIubWV0YWRhdGFTdG9yZS5uYW1pbmdDb252ZW50aW9uLnNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50O1xyXG4gICAgZW50aXR5RXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcclxuICAgICAgZS5wcm9wZXJ0eU5hbWUgPSBlLnByb3BlcnR5TmFtZSAmJiBwcm9wTmFtZUZuKGUucHJvcGVydHlOYW1lKTtcclxuICAgIH0pO1xyXG4gICAgKGVyciBhcyBTYXZlRXJyb3JGcm9tU2VydmVyKS5lbnRpdHlFcnJvcnMgPSBlbnRpdHlFcnJvcnM7XHJcbiAgfVxyXG5cclxuICBlcnIubWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJTZXJ2ZXIgc2lkZSBlcnJvcnMgZW5jb3VudGVyZWQgLSBzZWUgdGhlIGVudGl0eUVycm9ycyBjb2xsZWN0aW9uIG9uIHRoaXMgb2JqZWN0IGZvciBtb3JlIGRldGFpbFwiO1xyXG4gIHJldHVybiBlcnI7XHJcbn1cclxuXHJcblxyXG4vKiogVGhpcyBpcyBhIGRlZmF1bHQsIG5vLW9wIGltcGxlbWVudGF0aW9uIHRoYXQgZGV2ZWxvcGVycyBjYW4gcmVwbGFjZS4gKi9cclxuY2xhc3MgRGVmYXVsdENoYW5nZVJlcXVlc3RJbnRlcmNlcHRvciB7XHJcbiAgY29uc3RydWN0b3Ioc2F2ZUNvbnRleHQ6IFNhdmVDb250ZXh0LCBzYXZlQnVuZGxlOiBTYXZlQnVuZGxlKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UmVxdWVzdChyZXF1ZXN0OiBhbnksIGVudGl0eTogRW50aXR5LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gcmVxdWVzdDtcclxuICB9XHJcblxyXG4gIGRvbmUocmVxdWVzdHM6IE9iamVjdFtdKSB7XHJcbiAgfVxyXG59XHJcbiJdfQ==
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGF0YS1zZXJ2aWNlLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL2Fic3RyYWN0LWRhdGEtc2VydmljZS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUtsQyxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTlEOzs7RUFHRTtBQUNGO0lBQUE7UUE4TEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7V0F5Qkc7UUFDSCw2QkFBd0IsR0FBaUMsK0JBQStCLENBQUM7UUEyQ3pGLHVCQUFrQixHQUFHLElBQUksa0JBQWtCLENBQUM7WUFDMUMsSUFBSSxFQUFFLE1BQU07WUFFWixTQUFTLEVBQUUsV0FBVSx1Q0FBdUM7Z0JBQzFELE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFsUUMscUJBQXFCO0lBQ3JCLDBEQUFxQixHQUFyQixVQUFzQix3QkFBNkI7UUFDakQsSUFBSSx3QkFBd0IsQ0FBQyxhQUFhLEtBQUssTUFBTSxJQUFJLHdCQUF3QixDQUFDLFNBQVMsRUFBRTtZQUMzRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRUQsK0NBQVUsR0FBVjtRQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFjLE1BQU0sQ0FBRyxDQUFDO1FBRWpFLG1IQUFtSDtRQUNuSCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDdkMsT0FBTztTQUNSO1FB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TyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELDhDQUFJLEdBQUosVUFBSyxRQUFrQjtJQUN2QixDQUFDO0lBQ0gsc0NBQUM7QUFBRCxDQUFDLEFBWEQsSUFXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvcmUgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XHJcbmltcG9ydCB7IEVudGl0eVF1ZXJ5IH0gZnJvbSAnLi9lbnRpdHktcXVlcnknO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUFkYXB0ZXIsIEFqYXhBZGFwdGVyLCBDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3JDdG9yLCBDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3IgfSBmcm9tICcuL2ludGVyZmFjZS1yZWdpc3RyeSc7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IE1hcHBpbmdDb250ZXh0IH0gZnJvbSAnLi9tYXBwaW5nLWNvbnRleHQnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZSwgSnNvblJlc3VsdHNBZGFwdGVyIH0gZnJvbSAnLi9kYXRhLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdHRwUmVzcG9uc2UsIFNhdmVDb250ZXh0LCBTYXZlQnVuZGxlLCBTZXJ2ZXJFcnJvciwgU2F2ZVJlc3VsdCwgU2F2ZUVycm9yRnJvbVNlcnZlciwgUXVlcnlSZXN1bHQgfSBmcm9tICcuL2VudGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRW50aXR5VHlwZSwgTWV0YWRhdGFTdG9yZSB9IGZyb20gJy4vZW50aXR5LW1ldGFkYXRhJztcclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiAgVGhlIGNsYXNzIGlzIHVzZWQgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gaW1wbGVtZW50YXRpb25zXHJcbkBhZGFwdGVyIChzZWUgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuXHJcbiovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFTZXJ2aWNlQWRhcHRlciBpbXBsZW1lbnRzIERhdGFTZXJ2aWNlQWRhcHRlciB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgZGVjbGFyZSBfJGltcGw/OiBhbnk7XHJcbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgYWRhcHRlci4gKi9cclxuICBkZWNsYXJlIG5hbWU6IHN0cmluZztcclxuICAvKiogVGhlIFtbSUFqYXhBZGFwdGVyXV0gdXNlZCBieSB0aGlzIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dLiAqL1xyXG4gIGRlY2xhcmUgYWpheEltcGw6IEFqYXhBZGFwdGVyO1xyXG5cclxuICAvLyBUT0RPIHVzZSBpbnRlcmZhY2VcclxuICBjaGVja0ZvclJlY29tcG9zaXRpb24oaW50ZXJmYWNlSW5pdGlhbGl6ZWRBcmdzOiBhbnkpIHtcclxuICAgIGlmIChpbnRlcmZhY2VJbml0aWFsaXplZEFyZ3MuaW50ZXJmYWNlTmFtZSA9PT0gXCJhamF4XCIgJiYgaW50ZXJmYWNlSW5pdGlhbGl6ZWRBcmdzLmlzRGVmYXVsdCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemUoKSB7XHJcbiAgICB0aGlzLmFqYXhJbXBsID0gY29uZmlnLmdldEFkYXB0ZXJJbnN0YW5jZTxBamF4QWRhcHRlcj4oXCJhamF4XCIpICE7XHJcblxyXG4gICAgLy8gZG9uJ3QgY2FjaGUgJ2FqYXgnIGJlY2F1c2UgdGhlbiB3ZSB3b3VsZCBuZWVkIHRvIFwiLmJpbmRcIiBpdCwgYW5kIGRvbid0IHdhbnQgdG8gYmVjYXVzZSBvZiBicm93ZXIgc3VwcG9ydCBpc3N1ZXMuXHJcbiAgICBpZiAodGhpcy5hamF4SW1wbCAmJiB0aGlzLmFqYXhJbXBsLmFqYXgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgYWpheCBhZGFwdGVyIGZvciBkYXRhc2VydmljZSBhZGFwdGVyICdcIiArICh0aGlzLm5hbWUgfHwgJycpICsgXCInLlwiKTtcclxuICB9XHJcblxyXG4gIGZldGNoTWV0YWRhdGEobWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZSwgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlKSB7XHJcbiAgICBsZXQgc2VydmljZU5hbWUgPSBkYXRhU2VydmljZS5zZXJ2aWNlTmFtZTtcclxuICAgIGxldCB1cmwgPSBkYXRhU2VydmljZS5xdWFsaWZ5VXJsKFwiTWV0YWRhdGFcIik7XHJcblxyXG4gICAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICB0aGlzLmFqYXhJbXBsLmFqYXgoe1xyXG4gICAgICAgIHR5cGU6IFwiR0VUXCIsXHJcbiAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICBzdWNjZXNzOiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpID0+IHtcclxuXHJcbiAgICAgICAgICAvLyBtaWdodCBoYXZlIGJlZW4gZmV0Y2hlZCBieSBhbm90aGVyIHF1ZXJ5XHJcbiAgICAgICAgICBpZiAobWV0YWRhdGFTdG9yZS5oYXNNZXRhZGF0YUZvcihzZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJhbHJlYWR5IGZldGNoZWRcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgZGF0YSA9IGh0dHBSZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgbGV0IG1ldGFkYXRhOiBhbnk7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBtZXRhZGF0YSA9IHR5cGVvZiAoZGF0YSkgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKGRhdGEpIDogZGF0YTtcclxuICAgICAgICAgICAgbWV0YWRhdGFTdG9yZS5pbXBvcnRNZXRhZGF0YShtZXRhZGF0YSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJNc2cgPSBcIlVuYWJsZSB0byBlaXRoZXIgcGFyc2Ugb3IgaW1wb3J0IG1ldGFkYXRhOiBcIiArIGUubWVzc2FnZTtcclxuICAgICAgICAgICAgaGFuZGxlSHR0cEVycm9yKHJlamVjdCwgaHR0cFJlc3BvbnNlLCBcIk1ldGFkYXRhIHF1ZXJ5IGZhaWxlZCBmb3I6IFwiICsgdXJsICsgXCIuIFwiICsgZXJyTXNnKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBpbXBvcnQgbWF5IGhhdmUgYnJvdWdodCBpbiB0aGUgc2VydmljZS5cclxuICAgICAgICAgIGlmICghbWV0YWRhdGFTdG9yZS5oYXNNZXRhZGF0YUZvcihzZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgICAgICAgbWV0YWRhdGFTdG9yZS5hZGREYXRhU2VydmljZShkYXRhU2VydmljZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVzb2x2ZShtZXRhZGF0YSk7XHJcblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaGFuZGxlSHR0cEVycm9yKHJlamVjdCwgaHR0cFJlc3BvbnNlLCBcIk1ldGFkYXRhIHF1ZXJ5IGZhaWxlZCBmb3I6IFwiICsgdXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKiBFeGVjdXRlIHRoZSBxdWVyeSBpbiB0aGUgbWFwcGluZ0NvbnRleHQgdXNpbmcgdGhlIGFqYXhJbXBsLiAqL1xyXG4gIGV4ZWN1dGVRdWVyeShtYXBwaW5nQ29udGV4dDogTWFwcGluZ0NvbnRleHQpIHtcclxuICAgIG1hcHBpbmdDb250ZXh0LmFkYXB0ZXIgPSB0aGlzO1xyXG5cclxuICAgIGNvbnN0IHVzZVBvc3QgPSAobWFwcGluZ0NvbnRleHQucXVlcnkgYXMgRW50aXR5UXVlcnkpLnVzZVBvc3RFbmFibGVkO1xyXG4gICAgY29uc3QgcGFyYW1zID0gdXNlUG9zdCA/IHRoaXMuX21ha2VRdWVyeVBvc3RQYXJhbXMobWFwcGluZ0NvbnRleHQpIDogdGhpcy5fbWFrZVF1ZXJ5R2V0UGFyYW1zKG1hcHBpbmdDb250ZXh0KSBhcyBhbnk7XHJcblxyXG4gICAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxRdWVyeVJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBwYXJhbXMuc3VjY2VzcyA9IGZ1bmN0aW9uIChodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xyXG4gICAgICAgIGxldCBkYXRhID0gaHR0cFJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCByRGF0YTogUXVlcnlSZXN1bHQ7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0cyA9IGRhdGEgJiYgKGRhdGEucmVzdWx0cyB8fCBkYXRhLlJlc3VsdHMpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdHMpIHtcclxuICAgICAgICAgICAgckRhdGEgPSB7IHJlc3VsdHM6IHJlc3VsdHMsIGlubGluZUNvdW50OiBkYXRhLmlubGluZUNvdW50IHx8IGRhdGEuSW5saW5lQ291bnQsIFxyXG4gICAgICAgICAgICAgIGh0dHBSZXNwb25zZTogaHR0cFJlc3BvbnNlLCBxdWVyeTogbWFwcGluZ0NvbnRleHQucXVlcnkgfTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJEYXRhID0geyByZXN1bHRzOiBkYXRhLCBodHRwUmVzcG9uc2U6IGh0dHBSZXNwb25zZSwgcXVlcnk6IG1hcHBpbmdDb250ZXh0LnF1ZXJ5IH07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVzb2x2ZShyRGF0YSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBoYW5kbGVIdHRwRXJyb3IocmVqZWN0LCBodHRwUmVzcG9uc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgcGFyYW1zLmVycm9yID0gZnVuY3Rpb24gKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XHJcbiAgICAgICAgaGFuZGxlSHR0cEVycm9yKHJlamVjdCwgaHR0cFJlc3BvbnNlKTtcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5hamF4SW1wbC5hamF4KHBhcmFtcyk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBwcm9taXNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNldCB1cCBhamF4IHBhcmFtZXRlcnMgZm9yIHF1ZXJ5IEdFVC4gIFRoaXMgcHV0cyB0aGUgcXVlcnkgaW50byB0aGUgcmVxdWVzdCBxdWVyeXN0cmluZyBpbiBlaXRoZXIgSlNPTiBvciBPRGF0YS1zdHlsZSBzeW50YXgsIGRlcGVuZGluZyB1cG9uIHRoZSBVcmlCdWlsZGVyLiAqL1xyXG4gIF9tYWtlUXVlcnlHZXRQYXJhbXMobWFwcGluZ0NvbnRleHQ6IE1hcHBpbmdDb250ZXh0KSB7XHJcbiAgICBjb25zdCB1cmwgPSBtYXBwaW5nQ29udGV4dC5nZXRVcmwoKTtcclxuXHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgIHR5cGU6IFwiR0VUXCIsXHJcbiAgICAgIHVybDogdXJsLFxyXG4gICAgICBwYXJhbXM6IChtYXBwaW5nQ29udGV4dC5xdWVyeSBhcyBFbnRpdHlRdWVyeSkucGFyYW1ldGVycyxcclxuICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgY3Jvc3NEb21haW46IGZhbHNlLFxyXG4gICAgfTtcclxuICAgIGlmIChtYXBwaW5nQ29udGV4dC5kYXRhU2VydmljZS51c2VKc29ucCkge1xyXG4gICAgICBwYXJhbXMuZGF0YVR5cGUgPSAnanNvbnAnO1xyXG4gICAgICBwYXJhbXMuY3Jvc3NEb21haW4gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKiBTZXQgdXAgYWpheCBwYXJhbWV0ZXJzIGZvciBxdWVyeSBQT1NULiAgVGhpcyBwdXQgdGhlIHF1ZXJ5IGludG8gdGhlIHJlcXVlc3QgYm9keSBhcyBKU09OLiAqL1xyXG4gIF9tYWtlUXVlcnlQb3N0UGFyYW1zKG1hcHBpbmdDb250ZXh0OiBNYXBwaW5nQ29udGV4dCkge1xyXG4gICAgY29uc3QgZW50aXR5UXVlcnkgPSBtYXBwaW5nQ29udGV4dC5xdWVyeSBhcyBFbnRpdHlRdWVyeTtcclxuICAgIGNvbnN0IG1ldGFkYXRhU3RvcmUgPSBtYXBwaW5nQ29udGV4dC5lbnRpdHlNYW5hZ2VyLm1ldGFkYXRhU3RvcmU7XHJcbiAgICBjb25zdCB1cmwgPSBtYXBwaW5nQ29udGV4dC5kYXRhU2VydmljZS5xdWFsaWZ5VXJsKGVudGl0eVF1ZXJ5LnJlc291cmNlTmFtZSk7XHJcblxyXG4gICAgbGV0IGVudGl0eVR5cGUgPSBlbnRpdHlRdWVyeS5fZ2V0RnJvbUVudGl0eVR5cGUobWV0YWRhdGFTdG9yZSwgZmFsc2UpO1xyXG4gICAgaWYgKCFlbnRpdHlUeXBlKSB7IGVudGl0eVR5cGUgPSBuZXcgRW50aXR5VHlwZShtZXRhZGF0YVN0b3JlKTsgfVxyXG4gICAgY29uc3QganNvbiA9IGVudGl0eVF1ZXJ5LnRvSlNPTkV4dCh7IGVudGl0eVR5cGU6IGVudGl0eVR5cGUsIHRvTmFtZU9uU2VydmVyOiB0cnVlfSkgYXMgYW55O1xyXG4gICAganNvbi5mcm9tID0gdW5kZWZpbmVkO1xyXG4gICAganNvbi5xdWVyeU9wdGlvbnMgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgdXJsOiB1cmwsXHJcbiAgICAgIHBhcmFtczogKG1hcHBpbmdDb250ZXh0LnF1ZXJ5IGFzIEVudGl0eVF1ZXJ5KS5wYXJhbWV0ZXJzLFxyXG4gICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICBwcm9jZXNzRGF0YTogZmFsc2UsIC8vIGRvbid0IGxldCBKUXVlcnkgZm9ybS1lbmNvZGUgaXRcclxuICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOFwiLFxyXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShqc29uKSxcclxuICAgICAgY3Jvc3NEb21haW46IGZhbHNlLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG5cclxuICBzYXZlQ2hhbmdlcyhzYXZlQ29udGV4dDogU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IFNhdmVCdW5kbGUpIHtcclxuICAgIGxldCBhZGFwdGVyID0gc2F2ZUNvbnRleHQuYWRhcHRlciA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHNhdmVCdW5kbGVTZXIgPSBhZGFwdGVyLl9wcmVwYXJlU2F2ZUJ1bmRsZShzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSk7XHJcbiAgICBsZXQgYnVuZGxlID0gSlNPTi5zdHJpbmdpZnkoc2F2ZUJ1bmRsZVNlcik7XHJcblxyXG4gICAgbGV0IHVybCA9IHNhdmVDb250ZXh0LmRhdGFTZXJ2aWNlLnF1YWxpZnlVcmwoc2F2ZUNvbnRleHQucmVzb3VyY2VOYW1lKTtcclxuICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2U8U2F2ZVJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmFqYXhJbXBsLmFqYXgoe1xyXG4gICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIGRhdGE6IGJ1bmRsZSxcclxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICAgIGh0dHBSZXNwb25zZS5zYXZlQ29udGV4dCA9IHNhdmVDb250ZXh0O1xyXG4gICAgICAgICAgbGV0IGRhdGEgPSBodHRwUmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgIGlmIChkYXRhLkVycm9ycyB8fCBkYXRhLmVycm9ycykge1xyXG4gICAgICAgICAgICBoYW5kbGVIdHRwRXJyb3IocmVqZWN0LCBodHRwUmVzcG9uc2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHNhdmVSZXN1bHQgPSBhZGFwdGVyLl9wcmVwYXJlU2F2ZVJlc3VsdChzYXZlQ29udGV4dCwgZGF0YSk7XHJcbiAgICAgICAgICAgIHNhdmVSZXN1bHQuaHR0cFJlc3BvbnNlID0gaHR0cFJlc3BvbnNlO1xyXG4gICAgICAgICAgICByZXNvbHZlKHNhdmVSZXN1bHQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xyXG4gICAgICAgICAgaHR0cFJlc3BvbnNlLnNhdmVDb250ZXh0ID0gc2F2ZUNvbnRleHQ7XHJcbiAgICAgICAgICBoYW5kbGVIdHRwRXJyb3IocmVqZWN0LCBodHRwUmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKiBBYnN0cmFjdCBtZXRob2QgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBpbiBhbnkgY29uY3JldGUgRGF0YVNlcnZpY2VBZGFwdGVyIHN1YmNsYXNzLiBcclxuICBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGEgc2VyaWFsaXphYmxlIG9iamVjdCB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyIGFmdGVyIGNhbGxpbmcgSlNPTi5zdHJpbmdpZnkgb24gaXQuXHJcbiAgKi9cclxuICBfcHJlcGFyZVNhdmVCdW5kbGUoc2F2ZUNvbnRleHQ6IFNhdmVDb250ZXh0LCBzYXZlQnVuZGxlOiBTYXZlQnVuZGxlKTogYW55IHtcclxuICAgIC8vIFRoZSBpbXBsZW1lbnRvciBzaG91bGQgY2FsbCBfY3JlYXRlQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOZWVkIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgX3ByZXBhcmVTYXZlQnVuZGxlXCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBhIFwiQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yXCJcclxuICB0aGF0IGNhbiB0d2VhayB0aGUgc2F2ZUJ1bmRsZSBib3RoIGFzIGl0IGlzIGJ1aWx0IGFuZCB3aGVuIGl0IGlzIGNvbXBsZXRlZFxyXG4gIGJ5IGEgY29uY3JldGUgRGF0YVNlcnZpY2VBZGFwYXRlci5cclxuXHJcbiAgSW5pdGlhbGl6ZWQgd2l0aCBhIGRlZmF1bHQsIG5vLW9wIGltcGxlbWVudGF0aW9uIHRoYXQgZGV2ZWxvcGVycyBjYW4gcmVwbGFjZSB3aXRoIGFcclxuICBzdWJzdGFudGl2ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNoYW5nZXMgdGhlIGluZGl2aWR1YWwgZW50aXR5IGNoYW5nZSByZXF1ZXN0c1xyXG4gIG9yIGFzcGVjdHMgb2YgdGhlIGVudGlyZSAnc2F2ZUJ1bmRsZScgd2l0aG91dCBoYXZpbmcgdG8gd3JpdGUgdGhlaXIgb3duIERhdGFTZXJ2aWNlIGFkYXB0ZXJzLlxyXG4gID4gICAgIGxldCBhZGFwdGVyID0gYnJlZXplLmNvbmZpZy5nZXRBZGFwdGVySW5zdGFuY2UoJ2RhdGFTZXJ2aWNlJyk7XHJcbiAgPiAgICAgYWRhcHRlci5jaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3IgPSBmdW5jdGlvbiAoc2F2ZUNvbnRleHQsIHNhdmVCdW5kbGUpIHtcclxuICA+ICAgICAgICAgdGhpcy5nZXRSZXF1ZXN0ID0gZnVuY3Rpb24gKHJlcXVlc3QsIGVudGl0eSwgaW5kZXgpIHtcclxuICA+ICAgICAgICAgICAgLy8gYWx0ZXIgdGhlIHJlcXVlc3QgdGhhdCB0aGUgYWRhcHRlciBwcmVwYXJlZCBmb3IgdGhpcyBlbnRpdHlcclxuICA+ICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIGVudGl0eSwgc2F2ZUNvbnRleHQsIGFuZCBzYXZlQnVuZGxlXHJcbiAgPiAgICAgICAgICAgIC8vIGUuZy4sIGFkZCBhIGN1c3RvbSBoZWFkZXIgb3IgcHJ1bmUgdGhlIG9yaWdpbmFsVmFsdWVzTWFwXHJcbiAgPiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gID4gICAgICAgIH07XHJcbiAgPiAgICAgICAgdGhpcy5kb25lID0gZnVuY3Rpb24gKHJlcXVlc3RzKSB7XHJcbiAgPiAgICAgICAgICAgIC8vIGFsdGVyIHRoZSBhcnJheSBvZiByZXF1ZXN0cyByZXByZXNlbnRpbmcgdGhlIGVudGlyZSBjaGFuZ2Utc2V0XHJcbiAgPiAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBzYXZlQ29udGV4dCBhbmQgc2F2ZUJ1bmRsZVxyXG4gID4gICAgICAgIH07XHJcbiAgPiAgICAgfVxyXG5cclxuICBAcGFyYW0gc2F2ZUNvbnRleHQgLSBUaGUgQnJlZXplSlMgXCJjb250ZXh0XCIgZm9yIHRoZSBzYXZlIG9wZXJhdGlvbi5cclxuICBAcGFyYW0gc2F2ZUJ1bmRsZSAtIENvbnRhaW5zIHRoZSBhcnJheSBvZiBlbnRpdGllcy10by1iZS1zYXZlZCAoQUtBLCB0aGUgZW50aXR5IGNoYW5nZS1zZXQpLlxyXG4gIEByZXR1cm4gQ29uc3RydWN0b3IgZm9yIGEgXCJDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3JcIi5cclxuICAqKi9cclxuICBjaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3I6IENoYW5nZVJlcXVlc3RJbnRlcmNlcHRvckN0b3IgPSBEZWZhdWx0Q2hhbmdlUmVxdWVzdEludGVyY2VwdG9yO1xyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfY3JlYXRlQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yKHNhdmVDb250ZXh0OiBTYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZTogU2F2ZUJ1bmRsZSkge1xyXG4gICAgbGV0IGFkYXB0ZXIgPSBzYXZlQ29udGV4dC5hZGFwdGVyITtcclxuICAgIGxldCBjcmkgPSBhZGFwdGVyLmNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcjtcclxuICAgIGxldCBpc0ZuID0gY29yZS5pc0Z1bmN0aW9uO1xyXG5cclxuICAgIGlmIChpc0ZuKGNyaSkpIHtcclxuICAgICAgbGV0IHByZSA9IGFkYXB0ZXIubmFtZSArIFwiIERhdGFTZXJ2aWNlQWRhcHRlcidzIENoYW5nZVJlcXVlc3RJbnRlcmNlcHRvclwiO1xyXG4gICAgICBsZXQgcG9zdCA9IFwiIGlzIG1pc3Npbmcgb3Igbm90IGEgZnVuY3Rpb24uXCI7XHJcbiAgICAgIGxldCBpbnRlcmNlcHRvciA9IG5ldyBjcmkoc2F2ZUNvbnRleHQsIHNhdmVCdW5kbGUpO1xyXG4gICAgICBpZiAoIWlzRm4oaW50ZXJjZXB0b3IuZ2V0UmVxdWVzdCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJlICsgJy5nZXRSZXF1ZXN0JyArIHBvc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNGbihpbnRlcmNlcHRvci5kb25lKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcmUgKyAnLmRvbmUnICsgcG9zdCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGludGVyY2VwdG9yO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0Q2hhbmdlUmVxdWVzdEludGVyY2VwdG9yKHNhdmVDb250ZXh0LCBzYXZlQnVuZGxlKSBhcyBDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQWJzdHJhY3QgbWV0aG9kIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gYW55IGNvbmNyZXRlIERhdGFTZXJ2aWNlQWRhcHRlciBzdWJsY2xhc3MuIFxyXG4gIFRoaXMgbWV0aG9kIG5lZWRzIHRvIHRha2UgdGhlIHJlc3VsdCByZXR1cm5lZCB0aGUgc2VydmVyIGFuZCBjb252ZXJ0IGl0IGludG8gYW4gSVNhdmVSZXN1bHQuIFxyXG4gICovXHJcbiAgX3ByZXBhcmVTYXZlUmVzdWx0KHNhdmVDb250ZXh0OiBTYXZlQ29udGV4dCwgZGF0YTogYW55KTogU2F2ZVJlc3VsdCB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOZWVkIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgX3ByZXBhcmVTYXZlUmVzdWx0XCIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKiBVdGlsaXR5IG1ldGhvZCB0aGF0IG1heSBiZSB1c2VkIGluIGFueSBjb25jcmV0ZSBEYXRhU2VydmljZUFkYXB0ZXIgc3VibGNsYXNzIHRvIGhhbmRsZSBhbnkgXHJcbiAgaHR0cCBjb25uZWN0aW9uIGlzc3Vlcy4gXHJcbiAgKi9cclxuICAvLyBQdXQgdGhpcyBhdCB0aGUgYm90dG9tIG9mIHlvdXIgaHR0cCBlcnJvciBhbmFseXNpc1xyXG4gIHN0YXRpYyBfY2F0Y2hOb0Nvbm5lY3Rpb25FcnJvcihlcnI6IFNlcnZlckVycm9yKSB7XHJcbiAgICBpZiAoZXJyLnN0YXR1cyA9PT0gMCAmJiBlcnIubWVzc2FnZSA9PSBudWxsKSB7XHJcbiAgICAgIGVyci5tZXNzYWdlID0gXCJIVFRQIHJlc3BvbnNlIHN0YXR1cyAwIGFuZCBubyBtZXNzYWdlLiAgXCIgK1xyXG4gICAgICAgIFwiTGlrZWx5IGRpZCBub3Qgb3IgY291bGQgbm90IHJlYWNoIHNlcnZlci4gSXMgdGhlIHNlcnZlciBydW5uaW5nP1wiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAganNvblJlc3VsdHNBZGFwdGVyID0gbmV3IEpzb25SZXN1bHRzQWRhcHRlcih7XHJcbiAgICBuYW1lOiBcIm5vb3BcIixcclxuXHJcbiAgICB2aXNpdE5vZGU6IGZ1bmN0aW9uICgvKiBub2RlLCBtYXBwaW5nQ29udGV4dCwgbm9kZUNvbnRleHQgKi8pIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVIdHRwRXJyb3IocmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkLCBodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZSwgbWVzc2FnZVByZWZpeD86IHN0cmluZykge1xyXG4gIGxldCBlcnIgPSBjcmVhdGVFcnJvcihodHRwUmVzcG9uc2UpO1xyXG4gIEFic3RyYWN0RGF0YVNlcnZpY2VBZGFwdGVyLl9jYXRjaE5vQ29ubmVjdGlvbkVycm9yKGVycik7XHJcbiAgaWYgKG1lc3NhZ2VQcmVmaXgpIHtcclxuICAgIGVyci5tZXNzYWdlID0gbWVzc2FnZVByZWZpeCArIFwiOyBcIiArIGVyci5tZXNzYWdlO1xyXG4gIH1cclxuICByZWplY3QoZXJyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRXJyb3IoaHR0cFJlc3BvbnNlOiBIdHRwUmVzcG9uc2UpIHtcclxuICBsZXQgZXJyID0gbmV3IEVycm9yKCkgYXMgU2VydmVyRXJyb3I7XHJcbiAgZXJyLmh0dHBSZXNwb25zZSA9IGh0dHBSZXNwb25zZTtcclxuICBlcnIuc3RhdHVzID0gaHR0cFJlc3BvbnNlLnN0YXR1cztcclxuXHJcbiAgbGV0IGVyck9iaiA9IGh0dHBSZXNwb25zZS5kYXRhO1xyXG5cclxuICBpZiAoIWVyck9iaikge1xyXG4gICAgZXJyLm1lc3NhZ2UgPSBodHRwUmVzcG9uc2UuZXJyb3IgJiYgaHR0cFJlc3BvbnNlLmVycm9yLnRvU3RyaW5nKCk7XHJcbiAgICByZXR1cm4gZXJyO1xyXG4gIH1cclxuXHJcbiAgLy8gc29tZSBhamF4IHByb3ZpZGVycyB3aWxsIGNvbnZlcnQgZXJyYW50IHJlc3VsdCBpbnRvIGFuIG9iamVjdCAoYW5ndWxhcmpzKSwgb3RoZXJzIHdpbGwgbm90IChqUXVlcnkpXHJcbiAgLy8gaWYgbm90IGRvIGl0IGhlcmUuXHJcbiAgaWYgKHR5cGVvZiBlcnJPYmogPT09IFwic3RyaW5nXCIpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGVyck9iaiA9IEpTT04ucGFyc2UoZXJyT2JqKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gc29tZXRpbWVzIGh0dHBSZXNwb25zZS5kYXRhIGlzIGp1c3QgdGhlIGVycm9yIG1lc3NhZ2UgaXRzZWxmXHJcbiAgICAgIGVyci5tZXNzYWdlID0gZXJyT2JqO1xyXG4gICAgICByZXR1cm4gZXJyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGV0IHNhdmVDb250ZXh0ID0gaHR0cFJlc3BvbnNlLnNhdmVDb250ZXh0O1xyXG5cclxuICAvLyBpZiBhbnkgb2YgdGhlIGZvbGxvdyBwcm9wZXJ0aWVzIGV4aXN0IHRoZSBzb3VyY2UgaXMgLk5FVFxyXG4gIGxldCB0bXAgPSBlcnJPYmouTWVzc2FnZSB8fCBlcnJPYmouRXhjZXB0aW9uTWVzc2FnZSB8fCBlcnJPYmouRW50aXR5RXJyb3JzIHx8IGVyck9iai5FcnJvcnM7XHJcbiAgbGV0IGlzRG90TmV0ID0gISF0bXA7XHJcbiAgbGV0IG1lc3NhZ2U6IHN0cmluZywgZW50aXR5RXJyb3JzOiBhbnlbXTtcclxuICBpZiAoIWlzRG90TmV0KSB7XHJcbiAgICBtZXNzYWdlID0gZXJyT2JqLm1lc3NhZ2U7XHJcbiAgICBlbnRpdHlFcnJvcnMgPSBlcnJPYmouZXJyb3JzIHx8IGVyck9iai5lbnRpdHlFcnJvcnM7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCB0bXAgPSBlcnJPYmo7XHJcbiAgICBkbyB7XHJcbiAgICAgIC8vIC5ORVQgZXhjZXB0aW9ucyBjYW4gcHJvdmlkZSBib3RoIEV4Y2VwdGlvbk1lc3NhZ2UgYW5kIE1lc3NhZ2UgYnV0IEV4Y2VwdGlvbk1ldGhvZCBpZiBpdFxyXG4gICAgICAvLyBleGlzdHMgaGFzIGEgbW9yZSBkZXRhaWxlZCBtZXNzYWdlLlxyXG4gICAgICBtZXNzYWdlID0gdG1wLkV4Y2VwdGlvbk1lc3NhZ2UgfHwgdG1wLk1lc3NhZ2U7XHJcbiAgICAgIHRtcCA9IHRtcC5Jbm5lckV4Y2VwdGlvbjtcclxuICAgIH0gd2hpbGUgKHRtcCk7XHJcbiAgICAvLyAuRW50aXR5RXJyb3JzIHdpbGwgb25seSBvY2N1ciBhcyBhIHJlc3VsdCBvZiBhbiBFbnRpdHlFcnJvcnNFeGNlcHRpb24gYmVpbmcgZGVsaWJlcmF0ZWx5IHRocm93biBvbiB0aGUgc2VydmVyXHJcbiAgICBlbnRpdHlFcnJvcnMgPSBlcnJPYmouRXJyb3JzIHx8IGVyck9iai5FbnRpdHlFcnJvcnM7XHJcbiAgICBlbnRpdHlFcnJvcnMgPSBlbnRpdHlFcnJvcnMgJiYgZW50aXR5RXJyb3JzLm1hcChmdW5jdGlvbiAoZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGVycm9yTmFtZTogZS5FcnJvck5hbWUsXHJcbiAgICAgICAgZW50aXR5VHlwZU5hbWU6IE1ldGFkYXRhU3RvcmUubm9ybWFsaXplVHlwZU5hbWUoZS5FbnRpdHlUeXBlTmFtZSksXHJcbiAgICAgICAga2V5VmFsdWVzOiBlLktleVZhbHVlcyxcclxuICAgICAgICBwcm9wZXJ0eU5hbWU6IGUuUHJvcGVydHlOYW1lLFxyXG4gICAgICAgIGVycm9yTWVzc2FnZTogZS5FcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgY3VzdG9tOiBlLkN1c3RvbVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2F2ZUNvbnRleHQgJiYgZW50aXR5RXJyb3JzKSB7XHJcblxyXG4gICAgbGV0IHByb3BOYW1lRm4gPSBzYXZlQ29udGV4dC5lbnRpdHlNYW5hZ2VyLm1ldGFkYXRhU3RvcmUubmFtaW5nQ29udmVudGlvbi5zZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudDtcclxuICAgIGVudGl0eUVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGUucHJvcGVydHlOYW1lID0gZS5wcm9wZXJ0eU5hbWUgJiYgcHJvcE5hbWVGbihlLnByb3BlcnR5TmFtZSk7XHJcbiAgICB9KTtcclxuICAgIChlcnIgYXMgU2F2ZUVycm9yRnJvbVNlcnZlcikuZW50aXR5RXJyb3JzID0gZW50aXR5RXJyb3JzO1xyXG4gIH1cclxuXHJcbiAgZXJyLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwiU2VydmVyIHNpZGUgZXJyb3JzIGVuY291bnRlcmVkIC0gc2VlIHRoZSBlbnRpdHlFcnJvcnMgY29sbGVjdGlvbiBvbiB0aGlzIG9iamVjdCBmb3IgbW9yZSBkZXRhaWxcIjtcclxuICByZXR1cm4gZXJyO1xyXG59XHJcblxyXG5cclxuLyoqIFRoaXMgaXMgYSBkZWZhdWx0LCBuby1vcCBpbXBsZW1lbnRhdGlvbiB0aGF0IGRldmVsb3BlcnMgY2FuIHJlcGxhY2UuICovXHJcbmNsYXNzIERlZmF1bHRDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3Ige1xyXG4gIGNvbnN0cnVjdG9yKHNhdmVDb250ZXh0OiBTYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZTogU2F2ZUJ1bmRsZSkge1xyXG5cclxuICB9XHJcblxyXG4gIGdldFJlcXVlc3QocmVxdWVzdDogYW55LCBlbnRpdHk6IEVudGl0eSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgfVxyXG5cclxuICBkb25lKHJlcXVlc3RzOiBPYmplY3RbXSkge1xyXG4gIH1cclxufVxyXG4iXX0=