ets-fe-ng-sdk 1.0.80 → 1.0.82

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.
@@ -2,7 +2,6 @@ import { Injectable } from '@angular/core';
2
2
  import { HttpHeaders, HttpRequest, } from '@angular/common/http';
3
3
  import { lastValueFrom, Observable, throwError } from 'rxjs';
4
4
  import { catchError, map, retry, tap } from 'rxjs/operators';
5
- import { ETSenvironment } from '../../environments/environment';
6
5
  import * as i0 from "@angular/core";
7
6
  import * as i1 from "@angular/common/http";
8
7
  import * as i2 from "./cache/cache.service";
@@ -38,8 +37,11 @@ class ApiService {
38
37
  let headers = new HttpHeaders();
39
38
  for (const item of headers1.keys())
40
39
  headers = headers.set(item, headers1.get(item));
41
- for (const item of headers2.keys())
40
+ for (const item of headers2.keys()) {
41
+ if (headers.has(item))
42
+ headers.delete(item);
42
43
  headers = headers.set(item, headers2.get(item));
44
+ }
43
45
  return headers;
44
46
  };
45
47
  //#endregion
@@ -55,10 +57,6 @@ class ApiService {
55
57
  this.logRoutes('get', route, parameters);
56
58
  return new Observable((res) => {
57
59
  const query = route + this.getRequestParse(parameters);
58
- // if (this.cacheS.has(query)) {
59
- // res.next(this.cacheS.getItem<T>(route));
60
- // }
61
- const headers = new HttpHeaders(this.headers);
62
60
  this.http
63
61
  .get(query, {
64
62
  headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
@@ -85,23 +83,24 @@ class ApiService {
85
83
  });
86
84
  };
87
85
  this.getCodes = (route) => this.get(route).pipe(map((res) => this.sortCodes(res)));
88
- this.getText = (route, parameters) => this.get(route, parameters, {
86
+ this.getText = (route, parameters, extras) => this.get(route, parameters, {
89
87
  options: {
90
- headers: new HttpHeaders(this.headers),
88
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
91
89
  responseType: 'text',
92
90
  },
93
91
  });
94
- this.getFile = (route, parameters) => this.get(route, parameters, {
92
+ this.getFile = (route, parameters, extras) => this.get(route, parameters, {
95
93
  options: {
96
- headers: new HttpHeaders(this.headers),
94
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
97
95
  responseType: 'arrayBuffer',
98
96
  },
99
97
  });
100
98
  this.getWithBody = (route, body, extras) => {
101
99
  this.logRoutes('get', route);
102
100
  // debugger
103
- const req = new HttpRequest('GET', route, body, extras?.options || {
104
- headers: new HttpHeaders(this.headers),
101
+ const req = new HttpRequest('GET', route, body, {
102
+ ...extras?.options,
103
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
105
104
  responseType: 'json',
106
105
  });
107
106
  return this.http
@@ -152,26 +151,28 @@ class ApiService {
152
151
  : new HttpHeaders(this.headers);
153
152
  return this.http
154
153
  .delete(route, {
155
- headers,
156
154
  responseType: 'json',
157
155
  ...extras?.options,
156
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
158
157
  })
159
158
  .pipe(catchError(this.handleRequestError));
160
159
  };
161
- this.deleteWithBody = (route, body, options) => {
160
+ this.deleteWithBody = (route, body, extras) => {
162
161
  this.logRoutes('delete', route);
163
- const req = new HttpRequest('DELETE', route, body, options || {
164
- headers: new HttpHeaders(this.headers),
162
+ const req = new HttpRequest('DELETE', route, body, {
165
163
  responseType: 'json',
164
+ ...extras?.options,
165
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
166
166
  });
167
167
  return this.http
168
168
  .request(req)
169
169
  .pipe(catchError(this.handleRequestError));
170
170
  };
171
- this.deleteText = (route) => this.delete(route, {
171
+ this.deleteText = (route, extras) => this.delete(route, {
172
172
  options: {
173
- headers: new HttpHeaders(this.headers),
174
173
  responseType: 'text',
174
+ ...extras?.options,
175
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
175
176
  },
176
177
  });
177
178
  //#endregion
@@ -193,9 +194,9 @@ class ApiService {
193
194
  : new HttpHeaders(this.headers);
194
195
  return this.http
195
196
  .patch(encodeURI(route), body, {
196
- headers,
197
197
  responseType: 'json',
198
198
  ...extras?.options,
199
+ headers: this.concatenateHeaders(headers, extras?.options?.headers),
199
200
  })
200
201
  .pipe(catchError(this.handleRequestError));
201
202
  }
@@ -209,19 +210,18 @@ class ApiService {
209
210
  : new HttpHeaders(this.headers);
210
211
  return this.http
211
212
  .post(encodeURI(route), body, {
212
- headers,
213
213
  responseType: 'json',
214
214
  ...extras?.options,
215
+ headers: this.concatenateHeaders(headers, extras?.options?.headers),
215
216
  })
216
217
  .pipe(catchError(this.handleRequestError));
217
218
  }
218
219
  postFile(route, body, extras) {
219
220
  return this.post(route, body, {
220
- ...extras?.options,
221
221
  options: {
222
- headers: new HttpHeaders(this.fileHeaders),
223
222
  responseType: 'json',
224
223
  ...extras?.options,
224
+ headers: this.concatenateHeaders(new HttpHeaders(this.fileHeaders), extras?.options?.headers),
225
225
  },
226
226
  });
227
227
  }
@@ -234,7 +234,7 @@ class ApiService {
234
234
  });
235
235
  }
236
236
  postString(route, body, extras) {
237
- console.log('requestCount', ++ETSenvironment.requestCount);
237
+ // console.log('requestCount', ++ETSenvironment.requestCount);
238
238
  let headers = new HttpHeaders({
239
239
  'Content-Type': 'text/plain',
240
240
  });
@@ -242,10 +242,10 @@ class ApiService {
242
242
  ? headers.set('useEndorsement', 'true')
243
243
  : headers;
244
244
  return this.post(route, body, {
245
- ...extras?.options,
246
245
  options: {
247
- headers,
246
+ ...extras?.options,
248
247
  responseType: 'text',
248
+ headers: this.concatenateHeaders(headers, extras?.options?.headers),
249
249
  },
250
250
  });
251
251
  }
@@ -269,23 +269,13 @@ class ApiService {
269
269
  });
270
270
  }
271
271
  getRequestParse(parameters) {
272
- // const nbody = new URLSearchParams();
273
- // for (const key in parameters) {
274
- // if (Object.prototype.hasOwnProperty.call(parameters, key)) {
275
- // const element = parameters[key];
276
- // if (element != null) nbody.set(key, element + '');
277
- // }
278
- // }
279
- // const str = nbody.toString();
280
- // if(parameters)
281
- // debugger;
282
- if (!parameters)
283
- return '';
284
- return ('?' +
285
- Object.keys(parameters)
286
- .filter((key) => parameters[key]?.toString()?.trim() != null)
287
- .map((key) => `${key}=${parameters[key]?.toString()?.trim()}`)
288
- .join('&'));
272
+ return !parameters
273
+ ? ''
274
+ : '?' +
275
+ Object.keys(parameters)
276
+ .filter((key) => parameters[key]?.toString()?.trim() != null)
277
+ .map((key) => `${key}=${parameters[key]?.toString()?.trim()}`)
278
+ .join('&');
289
279
  }
290
280
  //#endregion
291
281
  //#region PUT
@@ -301,9 +291,9 @@ class ApiService {
301
291
  : new HttpHeaders(this.headers);
302
292
  return this.http
303
293
  .put(query, nbody, {
304
- headers,
305
294
  responseType: 'json',
306
295
  ...extras?.options,
296
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
307
297
  })
308
298
  .pipe(catchError(this.handleRequestError));
309
299
  }
@@ -317,4 +307,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.3", ngImpor
317
307
  providedIn: 'root',
318
308
  }]
319
309
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.CacheService }, { type: i3.LocalCacheService }]; } });
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ldHMtZmUtbmctc2RrL3NyYy9saWIvU2VydmljZXMvYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0wsV0FBVyxFQUNYLFdBQVcsR0FDWixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBTyxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7OztBQVNoRSxNQUdhLFVBQVU7SUFFckIsSUFBWSxPQUFPO1FBQ2pCLE9BQU87WUFDTCxjQUFjLEVBQUUsa0JBQWtCO1NBQ25DLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBWSxXQUFXO1FBQ3JCLE9BQU87WUFDTCxPQUFPLEVBQUUscUJBQXFCO1NBQy9CLENBQUM7SUFDSixDQUFDO0lBRUQsWUFDUyxJQUFnQixFQUNoQixNQUFvQixFQUNwQixPQUEwQjtRQUYxQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFmM0IsZUFBVSxHQUFHLENBQUMsQ0FBQztRQVdmLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFnQmYsdUJBQWtCLEdBQUcsQ0FBQyxHQUFzQixFQUFFLEVBQUU7WUFDdEQsSUFBSSxPQUFPLENBQUM7WUFDWixJQUFJLEdBQUcsRUFBRSxLQUFLLFlBQVksV0FBVztnQkFDbkMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFD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SEFBVixVQUFVLGNBRlQsTUFBTTs7U0FFUCxVQUFVOzJGQUFWLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSHR0cENsaWVudCxcbiAgSHR0cEVycm9yUmVzcG9uc2UsXG4gIEh0dHBIZWFkZXJzLFxuICBIdHRwUmVxdWVzdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaWlmLCBsYXN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHJldHJ5LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJQ29kZURlc2NyaXB0aW9uLCBJQ29kZVRpdGxlIH0gZnJvbSAnLi4vU2hhcmVkL21vZGVscy9pbmRleC5tb2RlbCc7XG5pbXBvcnQgeyBFVFNlbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBDYWNoZVNlcnZpY2UgfSBmcm9tICcuL2NhY2hlL2NhY2hlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxDYWNoZVNlcnZpY2UgfSBmcm9tICcuL2NhY2hlL2xvY2FsLWNhY2hlLnNlcnZpY2UnO1xuZXhwb3J0IGludGVyZmFjZSBJUmVzcG9uc2Uge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlc3VsdDogYW55O1xuICBzdGF0dXM6ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnZmFpbHVyZSc7XG4gIHN0YXR1c0NvZGU6ICdTTTAwMCcgfCAnU00wMDEnIHwgJ1NNMDAyJyB8ICdTTTAwMyc7XG59XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZSB7XG4gIHByaXZhdGUgc2hvd1JvdXRlcyA9IDA7XG4gIHByaXZhdGUgZ2V0IGhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIGdldCBmaWxlSGVhZGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5jdHlwZTogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSByZXRyeUNvdW50ID0gMDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHVibGljIGNhY2hlUzogQ2FjaGVTZXJ2aWNlLFxuICAgIHB1YmxpYyBsQ2FjaGVTOiBMb2NhbENhY2hlU2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBsb2dSb3V0ZXMoXG4gICAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdwdXQnIHwgJ2RlbGV0ZScsXG4gICAgcm91dGUsXG4gICAgLi4uZXh0cmFzXG4gICkge1xuICAgIGlmICh0aGlzLnNob3dSb3V0ZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKG1ldGhvZCwgcm91dGUsIC4uLmV4dHJhcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFuZGxlUmVxdWVzdEVycm9yID0gKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBpZiAoZXJyPy5lcnJvciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVxuICAgICAgbWVzc2FnZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoZXJyPy5lcnJvcikpO1xuICAgIHJldHVybiB0aHJvd0Vycm9yKG1lc3NhZ2UgfHwgZXJyPy5lcnJvcj8ubWVzc2FnZSk7XG4gIH07XG4gIHByaXZhdGUgY29uY2F0ZW5hdGVIZWFkZXJzID0gKFxuICAgIGhlYWRlcnMxOiBIdHRwSGVhZGVycyxcbiAgICBoZWFkZXJzMjogSHR0cEhlYWRlcnNcbiAgKTogSHR0cEhlYWRlcnMgPT4ge1xuICAgIGlmICghaGVhZGVyczEpIHJldHVybiBoZWFkZXJzMjtcbiAgICBlbHNlIGlmICghaGVhZGVyczIpIHJldHVybiBoZWFkZXJzMTtcblxuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGhlYWRlcnMxLmtleXMoKSlcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChpdGVtLCBoZWFkZXJzMS5nZXQoaXRlbSkpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBoZWFkZXJzMi5rZXlzKCkpXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoaXRlbSwgaGVhZGVyczIuZ2V0KGl0ZW0pKTtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfTtcblxuICAvLyNyZWdpb24gUEFUQ0hcbiAgcGF0Y2g8VCA9IGFueT4ocm91dGU6IHN0cmluZywgYm9keT8sIGV4dHJhcz86IElFeHRyYXMpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICB0aGlzLmxvZ1JvdXRlcygncG9zdCcsIHJvdXRlLCBib2R5KTtcbiAgICBjb25zb2xlLmxvZyhib2R5KTtcbiAgICBsZXQgaGVhZGVycyA9IGV4dHJhcz8udXNlRW5kb3JzZW1lbnRcbiAgICAgID8gbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycykuc2V0KCd1c2VFbmRvcnNlbWVudCcsICd0cnVlJylcbiAgICAgIDogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBhdGNoKGVuY29kZVVSSShyb3V0ZSksIGJvZHksIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgIC4uLmV4dHJhcz8ub3B0aW9ucyxcbiAgICAgIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlUmVxdWVzdEVycm9yKSkgYXMgT2JzZXJ2YWJsZTxhbnk+O1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICAvLyNyZWdpb24gUE9TVFxuICBwb3N0PFQgPSBhbnk+KHJvdXRlOiBzdHJpbmcsIGJvZHk/LCBleHRyYXM/OiBJRXh0cmFzKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgdGhpcy5sb2dSb3V0ZXMoJ3Bvc3QnLCByb3V0ZSwgYm9keSk7XG4gICAgY29uc29sZS5sb2coYm9keSk7XG4gICAgbGV0IGhlYWRlcnMgPSBleHRyYXM/LnVzZUVuZG9yc2VtZW50XG4gICAgICA/IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpLnNldCgndXNlRW5kb3JzZW1lbnQnLCAndHJ1ZScpXG4gICAgICA6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoZW5jb2RlVVJJKHJvdXRlKSwgYm9keSwge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgLi4uZXh0cmFzPy5vcHRpb25zLFxuICAgICAgfSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVSZXF1ZXN0RXJyb3IpKSBhcyBPYnNlcnZhYmxlPGFueT47XG4gIH1cbiAgcG9zdEZpbGU8VCA9IGFueT4ocm91dGU6IHN0cmluZywgYm9keTogRm9ybURhdGEsIGV4dHJhcz86IElFeHRyYXMpIHtcbiAgICByZXR1cm4gdGhpcy5wb3N0PFQ+KHJvdXRlLCBib2R5LCB7XG4gICAgICAuLi5leHRyYXM/Lm9wdGlvbnMsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmZpbGVIZWFkZXJzKSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgIC4uLmV4dHJhcz8ub3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgcG9zdEZpbGVXaXRoRW5kb3JzZW1lbnQ8VCA9IGFueT4ocm91dGU6IHN0cmluZywgYm9keTogRm9ybURhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5wb3N0PFQ+KHJvdXRlLCBib2R5LCB7XG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmZpbGVIZWFkZXJzKS5zZXQoXG4gICAgICAgICAgJ3VzZUVuZG9yc2VtZW50JyxcbiAgICAgICAgICAndHJ1ZSdcbiAgICAgICAgKSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIHBvc3RTdHJpbmcocm91dGU6IHN0cmluZywgYm9keT8sIGV4dHJhcz86IElFeHRyYXMpIHtcbiAgICBjb25zb2xlLmxvZygncmVxdWVzdENvdW50JywgKytFVFNlbnZpcm9ubWVudC5yZXF1ZXN0Q291bnQpO1xuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbicsXG4gICAgfSk7XG4gICAgaGVhZGVycyA9IGV4dHJhcz8udXNlRW5kb3JzZW1lbnRcbiAgICAgID8gaGVhZGVycy5zZXQoJ3VzZUVuZG9yc2VtZW50JywgJ3RydWUnKVxuICAgICAgOiBoZWFkZXJzO1xuICAgIHJldHVybiB0aGlzLnBvc3Q8c3RyaW5nPihyb3V0ZSwgYm9keSwge1xuICAgICAgLi4uZXh0cmFzPy5vcHRpb25zLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgcG9zdFN0cmluZ1dpdGhMb2NhbENhY2hlKHJvdXRlOiBzdHJpbmcsIGJvZHk6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChyZXMpID0+IHtcbiAgICAgIGNvbnN0IGJkeSA9IGJvZHk/LnRyaW0oKTtcbiAgICAgIC8vIGRlYnVnZ2VyXG4gICAgICBpZiAodGhpcy5sQ2FjaGVTLmhhcyhyb3V0ZSArICdfJyArIGJkeSkpIHtcbiAgICAgICAgcmVzLm5leHQodGhpcy5sQ2FjaGVTLmdldEl0ZW08c3RyaW5nPihyb3V0ZSArICdfJyArIGJkeSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvc3RTdHJpbmcocm91dGUsIGJkeSlcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgcmVzLm5leHQocik7XG4gICAgICAgICAgdGhpcy5sQ2FjaGVTLnNldEl0ZW0ocm91dGUgKyAnXycgKyBiZHksIHIpO1xuICAgICAgICAgIHJlcy5jb21wbGV0ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICByZXMuZXJyb3IoZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBHRVRcbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBHRVQgcmVxdWVzdFxuICAgKiBAcGFyYW0gcm91dGUgQVBJIGVuZHBvaW50XG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9iamVjdCB0byBjb252ZXJ0IGludG8gcXVlcnlwYXJhbXNcbiAgICogQHBhcmFtIGV4dHJhcyBFeHRyYSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldCA9IDxUID0gYW55PihcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM/OiB7IFtmaWVsZDogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB9LFxuICAgIGV4dHJhcz86IElFeHRyYXNcbiAgKTogT2JzZXJ2YWJsZTxUPiA9PiB7XG4gICAgdGhpcy5sb2dSb3V0ZXMoJ2dldCcsIHJvdXRlLCBwYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHJlcykgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSByb3V0ZSArIHRoaXMuZ2V0UmVxdWVzdFBhcnNlKHBhcmFtZXRlcnMpO1xuICAgICAgLy8gaWYgKHRoaXMuY2FjaGVTLmhhcyhxdWVyeSkpIHtcbiAgICAgIC8vICAgcmVzLm5leHQodGhpcy5jYWNoZVMuZ2V0SXRlbTxUPihyb3V0ZSkpO1xuICAgICAgLy8gfVxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpO1xuXG4gICAgICB0aGlzLmh0dHBcbiAgICAgICAgLmdldChxdWVyeSwge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuY29uY2F0ZW5hdGVIZWFkZXJzKFxuICAgICAgICAgICAgbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICAgICAgICBleHRyYXM/Lm9wdGlvbnM/LmhlYWRlcnNcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgICAgICAgIC4uLmV4dHJhcz8ub3B0aW9ucyxcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgcmV0cnkodGhpcy5yZXRyeUNvdW50KSxcbiAgICAgICAgICB0YXAoKHgpID0+ICh0aGlzLnNob3dSb3V0ZXMgPyBjb25zb2xlLmxvZyh4KSA6IG51bGwpKSxcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKVxuICAgICAgICAgICAgICBpZiAocmVzWzBdPy5jb2RlKSByZXR1cm4gcmVzLnNvcnQoKS5zb3J0MignY29kZScsIHRydWUpO1xuICAgICAgICAgICAgICBlbHNlIGlmIChyZXNbMF0/LmNvbHVtbk5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5zb3J0KCkuc29ydDIoJ2NvbHVtbk5hbWUnLCB0cnVlKTtcbiAgICAgICAgICAgICAgZWxzZSByZXR1cm4gcmVzLnNvcnQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcilcbiAgICAgICAgKVxuICAgICAgICAudG9Qcm9taXNlKClcbiAgICAgICAgLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICByZXMubmV4dChyKTtcbiAgICAgICAgICB0aGlzLmNhY2hlUy5zZXRJdGVtKHF1ZXJ5LCByKTtcbiAgICAgICAgICByZXMuY29tcGxldGUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHJlcy5lcnJvcihlcnIpKTtcbiAgICB9KTtcbiAgfTtcblxuICBnZXRDb2RlcyA9IDxUID0gSUNvZGVUaXRsZSAmIElDb2RlRGVzY3JpcHRpb24+KHJvdXRlOiBzdHJpbmcpID0+XG4gICAgdGhpcy5nZXQ8VFtdPihyb3V0ZSkucGlwZShtYXAoKHJlcykgPT4gdGhpcy5zb3J0Q29kZXMocmVzKSkpO1xuXG4gIGdldFRleHQgPSA8VCA9IHN0cmluZz4oXG4gICAgcm91dGU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzPzogeyBbZmllbGQ6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfVxuICApID0+XG4gICAgdGhpcy5nZXQ8VD4ocm91dGUsIHBhcmFtZXRlcnMsIHtcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgZ2V0RmlsZSA9IDxUID0gc3RyaW5nPihcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM/OiB7IFtmaWVsZDogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB9XG4gICkgPT5cbiAgICB0aGlzLmdldDxUPihyb3V0ZSwgcGFyYW1ldGVycywge1xuICAgICAgb3B0aW9uczoge1xuICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlCdWZmZXInLFxuICAgICAgfSxcbiAgICB9KTtcbiAgZ2V0V2l0aEJvZHkgPSA8VCA9IGFueT4ocm91dGU6IHN0cmluZywgYm9keT86IGFueSwgZXh0cmFzPzogSUV4dHJhcykgPT4ge1xuICAgIHRoaXMubG9nUm91dGVzKCdnZXQnLCByb3V0ZSk7XG4gICAgLy8gZGVidWdnZXJcbiAgICBjb25zdCByZXEgPSBuZXcgSHR0cFJlcXVlc3QoXG4gICAgICAnR0VUJyxcbiAgICAgIHJvdXRlLFxuICAgICAgYm9keSxcbiAgICAgIGV4dHJhcz8ub3B0aW9ucyB8fCB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5yZXF1ZXN0PFQ+KHJlcSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVSZXF1ZXN0RXJyb3IpKSBhcyBPYnNlcnZhYmxlPFQ+O1xuICB9O1xuXG4gIGdldEZyb21sb2NhbCA9IDxUID0gYW55PihcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM/OiBPYmplY3QsXG4gICAgZXh0cmFzPzogSUV4dHJhc1xuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHJlcykgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSByb3V0ZSArIHRoaXMuZ2V0UmVxdWVzdFBhcnNlKHBhcmFtZXRlcnMpO1xuICAgICAgaWYgKHRoaXMubENhY2hlUy5oYXMocXVlcnkpKSB7XG4gICAgICAgIHJlcy5uZXh0KHRoaXMubENhY2hlUy5nZXRJdGVtPFQ+KHF1ZXJ5KSk7XG4gICAgICAgIHJlcy5jb21wbGV0ZSgpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5nZXQocXVlcnksIG51bGwsIGV4dHJhcykpLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAvLyBpZiAoIXRoaXMuY1MuaGFzKHJvdXRlKSlcbiAgICAgICAgICByZXMubmV4dChyKTtcbiAgICAgICAgICB0aGlzLmxDYWNoZVMuc2V0SXRlbShxdWVyeSwgcik7XG4gICAgICAgICAgcmVzLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICBnZXRXaXRoTG9jYWxDYWNoZSA9IDxUID0gYW55PihcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM/OiBPYmplY3QsXG4gICAgZXh0cmFzPzogSUV4dHJhc1xuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHJlcykgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSByb3V0ZSArIHRoaXMuZ2V0UmVxdWVzdFBhcnNlKHBhcmFtZXRlcnMpO1xuICAgICAgaWYgKHRoaXMubENhY2hlUy5oYXMocXVlcnkpKSB7XG4gICAgICAgIHJlcy5uZXh0KHRoaXMubENhY2hlUy5nZXRJdGVtPFQ+KHF1ZXJ5KSk7XG4gICAgICB9XG4gICAgICBsYXN0VmFsdWVGcm9tKHRoaXMuZ2V0KHF1ZXJ5LCBudWxsLCBleHRyYXMpKVxuICAgICAgICAudGhlbigocikgPT4ge1xuICAgICAgICAgIC8vIGlmICghdGhpcy5jUy5oYXMocm91dGUpKVxuICAgICAgICAgIHJlcy5uZXh0KHIpO1xuICAgICAgICAgIHRoaXMubENhY2hlUy5zZXRJdGVtKHF1ZXJ5LCByKTtcbiAgICAgICAgICByZXMuY29tcGxldGUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgcmVzLmVycm9yKGUpO1xuICAgICAgICAgIHJlcy5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgZ2V0UmVxdWVzdFBhcnNlKHBhcmFtZXRlcnM/OiBPYmplY3QpIHtcbiAgICAvLyBjb25zdCBuYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAvLyBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbWV0ZXJzKSB7XG4gICAgLy8gICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtZXRlcnMsIGtleSkpIHtcbiAgICAvLyAgICAgY29uc3QgZWxlbWVudCA9IHBhcmFtZXRlcnNba2V5XTtcbiAgICAvLyAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgbmJvZHkuc2V0KGtleSwgZWxlbWVudCArICcnKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgLy8gY29uc3Qgc3RyID0gbmJvZHkudG9TdHJpbmcoKTtcbiAgICAvLyBpZihwYXJhbWV0ZXJzKVxuICAgIC8vIGRlYnVnZ2VyO1xuICAgIGlmICghcGFyYW1ldGVycykgcmV0dXJuICcnO1xuICAgIHJldHVybiAoXG4gICAgICAnPycgK1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1ldGVycylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBwYXJhbWV0ZXJzW2tleV0/LnRvU3RyaW5nKCk/LnRyaW0oKSAhPSBudWxsKVxuICAgICAgICAubWFwKChrZXkpID0+IGAke2tleX09JHtwYXJhbWV0ZXJzW2tleV0/LnRvU3RyaW5nKCk/LnRyaW0oKX1gKVxuICAgICAgICAuam9pbignJicpXG4gICAgKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUFVUXG4gIHB1dDxUID0gYW55Pihyb3V0ZTogc3RyaW5nLCBib2R5PywgZXh0cmFzPzogSUV4dHJhcyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHRoaXMubG9nUm91dGVzKCdwdXQnLCByb3V0ZSwgYm9keSk7XG4gICAgbGV0IHF1ZXJ5ID0gcm91dGUgKyAnJyxcbiAgICAgIG5ib2R5ID0gYm9keTtcbiAgICBpZiAoZXh0cmFzPy5yZXF1ZXN0VHlwZSA9PSAncXVlcnlQYXJhbXMnKSB7XG4gICAgICBxdWVyeSArPSB0aGlzLmdldFJlcXVlc3RQYXJzZShib2R5KTtcbiAgICAgIG5ib2R5ID0gbnVsbDtcbiAgICB9XG4gICAgbGV0IGhlYWRlcnMgPSBleHRyYXM/LnVzZUVuZG9yc2VtZW50XG4gICAgICA/IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpLnNldCgndXNlRW5kb3JzZW1lbnQnLCAndHJ1ZScpXG4gICAgICA6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wdXQocXVlcnksIG5ib2R5LCB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgICAgICAuLi5leHRyYXM/Lm9wdGlvbnMsXG4gICAgICB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcikpIGFzIE9ic2VydmFibGU8YW55PjtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gREVMRVRFXG4gIGRlbGV0ZSA9IDxUID0gYW55Pihyb3V0ZTogc3RyaW5nLCBleHRyYXM/OiBJRXh0cmFzKSA9PiB7XG4gICAgdGhpcy5sb2dSb3V0ZXMoJ2RlbGV0ZScsIHJvdXRlKTtcblxuICAgIGxldCBoZWFkZXJzID0gZXh0cmFzPy51c2VFbmRvcnNlbWVudFxuICAgICAgPyBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKS5zZXQoJ3VzZUVuZG9yc2VtZW50JywgJ3RydWUnKVxuICAgICAgOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZGVsZXRlPFQ+KHJvdXRlLCB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgICAgICAuLi5leHRyYXM/Lm9wdGlvbnMsXG4gICAgICB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcikpIGFzIE9ic2VydmFibGU8YW55PjtcbiAgfTtcbiAgZGVsZXRlV2l0aEJvZHkgPSA8VCA9IGFueT4ocm91dGU6IHN0cmluZywgYm9keT86IGFueSwgb3B0aW9ucz8pID0+IHtcbiAgICB0aGlzLmxvZ1JvdXRlcygnZGVsZXRlJywgcm91dGUpO1xuICAgIGNvbnN0IHJlcSA9IG5ldyBIdHRwUmVxdWVzdChcbiAgICAgICdERUxFVEUnLFxuICAgICAgcm91dGUsXG4gICAgICBib2R5LFxuICAgICAgb3B0aW9ucyB8fCB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5yZXF1ZXN0PFQ+KHJlcSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVSZXF1ZXN0RXJyb3IpKSBhcyBPYnNlcnZhYmxlPGFueT47XG4gIH07XG4gIGRlbGV0ZVRleHQgPSAocm91dGU6IHN0cmluZykgPT5cbiAgICB0aGlzLmRlbGV0ZTxzdHJpbmc+KHJvdXRlLCB7XG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHNvcnRDb2RlcyA9IDxUPihkYXRhOiBUW10pID0+IHtcbiAgICByZXR1cm4gZGF0YT8uc29ydDIoJ2NvZGUnLCB0cnVlKT8uc29ydDIoJ2NvZGUnKSBhcyBhbnkgYXMgVFtdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgSUV4dHJhcyB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHRoZSBlbmRvcnNlbWVudCBoZWFkZXJcbiAgICovXG4gIHVzZUVuZG9yc2VtZW50PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHJlcXVlc3Qgb3B0aW9ucy4gVGhlIGFkZGVkIG9wdGlvbnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICBvcHRpb25zPzoge1xuICAgIGhlYWRlcnM/Okh0dHBIZWFkZXJzLFxuICAgIFt4OnN0cmluZ106YW55XG4gIH07XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSByZXF1ZXN0IHR5cGUuIElmIHRoZSByZXF1ZXN0IHR5cGUgaXMgcXVlcnlQYXJhbXMsIHRoZSBib2R5IHdpbGwgYmUgc2VudCBhcyBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqL1xuICByZXF1ZXN0VHlwZT86ICdxdWVyeVBhcmFtcyc7XG59XG4iXX0=
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ldHMtZmUtbmctc2RrL3NyYy9saWIvU2VydmljZXMvYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0wsV0FBVyxFQUNYLFdBQVcsR0FDWixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBTyxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBVzdELE1BR2EsVUFBVTtJQUVyQixJQUFZLE9BQU87UUFDakIsT0FBTztZQUNMLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFZLFdBQVc7UUFDckIsT0FBTztZQUNMLE9BQU8sRUFBRSxxQkFBcUI7U0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUNTLElBQWdCLEVBQ2hCLE1BQW9CLEVBQ3BCLE9BQTBCO1FBRjFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQWYzQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBV2YsZUFBVSxHQUFHLENBQUMsQ0FBQztRQWdCZix1QkFBa0IsR0FBRyxDQUFDLEdBQXNCLEVBQUUsRUFBRTtZQUN0RCxJQUFJLE9BQU8sQ0FBQztZQUNaLElBQUksR0FBRyxFQUFFLEtBQUssWUFBWSxXQUFXO2dCQUNuQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sVUFBVSxDQUFDLE9BQU8sSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQztRQUNNLHVCQUFrQixHQUFHLENBQzNCLFFBQXFCLEVBQ3JCLFFBQXFCLEVBQ1IsRUFBRTtZQUNmLElBQUksQ0FBQyxRQUFRO2dCQUFFLE9BQU8sUUFBUSxDQUFDO2lCQUMxQixJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLFFBQVEsQ0FBQztZQUVwQyxJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDaEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztvQkFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDO1FBNkZGLFlBQVk7UUFFWixhQUFhO1FBQ2I7Ozs7OztXQU1HO1FBQ0gsUUFBRyxHQUFHLENBQ0osS0FBYSxFQUNiLFVBQTJELEVBQzNELE1BQWdCLEVBQ0QsRUFBRTtZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekMsT0FBTyxJQUFJLFVBQVUsQ0FBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMvQixNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLElBQUk7cUJBQ04sR0FBRyxDQUFDLEtBQUssRUFBRTtvQkFDVixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUM5QixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQzdCLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUN6QjtvQkFDRCxZQUFZLEVBQUUsTUFBTTtvQkFDcEIsR0FBRyxNQUFNLEVBQUUsT0FBTztpQkFDbkIsQ0FBQztxQkFDRCxJQUFJLENBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3JELEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNmLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7d0JBQ3BCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUk7NEJBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQzs2QkFDbkQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVTs0QkFDekIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQzs7NEJBQ3pDLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN6QixPQUFPLEdBQUcsQ0FBQztnQkFDYixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ3BDO3FCQUNBLFNBQVMsRUFBRTtxQkFDWCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDVixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDOUIsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqQixDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixhQUFRLEdBQUcsQ0FBb0MsS0FBYSxFQUFFLEVBQUUsQ0FDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvRCxZQUFPLEdBQUcsQ0FDUixLQUFhLEVBQ2IsVUFBMkQsRUFDM0QsTUFBZ0IsRUFDaEIsRUFBRSxDQUNGLElBQUksQ0FBQyxHQUFHLENBQUksS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUM3QixPQUFPLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FDOUIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUM3QixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FDekI7Z0JBQ0QsWUFBWSxFQUFFLE1BQU07YUFDckI7U0FDRixDQUFDLENBQUM7UUFFTCxZQUFPLEdBQUcsQ0FDUixLQUFhLEVBQ2IsVUFBMkQsRUFDM0QsTUFBZ0IsRUFDaEIsRUFBRSxDQUNGLElBQUksQ0FBQyxHQUFHLENBQUksS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUM3QixPQUFPLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FDOUIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUM3QixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FDekI7Z0JBQ0QsWUFBWSxFQUFFLGFBQWE7YUFDNUI7U0FDRixDQUFDLENBQUM7UUFFTCxnQkFBVyxHQUFHLENBQVUsS0FBYSxFQUFFLElBQVUsRUFBRSxNQUFnQixFQUFFLEVBQUU7WUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0IsV0FBVztZQUNYLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO2dCQUM5QyxHQUFHLE1BQU0sRUFBRSxPQUFPO2dCQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUM5QixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQzdCLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUN6QjtnQkFDRCxZQUFZLEVBQUUsTUFBTTthQUNyQixDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJO2lCQUNiLE9BQU8sQ0FBSSxHQUFHLENBQUM7aUJBQ2YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBa0IsQ0FBQztRQUNoRSxDQUFDLENBQUM7UUFFRixpQkFBWSxHQUFHLENBQ2IsS0FBYSxFQUNiLFVBQW1CLEVBQ25CLE1BQWdCLEVBQ2hCLEVBQUU7WUFDRixPQUFPLElBQUksVUFBVSxDQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMzQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDaEI7O29CQUNDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3QkFDdEQsMkJBQTJCO3dCQUMzQixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNqQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBQ0Ysc0JBQWlCLEdBQUcsQ0FDbEIsS0FBYSxFQUNiLFVBQW1CLEVBQ25CLE1BQWdCLEVBQ2hCLEVBQUU7WUFDRixPQUFPLElBQUksVUFBVSxDQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMzQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQzFDO2dCQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7cUJBQ3pDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNWLDJCQUEyQjtvQkFDM0IsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDWixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakIsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNYLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2IsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBbUNGLFlBQVk7UUFFWixnQkFBZ0I7UUFDaEIsV0FBTSxHQUFHLENBQVUsS0FBYSxFQUFFLE1BQWdCLEVBQUUsRUFBRTtZQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVoQyxJQUFJLE9BQU8sR0FBRyxNQUFNLEVBQUUsY0FBYztnQkFDbEMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO2dCQUM3RCxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUk7aUJBQ2IsTUFBTSxDQUFJLEtBQUssRUFBRTtnQkFDaEIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLEdBQUcsTUFBTSxFQUFFLE9BQU87Z0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQzlCLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQ3pCO2FBQ0YsQ0FBQztpQkFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFvQixDQUFDO1FBQ2xFLENBQUMsQ0FBQztRQUNGLG1CQUFjLEdBQUcsQ0FBVSxLQUFhLEVBQUUsSUFBVSxFQUFFLE1BQWdCLEVBQUUsRUFBRTtZQUN4RSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtnQkFDakQsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLEdBQUcsTUFBTSxFQUFFLE9BQU87Z0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQzlCLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQ3pCO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSTtpQkFDYixPQUFPLENBQUksR0FBRyxDQUFDO2lCQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQW9CLENBQUM7UUFDbEUsQ0FBQyxDQUFDO1FBQ0YsZUFBVSxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWdCLEVBQUUsRUFBRSxDQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFTLEtBQUssRUFBRTtZQUN6QixPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLEdBQUcsTUFBTSxFQUFFLE9BQU87Z0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQzlCLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQ3pCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFDTCxZQUFZO1FBRVosY0FBUyxHQUFHLENBQUksSUFBUyxFQUFFLEVBQUU7WUFDM0IsT0FBTyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFlLENBQUM7UUFDaEUsQ0FBQyxDQUFDO0lBN1ZDLENBQUM7SUFFSSxTQUFTLENBQ2YsTUFBeUMsRUFDekMsS0FBSyxFQUNMLEdBQUcsTUFBTTtRQUVULElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUF3QkQsZUFBZTtJQUNmLEtBQUssQ0FBVSxLQUFhLEVBQUUsSUFBSyxFQUFFLE1BQWdCO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksT0FBTyxHQUFHLE1BQU0sRUFBRSxjQUFjO1lBQ2xDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztZQUM3RCxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRTtZQUM3QixZQUFZLEVBQUUsTUFBTTtZQUNwQixHQUFHLE1BQU0sRUFBRSxPQUFPO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO1NBQ3BFLENBQUM7YUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFvQixDQUFDO0lBQ2xFLENBQUM7SUFDRCxZQUFZO0lBQ1osY0FBYztJQUNkLElBQUksQ0FBVSxLQUFhLEVBQUUsSUFBSyxFQUFFLE1BQWdCO1FBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksT0FBTyxHQUFHLE1BQU0sRUFBRSxjQUFjO1lBQ2xDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztZQUM3RCxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxDLE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRTtZQUM1QixZQUFZLEVBQUUsTUFBTTtZQUNwQixHQUFHLE1BQU0sRUFBRSxPQUFPO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO1NBQ3BFLENBQUM7YUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFvQixDQUFDO0lBQ2xFLENBQUM7SUFDRCxRQUFRLENBQVUsS0FBYSxFQUFFLElBQWMsRUFBRSxNQUFnQjtRQUMvRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUksS0FBSyxFQUFFLElBQUksRUFBRTtZQUMvQixPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLEdBQUcsTUFBTSxFQUFFLE9BQU87Z0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQzlCLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDakMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQ3pCO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsdUJBQXVCLENBQVUsS0FBYSxFQUFFLElBQWM7UUFDNUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFJLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDL0IsT0FBTyxFQUFFO2dCQUNQLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUM1QyxnQkFBZ0IsRUFDaEIsTUFBTSxDQUNQO2dCQUNELFlBQVksRUFBRSxNQUFNO2FBQ3JCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBSyxFQUFFLE1BQWdCO1FBQy9DLDhEQUE4RDtRQUM5RCxJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUM1QixjQUFjLEVBQUUsWUFBWTtTQUM3QixDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsTUFBTSxFQUFFLGNBQWM7WUFDOUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQVMsS0FBSyxFQUFFLElBQUksRUFBRTtZQUNwQyxPQUFPLEVBQUU7Z0JBQ1AsR0FBRyxNQUFNLEVBQUUsT0FBTztnQkFDbEIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO2FBQ3BFO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELHdCQUF3QixDQUFDLEtBQWEsRUFBRSxJQUFZO1FBQ2xELE9BQU8sSUFBSSxVQUFVLENBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDekIsV0FBVztZQUNYLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRTtnQkFDdkMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBUyxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDM0Q7WUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7aUJBQ3hCLFNBQVMsRUFBRTtpQkFDWCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDVixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNYLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQThJRCxlQUFlLENBQUMsVUFBbUI7UUFDakMsT0FBTyxDQUFDLFVBQVU7WUFDaEIsQ0FBQyxDQUFDLEVBQUU7WUFDSixDQUFDLENBQUMsR0FBRztnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztxQkFDcEIsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDO3FCQUM1RCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO3FCQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELFlBQVk7SUFFWixhQUFhO0lBQ2IsR0FBRyxDQUFVLEtBQWEsRUFBRSxJQUFLLEVBQUUsTUFBZ0I7UUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxFQUFFLEVBQ3BCLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLE1BQU0sRUFBRSxXQUFXLElBQUksYUFBYSxFQUFFO1lBQ3hDLEtBQUssSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLEtBQUssR0FBRyxJQUFJLENBQUM7U0FDZDtRQUNELElBQUksT0FBTyxHQUFHLE1BQU0sRUFBRSxjQUFjO1lBQ2xDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztZQUM3RCxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtZQUNqQixZQUFZLEVBQUUsTUFBTTtZQUNwQixHQUFHLE1BQU0sRUFBRSxPQUFPO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQzlCLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQ3pCO1NBQ0YsQ0FBQzthQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQW9CLENBQUM7SUFDbEUsQ0FBQzs4R0E1VFUsVUFBVTtrSEFBVixVQUFVLGNBRlQsTUFBTTs7U0FFUCxVQUFVOzJGQUFWLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSHR0cENsaWVudCxcbiAgSHR0cEVycm9yUmVzcG9uc2UsXG4gIEh0dHBIZWFkZXJzLFxuICBIdHRwUmVxdWVzdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaWlmLCBsYXN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHJldHJ5LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJQ29kZURlc2NyaXB0aW9uLCBJQ29kZVRpdGxlIH0gZnJvbSAnLi4vU2hhcmVkL21vZGVscy9pbmRleC5tb2RlbCc7XG5pbXBvcnQgeyBFVFNlbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBDYWNoZVNlcnZpY2UgfSBmcm9tICcuL2NhY2hlL2NhY2hlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxDYWNoZVNlcnZpY2UgfSBmcm9tICcuL2NhY2hlL2xvY2FsLWNhY2hlLnNlcnZpY2UnO1xuZXhwb3J0IGludGVyZmFjZSBJUmVzcG9uc2Uge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlc3VsdDogYW55O1xuICBzdGF0dXM6ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnZmFpbHVyZSc7XG4gIHN0YXR1c0NvZGU6ICdTTTAwMCcgfCAnU00wMDEnIHwgJ1NNMDAyJyB8ICdTTTAwMyc7XG59XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZSB7XG4gIHByaXZhdGUgc2hvd1JvdXRlcyA9IDA7XG4gIHByaXZhdGUgZ2V0IGhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIGdldCBmaWxlSGVhZGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5jdHlwZTogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSByZXRyeUNvdW50ID0gMDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHVibGljIGNhY2hlUzogQ2FjaGVTZXJ2aWNlLFxuICAgIHB1YmxpYyBsQ2FjaGVTOiBMb2NhbENhY2hlU2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBsb2dSb3V0ZXMoXG4gICAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdwdXQnIHwgJ2RlbGV0ZScsXG4gICAgcm91dGUsXG4gICAgLi4uZXh0cmFzXG4gICkge1xuICAgIGlmICh0aGlzLnNob3dSb3V0ZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKG1ldGhvZCwgcm91dGUsIC4uLmV4dHJhcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFuZGxlUmVxdWVzdEVycm9yID0gKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBpZiAoZXJyPy5lcnJvciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVxuICAgICAgbWVzc2FnZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoZXJyPy5lcnJvcikpO1xuICAgIHJldHVybiB0aHJvd0Vycm9yKG1lc3NhZ2UgfHwgZXJyPy5lcnJvcj8ubWVzc2FnZSk7XG4gIH07XG4gIHByaXZhdGUgY29uY2F0ZW5hdGVIZWFkZXJzID0gKFxuICAgIGhlYWRlcnMxOiBIdHRwSGVhZGVycyxcbiAgICBoZWFkZXJzMjogSHR0cEhlYWRlcnNcbiAgKTogSHR0cEhlYWRlcnMgPT4ge1xuICAgIGlmICghaGVhZGVyczEpIHJldHVybiBoZWFkZXJzMjtcbiAgICBlbHNlIGlmICghaGVhZGVyczIpIHJldHVybiBoZWFkZXJzMTtcblxuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGhlYWRlcnMxLmtleXMoKSlcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChpdGVtLCBoZWFkZXJzMS5nZXQoaXRlbSkpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBoZWFkZXJzMi5rZXlzKCkpIHtcbiAgICAgIGlmIChoZWFkZXJzLmhhcyhpdGVtKSkgaGVhZGVycy5kZWxldGUoaXRlbSk7XG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoaXRlbSwgaGVhZGVyczIuZ2V0KGl0ZW0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH07XG5cbiAgLy8jcmVnaW9uIFBBVENIXG4gIHBhdGNoPFQgPSBhbnk+KHJvdXRlOiBzdHJpbmcsIGJvZHk/LCBleHRyYXM/OiBJRXh0cmFzKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgdGhpcy5sb2dSb3V0ZXMoJ3Bvc3QnLCByb3V0ZSwgYm9keSk7XG4gICAgY29uc29sZS5sb2coYm9keSk7XG4gICAgbGV0IGhlYWRlcnMgPSBleHRyYXM/LnVzZUVuZG9yc2VtZW50XG4gICAgICA/IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpLnNldCgndXNlRW5kb3JzZW1lbnQnLCAndHJ1ZScpXG4gICAgICA6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wYXRjaChlbmNvZGVVUkkocm91dGUpLCBib2R5LCB7XG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgICAgICAuLi5leHRyYXM/Lm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuY29uY2F0ZW5hdGVIZWFkZXJzKGhlYWRlcnMsIGV4dHJhcz8ub3B0aW9ucz8uaGVhZGVycyksXG4gICAgICB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcikpIGFzIE9ic2VydmFibGU8YW55PjtcbiAgfVxuICAvLyNlbmRyZWdpb25cbiAgLy8jcmVnaW9uIFBPU1RcbiAgcG9zdDxUID0gYW55Pihyb3V0ZTogc3RyaW5nLCBib2R5PywgZXh0cmFzPzogSUV4dHJhcyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHRoaXMubG9nUm91dGVzKCdwb3N0Jywgcm91dGUsIGJvZHkpO1xuICAgIGNvbnNvbGUubG9nKGJvZHkpO1xuICAgIGxldCBoZWFkZXJzID0gZXh0cmFzPy51c2VFbmRvcnNlbWVudFxuICAgICAgPyBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKS5zZXQoJ3VzZUVuZG9yc2VtZW50JywgJ3RydWUnKVxuICAgICAgOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KGVuY29kZVVSSShyb3V0ZSksIGJvZHksIHtcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgIC4uLmV4dHJhcz8ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczogdGhpcy5jb25jYXRlbmF0ZUhlYWRlcnMoaGVhZGVycywgZXh0cmFzPy5vcHRpb25zPy5oZWFkZXJzKSxcbiAgICAgIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlUmVxdWVzdEVycm9yKSkgYXMgT2JzZXJ2YWJsZTxhbnk+O1xuICB9XG4gIHBvc3RGaWxlPFQgPSBhbnk+KHJvdXRlOiBzdHJpbmcsIGJvZHk6IEZvcm1EYXRhLCBleHRyYXM/OiBJRXh0cmFzKSB7XG4gICAgcmV0dXJuIHRoaXMucG9zdDxUPihyb3V0ZSwgYm9keSwge1xuICAgICAgb3B0aW9uczoge1xuICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgLi4uZXh0cmFzPy5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmNvbmNhdGVuYXRlSGVhZGVycyhcbiAgICAgICAgICBuZXcgSHR0cEhlYWRlcnModGhpcy5maWxlSGVhZGVycyksXG4gICAgICAgICAgZXh0cmFzPy5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIHBvc3RGaWxlV2l0aEVuZG9yc2VtZW50PFQgPSBhbnk+KHJvdXRlOiBzdHJpbmcsIGJvZHk6IEZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMucG9zdDxUPihyb3V0ZSwgYm9keSwge1xuICAgICAgb3B0aW9uczoge1xuICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5maWxlSGVhZGVycykuc2V0KFxuICAgICAgICAgICd1c2VFbmRvcnNlbWVudCcsXG4gICAgICAgICAgJ3RydWUnXG4gICAgICAgICksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBwb3N0U3RyaW5nKHJvdXRlOiBzdHJpbmcsIGJvZHk/LCBleHRyYXM/OiBJRXh0cmFzKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3JlcXVlc3RDb3VudCcsICsrRVRTZW52aXJvbm1lbnQucmVxdWVzdENvdW50KTtcbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nLFxuICAgIH0pO1xuICAgIGhlYWRlcnMgPSBleHRyYXM/LnVzZUVuZG9yc2VtZW50XG4gICAgICA/IGhlYWRlcnMuc2V0KCd1c2VFbmRvcnNlbWVudCcsICd0cnVlJylcbiAgICAgIDogaGVhZGVycztcbiAgICByZXR1cm4gdGhpcy5wb3N0PHN0cmluZz4ocm91dGUsIGJvZHksIHtcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgLi4uZXh0cmFzPy5vcHRpb25zLFxuICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcbiAgICAgICAgaGVhZGVyczogdGhpcy5jb25jYXRlbmF0ZUhlYWRlcnMoaGVhZGVycywgZXh0cmFzPy5vcHRpb25zPy5oZWFkZXJzKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgcG9zdFN0cmluZ1dpdGhMb2NhbENhY2hlKHJvdXRlOiBzdHJpbmcsIGJvZHk6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChyZXMpID0+IHtcbiAgICAgIGNvbnN0IGJkeSA9IGJvZHk/LnRyaW0oKTtcbiAgICAgIC8vIGRlYnVnZ2VyXG4gICAgICBpZiAodGhpcy5sQ2FjaGVTLmhhcyhyb3V0ZSArICdfJyArIGJkeSkpIHtcbiAgICAgICAgcmVzLm5leHQodGhpcy5sQ2FjaGVTLmdldEl0ZW08c3RyaW5nPihyb3V0ZSArICdfJyArIGJkeSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvc3RTdHJpbmcocm91dGUsIGJkeSlcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgcmVzLm5leHQocik7XG4gICAgICAgICAgdGhpcy5sQ2FjaGVTLnNldEl0ZW0ocm91dGUgKyAnXycgKyBiZHksIHIpO1xuICAgICAgICAgIHJlcy5jb21wbGV0ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICByZXMuZXJyb3IoZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBHRVRcbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBHRVQgcmVxdWVzdFxuICAgKiBAcGFyYW0gcm91dGUgQVBJIGVuZHBvaW50XG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9iamVjdCB0byBjb252ZXJ0IGludG8gcXVlcnlwYXJhbXNcbiAgICogQHBhcmFtIGV4dHJhcyBFeHRyYSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldCA9IDxUID0gYW55PihcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM/OiB7IFtmaWVsZDogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB9LFxuICAgIGV4dHJhcz86IElFeHRyYXNcbiAgKTogT2JzZXJ2YWJsZTxUPiA9PiB7XG4gICAgdGhpcy5sb2dSb3V0ZXMoJ2dldCcsIHJvdXRlLCBwYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHJlcykgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSByb3V0ZSArIHRoaXMuZ2V0UmVxdWVzdFBhcnNlKHBhcmFtZXRlcnMpO1xuICAgICAgdGhpcy5odHRwXG4gICAgICAgIC5nZXQocXVlcnksIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmNvbmNhdGVuYXRlSGVhZGVycyhcbiAgICAgICAgICAgIG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgICAgICAgZXh0cmFzPy5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAuLi5leHRyYXM/Lm9wdGlvbnMsXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHJldHJ5KHRoaXMucmV0cnlDb3VudCksXG4gICAgICAgICAgdGFwKCh4KSA9PiAodGhpcy5zaG93Um91dGVzID8gY29uc29sZS5sb2coeCkgOiBudWxsKSksXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSlcbiAgICAgICAgICAgICAgaWYgKHJlc1swXT8uY29kZSkgcmV0dXJuIHJlcy5zb3J0KCkuc29ydDIoJ2NvZGUnLCB0cnVlKTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAocmVzWzBdPy5jb2x1bW5OYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuc29ydCgpLnNvcnQyKCdjb2x1bW5OYW1lJywgdHJ1ZSk7XG4gICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHJlcy5zb3J0KCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVSZXF1ZXN0RXJyb3IpXG4gICAgICAgIClcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgcmVzLm5leHQocik7XG4gICAgICAgICAgdGhpcy5jYWNoZVMuc2V0SXRlbShxdWVyeSwgcik7XG4gICAgICAgICAgcmVzLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiByZXMuZXJyb3IoZXJyKSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZ2V0Q29kZXMgPSA8VCA9IElDb2RlVGl0bGUgJiBJQ29kZURlc2NyaXB0aW9uPihyb3V0ZTogc3RyaW5nKSA9PlxuICAgIHRoaXMuZ2V0PFRbXT4ocm91dGUpLnBpcGUobWFwKChyZXMpID0+IHRoaXMuc29ydENvZGVzKHJlcykpKTtcblxuICBnZXRUZXh0ID0gPFQgPSBzdHJpbmc+KFxuICAgIHJvdXRlOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVycz86IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIH0sXG4gICAgZXh0cmFzPzogSUV4dHJhc1xuICApID0+XG4gICAgdGhpcy5nZXQ8VD4ocm91dGUsIHBhcmFtZXRlcnMsIHtcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgaGVhZGVyczogdGhpcy5jb25jYXRlbmF0ZUhlYWRlcnMoXG4gICAgICAgICAgbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICAgICAgZXh0cmFzPy5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgICksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICBnZXRGaWxlID0gPFQgPSBzdHJpbmc+KFxuICAgIHJvdXRlOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVycz86IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIH0sXG4gICAgZXh0cmFzPzogSUV4dHJhc1xuICApID0+XG4gICAgdGhpcy5nZXQ8VD4ocm91dGUsIHBhcmFtZXRlcnMsIHtcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgaGVhZGVyczogdGhpcy5jb25jYXRlbmF0ZUhlYWRlcnMoXG4gICAgICAgICAgbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICAgICAgZXh0cmFzPy5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgICksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5QnVmZmVyJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgZ2V0V2l0aEJvZHkgPSA8VCA9IGFueT4ocm91dGU6IHN0cmluZywgYm9keT86IGFueSwgZXh0cmFzPzogSUV4dHJhcykgPT4ge1xuICAgIHRoaXMubG9nUm91dGVzKCdnZXQnLCByb3V0ZSk7XG4gICAgLy8gZGVidWdnZXJcbiAgICBjb25zdCByZXEgPSBuZXcgSHR0cFJlcXVlc3QoJ0dFVCcsIHJvdXRlLCBib2R5LCB7XG4gICAgICAuLi5leHRyYXM/Lm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB0aGlzLmNvbmNhdGVuYXRlSGVhZGVycyhcbiAgICAgICAgbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICAgIGV4dHJhcz8ub3B0aW9ucz8uaGVhZGVyc1xuICAgICAgKSxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5yZXF1ZXN0PFQ+KHJlcSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVSZXF1ZXN0RXJyb3IpKSBhcyBPYnNlcnZhYmxlPFQ+O1xuICB9O1xuXG4gIGdldEZyb21sb2NhbCA9IDxUID0gYW55PihcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM/OiBPYmplY3QsXG4gICAgZXh0cmFzPzogSUV4dHJhc1xuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHJlcykgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSByb3V0ZSArIHRoaXMuZ2V0UmVxdWVzdFBhcnNlKHBhcmFtZXRlcnMpO1xuICAgICAgaWYgKHRoaXMubENhY2hlUy5oYXMocXVlcnkpKSB7XG4gICAgICAgIHJlcy5uZXh0KHRoaXMubENhY2hlUy5nZXRJdGVtPFQ+KHF1ZXJ5KSk7XG4gICAgICAgIHJlcy5jb21wbGV0ZSgpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5nZXQocXVlcnksIG51bGwsIGV4dHJhcykpLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAvLyBpZiAoIXRoaXMuY1MuaGFzKHJvdXRlKSlcbiAgICAgICAgICByZXMubmV4dChyKTtcbiAgICAgICAgICB0aGlzLmxDYWNoZVMuc2V0SXRlbShxdWVyeSwgcik7XG4gICAgICAgICAgcmVzLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICBnZXRXaXRoTG9jYWxDYWNoZSA9IDxUID0gYW55PihcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM/OiBPYmplY3QsXG4gICAgZXh0cmFzPzogSUV4dHJhc1xuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHJlcykgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSByb3V0ZSArIHRoaXMuZ2V0UmVxdWVzdFBhcnNlKHBhcmFtZXRlcnMpO1xuICAgICAgaWYgKHRoaXMubENhY2hlUy5oYXMocXVlcnkpKSB7XG4gICAgICAgIHJlcy5uZXh0KHRoaXMubENhY2hlUy5nZXRJdGVtPFQ+KHF1ZXJ5KSk7XG4gICAgICB9XG4gICAgICBsYXN0VmFsdWVGcm9tKHRoaXMuZ2V0KHF1ZXJ5LCBudWxsLCBleHRyYXMpKVxuICAgICAgICAudGhlbigocikgPT4ge1xuICAgICAgICAgIC8vIGlmICghdGhpcy5jUy5oYXMocm91dGUpKVxuICAgICAgICAgIHJlcy5uZXh0KHIpO1xuICAgICAgICAgIHRoaXMubENhY2hlUy5zZXRJdGVtKHF1ZXJ5LCByKTtcbiAgICAgICAgICByZXMuY29tcGxldGUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgcmVzLmVycm9yKGUpO1xuICAgICAgICAgIHJlcy5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgZ2V0UmVxdWVzdFBhcnNlKHBhcmFtZXRlcnM/OiBPYmplY3QpIHtcbiAgICByZXR1cm4gIXBhcmFtZXRlcnNcbiAgICAgID8gJydcbiAgICAgIDogJz8nICtcbiAgICAgICAgICBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBwYXJhbWV0ZXJzW2tleV0/LnRvU3RyaW5nKCk/LnRyaW0oKSAhPSBudWxsKVxuICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBgJHtrZXl9PSR7cGFyYW1ldGVyc1trZXldPy50b1N0cmluZygpPy50cmltKCl9YClcbiAgICAgICAgICAgIC5qb2luKCcmJyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFBVVFxuICBwdXQ8VCA9IGFueT4ocm91dGU6IHN0cmluZywgYm9keT8sIGV4dHJhcz86IElFeHRyYXMpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICB0aGlzLmxvZ1JvdXRlcygncHV0Jywgcm91dGUsIGJvZHkpO1xuICAgIGxldCBxdWVyeSA9IHJvdXRlICsgJycsXG4gICAgICBuYm9keSA9IGJvZHk7XG4gICAgaWYgKGV4dHJhcz8ucmVxdWVzdFR5cGUgPT0gJ3F1ZXJ5UGFyYW1zJykge1xuICAgICAgcXVlcnkgKz0gdGhpcy5nZXRSZXF1ZXN0UGFyc2UoYm9keSk7XG4gICAgICBuYm9keSA9IG51bGw7XG4gICAgfVxuICAgIGxldCBoZWFkZXJzID0gZXh0cmFzPy51c2VFbmRvcnNlbWVudFxuICAgICAgPyBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKS5zZXQoJ3VzZUVuZG9yc2VtZW50JywgJ3RydWUnKVxuICAgICAgOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucHV0KHF1ZXJ5LCBuYm9keSwge1xuICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgLi4uZXh0cmFzPy5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmNvbmNhdGVuYXRlSGVhZGVycyhcbiAgICAgICAgICBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICAgICAgICBleHRyYXM/Lm9wdGlvbnM/LmhlYWRlcnNcbiAgICAgICAgKSxcbiAgICAgIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlUmVxdWVzdEVycm9yKSkgYXMgT2JzZXJ2YWJsZTxhbnk+O1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBERUxFVEVcbiAgZGVsZXRlID0gPFQgPSBhbnk+KHJvdXRlOiBzdHJpbmcsIGV4dHJhcz86IElFeHRyYXMpID0+IHtcbiAgICB0aGlzLmxvZ1JvdXRlcygnZGVsZXRlJywgcm91dGUpO1xuXG4gICAgbGV0IGhlYWRlcnMgPSBleHRyYXM/LnVzZUVuZG9yc2VtZW50XG4gICAgICA/IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpLnNldCgndXNlRW5kb3JzZW1lbnQnLCAndHJ1ZScpXG4gICAgICA6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcnMpO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5kZWxldGU8VD4ocm91dGUsIHtcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgIC4uLmV4dHJhcz8ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczogdGhpcy5jb25jYXRlbmF0ZUhlYWRlcnMoXG4gICAgICAgICAgbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICAgICAgZXh0cmFzPy5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgICksXG4gICAgICB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcikpIGFzIE9ic2VydmFibGU8YW55PjtcbiAgfTtcbiAgZGVsZXRlV2l0aEJvZHkgPSA8VCA9IGFueT4ocm91dGU6IHN0cmluZywgYm9keT86IGFueSwgZXh0cmFzPzogSUV4dHJhcykgPT4ge1xuICAgIHRoaXMubG9nUm91dGVzKCdkZWxldGUnLCByb3V0ZSk7XG4gICAgY29uc3QgcmVxID0gbmV3IEh0dHBSZXF1ZXN0KCdERUxFVEUnLCByb3V0ZSwgYm9keSwge1xuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAuLi5leHRyYXM/Lm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB0aGlzLmNvbmNhdGVuYXRlSGVhZGVycyhcbiAgICAgICAgbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICAgIGV4dHJhcz8ub3B0aW9ucz8uaGVhZGVyc1xuICAgICAgKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucmVxdWVzdDxUPihyZXEpXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlUmVxdWVzdEVycm9yKSkgYXMgT2JzZXJ2YWJsZTxhbnk+O1xuICB9O1xuICBkZWxldGVUZXh0ID0gKHJvdXRlOiBzdHJpbmcsIGV4dHJhcz86IElFeHRyYXMpID0+XG4gICAgdGhpcy5kZWxldGU8c3RyaW5nPihyb3V0ZSwge1xuICAgICAgb3B0aW9uczoge1xuICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcbiAgICAgICAgLi4uZXh0cmFzPy5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmNvbmNhdGVuYXRlSGVhZGVycyhcbiAgICAgICAgICBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICAgICAgICBleHRyYXM/Lm9wdGlvbnM/LmhlYWRlcnNcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHNvcnRDb2RlcyA9IDxUPihkYXRhOiBUW10pID0+IHtcbiAgICByZXR1cm4gZGF0YT8uc29ydDIoJ2NvZGUnLCB0cnVlKT8uc29ydDIoJ2NvZGUnKSBhcyBhbnkgYXMgVFtdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgSUV4dHJhcyB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHRoZSBlbmRvcnNlbWVudCBoZWFkZXJcbiAgICovXG4gIHVzZUVuZG9yc2VtZW50PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHJlcXVlc3Qgb3B0aW9ucy4gVGhlIGFkZGVkIG9wdGlvbnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICBvcHRpb25zPzoge1xuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycztcbiAgICBbeDogc3RyaW5nXTogYW55O1xuICB9O1xuICAvKipcbiAgICogU3BlY2lmeSB0aGUgcmVxdWVzdCB0eXBlLiBJZiB0aGUgcmVxdWVzdCB0eXBlIGlzIHF1ZXJ5UGFyYW1zLCB0aGUgYm9keSB3aWxsIGJlIHNlbnQgYXMgcXVlcnkgcGFyYW1ldGVyc1xuICAgKi9cbiAgcmVxdWVzdFR5cGU/OiAncXVlcnlQYXJhbXMnO1xufVxuIl19
@@ -3822,8 +3822,11 @@ class ApiService {
3822
3822
  let headers = new HttpHeaders();
3823
3823
  for (const item of headers1.keys())
3824
3824
  headers = headers.set(item, headers1.get(item));
3825
- for (const item of headers2.keys())
3825
+ for (const item of headers2.keys()) {
3826
+ if (headers.has(item))
3827
+ headers.delete(item);
3826
3828
  headers = headers.set(item, headers2.get(item));
3829
+ }
3827
3830
  return headers;
3828
3831
  };
3829
3832
  //#endregion
@@ -3839,10 +3842,6 @@ class ApiService {
3839
3842
  this.logRoutes('get', route, parameters);
3840
3843
  return new Observable((res) => {
3841
3844
  const query = route + this.getRequestParse(parameters);
3842
- // if (this.cacheS.has(query)) {
3843
- // res.next(this.cacheS.getItem<T>(route));
3844
- // }
3845
- const headers = new HttpHeaders(this.headers);
3846
3845
  this.http
3847
3846
  .get(query, {
3848
3847
  headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
@@ -3869,23 +3868,24 @@ class ApiService {
3869
3868
  });
3870
3869
  };
3871
3870
  this.getCodes = (route) => this.get(route).pipe(map((res) => this.sortCodes(res)));
3872
- this.getText = (route, parameters) => this.get(route, parameters, {
3871
+ this.getText = (route, parameters, extras) => this.get(route, parameters, {
3873
3872
  options: {
3874
- headers: new HttpHeaders(this.headers),
3873
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
3875
3874
  responseType: 'text',
3876
3875
  },
3877
3876
  });
3878
- this.getFile = (route, parameters) => this.get(route, parameters, {
3877
+ this.getFile = (route, parameters, extras) => this.get(route, parameters, {
3879
3878
  options: {
3880
- headers: new HttpHeaders(this.headers),
3879
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
3881
3880
  responseType: 'arrayBuffer',
3882
3881
  },
3883
3882
  });
3884
3883
  this.getWithBody = (route, body, extras) => {
3885
3884
  this.logRoutes('get', route);
3886
3885
  // debugger
3887
- const req = new HttpRequest('GET', route, body, extras?.options || {
3888
- headers: new HttpHeaders(this.headers),
3886
+ const req = new HttpRequest('GET', route, body, {
3887
+ ...extras?.options,
3888
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
3889
3889
  responseType: 'json',
3890
3890
  });
3891
3891
  return this.http
@@ -3936,26 +3936,28 @@ class ApiService {
3936
3936
  : new HttpHeaders(this.headers);
3937
3937
  return this.http
3938
3938
  .delete(route, {
3939
- headers,
3940
3939
  responseType: 'json',
3941
3940
  ...extras?.options,
3941
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
3942
3942
  })
3943
3943
  .pipe(catchError(this.handleRequestError));
3944
3944
  };
3945
- this.deleteWithBody = (route, body, options) => {
3945
+ this.deleteWithBody = (route, body, extras) => {
3946
3946
  this.logRoutes('delete', route);
3947
- const req = new HttpRequest('DELETE', route, body, options || {
3948
- headers: new HttpHeaders(this.headers),
3947
+ const req = new HttpRequest('DELETE', route, body, {
3949
3948
  responseType: 'json',
3949
+ ...extras?.options,
3950
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
3950
3951
  });
3951
3952
  return this.http
3952
3953
  .request(req)
3953
3954
  .pipe(catchError(this.handleRequestError));
3954
3955
  };
3955
- this.deleteText = (route) => this.delete(route, {
3956
+ this.deleteText = (route, extras) => this.delete(route, {
3956
3957
  options: {
3957
- headers: new HttpHeaders(this.headers),
3958
3958
  responseType: 'text',
3959
+ ...extras?.options,
3960
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
3959
3961
  },
3960
3962
  });
3961
3963
  //#endregion
@@ -3977,9 +3979,9 @@ class ApiService {
3977
3979
  : new HttpHeaders(this.headers);
3978
3980
  return this.http
3979
3981
  .patch(encodeURI(route), body, {
3980
- headers,
3981
3982
  responseType: 'json',
3982
3983
  ...extras?.options,
3984
+ headers: this.concatenateHeaders(headers, extras?.options?.headers),
3983
3985
  })
3984
3986
  .pipe(catchError(this.handleRequestError));
3985
3987
  }
@@ -3993,19 +3995,18 @@ class ApiService {
3993
3995
  : new HttpHeaders(this.headers);
3994
3996
  return this.http
3995
3997
  .post(encodeURI(route), body, {
3996
- headers,
3997
3998
  responseType: 'json',
3998
3999
  ...extras?.options,
4000
+ headers: this.concatenateHeaders(headers, extras?.options?.headers),
3999
4001
  })
4000
4002
  .pipe(catchError(this.handleRequestError));
4001
4003
  }
4002
4004
  postFile(route, body, extras) {
4003
4005
  return this.post(route, body, {
4004
- ...extras?.options,
4005
4006
  options: {
4006
- headers: new HttpHeaders(this.fileHeaders),
4007
4007
  responseType: 'json',
4008
4008
  ...extras?.options,
4009
+ headers: this.concatenateHeaders(new HttpHeaders(this.fileHeaders), extras?.options?.headers),
4009
4010
  },
4010
4011
  });
4011
4012
  }
@@ -4018,7 +4019,7 @@ class ApiService {
4018
4019
  });
4019
4020
  }
4020
4021
  postString(route, body, extras) {
4021
- console.log('requestCount', ++ETSenvironment.requestCount);
4022
+ // console.log('requestCount', ++ETSenvironment.requestCount);
4022
4023
  let headers = new HttpHeaders({
4023
4024
  'Content-Type': 'text/plain',
4024
4025
  });
@@ -4026,10 +4027,10 @@ class ApiService {
4026
4027
  ? headers.set('useEndorsement', 'true')
4027
4028
  : headers;
4028
4029
  return this.post(route, body, {
4029
- ...extras?.options,
4030
4030
  options: {
4031
- headers,
4031
+ ...extras?.options,
4032
4032
  responseType: 'text',
4033
+ headers: this.concatenateHeaders(headers, extras?.options?.headers),
4033
4034
  },
4034
4035
  });
4035
4036
  }
@@ -4053,23 +4054,13 @@ class ApiService {
4053
4054
  });
4054
4055
  }
4055
4056
  getRequestParse(parameters) {
4056
- // const nbody = new URLSearchParams();
4057
- // for (const key in parameters) {
4058
- // if (Object.prototype.hasOwnProperty.call(parameters, key)) {
4059
- // const element = parameters[key];
4060
- // if (element != null) nbody.set(key, element + '');
4061
- // }
4062
- // }
4063
- // const str = nbody.toString();
4064
- // if(parameters)
4065
- // debugger;
4066
- if (!parameters)
4067
- return '';
4068
- return ('?' +
4069
- Object.keys(parameters)
4070
- .filter((key) => parameters[key]?.toString()?.trim() != null)
4071
- .map((key) => `${key}=${parameters[key]?.toString()?.trim()}`)
4072
- .join('&'));
4057
+ return !parameters
4058
+ ? ''
4059
+ : '?' +
4060
+ Object.keys(parameters)
4061
+ .filter((key) => parameters[key]?.toString()?.trim() != null)
4062
+ .map((key) => `${key}=${parameters[key]?.toString()?.trim()}`)
4063
+ .join('&');
4073
4064
  }
4074
4065
  //#endregion
4075
4066
  //#region PUT
@@ -4085,9 +4076,9 @@ class ApiService {
4085
4076
  : new HttpHeaders(this.headers);
4086
4077
  return this.http
4087
4078
  .put(query, nbody, {
4088
- headers,
4089
4079
  responseType: 'json',
4090
4080
  ...extras?.options,
4081
+ headers: this.concatenateHeaders(new HttpHeaders(this.headers), extras?.options?.headers),
4091
4082
  })
4092
4083
  .pipe(catchError(this.handleRequestError));
4093
4084
  }