@po-ui/ng-sync 14.0.0 → 14.1.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 (116) hide show
  1. package/README.md +22 -22
  2. package/esm2020/lib/index.mjs +15 -15
  3. package/esm2020/lib/models/index.mjs +6 -6
  4. package/esm2020/lib/models/po-data-message.model.mjs +57 -57
  5. package/esm2020/lib/models/po-data-transform.model.mjs +22 -22
  6. package/esm2020/lib/models/po-entity/po-entity.model.mjs +214 -214
  7. package/esm2020/lib/models/po-event-sourcing-error-response.model.mjs +17 -17
  8. package/esm2020/lib/models/po-network-status.model.mjs +44 -44
  9. package/esm2020/lib/models/po-network-type.enum.mjs +30 -30
  10. package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +238 -238
  11. package/esm2020/lib/models/po-request-type.enum.mjs +16 -16
  12. package/esm2020/lib/po-sync.module.mjs +45 -45
  13. package/esm2020/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs +17 -17
  14. package/esm2020/lib/services/po-event-sourcing/index.mjs +4 -4
  15. package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +2 -2
  16. package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +2 -2
  17. package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +372 -372
  18. package/esm2020/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs +11 -11
  19. package/esm2020/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +2 -2
  20. package/esm2020/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +2 -2
  21. package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +148 -148
  22. package/esm2020/lib/services/po-http-client/po-http-request-type.enum.mjs +25 -25
  23. package/esm2020/lib/services/po-network/po-network.service.mjs +58 -58
  24. package/esm2020/lib/services/po-schema/index.mjs +4 -4
  25. package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +77 -77
  26. package/esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +124 -124
  27. package/esm2020/lib/services/po-schema/po-schema.service.mjs +174 -174
  28. package/esm2020/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +2 -2
  29. package/esm2020/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +2 -2
  30. package/esm2020/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +2 -2
  31. package/esm2020/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +2 -2
  32. package/esm2020/lib/services/po-sync/po-sync.service.mjs +325 -325
  33. package/esm2020/lib/utils/utils.mjs +63 -63
  34. package/esm2020/po-ui-ng-sync.mjs +4 -4
  35. package/esm2020/public-api.mjs +2 -2
  36. package/fesm2015/po-ui-ng-sync.mjs +2060 -2060
  37. package/fesm2015/po-ui-ng-sync.mjs.map +1 -1
  38. package/fesm2020/po-ui-ng-sync.mjs +1965 -1965
  39. package/fesm2020/po-ui-ng-sync.mjs.map +1 -1
  40. package/index.d.ts +5 -5
  41. package/lib/index.d.ts +14 -14
  42. package/lib/models/index.d.ts +5 -5
  43. package/lib/models/po-data-message.model.d.ts +46 -46
  44. package/lib/models/po-data-transform.model.d.ts +52 -52
  45. package/lib/models/po-entity/po-entity.model.d.ts +122 -122
  46. package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
  47. package/lib/models/po-network-status.model.d.ts +25 -25
  48. package/lib/models/po-network-type.enum.d.ts +28 -28
  49. package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
  50. package/lib/models/po-request-type.enum.d.ts +14 -14
  51. package/lib/po-sync.module.d.ts +12 -12
  52. package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
  53. package/lib/services/po-event-sourcing/index.d.ts +3 -3
  54. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
  55. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
  56. package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +74 -74
  57. package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
  58. package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
  59. package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
  60. package/lib/services/po-http-client/po-http-client.service.d.ts +78 -78
  61. package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
  62. package/lib/services/po-network/po-network.service.d.ts +36 -36
  63. package/lib/services/po-schema/index.d.ts +3 -3
  64. package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +51 -51
  65. package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
  66. package/lib/services/po-schema/po-schema.service.d.ts +98 -98
  67. package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
  68. package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
  69. package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
  70. package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
  71. package/lib/services/po-sync/po-sync.service.d.ts +162 -162
  72. package/lib/utils/utils.d.ts +36 -36
  73. package/package.json +4 -4
  74. package/po-ui-ng-sync-14.1.0.tgz +0 -0
  75. package/public-api.d.ts +1 -1
  76. package/schematics/README.md +169 -169
  77. package/schematics/collection.json +15 -15
  78. package/schematics/migrations.json +35 -35
  79. package/schematics/ng-add/index.d.ts +7 -7
  80. package/schematics/ng-add/index.js +33 -33
  81. package/schematics/ng-add/index.spec.d.ts +1 -1
  82. package/schematics/ng-add/index.spec.js +62 -62
  83. package/schematics/ng-add/schema.json +16 -16
  84. package/schematics/ng-generate/schema/files/__path__/__name@dasherize__/__name@dasherize__.constants.ts.template +13 -13
  85. package/schematics/ng-generate/schema/index.d.ts +4 -4
  86. package/schematics/ng-generate/schema/index.js +12 -12
  87. package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
  88. package/schematics/ng-generate/schema/index.spec.js +44 -44
  89. package/schematics/ng-generate/schema/schema.d.ts +3 -3
  90. package/schematics/ng-generate/schema/schema.js +2 -2
  91. package/schematics/ng-generate/schema/schema.json +31 -31
  92. package/schematics/ng-update/v14/changes.d.ts +2 -2
  93. package/schematics/ng-update/v14/changes.js +13 -13
  94. package/schematics/ng-update/v14/index.d.ts +1 -1
  95. package/schematics/ng-update/v14/index.js +15 -15
  96. package/schematics/ng-update/v2/changes.d.ts +8 -8
  97. package/schematics/ng-update/v2/changes.js +20 -20
  98. package/schematics/ng-update/v2/index.d.ts +5 -5
  99. package/schematics/ng-update/v2/index.js +101 -101
  100. package/schematics/ng-update/v3/changes.d.ts +2 -2
  101. package/schematics/ng-update/v3/changes.js +14 -14
  102. package/schematics/ng-update/v3/index.d.ts +1 -1
  103. package/schematics/ng-update/v3/index.js +16 -16
  104. package/schematics/ng-update/v4/changes.d.ts +2 -2
  105. package/schematics/ng-update/v4/changes.js +14 -14
  106. package/schematics/ng-update/v4/index.d.ts +1 -1
  107. package/schematics/ng-update/v4/index.js +15 -15
  108. package/schematics/ng-update/v5/changes.d.ts +2 -2
  109. package/schematics/ng-update/v5/changes.js +13 -13
  110. package/schematics/ng-update/v5/index.d.ts +1 -1
  111. package/schematics/ng-update/v5/index.js +15 -15
  112. package/schematics/ng-update/v6/changes.d.ts +2 -2
  113. package/schematics/ng-update/v6/changes.js +13 -13
  114. package/schematics/ng-update/v6/index.d.ts +1 -1
  115. package/schematics/ng-update/v6/index.js +15 -15
  116. package/po-ui-ng-sync-14.0.0.tgz +0 -0
@@ -1,372 +1,372 @@
1
- import { Injectable } from '@angular/core';
2
- import { StatusCodes } from 'http-status-codes';
3
- import { Observable, of, Subject } from 'rxjs';
4
- import { expand, map, reduce } from 'rxjs/operators';
5
- import { toBase64, toFile } from '../../utils/utils';
6
- import { PoEventSourcingErrorResponse } from '../../models/po-event-sourcing-error-response.model';
7
- import { PoEventSourcingOperation } from './enums/po-event-sourcing-operation.enum';
8
- import { PoHttpRequestType } from '../po-http-client/po-http-request-type.enum';
9
- import { PoRequestType } from '../../models/po-request-type.enum';
10
- import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "./../po-schema/po-schema-definition/po-schema-definition.service";
13
- import * as i2 from "./../po-schema/po-schema.service";
14
- import * as i3 from "@po-ui/ng-storage";
15
- import * as i4 from "./../po-http-client/po-http-client.service";
16
- export class PoEventSourcingService {
17
- constructor(poSchemaDefinition, poSchemaService, poStorage, poHttpClient) {
18
- this.poSchemaDefinition = poSchemaDefinition;
19
- this.poSchemaService = poSchemaService;
20
- this.poStorage = poStorage;
21
- this.poHttpClient = poHttpClient;
22
- this.stoppedQueueEventSourcing = false;
23
- this.responseSubject = new Subject();
24
- this.schemasSyncConfig = {};
25
- }
26
- static getUrl(eventSourcingItem, schema, requestType) {
27
- const schemaUrl = PoSchemaUtil.getUrl(schema, requestType);
28
- const schemaId = eventSourcingItem.record[schema.idField];
29
- if (requestType === PoRequestType.GET) {
30
- return schemaUrl;
31
- }
32
- if ([PoRequestType.DELETE, PoRequestType.PATCH].includes(requestType)) {
33
- return schemaUrl ? `${schemaUrl}/${schemaId}` : `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}/${schemaId}`;
34
- }
35
- if (requestType === PoRequestType.POST) {
36
- return schemaUrl ? schemaUrl : PoSchemaUtil.getUrl(schema, PoRequestType.GET);
37
- }
38
- }
39
- create(schemaName, newItem, customRequestId) {
40
- const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Insert, newItem, schemaName, customRequestId);
41
- return this.insertEventSourcingQueue(eventSourcingItem);
42
- }
43
- async createBatchEvents(schemaName, eventList) {
44
- const eventSourcingList = this.createEventSourcingList(schemaName, eventList);
45
- await this.poStorage.appendArrayToArray(PoEventSourcingService.event_sourcing_name, eventSourcingList);
46
- this.notifyEventCreation();
47
- }
48
- /**
49
- * Destrói a chave do *storage* que contém a fila de dados que estão esperando para serem enviados ao
50
- * servidor *(EventSourcing)*.
51
- *
52
- * @returns {Promise<void>} Promessa que é resolvida quando a chave referente a fila de *EventSourcing* for destruída.
53
- */
54
- destroyEventSourcingQueue() {
55
- return this.poStorage.remove(PoEventSourcingService.event_sourcing_name);
56
- }
57
- async httpCommand(httpOperationData, customRequestId) {
58
- httpOperationData = await this.serializeBody(httpOperationData);
59
- const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Http, httpOperationData, undefined, customRequestId);
60
- await this.insertEventSourcingQueue(eventSourcingItem);
61
- return eventSourcingItem.id;
62
- }
63
- responsesSubject() {
64
- return this.responseSubject.asObservable();
65
- }
66
- onSaveData() {
67
- if (!this.eventSub) {
68
- this.eventSub = Observable.create(subscriber => (this.emitter = subscriber));
69
- }
70
- return this.eventSub;
71
- }
72
- remove(schemaName, itemToDelete, customRequestId) {
73
- const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Delete, itemToDelete, schemaName, customRequestId);
74
- return this.insertEventSourcingQueue(eventSourcingItem);
75
- }
76
- removeEventSourcingItem(idEventSourcingItem) {
77
- return this.poStorage.removeItemFromArray(PoEventSourcingService.event_sourcing_name, 'id', idEventSourcingItem);
78
- }
79
- syncGet() {
80
- const syncGetFunction = async () => this.poSchemaDefinition.getAll().then(schemas => {
81
- const schemaPromises = this.updateStorageSchemas(schemas);
82
- return Promise.all(schemaPromises);
83
- });
84
- return this.poSchemaService.limitedCallWrap(syncGetFunction);
85
- }
86
- async syncSend() {
87
- const syncSendFunction = async () => {
88
- const itemOfQueue = await this.poStorage.getFirstItem(PoEventSourcingService.event_sourcing_name);
89
- if (itemOfQueue) {
90
- await this.selectOperation(itemOfQueue);
91
- }
92
- if (this.stoppedQueueEventSourcing || !itemOfQueue) {
93
- this.stoppedQueueEventSourcing = false;
94
- return Promise.resolve();
95
- }
96
- return syncSendFunction();
97
- };
98
- return this.poSchemaService.limitedCallWrap(syncSendFunction);
99
- }
100
- update(schemaName, itemUpdated, customRequestId) {
101
- const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Update, itemUpdated, schemaName, customRequestId);
102
- return this.insertEventSourcingQueue(eventSourcingItem);
103
- }
104
- /* Avalia se o body é do tipo File e se for converte para base64 */
105
- async serializeBody(requestData) {
106
- let { body, mimeType, bodyType, fileName } = requestData;
107
- if (body instanceof File) {
108
- bodyType = 'File';
109
- mimeType = body.type;
110
- fileName = body.name;
111
- body = await toBase64(body);
112
- }
113
- return { ...requestData, body, mimeType, bodyType, fileName };
114
- }
115
- buildUrlParams(schema, baseUrl, pageNumber) {
116
- const params = [];
117
- params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
118
- params.push(`${this.config.dataTransform.getPageParamName()}=${pageNumber}`);
119
- return `${baseUrl}?${params.join('&')}`;
120
- }
121
- checkRecordIdExists(recordId, operation) {
122
- if (!recordId) {
123
- const error = {
124
- message: 'Identifier not defined',
125
- operation: operation
126
- };
127
- throw new PoEventSourcingErrorResponse(error);
128
- }
129
- }
130
- concatPageItems(pageAcumulator, requestBody) {
131
- if (requestBody[this.config.dataTransform.getItemsFieldName()]) {
132
- pageAcumulator.data = [...pageAcumulator.data, ...requestBody[this.config.dataTransform.getItemsFieldName()]];
133
- }
134
- return pageAcumulator;
135
- }
136
- createEventSourcingItem(operation, newItem, schemaName, customRequestId, id) {
137
- if (!schemaName && operation !== PoEventSourcingOperation.Http) {
138
- throw new Error('PoSyncSchema is not defined.');
139
- }
140
- return {
141
- id: id ? id : new Date().getTime(),
142
- dateTime: new Date().getTime(),
143
- schema: schemaName,
144
- operation: operation,
145
- record: newItem,
146
- customRequestId: customRequestId
147
- };
148
- }
149
- createEventSourcingList(schemaName, eventList) {
150
- return eventList.map((eventItem, index) => {
151
- const id = new Date().getTime() + index;
152
- return this.createEventSourcingItem(eventItem.operation, eventItem.record, schemaName, eventItem.customRequestId, id);
153
- });
154
- }
155
- createSchemaSyncConfig(schemaName) {
156
- this.schemasSyncConfig[schemaName] = {
157
- page: undefined,
158
- currentUrlDiff: undefined,
159
- responseDate: undefined
160
- };
161
- }
162
- async deleteOperation(eventSourcingItem) {
163
- try {
164
- const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);
165
- const recordId = eventSourcingItem.record[schema.idField];
166
- this.checkRecordIdExists(recordId, PoEventSourcingOperation.Delete);
167
- const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.DELETE);
168
- const response = await this.sendServerItem(url, PoHttpRequestType.DELETE);
169
- await this.removeEventSourcingValidItem(response.status, eventSourcingItem);
170
- return await this.sendResponseSubject(eventSourcingItem, response);
171
- }
172
- catch (errorResponse) {
173
- return this.sendResponseSubject(eventSourcingItem, errorResponse, true);
174
- }
175
- }
176
- diffServerItems(currentUrlDiff) {
177
- return this.poHttpClient.get(currentUrlDiff);
178
- }
179
- getBodyAndDate(schemaName, response) {
180
- const getDateFieldName = this.config.dataTransform.getDateFieldName();
181
- const responseSyncDate = response.body[getDateFieldName];
182
- this.schemasSyncConfig[schemaName]['responseDate'] = responseSyncDate;
183
- return response.body;
184
- }
185
- async getServerDiffRecords(schema, baseUrl) {
186
- const initialAcumulatorPage = { entity: schema.name, data: [] };
187
- const diffUrl = this.schemasSyncConfig[schema.name]['currentUrlDiff'];
188
- const serverResponse = await this.diffServerItems(diffUrl)
189
- .pipe(map(response => this.getBodyAndDate(schema.name, response)), expand(data => this.paginateSchemaData(data, schema, baseUrl)), reduce((pageAcumulator, requestBody) => this.concatPageItems(pageAcumulator, requestBody), initialAcumulatorPage))
190
- .toPromise();
191
- return serverResponse.data;
192
- }
193
- async httpOperation(eventSourcingItem) {
194
- try {
195
- const requestData = await this.createPoHttpRequestData(eventSourcingItem.record.url, eventSourcingItem.record.method, eventSourcingItem.record, eventSourcingItem.record.headers);
196
- const response = await this.poHttpClient.createRequest(requestData).toPromise();
197
- const poHttpCommandResponse = {
198
- id: eventSourcingItem.id,
199
- customRequestId: eventSourcingItem.customRequestId,
200
- request: eventSourcingItem.record,
201
- response: response
202
- };
203
- this.responseSubject.next(poHttpCommandResponse);
204
- return this.removeEventSourcingValidItem(response.status, eventSourcingItem);
205
- }
206
- catch (errorHttpClient) {
207
- return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);
208
- }
209
- }
210
- async insertEventSourcingQueue(eventSourcingItem) {
211
- const eventSourcingUpdatedQueue = await this.poStorage.appendItemToArray(PoEventSourcingService.event_sourcing_name, eventSourcingItem);
212
- this.notifyEventCreation();
213
- return Promise.resolve(eventSourcingUpdatedQueue);
214
- }
215
- async insertOperation(currentEventSourcingItem) {
216
- const schema = await this.poSchemaDefinition.get(currentEventSourcingItem.schema);
217
- const url = PoEventSourcingService.getUrl(currentEventSourcingItem, schema, PoRequestType.POST);
218
- try {
219
- const response = await this.sendServerItem(url, PoHttpRequestType.POST, currentEventSourcingItem.record);
220
- const recordUpdatedByServer = response.body;
221
- await this.removeEventSourcingValidItem(response.status, currentEventSourcingItem);
222
- const id = currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];
223
- await this.poSchemaService.update(schema, recordUpdatedByServer, id);
224
- const eventSourcingItems = await this.poStorage.get(PoEventSourcingService.event_sourcing_name);
225
- await this.updatePendingEventSourcing(currentEventSourcingItem, schema.idField, recordUpdatedByServer, eventSourcingItems);
226
- return this.sendResponseSubject(currentEventSourcingItem, response);
227
- }
228
- catch (errorHttpClient) {
229
- return this.sendResponseSubject(currentEventSourcingItem, errorHttpClient, true);
230
- }
231
- }
232
- isValidStatus(status) {
233
- return PoEventSourcingService.VALID_HTTP_STATUS_CODES.includes(status);
234
- }
235
- notifyEventCreation() {
236
- if (this.emitter) {
237
- this.emitter.next();
238
- }
239
- }
240
- paginateSchemaData(data, schema, baseUrl) {
241
- this.config.dataTransform.transform(data);
242
- if (this.config.dataTransform.hasNext()) {
243
- this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(schema, baseUrl, ++this.schemasSyncConfig[schema.name]['page']);
244
- return this.diffServerItems(this.schemasSyncConfig[schema.name]['currentUrlDiff']).pipe(map(response => this.getBodyAndDate(schema.name, response)));
245
- }
246
- return of();
247
- }
248
- removeEventSourcingValidItem(status, eventSourcingItem) {
249
- if (this.isValidStatus(status) || eventSourcingItem.operation === PoEventSourcingOperation.Http) {
250
- return this.removeEventSourcingItem(eventSourcingItem.id);
251
- }
252
- }
253
- selectOperation(eventSourcingItem) {
254
- switch (eventSourcingItem.operation) {
255
- case PoEventSourcingOperation.Insert:
256
- return this.insertOperation(eventSourcingItem);
257
- case PoEventSourcingOperation.Update:
258
- return this.updateOperation(eventSourcingItem);
259
- case PoEventSourcingOperation.Delete:
260
- return this.deleteOperation(eventSourcingItem);
261
- case PoEventSourcingOperation.Http:
262
- return this.httpOperation(eventSourcingItem);
263
- }
264
- }
265
- sendResponseSubject(eventSourcingItem, response, isSubjectError = false) {
266
- const poSyncResponse = {
267
- id: eventSourcingItem.id,
268
- customRequestId: eventSourcingItem.customRequestId,
269
- request: eventSourcingItem.record,
270
- response: response
271
- };
272
- this.stoppedQueueEventSourcing = isSubjectError;
273
- this.responseSubject.next(poSyncResponse);
274
- return Promise.resolve();
275
- }
276
- async sendServerItem(url, method, body) {
277
- const requestData = await this.createPoHttpRequestData(url, method, body);
278
- return this.poHttpClient.createRequest(requestData).toPromise();
279
- }
280
- async createPoHttpRequestData(url, method, record, headers) {
281
- let body = record.body ?? record;
282
- if (record.bodyType === 'File') {
283
- body = await this.createFormData(body, record.fileName, record.mimeType, record.formField);
284
- }
285
- return { url, method, body, headers };
286
- }
287
- async createFormData(body, fileName, mimeType, formField = 'file') {
288
- const file = await toFile(body, fileName, mimeType);
289
- const formData = new FormData();
290
- formData.append(formField, file, fileName);
291
- return formData;
292
- }
293
- async updateOperation(eventSourcingItem) {
294
- const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);
295
- const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.PATCH);
296
- try {
297
- const recordId = eventSourcingItem.record[schema.idField];
298
- this.checkRecordIdExists(recordId, PoEventSourcingOperation.Update);
299
- const response = await this.sendServerItem(url, PoHttpRequestType.PUT, eventSourcingItem.record);
300
- await this.removeEventSourcingValidItem(response.status, eventSourcingItem);
301
- return await this.sendResponseSubject(eventSourcingItem, response);
302
- }
303
- catch (errorHttpClient) {
304
- return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);
305
- }
306
- }
307
- updatePendingEventSourcing(currentEventSourcingItem, idFieldSchema, inserted, eventSourcingItems) {
308
- if (currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName]) {
309
- eventSourcingItems.forEach((eventSourcingItem, position) => {
310
- const isCurrentEventSourcingItem = !eventSourcingItem.record[idFieldSchema] &&
311
- eventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName] ===
312
- currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];
313
- if (isCurrentEventSourcingItem) {
314
- eventSourcingItems[position].record[idFieldSchema] = inserted[idFieldSchema];
315
- }
316
- });
317
- return this.poStorage.set(PoEventSourcingService.event_sourcing_name, eventSourcingItems);
318
- }
319
- else {
320
- return Promise.resolve();
321
- }
322
- }
323
- async updateRecords(serverRecords, schema) {
324
- for (const serverRecord of serverRecords) {
325
- await this.updateRecordByServerRecord(serverRecord, schema);
326
- }
327
- }
328
- async updateRecordByServerRecord(serverRecord, schema) {
329
- const recordId = serverRecord[schema.idField];
330
- const storageRecord = await this.poSchemaService.get(schema.name, recordId);
331
- const existsStorageRecord = !!Object.keys(storageRecord).length;
332
- if (existsStorageRecord && serverRecord[schema.deletedField]) {
333
- return await this.poSchemaService.remove(schema.name, serverRecord[schema.idField]);
334
- }
335
- if (existsStorageRecord && !serverRecord[schema.deletedField]) {
336
- return await this.poSchemaService.update(schema, serverRecord);
337
- }
338
- if (!existsStorageRecord && !serverRecord[schema.deletedField]) {
339
- return await this.poSchemaService.create(schema, serverRecord);
340
- }
341
- }
342
- async updateStorageBySchema(schema) {
343
- this.createSchemaSyncConfig(schema.name);
344
- this.schemasSyncConfig[schema.name]['page'] = 1;
345
- const baseUrl = `${PoSchemaUtil.getUrl(schema, PoRequestType.DIFF)}/${schema.lastSync}`;
346
- this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(schema, baseUrl, this.schemasSyncConfig[schema.name]['page']);
347
- const serverRecords = await this.getServerDiffRecords(schema, baseUrl);
348
- await this.updateRecords(serverRecords, schema);
349
- schema.lastSync = this.schemasSyncConfig[schema.name]['responseDate'];
350
- await this.poSchemaDefinition.update(schema);
351
- }
352
- updateStorageSchemas(schemas) {
353
- return schemas.map((schema) => this.updateStorageBySchema(schema));
354
- }
355
- }
356
- PoEventSourcingService.event_sourcing_name = 'EventSourcing';
357
- PoEventSourcingService.VALID_HTTP_STATUS_CODES = [
358
- StatusCodes.OK,
359
- StatusCodes.CREATED,
360
- StatusCodes.ACCEPTED,
361
- StatusCodes.NON_AUTHORITATIVE_INFORMATION,
362
- StatusCodes.NO_CONTENT,
363
- StatusCodes.RESET_CONTENT,
364
- StatusCodes.PARTIAL_CONTENT,
365
- StatusCodes.MULTI_STATUS // 207
366
- ];
367
- PoEventSourcingService.ɵfac = function PoEventSourcingService_Factory(t) { return new (t || PoEventSourcingService)(i0.ɵɵinject(i1.PoSchemaDefinitionService), i0.ɵɵinject(i2.PoSchemaService), i0.ɵɵinject(i3.PoStorageService), i0.ɵɵinject(i4.PoHttpClientService)); };
368
- PoEventSourcingService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoEventSourcingService, factory: PoEventSourcingService.ɵfac });
369
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoEventSourcingService, [{
370
- type: Injectable
371
- }], function () { return [{ type: i1.PoSchemaDefinitionService }, { type: i2.PoSchemaService }, { type: i3.PoStorageService }, { type: i4.PoHttpClientService }]; }, null); })();
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZXZlbnQtc291cmNpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBRW5HLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBS3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7OztBQU1sRixNQUFNLE9BQU8sc0JBQXNCO0lBdUJqQyxZQUNVLGtCQUE2QyxFQUM3QyxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixZQUFpQztRQUhqQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTJCO1FBQzdDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFaM0MsOEJBQXlCLEdBQVksS0FB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TSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDOztBQTloQmUsMENBQW1CLEdBQVcsZUFBZ0IsQ0FBQTtBQUV0Qyw4Q0FBdUIsR0FBRztJQUNoRCxXQUFXLENBQUMsRUFBRTtJQUNkLFdBQVcsQ0FBQyxPQUFPO0lBQ25CLFdBQVcsQ0FBQyxRQUFRO0lBQ3BCLFdBQVcsQ0FBQyw2QkFBNkI7SUFDekMsV0FBVyxDQUFDLFVBQVU7SUFDdEIsV0FBVyxDQUFDLGFBQWE7SUFDekIsV0FBVyxDQUFDLGVBQWU7SUFDM0IsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNO0NBQy9CLENBQUE7NEZBWlMsc0JBQXNCOzRFQUF0QixzQkFBc0IsV0FBdEIsc0JBQXNCO3VGQUF0QixzQkFBc0I7Y0FEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBSZXNwb25zZSwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IFN0YXR1c0NvZGVzIH0gZnJvbSAnaHR0cC1zdGF0dXMtY29kZXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBleHBhbmQsIG1hcCwgcmVkdWNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgUG9TdG9yYWdlU2VydmljZSB9IGZyb20gJ0Bwby11aS9uZy1zdG9yYWdlJztcclxuXHJcbmltcG9ydCB7IHRvQmFzZTY0LCB0b0ZpbGUgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvLWV2ZW50LXNvdXJjaW5nLWVycm9yLXJlc3BvbnNlLm1vZGVsJztcclxuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nSXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1ldmVudC1zb3VyY2luZy1pdGVtLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbiB9IGZyb20gJy4vZW51bXMvcG8tZXZlbnQtc291cmNpbmctb3BlcmF0aW9uLmVudW0nO1xyXG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1ldmVudC1zb3VyY2luZy1zdW1tYXJ5LWl0ZW0uaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9IdHRwSGVhZGVyT3B0aW9uIH0gZnJvbSAnLi8uLi9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb0h0dHBDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1odHRwLWNsaWVudC9wby1odHRwLWNsaWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9IdHRwUmVxdWVzdERhdGEgfSBmcm9tICcuLi9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtcmVxdWVzdC1kYXRhLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3RUeXBlIH0gZnJvbSAnLi4vcG8taHR0cC1jbGllbnQvcG8taHR0cC1yZXF1ZXN0LXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IFBvUmVxdWVzdFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvcG8tcmVxdWVzdC10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLWRlZmluaXRpb24vcG8tc2NoZW1hLWRlZmluaXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFBvU2NoZW1hU2VydmljZSB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9TY2hlbWFVdGlsIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLXV0aWwvcG8tc2NoZW1hLXV0aWwubW9kZWwnO1xyXG5pbXBvcnQgeyBQb1N5bmNDb25maWcgfSBmcm9tICcuLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1jb25maWcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9TeW5jUmVzcG9uc2UgfSBmcm9tICcuLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1yZXNwb25zZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1N5bmNTY2hlbWEgfSBmcm9tICcuLy4uL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUG9FdmVudFNvdXJjaW5nU2VydmljZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IGV2ZW50X3NvdXJjaW5nX25hbWU6IHN0cmluZyA9ICdFdmVudFNvdXJjaW5nJztcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVkFMSURfSFRUUF9TVEFUVVNfQ09ERVMgPSBbXHJcbiAgICBTdGF0dXNDb2Rlcy5PSywgLy8gMjAwXHJcbiAgICBTdGF0dXNDb2Rlcy5DUkVBVEVELCAvLyAyMDFcclxuICAgIFN0YXR1c0NvZGVzLkFDQ0VQVEVELCAvLyAyMDJcclxuICAgIFN0YXR1c0NvZGVzLk5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OLCAvLyAyMDNcclxuICAgIFN0YXR1c0NvZGVzLk5PX0NPTlRFTlQsIC8vIDIwNFxyXG4gICAgU3RhdHVzQ29kZXMuUkVTRVRfQ09OVEVOVCwgLy8gMjA1XHJcbiAgICBTdGF0dXNDb2Rlcy5QQVJUSUFMX0NPTlRFTlQsIC8vIDIwNlxyXG4gICAgU3RhdHVzQ29kZXMuTVVMVElfU1RBVFVTIC8vIDIwN1xyXG4gIF07XHJcblxyXG4gIGNvbmZpZzogUG9TeW5jQ29uZmlnO1xyXG4gIHN0b3BwZWRRdWV1ZUV2ZW50U291cmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBlbWl0dGVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBldmVudFN1YjogT2JzZXJ2YWJsZTxudWxsPjtcclxuICBwcml2YXRlIHJlc3BvbnNlU3ViamVjdCA9IG5ldyBTdWJqZWN0PFBvU3luY1Jlc3BvbnNlPigpO1xyXG5cclxuICBwcml2YXRlIHNjaGVtYXNTeW5jQ29uZmlnID0ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBwb1NjaGVtYURlZmluaXRpb246IFBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvU2NoZW1hU2VydmljZTogUG9TY2hlbWFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb1N0b3JhZ2U6IFBvU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvSHR0cENsaWVudDogUG9IdHRwQ2xpZW50U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0VXJsKGV2ZW50U291cmNpbmdJdGVtLCBzY2hlbWEsIHJlcXVlc3RUeXBlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNjaGVtYVVybCA9IFBvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCByZXF1ZXN0VHlwZSk7XHJcbiAgICBjb25zdCBzY2hlbWFJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XHJcblxyXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBQb1JlcXVlc3RUeXBlLkdFVCkge1xyXG4gICAgICByZXR1cm4gc2NoZW1hVXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChbUG9SZXF1ZXN0VHlwZS5ERUxFVEUsIFBvUmVxdWVzdFR5cGUuUEFUQ0hdLmluY2x1ZGVzKHJlcXVlc3RUeXBlKSkge1xyXG4gICAgICByZXR1cm4gc2NoZW1hVXJsID8gYCR7c2NoZW1hVXJsfS8ke3NjaGVtYUlkfWAgOiBgJHtQb1NjaGVtYVV0aWwuZ2V0VXJsKHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5HRVQpfS8ke3NjaGVtYUlkfWA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBQb1JlcXVlc3RUeXBlLlBPU1QpIHtcclxuICAgICAgcmV0dXJuIHNjaGVtYVVybCA/IHNjaGVtYVVybCA6IFBvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkdFVCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGUoc2NoZW1hTmFtZTogc3RyaW5nLCBuZXdJdGVtOiBhbnksIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXHJcbiAgICAgIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5JbnNlcnQsXHJcbiAgICAgIG5ld0l0ZW0sXHJcbiAgICAgIHNjaGVtYU5hbWUsXHJcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVCYXRjaEV2ZW50cyhzY2hlbWFOYW1lOiBzdHJpbmcsIGV2ZW50TGlzdDogQXJyYXk8UG9FdmVudFNvdXJjaW5nU3VtbWFyeUl0ZW0+KSB7XHJcbiAgICBjb25zdCBldmVudFNvdXJjaW5nTGlzdCA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0xpc3Qoc2NoZW1hTmFtZSwgZXZlbnRMaXN0KTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnBvU3RvcmFnZS5hcHBlbmRBcnJheVRvQXJyYXkoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lLCBldmVudFNvdXJjaW5nTGlzdCk7XHJcblxyXG4gICAgdGhpcy5ub3RpZnlFdmVudENyZWF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXN0csOzaSBhIGNoYXZlIGRvICpzdG9yYWdlKiBxdWUgY29udMOpbSBhIGZpbGEgZGUgZGFkb3MgcXVlIGVzdMOjbyBlc3BlcmFuZG8gcGFyYSBzZXJlbSBlbnZpYWRvcyBhb1xyXG4gICAqIHNlcnZpZG9yICooRXZlbnRTb3VyY2luZykqLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGEgY2hhdmUgcmVmZXJlbnRlIGEgZmlsYSBkZSAqRXZlbnRTb3VyY2luZyogZm9yIGRlc3RydcOtZGEuXHJcbiAgICovXHJcbiAgZGVzdHJveUV2ZW50U291cmNpbmdRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnBvU3RvcmFnZS5yZW1vdmUoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGh0dHBDb21tYW5kKGh0dHBPcGVyYXRpb25EYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGh0dHBPcGVyYXRpb25EYXRhID0gYXdhaXQgdGhpcy5zZXJpYWxpemVCb2R5KGh0dHBPcGVyYXRpb25EYXRhKTtcclxuXHJcbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXHJcbiAgICAgIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5IdHRwLFxyXG4gICAgICBodHRwT3BlcmF0aW9uRGF0YSxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBjdXN0b21SZXF1ZXN0SWRcclxuICAgICk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5pbnNlcnRFdmVudFNvdXJjaW5nUXVldWUoZXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG4gICAgcmV0dXJuIGV2ZW50U291cmNpbmdJdGVtLmlkO1xyXG4gIH1cclxuXHJcbiAgcmVzcG9uc2VzU3ViamVjdCgpOiBPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBvblNhdmVEYXRhKCk6IE9ic2VydmFibGU8bnVsbD4ge1xyXG4gICAgaWYgKCF0aGlzLmV2ZW50U3ViKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTdWIgPSBPYnNlcnZhYmxlLmNyZWF0ZShzdWJzY3JpYmVyID0+ICh0aGlzLmVtaXR0ZXIgPSBzdWJzY3JpYmVyKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5ldmVudFN1YjtcclxuICB9XHJcblxyXG4gIHJlbW92ZShzY2hlbWFOYW1lOiBzdHJpbmcsIGl0ZW1Ub0RlbGV0ZTogYW55LCBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW0gPSB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxyXG4gICAgICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uRGVsZXRlLFxyXG4gICAgICBpdGVtVG9EZWxldGUsXHJcbiAgICAgIHNjaGVtYU5hbWUsXHJcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVFdmVudFNvdXJjaW5nSXRlbShpZEV2ZW50U291cmNpbmdJdGVtKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wb1N0b3JhZ2UucmVtb3ZlSXRlbUZyb21BcnJheShQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUsICdpZCcsIGlkRXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG4gIH1cclxuXHJcbiAgc3luY0dldCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3Qgc3luY0dldEZ1bmN0aW9uID0gYXN5bmMgKCkgPT5cclxuICAgICAgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0QWxsKCkudGhlbihzY2hlbWFzID0+IHtcclxuICAgICAgICBjb25zdCBzY2hlbWFQcm9taXNlcyA9IHRoaXMudXBkYXRlU3RvcmFnZVNjaGVtYXMoc2NoZW1hcyk7XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChzY2hlbWFQcm9taXNlcyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZS5saW1pdGVkQ2FsbFdyYXAoc3luY0dldEZ1bmN0aW9uKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHN5bmNTZW5kKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBzeW5jU2VuZEZ1bmN0aW9uID0gYXN5bmMgKCk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1PZlF1ZXVlID0gYXdhaXQgdGhpcy5wb1N0b3JhZ2UuZ2V0Rmlyc3RJdGVtKFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZSk7XHJcblxyXG4gICAgICBpZiAoaXRlbU9mUXVldWUpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdE9wZXJhdGlvbihpdGVtT2ZRdWV1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnN0b3BwZWRRdWV1ZUV2ZW50U291cmNpbmcgfHwgIWl0ZW1PZlF1ZXVlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wcGVkUXVldWVFdmVudFNvdXJjaW5nID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gc3luY1NlbmRGdW5jdGlvbigpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2UubGltaXRlZENhbGxXcmFwKHN5bmNTZW5kRnVuY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKHNjaGVtYU5hbWU6IHN0cmluZywgaXRlbVVwZGF0ZWQ6IGFueSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGV2ZW50U291cmNpbmdJdGVtID0gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcclxuICAgICAgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLlVwZGF0ZSxcclxuICAgICAgaXRlbVVwZGF0ZWQsXHJcbiAgICAgIHNjaGVtYU5hbWUsXHJcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgfVxyXG5cclxuICAvKiBBdmFsaWEgc2UgbyBib2R5IMOpIGRvIHRpcG8gRmlsZSBlIHNlIGZvciBjb252ZXJ0ZSBwYXJhIGJhc2U2NCAqL1xyXG4gIHByaXZhdGUgYXN5bmMgc2VyaWFsaXplQm9keShyZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEpOiBQcm9taXNlPFBvSHR0cFJlcXVlc3REYXRhPiB7XHJcbiAgICBsZXQgeyBib2R5LCBtaW1lVHlwZSwgYm9keVR5cGUsIGZpbGVOYW1lIH0gPSByZXF1ZXN0RGF0YTtcclxuXHJcbiAgICBpZiAoYm9keSBpbnN0YW5jZW9mIEZpbGUpIHtcclxuICAgICAgYm9keVR5cGUgPSAnRmlsZSc7XHJcbiAgICAgIG1pbWVUeXBlID0gYm9keS50eXBlO1xyXG4gICAgICBmaWxlTmFtZSA9IGJvZHkubmFtZTtcclxuICAgICAgYm9keSA9IGF3YWl0IHRvQmFzZTY0KGJvZHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IC4uLnJlcXVlc3REYXRhLCBib2R5LCBtaW1lVHlwZSwgYm9keVR5cGUsIGZpbGVOYW1lIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkVXJsUGFyYW1zKHNjaGVtYTogUG9TeW5jU2NoZW1hLCBiYXNlVXJsOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcclxuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVNpemVQYXJhbU5hbWUoKX09JHtzY2hlbWEucGFnZVNpemV9YCk7XHJcbiAgICBwYXJhbXMucHVzaChgJHt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldFBhZ2VQYXJhbU5hbWUoKX09JHtwYWdlTnVtYmVyfWApO1xyXG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1JlY29yZElkRXhpc3RzKHJlY29yZElkLCBvcGVyYXRpb24pIHtcclxuICAgIGlmICghcmVjb3JkSWQpIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0lkZW50aWZpZXIgbm90IGRlZmluZWQnLFxyXG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aHJvdyBuZXcgUG9FdmVudFNvdXJjaW5nRXJyb3JSZXNwb25zZShlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmNhdFBhZ2VJdGVtcyhwYWdlQWN1bXVsYXRvciwgcmVxdWVzdEJvZHkpOiB7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0ge1xyXG4gICAgaWYgKHJlcXVlc3RCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pIHtcclxuICAgICAgcGFnZUFjdW11bGF0b3IuZGF0YSA9IFsuLi5wYWdlQWN1bXVsYXRvci5kYXRhLCAuLi5yZXF1ZXN0Qm9keVt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldEl0ZW1zRmllbGROYW1lKCldXTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYWdlQWN1bXVsYXRvcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXHJcbiAgICBvcGVyYXRpb246IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbixcclxuICAgIG5ld0l0ZW06IGFueSB8IFBvSHR0cFJlcXVlc3REYXRhLFxyXG4gICAgc2NoZW1hTmFtZT86IHN0cmluZyxcclxuICAgIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyxcclxuICAgIGlkPzogbnVtYmVyXHJcbiAgKTogUG9FdmVudFNvdXJjaW5nSXRlbSB7XHJcbiAgICBpZiAoIXNjaGVtYU5hbWUgJiYgb3BlcmF0aW9uICE9PSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSHR0cCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvU3luY1NjaGVtYSBpcyBub3QgZGVmaW5lZC4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogaWQgPyBpZCA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxyXG4gICAgICBkYXRlVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCksXHJcbiAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcclxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXHJcbiAgICAgIHJlY29yZDogbmV3SXRlbSxcclxuICAgICAgY3VzdG9tUmVxdWVzdElkOiBjdXN0b21SZXF1ZXN0SWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUV2ZW50U291cmNpbmdMaXN0KFxyXG4gICAgc2NoZW1hTmFtZTogc3RyaW5nLFxyXG4gICAgZXZlbnRMaXN0OiBBcnJheTxQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbT5cclxuICApOiBBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPiB7XHJcbiAgICByZXR1cm4gZXZlbnRMaXN0Lm1hcCgoZXZlbnRJdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBpZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgaW5kZXg7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcclxuICAgICAgICBldmVudEl0ZW0ub3BlcmF0aW9uLFxyXG4gICAgICAgIGV2ZW50SXRlbS5yZWNvcmQsXHJcbiAgICAgICAgc2NoZW1hTmFtZSxcclxuICAgICAgICBldmVudEl0ZW0uY3VzdG9tUmVxdWVzdElkLFxyXG4gICAgICAgIGlkXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2NoZW1hU3luY0NvbmZpZyhzY2hlbWFOYW1lKSB7XHJcbiAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYU5hbWVdID0ge1xyXG4gICAgICBwYWdlOiB1bmRlZmluZWQsXHJcbiAgICAgIGN1cnJlbnRVcmxEaWZmOiB1bmRlZmluZWQsXHJcbiAgICAgIHJlc3BvbnNlRGF0ZTogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0KGV2ZW50U291cmNpbmdJdGVtLnNjaGVtYSk7XHJcblxyXG4gICAgICBjb25zdCByZWNvcmRJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XHJcbiAgICAgIHRoaXMuY2hlY2tSZWNvcmRJZEV4aXN0cyhyZWNvcmRJZCwgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkRlbGV0ZSk7XHJcblxyXG4gICAgICBjb25zdCB1cmwgPSBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmdldFVybChldmVudFNvdXJjaW5nSXRlbSwgc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkRFTEVURSk7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kU2VydmVySXRlbSh1cmwsIFBvSHR0cFJlcXVlc3RUeXBlLkRFTEVURSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBldmVudFNvdXJjaW5nSXRlbSk7XHJcblxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCByZXNwb25zZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIGVycm9yUmVzcG9uc2UsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaWZmU2VydmVySXRlbXMoY3VycmVudFVybERpZmYpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxPYmplY3Q+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wb0h0dHBDbGllbnQuZ2V0KGN1cnJlbnRVcmxEaWZmKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Qm9keUFuZERhdGUoc2NoZW1hTmFtZSwgcmVzcG9uc2UpOiBhbnkge1xyXG4gICAgY29uc3QgZ2V0RGF0ZUZpZWxkTmFtZSA9IHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0RGF0ZUZpZWxkTmFtZSgpO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlU3luY0RhdGUgPSByZXNwb25zZS5ib2R5W2dldERhdGVGaWVsZE5hbWVdO1xyXG5cclxuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hTmFtZV1bJ3Jlc3BvbnNlRGF0ZSddID0gcmVzcG9uc2VTeW5jRGF0ZTtcclxuICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRTZXJ2ZXJEaWZmUmVjb3JkcyhzY2hlbWE6IFBvU3luY1NjaGVtYSwgYmFzZVVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGluaXRpYWxBY3VtdWxhdG9yUGFnZSA9IHsgZW50aXR5OiBzY2hlbWEubmFtZSwgZGF0YTogW10gfTtcclxuICAgIGNvbnN0IGRpZmZVcmwgPSB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsnY3VycmVudFVybERpZmYnXTtcclxuXHJcbiAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMuZGlmZlNlcnZlckl0ZW1zKGRpZmZVcmwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB0aGlzLmdldEJvZHlBbmREYXRlKHNjaGVtYS5uYW1lLCByZXNwb25zZSkpLFxyXG4gICAgICAgIGV4cGFuZChkYXRhID0+IHRoaXMucGFnaW5hdGVTY2hlbWFEYXRhKGRhdGEsIHNjaGVtYSwgYmFzZVVybCkpLFxyXG4gICAgICAgIHJlZHVjZShcclxuICAgICAgICAgIChwYWdlQWN1bXVsYXRvciwgcmVxdWVzdEJvZHkpID0+IHRoaXMuY29uY2F0UGFnZUl0ZW1zKHBhZ2VBY3VtdWxhdG9yLCByZXF1ZXN0Qm9keSksXHJcbiAgICAgICAgICBpbml0aWFsQWN1bXVsYXRvclBhZ2VcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIHJldHVybiBzZXJ2ZXJSZXNwb25zZS5kYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBodHRwT3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPiB8IG51bWJlcj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVxdWVzdERhdGE6IFBvSHR0cFJlcXVlc3REYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVQb0h0dHBSZXF1ZXN0RGF0YShcclxuICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQudXJsLFxyXG4gICAgICAgIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZC5tZXRob2QsXHJcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLFxyXG4gICAgICAgIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZC5oZWFkZXJzXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5wb0h0dHBDbGllbnQuY3JlYXRlUmVxdWVzdChyZXF1ZXN0RGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGNvbnN0IHBvSHR0cENvbW1hbmRSZXNwb25zZTogUG9TeW5jUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgaWQ6IGV2ZW50U291cmNpbmdJdGVtLmlkLFxyXG4gICAgICAgIGN1c3RvbVJlcXVlc3RJZDogZXZlbnRTb3VyY2luZ0l0ZW0uY3VzdG9tUmVxdWVzdElkLFxyXG4gICAgICAgIHJlcXVlc3Q6IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZCxcclxuICAgICAgICByZXNwb25zZTogcmVzcG9uc2VcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0Lm5leHQocG9IdHRwQ29tbWFuZFJlc3BvbnNlKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBldmVudFNvdXJjaW5nSXRlbSk7XHJcbiAgICB9IGNhdGNoIChlcnJvckh0dHBDbGllbnQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChldmVudFNvdXJjaW5nSXRlbSwgZXJyb3JIdHRwQ2xpZW50LCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPj4ge1xyXG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ1VwZGF0ZWRRdWV1ZSA9IGF3YWl0IHRoaXMucG9TdG9yYWdlLmFwcGVuZEl0ZW1Ub0FycmF5KFxyXG4gICAgICBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUsXHJcbiAgICAgIGV2ZW50U291cmNpbmdJdGVtXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMubm90aWZ5RXZlbnRDcmVhdGlvbigpO1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXZlbnRTb3VyY2luZ1VwZGF0ZWRRdWV1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGluc2VydE9wZXJhdGlvbihjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0KGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbS5zY2hlbWEpO1xyXG4gICAgY29uc3QgdXJsID0gUG9FdmVudFNvdXJjaW5nU2VydmljZS5nZXRVcmwoY3VycmVudEV2ZW50U291cmNpbmdJdGVtLCBzY2hlbWEsIFBvUmVxdWVzdFR5cGUuUE9TVCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRTZXJ2ZXJJdGVtKHVybCwgUG9IdHRwUmVxdWVzdFR5cGUuUE9TVCwgY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZCk7XHJcbiAgICAgIGNvbnN0IHJlY29yZFVwZGF0ZWRCeVNlcnZlciA9IHJlc3BvbnNlLmJvZHk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG5cclxuICAgICAgY29uc3QgaWQgPSBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW1BvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZV07XHJcbiAgICAgIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLnVwZGF0ZShzY2hlbWEsIHJlY29yZFVwZGF0ZWRCeVNlcnZlciwgaWQpO1xyXG5cclxuICAgICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW1zOiBBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPiA9IGF3YWl0IHRoaXMucG9TdG9yYWdlLmdldChcclxuICAgICAgICBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWVcclxuICAgICAgKTtcclxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVQZW5kaW5nRXZlbnRTb3VyY2luZyhcclxuICAgICAgICBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0sXHJcbiAgICAgICAgc2NoZW1hLmlkRmllbGQsXHJcbiAgICAgICAgcmVjb3JkVXBkYXRlZEJ5U2VydmVyLFxyXG4gICAgICAgIGV2ZW50U291cmNpbmdJdGVtc1xyXG4gICAgICApO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0sIHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9ySHR0cENsaWVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSwgZXJyb3JIdHRwQ2xpZW50LCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNWYWxpZFN0YXR1cyhzdGF0dXM6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuVkFMSURfSFRUUF9TVEFUVVNfQ09ERVMuaW5jbHVkZXMoc3RhdHVzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm90aWZ5RXZlbnRDcmVhdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmVtaXR0ZXIpIHtcclxuICAgICAgdGhpcy5lbWl0dGVyLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFnaW5hdGVTY2hlbWFEYXRhKGRhdGEsIHNjaGVtYSwgYmFzZVVybCk6IE9ic2VydmFibGU8bnVsbD4ge1xyXG4gICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS50cmFuc2Zvcm0oZGF0YSk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uaGFzTmV4dCgpKSB7XHJcbiAgICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddID0gdGhpcy5idWlsZFVybFBhcmFtcyhcclxuICAgICAgICBzY2hlbWEsXHJcbiAgICAgICAgYmFzZVVybCxcclxuICAgICAgICArK3RoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydwYWdlJ11cclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmRpZmZTZXJ2ZXJJdGVtcyh0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsnY3VycmVudFVybERpZmYnXSkucGlwZShcclxuICAgICAgICBtYXAocmVzcG9uc2UgPT4gdGhpcy5nZXRCb2R5QW5kRGF0ZShzY2hlbWEubmFtZSwgcmVzcG9uc2UpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvZigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVFdmVudFNvdXJjaW5nVmFsaWRJdGVtKFxyXG4gICAgc3RhdHVzLFxyXG4gICAgZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW1cclxuICApOiBQcm9taXNlPEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+PiB7XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkU3RhdHVzKHN0YXR1cykgfHwgZXZlbnRTb3VyY2luZ0l0ZW0ub3BlcmF0aW9uID09PSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSHR0cCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVFdmVudFNvdXJjaW5nSXRlbShldmVudFNvdXJjaW5nSXRlbS5pZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdE9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBzd2l0Y2ggKGV2ZW50U291cmNpbmdJdGVtLm9wZXJhdGlvbikge1xyXG4gICAgICBjYXNlIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5JbnNlcnQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0T3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtKTtcclxuXHJcbiAgICAgIGNhc2UgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLlVwZGF0ZTpcclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG5cclxuICAgICAgY2FzZSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uRGVsZXRlOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbSk7XHJcblxyXG4gICAgICBjYXNlIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5IdHRwOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kUmVzcG9uc2VTdWJqZWN0KFxyXG4gICAgZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0sXHJcbiAgICByZXNwb25zZTogSHR0cFJlc3BvbnNlPE9iamVjdD4gfCBIdHRwRXJyb3JSZXNwb25zZSB8IFBvRXZlbnRTb3VyY2luZ0Vycm9yUmVzcG9uc2UsXHJcbiAgICBpc1N1YmplY3RFcnJvcjogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHBvU3luY1Jlc3BvbnNlOiBQb1N5bmNSZXNwb25zZSA9IHtcclxuICAgICAgaWQ6IGV2ZW50U291cmNpbmdJdGVtLmlkLFxyXG4gICAgICBjdXN0b21SZXF1ZXN0SWQ6IGV2ZW50U291cmNpbmdJdGVtLmN1c3RvbVJlcXVlc3RJZCxcclxuICAgICAgcmVxdWVzdDogZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLFxyXG4gICAgICByZXNwb25zZTogcmVzcG9uc2VcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5zdG9wcGVkUXVldWVFdmVudFNvdXJjaW5nID0gaXNTdWJqZWN0RXJyb3I7XHJcbiAgICB0aGlzLnJlc3BvbnNlU3ViamVjdC5uZXh0KHBvU3luY1Jlc3BvbnNlKTtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNlbmRTZXJ2ZXJJdGVtKHVybDogc3RyaW5nLCBtZXRob2Q6IFBvSHR0cFJlcXVlc3RUeXBlLCBib2R5PzogUG9FdmVudFNvdXJjaW5nSXRlbVsncmVjb3JkJ10pIHtcclxuICAgIGNvbnN0IHJlcXVlc3REYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSA9IGF3YWl0IHRoaXMuY3JlYXRlUG9IdHRwUmVxdWVzdERhdGEodXJsLCBtZXRob2QsIGJvZHkpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvSHR0cENsaWVudC5jcmVhdGVSZXF1ZXN0KHJlcXVlc3REYXRhKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlUG9IdHRwUmVxdWVzdERhdGEoXHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIG1ldGhvZDogUG9IdHRwUmVxdWVzdFR5cGUsXHJcbiAgICByZWNvcmQ/OiBQb0V2ZW50U291cmNpbmdJdGVtWydyZWNvcmQnXSxcclxuICAgIGhlYWRlcnM/OiBBcnJheTxQb0h0dHBIZWFkZXJPcHRpb24+XHJcbiAgKTogUHJvbWlzZTxQb0h0dHBSZXF1ZXN0RGF0YT4ge1xyXG4gICAgbGV0IGJvZHkgPSByZWNvcmQuYm9keSA/PyByZWNvcmQ7XHJcblxyXG4gICAgaWYgKHJlY29yZC5ib2R5VHlwZSA9PT0gJ0ZpbGUnKSB7XHJcbiAgICAgIGJvZHkgPSBhd2FpdCB0aGlzLmNyZWF0ZUZvcm1EYXRhKGJvZHksIHJlY29yZC5maWxlTmFtZSwgcmVjb3JkLm1pbWVUeXBlLCByZWNvcmQuZm9ybUZpZWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB1cmwsIG1ldGhvZCwgYm9keSwgaGVhZGVycyB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVGb3JtRGF0YShcclxuICAgIGJvZHk6IHN0cmluZyxcclxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXHJcbiAgICBtaW1lVHlwZTogc3RyaW5nLFxyXG4gICAgZm9ybUZpZWxkOiBzdHJpbmcgPSAnZmlsZSdcclxuICApOiBQcm9taXNlPEZvcm1EYXRhPiB7XHJcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdG9GaWxlKGJvZHksIGZpbGVOYW1lLCBtaW1lVHlwZSk7XHJcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoZm9ybUZpZWxkLCBmaWxlLCBmaWxlTmFtZSk7XHJcbiAgICByZXR1cm4gZm9ybURhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8QXJyYXk8YW55PiB8IG51bWJlcj4ge1xyXG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0KGV2ZW50U291cmNpbmdJdGVtLnNjaGVtYSk7XHJcbiAgICBjb25zdCB1cmwgPSBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmdldFVybChldmVudFNvdXJjaW5nSXRlbSwgc2NoZW1hLCBQb1JlcXVlc3RUeXBlLlBBVENIKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZWNvcmRJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XHJcbiAgICAgIHRoaXMuY2hlY2tSZWNvcmRJZEV4aXN0cyhyZWNvcmRJZCwgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLlVwZGF0ZSk7XHJcblxyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFNlcnZlckl0ZW0odXJsLCBQb0h0dHBSZXF1ZXN0VHlwZS5QVVQsIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZCk7XHJcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlRXZlbnRTb3VyY2luZ1ZhbGlkSXRlbShyZXNwb25zZS5zdGF0dXMsIGV2ZW50U291cmNpbmdJdGVtKTtcclxuXHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9ySHR0cENsaWVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCBlcnJvckh0dHBDbGllbnQsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVQZW5kaW5nRXZlbnRTb3VyY2luZyhcclxuICAgIGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSxcclxuICAgIGlkRmllbGRTY2hlbWE6IHN0cmluZyxcclxuICAgIGluc2VydGVkOiBvYmplY3QsXHJcbiAgICBldmVudFNvdXJjaW5nSXRlbXM6IEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+XHJcbiAgKSB7XHJcbiAgICBpZiAoY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdKSB7XHJcbiAgICAgIGV2ZW50U291cmNpbmdJdGVtcy5mb3JFYWNoKChldmVudFNvdXJjaW5nSXRlbSwgcG9zaXRpb24pID0+IHtcclxuICAgICAgICBjb25zdCBpc0N1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSA9XHJcbiAgICAgICAgICAhZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW2lkRmllbGRTY2hlbWFdICYmXHJcbiAgICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmRbUG9TY2hlbWFVdGlsLnN5bmNJbnRlcm5hbElkRmllbGROYW1lXSA9PT1cclxuICAgICAgICAgICAgY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoaXNDdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0pIHtcclxuICAgICAgICAgIGV2ZW50U291cmNpbmdJdGVtc1twb3NpdGlvbl0ucmVjb3JkW2lkRmllbGRTY2hlbWFdID0gaW5zZXJ0ZWRbaWRGaWVsZFNjaGVtYV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnBvU3RvcmFnZS5zZXQoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lLCBldmVudFNvdXJjaW5nSXRlbXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWNvcmRzKHNlcnZlclJlY29yZHM6IEFycmF5PGFueT4sIHNjaGVtYTogUG9TeW5jU2NoZW1hKSB7XHJcbiAgICBmb3IgKGNvbnN0IHNlcnZlclJlY29yZCBvZiBzZXJ2ZXJSZWNvcmRzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlUmVjb3JkQnlTZXJ2ZXJSZWNvcmQoc2VydmVyUmVjb3JkLCBzY2hlbWEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWNvcmRCeVNlcnZlclJlY29yZChzZXJ2ZXJSZWNvcmQsIHNjaGVtYSkge1xyXG4gICAgY29uc3QgcmVjb3JkSWQgPSBzZXJ2ZXJSZWNvcmRbc2NoZW1hLmlkRmllbGRdO1xyXG4gICAgY29uc3Qgc3RvcmFnZVJlY29yZCA9IGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLmdldChzY2hlbWEubmFtZSwgcmVjb3JkSWQpO1xyXG4gICAgY29uc3QgZXhpc3RzU3RvcmFnZVJlY29yZCA9ICEhT2JqZWN0LmtleXMoc3RvcmFnZVJlY29yZCkubGVuZ3RoO1xyXG5cclxuICAgIGlmIChleGlzdHNTdG9yYWdlUmVjb3JkICYmIHNlcnZlclJlY29yZFtzY2hlbWEuZGVsZXRlZEZpZWxkXSkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UucmVtb3ZlKHNjaGVtYS5uYW1lLCBzZXJ2ZXJSZWNvcmRbc2NoZW1hLmlkRmllbGRdKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXhpc3RzU3RvcmFnZVJlY29yZCAmJiAhc2VydmVyUmVjb3JkW3NjaGVtYS5kZWxldGVkRmllbGRdKSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS51cGRhdGUoc2NoZW1hLCBzZXJ2ZXJSZWNvcmQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZXhpc3RzU3RvcmFnZVJlY29yZCAmJiAhc2VydmVyUmVjb3JkW3NjaGVtYS5kZWxldGVkRmllbGRdKSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5jcmVhdGUoc2NoZW1hLCBzZXJ2ZXJSZWNvcmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVTdG9yYWdlQnlTY2hlbWEoc2NoZW1hOiBQb1N5bmNTY2hlbWEpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5jcmVhdGVTY2hlbWFTeW5jQ29uZmlnKHNjaGVtYS5uYW1lKTtcclxuXHJcbiAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsncGFnZSddID0gMTtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtQb1NjaGVtYVV0aWwuZ2V0VXJsKHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5ESUZGKX0vJHtzY2hlbWEubGFzdFN5bmN9YDtcclxuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddID0gdGhpcy5idWlsZFVybFBhcmFtcyhcclxuICAgICAgc2NoZW1hLFxyXG4gICAgICBiYXNlVXJsLFxyXG4gICAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsncGFnZSddXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHNlcnZlclJlY29yZHMgPSBhd2FpdCB0aGlzLmdldFNlcnZlckRpZmZSZWNvcmRzKHNjaGVtYSwgYmFzZVVybCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy51cGRhdGVSZWNvcmRzKHNlcnZlclJlY29yZHMsIHNjaGVtYSk7XHJcblxyXG4gICAgc2NoZW1hLmxhc3RTeW5jID0gdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ3Jlc3BvbnNlRGF0ZSddO1xyXG4gICAgYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24udXBkYXRlKHNjaGVtYSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVN0b3JhZ2VTY2hlbWFzKHNjaGVtYXMpOiBBcnJheTxQcm9taXNlPEFycmF5PGFueT4+PiB7XHJcbiAgICByZXR1cm4gc2NoZW1hcy5tYXAoKHNjaGVtYTogUG9TeW5jU2NoZW1hKSA9PiB0aGlzLnVwZGF0ZVN0b3JhZ2VCeVNjaGVtYShzY2hlbWEpKTtcclxuICB9XHJcbn1cclxuIl19
1
+ import { Injectable } from '@angular/core';
2
+ import { StatusCodes } from 'http-status-codes';
3
+ import { Observable, of, Subject } from 'rxjs';
4
+ import { expand, map, reduce } from 'rxjs/operators';
5
+ import { toBase64, toFile } from '../../utils/utils';
6
+ import { PoEventSourcingErrorResponse } from '../../models/po-event-sourcing-error-response.model';
7
+ import { PoEventSourcingOperation } from './enums/po-event-sourcing-operation.enum';
8
+ import { PoHttpRequestType } from '../po-http-client/po-http-request-type.enum';
9
+ import { PoRequestType } from '../../models/po-request-type.enum';
10
+ import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "./../po-schema/po-schema-definition/po-schema-definition.service";
13
+ import * as i2 from "./../po-schema/po-schema.service";
14
+ import * as i3 from "@po-ui/ng-storage";
15
+ import * as i4 from "./../po-http-client/po-http-client.service";
16
+ export class PoEventSourcingService {
17
+ constructor(poSchemaDefinition, poSchemaService, poStorage, poHttpClient) {
18
+ this.poSchemaDefinition = poSchemaDefinition;
19
+ this.poSchemaService = poSchemaService;
20
+ this.poStorage = poStorage;
21
+ this.poHttpClient = poHttpClient;
22
+ this.stoppedQueueEventSourcing = false;
23
+ this.responseSubject = new Subject();
24
+ this.schemasSyncConfig = {};
25
+ }
26
+ static getUrl(eventSourcingItem, schema, requestType) {
27
+ const schemaUrl = PoSchemaUtil.getUrl(schema, requestType);
28
+ const schemaId = eventSourcingItem.record[schema.idField];
29
+ if (requestType === PoRequestType.GET) {
30
+ return schemaUrl;
31
+ }
32
+ if ([PoRequestType.DELETE, PoRequestType.PATCH].includes(requestType)) {
33
+ return schemaUrl ? `${schemaUrl}/${schemaId}` : `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}/${schemaId}`;
34
+ }
35
+ if (requestType === PoRequestType.POST) {
36
+ return schemaUrl ? schemaUrl : PoSchemaUtil.getUrl(schema, PoRequestType.GET);
37
+ }
38
+ }
39
+ create(schemaName, newItem, customRequestId) {
40
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Insert, newItem, schemaName, customRequestId);
41
+ return this.insertEventSourcingQueue(eventSourcingItem);
42
+ }
43
+ async createBatchEvents(schemaName, eventList) {
44
+ const eventSourcingList = this.createEventSourcingList(schemaName, eventList);
45
+ await this.poStorage.appendArrayToArray(PoEventSourcingService.event_sourcing_name, eventSourcingList);
46
+ this.notifyEventCreation();
47
+ }
48
+ /**
49
+ * Destrói a chave do *storage* que contém a fila de dados que estão esperando para serem enviados ao
50
+ * servidor *(EventSourcing)*.
51
+ *
52
+ * @returns {Promise<void>} Promessa que é resolvida quando a chave referente a fila de *EventSourcing* for destruída.
53
+ */
54
+ destroyEventSourcingQueue() {
55
+ return this.poStorage.remove(PoEventSourcingService.event_sourcing_name);
56
+ }
57
+ async httpCommand(httpOperationData, customRequestId) {
58
+ httpOperationData = await this.serializeBody(httpOperationData);
59
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Http, httpOperationData, undefined, customRequestId);
60
+ await this.insertEventSourcingQueue(eventSourcingItem);
61
+ return eventSourcingItem.id;
62
+ }
63
+ responsesSubject() {
64
+ return this.responseSubject.asObservable();
65
+ }
66
+ onSaveData() {
67
+ if (!this.eventSub) {
68
+ this.eventSub = Observable.create(subscriber => (this.emitter = subscriber));
69
+ }
70
+ return this.eventSub;
71
+ }
72
+ remove(schemaName, itemToDelete, customRequestId) {
73
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Delete, itemToDelete, schemaName, customRequestId);
74
+ return this.insertEventSourcingQueue(eventSourcingItem);
75
+ }
76
+ removeEventSourcingItem(idEventSourcingItem) {
77
+ return this.poStorage.removeItemFromArray(PoEventSourcingService.event_sourcing_name, 'id', idEventSourcingItem);
78
+ }
79
+ syncGet() {
80
+ const syncGetFunction = async () => this.poSchemaDefinition.getAll().then(schemas => {
81
+ const schemaPromises = this.updateStorageSchemas(schemas);
82
+ return Promise.all(schemaPromises);
83
+ });
84
+ return this.poSchemaService.limitedCallWrap(syncGetFunction);
85
+ }
86
+ async syncSend() {
87
+ const syncSendFunction = async () => {
88
+ const itemOfQueue = await this.poStorage.getFirstItem(PoEventSourcingService.event_sourcing_name);
89
+ if (itemOfQueue) {
90
+ await this.selectOperation(itemOfQueue);
91
+ }
92
+ if (this.stoppedQueueEventSourcing || !itemOfQueue) {
93
+ this.stoppedQueueEventSourcing = false;
94
+ return Promise.resolve();
95
+ }
96
+ return syncSendFunction();
97
+ };
98
+ return this.poSchemaService.limitedCallWrap(syncSendFunction);
99
+ }
100
+ update(schemaName, itemUpdated, customRequestId) {
101
+ const eventSourcingItem = this.createEventSourcingItem(PoEventSourcingOperation.Update, itemUpdated, schemaName, customRequestId);
102
+ return this.insertEventSourcingQueue(eventSourcingItem);
103
+ }
104
+ /* Avalia se o body é do tipo File e se for converte para base64 */
105
+ async serializeBody(requestData) {
106
+ let { body, mimeType, bodyType, fileName } = requestData;
107
+ if (body instanceof File) {
108
+ bodyType = 'File';
109
+ mimeType = body.type;
110
+ fileName = body.name;
111
+ body = await toBase64(body);
112
+ }
113
+ return { ...requestData, body, mimeType, bodyType, fileName };
114
+ }
115
+ buildUrlParams(schema, baseUrl, pageNumber) {
116
+ const params = [];
117
+ params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
118
+ params.push(`${this.config.dataTransform.getPageParamName()}=${pageNumber}`);
119
+ return `${baseUrl}?${params.join('&')}`;
120
+ }
121
+ checkRecordIdExists(recordId, operation) {
122
+ if (!recordId) {
123
+ const error = {
124
+ message: 'Identifier not defined',
125
+ operation: operation
126
+ };
127
+ throw new PoEventSourcingErrorResponse(error);
128
+ }
129
+ }
130
+ concatPageItems(pageAcumulator, requestBody) {
131
+ if (requestBody[this.config.dataTransform.getItemsFieldName()]) {
132
+ pageAcumulator.data = [...pageAcumulator.data, ...requestBody[this.config.dataTransform.getItemsFieldName()]];
133
+ }
134
+ return pageAcumulator;
135
+ }
136
+ createEventSourcingItem(operation, newItem, schemaName, customRequestId, id) {
137
+ if (!schemaName && operation !== PoEventSourcingOperation.Http) {
138
+ throw new Error('PoSyncSchema is not defined.');
139
+ }
140
+ return {
141
+ id: id ? id : new Date().getTime(),
142
+ dateTime: new Date().getTime(),
143
+ schema: schemaName,
144
+ operation: operation,
145
+ record: newItem,
146
+ customRequestId: customRequestId
147
+ };
148
+ }
149
+ createEventSourcingList(schemaName, eventList) {
150
+ return eventList.map((eventItem, index) => {
151
+ const id = new Date().getTime() + index;
152
+ return this.createEventSourcingItem(eventItem.operation, eventItem.record, schemaName, eventItem.customRequestId, id);
153
+ });
154
+ }
155
+ createSchemaSyncConfig(schemaName) {
156
+ this.schemasSyncConfig[schemaName] = {
157
+ page: undefined,
158
+ currentUrlDiff: undefined,
159
+ responseDate: undefined
160
+ };
161
+ }
162
+ async deleteOperation(eventSourcingItem) {
163
+ try {
164
+ const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);
165
+ const recordId = eventSourcingItem.record[schema.idField];
166
+ this.checkRecordIdExists(recordId, PoEventSourcingOperation.Delete);
167
+ const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.DELETE);
168
+ const response = await this.sendServerItem(url, PoHttpRequestType.DELETE);
169
+ await this.removeEventSourcingValidItem(response.status, eventSourcingItem);
170
+ return await this.sendResponseSubject(eventSourcingItem, response);
171
+ }
172
+ catch (errorResponse) {
173
+ return this.sendResponseSubject(eventSourcingItem, errorResponse, true);
174
+ }
175
+ }
176
+ diffServerItems(currentUrlDiff) {
177
+ return this.poHttpClient.get(currentUrlDiff);
178
+ }
179
+ getBodyAndDate(schemaName, response) {
180
+ const getDateFieldName = this.config.dataTransform.getDateFieldName();
181
+ const responseSyncDate = response.body[getDateFieldName];
182
+ this.schemasSyncConfig[schemaName]['responseDate'] = responseSyncDate;
183
+ return response.body;
184
+ }
185
+ async getServerDiffRecords(schema, baseUrl) {
186
+ const initialAcumulatorPage = { entity: schema.name, data: [] };
187
+ const diffUrl = this.schemasSyncConfig[schema.name]['currentUrlDiff'];
188
+ const serverResponse = await this.diffServerItems(diffUrl)
189
+ .pipe(map(response => this.getBodyAndDate(schema.name, response)), expand(data => this.paginateSchemaData(data, schema, baseUrl)), reduce((pageAcumulator, requestBody) => this.concatPageItems(pageAcumulator, requestBody), initialAcumulatorPage))
190
+ .toPromise();
191
+ return serverResponse.data;
192
+ }
193
+ async httpOperation(eventSourcingItem) {
194
+ try {
195
+ const requestData = await this.createPoHttpRequestData(eventSourcingItem.record.url, eventSourcingItem.record.method, eventSourcingItem.record, eventSourcingItem.record.headers);
196
+ const response = await this.poHttpClient.createRequest(requestData).toPromise();
197
+ const poHttpCommandResponse = {
198
+ id: eventSourcingItem.id,
199
+ customRequestId: eventSourcingItem.customRequestId,
200
+ request: eventSourcingItem.record,
201
+ response: response
202
+ };
203
+ this.responseSubject.next(poHttpCommandResponse);
204
+ return this.removeEventSourcingValidItem(response.status, eventSourcingItem);
205
+ }
206
+ catch (errorHttpClient) {
207
+ return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);
208
+ }
209
+ }
210
+ async insertEventSourcingQueue(eventSourcingItem) {
211
+ const eventSourcingUpdatedQueue = await this.poStorage.appendItemToArray(PoEventSourcingService.event_sourcing_name, eventSourcingItem);
212
+ this.notifyEventCreation();
213
+ return Promise.resolve(eventSourcingUpdatedQueue);
214
+ }
215
+ async insertOperation(currentEventSourcingItem) {
216
+ const schema = await this.poSchemaDefinition.get(currentEventSourcingItem.schema);
217
+ const url = PoEventSourcingService.getUrl(currentEventSourcingItem, schema, PoRequestType.POST);
218
+ try {
219
+ const response = await this.sendServerItem(url, PoHttpRequestType.POST, currentEventSourcingItem.record);
220
+ const recordUpdatedByServer = response.body;
221
+ await this.removeEventSourcingValidItem(response.status, currentEventSourcingItem);
222
+ const id = currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];
223
+ await this.poSchemaService.update(schema, recordUpdatedByServer, id);
224
+ const eventSourcingItems = await this.poStorage.get(PoEventSourcingService.event_sourcing_name);
225
+ await this.updatePendingEventSourcing(currentEventSourcingItem, schema.idField, recordUpdatedByServer, eventSourcingItems);
226
+ return this.sendResponseSubject(currentEventSourcingItem, response);
227
+ }
228
+ catch (errorHttpClient) {
229
+ return this.sendResponseSubject(currentEventSourcingItem, errorHttpClient, true);
230
+ }
231
+ }
232
+ isValidStatus(status) {
233
+ return PoEventSourcingService.VALID_HTTP_STATUS_CODES.includes(status);
234
+ }
235
+ notifyEventCreation() {
236
+ if (this.emitter) {
237
+ this.emitter.next();
238
+ }
239
+ }
240
+ paginateSchemaData(data, schema, baseUrl) {
241
+ this.config.dataTransform.transform(data);
242
+ if (this.config.dataTransform.hasNext()) {
243
+ this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(schema, baseUrl, ++this.schemasSyncConfig[schema.name]['page']);
244
+ return this.diffServerItems(this.schemasSyncConfig[schema.name]['currentUrlDiff']).pipe(map(response => this.getBodyAndDate(schema.name, response)));
245
+ }
246
+ return of();
247
+ }
248
+ removeEventSourcingValidItem(status, eventSourcingItem) {
249
+ if (this.isValidStatus(status) || eventSourcingItem.operation === PoEventSourcingOperation.Http) {
250
+ return this.removeEventSourcingItem(eventSourcingItem.id);
251
+ }
252
+ }
253
+ selectOperation(eventSourcingItem) {
254
+ switch (eventSourcingItem.operation) {
255
+ case PoEventSourcingOperation.Insert:
256
+ return this.insertOperation(eventSourcingItem);
257
+ case PoEventSourcingOperation.Update:
258
+ return this.updateOperation(eventSourcingItem);
259
+ case PoEventSourcingOperation.Delete:
260
+ return this.deleteOperation(eventSourcingItem);
261
+ case PoEventSourcingOperation.Http:
262
+ return this.httpOperation(eventSourcingItem);
263
+ }
264
+ }
265
+ sendResponseSubject(eventSourcingItem, response, isSubjectError = false) {
266
+ const poSyncResponse = {
267
+ id: eventSourcingItem.id,
268
+ customRequestId: eventSourcingItem.customRequestId,
269
+ request: eventSourcingItem.record,
270
+ response: response
271
+ };
272
+ this.stoppedQueueEventSourcing = isSubjectError;
273
+ this.responseSubject.next(poSyncResponse);
274
+ return Promise.resolve();
275
+ }
276
+ async sendServerItem(url, method, body) {
277
+ const requestData = await this.createPoHttpRequestData(url, method, body);
278
+ return this.poHttpClient.createRequest(requestData).toPromise();
279
+ }
280
+ async createPoHttpRequestData(url, method, record, headers) {
281
+ let body = record.body ?? record;
282
+ if (record.bodyType === 'File') {
283
+ body = await this.createFormData(body, record.fileName, record.mimeType, record.formField);
284
+ }
285
+ return { url, method, body, headers };
286
+ }
287
+ async createFormData(body, fileName, mimeType, formField = 'file') {
288
+ const file = await toFile(body, fileName, mimeType);
289
+ const formData = new FormData();
290
+ formData.append(formField, file, fileName);
291
+ return formData;
292
+ }
293
+ async updateOperation(eventSourcingItem) {
294
+ const schema = await this.poSchemaDefinition.get(eventSourcingItem.schema);
295
+ const url = PoEventSourcingService.getUrl(eventSourcingItem, schema, PoRequestType.PATCH);
296
+ try {
297
+ const recordId = eventSourcingItem.record[schema.idField];
298
+ this.checkRecordIdExists(recordId, PoEventSourcingOperation.Update);
299
+ const response = await this.sendServerItem(url, PoHttpRequestType.PUT, eventSourcingItem.record);
300
+ await this.removeEventSourcingValidItem(response.status, eventSourcingItem);
301
+ return await this.sendResponseSubject(eventSourcingItem, response);
302
+ }
303
+ catch (errorHttpClient) {
304
+ return this.sendResponseSubject(eventSourcingItem, errorHttpClient, true);
305
+ }
306
+ }
307
+ updatePendingEventSourcing(currentEventSourcingItem, idFieldSchema, inserted, eventSourcingItems) {
308
+ if (currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName]) {
309
+ eventSourcingItems.forEach((eventSourcingItem, position) => {
310
+ const isCurrentEventSourcingItem = !eventSourcingItem.record[idFieldSchema] &&
311
+ eventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName] ===
312
+ currentEventSourcingItem.record[PoSchemaUtil.syncInternalIdFieldName];
313
+ if (isCurrentEventSourcingItem) {
314
+ eventSourcingItems[position].record[idFieldSchema] = inserted[idFieldSchema];
315
+ }
316
+ });
317
+ return this.poStorage.set(PoEventSourcingService.event_sourcing_name, eventSourcingItems);
318
+ }
319
+ else {
320
+ return Promise.resolve();
321
+ }
322
+ }
323
+ async updateRecords(serverRecords, schema) {
324
+ for (const serverRecord of serverRecords) {
325
+ await this.updateRecordByServerRecord(serverRecord, schema);
326
+ }
327
+ }
328
+ async updateRecordByServerRecord(serverRecord, schema) {
329
+ const recordId = serverRecord[schema.idField];
330
+ const storageRecord = await this.poSchemaService.get(schema.name, recordId);
331
+ const existsStorageRecord = !!Object.keys(storageRecord).length;
332
+ if (existsStorageRecord && serverRecord[schema.deletedField]) {
333
+ return await this.poSchemaService.remove(schema.name, serverRecord[schema.idField]);
334
+ }
335
+ if (existsStorageRecord && !serverRecord[schema.deletedField]) {
336
+ return await this.poSchemaService.update(schema, serverRecord);
337
+ }
338
+ if (!existsStorageRecord && !serverRecord[schema.deletedField]) {
339
+ return await this.poSchemaService.create(schema, serverRecord);
340
+ }
341
+ }
342
+ async updateStorageBySchema(schema) {
343
+ this.createSchemaSyncConfig(schema.name);
344
+ this.schemasSyncConfig[schema.name]['page'] = 1;
345
+ const baseUrl = `${PoSchemaUtil.getUrl(schema, PoRequestType.DIFF)}/${schema.lastSync}`;
346
+ this.schemasSyncConfig[schema.name]['currentUrlDiff'] = this.buildUrlParams(schema, baseUrl, this.schemasSyncConfig[schema.name]['page']);
347
+ const serverRecords = await this.getServerDiffRecords(schema, baseUrl);
348
+ await this.updateRecords(serverRecords, schema);
349
+ schema.lastSync = this.schemasSyncConfig[schema.name]['responseDate'];
350
+ await this.poSchemaDefinition.update(schema);
351
+ }
352
+ updateStorageSchemas(schemas) {
353
+ return schemas.map((schema) => this.updateStorageBySchema(schema));
354
+ }
355
+ }
356
+ PoEventSourcingService.event_sourcing_name = 'EventSourcing';
357
+ PoEventSourcingService.VALID_HTTP_STATUS_CODES = [
358
+ StatusCodes.OK,
359
+ StatusCodes.CREATED,
360
+ StatusCodes.ACCEPTED,
361
+ StatusCodes.NON_AUTHORITATIVE_INFORMATION,
362
+ StatusCodes.NO_CONTENT,
363
+ StatusCodes.RESET_CONTENT,
364
+ StatusCodes.PARTIAL_CONTENT,
365
+ StatusCodes.MULTI_STATUS // 207
366
+ ];
367
+ PoEventSourcingService.ɵfac = function PoEventSourcingService_Factory(t) { return new (t || PoEventSourcingService)(i0.ɵɵinject(i1.PoSchemaDefinitionService), i0.ɵɵinject(i2.PoSchemaService), i0.ɵɵinject(i3.PoStorageService), i0.ɵɵinject(i4.PoHttpClientService)); };
368
+ PoEventSourcingService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoEventSourcingService, factory: PoEventSourcingService.ɵfac });
369
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoEventSourcingService, [{
370
+ type: Injectable
371
+ }], function () { return [{ type: i1.PoSchemaDefinitionService }, { type: i2.PoSchemaService }, { type: i3.PoStorageService }, { type: i4.PoHttpClientService }]; }, null); })();
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZXZlbnQtc291cmNpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBRW5HLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBS3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7OztBQU1sRixNQUFNLE9BQU8sc0JBQXNCO0lBdUJqQyxZQUNVLGtCQUE2QyxFQUM3QyxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixZQUFpQztRQUhqQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTJCO1FBQzdDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFaM0MsOEJBQXlCLEdBQVksS0FB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TSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDOztBQTloQmUsMENBQW1CLEdBQVcsZUFBZ0IsQ0FBQTtBQUV0Qyw4Q0FBdUIsR0FBRztJQUNoRCxXQUFXLENBQUMsRUFBRTtJQUNkLFdBQVcsQ0FBQyxPQUFPO0lBQ25CLFdBQVcsQ0FBQyxRQUFRO0lBQ3BCLFdBQVcsQ0FBQyw2QkFBNkI7SUFDekMsV0FBVyxDQUFDLFVBQVU7SUFDdEIsV0FBVyxDQUFDLGFBQWE7SUFDekIsV0FBVyxDQUFDLGVBQWU7SUFDM0IsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNO0NBQy9CLENBQUE7NEZBWlMsc0JBQXNCOzRFQUF0QixzQkFBc0IsV0FBdEIsc0JBQXNCO3VGQUF0QixzQkFBc0I7Y0FEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBSZXNwb25zZSwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN0YXR1c0NvZGVzIH0gZnJvbSAnaHR0cC1zdGF0dXMtY29kZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGV4cGFuZCwgbWFwLCByZWR1Y2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFBvU3RvcmFnZVNlcnZpY2UgfSBmcm9tICdAcG8tdWkvbmctc3RvcmFnZSc7XG5cbmltcG9ydCB7IHRvQmFzZTY0LCB0b0ZpbGUgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5cbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ0Vycm9yUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvcG8tZXZlbnQtc291cmNpbmctZXJyb3ItcmVzcG9uc2UubW9kZWwnO1xuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nSXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1ldmVudC1zb3VyY2luZy1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24gfSBmcm9tICcuL2VudW1zL3BvLWV2ZW50LXNvdXJjaW5nLW9wZXJhdGlvbi5lbnVtJztcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ1N1bW1hcnlJdGVtIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLWV2ZW50LXNvdXJjaW5nLXN1bW1hcnktaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9IdHRwSGVhZGVyT3B0aW9uIH0gZnJvbSAnLi8uLi9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9IdHRwQ2xpZW50U2VydmljZSB9IGZyb20gJy4vLi4vcG8taHR0cC1jbGllbnQvcG8taHR0cC1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQgeyBQb0h0dHBSZXF1ZXN0RGF0YSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L2ludGVyZmFjZXMvcG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3RUeXBlIH0gZnJvbSAnLi4vcG8taHR0cC1jbGllbnQvcG8taHR0cC1yZXF1ZXN0LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQb1JlcXVlc3RUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvLXJlcXVlc3QtdHlwZS5lbnVtJztcbmltcG9ydCB7IFBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtZGVmaW5pdGlvbi9wby1zY2hlbWEtZGVmaW5pdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBvU2NoZW1hU2VydmljZSB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS5zZXJ2aWNlJztcbmltcG9ydCB7IFBvU2NoZW1hVXRpbCB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS11dGlsL3BvLXNjaGVtYS11dGlsLm1vZGVsJztcbmltcG9ydCB7IFBvU3luY0NvbmZpZyB9IGZyb20gJy4uL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9TeW5jUmVzcG9uc2UgfSBmcm9tICcuLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9TeW5jU2NoZW1hIH0gZnJvbSAnLi8uLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uge1xuICBzdGF0aWMgcmVhZG9ubHkgZXZlbnRfc291cmNpbmdfbmFtZTogc3RyaW5nID0gJ0V2ZW50U291cmNpbmcnO1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFZBTElEX0hUVFBfU1RBVFVTX0NPREVTID0gW1xuICAgIFN0YXR1c0NvZGVzLk9LLCAvLyAyMDBcbiAgICBTdGF0dXNDb2Rlcy5DUkVBVEVELCAvLyAyMDFcbiAgICBTdGF0dXNDb2Rlcy5BQ0NFUFRFRCwgLy8gMjAyXG4gICAgU3RhdHVzQ29kZXMuTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04sIC8vIDIwM1xuICAgIFN0YXR1c0NvZGVzLk5PX0NPTlRFTlQsIC8vIDIwNFxuICAgIFN0YXR1c0NvZGVzLlJFU0VUX0NPTlRFTlQsIC8vIDIwNVxuICAgIFN0YXR1c0NvZGVzLlBBUlRJQUxfQ09OVEVOVCwgLy8gMjA2XG4gICAgU3RhdHVzQ29kZXMuTVVMVElfU1RBVFVTIC8vIDIwN1xuICBdO1xuXG4gIGNvbmZpZzogUG9TeW5jQ29uZmlnO1xuICBzdG9wcGVkUXVldWVFdmVudFNvdXJjaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBlbWl0dGVyOiBhbnk7XG4gIHByaXZhdGUgZXZlbnRTdWI6IE9ic2VydmFibGU8bnVsbD47XG4gIHByaXZhdGUgcmVzcG9uc2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8UG9TeW5jUmVzcG9uc2U+KCk7XG5cbiAgcHJpdmF0ZSBzY2hlbWFzU3luY0NvbmZpZyA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcG9TY2hlbWFEZWZpbml0aW9uOiBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9TY2hlbWFTZXJ2aWNlOiBQb1NjaGVtYVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1N0b3JhZ2U6IFBvU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb0h0dHBDbGllbnQ6IFBvSHR0cENsaWVudFNlcnZpY2VcbiAgKSB7fVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFVybChldmVudFNvdXJjaW5nSXRlbSwgc2NoZW1hLCByZXF1ZXN0VHlwZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2NoZW1hVXJsID0gUG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIHJlcXVlc3RUeXBlKTtcbiAgICBjb25zdCBzY2hlbWFJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFBvUmVxdWVzdFR5cGUuR0VUKSB7XG4gICAgICByZXR1cm4gc2NoZW1hVXJsO1xuICAgIH1cblxuICAgIGlmIChbUG9SZXF1ZXN0VHlwZS5ERUxFVEUsIFBvUmVxdWVzdFR5cGUuUEFUQ0hdLmluY2x1ZGVzKHJlcXVlc3RUeXBlKSkge1xuICAgICAgcmV0dXJuIHNjaGVtYVVybCA/IGAke3NjaGVtYVVybH0vJHtzY2hlbWFJZH1gIDogYCR7UG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIFBvUmVxdWVzdFR5cGUuR0VUKX0vJHtzY2hlbWFJZH1gO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUG9SZXF1ZXN0VHlwZS5QT1NUKSB7XG4gICAgICByZXR1cm4gc2NoZW1hVXJsID8gc2NoZW1hVXJsIDogUG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIFBvUmVxdWVzdFR5cGUuR0VUKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGUoc2NoZW1hTmFtZTogc3RyaW5nLCBuZXdJdGVtOiBhbnksIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW0gPSB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxuICAgICAgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkluc2VydCxcbiAgICAgIG5ld0l0ZW0sXG4gICAgICBzY2hlbWFOYW1lLFxuICAgICAgY3VzdG9tUmVxdWVzdElkXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRFdmVudFNvdXJjaW5nUXVldWUoZXZlbnRTb3VyY2luZ0l0ZW0pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQmF0Y2hFdmVudHMoc2NoZW1hTmFtZTogc3RyaW5nLCBldmVudExpc3Q6IEFycmF5PFBvRXZlbnRTb3VyY2luZ1N1bW1hcnlJdGVtPikge1xuICAgIGNvbnN0IGV2ZW50U291cmNpbmdMaXN0ID0gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nTGlzdChzY2hlbWFOYW1lLCBldmVudExpc3QpO1xuXG4gICAgYXdhaXQgdGhpcy5wb1N0b3JhZ2UuYXBwZW5kQXJyYXlUb0FycmF5KFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZSwgZXZlbnRTb3VyY2luZ0xpc3QpO1xuXG4gICAgdGhpcy5ub3RpZnlFdmVudENyZWF0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHLDs2kgYSBjaGF2ZSBkbyAqc3RvcmFnZSogcXVlIGNvbnTDqW0gYSBmaWxhIGRlIGRhZG9zIHF1ZSBlc3TDo28gZXNwZXJhbmRvIHBhcmEgc2VyZW0gZW52aWFkb3MgYW9cbiAgICogc2Vydmlkb3IgKihFdmVudFNvdXJjaW5nKSouXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhIGNoYXZlIHJlZmVyZW50ZSBhIGZpbGEgZGUgKkV2ZW50U291cmNpbmcqIGZvciBkZXN0cnXDrWRhLlxuICAgKi9cbiAgZGVzdHJveUV2ZW50U291cmNpbmdRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wb1N0b3JhZ2UucmVtb3ZlKFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZSk7XG4gIH1cblxuICBhc3luYyBodHRwQ29tbWFuZChodHRwT3BlcmF0aW9uRGF0YTogUG9IdHRwUmVxdWVzdERhdGEsIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaHR0cE9wZXJhdGlvbkRhdGEgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUJvZHkoaHR0cE9wZXJhdGlvbkRhdGEpO1xuXG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW0gPSB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxuICAgICAgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkh0dHAsXG4gICAgICBodHRwT3BlcmF0aW9uRGF0YSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XG4gICAgcmV0dXJuIGV2ZW50U291cmNpbmdJdGVtLmlkO1xuICB9XG5cbiAgcmVzcG9uc2VzU3ViamVjdCgpOiBPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgb25TYXZlRGF0YSgpOiBPYnNlcnZhYmxlPG51bGw+IHtcbiAgICBpZiAoIXRoaXMuZXZlbnRTdWIpIHtcbiAgICAgIHRoaXMuZXZlbnRTdWIgPSBPYnNlcnZhYmxlLmNyZWF0ZShzdWJzY3JpYmVyID0+ICh0aGlzLmVtaXR0ZXIgPSBzdWJzY3JpYmVyKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV2ZW50U3ViO1xuICB9XG5cbiAgcmVtb3ZlKHNjaGVtYU5hbWU6IHN0cmluZywgaXRlbVRvRGVsZXRlOiBhbnksIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW0gPSB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxuICAgICAgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkRlbGV0ZSxcbiAgICAgIGl0ZW1Ub0RlbGV0ZSxcbiAgICAgIHNjaGVtYU5hbWUsXG4gICAgICBjdXN0b21SZXF1ZXN0SWRcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XG4gIH1cblxuICByZW1vdmVFdmVudFNvdXJjaW5nSXRlbShpZEV2ZW50U291cmNpbmdJdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMucG9TdG9yYWdlLnJlbW92ZUl0ZW1Gcm9tQXJyYXkoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lLCAnaWQnLCBpZEV2ZW50U291cmNpbmdJdGVtKTtcbiAgfVxuXG4gIHN5bmNHZXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzeW5jR2V0RnVuY3Rpb24gPSBhc3luYyAoKSA9PlxuICAgICAgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0QWxsKCkudGhlbihzY2hlbWFzID0+IHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvbWlzZXMgPSB0aGlzLnVwZGF0ZVN0b3JhZ2VTY2hlbWFzKHNjaGVtYXMpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChzY2hlbWFQcm9taXNlcyk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZS5saW1pdGVkQ2FsbFdyYXAoc3luY0dldEZ1bmN0aW9uKTtcbiAgfVxuXG4gIGFzeW5jIHN5bmNTZW5kKCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc3luY1NlbmRGdW5jdGlvbiA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgY29uc3QgaXRlbU9mUXVldWUgPSBhd2FpdCB0aGlzLnBvU3RvcmFnZS5nZXRGaXJzdEl0ZW0oUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lKTtcblxuICAgICAgaWYgKGl0ZW1PZlF1ZXVlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0T3BlcmF0aW9uKGl0ZW1PZlF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RvcHBlZFF1ZXVlRXZlbnRTb3VyY2luZyB8fCAhaXRlbU9mUXVldWUpIHtcbiAgICAgICAgdGhpcy5zdG9wcGVkUXVldWVFdmVudFNvdXJjaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN5bmNTZW5kRnVuY3Rpb24oKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChzeW5jU2VuZEZ1bmN0aW9uKTtcbiAgfVxuXG4gIHVwZGF0ZShzY2hlbWFOYW1lOiBzdHJpbmcsIGl0ZW1VcGRhdGVkOiBhbnksIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW0gPSB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxuICAgICAgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLlVwZGF0ZSxcbiAgICAgIGl0ZW1VcGRhdGVkLFxuICAgICAgc2NoZW1hTmFtZSxcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTtcbiAgfVxuXG4gIC8qIEF2YWxpYSBzZSBvIGJvZHkgw6kgZG8gdGlwbyBGaWxlIGUgc2UgZm9yIGNvbnZlcnRlIHBhcmEgYmFzZTY0ICovXG4gIHByaXZhdGUgYXN5bmMgc2VyaWFsaXplQm9keShyZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEpOiBQcm9taXNlPFBvSHR0cFJlcXVlc3REYXRhPiB7XG4gICAgbGV0IHsgYm9keSwgbWltZVR5cGUsIGJvZHlUeXBlLCBmaWxlTmFtZSB9ID0gcmVxdWVzdERhdGE7XG5cbiAgICBpZiAoYm9keSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIGJvZHlUeXBlID0gJ0ZpbGUnO1xuICAgICAgbWltZVR5cGUgPSBib2R5LnR5cGU7XG4gICAgICBmaWxlTmFtZSA9IGJvZHkubmFtZTtcbiAgICAgIGJvZHkgPSBhd2FpdCB0b0Jhc2U2NChib2R5KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5yZXF1ZXN0RGF0YSwgYm9keSwgbWltZVR5cGUsIGJvZHlUeXBlLCBmaWxlTmFtZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFVybFBhcmFtcyhzY2hlbWE6IFBvU3luY1NjaGVtYSwgYmFzZVVybDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVNpemVQYXJhbU5hbWUoKX09JHtzY2hlbWEucGFnZVNpemV9YCk7XG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlUGFyYW1OYW1lKCl9PSR7cGFnZU51bWJlcn1gKTtcbiAgICByZXR1cm4gYCR7YmFzZVVybH0/JHtwYXJhbXMuam9pbignJicpfWA7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVjb3JkSWRFeGlzdHMocmVjb3JkSWQsIG9wZXJhdGlvbikge1xuICAgIGlmICghcmVjb3JkSWQpIHtcbiAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICBtZXNzYWdlOiAnSWRlbnRpZmllciBub3QgZGVmaW5lZCcsXG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uXG4gICAgICB9O1xuXG4gICAgICB0aHJvdyBuZXcgUG9FdmVudFNvdXJjaW5nRXJyb3JSZXNwb25zZShlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25jYXRQYWdlSXRlbXMocGFnZUFjdW11bGF0b3IsIHJlcXVlc3RCb2R5KTogeyBlbnRpdHk6IHN0cmluZzsgZGF0YTogQXJyYXk8YW55PiB9IHtcbiAgICBpZiAocmVxdWVzdEJvZHlbdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRJdGVtc0ZpZWxkTmFtZSgpXSkge1xuICAgICAgcGFnZUFjdW11bGF0b3IuZGF0YSA9IFsuLi5wYWdlQWN1bXVsYXRvci5kYXRhLCAuLi5yZXF1ZXN0Qm9keVt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldEl0ZW1zRmllbGROYW1lKCldXTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZ2VBY3VtdWxhdG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcbiAgICBvcGVyYXRpb246IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbixcbiAgICBuZXdJdGVtOiBhbnkgfCBQb0h0dHBSZXF1ZXN0RGF0YSxcbiAgICBzY2hlbWFOYW1lPzogc3RyaW5nLFxuICAgIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyxcbiAgICBpZD86IG51bWJlclxuICApOiBQb0V2ZW50U291cmNpbmdJdGVtIHtcbiAgICBpZiAoIXNjaGVtYU5hbWUgJiYgb3BlcmF0aW9uICE9PSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSHR0cCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb1N5bmNTY2hlbWEgaXMgbm90IGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBpZCA/IGlkIDogbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICBkYXRlVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgIHJlY29yZDogbmV3SXRlbSxcbiAgICAgIGN1c3RvbVJlcXVlc3RJZDogY3VzdG9tUmVxdWVzdElkXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRXZlbnRTb3VyY2luZ0xpc3QoXG4gICAgc2NoZW1hTmFtZTogc3RyaW5nLFxuICAgIGV2ZW50TGlzdDogQXJyYXk8UG9FdmVudFNvdXJjaW5nU3VtbWFyeUl0ZW0+XG4gICk6IEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+IHtcbiAgICByZXR1cm4gZXZlbnRMaXN0Lm1hcCgoZXZlbnRJdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIGluZGV4O1xuXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFdmVudFNvdXJjaW5nSXRlbShcbiAgICAgICAgZXZlbnRJdGVtLm9wZXJhdGlvbixcbiAgICAgICAgZXZlbnRJdGVtLnJlY29yZCxcbiAgICAgICAgc2NoZW1hTmFtZSxcbiAgICAgICAgZXZlbnRJdGVtLmN1c3RvbVJlcXVlc3RJZCxcbiAgICAgICAgaWRcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNjaGVtYVN5bmNDb25maWcoc2NoZW1hTmFtZSkge1xuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hTmFtZV0gPSB7XG4gICAgICBwYWdlOiB1bmRlZmluZWQsXG4gICAgICBjdXJyZW50VXJsRGlmZjogdW5kZWZpbmVkLFxuICAgICAgcmVzcG9uc2VEYXRlOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi5nZXQoZXZlbnRTb3VyY2luZ0l0ZW0uc2NoZW1hKTtcblxuICAgICAgY29uc3QgcmVjb3JkSWQgPSBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmRbc2NoZW1hLmlkRmllbGRdO1xuICAgICAgdGhpcy5jaGVja1JlY29yZElkRXhpc3RzKHJlY29yZElkLCBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uRGVsZXRlKTtcblxuICAgICAgY29uc3QgdXJsID0gUG9FdmVudFNvdXJjaW5nU2VydmljZS5nZXRVcmwoZXZlbnRTb3VyY2luZ0l0ZW0sIHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5ERUxFVEUpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRTZXJ2ZXJJdGVtKHVybCwgUG9IdHRwUmVxdWVzdFR5cGUuREVMRVRFKTtcblxuICAgICAgYXdhaXQgdGhpcy5yZW1vdmVFdmVudFNvdXJjaW5nVmFsaWRJdGVtKHJlc3BvbnNlLnN0YXR1cywgZXZlbnRTb3VyY2luZ0l0ZW0pO1xuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCByZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChldmVudFNvdXJjaW5nSXRlbSwgZXJyb3JSZXNwb25zZSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaWZmU2VydmVySXRlbXMoY3VycmVudFVybERpZmYpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxPYmplY3Q+PiB7XG4gICAgcmV0dXJuIHRoaXMucG9IdHRwQ2xpZW50LmdldChjdXJyZW50VXJsRGlmZik7XG4gIH1cblxuICBwcml2YXRlIGdldEJvZHlBbmREYXRlKHNjaGVtYU5hbWUsIHJlc3BvbnNlKTogYW55IHtcbiAgICBjb25zdCBnZXREYXRlRmllbGROYW1lID0gdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXREYXRlRmllbGROYW1lKCk7XG5cbiAgICBjb25zdCByZXNwb25zZVN5bmNEYXRlID0gcmVzcG9uc2UuYm9keVtnZXREYXRlRmllbGROYW1lXTtcblxuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hTmFtZV1bJ3Jlc3BvbnNlRGF0ZSddID0gcmVzcG9uc2VTeW5jRGF0ZTtcbiAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U2VydmVyRGlmZlJlY29yZHMoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIGJhc2VVcmw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaW5pdGlhbEFjdW11bGF0b3JQYWdlID0geyBlbnRpdHk6IHNjaGVtYS5uYW1lLCBkYXRhOiBbXSB9O1xuICAgIGNvbnN0IGRpZmZVcmwgPSB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsnY3VycmVudFVybERpZmYnXTtcblxuICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gYXdhaXQgdGhpcy5kaWZmU2VydmVySXRlbXMoZGlmZlVybClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmVzcG9uc2UgPT4gdGhpcy5nZXRCb2R5QW5kRGF0ZShzY2hlbWEubmFtZSwgcmVzcG9uc2UpKSxcbiAgICAgICAgZXhwYW5kKGRhdGEgPT4gdGhpcy5wYWdpbmF0ZVNjaGVtYURhdGEoZGF0YSwgc2NoZW1hLCBiYXNlVXJsKSksXG4gICAgICAgIHJlZHVjZShcbiAgICAgICAgICAocGFnZUFjdW11bGF0b3IsIHJlcXVlc3RCb2R5KSA9PiB0aGlzLmNvbmNhdFBhZ2VJdGVtcyhwYWdlQWN1bXVsYXRvciwgcmVxdWVzdEJvZHkpLFxuICAgICAgICAgIGluaXRpYWxBY3VtdWxhdG9yUGFnZVxuICAgICAgICApXG4gICAgICApXG4gICAgICAudG9Qcm9taXNlKCk7XG5cbiAgICByZXR1cm4gc2VydmVyUmVzcG9uc2UuZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaHR0cE9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8QXJyYXk8UG9FdmVudFNvdXJjaW5nSXRlbT4gfCBudW1iZXI+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWVzdERhdGE6IFBvSHR0cFJlcXVlc3REYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVQb0h0dHBSZXF1ZXN0RGF0YShcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLnVybCxcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLm1ldGhvZCxcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLFxuICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQuaGVhZGVyc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5wb0h0dHBDbGllbnQuY3JlYXRlUmVxdWVzdChyZXF1ZXN0RGF0YSkudG9Qcm9taXNlKCk7XG4gICAgICBjb25zdCBwb0h0dHBDb21tYW5kUmVzcG9uc2U6IFBvU3luY1Jlc3BvbnNlID0ge1xuICAgICAgICBpZDogZXZlbnRTb3VyY2luZ0l0ZW0uaWQsXG4gICAgICAgIGN1c3RvbVJlcXVlc3RJZDogZXZlbnRTb3VyY2luZ0l0ZW0uY3VzdG9tUmVxdWVzdElkLFxuICAgICAgICByZXF1ZXN0OiBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQsXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZVxuICAgICAgfTtcblxuICAgICAgdGhpcy5yZXNwb25zZVN1YmplY3QubmV4dChwb0h0dHBDb21tYW5kUmVzcG9uc2UpO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVFdmVudFNvdXJjaW5nVmFsaWRJdGVtKHJlc3BvbnNlLnN0YXR1cywgZXZlbnRTb3VyY2luZ0l0ZW0pO1xuICAgIH0gY2F0Y2ggKGVycm9ySHR0cENsaWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChldmVudFNvdXJjaW5nSXRlbSwgZXJyb3JIdHRwQ2xpZW50LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8QXJyYXk8UG9FdmVudFNvdXJjaW5nSXRlbT4+IHtcbiAgICBjb25zdCBldmVudFNvdXJjaW5nVXBkYXRlZFF1ZXVlID0gYXdhaXQgdGhpcy5wb1N0b3JhZ2UuYXBwZW5kSXRlbVRvQXJyYXkoXG4gICAgICBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUsXG4gICAgICBldmVudFNvdXJjaW5nSXRlbVxuICAgICk7XG5cbiAgICB0aGlzLm5vdGlmeUV2ZW50Q3JlYXRpb24oKTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXZlbnRTb3VyY2luZ1VwZGF0ZWRRdWV1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc2VydE9wZXJhdGlvbihjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uLmdldChjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0uc2NoZW1hKTtcbiAgICBjb25zdCB1cmwgPSBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmdldFVybChjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0sIHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5QT1NUKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFNlcnZlckl0ZW0odXJsLCBQb0h0dHBSZXF1ZXN0VHlwZS5QT1NULCBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkKTtcbiAgICAgIGNvbnN0IHJlY29yZFVwZGF0ZWRCeVNlcnZlciA9IHJlc3BvbnNlLmJvZHk7XG5cbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlRXZlbnRTb3VyY2luZ1ZhbGlkSXRlbShyZXNwb25zZS5zdGF0dXMsIGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSk7XG5cbiAgICAgIGNvbnN0IGlkID0gY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdO1xuICAgICAgYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UudXBkYXRlKHNjaGVtYSwgcmVjb3JkVXBkYXRlZEJ5U2VydmVyLCBpZCk7XG5cbiAgICAgIGNvbnN0IGV2ZW50U291cmNpbmdJdGVtczogQXJyYXk8UG9FdmVudFNvdXJjaW5nSXRlbT4gPSBhd2FpdCB0aGlzLnBvU3RvcmFnZS5nZXQoXG4gICAgICAgIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlUGVuZGluZ0V2ZW50U291cmNpbmcoXG4gICAgICAgIGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSxcbiAgICAgICAgc2NoZW1hLmlkRmllbGQsXG4gICAgICAgIHJlY29yZFVwZGF0ZWRCeVNlcnZlcixcbiAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW1zXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSwgcmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9ySHR0cENsaWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlc3BvbnNlU3ViamVjdChjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0sIGVycm9ySHR0cENsaWVudCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkU3RhdHVzKHN0YXR1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuVkFMSURfSFRUUF9TVEFUVVNfQ09ERVMuaW5jbHVkZXMoc3RhdHVzKTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5RXZlbnRDcmVhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbWl0dGVyKSB7XG4gICAgICB0aGlzLmVtaXR0ZXIubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFnaW5hdGVTY2hlbWFEYXRhKGRhdGEsIHNjaGVtYSwgYmFzZVVybCk6IE9ic2VydmFibGU8bnVsbD4ge1xuICAgIHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0udHJhbnNmb3JtKGRhdGEpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uaGFzTmV4dCgpKSB7XG4gICAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsnY3VycmVudFVybERpZmYnXSA9IHRoaXMuYnVpbGRVcmxQYXJhbXMoXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgYmFzZVVybCxcbiAgICAgICAgKyt0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsncGFnZSddXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdGhpcy5kaWZmU2VydmVySXRlbXModGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ2N1cnJlbnRVcmxEaWZmJ10pLnBpcGUoXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB0aGlzLmdldEJvZHlBbmREYXRlKHNjaGVtYS5uYW1lLCByZXNwb25zZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBvZigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFdmVudFNvdXJjaW5nVmFsaWRJdGVtKFxuICAgIHN0YXR1cyxcbiAgICBldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbVxuICApOiBQcm9taXNlPEFycmF5PFBvRXZlbnRTb3VyY2luZ0l0ZW0+PiB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZFN0YXR1cyhzdGF0dXMpIHx8IGV2ZW50U291cmNpbmdJdGVtLm9wZXJhdGlvbiA9PT0gUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkh0dHApIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdJdGVtKGV2ZW50U291cmNpbmdJdGVtLmlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdE9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8YW55PiB7XG4gICAgc3dpdGNoIChldmVudFNvdXJjaW5nSXRlbS5vcGVyYXRpb24pIHtcbiAgICAgIGNhc2UgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkluc2VydDpcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0T3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtKTtcblxuICAgICAgY2FzZSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uVXBkYXRlOlxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW0pO1xuXG4gICAgICBjYXNlIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5EZWxldGU6XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbSk7XG5cbiAgICAgIGNhc2UgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkh0dHA6XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VuZFJlc3BvbnNlU3ViamVjdChcbiAgICBldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSxcbiAgICByZXNwb25zZTogSHR0cFJlc3BvbnNlPE9iamVjdD4gfCBIdHRwRXJyb3JSZXNwb25zZSB8IFBvRXZlbnRTb3VyY2luZ0Vycm9yUmVzcG9uc2UsXG4gICAgaXNTdWJqZWN0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBvU3luY1Jlc3BvbnNlOiBQb1N5bmNSZXNwb25zZSA9IHtcbiAgICAgIGlkOiBldmVudFNvdXJjaW5nSXRlbS5pZCxcbiAgICAgIGN1c3RvbVJlcXVlc3RJZDogZXZlbnRTb3VyY2luZ0l0ZW0uY3VzdG9tUmVxdWVzdElkLFxuICAgICAgcmVxdWVzdDogZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkLFxuICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlXG4gICAgfTtcblxuICAgIHRoaXMuc3RvcHBlZFF1ZXVlRXZlbnRTb3VyY2luZyA9IGlzU3ViamVjdEVycm9yO1xuICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0Lm5leHQocG9TeW5jUmVzcG9uc2UpO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kU2VydmVySXRlbSh1cmw6IHN0cmluZywgbWV0aG9kOiBQb0h0dHBSZXF1ZXN0VHlwZSwgYm9keT86IFBvRXZlbnRTb3VyY2luZ0l0ZW1bJ3JlY29yZCddKSB7XG4gICAgY29uc3QgcmVxdWVzdERhdGE6IFBvSHR0cFJlcXVlc3REYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVQb0h0dHBSZXF1ZXN0RGF0YSh1cmwsIG1ldGhvZCwgYm9keSk7XG5cbiAgICByZXR1cm4gdGhpcy5wb0h0dHBDbGllbnQuY3JlYXRlUmVxdWVzdChyZXF1ZXN0RGF0YSkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVBvSHR0cFJlcXVlc3REYXRhKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG1ldGhvZDogUG9IdHRwUmVxdWVzdFR5cGUsXG4gICAgcmVjb3JkPzogUG9FdmVudFNvdXJjaW5nSXRlbVsncmVjb3JkJ10sXG4gICAgaGVhZGVycz86IEFycmF5PFBvSHR0cEhlYWRlck9wdGlvbj5cbiAgKTogUHJvbWlzZTxQb0h0dHBSZXF1ZXN0RGF0YT4ge1xuICAgIGxldCBib2R5ID0gcmVjb3JkLmJvZHkgPz8gcmVjb3JkO1xuXG4gICAgaWYgKHJlY29yZC5ib2R5VHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgICBib2R5ID0gYXdhaXQgdGhpcy5jcmVhdGVGb3JtRGF0YShib2R5LCByZWNvcmQuZmlsZU5hbWUsIHJlY29yZC5taW1lVHlwZSwgcmVjb3JkLmZvcm1GaWVsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdXJsLCBtZXRob2QsIGJvZHksIGhlYWRlcnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlRm9ybURhdGEoXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgbWltZVR5cGU6IHN0cmluZyxcbiAgICBmb3JtRmllbGQ6IHN0cmluZyA9ICdmaWxlJ1xuICApOiBQcm9taXNlPEZvcm1EYXRhPiB7XG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IHRvRmlsZShib2R5LCBmaWxlTmFtZSwgbWltZVR5cGUpO1xuICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgZm9ybURhdGEuYXBwZW5kKGZvcm1GaWVsZCwgZmlsZSwgZmlsZU5hbWUpO1xuICAgIHJldHVybiBmb3JtRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlT3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxBcnJheTxhbnk+IHwgbnVtYmVyPiB7XG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0KGV2ZW50U291cmNpbmdJdGVtLnNjaGVtYSk7XG4gICAgY29uc3QgdXJsID0gUG9FdmVudFNvdXJjaW5nU2VydmljZS5nZXRVcmwoZXZlbnRTb3VyY2luZ0l0ZW0sIHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5QQVRDSCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVjb3JkSWQgPSBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmRbc2NoZW1hLmlkRmllbGRdO1xuICAgICAgdGhpcy5jaGVja1JlY29yZElkRXhpc3RzKHJlY29yZElkLCBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uVXBkYXRlKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRTZXJ2ZXJJdGVtKHVybCwgUG9IdHRwUmVxdWVzdFR5cGUuUFVULCBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQpO1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdmVFdmVudFNvdXJjaW5nVmFsaWRJdGVtKHJlc3BvbnNlLnN0YXR1cywgZXZlbnRTb3VyY2luZ0l0ZW0pO1xuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCByZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyb3JIdHRwQ2xpZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCBlcnJvckh0dHBDbGllbnQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGVuZGluZ0V2ZW50U291cmNpbmcoXG4gICAgY3VycmVudEV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtLFxuICAgIGlkRmllbGRTY2hlbWE6IHN0cmluZyxcbiAgICBpbnNlcnRlZDogb2JqZWN0LFxuICAgIGV2ZW50U291cmNpbmdJdGVtczogQXJyYXk8UG9FdmVudFNvdXJjaW5nSXRlbT5cbiAgKSB7XG4gICAgaWYgKGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbS5yZWNvcmRbUG9TY2hlbWFVdGlsLnN5bmNJbnRlcm5hbElkRmllbGROYW1lXSkge1xuICAgICAgZXZlbnRTb3VyY2luZ0l0ZW1zLmZvckVhY2goKGV2ZW50U291cmNpbmdJdGVtLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBpc0N1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSA9XG4gICAgICAgICAgIWV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtpZEZpZWxkU2NoZW1hXSAmJlxuICAgICAgICAgIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdID09PVxuICAgICAgICAgICAgY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdO1xuXG4gICAgICAgIGlmIChpc0N1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSkge1xuICAgICAgICAgIGV2ZW50U291cmNpbmdJdGVtc1twb3NpdGlvbl0ucmVjb3JkW2lkRmllbGRTY2hlbWFdID0gaW5zZXJ0ZWRbaWRGaWVsZFNjaGVtYV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy5wb1N0b3JhZ2Uuc2V0KFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZSwgZXZlbnRTb3VyY2luZ0l0ZW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlUmVjb3JkcyhzZXJ2ZXJSZWNvcmRzOiBBcnJheTxhbnk+LCBzY2hlbWE6IFBvU3luY1NjaGVtYSkge1xuICAgIGZvciAoY29uc3Qgc2VydmVyUmVjb3JkIG9mIHNlcnZlclJlY29yZHMpIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlUmVjb3JkQnlTZXJ2ZXJSZWNvcmQoc2VydmVyUmVjb3JkLCBzY2hlbWEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlUmVjb3JkQnlTZXJ2ZXJSZWNvcmQoc2VydmVyUmVjb3JkLCBzY2hlbWEpIHtcbiAgICBjb25zdCByZWNvcmRJZCA9IHNlcnZlclJlY29yZFtzY2hlbWEuaWRGaWVsZF07XG4gICAgY29uc3Qgc3RvcmFnZVJlY29yZCA9IGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLmdldChzY2hlbWEubmFtZSwgcmVjb3JkSWQpO1xuICAgIGNvbnN0IGV4aXN0c1N0b3JhZ2VSZWNvcmQgPSAhIU9iamVjdC5rZXlzKHN0b3JhZ2VSZWNvcmQpLmxlbmd0aDtcblxuICAgIGlmIChleGlzdHNTdG9yYWdlUmVjb3JkICYmIHNlcnZlclJlY29yZFtzY2hlbWEuZGVsZXRlZEZpZWxkXSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLnJlbW92ZShzY2hlbWEubmFtZSwgc2VydmVyUmVjb3JkW3NjaGVtYS5pZEZpZWxkXSk7XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0c1N0b3JhZ2VSZWNvcmQgJiYgIXNlcnZlclJlY29yZFtzY2hlbWEuZGVsZXRlZEZpZWxkXSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLnVwZGF0ZShzY2hlbWEsIHNlcnZlclJlY29yZCk7XG4gICAgfVxuXG4gICAgaWYgKCFleGlzdHNTdG9yYWdlUmVjb3JkICYmICFzZXJ2ZXJSZWNvcmRbc2NoZW1hLmRlbGV0ZWRGaWVsZF0pIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5jcmVhdGUoc2NoZW1hLCBzZXJ2ZXJSZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlU3RvcmFnZUJ5U2NoZW1hKHNjaGVtYTogUG9TeW5jU2NoZW1hKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmNyZWF0ZVNjaGVtYVN5bmNDb25maWcoc2NoZW1hLm5hbWUpO1xuXG4gICAgdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ3BhZ2UnXSA9IDE7XG4gICAgY29uc3QgYmFzZVVybCA9IGAke1BvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkRJRkYpfS8ke3NjaGVtYS5sYXN0U3luY31gO1xuICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddID0gdGhpcy5idWlsZFVybFBhcmFtcyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIGJhc2VVcmwsXG4gICAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsncGFnZSddXG4gICAgKTtcblxuICAgIGNvbnN0IHNlcnZlclJlY29yZHMgPSBhd2FpdCB0aGlzLmdldFNlcnZlckRpZmZSZWNvcmRzKHNjaGVtYSwgYmFzZVVybCk7XG5cbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVJlY29yZHMoc2VydmVyUmVjb3Jkcywgc2NoZW1hKTtcblxuICAgIHNjaGVtYS5sYXN0U3luYyA9IHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydyZXNwb25zZURhdGUnXTtcbiAgICBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi51cGRhdGUoc2NoZW1hKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZVNjaGVtYXMoc2NoZW1hcyk6IEFycmF5PFByb21pc2U8QXJyYXk8YW55Pj4+IHtcbiAgICByZXR1cm4gc2NoZW1hcy5tYXAoKHNjaGVtYTogUG9TeW5jU2NoZW1hKSA9PiB0aGlzLnVwZGF0ZVN0b3JhZ2VCeVNjaGVtYShzY2hlbWEpKTtcbiAgfVxufVxuIl19