ng-easycommerce-v18 0.5.2 → 0.5.3

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.
package/README.md CHANGED
@@ -1,5 +1,6 @@
1
+ # Version 0.5.3
2
+ - Se modifica servicio de producto y paginacion porque el collection lanza endpoint de pagina 2 pero no la muestra y el resto si.
1
3
  # Version 0.5.2
2
- - Se modifica la funcion para limpiar la descripcion sin html ni css.
3
4
  - Se agrega descrption2 al observable Product para recibirlo del endpoint.
4
5
  - Se modifica la funcion para limpiar la descripcion sin html ni css.
5
6
  # Version 0.5.1
@@ -84,12 +84,12 @@ export class PaginationService {
84
84
  * @param limit limite de productos en cada petición.
85
85
  */
86
86
  initialize(apiUrl, limit) {
87
- //console.log(apiUrl)
88
87
  this._apiUrl = apiUrl;
89
88
  this._dataPagination().limit = limit || this._dataPagination().limit || 10;
90
89
  this._finished = false;
90
+ this._waiting = false; // Asegurar que no está bloqueado
91
91
  this._start = true;
92
- this._nextProductsSubject.next([]);
92
+ // NO emitir array vacío aquí para evitar triggers innecesarios
93
93
  }
94
94
  /**
95
95
  * Obtengo los datos de la siguiente página.
@@ -97,20 +97,31 @@ export class PaginationService {
97
97
  * @returns
98
98
  */
99
99
  getNext(next) {
100
- this._waiting = true;
101
- this._nextProductsSubject.next([]);
102
- this._apiUrl = this._apiUrl.replace('%20', ' '); // mas para cuando es un search value.
103
- let nextProducts;
104
- if (this._start) {
105
- nextProducts = this._connectionService.get(this._apiUrl, { limit: this._dataPagination().limit, page: 1 });
106
- this._start = false;
100
+ // Si ya estamos esperando una respuesta o ya terminamos, no hacer nada
101
+ if (this._waiting || this._finished) {
102
+ return false;
107
103
  }
108
- else {
109
- nextProducts = this._connectionService.get(this._dataPagination().links.next.slice(1));
104
+ // Verificar que hay un link next disponible
105
+ if (!this._dataPagination().links?.next) {
106
+ return false;
110
107
  }
111
- !this._finished && nextProducts.subscribe((response) => {
108
+ this._waiting = true;
109
+ this._apiUrl = this._apiUrl.replace('%20', ' '); // mas para cuando es un search value.
110
+ // Siempre usar el link "next" de la respuesta anterior
111
+ const nextProducts = this._connectionService.get(this._dataPagination().links.next.slice(1));
112
+ nextProducts.subscribe((response) => {
112
113
  response.links ? this.updatePageData(response) : this.finish(response);
113
- this._nextProductsSubject.next(response.items);
114
+ // Solo emitir si hay productos reales
115
+ if (response.items && response.items.length > 0) {
116
+ this._nextProductsSubject.next(response.items);
117
+ }
118
+ else {
119
+ // Si no hay productos, igual liberamos el waiting
120
+ this._waiting = false;
121
+ }
122
+ }, (error) => {
123
+ // En caso de error, liberar el bloqueo
124
+ this._waiting = false;
114
125
  });
115
126
  return true;
116
127
  }
@@ -200,7 +211,10 @@ export class PaginationService {
200
211
  // Si es la primera página, reseteamos estado interno
201
212
  if (page === 1) {
202
213
  this._resetSubject.next(true);
203
- this._nextProductsSubject.next([]);
214
+ // Resetear estado de paginación para permitir scroll
215
+ this._finished = false;
216
+ this._waiting = false;
217
+ this._start = false; // Ya no es el inicio después de getData
204
218
  }
205
219
  // Llamamos al backend con el page correcto
206
220
  return this._connectionService.get(url, { limit: 10, page }).pipe(tap((res) => {
@@ -221,4 +235,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
221
235
  providedIn: 'root'
222
236
  }]
223
237
  }], ctorParameters: () => [] });
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLXNlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUNwRDs7Ozs7Ozs7O0dBU0c7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBRXJCLGtCQUFrQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRSxlQUFlLEdBQW1CLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN4RCxVQUFVLEdBQXlCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXhFOzs7Ozs7Ozs7T0FTRztJQUNJLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQzFELEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtJQUNkLENBQUMsQ0FBQyxFQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNoQixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU5QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFD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QUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsR0FBZSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFFOUIsd0RBQXdEO1lBQ3hELE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQ0YsQ0FBQztJQUNILENBQUM7d0dBdE9XLGlCQUFpQjs0R0FBakIsaUJBQWlCLGNBRmpCLE1BQU07OzRGQUVOLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2FwaSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUGFnaW5hdGlvbiwgUHJvZHVjdCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJzU2VydmljZSB9IGZyb20gJy4vZmlsdGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XHJcbmltcG9ydCB7IENvcmVDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcclxuLyoqXHJcbiAqIFNlcnZpY2lvIHBhcmEgbWFuZWphciBsYSBwYWdpbmFjacOzbiB5IGxhIGNhcmdhIGRlIHByb2R1Y3Rvcy5cclxuICpcclxuICogU2UgZW5jYXJnYSBkZTpcclxuICogLSBFc2N1Y2hhciBsb3MgY2FtYmlvcyBlbiBsb3MgZmlsdHJvcyAoY2F0ZWdvcsOtYXMsIGF0cmlidXRvcywgcHJlY2lvLCBiw7pzcXVlZGEsIGV0Yy4pLlxyXG4gKiAtIENvbnN0cnVpciBsYSBVUkwgYWwgYmFja2VuZCBjb24gZXNvcyBmaWx0cm9zLlxyXG4gKiAtIFBlZGlyIGxvcyBwcm9kdWN0b3MgYWwgZW5kcG9pbnQgZGUgcHJvZHVjdC1zZWFyY2guXHJcbiAqIC0gRXhwb25lciB1biBvYnNlcnZhYmxlIGNvbiBsYSDDumx0aW1hIHDDoWdpbmEgZGUgcHJvZHVjdG9zIChgcGFnaW5hdGlvbkRhdGEkYClcclxuICogICB5IG90cm9zIGhlbHBlcnMgKHByZWNpbyBtw61uaW1vL23DoXhpbW8sIHNpZ3VpZW50ZSBww6FnaW5hLCBldGMuKS5cclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25TZXJ2aWNlIHtcclxuXHJcblx0cHJpdmF0ZSBfY29ubmVjdGlvblNlcnZpY2U6IENvbm5lY3Rpb25TZXJ2aWNlID0gaW5qZWN0KENvbm5lY3Rpb25TZXJ2aWNlKTtcclxuXHRwcml2YXRlIF9maWx0ZXJzU2VydmljZTogRmlsdGVyc1NlcnZpY2UgPSBpbmplY3QoRmlsdGVyc1NlcnZpY2UpXHJcblx0cHJpdmF0ZSBfY29uc3RhbnRzOiBDb3JlQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChDb3JlQ29uc3RhbnRzU2VydmljZSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsdWpvIHByaW5jaXBhbDogYSBwYXJ0aXIgZGUgbG9zIGZpbHRyb3Mg4oaSIGFybWEgVVJMIOKGkiBjb25zdWx0YSBiYWNrZW5kIOKGkiBkZXZ1ZWx2ZSBwcm9kdWN0b3MuXHJcblx0ICpcclxuXHQgKiBQYXNvczpcclxuXHQgKiAxKSBFc3BlcmEgYSBxdWUgYEZpbHRlcnNTZXJ2aWNlYCBlbWl0YSBmaWx0cm9zIHbDoWxpZG9zLlxyXG5cdCAqIDIpIENvbnN0cnV5ZSBsYSBVUkwgZmluYWwgY29uIGBidWlsZFVybCgpYC5cclxuXHQgKiAzKSBFdml0YSByZXBldGlyIGxsYW1hZGFzIHNpIGxhIFVSTCBubyBjYW1iacOzIChgZGlzdGluY3RVbnRpbENoYW5nZWRgKS5cclxuXHQgKiA0KSBMbGFtYSBhbCBiYWNrZW5kIGNvbiBgZ2V0RGF0YSh1cmwpYC5cclxuXHQgKiA1KSBDb21wYXJ0ZSBlbCDDumx0aW1vIHJlc3VsdGFkbyBjb24gdG9kb3MgbG9zIHN1c2NyaXB0b3JlcyAoYHNoYXJlUmVwbGF5KDEpYCkuXHJcblx0ICovXHJcblx0cHVibGljIHBhZ2luYXRpb25EYXRhJCA9IHRoaXMuX2ZpbHRlcnNTZXJ2aWNlLmZpbHRlcnMkLnBpcGUoXHJcblx0XHR0YXAoZmlsdGVycyA9PiB7XHJcblx0XHR9KSxcclxuXHRcdGZpbHRlcihmaWx0ZXJzID0+IHtcclxuXHRcdFx0aWYgKCFmaWx0ZXJzIHx8ICFmaWx0ZXJzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0Y29uc3QgY2F0ZWdvcnlGaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoZiA9PiBmLnR5cGUoKSA9PT0gJ2NhdGVnb3JpZXMnKTtcclxuXHRcdFx0Y29uc3QgaGFzQ2F0ZWdvcnlTZWxlY3RlZCA9ICEhY2F0ZWdvcnlGaWx0ZXI/LmdldFNlbGVjdGVkTGlzdCgpPy5sZW5ndGg7XHJcblxyXG5cdFx0XHRjb25zdCBpc0NhdGVnb3J5Um91dGUgPVxyXG5cdFx0XHRcdHRoaXMuX2NvbnN0YW50cy5jdXJyZW50Um91dGVUeXBlID09PSAnY2F0ZWdvcmllcyc7XHJcblxyXG5cdFx0XHQvLyBTaSBlc3RhbW9zIGVuIHJ1dGEgZGUgY2F0ZWdvcsOtYXMgeSB0b2RhdsOtYSBubyBzZSBtYXJjw7MgbmluZ3VuYSxcclxuXHRcdFx0Ly8gZXNwZXJhbW9zIGEgcXVlIGVsIENhdGVnb3J5RmlsdGVyIHNlIGhpZHJhdGUgYW50ZXMgZGUgZGlzcGFyYXIgbGEgbGxhbWFkYS5cclxuXHRcdFx0aWYgKGlzQ2F0ZWdvcnlSb3V0ZSAmJiAhaGFzQ2F0ZWdvcnlTZWxlY3RlZCkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9KSxcclxuXHJcblx0XHQvLyAyKSBDb252ZXJ0aW1vcyBmaWx0cm9zIC0+IFVSTFxyXG5cdFx0bWFwKGZpbHRlcnMgPT4ge1xyXG5cdFx0XHRjb25zdCB1cmwgPSB0aGlzLmJ1aWxkVXJsKGZpbHRlcnMpO1xyXG5cdFx0XHRyZXR1cm4gdXJsO1xyXG5cdFx0fSksXHJcblxyXG5cdFx0Ly8gMykgU29sbyBzZWd1aW1vcyBzaSBsYSBVUkwgY2FtYmnDsyByZXNwZWN0byBkZSBsYSBlbWlzacOzbiBhbnRlcmlvclxyXG5cdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuXHJcblx0XHQvLyA0KSBMbGFtYW1vcyBhbCBiYWNrZW5kIGNvbiBsYSBVUkwgY29uc3RydWlkYVxyXG5cdFx0dGFwKHVybCA9PiB7XHJcblx0XHR9KSxcclxuXHRcdHN3aXRjaE1hcCh1cmwgPT4gdGhpcy5nZXREYXRhKHVybCkpLFxyXG5cclxuXHRcdC8vIDUpIFJldXRpbGl6YXIgcmVzdWx0YWRvIHNpIGFsZ3VpZW4gbcOhcyBzZSBzdXNjcmliZSAoZXZpdGEgcmVwZXRpciBsYSBwZXRpY2nDs24pXHJcblx0XHRzaGFyZVJlcGxheSgxKVxyXG5cdCk7XHJcblxyXG5cdHByaXZhdGUgX2RhdGFQYWdpbmF0aW9uOiBhbnkgPSBzaWduYWw8UGFnaW5hdGlvbj4oe1xyXG5cdFx0YXR0cmlidXRlczogW10sXHJcblx0XHRjYXRlZ29yeTogW10sXHJcblx0XHRvcHRpb25zOiBbXSxcclxuXHRcdGxpbWl0OiAwLFxyXG5cdFx0cGFnZTogMCxcclxuXHRcdHBhZ2VzOiAwLFxyXG5cdFx0dG90YWw6IDAsXHJcblx0XHRpdGVtczogW10sXHJcblx0XHRjYWxsZWQ6IGZhbHNlLFxyXG5cdFx0cHJpY2VfbWF4OiAwLFxyXG5cdFx0cHJpY2VfbWluOiAwXHJcblx0fSk7XHJcblxyXG5cdHByaXZhdGUgX3dhaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIF9maW5pc2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHByaXZhdGUgX2FwaVVybDogc3RyaW5nID0gJyc7XHJcblx0cHJpdmF0ZSBfc3RhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0cHJpdmF0ZSBfbmV4dFByb2R1Y3RzU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RbXT4oW10pO1xyXG5cdHB1YmxpYyBuZXh0UHJvZHVjdHMkID0gdGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcblx0cHJpdmF0ZSBfcmVzZXRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHRwdWJsaWMgcmVzZXQkID0gdGhpcy5fcmVzZXRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuXHRwcml2YXRlIHByaWNlUmFuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHByaWNlX21pbjogbnVtYmVyLCBwcmljZV9tYXg6IG51bWJlciB9Pih7IHByaWNlX21pbjogMCwgcHJpY2VfbWF4OiAwIH0pO1xyXG5cdHB1YmxpYyBwcmljZVJhbmdlJCA9IHRoaXMucHJpY2VSYW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaWNpYWxpemEgbGEgY29uZmlndXJhY2nDs24gcGFyYSBlbCBTZXJ2aWNpbyBkZSBQYWdpbmFjacOzbi5cclxuXHQgKiBAcGFyYW0gYXBpVXJsIFVybCBjb24gbG9zIGZpbHRyb3MgYXBsaWNhZG9zLiBcclxuXHQgKiBAcGFyYW0gbGltaXQgbGltaXRlIGRlIHByb2R1Y3RvcyBlbiBjYWRhIHBldGljacOzbi5cclxuXHQgKi9cclxuXHRpbml0aWFsaXplKGFwaVVybDogc3RyaW5nLCBsaW1pdD86IG51bWJlcikge1xyXG5cdFx0Ly9jb25zb2xlLmxvZyhhcGlVcmwpXHJcblx0XHR0aGlzLl9hcGlVcmwgPSBhcGlVcmw7XHJcblx0XHR0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmxpbWl0ID0gbGltaXQgfHwgdGhpcy5fZGF0YVBhZ2luYXRpb24oKS5saW1pdCB8fCAxMDtcclxuXHRcdHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7XHJcblx0XHR0aGlzLl9zdGFydCA9IHRydWU7XHJcblx0XHR0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0Lm5leHQoW10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBPYnRlbmdvIGxvcyBkYXRvcyBkZSBsYSBzaWd1aWVudGUgcMOhZ2luYS5cclxuXHQgKiBAcGFyYW0gbmV4dCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRnZXROZXh0KG5leHQ/OiBhbnkpOiBib29sZWFuIHtcclxuXHRcdHRoaXMuX3dhaXRpbmcgPSB0cnVlO1xyXG5cdFx0dGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC5uZXh0KFtdKTtcclxuXHRcdHRoaXMuX2FwaVVybCA9IHRoaXMuX2FwaVVybC5yZXBsYWNlKCclMjAnLCAnICcpOy8vIG1hcyBwYXJhIGN1YW5kbyBlcyB1biBzZWFyY2ggdmFsdWUuXHJcblx0XHRsZXQgbmV4dFByb2R1Y3RzO1xyXG5cdFx0aWYgKHRoaXMuX3N0YXJ0KSB7XHJcblx0XHRcdG5leHRQcm9kdWN0cyA9IHRoaXMuX2Nvbm5lY3Rpb25TZXJ2aWNlLmdldCh0aGlzLl9hcGlVcmwsIHsgbGltaXQ6IHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGltaXQsIHBhZ2U6IDEgfSlcclxuXHRcdFx0dGhpcy5fc3RhcnQgPSBmYWxzZVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bmV4dFByb2R1Y3RzID0gdGhpcy5fY29ubmVjdGlvblNlcnZpY2UuZ2V0KHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGlua3MubmV4dC5zbGljZSgxKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0IXRoaXMuX2ZpbmlzaGVkICYmIG5leHRQcm9kdWN0cy5zdWJzY3JpYmUoXHJcblx0XHRcdChyZXNwb25zZTogUGFnaW5hdGlvbikgPT4ge1xyXG5cdFx0XHRcdHJlc3BvbnNlLmxpbmtzID8gdGhpcy51cGRhdGVQYWdlRGF0YShyZXNwb25zZSkgOiB0aGlzLmZpbmlzaChyZXNwb25zZSlcclxuXHRcdFx0XHR0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0Lm5leHQocmVzcG9uc2UuaXRlbXMpO1xyXG5cdFx0XHR9XHJcblx0XHQpXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQWN0dWFsaXphIGxvcyBkYXRvcyBkZSBsYSBwYWdpbmEuXHJcblx0ICogQHBhcmFtIHJlc3BvbnNlIHJlc3B1ZXN0YSBkZWwgYmFja2VuZCBvIG9iamVjdG8gZGVsIHRpcG8gYFBhZ2luYXRpb25gLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVBhZ2VEYXRhKHJlc3BvbnNlOiBQYWdpbmF0aW9uKTogdm9pZCB7XHJcblx0XHR0aGlzLl9kYXRhUGFnaW5hdGlvbi5zZXQoeyAuLi5yZXNwb25zZSwgY2FsbGVkOiB0cnVlIH0pXHJcblx0XHR0aGlzLl9maW5pc2hlZCA9IChyZXNwb25zZS5wYWdlID09IHJlc3BvbnNlLnBhZ2VzKVxyXG5cdFx0dGhpcy5fd2FpdGluZyA9IGZhbHNlO1xyXG5cdFx0Ly8gRW1pdGlyIGxvcyB2YWxvcmVzIGRlIHByaWNlX21pbiB5IHByaWNlX21heCBhIHRyYXbDqXMgZGUgcHJpY2VSYW5nZVN1YmplY3QsXHJcblx0XHQvLyBwYXJhIHF1ZSBvdHJvcyBjb21wb25lbnRlcyAoZWouIGZpbHRybyBkZSBwcmVjaW8pIHB1ZWRhbiBtb3N0cmFybG9zLlxyXG5cdFx0dGhpcy5wcmljZVJhbmdlU3ViamVjdC5uZXh0KHtcclxuXHRcdFx0cHJpY2VfbWluOiByZXNwb25zZS5wcmljZV9taW4sXHJcblx0XHRcdHByaWNlX21heDogcmVzcG9uc2UucHJpY2VfbWF4XHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIE1hcmNhIGVsIGZpbmFsIGRlIGxhcyBwYWdpbmFzLCBlcyBkZWNpciBjdWFuZG8geWEgbm8gcXVlZGEgbWFzIGVsZW1lbnRvcyBxdWUgbW9zdHJhci5cclxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgXHJcblx0ICovXHJcblx0ZmluaXNoKHJlc3BvbnNlOiBQYWdpbmF0aW9uKTogdm9pZCB7XHJcblx0XHR0aGlzLl9maW5pc2hlZCA9IHRydWU7XHJcblx0XHR0aGlzLl93YWl0aW5nID0gZmFsc2U7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIE9idGVuZ28gbG9zIHByb2R1Y3RvcyBkZSBsYSBwYWdpbmEgY2FyZ2FkYSBhY3R1YWwuIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXROZXh0UHJvZHVjdHMoKTogUHJvZHVjdFtdIHtcclxuXHRcdHJldHVybiB0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0LnZhbHVlO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBEZXZ1ZWx2ZSBzaSBlc3RhIGVzcGVyYW5kbyBvIG5vIGxhIHBldGljacOzbiBhbCBiYWNrZW5kLlxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRXYWl0aW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fd2FpdGluZzsgfVxyXG5cdC8qKlxyXG5cdCAqIFNldGVhIGxhIHZhcmlhYmxlIHdhaXRpbmcuXHJcblx0ICogQHBhcmFtIHZhbHVlIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXRXYWl0aW5nKHZhbHVlOiBib29sZWFuKTogdm9pZCB7IHRoaXMuX3dhaXRpbmcgPSB2YWx1ZSB9XHJcblx0LyoqXHJcblx0ICogR2V0dGVyIHBhcmEgbGEgdmFyaWFibGUgYF9maW5pc2hlZGAuXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGdldEZpbmlzaGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fZmluaXNoZWQ7IH1cclxuXHQvKipcclxuXHQgKiBEZXZ1ZWx2ZSBlbCB0b3RhbCBkZSBJdGVtcy5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0VG90YWxJdGVtcygpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGltaXQgKiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLnBhZ2U7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIE9idGVuZ28gdW4gb2JqZWN0byBjb24gbG9zIGRhdG9zIGRlIGxvcyBmaWx0cm9zIHJlc3VsdGFudGVzLlxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRGaWx0ZXJzUGFnaW5hdGlvbigpOiBhbnkge1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0XCJjYXRlZ29yaWVzXCI6IHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkuY2F0ZWdvcnksXHJcblx0XHRcdFwiYXR0cmlidXRlc1wiOiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmF0dHJpYnV0ZXMsXHJcblx0XHRcdFwib3B0aW9uc1wiOiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLm9wdGlvbnNcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqXHJcblx0ICogUGFyYSBjb250cnVpc3RlIGxhIHVybCBlbiBiYXNlIGEgbG9zIGZpbHRyb3MgYXBsaWNhZG9zLlxyXG5cdCAqIEBwYXJhbSBmaWx0ZXJzIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBidWlsZFVybChmaWx0ZXJzOiBGaWx0ZXJbXSkge1xyXG5cdFx0Y29uc3QgdXJsID0gdGhpcy5fY29uc3RhbnRzLnNlYXJjaFZhbHVlXHJcblx0XHRcdD8gdGhpcy5fZmlsdGVyc1NlcnZpY2UuZ2VuZXJhdGVGaW5hbEFwaSh0aGlzLl9jb25zdGFudHMuc2VhcmNoVmFsdWUpXHJcblx0XHRcdDogdGhpcy5fZmlsdGVyc1NlcnZpY2UuZ2VuZXJhdGVGaW5hbEFwaSgpO1xyXG5cclxuXHRcdHJldHVybiB1cmw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXZ1ZWx2ZSB1biBvYnNlcnZhYmxlIGRlIGxvcyBwcm9kdWN0b3MgcXVlIGRldm9sdmnDsyBsYSDDumx0aW1hIHDDoWdpbmEgb2J0ZW5pZGEuXHJcblx0ICogQHBhcmFtIHVybCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0RGF0YSh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8UHJvZHVjdFtdPiB7XHJcblxyXG5cdFx0Ly8gRGV0ZWN0YXIgbGEgcMOhZ2luYSBkZXNkZSBsYSBVUkwgKD9wYWdlPW4pLiBTaSBubyB2aWVuZSwgYXN1bWltb3MgcGFnZT0xLlxyXG5cdFx0Y29uc3QgcGFnZU1hdGNoID0gdXJsLm1hdGNoKC9bPyZdcGFnZT0oXFxkKykvKTtcclxuXHRcdGNvbnN0IHBhZ2UgPSBwYWdlTWF0Y2ggPyBOdW1iZXIocGFnZU1hdGNoWzFdKSA6IDE7XHJcblxyXG5cdFx0Ly8gU2kgZXMgbGEgcHJpbWVyYSBww6FnaW5hLCByZXNldGVhbW9zIGVzdGFkbyBpbnRlcm5vXHJcblx0XHRpZiAocGFnZSA9PT0gMSkge1xyXG5cdFx0XHR0aGlzLl9yZXNldFN1YmplY3QubmV4dCh0cnVlKTtcclxuXHRcdFx0dGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC5uZXh0KFtdKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBMbGFtYW1vcyBhbCBiYWNrZW5kIGNvbiBlbCBwYWdlIGNvcnJlY3RvXHJcblx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvblNlcnZpY2UuZ2V0KHVybCwgeyBsaW1pdDogMTAsIHBhZ2UgfSkucGlwZShcclxuXHRcdFx0dGFwKChyZXM6IFBhZ2luYXRpb24pID0+IHtcclxuXHRcdFx0XHQvLyBBY3R1YWxpemFyIGRhdG9zIGRlIHBhZ2luYWNpw7NuICsgcHJpY2VfbWluL3ByaWNlX21heFxyXG5cdFx0XHRcdHJlcy5saW5rcyA/IHRoaXMudXBkYXRlUGFnZURhdGEocmVzKSA6IHRoaXMuZmluaXNoKHJlcyk7XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRtYXAoKHJlczogUGFnaW5hdGlvbikgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGl0ZW1zID0gcmVzLml0ZW1zID8/IFtdO1xyXG5cclxuXHRcdFx0XHQvLyBMbyBxdWUgdmUgcGFnaW5hdGlvbkRhdGEkIChzd2l0Y2hNYXApIHNvbiBlc3RvcyBpdGVtc1xyXG5cdFx0XHRcdHJldHVybiBpdGVtcztcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG59Il19
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLXNlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUNwRDs7Ozs7Ozs7O0dBU0c7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBRXJCLGtCQUFrQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRSxlQUFlLEdBQW1CLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN4RCxVQUFVLEdBQXlCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXhFOzs7Ozs7Ozs7T0FTRztJQUNJLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQzFELEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtJQUNkLENBQUMsQ0FBQyxFQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNoQixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU5QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFD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QUcsS0FBSyxDQUFDLENBQUMsd0NBQXdDO1FBQzlELENBQUM7UUFFRCwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2hFLEdBQUcsQ0FBQyxDQUFDLEdBQWUsRUFBRSxFQUFFO1lBQ3ZCLHVEQUF1RDtZQUN2RCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLEdBQWUsRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBRTlCLHdEQUF3RDtZQUN4RCxPQUFPLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNGLENBQUM7SUFDSCxDQUFDO3dHQXhQVyxpQkFBaUI7NEdBQWpCLGlCQUFpQixjQUZqQixNQUFNOzs0RkFFTixpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hcGknO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFBhZ2luYXRpb24sIFByb2R1Y3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRmlsdGVyc1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xyXG5pbXBvcnQgeyBDb3JlQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XHJcbi8qKlxyXG4gKiBTZXJ2aWNpbyBwYXJhIG1hbmVqYXIgbGEgcGFnaW5hY2nDs24geSBsYSBjYXJnYSBkZSBwcm9kdWN0b3MuXHJcbiAqXHJcbiAqIFNlIGVuY2FyZ2EgZGU6XHJcbiAqIC0gRXNjdWNoYXIgbG9zIGNhbWJpb3MgZW4gbG9zIGZpbHRyb3MgKGNhdGVnb3LDrWFzLCBhdHJpYnV0b3MsIHByZWNpbywgYsO6c3F1ZWRhLCBldGMuKS5cclxuICogLSBDb25zdHJ1aXIgbGEgVVJMIGFsIGJhY2tlbmQgY29uIGVzb3MgZmlsdHJvcy5cclxuICogLSBQZWRpciBsb3MgcHJvZHVjdG9zIGFsIGVuZHBvaW50IGRlIHByb2R1Y3Qtc2VhcmNoLlxyXG4gKiAtIEV4cG9uZXIgdW4gb2JzZXJ2YWJsZSBjb24gbGEgw7psdGltYSBww6FnaW5hIGRlIHByb2R1Y3RvcyAoYHBhZ2luYXRpb25EYXRhJGApXHJcbiAqICAgeSBvdHJvcyBoZWxwZXJzIChwcmVjaW8gbcOtbmltby9tw6F4aW1vLCBzaWd1aWVudGUgcMOhZ2luYSwgZXRjLikuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uU2VydmljZSB7XHJcblxyXG5cdHByaXZhdGUgX2Nvbm5lY3Rpb25TZXJ2aWNlOiBDb25uZWN0aW9uU2VydmljZSA9IGluamVjdChDb25uZWN0aW9uU2VydmljZSk7XHJcblx0cHJpdmF0ZSBfZmlsdGVyc1NlcnZpY2U6IEZpbHRlcnNTZXJ2aWNlID0gaW5qZWN0KEZpbHRlcnNTZXJ2aWNlKVxyXG5cdHByaXZhdGUgX2NvbnN0YW50czogQ29yZUNvbnN0YW50c1NlcnZpY2UgPSBpbmplY3QoQ29yZUNvbnN0YW50c1NlcnZpY2UpO1xyXG5cclxuXHQvKipcclxuXHQgKiBGbHVqbyBwcmluY2lwYWw6IGEgcGFydGlyIGRlIGxvcyBmaWx0cm9zIOKGkiBhcm1hIFVSTCDihpIgY29uc3VsdGEgYmFja2VuZCDihpIgZGV2dWVsdmUgcHJvZHVjdG9zLlxyXG5cdCAqXHJcblx0ICogUGFzb3M6XHJcblx0ICogMSkgRXNwZXJhIGEgcXVlIGBGaWx0ZXJzU2VydmljZWAgZW1pdGEgZmlsdHJvcyB2w6FsaWRvcy5cclxuXHQgKiAyKSBDb25zdHJ1eWUgbGEgVVJMIGZpbmFsIGNvbiBgYnVpbGRVcmwoKWAuXHJcblx0ICogMykgRXZpdGEgcmVwZXRpciBsbGFtYWRhcyBzaSBsYSBVUkwgbm8gY2FtYmnDsyAoYGRpc3RpbmN0VW50aWxDaGFuZ2VkYCkuXHJcblx0ICogNCkgTGxhbWEgYWwgYmFja2VuZCBjb24gYGdldERhdGEodXJsKWAuXHJcblx0ICogNSkgQ29tcGFydGUgZWwgw7psdGltbyByZXN1bHRhZG8gY29uIHRvZG9zIGxvcyBzdXNjcmlwdG9yZXMgKGBzaGFyZVJlcGxheSgxKWApLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYWdpbmF0aW9uRGF0YSQgPSB0aGlzLl9maWx0ZXJzU2VydmljZS5maWx0ZXJzJC5waXBlKFxyXG5cdFx0dGFwKGZpbHRlcnMgPT4ge1xyXG5cdFx0fSksXHJcblx0XHRmaWx0ZXIoZmlsdGVycyA9PiB7XHJcblx0XHRcdGlmICghZmlsdGVycyB8fCAhZmlsdGVycy5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdGNvbnN0IGNhdGVnb3J5RmlsdGVyID0gZmlsdGVycy5maW5kKGYgPT4gZi50eXBlKCkgPT09ICdjYXRlZ29yaWVzJyk7XHJcblx0XHRcdGNvbnN0IGhhc0NhdGVnb3J5U2VsZWN0ZWQgPSAhIWNhdGVnb3J5RmlsdGVyPy5nZXRTZWxlY3RlZExpc3QoKT8ubGVuZ3RoO1xyXG5cclxuXHRcdFx0Y29uc3QgaXNDYXRlZ29yeVJvdXRlID1cclxuXHRcdFx0XHR0aGlzLl9jb25zdGFudHMuY3VycmVudFJvdXRlVHlwZSA9PT0gJ2NhdGVnb3JpZXMnO1xyXG5cclxuXHRcdFx0Ly8gU2kgZXN0YW1vcyBlbiBydXRhIGRlIGNhdGVnb3LDrWFzIHkgdG9kYXbDrWEgbm8gc2UgbWFyY8OzIG5pbmd1bmEsXHJcblx0XHRcdC8vIGVzcGVyYW1vcyBhIHF1ZSBlbCBDYXRlZ29yeUZpbHRlciBzZSBoaWRyYXRlIGFudGVzIGRlIGRpc3BhcmFyIGxhIGxsYW1hZGEuXHJcblx0XHRcdGlmIChpc0NhdGVnb3J5Um91dGUgJiYgIWhhc0NhdGVnb3J5U2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSksXHJcblxyXG5cdFx0Ly8gMikgQ29udmVydGltb3MgZmlsdHJvcyAtPiBVUkxcclxuXHRcdG1hcChmaWx0ZXJzID0+IHtcclxuXHRcdFx0Y29uc3QgdXJsID0gdGhpcy5idWlsZFVybChmaWx0ZXJzKTtcclxuXHRcdFx0cmV0dXJuIHVybDtcclxuXHRcdH0pLFxyXG5cclxuXHRcdC8vIDMpIFNvbG8gc2VndWltb3Mgc2kgbGEgVVJMIGNhbWJpw7MgcmVzcGVjdG8gZGUgbGEgZW1pc2nDs24gYW50ZXJpb3JcclxuXHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcblxyXG5cdFx0Ly8gNCkgTGxhbWFtb3MgYWwgYmFja2VuZCBjb24gbGEgVVJMIGNvbnN0cnVpZGFcclxuXHRcdHRhcCh1cmwgPT4ge1xyXG5cdFx0fSksXHJcblx0XHRzd2l0Y2hNYXAodXJsID0+IHRoaXMuZ2V0RGF0YSh1cmwpKSxcclxuXHJcblx0XHQvLyA1KSBSZXV0aWxpemFyIHJlc3VsdGFkbyBzaSBhbGd1aWVuIG3DoXMgc2Ugc3VzY3JpYmUgKGV2aXRhIHJlcGV0aXIgbGEgcGV0aWNpw7NuKVxyXG5cdFx0c2hhcmVSZXBsYXkoMSlcclxuXHQpO1xyXG5cclxuXHRwcml2YXRlIF9kYXRhUGFnaW5hdGlvbjogYW55ID0gc2lnbmFsPFBhZ2luYXRpb24+KHtcclxuXHRcdGF0dHJpYnV0ZXM6IFtdLFxyXG5cdFx0Y2F0ZWdvcnk6IFtdLFxyXG5cdFx0b3B0aW9uczogW10sXHJcblx0XHRsaW1pdDogMCxcclxuXHRcdHBhZ2U6IDAsXHJcblx0XHRwYWdlczogMCxcclxuXHRcdHRvdGFsOiAwLFxyXG5cdFx0aXRlbXM6IFtdLFxyXG5cdFx0Y2FsbGVkOiBmYWxzZSxcclxuXHRcdHByaWNlX21heDogMCxcclxuXHRcdHByaWNlX21pbjogMFxyXG5cdH0pO1xyXG5cclxuXHRwcml2YXRlIF93YWl0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcblx0cHJpdmF0ZSBfZmluaXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIF9hcGlVcmw6IHN0cmluZyA9ICcnO1xyXG5cdHByaXZhdGUgX3N0YXJ0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdHByaXZhdGUgX25leHRQcm9kdWN0c1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0W10+KFtdKTtcclxuXHRwdWJsaWMgbmV4dFByb2R1Y3RzJCA9IHRoaXMuX25leHRQcm9kdWN0c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG5cdHByaXZhdGUgX3Jlc2V0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblx0cHVibGljIHJlc2V0JCA9IHRoaXMuX3Jlc2V0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcblx0cHJpdmF0ZSBwcmljZVJhbmdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBwcmljZV9taW46IG51bWJlciwgcHJpY2VfbWF4OiBudW1iZXIgfT4oeyBwcmljZV9taW46IDAsIHByaWNlX21heDogMCB9KTtcclxuXHRwdWJsaWMgcHJpY2VSYW5nZSQgPSB0aGlzLnByaWNlUmFuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmljaWFsaXphIGxhIGNvbmZpZ3VyYWNpw7NuIHBhcmEgZWwgU2VydmljaW8gZGUgUGFnaW5hY2nDs24uXHJcblx0ICogQHBhcmFtIGFwaVVybCBVcmwgY29uIGxvcyBmaWx0cm9zIGFwbGljYWRvcy4gXHJcblx0ICogQHBhcmFtIGxpbWl0IGxpbWl0ZSBkZSBwcm9kdWN0b3MgZW4gY2FkYSBwZXRpY2nDs24uXHJcblx0ICovXHJcblx0aW5pdGlhbGl6ZShhcGlVcmw6IHN0cmluZywgbGltaXQ/OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuX2FwaVVybCA9IGFwaVVybDtcclxuXHRcdHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGltaXQgPSBsaW1pdCB8fCB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmxpbWl0IHx8IDEwO1xyXG5cdFx0dGhpcy5fZmluaXNoZWQgPSBmYWxzZTtcclxuXHRcdHRoaXMuX3dhaXRpbmcgPSBmYWxzZTsgLy8gQXNlZ3VyYXIgcXVlIG5vIGVzdMOhIGJsb3F1ZWFkb1xyXG5cdFx0dGhpcy5fc3RhcnQgPSB0cnVlO1xyXG5cdFx0Ly8gTk8gZW1pdGlyIGFycmF5IHZhY8OtbyBhcXXDrSBwYXJhIGV2aXRhciB0cmlnZ2VycyBpbm5lY2VzYXJpb3NcclxuXHR9XHJcblx0LyoqXHJcblx0ICogT2J0ZW5nbyBsb3MgZGF0b3MgZGUgbGEgc2lndWllbnRlIHDDoWdpbmEuXHJcblx0ICogQHBhcmFtIG5leHQgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0Z2V0TmV4dChuZXh0PzogYW55KTogYm9vbGVhbiB7XHJcblx0XHQvLyBTaSB5YSBlc3RhbW9zIGVzcGVyYW5kbyB1bmEgcmVzcHVlc3RhIG8geWEgdGVybWluYW1vcywgbm8gaGFjZXIgbmFkYVxyXG5cdFx0aWYgKHRoaXMuX3dhaXRpbmcgfHwgdGhpcy5fZmluaXNoZWQpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFZlcmlmaWNhciBxdWUgaGF5IHVuIGxpbmsgbmV4dCBkaXNwb25pYmxlXHJcblx0XHRpZiAoIXRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGlua3M/Lm5leHQpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3dhaXRpbmcgPSB0cnVlO1xyXG5cdFx0dGhpcy5fYXBpVXJsID0gdGhpcy5fYXBpVXJsLnJlcGxhY2UoJyUyMCcsICcgJyk7Ly8gbWFzIHBhcmEgY3VhbmRvIGVzIHVuIHNlYXJjaCB2YWx1ZS5cclxuXHRcdFxyXG5cdFx0Ly8gU2llbXByZSB1c2FyIGVsIGxpbmsgXCJuZXh0XCIgZGUgbGEgcmVzcHVlc3RhIGFudGVyaW9yXHJcblx0XHRjb25zdCBuZXh0UHJvZHVjdHMgPSB0aGlzLl9jb25uZWN0aW9uU2VydmljZS5nZXQodGhpcy5fZGF0YVBhZ2luYXRpb24oKS5saW5rcy5uZXh0LnNsaWNlKDEpKTtcclxuXHJcblx0XHRuZXh0UHJvZHVjdHMuc3Vic2NyaWJlKFxyXG5cdFx0XHQocmVzcG9uc2U6IFBhZ2luYXRpb24pID0+IHtcclxuXHRcdFx0XHRyZXNwb25zZS5saW5rcyA/IHRoaXMudXBkYXRlUGFnZURhdGEocmVzcG9uc2UpIDogdGhpcy5maW5pc2gocmVzcG9uc2UpXHJcblx0XHRcdFx0Ly8gU29sbyBlbWl0aXIgc2kgaGF5IHByb2R1Y3RvcyByZWFsZXNcclxuXHRcdFx0XHRpZiAocmVzcG9uc2UuaXRlbXMgJiYgcmVzcG9uc2UuaXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0dGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC5uZXh0KHJlc3BvbnNlLml0ZW1zKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gU2kgbm8gaGF5IHByb2R1Y3RvcywgaWd1YWwgbGliZXJhbW9zIGVsIHdhaXRpbmdcclxuXHRcdFx0XHRcdHRoaXMuX3dhaXRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdC8vIEVuIGNhc28gZGUgZXJyb3IsIGxpYmVyYXIgZWwgYmxvcXVlb1xyXG5cdFx0XHRcdHRoaXMuX3dhaXRpbmcgPSBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0KVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEFjdHVhbGl6YSBsb3MgZGF0b3MgZGUgbGEgcGFnaW5hLlxyXG5cdCAqIEBwYXJhbSByZXNwb25zZSByZXNwdWVzdGEgZGVsIGJhY2tlbmQgbyBvYmplY3RvIGRlbCB0aXBvIGBQYWdpbmF0aW9uYC5cclxuXHQgKi9cclxuXHR1cGRhdGVQYWdlRGF0YShyZXNwb25zZTogUGFnaW5hdGlvbik6IHZvaWQge1xyXG5cdFx0dGhpcy5fZGF0YVBhZ2luYXRpb24uc2V0KHsgLi4ucmVzcG9uc2UsIGNhbGxlZDogdHJ1ZSB9KVxyXG5cdFx0dGhpcy5fZmluaXNoZWQgPSAocmVzcG9uc2UucGFnZSA9PSByZXNwb25zZS5wYWdlcylcclxuXHRcdHRoaXMuX3dhaXRpbmcgPSBmYWxzZTtcclxuXHRcdC8vIEVtaXRpciBsb3MgdmFsb3JlcyBkZSBwcmljZV9taW4geSBwcmljZV9tYXggYSB0cmF2w6lzIGRlIHByaWNlUmFuZ2VTdWJqZWN0LFxyXG5cdFx0Ly8gcGFyYSBxdWUgb3Ryb3MgY29tcG9uZW50ZXMgKGVqLiBmaWx0cm8gZGUgcHJlY2lvKSBwdWVkYW4gbW9zdHJhcmxvcy5cclxuXHRcdHRoaXMucHJpY2VSYW5nZVN1YmplY3QubmV4dCh7XHJcblx0XHRcdHByaWNlX21pbjogcmVzcG9uc2UucHJpY2VfbWluLFxyXG5cdFx0XHRwcmljZV9tYXg6IHJlc3BvbnNlLnByaWNlX21heFxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBNYXJjYSBlbCBmaW5hbCBkZSBsYXMgcGFnaW5hcywgZXMgZGVjaXIgY3VhbmRvIHlhIG5vIHF1ZWRhIG1hcyBlbGVtZW50b3MgcXVlIG1vc3RyYXIuXHJcblx0ICogQHBhcmFtIHJlc3BvbnNlIFxyXG5cdCAqL1xyXG5cdGZpbmlzaChyZXNwb25zZTogUGFnaW5hdGlvbik6IHZvaWQge1xyXG5cdFx0dGhpcy5fZmluaXNoZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5fd2FpdGluZyA9IGZhbHNlO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBPYnRlbmdvIGxvcyBwcm9kdWN0b3MgZGUgbGEgcGFnaW5hIGNhcmdhZGEgYWN0dWFsLiBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0TmV4dFByb2R1Y3RzKCk6IFByb2R1Y3RbXSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC52YWx1ZTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRGV2dWVsdmUgc2kgZXN0YSBlc3BlcmFuZG8gbyBubyBsYSBwZXRpY2nDs24gYWwgYmFja2VuZC5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0V2FpdGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3dhaXRpbmc7IH1cclxuXHQvKipcclxuXHQgKiBTZXRlYSBsYSB2YXJpYWJsZSB3YWl0aW5nLlxyXG5cdCAqIEBwYXJhbSB2YWx1ZSBcclxuXHQgKi9cclxuXHRwdWJsaWMgc2V0V2FpdGluZyh2YWx1ZTogYm9vbGVhbik6IHZvaWQgeyB0aGlzLl93YWl0aW5nID0gdmFsdWUgfVxyXG5cdC8qKlxyXG5cdCAqIEdldHRlciBwYXJhIGxhIHZhcmlhYmxlIGBfZmluaXNoZWRgLlxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRGaW5pc2hlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2ZpbmlzaGVkOyB9XHJcblx0LyoqXHJcblx0ICogRGV2dWVsdmUgZWwgdG90YWwgZGUgSXRlbXMuXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGdldFRvdGFsSXRlbXMoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmxpbWl0ICogdGhpcy5fZGF0YVBhZ2luYXRpb24oKS5wYWdlO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBPYnRlbmdvIHVuIG9iamVjdG8gY29uIGxvcyBkYXRvcyBkZSBsb3MgZmlsdHJvcyByZXN1bHRhbnRlcy5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0RmlsdGVyc1BhZ2luYXRpb24oKTogYW55IHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdFwiY2F0ZWdvcmllc1wiOiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmNhdGVnb3J5LFxyXG5cdFx0XHRcImF0dHJpYnV0ZXNcIjogdGhpcy5fZGF0YVBhZ2luYXRpb24oKS5hdHRyaWJ1dGVzLFxyXG5cdFx0XHRcIm9wdGlvbnNcIjogdGhpcy5fZGF0YVBhZ2luYXRpb24oKS5vcHRpb25zXHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFBhcmEgY29udHJ1aXN0ZSBsYSB1cmwgZW4gYmFzZSBhIGxvcyBmaWx0cm9zIGFwbGljYWRvcy5cclxuXHQgKiBAcGFyYW0gZmlsdGVycyBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgYnVpbGRVcmwoZmlsdGVyczogRmlsdGVyW10pIHtcclxuXHRcdGNvbnN0IHVybCA9IHRoaXMuX2NvbnN0YW50cy5zZWFyY2hWYWx1ZVxyXG5cdFx0XHQ/IHRoaXMuX2ZpbHRlcnNTZXJ2aWNlLmdlbmVyYXRlRmluYWxBcGkodGhpcy5fY29uc3RhbnRzLnNlYXJjaFZhbHVlKVxyXG5cdFx0XHQ6IHRoaXMuX2ZpbHRlcnNTZXJ2aWNlLmdlbmVyYXRlRmluYWxBcGkoKTtcclxuXHJcblx0XHRyZXR1cm4gdXJsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGV2dWVsdmUgdW4gb2JzZXJ2YWJsZSBkZSBsb3MgcHJvZHVjdG9zIHF1ZSBkZXZvbHZpw7MgbGEgw7psdGltYSBww6FnaW5hIG9idGVuaWRhLlxyXG5cdCAqIEBwYXJhbSB1cmwgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGdldERhdGEodXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFByb2R1Y3RbXT4ge1xyXG5cclxuXHRcdC8vIERldGVjdGFyIGxhIHDDoWdpbmEgZGVzZGUgbGEgVVJMICg/cGFnZT1uKS4gU2kgbm8gdmllbmUsIGFzdW1pbW9zIHBhZ2U9MS5cclxuXHRcdGNvbnN0IHBhZ2VNYXRjaCA9IHVybC5tYXRjaCgvWz8mXXBhZ2U9KFxcZCspLyk7XHJcblx0XHRjb25zdCBwYWdlID0gcGFnZU1hdGNoID8gTnVtYmVyKHBhZ2VNYXRjaFsxXSkgOiAxO1xyXG5cclxuXHRcdC8vIFNpIGVzIGxhIHByaW1lcmEgcMOhZ2luYSwgcmVzZXRlYW1vcyBlc3RhZG8gaW50ZXJub1xyXG5cdFx0aWYgKHBhZ2UgPT09IDEpIHtcclxuXHRcdFx0dGhpcy5fcmVzZXRTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblx0XHRcdC8vIFJlc2V0ZWFyIGVzdGFkbyBkZSBwYWdpbmFjacOzbiBwYXJhIHBlcm1pdGlyIHNjcm9sbFxyXG5cdFx0XHR0aGlzLl9maW5pc2hlZCA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl93YWl0aW5nID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX3N0YXJ0ID0gZmFsc2U7IC8vIFlhIG5vIGVzIGVsIGluaWNpbyBkZXNwdcOpcyBkZSBnZXREYXRhXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTGxhbWFtb3MgYWwgYmFja2VuZCBjb24gZWwgcGFnZSBjb3JyZWN0b1xyXG5cdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25TZXJ2aWNlLmdldCh1cmwsIHsgbGltaXQ6IDEwLCBwYWdlIH0pLnBpcGUoXHJcblx0XHRcdHRhcCgocmVzOiBQYWdpbmF0aW9uKSA9PiB7XHJcblx0XHRcdFx0Ly8gQWN0dWFsaXphciBkYXRvcyBkZSBwYWdpbmFjacOzbiArIHByaWNlX21pbi9wcmljZV9tYXhcclxuXHRcdFx0XHRyZXMubGlua3MgPyB0aGlzLnVwZGF0ZVBhZ2VEYXRhKHJlcykgOiB0aGlzLmZpbmlzaChyZXMpO1xyXG5cdFx0XHR9KSxcclxuXHRcdFx0bWFwKChyZXM6IFBhZ2luYXRpb24pID0+IHtcclxuXHRcdFx0XHRjb25zdCBpdGVtcyA9IHJlcy5pdGVtcyA/PyBbXTtcclxuXHJcblx0XHRcdFx0Ly8gTG8gcXVlIHZlIHBhZ2luYXRpb25EYXRhJCAoc3dpdGNoTWFwKSBzb24gZXN0b3MgaXRlbXNcclxuXHRcdFx0XHRyZXR1cm4gaXRlbXM7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxufSJdfQ==
@@ -19,57 +19,65 @@ export class ProductsService {
19
19
  filtersSubject = new BehaviorSubject([]);
20
20
  filters$ = this.filtersSubject.asObservable();
21
21
  searchValue = signal('');
22
+ // Semáforo para evitar peticiones simultáneas (ej. pedir pág 3 mientras carga pág 2)
23
+ isLoadingNextPage = false;
22
24
  constructor() {
25
+ // 1. Resetear todo al cambiar filtros o limpiar
23
26
  this._paginationService.reset$.subscribe(res => {
27
+ this.isLoadingNextPage = false;
24
28
  this._productsSubject.next([]);
25
29
  });
30
+ // 2. Datos principales / Carga inicial (SOLO página 1)
31
+ // Este observable se dispara cuando cambian los filtros o se recarga la página
26
32
  this._paginationService.paginationData$.subscribe(products => {
27
- const productsWithUniqueVariant = this._consts.getProductWithUniqueVariant();
28
- if (productsWithUniqueVariant)
29
- products = this.getProductsWithUniqueVariant(products, this.getObjectWithVariant());
30
- const currentProducts = this._productsSubject.value;
31
- this._productsSubject.next([...currentProducts, ...products]);
33
+ // Para la carga inicial, REEMPLAZAMOS los productos (no agregamos)
34
+ if (products && products.length > 0) {
35
+ this._productsSubject.next(products);
36
+ }
37
+ // Liberamos el semáforo después de procesar
38
+ this.isLoadingNextPage = false;
32
39
  });
33
- // Suscribirse a nextProducts$ SOLO para páginas posteriores (scroll infinito)
34
- // Este observable se emite cuando se llama a getNext() desde updateProducts()
35
- let isFirstLoad = true;
40
+ // 3. Paginación (Scroll infinito - páginas 2, 3, 4...)
41
+ // Este observable se dispara SOLO cuando llamamos explícitamente a getNext()
36
42
  this._paginationService.nextProducts$.subscribe(products => {
37
- // Ignorar la primera emisión porque ya la maneja paginationData$
38
- if (isFirstLoad && products.length > 0) {
39
- isFirstLoad = false;
40
- return;
41
- }
42
- if (products.length > 0 && !isFirstLoad) {
43
- const productsWithUniqueVariant = this._consts.getProductWithUniqueVariant();
44
- let processedProducts = products;
45
- if (productsWithUniqueVariant)
46
- processedProducts = this.getProductsWithUniqueVariant(products, this.getObjectWithVariant());
47
- const currentProducts = this._productsSubject.value;
48
- this._productsSubject.next([...currentProducts, ...processedProducts]);
43
+ // SIEMPRE liberamos el semáforo al recibir respuesta, aunque sea vacía
44
+ this.isLoadingNextPage = false;
45
+ if (products && products.length > 0) {
46
+ this.appendProductsSafe(products);
49
47
  }
50
48
  });
51
- // Resetear flag cuando cambian los filtros
52
- this._paginationService.reset$.subscribe(() => {
53
- isFirstLoad = true;
54
- });
55
- // Suscribirse a los cambios en el rango de precios
49
+ // 4. Filtros de precio
56
50
  this._paginationService.priceRange$.subscribe(range => {
57
51
  let min = Math.floor(range.price_min);
58
52
  let max = Math.ceil(range.price_max);
59
53
  this.updatePriceRangeFilter(min, max);
60
54
  });
55
+ // 5. Gestión de filtros generales
61
56
  this._filtersService.filters$.subscribe(filters => {
62
57
  this.filtersSubject.next(filters);
63
58
  });
64
59
  }
65
- appendProducts(products) {
60
+ /**
61
+ * Método seguro para añadir productos.
62
+ * Verifica por ID que el producto no exista ya en la lista para evitar duplicados visuales
63
+ * y resuelve el problema de la "Página 2 perdida".
64
+ */
65
+ appendProductsSafe(products) {
66
66
  const productsWithUniqueVariant = this._consts.getProductWithUniqueVariant();
67
- let output = products;
67
+ let candidates = products;
68
+ // 1. Procesar variantes si es necesario
68
69
  if (productsWithUniqueVariant) {
69
- output = this.getProductsWithUniqueVariant(products, this.getObjectWithVariant());
70
+ candidates = this.getProductsWithUniqueVariant(products, this.getObjectWithVariant());
70
71
  }
71
72
  const currentProducts = this._productsSubject.value;
72
- this._productsSubject.next([...currentProducts, ...output]);
73
+ // 2. FILTRADO DE DUPLICADOS: La clave del arreglo
74
+ // Solo añadimos productos cuyo ID no esté ya en la lista actual.
75
+ // Esto permite que si 'nextProducts' emite la P1 de nuevo, la ignoremos,
76
+ // pero si emite la P2, la agreguemos.
77
+ const newProducts = candidates.filter(candidate => !currentProducts.some(existing => existing.id === candidate.id));
78
+ if (newProducts.length > 0) {
79
+ this._productsSubject.next([...currentProducts, ...newProducts]);
80
+ }
73
81
  }
74
82
  updatePriceRangeFilter(min, max) {
75
83
  const final_filters = this.filtersSubject.value;
@@ -88,8 +96,6 @@ export class ProductsService {
88
96
  relatedProductsApi = (key) => 'shop-api/' + this._apiConsts.CHANNEL + '/products/related/by-code/' + key + '?locale=' + this._apiConsts.LOCALE;
89
97
  /**
90
98
  * Setea los filtros para obtener los productos.
91
- * @param paginationSettings
92
- * @param searchValue
93
99
  */
94
100
  getProductsForFilter(paginationSettings, searchValue, routeQueryParams) {
95
101
  searchValue ? this.searchValue.set(searchValue) : this.searchValue.set('');
@@ -99,37 +105,19 @@ export class ProductsService {
99
105
  }
100
106
  /**
101
107
  * Actualiza los productos con los de la siguiente pagina.
108
+ * Implementa bloqueo para evitar saltos de página por scroll rápido.
102
109
  */
103
110
  updateProducts() {
104
- if (!this._paginationService.getWaiting()) {
111
+ // Solo pedimos si el servicio no está esperando Y nosotros no tenemos el semáforo en rojo
112
+ if (!this._paginationService.getWaiting() && !this.isLoadingNextPage) {
113
+ this.isLoadingNextPage = true;
105
114
  this._paginationService.getNext();
106
115
  }
107
116
  }
108
- /**
109
- * Devuelve el producto por codigo.
110
- * @param code Codigo del producto
111
- * @param variant Para indicar si es variante o no.
112
- * @returns
113
- */
114
117
  getProductByCode(code, variant) {
115
118
  return this._connection.get(this.productByCodeApi(code, variant));
116
119
  }
117
- /**
118
- * @description Guarda la reseña de un producto.
119
- * @param code
120
- * @param form_data
121
- * @returns
122
- */
123
120
  saveReviews = (code, form_data) => this._connection.post(this.saveProductReviewsApi(code), form_data);
124
- /**
125
- * Recibe una lista de productos y retorna los mismos productos tantas veces como variantes tenga.
126
- * cada producto retornado tendrá una única variante.
127
- * @param products Array. Lista de productos.
128
- * @param withOption 'type' tipo de opción, code: código de la opción. 'defaultFirstOption': en caso de que no se pueda desdoblar por la opción indicada si el valor es verdadero se intentara desdoblar por la primera opción asociada al producto.
129
- * 'checkIfStock': en caso de que esta valor sea verdadero se realiza un control de que la variantes cuenten con stock para ser un producto desdoblado por la variante, si el valor es falso no se realiza dicho control y el producto se desdoblara con stock en 0.
130
- * @returns arreglo con los productos desdoblados por la opción solicitada.
131
- * (opción por defecto que se intenta hacer el desdoblamiento 'color', o bien si en le parámetro withOption el atributo 'defaultFirstOption' es verdadero se desdobla por la primera opción asociada al producto)
132
- */
133
121
  getProductsWithUniqueVariant = (products, withOption = { type: 'color', code: 'color', defaultFirstOption: false, checkIfStock: true }) => {
134
122
  !withOption['code'] && withOption['type'] && (withOption['code'] = withOption['type']) || !withOption['code'] && (withOption['code'] = 'color');
135
123
  !withOption['type'] && withOption['code'] && (withOption['type'] = withOption['code']) || !withOption['type'] && (withOption['type'] = 'color');
@@ -143,20 +131,14 @@ export class ProductsService {
143
131
  option.values.forEach((optionValue) => {
144
132
  let modified_product = JSON.parse(JSON.stringify(product));
145
133
  modified_product.options.find((option) => option.type.toLowerCase() == withOption.type?.toLowerCase()).values = [{ code: optionValue.code, name: optionValue.name }];
146
- //busco una variante con ese code para asignarle la lista de imagenes
147
134
  let variantAux = variants.find(variant => ((withOption.checkIfStock && variant.stock > 0) || withOption.checkIfStock == false)
148
135
  && variant.options.length
149
136
  && variant.options.some((op) => (op.hasOwnProperty(withOption.code?.toLowerCase()) || op.hasOwnProperty(withOption.code?.toUpperCase()))
150
137
  && (op[`${withOption.code?.toLowerCase()}`] || op[`${withOption.code?.toUpperCase()}`]) === optionValue.code));
151
- //console.log("---",variantAux);
152
138
  variantAux && productsUniqueVariant.push(this.productWithVariantValues(modified_product, variantAux, optionValue));
153
139
  });
154
140
  }
155
141
  else {
156
- /**
157
- * se modifica el caso para cuando se toma el primer `option` del producto para
158
- * armar la lista de productos con variantes.
159
- */
160
142
  if (withOption.defaultFirstOption && product.options?.length) {
161
143
  let firstOptions = product.options[0];
162
144
  product.options[0].values.forEach((optionValue) => {
@@ -185,8 +167,8 @@ export class ProductsService {
185
167
  };
186
168
  productWithVariantValues = (product, variant, optionValue) => {
187
169
  product.picturesdefault = [...variant.images];
188
- product.variant_id = variant.code; //lo dejo aca hasta asegurarnos de que no se estaba usando en otra parte.
189
- product.stock = variant.stock || 0; //lo dejo aca hasta asegurarnos de que no se estaba usando en otra parte.
170
+ product.variant_id = variant.code;
171
+ product.stock = variant.stock || 0;
190
172
  product.price = variant.price.toString() || '0';
191
173
  product.currentOption = {
192
174
  ...optionValue,
@@ -204,15 +186,12 @@ export class ProductsService {
204
186
  return this._connection.get(this.relatedProductsApi(product_id));
205
187
  }
206
188
  hasStock(product) {
207
- // Si el producto tiene la propiedad 'stock' y es mayor a 0
208
189
  if (typeof product.stock === 'number') {
209
190
  return product.stock > 0;
210
191
  }
211
- // Si el producto tiene variantes, verifica si alguna tiene stock
212
192
  if (Array.isArray(product.variants)) {
213
193
  return product.variants.some(variant => variant.stock > 0);
214
194
  }
215
- // Si no tiene información de stock, asumimos que no hay stock
216
195
  return false;
217
196
  }
218
197
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -224,4 +203,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
224
203
  providedIn: 'root'
225
204
  }]
226
205
  }], ctorParameters: () => [] });
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1zZXJ2aWNlcy9wcm9kdWN0cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUIsTUFBTSxFQUFFLFVBQVUsRUFBeUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxlQUFlLEVBQTBELE1BQU0sTUFBTSxDQUFDO0FBRS9GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTs7QUFLbEQsTUFBTSxPQUFPLGVBQWU7SUFFaEIsV0FBVyxHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzRCxVQUFVLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlELGVBQWUsR0FBbUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELGtCQUFrQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRSxPQUFPLEdBQXlCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRTdELGdCQUFnQixHQUErQixJQUFJLGVBQWUsQ0FBWSxFQUFFLENBQUMsQ0FBQTtJQUNsRixTQUFTLEdBQTBCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FB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QU8sQ0FBQyxrQ0FBa0MsRUFBRSxDQUFBO0lBQzVELENBQUMsQ0FBQTtJQUVELGtCQUFrQixDQUFDLFVBQWU7UUFDOUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQWdCO1FBQ3JCLDJEQUEyRDtRQUMzRCxJQUFJLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxpRUFBaUU7UUFDakUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCw4REFBOEQ7UUFDOUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzt3R0F6UFEsZUFBZTs0R0FBZixlQUFlLGNBRlosTUFBTTs7NEZBRVQsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudEluamVjdG9yLCBpbmplY3QsIEluamVjdGFibGUsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgbWFwLCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERlZmF1bHRGaWx0ZXIsIEZpbHRlckVsZW1lbnQsIEZpbHRlclR5cGUsIElGaWx0ZXIsIE9wdGlvbnMsIFBhZ2luYXRpb25TZXR0aW5ncywgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCwgUHJvZHVjdCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2FwaSc7XHJcbmltcG9ydCB7IEFwaUNvbnN0YW50c1NlcnZpY2UsIENvcmVDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuL29wdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhZ2luYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9wYWdpbmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlckZhY3RvcnksIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XHJcbmltcG9ydCB7IFByaWNlUmFuZ2VGaWx0ZXIgfSBmcm9tICcuLi9jbGFzc2VzL2ZpbHRlcnMvcHJpY2VfcmFuZ2UtZmlsdGVyJztcclxuaW1wb3J0IHsgRmlsdGVyc1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcnMuc2VydmljZSdcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvZHVjdHNTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIF9jb25uZWN0aW9uOiBDb25uZWN0aW9uU2VydmljZSA9IGluamVjdChDb25uZWN0aW9uU2VydmljZSk7XHJcbiAgICBwcml2YXRlIF9hcGlDb25zdHM6IEFwaUNvbnN0YW50c1NlcnZpY2UgPSBpbmplY3QoQXBpQ29uc3RhbnRzU2VydmljZSk7XHJcbiAgICBwcml2YXRlIF9vcHRpb25zU2VydmljZTogT3B0aW9uc1NlcnZpY2UgPSBpbmplY3QoT3B0aW9uc1NlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlID0gaW5qZWN0KFBhZ2luYXRpb25TZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX2NvbnN0czogQ29yZUNvbnN0YW50c1NlcnZpY2UgPSBpbmplY3QoQ29yZUNvbnN0YW50c1NlcnZpY2UpO1xyXG5cclxuICAgIHByaXZhdGUgX3Byb2R1Y3RzU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RbXT4oW10pXHJcbiAgICBwdWJsaWMgcHJvZHVjdHMkOiBPYnNlcnZhYmxlPFByb2R1Y3RbXT4gPSB0aGlzLl9wcm9kdWN0c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwcml2YXRlIF9maWx0ZXJzU2VydmljZTogRmlsdGVyc1NlcnZpY2UgPSBpbmplY3QoRmlsdGVyc1NlcnZpY2UpXHJcbiAgICBwcml2YXRlIGZpbHRlcnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8RmlsdGVyW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJbXT4oW10pO1xyXG4gICAgcHVibGljIGZpbHRlcnMkID0gdGhpcy5maWx0ZXJzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwcml2YXRlIHNlYXJjaFZhbHVlID0gc2lnbmFsPHN0cmluZz4oJycpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25TZXJ2aWNlLnJlc2V0JC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcHJvZHVjdHNTdWJqZWN0Lm5leHQoW10pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uU2VydmljZS5wYWdpbmF0aW9uRGF0YSQuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICBwcm9kdWN0cyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0gdGhpcy5fY29uc3RzLmdldFByb2R1Y3RXaXRoVW5pcXVlVmFyaWFudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHMgPSB0aGlzLmdldFByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQocHJvZHVjdHMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFByb2R1Y3RzID0gdGhpcy5fcHJvZHVjdHNTdWJqZWN0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZHVjdHNTdWJqZWN0Lm5leHQoWy4uLmN1cnJlbnRQcm9kdWN0cywgLi4ucHJvZHVjdHNdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gU3VzY3JpYmlyc2UgYSBuZXh0UHJvZHVjdHMkIFNPTE8gcGFyYSBww6FnaW5hcyBwb3N0ZXJpb3JlcyAoc2Nyb2xsIGluZmluaXRvKVxyXG4gICAgICAgIC8vIEVzdGUgb2JzZXJ2YWJsZSBzZSBlbWl0ZSBjdWFuZG8gc2UgbGxhbWEgYSBnZXROZXh0KCkgZGVzZGUgdXBkYXRlUHJvZHVjdHMoKVxyXG4gICAgICAgIGxldCBpc0ZpcnN0TG9hZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvblNlcnZpY2UubmV4dFByb2R1Y3RzJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIHByb2R1Y3RzID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIElnbm9yYXIgbGEgcHJpbWVyYSBlbWlzacOzbiBwb3JxdWUgeWEgbGEgbWFuZWphIHBhZ2luYXRpb25EYXRhJFxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3RMb2FkICYmIHByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0TG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RzLmxlbmd0aCA+IDAgJiYgIWlzRmlyc3RMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHRoaXMuX2NvbnN0cy5nZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvY2Vzc2VkUHJvZHVjdHMgPSBwcm9kdWN0cztcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkUHJvZHVjdHMgPSB0aGlzLmdldFByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQocHJvZHVjdHMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9kdWN0cyA9IHRoaXMuX3Byb2R1Y3RzU3ViamVjdC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9kdWN0c1N1YmplY3QubmV4dChbLi4uY3VycmVudFByb2R1Y3RzLCAuLi5wcm9jZXNzZWRQcm9kdWN0c10pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBSZXNldGVhciBmbGFnIGN1YW5kbyBjYW1iaWFuIGxvcyBmaWx0cm9zXHJcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvblNlcnZpY2UucmVzZXQkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlzRmlyc3RMb2FkID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBTdXNjcmliaXJzZSBhIGxvcyBjYW1iaW9zIGVuIGVsIHJhbmdvIGRlIHByZWNpb3NcclxuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uU2VydmljZS5wcmljZVJhbmdlJC5zdWJzY3JpYmUocmFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbWluID0gTWF0aC5mbG9vcihyYW5nZS5wcmljZV9taW4pO1xyXG4gICAgICAgICAgICBsZXQgbWF4ID0gTWF0aC5jZWlsKHJhbmdlLnByaWNlX21heCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpY2VSYW5nZUZpbHRlcihtaW4sIG1heCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZmlsdGVyc1NlcnZpY2UuZmlsdGVycyQuc3Vic2NyaWJlKGZpbHRlcnMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNTdWJqZWN0Lm5leHQoZmlsdGVycyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcHBlbmRQcm9kdWN0cyhwcm9kdWN0czogUHJvZHVjdFtdKSB7XHJcbiAgICAgICAgY29uc3QgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHRoaXMuX2NvbnN0cy5nZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQoKTtcclxuICAgICAgICBsZXQgb3V0cHV0ID0gcHJvZHVjdHM7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgb3V0cHV0ID0gdGhpcy5nZXRQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KHByb2R1Y3RzLCB0aGlzLmdldE9iamVjdFdpdGhWYXJpYW50KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFByb2R1Y3RzID0gdGhpcy5fcHJvZHVjdHNTdWJqZWN0LnZhbHVlO1xyXG4gICAgICAgIHRoaXMuX3Byb2R1Y3RzU3ViamVjdC5uZXh0KFsuLi5jdXJyZW50UHJvZHVjdHMsIC4uLm91dHB1dF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlUHJpY2VSYW5nZUZpbHRlcihtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBmaW5hbF9maWx0ZXJzOiBGaWx0ZXJbXSA9IHRoaXMuZmlsdGVyc1N1YmplY3QudmFsdWU7XHJcbiAgICAgICAgY29uc3QgcHJpY2VSYW5nZUZpbHRlciA9IGZpbmFsX2ZpbHRlcnMuZmluZChmaWx0ZXIgPT4gZmlsdGVyIGluc3RhbmNlb2YgUHJpY2VSYW5nZUZpbHRlcik7XHJcblxyXG4gICAgICAgIGlmIChwcmljZVJhbmdlRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIChwcmljZVJhbmdlRmlsdGVyIGFzIFByaWNlUmFuZ2VGaWx0ZXIpLnVwZGF0ZVByaWNlcyhtaW4sIG1heCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1N1YmplY3QubmV4dChmaW5hbF9maWx0ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL0FQSSBVUkxcclxuICAgIHByaXZhdGUgX3Nob3BBcGlVcmwgPSB0aGlzLl9hcGlDb25zdHMuU0hPUF9BUElfVVJMO1xyXG4gICAgcHJvZHVjdEJ5Q29kZUFwaShjb2RlOiBzdHJpbmcsIHZhcmlhbnQ6IGJvb2xlYW4pIHsgcmV0dXJuIHRoaXMuX3Nob3BBcGlVcmwgKyB0aGlzLl9hcGlDb25zdHMuQ0hBTk5FTCArICcvcHJvZHVjdHMvYnktY29kZS8nICsgKHZhcmlhbnQgPyAndmFyaWFudC8nIDogJycpICsgY29kZSArICc/bG9jYWxlPScgKyB0aGlzLl9hcGlDb25zdHMuTE9DQUxFOyB9XHJcbiAgICAvLyByZXZpZXdcclxuICAgIHNhdmVQcm9kdWN0UmV2aWV3c0FwaShjb2RlOiBzdHJpbmcpIHsgcmV0dXJuIHRoaXMuX3Nob3BBcGlVcmwgKyB0aGlzLl9hcGlDb25zdHMuQ0hBTk5FTCArICcvcHJvZHVjdHMvYnktY29kZS8nICsgY29kZSArICcvcmV2aWV3cyc7IH1cclxuICAgIC8vcmVsYXRlZCBwcm9kdWN0c1xyXG4gICAgcmVsYXRlZFByb2R1Y3RzQXBpID0gKGtleTogc3RyaW5nKTogc3RyaW5nID0+ICdzaG9wLWFwaS8nICsgdGhpcy5fYXBpQ29uc3RzLkNIQU5ORUwgKyAnL3Byb2R1Y3RzL3JlbGF0ZWQvYnktY29kZS8nICsga2V5ICsgJz9sb2NhbGU9JyArIHRoaXMuX2FwaUNvbnN0cy5MT0NBTEU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRlYSBsb3MgZmlsdHJvcyBwYXJhIG9idGVuZXIgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBwYWdpbmF0aW9uU2V0dGluZ3MgXHJcbiAgICAgKiBAcGFyYW0gc2VhcmNoVmFsdWUgXHJcbiAgICAgKi9cclxuICAgIGdldFByb2R1Y3RzRm9yRmlsdGVyKFxyXG4gICAgICAgIHBhZ2luYXRpb25TZXR0aW5ncz86IFBhZ2luYXRpb25TZXR0aW5ncyxcclxuICAgICAgICBzZWFyY2hWYWx1ZT86IGFueSxcclxuICAgICAgICByb3V0ZVF1ZXJ5UGFyYW1zPzogYW55XHJcbiAgICApOiBhbnkge1xyXG4gICAgICAgIHNlYXJjaFZhbHVlID8gdGhpcy5zZWFyY2hWYWx1ZS5zZXQoc2VhcmNoVmFsdWUpIDogdGhpcy5zZWFyY2hWYWx1ZS5zZXQoJycpO1xyXG4gICAgICAgIGlmIChwYWdpbmF0aW9uU2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsdGVyc1NlcnZpY2Uuc2V0RmlsdGVycyhwYWdpbmF0aW9uU2V0dGluZ3MsIHNlYXJjaFZhbHVlLCByb3V0ZVF1ZXJ5UGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFjdHVhbGl6YSBsb3MgcHJvZHVjdG9zIGNvbiBsb3MgZGUgbGEgc2lndWllbnRlIHBhZ2luYS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlUHJvZHVjdHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9wYWdpbmF0aW9uU2VydmljZS5nZXRXYWl0aW5nKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fcGFnaW5hdGlvblNlcnZpY2UuZ2V0TmV4dCgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXZ1ZWx2ZSBlbCBwcm9kdWN0byBwb3IgY29kaWdvLlxyXG4gICAgICogQHBhcmFtIGNvZGUgQ29kaWdvIGRlbCBwcm9kdWN0b1xyXG4gICAgICogQHBhcmFtIHZhcmlhbnQgUGFyYSBpbmRpY2FyIHNpIGVzIHZhcmlhbnRlIG8gbm8uXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgZ2V0UHJvZHVjdEJ5Q29kZShjb2RlOiBzdHJpbmcsIHZhcmlhbnQ6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFByb2R1Y3Q+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbi5nZXQodGhpcy5wcm9kdWN0QnlDb2RlQXBpKGNvZGUsIHZhcmlhbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQGRlc2NyaXB0aW9uIEd1YXJkYSBsYSByZXNlw7FhIGRlIHVuIHByb2R1Y3RvLlxyXG4gICAgKiBAcGFyYW0gY29kZVxyXG4gICAgKiBAcGFyYW0gZm9ybV9kYXRhXHJcbiAgICAqIEByZXR1cm5zXHJcbiAgICAqL1xyXG4gICAgc2F2ZVJldmlld3MgPSAoY29kZTogc3RyaW5nLCBmb3JtX2RhdGE6IGFueSkgPT4gdGhpcy5fY29ubmVjdGlvbi5wb3N0KHRoaXMuc2F2ZVByb2R1Y3RSZXZpZXdzQXBpKGNvZGUpLCBmb3JtX2RhdGEpXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjaWJlIHVuYSBsaXN0YSBkZSBwcm9kdWN0b3MgeSByZXRvcm5hIGxvcyBtaXNtb3MgcHJvZHVjdG9zIHRhbnRhcyB2ZWNlcyBjb21vIHZhcmlhbnRlcyB0ZW5nYS5cclxuICAgICAqIGNhZGEgcHJvZHVjdG8gcmV0b3JuYWRvIHRlbmRyw6EgdW5hIMO6bmljYSB2YXJpYW50ZS5cclxuICAgICAqIEBwYXJhbSBwcm9kdWN0cyAgQXJyYXkuIExpc3RhIGRlIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSB3aXRoT3B0aW9uICd0eXBlJyB0aXBvIGRlIG9wY2nDs24sIGNvZGU6IGPDs2RpZ28gZGUgbGEgb3BjacOzbi4gJ2RlZmF1bHRGaXJzdE9wdGlvbic6IGVuIGNhc28gZGUgcXVlIG5vIHNlIHB1ZWRhIGRlc2RvYmxhciBwb3IgbGEgb3BjacOzbiBpbmRpY2FkYSBzaSBlbCB2YWxvciBlcyB2ZXJkYWRlcm8gc2UgaW50ZW50YXJhIGRlc2RvYmxhciBwb3IgbGEgcHJpbWVyYSBvcGNpw7NuIGFzb2NpYWRhIGFsIHByb2R1Y3RvLlxyXG4gICAgICogJ2NoZWNrSWZTdG9jayc6IGVuIGNhc28gZGUgcXVlIGVzdGEgdmFsb3Igc2VhIHZlcmRhZGVybyBzZSByZWFsaXphIHVuIGNvbnRyb2wgZGUgcXVlIGxhIHZhcmlhbnRlcyBjdWVudGVuIGNvbiBzdG9jayBwYXJhIHNlciB1biBwcm9kdWN0byBkZXNkb2JsYWRvIHBvciBsYSB2YXJpYW50ZSwgc2kgZWwgdmFsb3IgZXMgZmFsc28gbm8gc2UgcmVhbGl6YSBkaWNobyBjb250cm9sIHkgZWwgcHJvZHVjdG8gc2UgZGVzZG9ibGFyYSBjb24gc3RvY2sgZW4gMC5cclxuICAgICAqIEByZXR1cm5zIGFycmVnbG8gY29uIGxvcyBwcm9kdWN0b3MgZGVzZG9ibGFkb3MgcG9yIGxhIG9wY2nDs24gc29saWNpdGFkYS5cclxuICAgICAqIChvcGNpw7NuIHBvciBkZWZlY3RvIHF1ZSBzZSBpbnRlbnRhIGhhY2VyIGVsIGRlc2RvYmxhbWllbnRvICdjb2xvcicsIG8gYmllbiBzaSBlbiBsZSBwYXLDoW1ldHJvIHdpdGhPcHRpb24gZWwgYXRyaWJ1dG8gJ2RlZmF1bHRGaXJzdE9wdGlvbicgZXMgdmVyZGFkZXJvIHNlIGRlc2RvYmxhIHBvciBsYSBwcmltZXJhIG9wY2nDs24gYXNvY2lhZGEgYWwgcHJvZHVjdG8pXHJcbiAgICAgKi9cclxuICAgIGdldFByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAocHJvZHVjdHM6IFByb2R1Y3RbXSwgd2l0aE9wdGlvbjogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHsgdHlwZTogJ2NvbG9yJywgY29kZTogJ2NvbG9yJywgZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSwgY2hlY2tJZlN0b2NrOiB0cnVlIH0pID0+IHtcclxuXHJcbiAgICAgICAgIXdpdGhPcHRpb25bJ2NvZGUnXSAmJiB3aXRoT3B0aW9uWyd0eXBlJ10gJiYgKHdpdGhPcHRpb25bJ2NvZGUnXSA9IHdpdGhPcHRpb25bJ3R5cGUnXSkgfHwgIXdpdGhPcHRpb25bJ2NvZGUnXSAmJiAod2l0aE9wdGlvblsnY29kZSddID0gJ2NvbG9yJylcclxuICAgICAgICAhd2l0aE9wdGlvblsndHlwZSddICYmIHdpdGhPcHRpb25bJ2NvZGUnXSAmJiAod2l0aE9wdGlvblsndHlwZSddID0gd2l0aE9wdGlvblsnY29kZSddKSB8fCAhd2l0aE9wdGlvblsndHlwZSddICYmICh3aXRoT3B0aW9uWyd0eXBlJ10gPSAnY29sb3InKVxyXG4gICAgICAgICF3aXRoT3B0aW9uLmhhc093blByb3BlcnR5KCdkZWZhdWx0Rmlyc3RPcHRpb24nKSAmJiAod2l0aE9wdGlvblsnZGVmYXVsdEZpcnN0T3B0aW9uJ10gPSBmYWxzZSlcclxuICAgICAgICAhd2l0aE9wdGlvbi5oYXNPd25Qcm9wZXJ0eSgnY2hlY2tJZlN0b2NrJykgJiYgKHdpdGhPcHRpb25bJ2NoZWNrSWZTdG9jayddID0gdHJ1ZSlcclxuXHJcbiAgICAgICAgbGV0IHByb2R1Y3RzVW5pcXVlVmFyaWFudDogYW55W10gPSBbXTtcclxuICAgICAgICBwcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IHZhcmlhbnRzID0gWy4uLnByb2R1Y3Q/LnZhcmlhbnRzXTtcclxuICAgICAgICAgICAgbGV0IG9wdGlvbiA9IHByb2R1Y3Qub3B0aW9ucy5maW5kKChvcHQ6IGFueSkgPT4gb3B0LnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gd2l0aE9wdGlvbi50eXBlPy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uLnZhbHVlcy5mb3JFYWNoKChvcHRpb25WYWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGlmaWVkX3Byb2R1Y3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHByb2R1Y3QpKTtcclxuICAgICAgICAgICAgICAgICAgICBtb2RpZmllZF9wcm9kdWN0Lm9wdGlvbnMuZmluZCgob3B0aW9uOiBhbnkpID0+IG9wdGlvbi50eXBlLnRvTG93ZXJDYXNlKCkgPT0gd2l0aE9wdGlvbi50eXBlPy50b0xvd2VyQ2FzZSgpKS52YWx1ZXMgPSBbeyBjb2RlOiBvcHRpb25WYWx1ZS5jb2RlLCBuYW1lOiBvcHRpb25WYWx1ZS5uYW1lIH1dO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vYnVzY28gdW5hIHZhcmlhbnRlIGNvbiBlc2UgY29kZSBwYXJhIGFzaWduYXJsZSBsYSBsaXN0YSBkZSBpbWFnZW5lc1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YXJpYW50QXV4ID0gdmFyaWFudHMuZmluZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9PiAoKHdpdGhPcHRpb24uY2hlY2tJZlN0b2NrICYmIHZhcmlhbnQuc3RvY2sgPiAwKSB8fCB3aXRoT3B0aW9uLmNoZWNrSWZTdG9jayA9PSBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZhcmlhbnQub3B0aW9ucy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZhcmlhbnQub3B0aW9ucy5zb21lKChvcDogYW55KSA9PiAob3AuaGFzT3duUHJvcGVydHkod2l0aE9wdGlvbi5jb2RlPy50b0xvd2VyQ2FzZSgpKSB8fCBvcC5oYXNPd25Qcm9wZXJ0eSh3aXRoT3B0aW9uLmNvZGU/LnRvVXBwZXJDYXNlKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChvcFtgJHt3aXRoT3B0aW9uLmNvZGU/LnRvTG93ZXJDYXNlKCl9YF0gfHwgb3BbYCR7d2l0aE9wdGlvbi5jb2RlPy50b1VwcGVyQ2FzZSgpfWBdKSA9PT0gb3B0aW9uVmFsdWUuY29kZSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiLS0tXCIsdmFyaWFudEF1eCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudEF1eCAmJiBwcm9kdWN0c1VuaXF1ZVZhcmlhbnQucHVzaCh0aGlzLnByb2R1Y3RXaXRoVmFyaWFudFZhbHVlcyhtb2RpZmllZF9wcm9kdWN0LCB2YXJpYW50QXV4LCBvcHRpb25WYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogc2UgbW9kaWZpY2EgZWwgY2FzbyBwYXJhIGN1YW5kbyBzZSB0b21hIGVsIHByaW1lciBgb3B0aW9uYCBkZWwgcHJvZHVjdG8gcGFyYVxyXG4gICAgICAgICAgICAgICAgICogYXJtYXIgbGEgbGlzdGEgZGUgcHJvZHVjdG9zIGNvbiB2YXJpYW50ZXMuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmICh3aXRoT3B0aW9uLmRlZmF1bHRGaXJzdE9wdGlvbiAmJiBwcm9kdWN0Lm9wdGlvbnM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaXJzdE9wdGlvbnMgPSBwcm9kdWN0Lm9wdGlvbnNbMF1cclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Lm9wdGlvbnNbMF0udmFsdWVzLmZvckVhY2goKG9wdGlvblZhbHVlOiBhbnkpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtb2RpZmllZF9wcm9kdWN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwcm9kdWN0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkX3Byb2R1Y3Qub3B0aW9ucy5maW5kKChvcHRpb246IE9wdGlvbnMpID0+IG9wdGlvbi50eXBlID09IGZpcnN0T3B0aW9ucy50eXBlKS52YWx1ZXMgPSBbeyBjb2RlOiBvcHRpb25WYWx1ZS5jb2RlLCBuYW1lOiBvcHRpb25WYWx1ZS5uYW1lIH1dO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhbnRBdXggPSB2YXJpYW50cy5maW5kKHZhcmlhbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhbnQub3B0aW9ucy5maW5kKChlbGVtOiBhbnkpID0+IGVsZW1bZmlyc3RPcHRpb25zLmNvZGVdID09IG9wdGlvblZhbHVlLmNvZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudEF1eCAmJiB2YXJpYW50QXV4LmltYWdlcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudEF1eC5pbWFnZXMgPSBwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2l0aE9wdGlvbi5jaGVja0lmU3RvY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YXJpYW50QXV4ICYmIHZhcmlhbnRBdXguc3RvY2sgPiAwKSA/IHByb2R1Y3RzVW5pcXVlVmFyaWFudC5wdXNoKHRoaXMucHJvZHVjdFdpdGhWYXJpYW50VmFsdWVzKG1vZGlmaWVkX3Byb2R1Y3QsIHZhcmlhbnRBdXgsIG9wdGlvblZhbHVlKSkgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudEF1eCAmJiBwcm9kdWN0c1VuaXF1ZVZhcmlhbnQucHVzaCh0aGlzLnByb2R1Y3RXaXRoVmFyaWFudFZhbHVlcyhtb2RpZmllZF9wcm9kdWN0LCB2YXJpYW50QXV4LCBvcHRpb25WYWx1ZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHNVbmlxdWVWYXJpYW50LnB1c2gocHJvZHVjdClcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiBwcm9kdWN0c1VuaXF1ZVZhcmlhbnQubGVuZ3RoID4gMCA/IHByb2R1Y3RzVW5pcXVlVmFyaWFudCA6IHByb2R1Y3RzO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2R1Y3RXaXRoVmFyaWFudFZhbHVlcyA9IChwcm9kdWN0OiBQcm9kdWN0LCB2YXJpYW50OiBhbnksIG9wdGlvblZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICBwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdCA9IFsuLi52YXJpYW50LmltYWdlc11cclxuICAgICAgICBwcm9kdWN0LnZhcmlhbnRfaWQgPSB2YXJpYW50LmNvZGU7IC8vbG8gZGVqbyBhY2EgaGFzdGEgYXNlZ3VyYXJub3MgZGUgcXVlIG5vIHNlIGVzdGFiYSB1c2FuZG8gZW4gb3RyYSBwYXJ0ZS5cclxuICAgICAgICBwcm9kdWN0LnN0b2NrID0gdmFyaWFudC5zdG9jayB8fCAwOyAvL2xvIGRlam8gYWNhIGhhc3RhIGFzZWd1cmFybm9zIGRlIHF1ZSBubyBzZSBlc3RhYmEgdXNhbmRvIGVuIG90cmEgcGFydGUuXHJcbiAgICAgICAgcHJvZHVjdC5wcmljZSA9IHZhcmlhbnQucHJpY2UudG9TdHJpbmcoKSB8fCAnMCc7XHJcbiAgICAgICAgcHJvZHVjdC5jdXJyZW50T3B0aW9uID0ge1xyXG4gICAgICAgICAgICAuLi5vcHRpb25WYWx1ZSxcclxuICAgICAgICAgICAgcHJvZHVjdENvZGU6IHByb2R1Y3QuaWQsXHJcbiAgICAgICAgICAgIHZhcmlhbnRDb2RlOiB2YXJpYW50LmNvZGUsXHJcbiAgICAgICAgICAgIHN0b2NrOiB2YXJpYW50LnN0b2NrIHx8IDAsXHJcbiAgICAgICAgICAgIGZpbmFsUHJpY2U6IHZhcmlhbnQuc2FsZXByaWNlIHx8IHZhcmlhbnQucHJpY2UgfHwgMCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE9iamVjdFdpdGhWYXJpYW50ID0gKCk6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHMuZ2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCgpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVsYXRlZFByb2R1Y3RzKHByb2R1Y3RfaWQ6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uLmdldCh0aGlzLnJlbGF0ZWRQcm9kdWN0c0FwaShwcm9kdWN0X2lkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzU3RvY2socHJvZHVjdDogUHJvZHVjdCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIC8vIFNpIGVsIHByb2R1Y3RvIHRpZW5lIGxhIHByb3BpZWRhZCAnc3RvY2snIHkgZXMgbWF5b3IgYSAwXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9kdWN0LnN0b2NrID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvZHVjdC5zdG9jayA+IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNpIGVsIHByb2R1Y3RvIHRpZW5lIHZhcmlhbnRlcywgdmVyaWZpY2Egc2kgYWxndW5hIHRpZW5lIHN0b2NrXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvZHVjdC52YXJpYW50cykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3QudmFyaWFudHMuc29tZSh2YXJpYW50ID0+IHZhcmlhbnQuc3RvY2sgPiAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2kgbm8gdGllbmUgaW5mb3JtYWNpw7NuIGRlIHN0b2NrLCBhc3VtaW1vcyBxdWUgbm8gaGF5IHN0b2NrXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1zZXJ2aWNlcy9wcm9kdWN0cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUIsTUFBTSxFQUFFLFVBQVUsRUFBeUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxlQUFlLEVBQTBELE1BQU0sTUFBTSxDQUFDO0FBRS9GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTs7QUFLbEQsTUFBTSxPQUFPLGVBQWU7SUFFaEIsV0FBVyxHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzRCxVQUFVLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlELGVBQWUsR0FBbUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELGtCQUFrQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRSxPQUFPLEdBQXlCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRTdELGdCQUFnQixHQUErQixJQUFJLGVBQWUsQ0FBWSxFQUFFLENBQUMsQ0FBQTtJQUNsRixTQUFTLEdBQTBCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FB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QyxPQUFPLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7d0dBeE9RLGVBQWU7NEdBQWYsZUFBZSxjQUZaLE1BQU07OzRGQUVULGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRJbmplY3RvciwgaW5qZWN0LCBJbmplY3RhYmxlLCBydW5JbkluamVjdGlvbkNvbnRleHQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG1hcCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEZWZhdWx0RmlsdGVyLCBGaWx0ZXJFbGVtZW50LCBGaWx0ZXJUeXBlLCBJRmlsdGVyLCBPcHRpb25zLCBQYWdpbmF0aW9uU2V0dGluZ3MsIFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQsIFByb2R1Y3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hcGknO1xyXG5pbXBvcnQgeyBBcGlDb25zdGFudHNTZXJ2aWNlLCBDb3JlQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9vcHRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vcGFnaW5hdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJGYWN0b3J5LCB9IGZyb20gJy4uL2NsYXNzZXMnO1xyXG5pbXBvcnQgeyBQcmljZVJhbmdlRmlsdGVyIH0gZnJvbSAnLi4vY2xhc3Nlcy9maWx0ZXJzL3ByaWNlX3JhbmdlLWZpbHRlcic7XHJcbmltcG9ydCB7IEZpbHRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9maWx0ZXJzLnNlcnZpY2UnXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3RzU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBfY29ubmVjdGlvbjogQ29ubmVjdGlvblNlcnZpY2UgPSBpbmplY3QoQ29ubmVjdGlvblNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfYXBpQ29uc3RzOiBBcGlDb25zdGFudHNTZXJ2aWNlID0gaW5qZWN0KEFwaUNvbnN0YW50c1NlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlID0gaW5qZWN0KE9wdGlvbnNTZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX3BhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSA9IGluamVjdChQYWdpbmF0aW9uU2VydmljZSk7XHJcbiAgICBwcml2YXRlIF9jb25zdHM6IENvcmVDb25zdGFudHNTZXJ2aWNlID0gaW5qZWN0KENvcmVDb25zdGFudHNTZXJ2aWNlKTtcclxuXHJcbiAgICBwcml2YXRlIF9wcm9kdWN0c1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0W10+KFtdKVxyXG4gICAgcHVibGljIHByb2R1Y3RzJDogT2JzZXJ2YWJsZTxQcm9kdWN0W10+ID0gdGhpcy5fcHJvZHVjdHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfZmlsdGVyc1NlcnZpY2U6IEZpbHRlcnNTZXJ2aWNlID0gaW5qZWN0KEZpbHRlcnNTZXJ2aWNlKVxyXG4gICAgcHJpdmF0ZSBmaWx0ZXJzU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEZpbHRlcltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmlsdGVyW10+KFtdKTtcclxuICAgIHB1YmxpYyBmaWx0ZXJzJCA9IHRoaXMuZmlsdGVyc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgcHJpdmF0ZSBzZWFyY2hWYWx1ZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcclxuXHJcbiAgICAvLyBTZW3DoWZvcm8gcGFyYSBldml0YXIgcGV0aWNpb25lcyBzaW11bHTDoW5lYXMgKGVqLiBwZWRpciBww6FnIDMgbWllbnRyYXMgY2FyZ2EgcMOhZyAyKVxyXG4gICAgcHJpdmF0ZSBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIC8vIDEuIFJlc2V0ZWFyIHRvZG8gYWwgY2FtYmlhciBmaWx0cm9zIG8gbGltcGlhclxyXG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25TZXJ2aWNlLnJlc2V0JC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9wcm9kdWN0c1N1YmplY3QubmV4dChbXSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIDIuIERhdG9zIHByaW5jaXBhbGVzIC8gQ2FyZ2EgaW5pY2lhbCAoU09MTyBww6FnaW5hIDEpXHJcbiAgICAgICAgLy8gRXN0ZSBvYnNlcnZhYmxlIHNlIGRpc3BhcmEgY3VhbmRvIGNhbWJpYW4gbG9zIGZpbHRyb3MgbyBzZSByZWNhcmdhIGxhIHDDoWdpbmFcclxuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uU2VydmljZS5wYWdpbmF0aW9uRGF0YSQuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICBwcm9kdWN0cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBQYXJhIGxhIGNhcmdhIGluaWNpYWwsIFJFRU1QTEFaQU1PUyBsb3MgcHJvZHVjdG9zIChubyBhZ3JlZ2Ftb3MpXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdHMgJiYgcHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2R1Y3RzU3ViamVjdC5uZXh0KHByb2R1Y3RzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIExpYmVyYW1vcyBlbCBzZW3DoWZvcm8gZGVzcHXDqXMgZGUgcHJvY2VzYXJcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTmV4dFBhZ2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIDMuIFBhZ2luYWNpw7NuIChTY3JvbGwgaW5maW5pdG8gLSBww6FnaW5hcyAyLCAzLCA0Li4uKVxyXG4gICAgICAgIC8vIEVzdGUgb2JzZXJ2YWJsZSBzZSBkaXNwYXJhIFNPTE8gY3VhbmRvIGxsYW1hbW9zIGV4cGzDrWNpdGFtZW50ZSBhIGdldE5leHQoKVxyXG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25TZXJ2aWNlLm5leHRQcm9kdWN0cyQuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICBwcm9kdWN0cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBTSUVNUFJFIGxpYmVyYW1vcyBlbCBzZW3DoWZvcm8gYWwgcmVjaWJpciByZXNwdWVzdGEsIGF1bnF1ZSBzZWEgdmFjw61hXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZ05leHRQYWdlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RzICYmIHByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFByb2R1Y3RzU2FmZShwcm9kdWN0cyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyA0LiBGaWx0cm9zIGRlIHByZWNpb1xyXG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25TZXJ2aWNlLnByaWNlUmFuZ2UkLnN1YnNjcmliZShyYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBtaW4gPSBNYXRoLmZsb29yKHJhbmdlLnByaWNlX21pbik7XHJcbiAgICAgICAgICAgIGxldCBtYXggPSBNYXRoLmNlaWwocmFuZ2UucHJpY2VfbWF4KTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQcmljZVJhbmdlRmlsdGVyKG1pbiwgbWF4KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyA1LiBHZXN0acOzbiBkZSBmaWx0cm9zIGdlbmVyYWxlc1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlcnNTZXJ2aWNlLmZpbHRlcnMkLnN1YnNjcmliZShmaWx0ZXJzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzU3ViamVjdC5uZXh0KGZpbHRlcnMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTcOpdG9kbyBzZWd1cm8gcGFyYSBhw7FhZGlyIHByb2R1Y3Rvcy5cclxuICAgICAqIFZlcmlmaWNhIHBvciBJRCBxdWUgZWwgcHJvZHVjdG8gbm8gZXhpc3RhIHlhIGVuIGxhIGxpc3RhIHBhcmEgZXZpdGFyIGR1cGxpY2Fkb3MgdmlzdWFsZXNcclxuICAgICAqIHkgcmVzdWVsdmUgZWwgcHJvYmxlbWEgZGUgbGEgXCJQw6FnaW5hIDIgcGVyZGlkYVwiLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFwcGVuZFByb2R1Y3RzU2FmZShwcm9kdWN0czogUHJvZHVjdFtdKSB7XHJcbiAgICAgICAgY29uc3QgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHRoaXMuX2NvbnN0cy5nZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQoKTtcclxuICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHByb2R1Y3RzO1xyXG5cclxuICAgICAgICAvLyAxLiBQcm9jZXNhciB2YXJpYW50ZXMgc2kgZXMgbmVjZXNhcmlvXHJcbiAgICAgICAgaWYgKHByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHRoaXMuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChwcm9kdWN0cywgdGhpcy5nZXRPYmplY3RXaXRoVmFyaWFudCgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQcm9kdWN0cyA9IHRoaXMuX3Byb2R1Y3RzU3ViamVjdC52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gMi4gRklMVFJBRE8gREUgRFVQTElDQURPUzogTGEgY2xhdmUgZGVsIGFycmVnbG9cclxuICAgICAgICAvLyBTb2xvIGHDsWFkaW1vcyBwcm9kdWN0b3MgY3V5byBJRCBubyBlc3TDqSB5YSBlbiBsYSBsaXN0YSBhY3R1YWwuXHJcbiAgICAgICAgLy8gRXN0byBwZXJtaXRlIHF1ZSBzaSAnbmV4dFByb2R1Y3RzJyBlbWl0ZSBsYSBQMSBkZSBudWV2bywgbGEgaWdub3JlbW9zLFxyXG4gICAgICAgIC8vIHBlcm8gc2kgZW1pdGUgbGEgUDIsIGxhIGFncmVndWVtb3MuXHJcbiAgICAgICAgY29uc3QgbmV3UHJvZHVjdHMgPSBjYW5kaWRhdGVzLmZpbHRlcihjYW5kaWRhdGUgPT4gXHJcbiAgICAgICAgICAgICFjdXJyZW50UHJvZHVjdHMuc29tZShleGlzdGluZyA9PiBleGlzdGluZy5pZCA9PT0gY2FuZGlkYXRlLmlkKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChuZXdQcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Byb2R1Y3RzU3ViamVjdC5uZXh0KFsuLi5jdXJyZW50UHJvZHVjdHMsIC4uLm5ld1Byb2R1Y3RzXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlUHJpY2VSYW5nZUZpbHRlcihtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBmaW5hbF9maWx0ZXJzOiBGaWx0ZXJbXSA9IHRoaXMuZmlsdGVyc1N1YmplY3QudmFsdWU7XHJcbiAgICAgICAgY29uc3QgcHJpY2VSYW5nZUZpbHRlciA9IGZpbmFsX2ZpbHRlcnMuZmluZChmaWx0ZXIgPT4gZmlsdGVyIGluc3RhbmNlb2YgUHJpY2VSYW5nZUZpbHRlcik7XHJcblxyXG4gICAgICAgIGlmIChwcmljZVJhbmdlRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIChwcmljZVJhbmdlRmlsdGVyIGFzIFByaWNlUmFuZ2VGaWx0ZXIpLnVwZGF0ZVByaWNlcyhtaW4sIG1heCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1N1YmplY3QubmV4dChmaW5hbF9maWx0ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BUEkgVVJMXHJcbiAgICBwcml2YXRlIF9zaG9wQXBpVXJsID0gdGhpcy5fYXBpQ29uc3RzLlNIT1BfQVBJX1VSTDtcclxuICAgIHByb2R1Y3RCeUNvZGVBcGkoY29kZTogc3RyaW5nLCB2YXJpYW50OiBib29sZWFuKSB7IHJldHVybiB0aGlzLl9zaG9wQXBpVXJsICsgdGhpcy5fYXBpQ29uc3RzLkNIQU5ORUwgKyAnL3Byb2R1Y3RzL2J5LWNvZGUvJyArICh2YXJpYW50ID8gJ3ZhcmlhbnQvJyA6ICcnKSArIGNvZGUgKyAnP2xvY2FsZT0nICsgdGhpcy5fYXBpQ29uc3RzLkxPQ0FMRTsgfVxyXG4gICAgLy8gcmV2aWV3XHJcbiAgICBzYXZlUHJvZHVjdFJldmlld3NBcGkoY29kZTogc3RyaW5nKSB7IHJldHVybiB0aGlzLl9zaG9wQXBpVXJsICsgdGhpcy5fYXBpQ29uc3RzLkNIQU5ORUwgKyAnL3Byb2R1Y3RzL2J5LWNvZGUvJyArIGNvZGUgKyAnL3Jldmlld3MnOyB9XHJcbiAgICAvL3JlbGF0ZWQgcHJvZHVjdHNcclxuICAgIHJlbGF0ZWRQcm9kdWN0c0FwaSA9IChrZXk6IHN0cmluZyk6IHN0cmluZyA9PiAnc2hvcC1hcGkvJyArIHRoaXMuX2FwaUNvbnN0cy5DSEFOTkVMICsgJy9wcm9kdWN0cy9yZWxhdGVkL2J5LWNvZGUvJyArIGtleSArICc/bG9jYWxlPScgKyB0aGlzLl9hcGlDb25zdHMuTE9DQUxFO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0ZWEgbG9zIGZpbHRyb3MgcGFyYSBvYnRlbmVyIGxvcyBwcm9kdWN0b3MuXHJcbiAgICAgKi9cclxuICAgIGdldFByb2R1Y3RzRm9yRmlsdGVyKFxyXG4gICAgICAgIHBhZ2luYXRpb25TZXR0aW5ncz86IFBhZ2luYXRpb25TZXR0aW5ncyxcclxuICAgICAgICBzZWFyY2hWYWx1ZT86IGFueSxcclxuICAgICAgICByb3V0ZVF1ZXJ5UGFyYW1zPzogYW55XHJcbiAgICApOiBhbnkge1xyXG4gICAgICAgIHNlYXJjaFZhbHVlID8gdGhpcy5zZWFyY2hWYWx1ZS5zZXQoc2VhcmNoVmFsdWUpIDogdGhpcy5zZWFyY2hWYWx1ZS5zZXQoJycpO1xyXG4gICAgICAgIGlmIChwYWdpbmF0aW9uU2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsdGVyc1NlcnZpY2Uuc2V0RmlsdGVycyhwYWdpbmF0aW9uU2V0dGluZ3MsIHNlYXJjaFZhbHVlLCByb3V0ZVF1ZXJ5UGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgbG9zIHByb2R1Y3RvcyBjb24gbG9zIGRlIGxhIHNpZ3VpZW50ZSBwYWdpbmEuXHJcbiAgICAgKiBJbXBsZW1lbnRhIGJsb3F1ZW8gcGFyYSBldml0YXIgc2FsdG9zIGRlIHDDoWdpbmEgcG9yIHNjcm9sbCByw6FwaWRvLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVQcm9kdWN0cygpIHtcclxuICAgICAgICAvLyBTb2xvIHBlZGltb3Mgc2kgZWwgc2VydmljaW8gbm8gZXN0w6EgZXNwZXJhbmRvIFkgbm9zb3Ryb3Mgbm8gdGVuZW1vcyBlbCBzZW3DoWZvcm8gZW4gcm9qb1xyXG4gICAgICAgIGlmICghdGhpcy5fcGFnaW5hdGlvblNlcnZpY2UuZ2V0V2FpdGluZygpICYmICF0aGlzLmlzTG9hZGluZ05leHRQYWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTmV4dFBhZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9wYWdpbmF0aW9uU2VydmljZS5nZXROZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2R1Y3RCeUNvZGUoY29kZTogc3RyaW5nLCB2YXJpYW50OiBib29sZWFuKTogT2JzZXJ2YWJsZTxQcm9kdWN0PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24uZ2V0KHRoaXMucHJvZHVjdEJ5Q29kZUFwaShjb2RlLCB2YXJpYW50KSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZVJldmlld3MgPSAoY29kZTogc3RyaW5nLCBmb3JtX2RhdGE6IGFueSkgPT4gdGhpcy5fY29ubmVjdGlvbi5wb3N0KHRoaXMuc2F2ZVByb2R1Y3RSZXZpZXdzQXBpKGNvZGUpLCBmb3JtX2RhdGEpXHJcblxyXG4gICAgZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IChwcm9kdWN0czogUHJvZHVjdFtdLCB3aXRoT3B0aW9uOiBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0geyB0eXBlOiAnY29sb3InLCBjb2RlOiAnY29sb3InLCBkZWZhdWx0Rmlyc3RPcHRpb246IGZhbHNlLCBjaGVja0lmU3RvY2s6IHRydWUgfSkgPT4ge1xyXG5cclxuICAgICAgICAhd2l0aE9wdGlvblsnY29kZSddICYmIHdpdGhPcHRpb25bJ3R5cGUnXSAmJiAod2l0aE9wdGlvblsnY29kZSddID0gd2l0aE9wdGlvblsndHlwZSddKSB8fCAhd2l0aE9wdGlvblsnY29kZSddICYmICh3aXRoT3B0aW9uWydjb2RlJ10gPSAnY29sb3InKVxyXG4gICAgICAgICF3aXRoT3B0aW9uWyd0eXBlJ10gJiYgd2l0aE9wdGlvblsnY29kZSddICYmICh3aXRoT3B0aW9uWyd0eXBlJ10gPSB3aXRoT3B0aW9uWydjb2RlJ10pIHx8ICF3aXRoT3B0aW9uWyd0eXBlJ10gJiYgKHdpdGhPcHRpb25bJ3R5cGUnXSA9ICdjb2xvcicpXHJcbiAgICAgICAgIXdpdGhPcHRpb24uaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRGaXJzdE9wdGlvbicpICYmICh3aXRoT3B0aW9uWydkZWZhdWx0Rmlyc3RPcHRpb24nXSA9IGZhbHNlKVxyXG4gICAgICAgICF3aXRoT3B0aW9uLmhhc093blByb3BlcnR5KCdjaGVja0lmU3RvY2snKSAmJiAod2l0aE9wdGlvblsnY2hlY2tJZlN0b2NrJ10gPSB0cnVlKVxyXG5cclxuICAgICAgICBsZXQgcHJvZHVjdHNVbmlxdWVWYXJpYW50OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIHByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmFyaWFudHMgPSBbLi4ucHJvZHVjdD8udmFyaWFudHNdO1xyXG4gICAgICAgICAgICBsZXQgb3B0aW9uID0gcHJvZHVjdC5vcHRpb25zLmZpbmQoKG9wdDogYW55KSA9PiBvcHQudHlwZS50b0xvd2VyQ2FzZSgpID09PSB3aXRoT3B0aW9uLnR5cGU/LnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb24udmFsdWVzLmZvckVhY2goKG9wdGlvblZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbW9kaWZpZWRfcHJvZHVjdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocHJvZHVjdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkX3Byb2R1Y3Qub3B0aW9ucy5maW5kKChvcHRpb246IGFueSkgPT4gb3B0aW9uLnR5cGUudG9Mb3dlckNhc2UoKSA9PSB3aXRoT3B0aW9uLnR5cGU/LnRvTG93ZXJDYXNlKCkpLnZhbHVlcyA9IFt7IGNvZGU6IG9wdGlvblZhbHVlLmNvZGUsIG5hbWU6IG9wdGlvblZhbHVlLm5hbWUgfV07XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhbnRBdXggPSB2YXJpYW50cy5maW5kKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0+ICgod2l0aE9wdGlvbi5jaGVja0lmU3RvY2sgJiYgdmFyaWFudC5zdG9jayA+IDApIHx8IHdpdGhPcHRpb24uY2hlY2tJZlN0b2NrID09IGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmFyaWFudC5vcHRpb25zLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmFyaWFudC5vcHRpb25zLnNvbWUoKG9wOiBhbnkpID0+IChvcC5oYXNPd25Qcm9wZXJ0eSh3aXRoT3B0aW9uLmNvZGU/LnRvTG93ZXJDYXNlKCkpIHx8IG9wLmhhc093blByb3BlcnR5KHdpdGhPcHRpb24uY29kZT8udG9VcHBlckNhc2UoKSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG9wW2Ake3dpdGhPcHRpb24uY29kZT8udG9Mb3dlckNhc2UoKX1gXSB8fCBvcFtgJHt3aXRoT3B0aW9uLmNvZGU/LnRvVXBwZXJDYXNlKCl9YF0pID09PSBvcHRpb25WYWx1ZS5jb2RlKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnRBdXggJiYgcHJvZHVjdHNVbmlxdWVWYXJpYW50LnB1c2godGhpcy5wcm9kdWN0V2l0aFZhcmlhbnRWYWx1ZXMobW9kaWZpZWRfcHJvZHVjdCwgdmFyaWFudEF1eCwgb3B0aW9uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2l0aE9wdGlvbi5kZWZhdWx0Rmlyc3RPcHRpb24gJiYgcHJvZHVjdC5vcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RPcHRpb25zID0gcHJvZHVjdC5vcHRpb25zWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5vcHRpb25zWzBdLnZhbHVlcy5mb3JFYWNoKChvcHRpb25WYWx1ZTogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9kaWZpZWRfcHJvZHVjdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocHJvZHVjdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZF9wcm9kdWN0Lm9wdGlvbnMuZmluZCgob3B0aW9uOiBPcHRpb25zKSA9PiBvcHRpb24udHlwZSA9PSBmaXJzdE9wdGlvbnMudHlwZSkudmFsdWVzID0gW3sgY29kZTogb3B0aW9uVmFsdWUuY29kZSwgbmFtZTogb3B0aW9uVmFsdWUubmFtZSB9XTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YXJpYW50QXV4ID0gdmFyaWFudHMuZmluZCh2YXJpYW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYW50Lm9wdGlvbnMuZmluZCgoZWxlbTogYW55KSA9PiBlbGVtW2ZpcnN0T3B0aW9ucy5jb2RlXSA9PSBvcHRpb25WYWx1ZS5jb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhbnRBdXggJiYgdmFyaWFudEF1eC5pbWFnZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRBdXguaW1hZ2VzID0gcHJvZHVjdC5waWN0dXJlc2RlZmF1bHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhPcHRpb24uY2hlY2tJZlN0b2NrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFyaWFudEF1eCAmJiB2YXJpYW50QXV4LnN0b2NrID4gMCkgPyBwcm9kdWN0c1VuaXF1ZVZhcmlhbnQucHVzaCh0aGlzLnByb2R1Y3RXaXRoVmFyaWFudFZhbHVlcyhtb2RpZmllZF9wcm9kdWN0LCB2YXJpYW50QXV4LCBvcHRpb25WYWx1ZSkpIDogbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRBdXggJiYgcHJvZHVjdHNVbmlxdWVWYXJpYW50LnB1c2godGhpcy5wcm9kdWN0V2l0aFZhcmlhbnRWYWx1ZXMobW9kaWZpZWRfcHJvZHVjdCwgdmFyaWFudEF1eCwgb3B0aW9uVmFsdWUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzVW5pcXVlVmFyaWFudC5wdXNoKHByb2R1Y3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gcHJvZHVjdHNVbmlxdWVWYXJpYW50Lmxlbmd0aCA+IDAgPyBwcm9kdWN0c1VuaXF1ZVZhcmlhbnQgOiBwcm9kdWN0cztcclxuICAgIH1cclxuXHJcbiAgICBwcm9kdWN0V2l0aFZhcmlhbnRWYWx1ZXMgPSAocHJvZHVjdDogUHJvZHVjdCwgdmFyaWFudDogYW55LCBvcHRpb25WYWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgcHJvZHVjdC5waWN0dXJlc2RlZmF1bHQgPSBbLi4udmFyaWFudC5pbWFnZXNdXHJcbiAgICAgICAgcHJvZHVjdC52YXJpYW50X2lkID0gdmFyaWFudC5jb2RlOyBcclxuICAgICAgICBwcm9kdWN0LnN0b2NrID0gdmFyaWFudC5zdG9jayB8fCAwOyBcclxuICAgICAgICBwcm9kdWN0LnByaWNlID0gdmFyaWFudC5wcmljZS50b1N0cmluZygpIHx8ICcwJztcclxuICAgICAgICBwcm9kdWN0LmN1cnJlbnRPcHRpb24gPSB7XHJcbiAgICAgICAgICAgIC4uLm9wdGlvblZhbHVlLFxyXG4gICAgICAgICAgICBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCxcclxuICAgICAgICAgICAgdmFyaWFudENvZGU6IHZhcmlhbnQuY29kZSxcclxuICAgICAgICAgICAgc3RvY2s6IHZhcmlhbnQuc3RvY2sgfHwgMCxcclxuICAgICAgICAgICAgZmluYWxQcmljZTogdmFyaWFudC5zYWxlcHJpY2UgfHwgdmFyaWFudC5wcmljZSB8fCAwLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvZHVjdFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0T2JqZWN0V2l0aFZhcmlhbnQgPSAoKTogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0cy5nZXRQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KClcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZWxhdGVkUHJvZHVjdHMocHJvZHVjdF9pZDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24uZ2V0KHRoaXMucmVsYXRlZFByb2R1Y3RzQXBpKHByb2R1Y3RfaWQpKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNTdG9jayhwcm9kdWN0OiBQcm9kdWN0KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9kdWN0LnN0b2NrID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvZHVjdC5zdG9jayA+IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb2R1Y3QudmFyaWFudHMpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9kdWN0LnZhcmlhbnRzLnNvbWUodmFyaWFudCA9PiB2YXJpYW50LnN0b2NrID4gMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufSJdfQ==