@po-ui/ng-sync 5.22.0 → 6.0.0

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.
Files changed (86) hide show
  1. package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
  2. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  3. package/{esm2015/lib/models/po-data-message.model.js → esm2020/lib/models/po-data-message.model.mjs} +0 -0
  4. package/{esm2015/lib/models/po-data-transform.model.js → esm2020/lib/models/po-data-transform.model.mjs} +0 -0
  5. package/esm2020/lib/models/po-entity/po-entity.model.mjs +214 -0
  6. package/{esm2015/lib/models/po-event-sourcing-error-response.model.js → esm2020/lib/models/po-event-sourcing-error-response.model.mjs} +0 -0
  7. package/{esm2015/lib/models/po-network-status.model.js → esm2020/lib/models/po-network-status.model.mjs} +0 -0
  8. package/{esm2015/lib/models/po-network-type.enum.js → esm2020/lib/models/po-network-type.enum.mjs} +0 -0
  9. package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +238 -0
  10. package/{esm2015/lib/models/po-request-type.enum.js → esm2020/lib/models/po-request-type.enum.mjs} +0 -0
  11. package/esm2020/lib/po-sync.module.mjs +45 -0
  12. package/{esm2015/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.js → esm2020/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs} +0 -0
  13. package/{esm2015/lib/services/po-event-sourcing/index.js → esm2020/lib/services/po-event-sourcing/index.mjs} +0 -0
  14. package/{esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.js → esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs} +0 -0
  15. package/{esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.js → esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs} +0 -0
  16. package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +372 -0
  17. package/{esm2015/lib/services/po-http-client/interfaces/po-http-header-option.interface.js → esm2020/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs} +0 -0
  18. package/{esm2015/lib/services/po-http-client/interfaces/po-http-request-data.interface.js → esm2020/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs} +0 -0
  19. package/{esm2015/lib/services/po-http-client/interfaces/po-response-api.interface.js → esm2020/lib/services/po-http-client/interfaces/po-response-api.interface.mjs} +0 -0
  20. package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +148 -0
  21. package/{esm2015/lib/services/po-http-client/po-http-request-type.enum.js → esm2020/lib/services/po-http-client/po-http-request-type.enum.mjs} +0 -0
  22. package/esm2020/lib/services/po-network/po-network.service.mjs +58 -0
  23. package/{esm2015/lib/services/po-schema/index.js → esm2020/lib/services/po-schema/index.mjs} +0 -0
  24. package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +77 -0
  25. package/{esm2015/lib/services/po-schema/po-schema-util/po-schema-util.model.js → esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs} +0 -0
  26. package/esm2020/lib/services/po-schema/po-schema.service.mjs +174 -0
  27. package/{esm2015/lib/services/po-sync/interfaces/po-sync-config.interface.js → esm2020/lib/services/po-sync/interfaces/po-sync-config.interface.mjs} +0 -0
  28. package/{esm2015/lib/services/po-sync/interfaces/po-sync-field-options.interface.js → esm2020/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs} +0 -0
  29. package/{esm2015/lib/services/po-sync/interfaces/po-sync-response.interface.js → esm2020/lib/services/po-sync/interfaces/po-sync-response.interface.mjs} +0 -0
  30. package/{esm2015/lib/services/po-sync/interfaces/po-sync-schema.interface.js → esm2020/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs} +0 -0
  31. package/esm2020/lib/services/po-sync/po-sync.service.mjs +325 -0
  32. package/{esm2015/lib/utils/utils.js → esm2020/lib/utils/utils.mjs} +0 -0
  33. package/esm2020/po-ui-ng-sync.mjs +5 -0
  34. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  35. package/fesm2015/{po-ui-ng-sync.js → po-ui-ng-sync.mjs} +217 -201
  36. package/fesm2015/po-ui-ng-sync.mjs.map +1 -0
  37. package/fesm2020/po-ui-ng-sync.mjs +2018 -0
  38. package/fesm2020/po-ui-ng-sync.mjs.map +1 -0
  39. package/lib/po-sync.module.d.ts +5 -0
  40. package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +3 -0
  41. package/lib/services/po-http-client/po-http-client.service.d.ts +3 -0
  42. package/lib/services/po-network/po-network.service.d.ts +3 -0
  43. package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +3 -0
  44. package/lib/services/po-schema/po-schema.service.d.ts +3 -0
  45. package/lib/services/po-sync/po-sync.service.d.ts +3 -0
  46. package/package.json +25 -13
  47. package/po-ui-ng-sync-6.0.0.tgz +0 -0
  48. package/po-ui-ng-sync.d.ts +1 -4
  49. package/schematics/migrations.json +5 -0
  50. package/schematics/ng-add/index.js +4 -4
  51. package/schematics/ng-add/index.js.map +1 -1
  52. package/schematics/ng-add/index.spec.js +4 -4
  53. package/schematics/ng-add/index.spec.js.map +1 -1
  54. package/schematics/ng-generate/schema/index.js +2 -2
  55. package/schematics/ng-generate/schema/index.js.map +1 -1
  56. package/schematics/ng-generate/schema/index.spec.js +3 -3
  57. package/schematics/ng-generate/schema/index.spec.js.map +1 -1
  58. package/schematics/ng-update/v2/index.js +6 -6
  59. package/schematics/ng-update/v2/index.js.map +1 -1
  60. package/schematics/ng-update/v3/index.js +1 -1
  61. package/schematics/ng-update/v3/index.js.map +1 -1
  62. package/schematics/ng-update/v4/index.js +1 -1
  63. package/schematics/ng-update/v4/index.js.map +1 -1
  64. package/schematics/ng-update/v5/index.js +1 -1
  65. package/schematics/ng-update/v5/index.js.map +1 -1
  66. package/schematics/ng-update/v6/changes.d.ts +2 -0
  67. package/schematics/ng-update/v6/changes.js +14 -0
  68. package/schematics/ng-update/v6/changes.js.map +1 -0
  69. package/schematics/ng-update/v6/index.d.ts +1 -0
  70. package/schematics/ng-update/v6/index.js +16 -0
  71. package/schematics/ng-update/v6/index.js.map +1 -0
  72. package/bundles/po-ui-ng-sync.umd.js +0 -3002
  73. package/bundles/po-ui-ng-sync.umd.js.map +0 -1
  74. package/esm2015/lib/models/po-entity/po-entity.model.js +0 -229
  75. package/esm2015/lib/models/po-query-builder/po-query-builder.model.js +0 -241
  76. package/esm2015/lib/po-sync.module.js +0 -31
  77. package/esm2015/lib/services/po-event-sourcing/po-event-sourcing.service.js +0 -411
  78. package/esm2015/lib/services/po-http-client/po-http-client.service.js +0 -147
  79. package/esm2015/lib/services/po-network/po-network.service.js +0 -58
  80. package/esm2015/lib/services/po-schema/po-schema-definition/po-schema-definition.service.js +0 -80
  81. package/esm2015/lib/services/po-schema/po-schema.service.js +0 -198
  82. package/esm2015/lib/services/po-sync/po-sync.service.js +0 -336
  83. package/esm2015/po-ui-ng-sync.js +0 -9
  84. package/fesm2015/po-ui-ng-sync.js.map +0 -1
  85. package/po-ui-ng-sync-5.22.0.tgz +0 -0
  86. package/po-ui-ng-sync.metadata.json +0 -1
@@ -0,0 +1,325 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { forkJoin, Observable, of, Subject, timer } from 'rxjs';
3
+ import { expand, map, mergeMap, reduce } from 'rxjs/operators';
4
+ import { validateParameter, validateArray } from '../../utils/utils';
5
+ import { PoDataMessage, PoEntity } from '../../models';
6
+ import { PoRequestType } from '../../models/po-request-type.enum';
7
+ import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../po-event-sourcing/po-event-sourcing.service";
10
+ import * as i2 from "../po-http-client/po-http-client.service";
11
+ import * as i3 from "../po-network/po-network.service";
12
+ import * as i4 from "./../po-schema/po-schema-definition/po-schema-definition.service";
13
+ import * as i5 from "./../po-schema/po-schema.service";
14
+ /**
15
+ * @description
16
+ *
17
+ * O `PoSyncService` é utilizado para configurar toda a base de dados que receberá as informações que serão
18
+ * armazenadas *offline* vindas do servidor. Nele ocorre toda a preparação dos modelos de dados retornados por
19
+ * cada consulta.
20
+ */
21
+ export class PoSyncService {
22
+ constructor(poEventSourcingService, poHttpClient, poNetworkService, poSchemaDefinitionService, poSchemaService) {
23
+ this.poEventSourcingService = poEventSourcingService;
24
+ this.poHttpClient = poHttpClient;
25
+ this.poNetworkService = poNetworkService;
26
+ this.poSchemaDefinitionService = poSchemaDefinitionService;
27
+ this.poSchemaService = poSchemaService;
28
+ this.models = [];
29
+ this.finishSyncSubject = new Subject();
30
+ this.isSyncEnabled = true;
31
+ this.syncing = false;
32
+ }
33
+ /**
34
+ * Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,
35
+ * as definições dos *schemas*, os registros de cada *schema* e a fila
36
+ * de eventos que estão para ser enviados ao servidor *(EventSourcing)*.
37
+ *
38
+ * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,
39
+ * recomenda-se utilizar o método `prepare()` em seguida.
40
+ *
41
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).
42
+ *
43
+ * @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.
44
+ */
45
+ async destroy() {
46
+ const destroyFunction = async () => {
47
+ await this.poSchemaService.destroySchemasRecords();
48
+ await this.poSchemaDefinitionService.destroy();
49
+ await this.poEventSourcingService.destroyEventSourcingQueue();
50
+ };
51
+ return this.poSchemaService.limitedCallWrap(destroyFunction);
52
+ }
53
+ /**
54
+ * Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).
55
+ *
56
+ * > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).
57
+ */
58
+ disableSync() {
59
+ this.isSyncEnabled = false;
60
+ if (this.timer && this.subscription) {
61
+ this.subscription.unsubscribe();
62
+ }
63
+ }
64
+ /**
65
+ * <a id="enable-sync"></a>
66
+ * Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).
67
+ *
68
+ * Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.
69
+ */
70
+ enableSync() {
71
+ this.isSyncEnabled = true;
72
+ this.createSubscribe();
73
+ }
74
+ /**
75
+ * Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que
76
+ * foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição
77
+ * deste método.
78
+ *
79
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
80
+ *
81
+ * @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.
82
+ */
83
+ getResponses() {
84
+ return this.poEventSourcingService.responsesSubject();
85
+ }
86
+ /**
87
+ * Retorna uma instância de `PoEntity` para um determinado *schema*.
88
+ *
89
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).
90
+ *
91
+ * @param {string} schemaName Nome do *schema*.
92
+ * @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.
93
+ */
94
+ getModel(schemaName) {
95
+ const model = this.models[schemaName];
96
+ if (!model) {
97
+ throw new Error('Model not found: ' + schemaName);
98
+ }
99
+ return model;
100
+ }
101
+ /**
102
+ * Insere uma requisição HTTP na fila de eventos do `po-sync`.
103
+ *
104
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).
105
+ *
106
+ * @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.
107
+ * @param {string} customRequestId Identificador customizado da requisição HTTP.
108
+ * @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.
109
+ */
110
+ insertHttpCommand(requestData, customRequestId) {
111
+ validateParameter({ requestData });
112
+ return this.poEventSourcingService.httpCommand(requestData, customRequestId);
113
+ }
114
+ /**
115
+ * Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez
116
+ * na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.
117
+ *
118
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).
119
+ *
120
+ * @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a
121
+ * carga inicial for concluída.
122
+ */
123
+ loadData() {
124
+ const loads = [];
125
+ this.schemas.forEach(el => loads.push(this.loadEntityData(el)));
126
+ return forkJoin(loads);
127
+ }
128
+ /**
129
+ * Responsável por notificar sempre que houver sincronismo.
130
+ *
131
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).
132
+ *
133
+ * @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.
134
+ */
135
+ onSync() {
136
+ if (!this.eventSub) {
137
+ this.eventSub = Observable.create(e => {
138
+ this.emitter = e;
139
+ });
140
+ }
141
+ return this.eventSub;
142
+ }
143
+ /**
144
+ * Prepara a aplicação criando os schemas e aplica as configurações.
145
+ *
146
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).
147
+ *
148
+ * @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.
149
+ * @param {PoSyncConfig} config Configurações adicionais.
150
+ * @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.
151
+ */
152
+ prepare(schemas, config) {
153
+ validateArray({ schemas });
154
+ const defaultSyncConfig = {
155
+ type: this.poNetworkService.getConnectionStatus().type,
156
+ period: 60,
157
+ dataTransform: new PoDataMessage()
158
+ };
159
+ this.schemas = schemas;
160
+ this.config = config || defaultSyncConfig;
161
+ this.config.dataTransform = this.config.dataTransform || new PoDataMessage();
162
+ this.poEventSourcingService.config = this.config;
163
+ this.startTimer(this.config.period);
164
+ this.reactiveSync();
165
+ this.poEventSourcingService.onSaveData().subscribe(() => this.sync());
166
+ return this.saveSchemas().then(() => {
167
+ this.schemas.forEach(schema => {
168
+ this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);
169
+ });
170
+ return Promise.resolve();
171
+ });
172
+ }
173
+ /**
174
+ * Remove um item da fila de eventos que espera a sincronização.
175
+ *
176
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
177
+ *
178
+ * @param {any} idEventSourcing Identificador do item da fila de eventos.
179
+ * @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.
180
+ */
181
+ removeItemOfSync(idEventSourcing) {
182
+ return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);
183
+ }
184
+ /**
185
+ * Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.
186
+ *
187
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
188
+ *
189
+ * @returns {Promise<any>} Promessa que resolve o sincronismo disparado.
190
+ */
191
+ resumeSync() {
192
+ if (!this.canSync()) {
193
+ const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {
194
+ finishSyncSubscription.unsubscribe();
195
+ return this.sync();
196
+ });
197
+ return Promise.resolve();
198
+ }
199
+ return this.sync();
200
+ }
201
+ /**
202
+ * Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.
203
+ *
204
+ * O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.
205
+ *
206
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).
207
+ *
208
+ * @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.
209
+ */
210
+ async sync() {
211
+ if (this.canSync()) {
212
+ this.startSync();
213
+ try {
214
+ await this.poEventSourcingService.syncSend();
215
+ await this.poEventSourcingService.syncGet();
216
+ if (this.emitter) {
217
+ this.emitter.next();
218
+ }
219
+ this.finishSync();
220
+ }
221
+ catch (error) {
222
+ this.syncError();
223
+ }
224
+ }
225
+ }
226
+ canSync() {
227
+ if (this.syncing || !this.isSyncEnabled) {
228
+ return false;
229
+ }
230
+ else {
231
+ const currentConnection = this.poNetworkService.getConnectionStatus();
232
+ const isConfiguredConnection = this.config && currentConnection.type === this.config.type;
233
+ const isConfigIncludesType = this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);
234
+ return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);
235
+ }
236
+ }
237
+ createSubscribe() {
238
+ if (this.timer) {
239
+ this.subscription = this.timer.subscribe(() => {
240
+ this.sync().then(() => {
241
+ this.subscription.unsubscribe();
242
+ this.subscription = null;
243
+ this.timer = null;
244
+ this.startTimer(this.config.period);
245
+ });
246
+ });
247
+ }
248
+ }
249
+ finishSync() {
250
+ this.syncing = false;
251
+ this.finishSyncSubject.next(null);
252
+ }
253
+ getOnePage(schema, page = 1) {
254
+ const params = [];
255
+ params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
256
+ params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);
257
+ const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;
258
+ return this.poHttpClient.get(url).pipe(map(response => response.body), mergeMap(responseBody => {
259
+ const now = new Date().getTime();
260
+ responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {
261
+ item.SyncInsertedDateTime = now;
262
+ item.SyncUpdatedDateTime = null;
263
+ item.SyncExclusionDateTime = null;
264
+ item.SyncDeleted = false;
265
+ item.SyncStatus = 2;
266
+ });
267
+ return this.poSchemaService
268
+ .updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])
269
+ .then(() => responseBody);
270
+ }));
271
+ }
272
+ loadEntityData(schema) {
273
+ let page = 1;
274
+ return this.getOnePage(schema, page).pipe(expand(data => {
275
+ this.config.dataTransform.transform(data);
276
+ const hasNext = this.config.dataTransform.hasNext();
277
+ if (hasNext) {
278
+ return this.getOnePage(schema, ++page);
279
+ }
280
+ else {
281
+ return of();
282
+ }
283
+ }), reduce((acc, obj) => {
284
+ acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);
285
+ return acc;
286
+ }, {
287
+ entity: schema.name,
288
+ data: []
289
+ }));
290
+ }
291
+ reactiveSync() {
292
+ this.poNetworkService.onChange().subscribe(networkStatus => {
293
+ if (networkStatus.status) {
294
+ this.startTimer(this.config.period);
295
+ return this.sync();
296
+ }
297
+ if (this.subscription) {
298
+ this.subscription.unsubscribe();
299
+ }
300
+ });
301
+ }
302
+ async saveSchemas() {
303
+ const storageSchemas = await this.poSchemaDefinitionService.getAll();
304
+ this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));
305
+ return this.poSchemaDefinitionService.saveAll(this.schemas);
306
+ }
307
+ startSync() {
308
+ this.syncing = true;
309
+ }
310
+ startTimer(period) {
311
+ if (period && this.isSyncEnabled) {
312
+ this.timer = timer(period * 1000);
313
+ this.createSubscribe();
314
+ }
315
+ }
316
+ syncError() {
317
+ this.finishSync();
318
+ }
319
+ }
320
+ PoSyncService.ɵfac = function PoSyncService_Factory(t) { return new (t || PoSyncService)(i0.ɵɵinject(i1.PoEventSourcingService), i0.ɵɵinject(i2.PoHttpClientService), i0.ɵɵinject(i3.PoNetworkService), i0.ɵɵinject(i4.PoSchemaDefinitionService), i0.ɵɵinject(i5.PoSchemaService)); };
321
+ PoSyncService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoSyncService, factory: PoSyncService.ɵfac });
322
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoSyncService, [{
323
+ type: Injectable
324
+ }], function () { return [{ type: i1.PoEventSourcingService }, { type: i2.PoHttpClientService }, { type: i3.PoNetworkService }, { type: i4.PoSchemaDefinitionService }, { type: i5.PoSchemaService }]; }, null); })();
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvcG8tc3luYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFLdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQUtsRjs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sYUFBYTtJQWF4QixZQUNVLHNCQUE4QyxFQUM5QyxZQUFpQyxFQUNqQyxnQkFBa0MsRUFDbEMseUJBQW9ELEVBQ3BELGVBQWdDO1FBSmhDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUNwRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFqQjFDLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBS3JCLHNCQUFpQixHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3ZELGtCQUFhLEdB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TSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNwQjtZQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNqQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLE1BQU0sY0FBYyxHQUF3QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxRixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFHLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQU07UUFDdkIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7MEVBNVZVLGFBQWE7bUVBQWIsYUFBYSxXQUFiLGFBQWE7dUZBQWIsYUFBYTtjQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGV4cGFuZCwgbWFwLCBtZXJnZU1hcCwgcmVkdWNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQYXJhbWV0ZXIsIHZhbGlkYXRlQXJyYXkgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5cbmltcG9ydCB7IFBvRGF0YU1lc3NhZ2UsIFBvRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UgfSBmcm9tICcuLi9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBvSHR0cENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9wby1odHRwLWNsaWVudC9wby1odHRwLWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3REYXRhIH0gZnJvbSAnLi4vcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1odHRwLXJlcXVlc3QtZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9OZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3BvLW5ldHdvcmsvcG8tbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IFBvUmVxdWVzdFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvcG8tcmVxdWVzdC10eXBlLmVudW0nO1xuaW1wb3J0IHsgUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS1kZWZpbml0aW9uL3BvLXNjaGVtYS1kZWZpbml0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9TY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9TY2hlbWFVdGlsIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLXV0aWwvcG8tc2NoZW1hLXV0aWwubW9kZWwnO1xuaW1wb3J0IHsgUG9TeW5jQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXN5bmMtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1N5bmNSZXNwb25zZSB9IGZyb20gJy4uL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1N5bmNTY2hlbWEgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBPIGBQb1N5bmNTZXJ2aWNlYCDDqSB1dGlsaXphZG8gcGFyYSBjb25maWd1cmFyIHRvZGEgYSBiYXNlIGRlIGRhZG9zIHF1ZSByZWNlYmVyw6EgYXMgaW5mb3JtYcOnw7VlcyBxdWUgc2Vyw6NvXG4gKiBhcm1hemVuYWRhcyAqb2ZmbGluZSogdmluZGFzIGRvIHNlcnZpZG9yLiBOZWxlIG9jb3JyZSB0b2RhIGEgcHJlcGFyYcOnw6NvIGRvcyBtb2RlbG9zIGRlIGRhZG9zIHJldG9ybmFkb3MgcG9yXG4gKiBjYWRhIGNvbnN1bHRhLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUG9TeW5jU2VydmljZSB7XG4gIG1vZGVsczogQXJyYXk8UG9FbnRpdHk+ID0gW107XG5cbiAgcHJpdmF0ZSBjb25maWc6IFBvU3luY0NvbmZpZztcbiAgcHJpdmF0ZSBlbWl0dGVyOiBhbnk7XG4gIHByaXZhdGUgZXZlbnRTdWI6IE9ic2VydmFibGU8YW55PjtcbiAgcHJpdmF0ZSBmaW5pc2hTeW5jU3ViamVjdDogU3ViamVjdDxudWxsPiA9IG5ldyBTdWJqZWN0PG51bGw+KCk7XG4gIHByaXZhdGUgaXNTeW5jRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgc2NoZW1hczogQXJyYXk8UG9TeW5jU2NoZW1hPjtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBzeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgdGltZXI6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBvRXZlbnRTb3VyY2luZ1NlcnZpY2U6IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb0h0dHBDbGllbnQ6IFBvSHR0cENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb05ldHdvcmtTZXJ2aWNlOiBQb05ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9TY2hlbWFEZWZpbml0aW9uU2VydmljZTogUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHBvU2NoZW1hU2VydmljZTogUG9TY2hlbWFTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogRGVzdHLDs2kgdG9kYXMgYXMgY2hhdmVzIGRvICpzdG9yYWdlKiByZWZlcmVudGVzIGFvIGBwby1zeW5jYCwgb3Ugc2VqYSxcbiAgICogYXMgZGVmaW5pw6fDtWVzIGRvcyAqc2NoZW1hcyosIG9zIHJlZ2lzdHJvcyBkZSBjYWRhICpzY2hlbWEqIGUgYSBmaWxhXG4gICAqIGRlIGV2ZW50b3MgcXVlIGVzdMOjbyBwYXJhIHNlciBlbnZpYWRvcyBhbyBzZXJ2aWRvciAqKEV2ZW50U291cmNpbmcpKi5cbiAgICpcbiAgICogPiBQYXJhIHF1ZSBuw6NvIHZlbmhhbSBvY29ycmVyIGVycm9zIGVtIGHDp8O1ZXMgcXVlIGRlcGVuZGFtIGRhcyBkZWZpbmnDp8O1ZXMgZG9zICpzY2hlbWFzKixcbiAgICogcmVjb21lbmRhLXNlIHV0aWxpemFyIG8gbcOpdG9kbyBgcHJlcGFyZSgpYCBlbSBzZWd1aWRhLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIEFsdGVyYW5kbyBhcyBkZWZpbmnDp8O1ZXMgZG9zIHNjaGVtYXNdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhcyBjaGF2ZXMgcmVmZXJlbnRlcyBhbyBgcG8tc3luY2AgZm9yZW0gZGVzdHJ1w61kYXMuXG4gICAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZGVzdHJveUZ1bmN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UuZGVzdHJveVNjaGVtYXNSZWNvcmRzKCk7XG4gICAgICBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLmRlc3Ryb3lFdmVudFNvdXJjaW5nUXVldWUoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChkZXN0cm95RnVuY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FiaWxpdGEgdG9kb3Mgb3MgdGlwb3MgZGUgc2luY3Jvbml6YcOnw6NvIGRlIGRhZG9zIChwZXJpw7NkaWNhLCByZWF0aXZhIGUgbWFudWFsKS5cbiAgICpcbiAgICogPiBQYXJhIGhhYmlsaXRhciBub3ZhbWVudGUgYSBzaW5jcm9uaXphw6fDo28gdXRpbGl6ZSBvIG3DqXRvZG8gW2BQb1N5bmNTZXJ2aWNlLmVuYWJsZVN5bmMoKWBdKGRvY3VtZW50YXRpb24vcG8tc3luYyNlbmFibGUtc3luYykuXG4gICAqL1xuICBkaXNhYmxlU3luYygpIHtcbiAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnRpbWVyICYmIHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiA8YSBpZD1cImVuYWJsZS1zeW5jXCI+PC9hPlxuICAgKiBIYWJpbGl0YSB0b2RvcyBvcyB0aXBvcyBkZSBzaW5jcm9uaXphw6fDo28gZGUgZGFkb3MgKHBlcmnDs2RpY2EsIHJlYXRpdmEgZSBtYW51YWwpLlxuICAgKlxuICAgKiBQb3IgcGFkcsOjbywgc2VtcHJlIHF1ZSBzZSBpbmljaWFsaXphIHVtYSBhcGxpY2HDp8OjbyBjb20gUE8gU3luYyBhcyBzaW5jcm9uaXphw6fDtWVzIGrDoSBlc3TDo28gaGFiaWxpdGFkYXMuXG4gICAqL1xuICBlbmFibGVTeW5jKCkge1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5jcmVhdGVTdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNw6l0b2RvIHF1ZSBkaXNwb25pYmlsaXphIGEgcGFydGlyIGRlIHN1YSBpbnNjcmnDp8OjbyBvIGV2ZW50byBkZSByZXRvcm5vIGRhcyBvcGVyYcOnw7VlcyBkYSBmaWxhIGRlIGV2ZW50b3MgcXVlXG4gICAqIGZvcmFtIGVudmlhZGFzIGFvIHNlcnZpZG9yLiBBIGNhZGEgb3BlcmHDp8OjbyBlbnZpYWRhIHBhcmEgbyBzZXJ2aWRvciwgc2Vyw6EgZGlzcGFyYWRvIHVtIGV2ZW50byBwYXJhIGEgaW5zY3Jpw6fDo29cbiAgICogZGVzdGUgbcOpdG9kby5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBDYXB0dXJhbmRvIHJlc3Bvc3RhcyBkYSBzaW5jcm9uaXphw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxQb1N5bmNSZXNwb25zZT59IE9ic2VydmFibGUgY29tIHVtIG9iamV0byBkbyB0aXBvIGBQb1N5bmNSZXNwb25zZWAuXG4gICAqL1xuICBnZXRSZXNwb25zZXMoKTogT2JzZXJ2YWJsZTxQb1N5bmNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UucmVzcG9uc2VzU3ViamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgdW1hIGluc3TDom5jaWEgZGUgYFBvRW50aXR5YCBwYXJhIHVtIGRldGVybWluYWRvICpzY2hlbWEqLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIE1hbmlwdWxhbmRvIG9zIHJlZ2lzdHJvcyBkZSB1bSBzY2hlbWFdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hTmFtZSBOb21lIGRvICpzY2hlbWEqLlxuICAgKiBAcmV0dXJucyB7UG9FbnRpdHl9IE9iamV0byBwYXJhIGVmZXR1YXIgY29uc3VsdGFzIGUgYWx0ZXJhw6fDtWVzIG5vcyBkYWRvcy5cbiAgICovXG4gIGdldE1vZGVsKHNjaGVtYU5hbWU6IHN0cmluZyk6IFBvRW50aXR5IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzW3NjaGVtYU5hbWVdO1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgbm90IGZvdW5kOiAnICsgc2NoZW1hTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcmUgdW1hIHJlcXVpc2nDp8OjbyBIVFRQIG5hIGZpbGEgZGUgZXZlbnRvcyBkbyBgcG8tc3luY2AuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gSW5zZXJpbmRvIHJlcXVpc2nDp8O1ZXMgSFRUUCBuYSBmaWxhIGRlIGV2ZW50b3NdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvSHR0cFJlcXVlc3REYXRhfSBwb0h0dHBSZXF1ZXN0RGF0YSBEYWRvcyBkYSByZXF1aXNpw6fDo28gSFRUUC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbVJlcXVlc3RJZCBJZGVudGlmaWNhZG9yIGN1c3RvbWl6YWRvIGRhIHJlcXVpc2nDp8OjbyBIVFRQLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBQcm9tZXNzYSBjb20gbyBpZGVudGlmaWNhZG9yIGRhIHJlcXVpc2nDp8OjbyBIVFRQIGNyaWFkYS5cbiAgICovXG4gIGluc2VydEh0dHBDb21tYW5kKHJlcXVlc3REYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHJlcXVlc3REYXRhIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5odHRwQ29tbWFuZChyZXF1ZXN0RGF0YSwgY3VzdG9tUmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZmV0dWEgdW1hIGNoYW1hZGEgbmEgQVBJIGRvIHNlcnZpZG9yIHBhcmEgcmVhbGl6YXIgYSBjYXJnYSBpbmljaWFsIGRvcyBkYWRvcy4gRGV2ZSBzZXIgY2hhbWFkbyBhcGVuYXMgdW1hIHZlelxuICAgKiBuYSBhcGxpY2HDp8OjbywgYXDDs3MgYSBwcmVwYXJhw6fDo28gZG9zICpzY2hlbWFzKiByZWFsaXphZGEgYXRyYXbDqXMgZG8gbcOpdG9kbyBgUG9TeW5jU2VydmljZS5wcmVwYXJlKClgLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcmdhIGluaWNpYWwgZG9zIGRhZG9zXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHJldHVybnMge09ic2VydmFibGU8QXJyYXk8eyBlbnRpdHk6IHN0cmluZywgZGF0YTogQXJyYXk8YW55PiB9Pj59IE9ic2VydmFibGUgcXVlIG5vdGlmaWNhcsOhIHF1YW5kbyBhXG4gICAqIGNhcmdhIGluaWNpYWwgZm9yIGNvbmNsdcOtZGEuXG4gICAqL1xuICBsb2FkRGF0YSgpOiBPYnNlcnZhYmxlPEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfT4+IHtcbiAgICBjb25zdCBsb2FkczogQXJyYXk8T2JzZXJ2YWJsZTx7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0+PiA9IFtdO1xuICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKGVsID0+IGxvYWRzLnB1c2godGhpcy5sb2FkRW50aXR5RGF0YShlbCkpKTtcbiAgICByZXR1cm4gZm9ya0pvaW4obG9hZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3BvbnPDoXZlbCBwb3Igbm90aWZpY2FyIHNlbXByZSBxdWUgaG91dmVyIHNpbmNyb25pc21vLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIE5vdGlmaWNhw6fDo28gcMOzcy1zaW5jcm9uaXphw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxhbnk+fSBPYnNlcnZhYmxlIHF1ZSDDqSBkaXNwYXJhZG8gYSBjYWRhIHNpbmNyb25pc21vIHJlYWxpemFkby5cbiAgICovXG4gIG9uU3luYygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICghdGhpcy5ldmVudFN1Yikge1xuICAgICAgdGhpcy5ldmVudFN1YiA9IE9ic2VydmFibGUuY3JlYXRlKGUgPT4ge1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV2ZW50U3ViO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmEgYSBhcGxpY2HDp8OjbyBjcmlhbmRvIG9zIHNjaGVtYXMgZSBhcGxpY2EgYXMgY29uZmlndXJhw6fDtWVzLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIFByZXBhcmFuZG8gYSBhcGxpY2HDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8UG9TeW5jU2NoZW1hPn0gc2NoZW1hcyBMaXN0YSBkZSAqc2NoZW1hcyogYSBzZXJlbSBwcmVwYXJhZG9zLlxuICAgKiBAcGFyYW0ge1BvU3luY0NvbmZpZ30gY29uZmlnIENvbmZpZ3VyYcOnw7VlcyBhZGljaW9uYWlzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhIGFwbGljYcOnw6NvIGVzdGl2ZXIgcHJlcGFyYWRhIHBhcmEgYSB1dGlsaXphw6fDo28gZG8gYHBvLXN5bmNgLlxuICAgKi9cbiAgcHJlcGFyZShzY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+LCBjb25maWc/OiBQb1N5bmNDb25maWcpOiBQcm9taXNlPGFueT4ge1xuICAgIHZhbGlkYXRlQXJyYXkoeyBzY2hlbWFzIH0pO1xuXG4gICAgY29uc3QgZGVmYXVsdFN5bmNDb25maWc6IFBvU3luY0NvbmZpZyA9IHtcbiAgICAgIHR5cGU6IHRoaXMucG9OZXR3b3JrU2VydmljZS5nZXRDb25uZWN0aW9uU3RhdHVzKCkudHlwZSxcbiAgICAgIHBlcmlvZDogNjAsXG4gICAgICBkYXRhVHJhbnNmb3JtOiBuZXcgUG9EYXRhTWVzc2FnZSgpXG4gICAgfTtcblxuICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWcgfHwgZGVmYXVsdFN5bmNDb25maWc7XG4gICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybSA9IHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0gfHwgbmV3IFBvRGF0YU1lc3NhZ2UoKTtcbiAgICB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy5zdGFydFRpbWVyKHRoaXMuY29uZmlnLnBlcmlvZCk7XG4gICAgdGhpcy5yZWFjdGl2ZVN5bmMoKTtcbiAgICB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uub25TYXZlRGF0YSgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN5bmMoKSk7XG5cbiAgICByZXR1cm4gdGhpcy5zYXZlU2NoZW1hcygpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5zY2hlbWFzLmZvckVhY2goc2NoZW1hID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbHNbc2NoZW1hLm5hbWVdID0gbmV3IFBvRW50aXR5KHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZSwgc2NoZW1hLCB0aGlzLnBvU2NoZW1hU2VydmljZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdW0gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3MgcXVlIGVzcGVyYSBhIHNpbmNyb25pemHDp8Ojby5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBDYXB0dXJhbmRvIHJlc3Bvc3RhcyBkYSBzaW5jcm9uaXphw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gaWRFdmVudFNvdXJjaW5nIElkZW50aWZpY2Fkb3IgZG8gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIG8gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3Mgw6kgcmVtb3ZpZG8uXG4gICAqL1xuICByZW1vdmVJdGVtT2ZTeW5jKGlkRXZlbnRTb3VyY2luZzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLnJlbW92ZUV2ZW50U291cmNpbmdJdGVtKGlkRXZlbnRTb3VyY2luZyk7XG4gIH1cblxuICAvKipcbiAgICogUmVlbnZpYSBvcyBjb21hbmRvcyBwZW5kZW50ZXMgbmEgZmlsYSAoaW5jbHVzw6NvLCBhbHRlcmHDp8OjbyBlIGV4Y2x1c8OjbykgZSBidXNjYSBub3ZvcyBkYWRvcyBkbyBzZXJ2aWRvci5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBDYXB0dXJhbmRvIHJlc3Bvc3RhcyBkYSBzaW5jcm9uaXphw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgcmVzb2x2ZSBvIHNpbmNyb25pc21vIGRpc3BhcmFkby5cbiAgICovXG4gIHJlc3VtZVN5bmMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuY2FuU3luYygpKSB7XG4gICAgICBjb25zdCBmaW5pc2hTeW5jU3Vic2NyaXB0aW9uID0gdGhpcy5maW5pc2hTeW5jU3ViamVjdC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBmaW5pc2hTeW5jU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXJhIG8gc2luY3JvbmlzbW8gZW52aWFuZG8gb3MgZXZlbnRvcyBwZW5kZW50ZXMgKGluY2x1c8OjbywgYWx0ZXJhw6fDo28gZSBleGNsdXPDo28pIGUgYnVzY2FuZG8gbm92b3MgZGFkb3MgZG8gc2Vydmlkb3IuXG4gICAqXG4gICAqIE8gc2luY3JvbmlzbW8gc29tZW50ZSBzZXLDoSBleGVjdXRhZG8gZGVwb2lzIHF1ZSBvIGFjZXNzbyBhIGJhc2UgZGUgZGFkb3MgbG9jYWwgZG8gZGlzcG9zaXRpdm8gZm9yIGxpYmVyYWRhLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIFNpbmNyb25pemHDp8OjbyBtYW51YWxdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBvIHNpbmNyb25pc21vIGZvciBmaW5hbGl6YWRvLlxuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNhblN5bmMoKSkge1xuICAgICAgdGhpcy5zdGFydFN5bmMoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLnN5bmNTZW5kKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5zeW5jR2V0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZW1pdHRlcikge1xuICAgICAgICAgIHRoaXMuZW1pdHRlci5uZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbmlzaFN5bmMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc3luY0Vycm9yKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYW5TeW5jKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN5bmNpbmcgfHwgIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50Q29ubmVjdGlvbiA9IHRoaXMucG9OZXR3b3JrU2VydmljZS5nZXRDb25uZWN0aW9uU3RhdHVzKCk7XG4gICAgICBjb25zdCBpc0NvbmZpZ3VyZWRDb25uZWN0aW9uID0gdGhpcy5jb25maWcgJiYgY3VycmVudENvbm5lY3Rpb24udHlwZSA9PT0gdGhpcy5jb25maWcudHlwZTtcbiAgICAgIGNvbnN0IGlzQ29uZmlnSW5jbHVkZXNUeXBlID1cbiAgICAgICAgdGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcudHlwZSBpbnN0YW5jZW9mIEFycmF5ICYmIHRoaXMuY29uZmlnLnR5cGUuaW5jbHVkZXMoY3VycmVudENvbm5lY3Rpb24udHlwZSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50Q29ubmVjdGlvbi5zdGF0dXMgJiYgKCF0aGlzLmNvbmZpZyB8fCBpc0NvbmZpZ3VyZWRDb25uZWN0aW9uIHx8IGlzQ29uZmlnSW5jbHVkZXNUeXBlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3luYygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcih0aGlzLmNvbmZpZy5wZXJpb2QpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoU3luYygpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmZpbmlzaFN5bmNTdWJqZWN0Lm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldE9uZVBhZ2Uoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIHBhZ2U6IG51bWJlciA9IDEpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVNpemVQYXJhbU5hbWUoKX09JHtzY2hlbWEucGFnZVNpemV9YCk7XG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlUGFyYW1OYW1lKCl9PSR7cGFnZX1gKTtcblxuICAgIGNvbnN0IHVybCA9IGAke1BvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkdFVCl9PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucG9IdHRwQ2xpZW50LmdldCh1cmwpLnBpcGUoXG4gICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYm9keSksXG4gICAgICBtZXJnZU1hcChyZXNwb25zZUJvZHkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgcmVzcG9uc2VCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGl0ZW0uU3luY0luc2VydGVkRGF0ZVRpbWUgPSBub3c7XG4gICAgICAgICAgaXRlbS5TeW5jVXBkYXRlZERhdGVUaW1lID0gbnVsbDtcbiAgICAgICAgICBpdGVtLlN5bmNFeGNsdXNpb25EYXRlVGltZSA9IG51bGw7XG4gICAgICAgICAgaXRlbS5TeW5jRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICAgIGl0ZW0uU3luY1N0YXR1cyA9IDI7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2VcbiAgICAgICAgICAudXBkYXRlQWxsKHNjaGVtYSwgcmVzcG9uc2VCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVzcG9uc2VCb2R5KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEVudGl0eURhdGEoc2NoZW1hOiBQb1N5bmNTY2hlbWEpOiBPYnNlcnZhYmxlPHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfT4ge1xuICAgIGxldCBwYWdlID0gMTtcbiAgICByZXR1cm4gdGhpcy5nZXRPbmVQYWdlKHNjaGVtYSwgcGFnZSkucGlwZShcbiAgICAgIGV4cGFuZChkYXRhID0+IHtcbiAgICAgICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS50cmFuc2Zvcm0oZGF0YSk7XG4gICAgICAgIGNvbnN0IGhhc05leHQgPSB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmhhc05leHQoKTtcbiAgICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPbmVQYWdlKHNjaGVtYSwgKytwYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb2YoKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICByZWR1Y2UoXG4gICAgICAgIChhY2MsIG9iaikgPT4ge1xuICAgICAgICAgIGFjYy5kYXRhID0gYWNjLmRhdGEuY29uY2F0KG9ialt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldEl0ZW1zRmllbGROYW1lKCldKTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZW50aXR5OiBzY2hlbWEubmFtZSxcbiAgICAgICAgICBkYXRhOiBbXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhY3RpdmVTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMucG9OZXR3b3JrU2VydmljZS5vbkNoYW5nZSgpLnN1YnNjcmliZShuZXR3b3JrU3RhdHVzID0+IHtcbiAgICAgIGlmIChuZXR3b3JrU3RhdHVzLnN0YXR1cykge1xuICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVNjaGVtYXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdG9yYWdlU2NoZW1hczogQXJyYXk8UG9TeW5jU2NoZW1hPiA9IGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5nZXRBbGwoKTtcbiAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaChzY2hlbWEgPT4gKHNjaGVtYS5sYXN0U3luYyA9IFBvU2NoZW1hVXRpbC5nZXRMYXN0U3luYyhzdG9yYWdlU2NoZW1hcywgc2NoZW1hLm5hbWUpKSk7XG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5zYXZlQWxsKHRoaXMuc2NoZW1hcyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0U3luYygpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNpbmcgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFRpbWVyKHBlcmlvZCk6IHZvaWQge1xuICAgIGlmIChwZXJpb2QgJiYgdGhpcy5pc1N5bmNFbmFibGVkKSB7XG4gICAgICB0aGlzLnRpbWVyID0gdGltZXIocGVyaW9kICogMTAwMCk7XG4gICAgICB0aGlzLmNyZWF0ZVN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0Vycm9yKCk6IHZvaWQge1xuICAgIHRoaXMuZmluaXNoU3luYygpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tdWktbmctc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL3BvLXVpLW5nLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==