valtech-components 2.0.695 → 2.0.712

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.
@@ -13,6 +13,8 @@ import { map } from 'rxjs/operators';
13
13
  import { AuthService } from '../auth/auth.service';
14
14
  import * as i0 from "@angular/core";
15
15
  import * as i1 from "./firestore-collection";
16
+ /** Límite por defecto de notificaciones a cargar */
17
+ const DEFAULT_LIMIT = 50;
16
18
  /**
17
19
  * Servicio para leer notificaciones desde Firestore.
18
20
  *
@@ -90,7 +92,9 @@ export class NotificationsService {
90
92
  // Path relativo - FirestoreService agrega automáticamente apps/{appId}/
91
93
  // NO agregar apps/ aquí para evitar doble prefijo
92
94
  const basePath = `users/${userId}/notifications`;
93
- this.collection = this.collectionFactory.create(basePath, { timestamps: true });
95
+ this.collection = this.collectionFactory.create(basePath, {
96
+ timestamps: true,
97
+ });
94
98
  console.log('[Notifications] Initialized with path:', basePath);
95
99
  }
96
100
  /**
@@ -109,39 +113,59 @@ export class NotificationsService {
109
113
  // LECTURA
110
114
  // ===========================================================================
111
115
  /**
112
- * Obtiene todas las notificaciones ordenadas por fecha descendente.
113
- * Real-time: se actualiza automáticamente cuando cambian los datos.
116
+ * Obtiene notificaciones ordenadas por fecha descendente (real-time).
117
+ * Se actualiza automáticamente cuando cambian los datos.
118
+ *
119
+ * @param limit - Máximo de notificaciones a cargar (default: 50)
114
120
  */
115
- getAll() {
121
+ getAll(limit = DEFAULT_LIMIT) {
116
122
  if (!this.collection)
117
123
  return of([]);
118
124
  return this.collection.watchAll({
119
125
  orderBy: [{ field: 'createdAt', direction: 'desc' }],
126
+ limit,
120
127
  });
121
128
  }
122
129
  /**
123
- * Obtiene todas las notificaciones (one-time fetch sin listener).
130
+ * Obtiene notificaciones (one-time fetch sin listener).
124
131
  * Útil para cargas iniciales sin necesidad de updates en tiempo real.
132
+ *
133
+ * @param limit - Máximo de notificaciones a cargar (default: 50)
125
134
  */
126
- async getAllOnce() {
135
+ async getAllOnce(limit = DEFAULT_LIMIT) {
127
136
  if (!this.collection)
128
137
  return [];
129
138
  return this.collection.getAllOnce({
130
139
  orderBy: [{ field: 'createdAt', direction: 'desc' }],
140
+ limit,
131
141
  });
132
142
  }
133
143
  /**
134
- * Obtiene solo notificaciones no leídas.
144
+ * Obtiene solo notificaciones no leídas (real-time, filtrado server-side).
145
+ *
146
+ * @param limit - Máximo de notificaciones (default: 50)
135
147
  */
136
- getUnread() {
137
- return this.getAll().pipe(map(notifications => notifications.filter(n => !n.isRead)));
148
+ getUnread(limit = DEFAULT_LIMIT) {
149
+ if (!this.collection)
150
+ return of([]);
151
+ return this.collection.watchAll({
152
+ where: [{ field: 'isRead', operator: '==', value: false }],
153
+ orderBy: [{ field: 'createdAt', direction: 'desc' }],
154
+ limit,
155
+ });
138
156
  }
139
157
  /**
140
- * Cuenta notificaciones no leídas.
158
+ * Cuenta notificaciones no leídas (real-time, filtrado server-side).
141
159
  * Útil para badges en UI.
142
160
  */
143
161
  getUnreadCount() {
144
- return this.getUnread().pipe(map(n => n.length));
162
+ if (!this.collection)
163
+ return of(0);
164
+ return this.collection
165
+ .watchAll({
166
+ where: [{ field: 'isRead', operator: '==', value: false }],
167
+ })
168
+ .pipe(map(n => n.length));
145
169
  }
146
170
  /**
147
171
  * Obtiene una notificación por ID.
@@ -163,7 +187,7 @@ export class NotificationsService {
163
187
  await this.collection.update(notificationId, { isRead: true });
164
188
  }
165
189
  /**
166
- * Marca todas las notificaciones como leídas.
190
+ * Marca todas las notificaciones no leídas como leídas (batch write).
167
191
  */
168
192
  async markAllAsRead() {
169
193
  if (!this.collection)
@@ -171,7 +195,8 @@ export class NotificationsService {
171
195
  const unread = await this.collection.query({
172
196
  where: [{ field: 'isRead', operator: '==', value: false }],
173
197
  });
174
- await Promise.all(unread.map(n => this.collection.update(n.id, { isRead: true })));
198
+ const ids = unread.map(n => n.id).filter(Boolean);
199
+ await this.collection.batchUpdate(ids, { isRead: true });
175
200
  }
176
201
  /**
177
202
  * Elimina una notificación.
@@ -182,13 +207,14 @@ export class NotificationsService {
182
207
  await this.collection.delete(notificationId);
183
208
  }
184
209
  /**
185
- * Elimina todas las notificaciones del usuario.
210
+ * Elimina todas las notificaciones del usuario (batch delete).
186
211
  */
187
212
  async deleteAll() {
188
213
  if (!this.collection)
189
214
  return;
190
215
  const all = await this.collection.getAll();
191
- await Promise.all(all.map(n => this.collection.delete(n.id)));
216
+ const ids = all.map(n => n.id).filter(Boolean);
217
+ await this.collection.batchDelete(ids);
192
218
  }
193
219
  /**
194
220
  * Limpia el estado del servicio.
@@ -207,4 +233,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
207
233
  }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.FirestoreCollectionFactory, decorators: [{
208
234
  type: Optional
209
235
  }] }] });
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9maXJlYmFzZS9ub3RpZmljYXRpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBWSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUF1Qm5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBTy9CLFlBQ1UsUUFBa0IsRUFDTixpQkFBNkM7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNOLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBNEI7UUFSM0QsZUFBVSxHQUFpRCxJQUFJLENBQUM7UUFDaEUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBRTVDLDhEQUE4RDtRQUN0RCxnQkFBVyxHQUF1QixJQUFJLENBQUM7UUFNN0MsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUI7UUFDN0Isb0NBQW9DO1FBQ3BDLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCw4REFBOEQ7WUFDOUQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBRUQsd0RBQXdEO1FBQ3hELHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ3hDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFdEMsSUFBSSxJQUFJLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN2RCw2Q0FBNkM7b0JBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixDQUFDO3FCQUFNLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN2Qyx5QkFBeUI7b0JBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxVQUFVLENBQUMsTUFBYztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQywwR0FBMEcsQ0FBQyxDQUFDO1lBQ3pILE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFFNUIsd0VBQXdFO1FBQ3hFLGtEQUFrRDtRQUNsRCxNQUFNLFFBQVEsR0FBRyxTQUFTLE1BQU0sZ0JBQWdCLENBQUM7UUFFakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUM3QyxRQUFRLEVBQ1IsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQ3JCLENBQUM7UUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsVUFBVTtJQUNWLDhFQUE4RTtJQUU5RTs7O09BR0c7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM5QixPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQ3JELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsVUFBVTtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRWhDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDaEMsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUNyRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUN2QixHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDM0QsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBc0I7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLFdBQVc7SUFDWCw4RUFBOEU7SUFFOUU7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQXNCO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFDN0IsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBRTdCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDekMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQzNELENBQUMsQ0FBQztRQUVILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ2xFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQXNCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFDN0IsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsU0FBUztRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFFN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7K0dBbE1VLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRFAsTUFBTTs7NEZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQVU3QixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOb3RpZmljYXRpb25zIFNlcnZpY2VcbiAqXG4gKiBTZXJ2aWNpbyBwYXJhIGxlZXIgbm90aWZpY2FjaW9uZXMgZGVzZGUgRmlyZXN0b3JlLlxuICogRWwgYmFja2VuZCBlc2NyaWJlIGxhcyBub3RpZmljYWNpb25lcywgZWwgZnJvbnRlbmQgc29sbyBsYXMgbGVlIHkgYWN0dWFsaXphIGVzdGFkby5cbiAqXG4gKiBTZSBhdXRvLWluaWNpYWxpemEgY3VhbmRvIEF1dGhTZXJ2aWNlIHRpZW5lIHVuIHVzdWFyaW8gYXV0ZW50aWNhZG8uXG4gKiBUYW1iacOpbiBwdWVkZSBpbmljaWFsaXphcnNlIG1hbnVhbG1lbnRlIGNvbiBgaW5pdGlhbGl6ZSh1c2VySWQpYC5cbiAqL1xuXG5pbXBvcnQgeyBlZmZlY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBPcHRpb25hbCwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpcmVzdG9yZUNvbGxlY3Rpb25GYWN0b3J5LCBUeXBlZENvbGxlY3Rpb24gfSBmcm9tICcuL2ZpcmVzdG9yZS1jb2xsZWN0aW9uJztcbmltcG9ydCB7IEZpcmVzdG9yZURvY3VtZW50IH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRG9jdW1lbnRvIGRlIG5vdGlmaWNhY2nDs24gZW4gRmlyZXN0b3JlLlxuICogRXN0cnVjdHVyYSBlc2NyaXRhIHBvciBlbCBiYWNrZW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkRvY3VtZW50IGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQge1xuICAvKiogVMOtdHVsbyBkZSBsYSBub3RpZmljYWNpw7NuICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogQ3VlcnBvIGRlbCBtZW5zYWplICovXG4gIGJvZHk/OiBzdHJpbmc7XG4gIC8qKiBVUkwgZGUgaW1hZ2VuICovXG4gIGltYWdlPzogc3RyaW5nO1xuICAvKiogRGF0b3MgcGVyc29uYWxpemFkb3MgKGVqOiByb3V0ZSwgYWN0aW9uVHlwZSkgKi9cbiAgZGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBUaXBvIGRlIG5vdGlmaWNhY2nDs24gKi9cbiAgdHlwZT86ICdmY20nIHwgJ3N5c3RlbScgfCAncmVtaW5kZXInIHwgc3RyaW5nO1xuICAvKiogU2kgbGEgbm90aWZpY2FjacOzbiBmdWUgbGXDrWRhICovXG4gIGlzUmVhZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZXJ2aWNpbyBwYXJhIGxlZXIgbm90aWZpY2FjaW9uZXMgZGVzZGUgRmlyZXN0b3JlLlxuICpcbiAqIFNlIGF1dG8taW5pY2lhbGl6YSBjdWFuZG8gQXV0aFNlcnZpY2UgdGllbmUgdW4gdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAqIE5vIHJlcXVpZXJlIGxsYW1hciBhIGBpbml0aWFsaXplKClgIG1hbnVhbG1lbnRlIHNpIEF1dGhTZXJ2aWNlIGVzdMOhIGNvbmZpZ3VyYWRvLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDb24gQXV0aFNlcnZpY2UgY29uZmlndXJhZG86IGF1dG8taW5pY2lhbGl6YWNpw7NuXG4gKiAvLyBTb2xvIGlueWVjdGFyIHkgdXNhciBkaXJlY3RhbWVudGVcbiAqIHByaXZhdGUgbm90aWZpY2F0aW9ucyA9IGluamVjdChOb3RpZmljYXRpb25zU2VydmljZSk7XG4gKlxuICogbm90aWZpY2F0aW9ucyQgPSB0aGlzLm5vdGlmaWNhdGlvbnMuZ2V0QWxsKCk7XG4gKiB1bnJlYWRDb3VudCQgPSB0aGlzLm5vdGlmaWNhdGlvbnMuZ2V0VW5yZWFkQ291bnQoKTtcbiAqXG4gKiAvLyBTaW4gQXV0aFNlcnZpY2U6IGluaWNpYWxpemFjacOzbiBtYW51YWxcbiAqIHRoaXMubm90aWZpY2F0aW9ucy5pbml0aWFsaXplKHVzZXJJZCk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zU2VydmljZSB7XG4gIHByaXZhdGUgY29sbGVjdGlvbjogVHlwZWRDb2xsZWN0aW9uPE5vdGlmaWNhdGlvbkRvY3VtZW50PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRVc2VySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8vIElueWVjY2nDs24gb3BjaW9uYWwgLSBBdXRoU2VydmljZSBwdWVkZSBubyBlc3RhciBjb25maWd1cmFkb1xuICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29sbGVjdGlvbkZhY3Rvcnk6IEZpcmVzdG9yZUNvbGxlY3Rpb25GYWN0b3J5XG4gICkge1xuICAgIC8vIEludGVudGFyIG9idGVuZXIgQXV0aFNlcnZpY2UgZGUgZm9ybWEgbGF6eSAocHVlZGUgbm8gZXN0YXIgY29uZmlndXJhZG8pXG4gICAgdGhpcy5zZXR1cEF1dG9Jbml0aWFsaXphdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYSBhdXRvLWluaWNpYWxpemFjacOzbiBvYnNlcnZhbmRvIGVsIGVzdGFkbyBkZSBBdXRoU2VydmljZS5cbiAgICogU2UgZWplY3V0YSBlbiBlbCBjb250ZXh0byBkZWwgaW5qZWN0b3IgcGFyYSBwb2RlciB1c2FyIGVmZmVjdCgpLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEF1dG9Jbml0aWFsaXphdGlvbigpOiB2b2lkIHtcbiAgICAvLyBPYnRlbmVyIEF1dGhTZXJ2aWNlIGRlIGZvcm1hIGxhenlcbiAgICB0cnkge1xuICAgICAgdGhpcy5hdXRoU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEF1dGhTZXJ2aWNlLCBudWxsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEF1dGhTZXJ2aWNlIG5vIGVzdMOhIGNvbmZpZ3VyYWRvLCBubyBoYXkgYXV0by1pbmljaWFsaXphY2nDs25cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVc2FyIHJ1bkluSW5qZWN0aW9uQ29udGV4dCBwYXJhIHBvZGVyIGNyZWFyIGVsIGVmZmVjdFxuICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoU2VydmljZSEudXNlcigpO1xuXG4gICAgICAgIGlmICh1c2VyPy51c2VySWQgJiYgdGhpcy5jdXJyZW50VXNlcklkICE9PSB1c2VyLnVzZXJJZCkge1xuICAgICAgICAgIC8vIFVzdWFyaW8gYXV0ZW50aWNhZG86IGluaWNpYWxpemFyIGNvbiBzdSBJRFxuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZSh1c2VyLnVzZXJJZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZXIgJiYgdGhpcy5jdXJyZW50VXNlcklkKSB7XG4gICAgICAgICAgLy8gTG9nb3V0OiBsaW1waWFyIGVzdGFkb1xuICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pY2lhbGl6YSBlbCBzZXJ2aWNpbyBwYXJhIHVuIHVzdWFyaW8gZXNwZWPDrWZpY28uXG4gICAqXG4gICAqIE5PVEE6IFNlIGxsYW1hIGF1dG9tw6F0aWNhbWVudGUgc2kgQXV0aFNlcnZpY2UgZXN0w6EgY29uZmlndXJhZG8uXG4gICAqIFNvbG8gdXNhciBtYW51YWxtZW50ZSBzaSBBdXRoU2VydmljZSBubyBlc3TDoSBkaXNwb25pYmxlIG8gc2UgbmVjZXNpdGFcbiAgICogdW4gdXNlcklkIGRpZmVyZW50ZSBhbCBkZWwgdXN1YXJpbyBhdXRlbnRpY2Fkby5cbiAgICovXG4gIGluaXRpYWxpemUodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29sbGVjdGlvbkZhY3RvcnkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW05vdGlmaWNhdGlvbnNdIEZpcmVzdG9yZUNvbGxlY3Rpb25GYWN0b3J5IG5vdCBhdmFpbGFibGUuIEVuc3VyZSBwcm92aWRlVmFsdGVjaEZpcmViYXNlKCkgaXMgY29uZmlndXJlZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRVc2VySWQgPSB1c2VySWQ7XG5cbiAgICAvLyBQYXRoIHJlbGF0aXZvIC0gRmlyZXN0b3JlU2VydmljZSBhZ3JlZ2EgYXV0b23DoXRpY2FtZW50ZSBhcHBzL3thcHBJZH0vXG4gICAgLy8gTk8gYWdyZWdhciBhcHBzLyBhcXXDrSBwYXJhIGV2aXRhciBkb2JsZSBwcmVmaWpvXG4gICAgY29uc3QgYmFzZVBhdGggPSBgdXNlcnMvJHt1c2VySWR9L25vdGlmaWNhdGlvbnNgO1xuXG4gICAgdGhpcy5jb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uRmFjdG9yeS5jcmVhdGU8Tm90aWZpY2F0aW9uRG9jdW1lbnQ+KFxuICAgICAgYmFzZVBhdGgsXG4gICAgICB7IHRpbWVzdGFtcHM6IHRydWUgfVxuICAgICk7XG5cbiAgICBjb25zb2xlLmxvZygnW05vdGlmaWNhdGlvbnNdIEluaXRpYWxpemVkIHdpdGggcGF0aDonLCBiYXNlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgc2VydmljaW8gZXN0w6EgaW5pY2lhbGl6YWRvLlxuICAgKi9cbiAgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbiAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIElEIGRlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICovXG4gIGdldCB1c2VySWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJJZDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMRUNUVVJBXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHRvZGFzIGxhcyBub3RpZmljYWNpb25lcyBvcmRlbmFkYXMgcG9yIGZlY2hhIGRlc2NlbmRlbnRlLlxuICAgKiBSZWFsLXRpbWU6IHNlIGFjdHVhbGl6YSBhdXRvbcOhdGljYW1lbnRlIGN1YW5kbyBjYW1iaWFuIGxvcyBkYXRvcy5cbiAgICovXG4gIGdldEFsbCgpOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvbkRvY3VtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikgcmV0dXJuIG9mKFtdKTtcblxuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24ud2F0Y2hBbGwoe1xuICAgICAgb3JkZXJCeTogW3sgZmllbGQ6ICdjcmVhdGVkQXQnLCBkaXJlY3Rpb246ICdkZXNjJyB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHRvZGFzIGxhcyBub3RpZmljYWNpb25lcyAob25lLXRpbWUgZmV0Y2ggc2luIGxpc3RlbmVyKS5cbiAgICogw5p0aWwgcGFyYSBjYXJnYXMgaW5pY2lhbGVzIHNpbiBuZWNlc2lkYWQgZGUgdXBkYXRlcyBlbiB0aWVtcG8gcmVhbC5cbiAgICovXG4gIGFzeW5jIGdldEFsbE9uY2UoKTogUHJvbWlzZTxOb3RpZmljYXRpb25Eb2N1bWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHJldHVybiBbXTtcblxuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24uZ2V0QWxsT25jZSh7XG4gICAgICBvcmRlckJ5OiBbeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2Rlc2MnIH1dLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgc29sbyBub3RpZmljYWNpb25lcyBubyBsZcOtZGFzLlxuICAgKi9cbiAgZ2V0VW5yZWFkKCk6IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uRG9jdW1lbnRbXT4ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbCgpLnBpcGUoXG4gICAgICBtYXAobm90aWZpY2F0aW9ucyA9PiBub3RpZmljYXRpb25zLmZpbHRlcihuID0+ICFuLmlzUmVhZCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdWVudGEgbm90aWZpY2FjaW9uZXMgbm8gbGXDrWRhcy5cbiAgICogw5p0aWwgcGFyYSBiYWRnZXMgZW4gVUkuXG4gICAqL1xuICBnZXRVbnJlYWRDb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmdldFVucmVhZCgpLnBpcGUobWFwKG4gPT4gbi5sZW5ndGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHVuYSBub3RpZmljYWNpw7NuIHBvciBJRC5cbiAgICovXG4gIGFzeW5jIGdldEJ5SWQobm90aWZpY2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Tm90aWZpY2F0aW9uRG9jdW1lbnQgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24uZ2V0QnlJZChub3RpZmljYXRpb25JZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQUNDSU9ORVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE1hcmNhIHVuYSBub3RpZmljYWNpw7NuIGNvbW8gbGXDrWRhLlxuICAgKi9cbiAgYXN5bmMgbWFya0FzUmVhZChub3RpZmljYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmNvbGxlY3Rpb24udXBkYXRlKG5vdGlmaWNhdGlvbklkLCB7IGlzUmVhZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJjYSB0b2RhcyBsYXMgbm90aWZpY2FjaW9uZXMgY29tbyBsZcOtZGFzLlxuICAgKi9cbiAgYXN5bmMgbWFya0FsbEFzUmVhZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3QgdW5yZWFkID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnF1ZXJ5KHtcbiAgICAgIHdoZXJlOiBbeyBmaWVsZDogJ2lzUmVhZCcsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogZmFsc2UgfV0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHVucmVhZC5tYXAobiA9PiB0aGlzLmNvbGxlY3Rpb24hLnVwZGF0ZShuLmlkISwgeyBpc1JlYWQ6IHRydWUgfSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIHVuYSBub3RpZmljYWNpw7NuLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKG5vdGlmaWNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5kZWxldGUobm90aWZpY2F0aW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgdG9kYXMgbGFzIG5vdGlmaWNhY2lvbmVzIGRlbCB1c3VhcmlvLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGwgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb24uZ2V0QWxsKCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYWxsLm1hcChuID0+IHRoaXMuY29sbGVjdGlvbiEuZGVsZXRlKG4uaWQhKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbXBpYSBlbCBlc3RhZG8gZGVsIHNlcnZpY2lvLlxuICAgKiDDmnRpbCBwYXJhIGxvZ291dC5cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50VXNlcklkID0gbnVsbDtcbiAgfVxufVxuIl19
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9maXJlYmFzZS9ub3RpZmljYXRpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBWSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFJbkQsb0RBQW9EO0FBQ3BELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQXFCekI7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFPL0IsWUFDVSxRQUFrQixFQUNOLGlCQUE2QztRQUR6RCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ04sc0JBQWlCLEdBQWpCLGlCQUFpQixDQUE0QjtRQVIzRCxlQUFVLEdBQWlELElBQUksQ0FBQztRQUNoRSxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFFNUMsOERBQThEO1FBQ3RELGdCQUFXLEdBQXVCLElBQUksQ0FBQztRQU03QywwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHVCQUF1QjtRQUM3QixvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDhEQUE4RDtZQUM5RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFFRCx3REFBd0Q7UUFDeEQscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDeEMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDVixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBWSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUV0QyxJQUFJLElBQUksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3ZELDZDQUE2QztvQkFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9CLENBQUM7cUJBQU0sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3ZDLHlCQUF5QjtvQkFDekIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFVBQVUsQ0FBQyxNQUFjO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixPQUFPLENBQUMsSUFBSSxDQUNWLDBHQUEwRyxDQUMzRyxDQUFDO1lBQ0YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUU1Qix3RUFBd0U7UUFDeEUsa0RBQWtEO1FBQ2xELE1BQU0sUUFBUSxHQUFHLFNBQVMsTUFBTSxnQkFBZ0IsQ0FBQztRQUVqRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQXVCLFFBQVEsRUFBRTtZQUM5RSxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsVUFBVTtJQUNWLDhFQUE4RTtJQUU5RTs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLEdBQUcsYUFBYTtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVwQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzlCLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEQsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLGFBQWE7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFaEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUNoQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BELEtBQUs7U0FDTixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxLQUFLLEdBQUcsYUFBYTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVwQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzlCLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUMxRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BELEtBQUs7U0FDTixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sSUFBSSxDQUFDLFVBQVU7YUFDbkIsUUFBUSxDQUFDO1lBQ1IsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQzNELENBQUM7YUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFzQjtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsV0FBVztJQUNYLDhFQUE4RTtJQUU5RTs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBc0I7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUM3QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFFN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUN6QyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDM0QsQ0FBQyxDQUFDO1FBRUgsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQXNCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFDN0IsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsU0FBUztRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFFN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDOytHQXJOVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQURQLE1BQU07OzRGQUNuQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFVN0IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm90aWZpY2F0aW9ucyBTZXJ2aWNlXG4gKlxuICogU2VydmljaW8gcGFyYSBsZWVyIG5vdGlmaWNhY2lvbmVzIGRlc2RlIEZpcmVzdG9yZS5cbiAqIEVsIGJhY2tlbmQgZXNjcmliZSBsYXMgbm90aWZpY2FjaW9uZXMsIGVsIGZyb250ZW5kIHNvbG8gbGFzIGxlZSB5IGFjdHVhbGl6YSBlc3RhZG8uXG4gKlxuICogU2UgYXV0by1pbmljaWFsaXphIGN1YW5kbyBBdXRoU2VydmljZSB0aWVuZSB1biB1c3VhcmlvIGF1dGVudGljYWRvLlxuICogVGFtYmnDqW4gcHVlZGUgaW5pY2lhbGl6YXJzZSBtYW51YWxtZW50ZSBjb24gYGluaXRpYWxpemUodXNlcklkKWAuXG4gKi9cblxuaW1wb3J0IHsgZWZmZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciwgT3B0aW9uYWwsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBGaXJlc3RvcmVDb2xsZWN0aW9uRmFjdG9yeSwgVHlwZWRDb2xsZWN0aW9uIH0gZnJvbSAnLi9maXJlc3RvcmUtY29sbGVjdGlvbic7XG5pbXBvcnQgeyBGaXJlc3RvcmVEb2N1bWVudCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogTMOtbWl0ZSBwb3IgZGVmZWN0byBkZSBub3RpZmljYWNpb25lcyBhIGNhcmdhciAqL1xuY29uc3QgREVGQVVMVF9MSU1JVCA9IDUwO1xuXG4vKipcbiAqIERvY3VtZW50byBkZSBub3RpZmljYWNpw7NuIGVuIEZpcmVzdG9yZS5cbiAqIEVzdHJ1Y3R1cmEgZXNjcml0YSBwb3IgZWwgYmFja2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25Eb2N1bWVudCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50IHtcbiAgLyoqIFTDrXR1bG8gZGUgbGEgbm90aWZpY2FjacOzbiAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqIEN1ZXJwbyBkZWwgbWVuc2FqZSAqL1xuICBib2R5Pzogc3RyaW5nO1xuICAvKiogVVJMIGRlIGltYWdlbiAqL1xuICBpbWFnZT86IHN0cmluZztcbiAgLyoqIERhdG9zIHBlcnNvbmFsaXphZG9zIChlajogcm91dGUsIGFjdGlvblR5cGUpICovXG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogVGlwbyBkZSBub3RpZmljYWNpw7NuICovXG4gIHR5cGU/OiAnZmNtJyB8ICdzeXN0ZW0nIHwgJ3JlbWluZGVyJyB8IHN0cmluZztcbiAgLyoqIFNpIGxhIG5vdGlmaWNhY2nDs24gZnVlIGxlw61kYSAqL1xuICBpc1JlYWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBsZWVyIG5vdGlmaWNhY2lvbmVzIGRlc2RlIEZpcmVzdG9yZS5cbiAqXG4gKiBTZSBhdXRvLWluaWNpYWxpemEgY3VhbmRvIEF1dGhTZXJ2aWNlIHRpZW5lIHVuIHVzdWFyaW8gYXV0ZW50aWNhZG8uXG4gKiBObyByZXF1aWVyZSBsbGFtYXIgYSBgaW5pdGlhbGl6ZSgpYCBtYW51YWxtZW50ZSBzaSBBdXRoU2VydmljZSBlc3TDoSBjb25maWd1cmFkby5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29uIEF1dGhTZXJ2aWNlIGNvbmZpZ3VyYWRvOiBhdXRvLWluaWNpYWxpemFjacOzblxuICogLy8gU29sbyBpbnllY3RhciB5IHVzYXIgZGlyZWN0YW1lbnRlXG4gKiBwcml2YXRlIG5vdGlmaWNhdGlvbnMgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuICpcbiAqIG5vdGlmaWNhdGlvbnMkID0gdGhpcy5ub3RpZmljYXRpb25zLmdldEFsbCgpO1xuICogdW5yZWFkQ291bnQkID0gdGhpcy5ub3RpZmljYXRpb25zLmdldFVucmVhZENvdW50KCk7XG4gKlxuICogLy8gU2luIEF1dGhTZXJ2aWNlOiBpbmljaWFsaXphY2nDs24gbWFudWFsXG4gKiB0aGlzLm5vdGlmaWNhdGlvbnMuaW5pdGlhbGl6ZSh1c2VySWQpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uc1NlcnZpY2Uge1xuICBwcml2YXRlIGNvbGxlY3Rpb246IFR5cGVkQ29sbGVjdGlvbjxOb3RpZmljYXRpb25Eb2N1bWVudD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50VXNlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyBJbnllY2Npw7NuIG9wY2lvbmFsIC0gQXV0aFNlcnZpY2UgcHVlZGUgbm8gZXN0YXIgY29uZmlndXJhZG9cbiAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbGxlY3Rpb25GYWN0b3J5OiBGaXJlc3RvcmVDb2xsZWN0aW9uRmFjdG9yeVxuICApIHtcbiAgICAvLyBJbnRlbnRhciBvYnRlbmVyIEF1dGhTZXJ2aWNlIGRlIGZvcm1hIGxhenkgKHB1ZWRlIG5vIGVzdGFyIGNvbmZpZ3VyYWRvKVxuICAgIHRoaXMuc2V0dXBBdXRvSW5pdGlhbGl6YXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgYXV0by1pbmljaWFsaXphY2nDs24gb2JzZXJ2YW5kbyBlbCBlc3RhZG8gZGUgQXV0aFNlcnZpY2UuXG4gICAqIFNlIGVqZWN1dGEgZW4gZWwgY29udGV4dG8gZGVsIGluamVjdG9yIHBhcmEgcG9kZXIgdXNhciBlZmZlY3QoKS5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBBdXRvSW5pdGlhbGl6YXRpb24oKTogdm9pZCB7XG4gICAgLy8gT2J0ZW5lciBBdXRoU2VydmljZSBkZSBmb3JtYSBsYXp5XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChBdXRoU2VydmljZSwgbnVsbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBdXRoU2VydmljZSBubyBlc3TDoSBjb25maWd1cmFkbywgbm8gaGF5IGF1dG8taW5pY2lhbGl6YWNpw7NuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXNhciBydW5JbkluamVjdGlvbkNvbnRleHQgcGFyYSBwb2RlciBjcmVhciBlbCBlZmZlY3RcbiAgICBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aFNlcnZpY2UhLnVzZXIoKTtcblxuICAgICAgICBpZiAodXNlcj8udXNlcklkICYmIHRoaXMuY3VycmVudFVzZXJJZCAhPT0gdXNlci51c2VySWQpIHtcbiAgICAgICAgICAvLyBVc3VhcmlvIGF1dGVudGljYWRvOiBpbmljaWFsaXphciBjb24gc3UgSURcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemUodXNlci51c2VySWQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF1c2VyICYmIHRoaXMuY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIC8vIExvZ291dDogbGltcGlhciBlc3RhZG9cbiAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaWNpYWxpemEgZWwgc2VydmljaW8gcGFyYSB1biB1c3VhcmlvIGVzcGVjw61maWNvLlxuICAgKlxuICAgKiBOT1RBOiBTZSBsbGFtYSBhdXRvbcOhdGljYW1lbnRlIHNpIEF1dGhTZXJ2aWNlIGVzdMOhIGNvbmZpZ3VyYWRvLlxuICAgKiBTb2xvIHVzYXIgbWFudWFsbWVudGUgc2kgQXV0aFNlcnZpY2Ugbm8gZXN0w6EgZGlzcG9uaWJsZSBvIHNlIG5lY2VzaXRhXG4gICAqIHVuIHVzZXJJZCBkaWZlcmVudGUgYWwgZGVsIHVzdWFyaW8gYXV0ZW50aWNhZG8uXG4gICAqL1xuICBpbml0aWFsaXplKHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbGxlY3Rpb25GYWN0b3J5KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbTm90aWZpY2F0aW9uc10gRmlyZXN0b3JlQ29sbGVjdGlvbkZhY3Rvcnkgbm90IGF2YWlsYWJsZS4gRW5zdXJlIHByb3ZpZGVWYWx0ZWNoRmlyZWJhc2UoKSBpcyBjb25maWd1cmVkLidcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VXNlcklkID0gdXNlcklkO1xuXG4gICAgLy8gUGF0aCByZWxhdGl2byAtIEZpcmVzdG9yZVNlcnZpY2UgYWdyZWdhIGF1dG9tw6F0aWNhbWVudGUgYXBwcy97YXBwSWR9L1xuICAgIC8vIE5PIGFncmVnYXIgYXBwcy8gYXF1w60gcGFyYSBldml0YXIgZG9ibGUgcHJlZmlqb1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYHVzZXJzLyR7dXNlcklkfS9ub3RpZmljYXRpb25zYDtcblxuICAgIHRoaXMuY29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbkZhY3RvcnkuY3JlYXRlPE5vdGlmaWNhdGlvbkRvY3VtZW50PihiYXNlUGF0aCwge1xuICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCdbTm90aWZpY2F0aW9uc10gSW5pdGlhbGl6ZWQgd2l0aCBwYXRoOicsIGJhc2VQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCBzZXJ2aWNpbyBlc3TDoSBpbmljaWFsaXphZG8uXG4gICAqL1xuICBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgSUQgZGVsIHVzdWFyaW8gYWN0dWFsLlxuICAgKi9cbiAgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50VXNlcklkO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExFQ1RVUkFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbm90aWZpY2FjaW9uZXMgb3JkZW5hZGFzIHBvciBmZWNoYSBkZXNjZW5kZW50ZSAocmVhbC10aW1lKS5cbiAgICogU2UgYWN0dWFsaXphIGF1dG9tw6F0aWNhbWVudGUgY3VhbmRvIGNhbWJpYW4gbG9zIGRhdG9zLlxuICAgKlxuICAgKiBAcGFyYW0gbGltaXQgLSBNw6F4aW1vIGRlIG5vdGlmaWNhY2lvbmVzIGEgY2FyZ2FyIChkZWZhdWx0OiA1MClcbiAgICovXG4gIGdldEFsbChsaW1pdCA9IERFRkFVTFRfTElNSVQpOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvbkRvY3VtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikgcmV0dXJuIG9mKFtdKTtcblxuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24ud2F0Y2hBbGwoe1xuICAgICAgb3JkZXJCeTogW3sgZmllbGQ6ICdjcmVhdGVkQXQnLCBkaXJlY3Rpb246ICdkZXNjJyB9XSxcbiAgICAgIGxpbWl0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbm90aWZpY2FjaW9uZXMgKG9uZS10aW1lIGZldGNoIHNpbiBsaXN0ZW5lcikuXG4gICAqIMOadGlsIHBhcmEgY2FyZ2FzIGluaWNpYWxlcyBzaW4gbmVjZXNpZGFkIGRlIHVwZGF0ZXMgZW4gdGllbXBvIHJlYWwuXG4gICAqXG4gICAqIEBwYXJhbSBsaW1pdCAtIE3DoXhpbW8gZGUgbm90aWZpY2FjaW9uZXMgYSBjYXJnYXIgKGRlZmF1bHQ6IDUwKVxuICAgKi9cbiAgYXN5bmMgZ2V0QWxsT25jZShsaW1pdCA9IERFRkFVTFRfTElNSVQpOiBQcm9taXNlPE5vdGlmaWNhdGlvbkRvY3VtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuY29sbGVjdGlvbikgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5nZXRBbGxPbmNlKHtcbiAgICAgIG9yZGVyQnk6IFt7IGZpZWxkOiAnY3JlYXRlZEF0JywgZGlyZWN0aW9uOiAnZGVzYycgfV0sXG4gICAgICBsaW1pdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHNvbG8gbm90aWZpY2FjaW9uZXMgbm8gbGXDrWRhcyAocmVhbC10aW1lLCBmaWx0cmFkbyBzZXJ2ZXItc2lkZSkuXG4gICAqXG4gICAqIEBwYXJhbSBsaW1pdCAtIE3DoXhpbW8gZGUgbm90aWZpY2FjaW9uZXMgKGRlZmF1bHQ6IDUwKVxuICAgKi9cbiAgZ2V0VW5yZWFkKGxpbWl0ID0gREVGQVVMVF9MSU1JVCk6IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uRG9jdW1lbnRbXT4ge1xuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSByZXR1cm4gb2YoW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbi53YXRjaEFsbCh7XG4gICAgICB3aGVyZTogW3sgZmllbGQ6ICdpc1JlYWQnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IGZhbHNlIH1dLFxuICAgICAgb3JkZXJCeTogW3sgZmllbGQ6ICdjcmVhdGVkQXQnLCBkaXJlY3Rpb246ICdkZXNjJyB9XSxcbiAgICAgIGxpbWl0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1ZW50YSBub3RpZmljYWNpb25lcyBubyBsZcOtZGFzIChyZWFsLXRpbWUsIGZpbHRyYWRvIHNlcnZlci1zaWRlKS5cbiAgICogw5p0aWwgcGFyYSBiYWRnZXMgZW4gVUkuXG4gICAqL1xuICBnZXRVbnJlYWRDb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSByZXR1cm4gb2YoMCk7XG5cbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uXG4gICAgICAud2F0Y2hBbGwoe1xuICAgICAgICB3aGVyZTogW3sgZmllbGQ6ICdpc1JlYWQnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IGZhbHNlIH1dLFxuICAgICAgfSlcbiAgICAgIC5waXBlKG1hcChuID0+IG4ubGVuZ3RoKSk7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSB1bmEgbm90aWZpY2FjacOzbiBwb3IgSUQuXG4gICAqL1xuICBhc3luYyBnZXRCeUlkKG5vdGlmaWNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE5vdGlmaWNhdGlvbkRvY3VtZW50IHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmdldEJ5SWQobm90aWZpY2F0aW9uSWQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFDQ0lPTkVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBNYXJjYSB1bmEgbm90aWZpY2FjacOzbiBjb21vIGxlw61kYS5cbiAgICovXG4gIGFzeW5jIG1hcmtBc1JlYWQobm90aWZpY2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZShub3RpZmljYXRpb25JZCwgeyBpc1JlYWQ6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFyY2EgdG9kYXMgbGFzIG5vdGlmaWNhY2lvbmVzIG5vIGxlw61kYXMgY29tbyBsZcOtZGFzIChiYXRjaCB3cml0ZSkuXG4gICAqL1xuICBhc3luYyBtYXJrQWxsQXNSZWFkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCB1bnJlYWQgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb24ucXVlcnkoe1xuICAgICAgd2hlcmU6IFt7IGZpZWxkOiAnaXNSZWFkJywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiBmYWxzZSB9XSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGlkcyA9IHVucmVhZC5tYXAobiA9PiBuLmlkISkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5iYXRjaFVwZGF0ZShpZHMsIHsgaXNSZWFkOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgdW5hIG5vdGlmaWNhY2nDs24uXG4gICAqL1xuICBhc3luYyBkZWxldGUobm90aWZpY2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLmRlbGV0ZShub3RpZmljYXRpb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSB0b2RhcyBsYXMgbm90aWZpY2FjaW9uZXMgZGVsIHVzdWFyaW8gKGJhdGNoIGRlbGV0ZSkuXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbGxlY3Rpb24pIHJldHVybjtcblxuICAgIGNvbnN0IGFsbCA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbi5nZXRBbGwoKTtcbiAgICBjb25zdCBpZHMgPSBhbGwubWFwKG4gPT4gbi5pZCEpLmZpbHRlcihCb29sZWFuKTtcbiAgICBhd2FpdCB0aGlzLmNvbGxlY3Rpb24uYmF0Y2hEZWxldGUoaWRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW1waWEgZWwgZXN0YWRvIGRlbCBzZXJ2aWNpby5cbiAgICogw5p0aWwgcGFyYSBsb2dvdXQuXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBudWxsO1xuICAgIHRoaXMuY3VycmVudFVzZXJJZCA9IG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -51,6 +51,24 @@ export function provideValtechI18n(config = {}) {
51
51
  if (Object.keys(contentToRegister).length > 0) {
52
52
  i18n.registerContentBulk(contentToRegister);
53
53
  }
54
+ // Aplicar idioma según configuración
55
+ if (!mergedConfig.detectBrowserLanguage) {
56
+ // Sin detección de navegador: forzar idioma por defecto
57
+ i18n.setLanguage(mergedConfig.defaultLanguage);
58
+ }
59
+ else {
60
+ // Con detección: re-evaluar ahora que supportedLanguages está configurado
61
+ const stored = localStorage.getItem('app_lang');
62
+ if (!stored || !mergedConfig.supportedLanguages.includes(stored)) {
63
+ const browserLang = navigator.language.split('-')[0];
64
+ if (mergedConfig.supportedLanguages.includes(browserLang)) {
65
+ i18n.setLanguage(browserLang);
66
+ }
67
+ else {
68
+ i18n.setLanguage(mergedConfig.defaultLanguage);
69
+ }
70
+ }
71
+ }
54
72
  };
55
73
  },
56
74
  deps: [I18nService],
@@ -107,4 +125,4 @@ function deepMergeLanguagesContent(base, override) {
107
125
  }
108
126
  return result;
109
127
  }
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9pMThuL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLGVBQWUsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLG1CQUFtQixFQUE0QyxNQUFNLFNBQVMsQ0FBQztBQUNwRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsU0FBcUIsRUFBRTtJQUN4RCxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUUzRCxPQUFPLHdCQUF3QixDQUFDO1FBQzlCO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLENBQUMsSUFBaUIsRUFBRSxFQUFFO2dCQUNoQyxPQUFPLEdBQUcsRUFBRTtvQkFDVixnQ0FBZ0M7b0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFFdkQsbUNBQW1DO29CQUNuQyxJQUFJLGlCQUFpQixHQUFpQixFQUFFLENBQUM7b0JBRXpDLElBQUksWUFBWSxDQUFDLHFCQUFxQixLQUFLLEtBQUssRUFBRSxDQUFDO3dCQUNqRCw0Q0FBNEM7d0JBQzVDLGlCQUFpQixHQUFHLGdCQUFnQixDQUNsQyx1QkFBdUIsRUFDdkIsWUFBWSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQzNCLENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDaEMsNkJBQTZCO3dCQUM3QixpQkFBaUIsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO29CQUMzQyxDQUFDO29CQUVELHNCQUFzQjtvQkFDdEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM5QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDOUMsQ0FBQztnQkFDSCxDQUFDLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQ25CLEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFrQixFQUFFLFFBQXNCO0lBQ2xFLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7SUFFaEMsdUNBQXVDO0lBQ3ZDLEtBQUssTUFBTSxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RCLDZDQUE2QztZQUM3QyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcseUJBQXlCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7YUFBTSxDQUFDO1lBQ04sbUNBQW1DO1lBQ25DLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLHlCQUF5QixDQUNoQyxJQUFzQixFQUN0QixRQUEwQjtJQUUxQixNQUFNLE1BQU0sR0FBcUIsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ3ZCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztLQUN6QixDQUFrQixDQUFDO0lBRXBCLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgQVBQX0lOSVRJQUxJWkVSLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEkxOG5Db25maWcsIERFRkFVTFRfSTE4Tl9DT05GSUcsIENvbnRlbnRTdG9yZSwgTGFuZ3VhZ2VzQ29udGVudCwgSTE4bkxhbmcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgVkFMVEVDSF9ERUZBVUxUX0NPTlRFTlQgfSBmcm9tICcuL2RlZmF1bHQtY29udGVudCc7XG5cbi8qKlxuICogQ29uZmlndXJhIGVsIHNpc3RlbWEgZGUgaW50ZXJuYWNpb25hbGl6YWNpw7NuIGRlIFZhbHRlY2ggQ29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYWNpw7NuIGRlIGkxOG5cbiAqIEByZXR1cm5zIFByb3ZpZGVycyBwYXJhIGFncmVnYXIgZW4gYXBwLmNvbmZpZy50c1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBhcHAuY29uZmlnLnRzXG4gKiBpbXBvcnQgeyBwcm92aWRlVmFsdGVjaEkxOG4gfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICogaW1wb3J0IHsgR0xPQkFMX0NPTlRFTlQgfSBmcm9tICcuL2kxOG4vX2dsb2JhbCc7XG4gKiBpbXBvcnQgeyBMT0dJTl9DT05URU5UIH0gZnJvbSAnLi9pMThuL2xvZ2luLmkxOG4nO1xuICpcbiAqIGV4cG9ydCBjb25zdCBhcHBDb25maWc6IEFwcGxpY2F0aW9uQ29uZmlnID0ge1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBwcm92aWRlVmFsdGVjaEkxOG4oe1xuICogICAgICAgZGVmYXVsdExhbmd1YWdlOiAnZXMnLFxuICogICAgICAgc3VwcG9ydGVkTGFuZ3VhZ2VzOiBbJ2VzJywgJ2VuJ10sXG4gKiAgICAgICBkZXRlY3RCcm93c2VyTGFuZ3VhZ2U6IHRydWUsXG4gKiAgICAgICBjb250ZW50OiB7XG4gKiAgICAgICAgICdfZ2xvYmFsJzogR0xPQkFMX0NPTlRFTlQsXG4gKiAgICAgICAgICdMb2dpbic6IExPR0lOX0NPTlRFTlQsXG4gKiAgICAgICB9XG4gKiAgICAgfSksXG4gKiAgIF1cbiAqIH07XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmFsdGVjaEkxOG4oY29uZmlnOiBJMThuQ29uZmlnID0ge30pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIGNvbnN0IG1lcmdlZENvbmZpZyA9IHsgLi4uREVGQVVMVF9JMThOX0NPTkZJRywgLi4uY29uZmlnIH07XG5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKGkxOG46IEkxOG5TZXJ2aWNlKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgLy8gQ29uZmlndXJhciBpZGlvbWFzIHNvcG9ydGFkb3NcbiAgICAgICAgICBpMThuLnNldEkxOG5MYW5ndWFnZXMobWVyZ2VkQ29uZmlnLnN1cHBvcnRlZExhbmd1YWdlcyk7XG5cbiAgICAgICAgICAvLyBEZXRlcm1pbmFyIGNvbnRlbmlkbyBhIHJlZ2lzdHJhclxuICAgICAgICAgIGxldCBjb250ZW50VG9SZWdpc3RlcjogQ29udGVudFN0b3JlID0ge307XG5cbiAgICAgICAgICBpZiAobWVyZ2VkQ29uZmlnLmluY2x1ZGVEZWZhdWx0Q29udGVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIE1lcmdlOiBkZWZhdWx0cyArIHVzZXIgY29uZmlnICh1c2VyIGdhbmEpXG4gICAgICAgICAgICBjb250ZW50VG9SZWdpc3RlciA9IGRlZXBNZXJnZUNvbnRlbnQoXG4gICAgICAgICAgICAgIFZBTFRFQ0hfREVGQVVMVF9DT05URU5ULFxuICAgICAgICAgICAgICBtZXJnZWRDb25maWcuY29udGVudCB8fCB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZENvbmZpZy5jb250ZW50KSB7XG4gICAgICAgICAgICAvLyBTb2xvIGNvbnRlbmlkbyBkZWwgdXN1YXJpb1xuICAgICAgICAgICAgY29udGVudFRvUmVnaXN0ZXIgPSBtZXJnZWRDb25maWcuY29udGVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWdpc3RyYXIgY29udGVuaWRvXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbnRlbnRUb1JlZ2lzdGVyKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpMThuLnJlZ2lzdGVyQ29udGVudEJ1bGsoY29udGVudFRvUmVnaXN0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBkZXBzOiBbSTE4blNlcnZpY2VdLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSk7XG59XG5cbi8qKlxuICogRGVlcCBtZXJnZSBkZSBDb250ZW50U3RvcmUuXG4gKiBFbCBjb250ZW5pZG8gZGUgYG92ZXJyaWRlYCBzb2JyZXNjcmliZSBrZXlzIGVzcGVjw61maWNhcyBkZSBgYmFzZWAuXG4gKlxuICogQHBhcmFtIGJhc2UgLSBDb250ZW5pZG8gYmFzZSAoZGVmYXVsdHMgZGUgdmFsdGVjaC1jb21wb25lbnRzKVxuICogQHBhcmFtIG92ZXJyaWRlIC0gQ29udGVuaWRvIGRlbCB1c3VhcmlvIHF1ZSBzb2JyZXNjcmliZVxuICogQHJldHVybnMgQ29udGVudFN0b3JlIG1lcmdlYWRvXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGJhc2UgPSB7IF9nbG9iYWw6IHsgZXM6IHsgb2s6ICdBY2VwdGFyJyB9IH0gfTtcbiAqIGNvbnN0IG92ZXJyaWRlID0geyBfZ2xvYmFsOiB7IGVzOiB7IG9rOiAnRGFsZScgfSB9IH07XG4gKiAvLyBSZXN1bHRhZG86IHsgX2dsb2JhbDogeyBlczogeyBvazogJ0RhbGUnIH0gfSB9XG4gKi9cbmZ1bmN0aW9uIGRlZXBNZXJnZUNvbnRlbnQoYmFzZTogQ29udGVudFN0b3JlLCBvdmVycmlkZTogQ29udGVudFN0b3JlKTogQ29udGVudFN0b3JlIHtcbiAgY29uc3QgcmVzdWx0OiBDb250ZW50U3RvcmUgPSB7fTtcblxuICAvLyBDb3BpYXIgdG9kb3MgbG9zIG5hbWVzcGFjZXMgZGVsIGJhc2VcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgT2JqZWN0LmtleXMoYmFzZSkpIHtcbiAgICByZXN1bHRbbmFtZXNwYWNlXSA9IGRlZXBNZXJnZUxhbmd1YWdlc0NvbnRlbnQoYmFzZVtuYW1lc3BhY2VdLCB7fSk7XG4gIH1cblxuICAvLyBNZXJnZWFyIG5hbWVzcGFjZXMgZGVsIG92ZXJyaWRlXG4gIGZvciAoY29uc3QgbmFtZXNwYWNlIG9mIE9iamVjdC5rZXlzKG92ZXJyaWRlKSkge1xuICAgIGlmIChyZXN1bHRbbmFtZXNwYWNlXSkge1xuICAgICAgLy8gTmFtZXNwYWNlIGV4aXN0ZSBlbiBiYXNlLCBoYWNlciBkZWVwIG1lcmdlXG4gICAgICByZXN1bHRbbmFtZXNwYWNlXSA9IGRlZXBNZXJnZUxhbmd1YWdlc0NvbnRlbnQocmVzdWx0W25hbWVzcGFjZV0sIG92ZXJyaWRlW25hbWVzcGFjZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOYW1lc3BhY2UgbnVldm8sIGNvcGlhciBjb21wbGV0b1xuICAgICAgcmVzdWx0W25hbWVzcGFjZV0gPSBkZWVwTWVyZ2VMYW5ndWFnZXNDb250ZW50KHt9LCBvdmVycmlkZVtuYW1lc3BhY2VdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlZXAgbWVyZ2UgZGUgTGFuZ3VhZ2VzQ29udGVudCAodW4gbmFtZXNwYWNlKS5cbiAqL1xuZnVuY3Rpb24gZGVlcE1lcmdlTGFuZ3VhZ2VzQ29udGVudChcbiAgYmFzZTogTGFuZ3VhZ2VzQ29udGVudCxcbiAgb3ZlcnJpZGU6IExhbmd1YWdlc0NvbnRlbnRcbik6IExhbmd1YWdlc0NvbnRlbnQge1xuICBjb25zdCByZXN1bHQ6IExhbmd1YWdlc0NvbnRlbnQgPSB7fTtcbiAgY29uc3QgYWxsTGFuZ3MgPSBuZXcgU2V0KFtcbiAgICAuLi5PYmplY3Qua2V5cyhiYXNlKSxcbiAgICAuLi5PYmplY3Qua2V5cyhvdmVycmlkZSksXG4gIF0pIGFzIFNldDxJMThuTGFuZz47XG5cbiAgZm9yIChjb25zdCBsYW5nIG9mIGFsbExhbmdzKSB7XG4gICAgcmVzdWx0W2xhbmddID0ge1xuICAgICAgLi4uKGJhc2VbbGFuZ10gfHwge30pLFxuICAgICAgLi4uKG92ZXJyaWRlW2xhbmddIHx8IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9pMThuL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLGVBQWUsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLG1CQUFtQixFQUE0QyxNQUFNLFNBQVMsQ0FBQztBQUNwRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsU0FBcUIsRUFBRTtJQUN4RCxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUUzRCxPQUFPLHdCQUF3QixDQUFDO1FBQzlCO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLENBQUMsSUFBaUIsRUFBRSxFQUFFO2dCQUNoQyxPQUFPLEdBQUcsRUFBRTtvQkFDVixnQ0FBZ0M7b0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFFdkQsbUNBQW1DO29CQUNuQyxJQUFJLGlCQUFpQixHQUFpQixFQUFFLENBQUM7b0JBRXpDLElBQUksWUFBWSxDQUFDLHFCQUFxQixLQUFLLEtBQUssRUFBRSxDQUFDO3dCQUNqRCw0Q0FBNEM7d0JBQzVDLGlCQUFpQixHQUFHLGdCQUFnQixDQUNsQyx1QkFBdUIsRUFDdkIsWUFBWSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQzNCLENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDaEMsNkJBQTZCO3dCQUM3QixpQkFB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USxFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgQVBQX0lOSVRJQUxJWkVSLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEkxOG5Db25maWcsIERFRkFVTFRfSTE4Tl9DT05GSUcsIENvbnRlbnRTdG9yZSwgTGFuZ3VhZ2VzQ29udGVudCwgSTE4bkxhbmcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgVkFMVEVDSF9ERUZBVUxUX0NPTlRFTlQgfSBmcm9tICcuL2RlZmF1bHQtY29udGVudCc7XG5cbi8qKlxuICogQ29uZmlndXJhIGVsIHNpc3RlbWEgZGUgaW50ZXJuYWNpb25hbGl6YWNpw7NuIGRlIFZhbHRlY2ggQ29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYWNpw7NuIGRlIGkxOG5cbiAqIEByZXR1cm5zIFByb3ZpZGVycyBwYXJhIGFncmVnYXIgZW4gYXBwLmNvbmZpZy50c1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBhcHAuY29uZmlnLnRzXG4gKiBpbXBvcnQgeyBwcm92aWRlVmFsdGVjaEkxOG4gfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICogaW1wb3J0IHsgR0xPQkFMX0NPTlRFTlQgfSBmcm9tICcuL2kxOG4vX2dsb2JhbCc7XG4gKiBpbXBvcnQgeyBMT0dJTl9DT05URU5UIH0gZnJvbSAnLi9pMThuL2xvZ2luLmkxOG4nO1xuICpcbiAqIGV4cG9ydCBjb25zdCBhcHBDb25maWc6IEFwcGxpY2F0aW9uQ29uZmlnID0ge1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBwcm92aWRlVmFsdGVjaEkxOG4oe1xuICogICAgICAgZGVmYXVsdExhbmd1YWdlOiAnZXMnLFxuICogICAgICAgc3VwcG9ydGVkTGFuZ3VhZ2VzOiBbJ2VzJywgJ2VuJ10sXG4gKiAgICAgICBkZXRlY3RCcm93c2VyTGFuZ3VhZ2U6IHRydWUsXG4gKiAgICAgICBjb250ZW50OiB7XG4gKiAgICAgICAgICdfZ2xvYmFsJzogR0xPQkFMX0NPTlRFTlQsXG4gKiAgICAgICAgICdMb2dpbic6IExPR0lOX0NPTlRFTlQsXG4gKiAgICAgICB9XG4gKiAgICAgfSksXG4gKiAgIF1cbiAqIH07XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmFsdGVjaEkxOG4oY29uZmlnOiBJMThuQ29uZmlnID0ge30pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIGNvbnN0IG1lcmdlZENvbmZpZyA9IHsgLi4uREVGQVVMVF9JMThOX0NPTkZJRywgLi4uY29uZmlnIH07XG5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKGkxOG46IEkxOG5TZXJ2aWNlKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgLy8gQ29uZmlndXJhciBpZGlvbWFzIHNvcG9ydGFkb3NcbiAgICAgICAgICBpMThuLnNldEkxOG5MYW5ndWFnZXMobWVyZ2VkQ29uZmlnLnN1cHBvcnRlZExhbmd1YWdlcyk7XG5cbiAgICAgICAgICAvLyBEZXRlcm1pbmFyIGNvbnRlbmlkbyBhIHJlZ2lzdHJhclxuICAgICAgICAgIGxldCBjb250ZW50VG9SZWdpc3RlcjogQ29udGVudFN0b3JlID0ge307XG5cbiAgICAgICAgICBpZiAobWVyZ2VkQ29uZmlnLmluY2x1ZGVEZWZhdWx0Q29udGVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIE1lcmdlOiBkZWZhdWx0cyArIHVzZXIgY29uZmlnICh1c2VyIGdhbmEpXG4gICAgICAgICAgICBjb250ZW50VG9SZWdpc3RlciA9IGRlZXBNZXJnZUNvbnRlbnQoXG4gICAgICAgICAgICAgIFZBTFRFQ0hfREVGQVVMVF9DT05URU5ULFxuICAgICAgICAgICAgICBtZXJnZWRDb25maWcuY29udGVudCB8fCB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZENvbmZpZy5jb250ZW50KSB7XG4gICAgICAgICAgICAvLyBTb2xvIGNvbnRlbmlkbyBkZWwgdXN1YXJpb1xuICAgICAgICAgICAgY29udGVudFRvUmVnaXN0ZXIgPSBtZXJnZWRDb25maWcuY29udGVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWdpc3RyYXIgY29udGVuaWRvXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbnRlbnRUb1JlZ2lzdGVyKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpMThuLnJlZ2lzdGVyQ29udGVudEJ1bGsoY29udGVudFRvUmVnaXN0ZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFwbGljYXIgaWRpb21hIHNlZ8O6biBjb25maWd1cmFjacOzblxuICAgICAgICAgIGlmICghbWVyZ2VkQ29uZmlnLmRldGVjdEJyb3dzZXJMYW5ndWFnZSkge1xuICAgICAgICAgICAgLy8gU2luIGRldGVjY2nDs24gZGUgbmF2ZWdhZG9yOiBmb3J6YXIgaWRpb21hIHBvciBkZWZlY3RvXG4gICAgICAgICAgICBpMThuLnNldExhbmd1YWdlKG1lcmdlZENvbmZpZy5kZWZhdWx0TGFuZ3VhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb24gZGV0ZWNjacOzbjogcmUtZXZhbHVhciBhaG9yYSBxdWUgc3VwcG9ydGVkTGFuZ3VhZ2VzIGVzdMOhIGNvbmZpZ3VyYWRvXG4gICAgICAgICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXBwX2xhbmcnKTtcbiAgICAgICAgICAgIGlmICghc3RvcmVkIHx8ICFtZXJnZWRDb25maWcuc3VwcG9ydGVkTGFuZ3VhZ2VzLmluY2x1ZGVzKHN0b3JlZCBhcyBJMThuTGFuZykpIHtcbiAgICAgICAgICAgICAgY29uc3QgYnJvd3NlckxhbmcgPSBuYXZpZ2F0b3IubGFuZ3VhZ2Uuc3BsaXQoJy0nKVswXSBhcyBJMThuTGFuZztcbiAgICAgICAgICAgICAgaWYgKG1lcmdlZENvbmZpZy5zdXBwb3J0ZWRMYW5ndWFnZXMuaW5jbHVkZXMoYnJvd3NlckxhbmcpKSB7XG4gICAgICAgICAgICAgICAgaTE4bi5zZXRMYW5ndWFnZShicm93c2VyTGFuZyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaTE4bi5zZXRMYW5ndWFnZShtZXJnZWRDb25maWcuZGVmYXVsdExhbmd1YWdlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBkZXBzOiBbSTE4blNlcnZpY2VdLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSk7XG59XG5cbi8qKlxuICogRGVlcCBtZXJnZSBkZSBDb250ZW50U3RvcmUuXG4gKiBFbCBjb250ZW5pZG8gZGUgYG92ZXJyaWRlYCBzb2JyZXNjcmliZSBrZXlzIGVzcGVjw61maWNhcyBkZSBgYmFzZWAuXG4gKlxuICogQHBhcmFtIGJhc2UgLSBDb250ZW5pZG8gYmFzZSAoZGVmYXVsdHMgZGUgdmFsdGVjaC1jb21wb25lbnRzKVxuICogQHBhcmFtIG92ZXJyaWRlIC0gQ29udGVuaWRvIGRlbCB1c3VhcmlvIHF1ZSBzb2JyZXNjcmliZVxuICogQHJldHVybnMgQ29udGVudFN0b3JlIG1lcmdlYWRvXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGJhc2UgPSB7IF9nbG9iYWw6IHsgZXM6IHsgb2s6ICdBY2VwdGFyJyB9IH0gfTtcbiAqIGNvbnN0IG92ZXJyaWRlID0geyBfZ2xvYmFsOiB7IGVzOiB7IG9rOiAnRGFsZScgfSB9IH07XG4gKiAvLyBSZXN1bHRhZG86IHsgX2dsb2JhbDogeyBlczogeyBvazogJ0RhbGUnIH0gfSB9XG4gKi9cbmZ1bmN0aW9uIGRlZXBNZXJnZUNvbnRlbnQoYmFzZTogQ29udGVudFN0b3JlLCBvdmVycmlkZTogQ29udGVudFN0b3JlKTogQ29udGVudFN0b3JlIHtcbiAgY29uc3QgcmVzdWx0OiBDb250ZW50U3RvcmUgPSB7fTtcblxuICAvLyBDb3BpYXIgdG9kb3MgbG9zIG5hbWVzcGFjZXMgZGVsIGJhc2VcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgT2JqZWN0LmtleXMoYmFzZSkpIHtcbiAgICByZXN1bHRbbmFtZXNwYWNlXSA9IGRlZXBNZXJnZUxhbmd1YWdlc0NvbnRlbnQoYmFzZVtuYW1lc3BhY2VdLCB7fSk7XG4gIH1cblxuICAvLyBNZXJnZWFyIG5hbWVzcGFjZXMgZGVsIG92ZXJyaWRlXG4gIGZvciAoY29uc3QgbmFtZXNwYWNlIG9mIE9iamVjdC5rZXlzKG92ZXJyaWRlKSkge1xuICAgIGlmIChyZXN1bHRbbmFtZXNwYWNlXSkge1xuICAgICAgLy8gTmFtZXNwYWNlIGV4aXN0ZSBlbiBiYXNlLCBoYWNlciBkZWVwIG1lcmdlXG4gICAgICByZXN1bHRbbmFtZXNwYWNlXSA9IGRlZXBNZXJnZUxhbmd1YWdlc0NvbnRlbnQocmVzdWx0W25hbWVzcGFjZV0sIG92ZXJyaWRlW25hbWVzcGFjZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOYW1lc3BhY2UgbnVldm8sIGNvcGlhciBjb21wbGV0b1xuICAgICAgcmVzdWx0W25hbWVzcGFjZV0gPSBkZWVwTWVyZ2VMYW5ndWFnZXNDb250ZW50KHt9LCBvdmVycmlkZVtuYW1lc3BhY2VdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlZXAgbWVyZ2UgZGUgTGFuZ3VhZ2VzQ29udGVudCAodW4gbmFtZXNwYWNlKS5cbiAqL1xuZnVuY3Rpb24gZGVlcE1lcmdlTGFuZ3VhZ2VzQ29udGVudChcbiAgYmFzZTogTGFuZ3VhZ2VzQ29udGVudCxcbiAgb3ZlcnJpZGU6IExhbmd1YWdlc0NvbnRlbnRcbik6IExhbmd1YWdlc0NvbnRlbnQge1xuICBjb25zdCByZXN1bHQ6IExhbmd1YWdlc0NvbnRlbnQgPSB7fTtcbiAgY29uc3QgYWxsTGFuZ3MgPSBuZXcgU2V0KFtcbiAgICAuLi5PYmplY3Qua2V5cyhiYXNlKSxcbiAgICAuLi5PYmplY3Qua2V5cyhvdmVycmlkZSksXG4gIF0pIGFzIFNldDxJMThuTGFuZz47XG5cbiAgZm9yIChjb25zdCBsYW5nIG9mIGFsbExhbmdzKSB7XG4gICAgcmVzdWx0W2xhbmddID0ge1xuICAgICAgLi4uKGJhc2VbbGFuZ10gfHwge30pLFxuICAgICAgLi4uKG92ZXJyaWRlW2xhbmddIHx8IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '2.0.695';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC42OTUnO1xuIl19
5
+ export const VERSION = '2.0.712';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC43MTInO1xuIl19
@@ -50,7 +50,7 @@ import 'prismjs/components/prism-json';
50
50
  * Current version of valtech-components.
51
51
  * This is automatically updated during the publish process.
52
52
  */
53
- const VERSION = '2.0.695';
53
+ const VERSION = '2.0.712';
54
54
 
55
55
  /**
56
56
  * Servicio para gestionar presets de componentes.
@@ -4364,6 +4364,24 @@ function provideValtechI18n(config = {}) {
4364
4364
  if (Object.keys(contentToRegister).length > 0) {
4365
4365
  i18n.registerContentBulk(contentToRegister);
4366
4366
  }
4367
+ // Aplicar idioma según configuración
4368
+ if (!mergedConfig.detectBrowserLanguage) {
4369
+ // Sin detección de navegador: forzar idioma por defecto
4370
+ i18n.setLanguage(mergedConfig.defaultLanguage);
4371
+ }
4372
+ else {
4373
+ // Con detección: re-evaluar ahora que supportedLanguages está configurado
4374
+ const stored = localStorage.getItem('app_lang');
4375
+ if (!stored || !mergedConfig.supportedLanguages.includes(stored)) {
4376
+ const browserLang = navigator.language.split('-')[0];
4377
+ if (mergedConfig.supportedLanguages.includes(browserLang)) {
4378
+ i18n.setLanguage(browserLang);
4379
+ }
4380
+ else {
4381
+ i18n.setLanguage(mergedConfig.defaultLanguage);
4382
+ }
4383
+ }
4384
+ }
4367
4385
  };
4368
4386
  },
4369
4387
  deps: [I18nService],
@@ -9058,18 +9076,28 @@ class SelectSearchComponent {
9058
9076
  return;
9059
9077
  }
9060
9078
  const controlValue = this.props.control.value;
9061
- if (controlValue === null || controlValue === undefined) {
9062
- this.selectedItems = [];
9063
- return;
9064
- }
9065
- // PERF: Use a Map for faster lookup if options are large
9066
- if (this.props.options && this.props.options.length > 0) {
9067
- const map = new Map(this.props.options.map(opt => [opt[this.valueProperty], opt]));
9068
- const selectedOption = map.get(controlValue);
9069
- this.selectedItems = selectedOption ? [selectedOption] : [];
9079
+ if (this.props.mode === 'legacy') {
9080
+ // Permisivo: muestra el valor aunque no esté en las opciones
9081
+ if (controlValue !== null && controlValue !== undefined) {
9082
+ this.displayValue = controlValue.toString();
9083
+ this.selectedItems = [];
9084
+ return;
9085
+ }
9070
9086
  }
9071
9087
  else {
9072
- this.selectedItems = [];
9088
+ // Estricto: solo muestra si coincide con una opción
9089
+ if (controlValue === null || controlValue === undefined) {
9090
+ this.selectedItems = [];
9091
+ return;
9092
+ }
9093
+ if (this.props.options && this.props.options.length > 0) {
9094
+ const map = new Map(this.props.options.map(opt => [opt[this.valueProperty], opt]));
9095
+ const selectedOption = map.get(controlValue);
9096
+ this.selectedItems = selectedOption ? [selectedOption] : [];
9097
+ }
9098
+ else {
9099
+ this.selectedItems = [];
9100
+ }
9073
9101
  }
9074
9102
  }
9075
9103
  applyDefaultValue() {
@@ -9161,6 +9189,10 @@ class SelectSearchComponent {
9161
9189
  return this.selectedItems.some(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
9162
9190
  }
9163
9191
  updateDisplayValue() {
9192
+ if (this.props?.mode === 'legacy' && this.selectedItems.length === 0 && this.props?.control?.value) {
9193
+ this.displayValue = this.props.control.value.toString();
9194
+ return;
9195
+ }
9164
9196
  if (this.selectedItems.length === 0) {
9165
9197
  this.displayValue = '';
9166
9198
  return;
@@ -22682,8 +22714,6 @@ class FormComponent {
22682
22714
  this.onSelectChange = new EventEmitter();
22683
22715
  this.types = InputType;
22684
22716
  this.subscriptions = [];
22685
- // Cache para evitar crear nuevos objetos en cada ciclo de change detection
22686
- this.fieldPropsCache = new Map();
22687
22717
  this.actionsCache = [];
22688
22718
  }
22689
22719
  ngOnInit() {
@@ -22711,15 +22741,14 @@ class FormComponent {
22711
22741
  this.trackSelectChanges(field.name);
22712
22742
  });
22713
22743
  });
22714
- // Construir cache inicial
22715
- this.rebuildFieldPropsCache();
22744
+ this.syncFieldControlStates();
22716
22745
  this.updateActionsCache();
22717
22746
  this.previousState = this.props.state;
22718
22747
  }
22719
22748
  ngOnChanges(changes) {
22720
22749
  // Cuando props cambia, reconstruir el cache
22721
22750
  if (changes['props'] && this.form) {
22722
- this.rebuildFieldPropsCache();
22751
+ this.syncFieldControlStates();
22723
22752
  this.updateActionsCache();
22724
22753
  this.previousState = this.props.state;
22725
22754
  }
@@ -22732,14 +22761,11 @@ class FormComponent {
22732
22761
  }
22733
22762
  }
22734
22763
  /**
22735
- * Reconstruye el cache de props para cada field.
22736
- * Esto evita crear nuevos objetos en cada ciclo de change detection.
22764
+ * Synchronizes form control disabled/enabled state with field metadata.
22737
22765
  */
22738
- rebuildFieldPropsCache() {
22739
- this.fieldPropsCache.clear();
22766
+ syncFieldControlStates() {
22740
22767
  this.props.sections.forEach(section => {
22741
22768
  section.fields.forEach(field => {
22742
- const token = field.token || `input-${field.type}-${field.name}`;
22743
22769
  if (field.type === this.types.NUMBER_FROM_TO) {
22744
22770
  const fromControl = this.getControl(`${field.name}_from`);
22745
22771
  const toControl = this.getControl(`${field.name}_to`);
@@ -22751,13 +22777,6 @@ class FormComponent {
22751
22777
  fromControl.enable({ emitEvent: false });
22752
22778
  toControl.enable({ emitEvent: false });
22753
22779
  }
22754
- this.fieldPropsCache.set(field.name, {
22755
- ...field,
22756
- token,
22757
- fromControl,
22758
- toControl,
22759
- control: undefined,
22760
- });
22761
22780
  }
22762
22781
  else {
22763
22782
  const control = this.getControl(field.name);
@@ -22767,11 +22786,6 @@ class FormComponent {
22767
22786
  else {
22768
22787
  control.enable({ emitEvent: false });
22769
22788
  }
22770
- this.fieldPropsCache.set(field.name, {
22771
- ...field,
22772
- token,
22773
- control,
22774
- });
22775
22789
  }
22776
22790
  });
22777
22791
  });
@@ -22810,50 +22824,16 @@ class FormComponent {
22810
22824
  return this.Form.get(field);
22811
22825
  }
22812
22826
  getFieldProp(field) {
22813
- // Retornar del cache para evitar crear nuevos objetos en cada ciclo de change detection
22814
- const cached = this.fieldPropsCache.get(field.name);
22815
- if (cached) {
22816
- return cached;
22827
+ if (!field.token) {
22828
+ field.token = `input-${field.type}-${field.name}`;
22817
22829
  }
22818
- // Fallback: generar y cachear si no existe (no debería ocurrir normalmente)
22819
- const token = field.token || `input-${field.type}-${field.name}`;
22820
22830
  if (field.type === this.types.NUMBER_FROM_TO) {
22821
22831
  const fromControl = this.getControl(`${field.name}_from`);
22822
22832
  const toControl = this.getControl(`${field.name}_to`);
22823
- if (field.state === ComponentStates.DISABLED) {
22824
- fromControl.disable({ emitEvent: false });
22825
- toControl.disable({ emitEvent: false });
22826
- }
22827
- else {
22828
- fromControl.enable({ emitEvent: false });
22829
- toControl.enable({ emitEvent: false });
22830
- }
22831
- const props = {
22832
- ...field,
22833
- token,
22834
- fromControl,
22835
- toControl,
22836
- control: undefined,
22837
- };
22838
- this.fieldPropsCache.set(field.name, props);
22839
- return props;
22840
- }
22841
- else {
22842
- const control = this.getControl(field.name);
22843
- if (field.state === ComponentStates.DISABLED) {
22844
- control.disable({ emitEvent: false });
22845
- }
22846
- else {
22847
- control.enable({ emitEvent: false });
22848
- }
22849
- const props = {
22850
- ...field,
22851
- token,
22852
- control,
22853
- };
22854
- this.fieldPropsCache.set(field.name, props);
22855
- return props;
22833
+ return { ...field, fromControl, toControl, control: undefined };
22856
22834
  }
22835
+ const control = this.getControl(field.name);
22836
+ return { ...field, control };
22857
22837
  }
22858
22838
  get isAtEndOfForm() {
22859
22839
  return isAtEnd(this.elementRef);
@@ -28467,6 +28447,38 @@ class TypedCollection {
28467
28447
  }
28468
28448
  return this.firestore.deleteDoc(this.collectionPath, id);
28469
28449
  }
28450
+ /**
28451
+ * Actualiza múltiples documentos en una sola operación atómica.
28452
+ */
28453
+ async batchUpdate(ids, data) {
28454
+ if (ids.length === 0)
28455
+ return;
28456
+ const BATCH_LIMIT = 500; // Firestore batch limit
28457
+ for (let i = 0; i < ids.length; i += BATCH_LIMIT) {
28458
+ const chunk = ids.slice(i, i + BATCH_LIMIT);
28459
+ await this.firestore.batch(batch => {
28460
+ for (const id of chunk) {
28461
+ batch.update(`${this.collectionPath}/${id}`, data);
28462
+ }
28463
+ });
28464
+ }
28465
+ }
28466
+ /**
28467
+ * Elimina múltiples documentos en una sola operación atómica.
28468
+ */
28469
+ async batchDelete(ids) {
28470
+ if (ids.length === 0)
28471
+ return;
28472
+ const BATCH_LIMIT = 500;
28473
+ for (let i = 0; i < ids.length; i += BATCH_LIMIT) {
28474
+ const chunk = ids.slice(i, i + BATCH_LIMIT);
28475
+ await this.firestore.batch(batch => {
28476
+ for (const id of chunk) {
28477
+ batch.delete(`${this.collectionPath}/${id}`);
28478
+ }
28479
+ });
28480
+ }
28481
+ }
28470
28482
  /**
28471
28483
  * Restaura un documento soft-deleted.
28472
28484
  */
@@ -29909,6 +29921,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
29909
29921
  * Se auto-inicializa cuando AuthService tiene un usuario autenticado.
29910
29922
  * También puede inicializarse manualmente con `initialize(userId)`.
29911
29923
  */
29924
+ /** Límite por defecto de notificaciones a cargar */
29925
+ const DEFAULT_LIMIT = 50;
29912
29926
  /**
29913
29927
  * Servicio para leer notificaciones desde Firestore.
29914
29928
  *
@@ -29986,7 +30000,9 @@ class NotificationsService {
29986
30000
  // Path relativo - FirestoreService agrega automáticamente apps/{appId}/
29987
30001
  // NO agregar apps/ aquí para evitar doble prefijo
29988
30002
  const basePath = `users/${userId}/notifications`;
29989
- this.collection = this.collectionFactory.create(basePath, { timestamps: true });
30003
+ this.collection = this.collectionFactory.create(basePath, {
30004
+ timestamps: true,
30005
+ });
29990
30006
  console.log('[Notifications] Initialized with path:', basePath);
29991
30007
  }
29992
30008
  /**
@@ -30005,39 +30021,59 @@ class NotificationsService {
30005
30021
  // LECTURA
30006
30022
  // ===========================================================================
30007
30023
  /**
30008
- * Obtiene todas las notificaciones ordenadas por fecha descendente.
30009
- * Real-time: se actualiza automáticamente cuando cambian los datos.
30024
+ * Obtiene notificaciones ordenadas por fecha descendente (real-time).
30025
+ * Se actualiza automáticamente cuando cambian los datos.
30026
+ *
30027
+ * @param limit - Máximo de notificaciones a cargar (default: 50)
30010
30028
  */
30011
- getAll() {
30029
+ getAll(limit = DEFAULT_LIMIT) {
30012
30030
  if (!this.collection)
30013
30031
  return of([]);
30014
30032
  return this.collection.watchAll({
30015
30033
  orderBy: [{ field: 'createdAt', direction: 'desc' }],
30034
+ limit,
30016
30035
  });
30017
30036
  }
30018
30037
  /**
30019
- * Obtiene todas las notificaciones (one-time fetch sin listener).
30038
+ * Obtiene notificaciones (one-time fetch sin listener).
30020
30039
  * Útil para cargas iniciales sin necesidad de updates en tiempo real.
30040
+ *
30041
+ * @param limit - Máximo de notificaciones a cargar (default: 50)
30021
30042
  */
30022
- async getAllOnce() {
30043
+ async getAllOnce(limit = DEFAULT_LIMIT) {
30023
30044
  if (!this.collection)
30024
30045
  return [];
30025
30046
  return this.collection.getAllOnce({
30026
30047
  orderBy: [{ field: 'createdAt', direction: 'desc' }],
30048
+ limit,
30027
30049
  });
30028
30050
  }
30029
30051
  /**
30030
- * Obtiene solo notificaciones no leídas.
30052
+ * Obtiene solo notificaciones no leídas (real-time, filtrado server-side).
30053
+ *
30054
+ * @param limit - Máximo de notificaciones (default: 50)
30031
30055
  */
30032
- getUnread() {
30033
- return this.getAll().pipe(map$1(notifications => notifications.filter(n => !n.isRead)));
30056
+ getUnread(limit = DEFAULT_LIMIT) {
30057
+ if (!this.collection)
30058
+ return of([]);
30059
+ return this.collection.watchAll({
30060
+ where: [{ field: 'isRead', operator: '==', value: false }],
30061
+ orderBy: [{ field: 'createdAt', direction: 'desc' }],
30062
+ limit,
30063
+ });
30034
30064
  }
30035
30065
  /**
30036
- * Cuenta notificaciones no leídas.
30066
+ * Cuenta notificaciones no leídas (real-time, filtrado server-side).
30037
30067
  * Útil para badges en UI.
30038
30068
  */
30039
30069
  getUnreadCount() {
30040
- return this.getUnread().pipe(map$1(n => n.length));
30070
+ if (!this.collection)
30071
+ return of(0);
30072
+ return this.collection
30073
+ .watchAll({
30074
+ where: [{ field: 'isRead', operator: '==', value: false }],
30075
+ })
30076
+ .pipe(map$1(n => n.length));
30041
30077
  }
30042
30078
  /**
30043
30079
  * Obtiene una notificación por ID.
@@ -30059,7 +30095,7 @@ class NotificationsService {
30059
30095
  await this.collection.update(notificationId, { isRead: true });
30060
30096
  }
30061
30097
  /**
30062
- * Marca todas las notificaciones como leídas.
30098
+ * Marca todas las notificaciones no leídas como leídas (batch write).
30063
30099
  */
30064
30100
  async markAllAsRead() {
30065
30101
  if (!this.collection)
@@ -30067,7 +30103,8 @@ class NotificationsService {
30067
30103
  const unread = await this.collection.query({
30068
30104
  where: [{ field: 'isRead', operator: '==', value: false }],
30069
30105
  });
30070
- await Promise.all(unread.map(n => this.collection.update(n.id, { isRead: true })));
30106
+ const ids = unread.map(n => n.id).filter(Boolean);
30107
+ await this.collection.batchUpdate(ids, { isRead: true });
30071
30108
  }
30072
30109
  /**
30073
30110
  * Elimina una notificación.
@@ -30078,13 +30115,14 @@ class NotificationsService {
30078
30115
  await this.collection.delete(notificationId);
30079
30116
  }
30080
30117
  /**
30081
- * Elimina todas las notificaciones del usuario.
30118
+ * Elimina todas las notificaciones del usuario (batch delete).
30082
30119
  */
30083
30120
  async deleteAll() {
30084
30121
  if (!this.collection)
30085
30122
  return;
30086
30123
  const all = await this.collection.getAll();
30087
- await Promise.all(all.map(n => this.collection.delete(n.id)));
30124
+ const ids = all.map(n => n.id).filter(Boolean);
30125
+ await this.collection.batchDelete(ids);
30088
30126
  }
30089
30127
  /**
30090
30128
  * Limpia el estado del servicio.