@po-ui/ng-sync 5.22.3 → 6.2.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.
- package/README.md +22 -22
- package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +15 -15
- package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +6 -6
- package/{esm2015/lib/models/po-data-message.model.js → esm2020/lib/models/po-data-message.model.mjs} +57 -57
- package/esm2020/lib/models/po-data-transform.model.mjs +22 -0
- package/esm2020/lib/models/po-entity/po-entity.model.mjs +214 -0
- package/{esm2015/lib/models/po-event-sourcing-error-response.model.js → esm2020/lib/models/po-event-sourcing-error-response.model.mjs} +17 -17
- package/{esm2015/lib/models/po-network-status.model.js → esm2020/lib/models/po-network-status.model.mjs} +44 -44
- package/{esm2015/lib/models/po-network-type.enum.js → esm2020/lib/models/po-network-type.enum.mjs} +30 -30
- package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +238 -0
- package/{esm2015/lib/models/po-request-type.enum.js → esm2020/lib/models/po-request-type.enum.mjs} +16 -16
- package/esm2020/lib/po-sync.module.mjs +45 -0
- package/{esm2015/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.js → esm2020/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs} +17 -17
- package/{esm2015/lib/services/po-event-sourcing/index.js → esm2020/lib/services/po-event-sourcing/index.mjs} +4 -4
- package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +2 -0
- package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +2 -0
- package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +372 -0
- package/{esm2015/lib/services/po-http-client/interfaces/po-http-header-option.interface.js → esm2020/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs} +11 -11
- package/esm2020/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +2 -0
- package/esm2020/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +2 -0
- package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +148 -0
- package/{esm2015/lib/services/po-http-client/po-http-request-type.enum.js → esm2020/lib/services/po-http-client/po-http-request-type.enum.mjs} +25 -25
- package/esm2020/lib/services/po-network/po-network.service.mjs +58 -0
- package/{esm2015/lib/services/po-schema/index.js → esm2020/lib/services/po-schema/index.mjs} +4 -4
- package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +77 -0
- package/{esm2015/lib/services/po-schema/po-schema-util/po-schema-util.model.js → esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs} +124 -124
- package/esm2020/lib/services/po-schema/po-schema.service.mjs +174 -0
- package/esm2020/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +2 -0
- package/esm2020/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +2 -0
- package/esm2020/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +2 -0
- package/esm2020/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +2 -0
- package/esm2020/lib/services/po-sync/po-sync.service.mjs +325 -0
- package/{esm2015/lib/utils/utils.js → esm2020/lib/utils/utils.mjs} +63 -63
- package/esm2020/po-ui-ng-sync.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +2 -2
- package/fesm2015/{po-ui-ng-sync.js → po-ui-ng-sync.mjs} +2074 -2058
- package/fesm2015/po-ui-ng-sync.mjs.map +1 -0
- package/fesm2020/po-ui-ng-sync.mjs +2018 -0
- package/fesm2020/po-ui-ng-sync.mjs.map +1 -0
- package/lib/index.d.ts +14 -14
- package/lib/models/index.d.ts +5 -5
- package/lib/models/po-data-message.model.d.ts +46 -46
- package/lib/models/po-data-transform.model.d.ts +52 -52
- package/lib/models/po-entity/po-entity.model.d.ts +122 -122
- package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
- package/lib/models/po-network-status.model.d.ts +25 -25
- package/lib/models/po-network-type.enum.d.ts +28 -28
- package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
- package/lib/models/po-request-type.enum.d.ts +14 -14
- package/lib/po-sync.module.d.ts +12 -7
- package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
- package/lib/services/po-event-sourcing/index.d.ts +3 -3
- package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
- package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
- package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +74 -71
- package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
- package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
- package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
- package/lib/services/po-http-client/po-http-client.service.d.ts +78 -75
- package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
- package/lib/services/po-network/po-network.service.d.ts +36 -33
- package/lib/services/po-schema/index.d.ts +3 -3
- package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +51 -48
- package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
- package/lib/services/po-schema/po-schema.service.d.ts +98 -95
- package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
- package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
- package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
- package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
- package/lib/services/po-sync/po-sync.service.d.ts +162 -159
- package/lib/utils/utils.d.ts +36 -36
- package/package.json +30 -15
- package/po-ui-ng-sync-6.2.0.tgz +0 -0
- package/po-ui-ng-sync.d.ts +5 -8
- package/public-api.d.ts +1 -1
- package/schematics/README.md +169 -169
- package/schematics/collection.json +15 -15
- package/schematics/migrations.json +30 -25
- package/schematics/ng-add/index.d.ts +7 -7
- package/schematics/ng-add/index.js +33 -33
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-add/index.spec.d.ts +1 -1
- package/schematics/ng-add/index.spec.js +62 -62
- package/schematics/ng-add/index.spec.js.map +1 -1
- package/schematics/ng-add/schema.json +7 -7
- package/schematics/ng-generate/schema/files/__path__/__name@dasherize__/__name@dasherize__.constants.ts.template +13 -13
- package/schematics/ng-generate/schema/index.d.ts +4 -4
- package/schematics/ng-generate/schema/index.js +12 -12
- package/schematics/ng-generate/schema/index.js.map +1 -1
- package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
- package/schematics/ng-generate/schema/index.spec.js +44 -44
- package/schematics/ng-generate/schema/index.spec.js.map +1 -1
- package/schematics/ng-generate/schema/schema.d.ts +3 -3
- package/schematics/ng-generate/schema/schema.js +2 -2
- package/schematics/ng-generate/schema/schema.json +31 -31
- package/schematics/ng-update/v2/changes.d.ts +8 -8
- package/schematics/ng-update/v2/changes.js +20 -20
- package/schematics/ng-update/v2/index.d.ts +5 -5
- package/schematics/ng-update/v2/index.js +101 -101
- package/schematics/ng-update/v2/index.js.map +1 -1
- package/schematics/ng-update/v3/changes.d.ts +2 -2
- package/schematics/ng-update/v3/changes.js +14 -14
- package/schematics/ng-update/v3/index.d.ts +1 -1
- package/schematics/ng-update/v3/index.js +16 -16
- package/schematics/ng-update/v3/index.js.map +1 -1
- package/schematics/ng-update/v4/changes.d.ts +2 -2
- package/schematics/ng-update/v4/changes.js +14 -14
- package/schematics/ng-update/v4/index.d.ts +1 -1
- package/schematics/ng-update/v4/index.js +15 -15
- package/schematics/ng-update/v4/index.js.map +1 -1
- package/schematics/ng-update/v5/changes.d.ts +2 -2
- package/schematics/ng-update/v5/changes.js +13 -13
- package/schematics/ng-update/v5/index.d.ts +1 -1
- package/schematics/ng-update/v5/index.js +15 -15
- package/schematics/ng-update/v5/index.js.map +1 -1
- package/schematics/ng-update/v6/changes.d.ts +2 -0
- package/schematics/ng-update/v6/changes.js +14 -0
- package/schematics/ng-update/v6/changes.js.map +1 -0
- package/schematics/ng-update/v6/index.d.ts +1 -0
- package/schematics/ng-update/v6/index.js +16 -0
- package/schematics/ng-update/v6/index.js.map +1 -0
- package/bundles/po-ui-ng-sync.umd.js +0 -3002
- package/bundles/po-ui-ng-sync.umd.js.map +0 -1
- package/esm2015/lib/models/po-data-transform.model.js +0 -22
- package/esm2015/lib/models/po-entity/po-entity.model.js +0 -229
- package/esm2015/lib/models/po-query-builder/po-query-builder.model.js +0 -241
- package/esm2015/lib/po-sync.module.js +0 -31
- package/esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.js +0 -2
- package/esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.js +0 -2
- package/esm2015/lib/services/po-event-sourcing/po-event-sourcing.service.js +0 -411
- package/esm2015/lib/services/po-http-client/interfaces/po-http-request-data.interface.js +0 -2
- package/esm2015/lib/services/po-http-client/interfaces/po-response-api.interface.js +0 -2
- package/esm2015/lib/services/po-http-client/po-http-client.service.js +0 -147
- package/esm2015/lib/services/po-network/po-network.service.js +0 -58
- package/esm2015/lib/services/po-schema/po-schema-definition/po-schema-definition.service.js +0 -80
- package/esm2015/lib/services/po-schema/po-schema.service.js +0 -198
- package/esm2015/lib/services/po-sync/interfaces/po-sync-config.interface.js +0 -2
- package/esm2015/lib/services/po-sync/interfaces/po-sync-field-options.interface.js +0 -2
- package/esm2015/lib/services/po-sync/interfaces/po-sync-response.interface.js +0 -2
- package/esm2015/lib/services/po-sync/interfaces/po-sync-schema.interface.js +0 -2
- package/esm2015/lib/services/po-sync/po-sync.service.js +0 -336
- package/esm2015/po-ui-ng-sync.js +0 -9
- package/fesm2015/po-ui-ng-sync.js.map +0 -1
- package/po-ui-ng-sync-5.22.3.tgz +0 -0
- package/po-ui-ng-sync.metadata.json +0 -1
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as HttpStatus 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
|
+
HttpStatus.OK,
|
|
359
|
+
HttpStatus.CREATED,
|
|
360
|
+
HttpStatus.ACCEPTED,
|
|
361
|
+
HttpStatus.NON_AUTHORITATIVE_INFORMATION,
|
|
362
|
+
HttpStatus.NO_CONTENT,
|
|
363
|
+
HttpStatus.RESET_CONTENT,
|
|
364
|
+
HttpStatus.PARTIAL_CONTENT,
|
|
365
|
+
HttpStatus.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tZXZlbnQtc291cmNpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxLQUFLLFVBQVUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUVuRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUtwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7QUFNbEYsTUFBTSxPQUFPLHNCQUFzQjtJQXVCakMsWUFDVSxrQkFBNkMsRUFDN0MsZUFBZ0MsRUFDaEMsU0FBMkIsRUFDM0IsWUFBaUM7UUFIakMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBWjNDLDhCQUF5QixHQUFZLEtBQUssQ0FB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QyxDQUFDLENBQUM7SUFDbkYsQ0FBQzs7QUE5aEJlLDBDQUFtQixHQUFXLGVBQWdCLENBQUE7QUFFdEMsOENBQXVCLEdBQUc7SUFDaEQsVUFBVSxDQUFDLEVBQUU7SUFDYixVQUFVLENBQUMsT0FBTztJQUNsQixVQUFVLENBQUMsUUFBUTtJQUNuQixVQUFVLENBQUMsNkJBQTZCO0lBQ3hDLFVBQVUsQ0FBQyxVQUFVO0lBQ3JCLFVBQVUsQ0FBQyxhQUFhO0lBQ3hCLFVBQVUsQ0FBQyxlQUFlO0lBQzFCLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTTtDQUM5QixDQUFBOzRGQVpTLHNCQUFzQjs0RUFBdEIsc0JBQXNCLFdBQXRCLHNCQUFzQjt1RkFBdEIsc0JBQXNCO2NBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwUmVzcG9uc2UsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBIdHRwU3RhdHVzIGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBleHBhbmQsIG1hcCwgcmVkdWNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBQb1N0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQHBvLXVpL25nLXN0b3JhZ2UnO1xuXG5pbXBvcnQgeyB0b0Jhc2U2NCwgdG9GaWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvLWV2ZW50LXNvdXJjaW5nLWVycm9yLXJlc3BvbnNlLm1vZGVsJztcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ0l0ZW0gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tZXZlbnQtc291cmNpbmctaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uIH0gZnJvbSAnLi9lbnVtcy9wby1ldmVudC1zb3VyY2luZy1vcGVyYXRpb24uZW51bSc7XG5pbXBvcnQgeyBQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1ldmVudC1zb3VyY2luZy1zdW1tYXJ5LWl0ZW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvSHR0cEhlYWRlck9wdGlvbiB9IGZyb20gJy4vLi4vcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1odHRwLWhlYWRlci1vcHRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvSHR0cENsaWVudFNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLWh0dHAtY2xpZW50L3BvLWh0dHAtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9IdHRwUmVxdWVzdERhdGEgfSBmcm9tICcuLi9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtcmVxdWVzdC1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb0h0dHBSZXF1ZXN0VHlwZSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L3BvLWh0dHAtcmVxdWVzdC10eXBlLmVudW0nO1xuaW1wb3J0IHsgUG9SZXF1ZXN0VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9wby1yZXF1ZXN0LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLWRlZmluaXRpb24vcG8tc2NoZW1hLWRlZmluaXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQb1NjaGVtYVNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBQb1NjaGVtYVV0aWwgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtdXRpbC9wby1zY2hlbWEtdXRpbC5tb2RlbCc7XG5pbXBvcnQgeyBQb1N5bmNDb25maWcgfSBmcm9tICcuLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvU3luY1Jlc3BvbnNlIH0gZnJvbSAnLi4vcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvU3luY1NjaGVtYSB9IGZyb20gJy4vLi4vcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtc2NoZW1hLmludGVyZmFjZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQb0V2ZW50U291cmNpbmdTZXJ2aWNlIHtcbiAgc3RhdGljIHJlYWRvbmx5IGV2ZW50X3NvdXJjaW5nX25hbWU6IHN0cmluZyA9ICdFdmVudFNvdXJjaW5nJztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBWQUxJRF9IVFRQX1NUQVRVU19DT0RFUyA9IFtcbiAgICBIdHRwU3RhdHVzLk9LLCAvLyAyMDBcbiAgICBIdHRwU3RhdHVzLkNSRUFURUQsIC8vIDIwMVxuICAgIEh0dHBTdGF0dXMuQUNDRVBURUQsIC8vIDIwMlxuICAgIEh0dHBTdGF0dXMuTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04sIC8vIDIwM1xuICAgIEh0dHBTdGF0dXMuTk9fQ09OVEVOVCwgLy8gMjA0XG4gICAgSHR0cFN0YXR1cy5SRVNFVF9DT05URU5ULCAvLyAyMDVcbiAgICBIdHRwU3RhdHVzLlBBUlRJQUxfQ09OVEVOVCwgLy8gMjA2XG4gICAgSHR0cFN0YXR1cy5NVUxUSV9TVEFUVVMgLy8gMjA3XG4gIF07XG5cbiAgY29uZmlnOiBQb1N5bmNDb25maWc7XG4gIHN0b3BwZWRRdWV1ZUV2ZW50U291cmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIGVtaXR0ZXI6IGFueTtcbiAgcHJpdmF0ZSBldmVudFN1YjogT2JzZXJ2YWJsZTxudWxsPjtcbiAgcHJpdmF0ZSByZXNwb25zZVN1YmplY3QgPSBuZXcgU3ViamVjdDxQb1N5bmNSZXNwb25zZT4oKTtcblxuICBwcml2YXRlIHNjaGVtYXNTeW5jQ29uZmlnID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwb1NjaGVtYURlZmluaXRpb246IFBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1NjaGVtYVNlcnZpY2U6IFBvU2NoZW1hU2VydmljZSxcbiAgICBwcml2YXRlIHBvU3RvcmFnZTogUG9TdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHBvSHR0cENsaWVudDogUG9IdHRwQ2xpZW50U2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0VXJsKGV2ZW50U291cmNpbmdJdGVtLCBzY2hlbWEsIHJlcXVlc3RUeXBlKTogc3RyaW5nIHtcbiAgICBjb25zdCBzY2hlbWFVcmwgPSBQb1NjaGVtYVV0aWwuZ2V0VXJsKHNjaGVtYSwgcmVxdWVzdFR5cGUpO1xuICAgIGNvbnN0IHNjaGVtYUlkID0gZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW3NjaGVtYS5pZEZpZWxkXTtcblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUG9SZXF1ZXN0VHlwZS5HRVQpIHtcbiAgICAgIHJldHVybiBzY2hlbWFVcmw7XG4gICAgfVxuXG4gICAgaWYgKFtQb1JlcXVlc3RUeXBlLkRFTEVURSwgUG9SZXF1ZXN0VHlwZS5QQVRDSF0uaW5jbHVkZXMocmVxdWVzdFR5cGUpKSB7XG4gICAgICByZXR1cm4gc2NoZW1hVXJsID8gYCR7c2NoZW1hVXJsfS8ke3NjaGVtYUlkfWAgOiBgJHtQb1NjaGVtYVV0aWwuZ2V0VXJsKHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5HRVQpfS8ke3NjaGVtYUlkfWA7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBQb1JlcXVlc3RUeXBlLlBPU1QpIHtcbiAgICAgIHJldHVybiBzY2hlbWFVcmwgPyBzY2hlbWFVcmwgOiBQb1NjaGVtYVV0aWwuZ2V0VXJsKHNjaGVtYSwgUG9SZXF1ZXN0VHlwZS5HRVQpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZShzY2hlbWFOYW1lOiBzdHJpbmcsIG5ld0l0ZW06IGFueSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXG4gICAgICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSW5zZXJ0LFxuICAgICAgbmV3SXRlbSxcbiAgICAgIHNjaGVtYU5hbWUsXG4gICAgICBjdXN0b21SZXF1ZXN0SWRcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmluc2VydEV2ZW50U291cmNpbmdRdWV1ZShldmVudFNvdXJjaW5nSXRlbSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCYXRjaEV2ZW50cyhzY2hlbWFOYW1lOiBzdHJpbmcsIGV2ZW50TGlzdDogQXJyYXk8UG9FdmVudFNvdXJjaW5nU3VtbWFyeUl0ZW0+KSB7XG4gICAgY29uc3QgZXZlbnRTb3VyY2luZ0xpc3QgPSB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdMaXN0KHNjaGVtYU5hbWUsIGV2ZW50TGlzdCk7XG5cbiAgICBhd2FpdCB0aGlzLnBvU3RvcmFnZS5hcHBlbmRBcnJheVRvQXJyYXkoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lLCBldmVudFNvdXJjaW5nTGlzdCk7XG5cbiAgICB0aGlzLm5vdGlmeUV2ZW50Q3JlYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0csOzaSBhIGNoYXZlIGRvICpzdG9yYWdlKiBxdWUgY29udMOpbSBhIGZpbGEgZGUgZGFkb3MgcXVlIGVzdMOjbyBlc3BlcmFuZG8gcGFyYSBzZXJlbSBlbnZpYWRvcyBhb1xuICAgKiBzZXJ2aWRvciAqKEV2ZW50U291cmNpbmcpKi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGEgY2hhdmUgcmVmZXJlbnRlIGEgZmlsYSBkZSAqRXZlbnRTb3VyY2luZyogZm9yIGRlc3RydcOtZGEuXG4gICAqL1xuICBkZXN0cm95RXZlbnRTb3VyY2luZ1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnBvU3RvcmFnZS5yZW1vdmUoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGh0dHBDb21tYW5kKGh0dHBPcGVyYXRpb25EYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBodHRwT3BlcmF0aW9uRGF0YSA9IGF3YWl0IHRoaXMuc2VyaWFsaXplQm9keShodHRwT3BlcmF0aW9uRGF0YSk7XG5cbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXG4gICAgICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSHR0cCxcbiAgICAgIGh0dHBPcGVyYXRpb25EYXRhLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY3VzdG9tUmVxdWVzdElkXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTtcbiAgICByZXR1cm4gZXZlbnRTb3VyY2luZ0l0ZW0uaWQ7XG4gIH1cblxuICByZXNwb25zZXNTdWJqZWN0KCk6IE9ic2VydmFibGU8UG9TeW5jUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBvblNhdmVEYXRhKCk6IE9ic2VydmFibGU8bnVsbD4ge1xuICAgIGlmICghdGhpcy5ldmVudFN1Yikge1xuICAgICAgdGhpcy5ldmVudFN1YiA9IE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4gKHRoaXMuZW1pdHRlciA9IHN1YnNjcmliZXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRTdWI7XG4gIH1cblxuICByZW1vdmUoc2NoZW1hTmFtZTogc3RyaW5nLCBpdGVtVG9EZWxldGU6IGFueSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXG4gICAgICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uRGVsZXRlLFxuICAgICAgaXRlbVRvRGVsZXRlLFxuICAgICAgc2NoZW1hTmFtZSxcbiAgICAgIGN1c3RvbVJlcXVlc3RJZFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50U291cmNpbmdJdGVtKGlkRXZlbnRTb3VyY2luZ0l0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5wb1N0b3JhZ2UucmVtb3ZlSXRlbUZyb21BcnJheShQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUsICdpZCcsIGlkRXZlbnRTb3VyY2luZ0l0ZW0pO1xuICB9XG5cbiAgc3luY0dldCgpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN5bmNHZXRGdW5jdGlvbiA9IGFzeW5jICgpID0+XG4gICAgICB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi5nZXRBbGwoKS50aGVuKHNjaGVtYXMgPT4ge1xuICAgICAgICBjb25zdCBzY2hlbWFQcm9taXNlcyA9IHRoaXMudXBkYXRlU3RvcmFnZVNjaGVtYXMoc2NoZW1hcyk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHNjaGVtYVByb21pc2VzKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChzeW5jR2V0RnVuY3Rpb24pO1xuICB9XG5cbiAgYXN5bmMgc3luY1NlbmQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzeW5jU2VuZEZ1bmN0aW9uID0gYXN5bmMgKCk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICBjb25zdCBpdGVtT2ZRdWV1ZSA9IGF3YWl0IHRoaXMucG9TdG9yYWdlLmdldEZpcnN0SXRlbShQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmV2ZW50X3NvdXJjaW5nX25hbWUpO1xuXG4gICAgICBpZiAoaXRlbU9mUXVldWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RPcGVyYXRpb24oaXRlbU9mUXVldWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdG9wcGVkUXVldWVFdmVudFNvdXJjaW5nIHx8ICFpdGVtT2ZRdWV1ZSkge1xuICAgICAgICB0aGlzLnN0b3BwZWRRdWV1ZUV2ZW50U291cmNpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3luY1NlbmRGdW5jdGlvbigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2UubGltaXRlZENhbGxXcmFwKHN5bmNTZW5kRnVuY3Rpb24pO1xuICB9XG5cbiAgdXBkYXRlKHNjaGVtYU5hbWU6IHN0cmluZywgaXRlbVVwZGF0ZWQ6IGFueSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBldmVudFNvdXJjaW5nSXRlbSA9IHRoaXMuY3JlYXRlRXZlbnRTb3VyY2luZ0l0ZW0oXG4gICAgICBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uVXBkYXRlLFxuICAgICAgaXRlbVVwZGF0ZWQsXG4gICAgICBzY2hlbWFOYW1lLFxuICAgICAgY3VzdG9tUmVxdWVzdElkXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRFdmVudFNvdXJjaW5nUXVldWUoZXZlbnRTb3VyY2luZ0l0ZW0pO1xuICB9XG5cbiAgLyogQXZhbGlhIHNlIG8gYm9keSDDqSBkbyB0aXBvIEZpbGUgZSBzZSBmb3IgY29udmVydGUgcGFyYSBiYXNlNjQgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXJpYWxpemVCb2R5KHJlcXVlc3REYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSk6IFByb21pc2U8UG9IdHRwUmVxdWVzdERhdGE+IHtcbiAgICBsZXQgeyBib2R5LCBtaW1lVHlwZSwgYm9keVR5cGUsIGZpbGVOYW1lIH0gPSByZXF1ZXN0RGF0YTtcblxuICAgIGlmIChib2R5IGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgYm9keVR5cGUgPSAnRmlsZSc7XG4gICAgICBtaW1lVHlwZSA9IGJvZHkudHlwZTtcbiAgICAgIGZpbGVOYW1lID0gYm9keS5uYW1lO1xuICAgICAgYm9keSA9IGF3YWl0IHRvQmFzZTY0KGJvZHkpO1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLnJlcXVlc3REYXRhLCBib2R5LCBtaW1lVHlwZSwgYm9keVR5cGUsIGZpbGVOYW1lIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVXJsUGFyYW1zKHNjaGVtYTogUG9TeW5jU2NoZW1hLCBiYXNlVXJsOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlU2l6ZVBhcmFtTmFtZSgpfT0ke3NjaGVtYS5wYWdlU2l6ZX1gKTtcbiAgICBwYXJhbXMucHVzaChgJHt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldFBhZ2VQYXJhbU5hbWUoKX09JHtwYWdlTnVtYmVyfWApO1xuICAgIHJldHVybiBgJHtiYXNlVXJsfT8ke3BhcmFtcy5qb2luKCcmJyl9YDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tSZWNvcmRJZEV4aXN0cyhyZWNvcmRJZCwgb3BlcmF0aW9uKSB7XG4gICAgaWYgKCFyZWNvcmRJZCkge1xuICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgIG1lc3NhZ2U6ICdJZGVudGlmaWVyIG5vdCBkZWZpbmVkJyxcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25cbiAgICAgIH07XG5cbiAgICAgIHRocm93IG5ldyBQb0V2ZW50U291cmNpbmdFcnJvclJlc3BvbnNlKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbmNhdFBhZ2VJdGVtcyhwYWdlQWN1bXVsYXRvciwgcmVxdWVzdEJvZHkpOiB7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0ge1xuICAgIGlmIChyZXF1ZXN0Qm9keVt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldEl0ZW1zRmllbGROYW1lKCldKSB7XG4gICAgICBwYWdlQWN1bXVsYXRvci5kYXRhID0gWy4uLnBhZ2VBY3VtdWxhdG9yLmRhdGEsIC4uLnJlcXVlc3RCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV1dO1xuICAgIH1cbiAgICByZXR1cm4gcGFnZUFjdW11bGF0b3I7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxuICAgIG9wZXJhdGlvbjogUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLFxuICAgIG5ld0l0ZW06IGFueSB8IFBvSHR0cFJlcXVlc3REYXRhLFxuICAgIHNjaGVtYU5hbWU/OiBzdHJpbmcsXG4gICAgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nLFxuICAgIGlkPzogbnVtYmVyXG4gICk6IFBvRXZlbnRTb3VyY2luZ0l0ZW0ge1xuICAgIGlmICghc2NoZW1hTmFtZSAmJiBvcGVyYXRpb24gIT09IFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5IdHRwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvU3luY1NjaGVtYSBpcyBub3QgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGlkID8gaWQgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgIGRhdGVUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgcmVjb3JkOiBuZXdJdGVtLFxuICAgICAgY3VzdG9tUmVxdWVzdElkOiBjdXN0b21SZXF1ZXN0SWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFdmVudFNvdXJjaW5nTGlzdChcbiAgICBzY2hlbWFOYW1lOiBzdHJpbmcsXG4gICAgZXZlbnRMaXN0OiBBcnJheTxQb0V2ZW50U291cmNpbmdTdW1tYXJ5SXRlbT5cbiAgKTogQXJyYXk8UG9FdmVudFNvdXJjaW5nSXRlbT4ge1xuICAgIHJldHVybiBldmVudExpc3QubWFwKChldmVudEl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgaW5kZXg7XG5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUV2ZW50U291cmNpbmdJdGVtKFxuICAgICAgICBldmVudEl0ZW0ub3BlcmF0aW9uLFxuICAgICAgICBldmVudEl0ZW0ucmVjb3JkLFxuICAgICAgICBzY2hlbWFOYW1lLFxuICAgICAgICBldmVudEl0ZW0uY3VzdG9tUmVxdWVzdElkLFxuICAgICAgICBpZFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2NoZW1hU3luY0NvbmZpZyhzY2hlbWFOYW1lKSB7XG4gICAgdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWFOYW1lXSA9IHtcbiAgICAgIHBhZ2U6IHVuZGVmaW5lZCxcbiAgICAgIGN1cnJlbnRVcmxEaWZmOiB1bmRlZmluZWQsXG4gICAgICByZXNwb25zZURhdGU6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8YW55PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uLmdldChldmVudFNvdXJjaW5nSXRlbS5zY2hlbWEpO1xuXG4gICAgICBjb25zdCByZWNvcmRJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XG4gICAgICB0aGlzLmNoZWNrUmVjb3JkSWRFeGlzdHMocmVjb3JkSWQsIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5EZWxldGUpO1xuXG4gICAgICBjb25zdCB1cmwgPSBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmdldFVybChldmVudFNvdXJjaW5nSXRlbSwgc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkRFTEVURSk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFNlcnZlckl0ZW0odXJsLCBQb0h0dHBSZXF1ZXN0VHlwZS5ERUxFVEUpO1xuXG4gICAgICBhd2FpdCB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBldmVudFNvdXJjaW5nSXRlbSk7XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIHJlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlcnJvclJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCBlcnJvclJlc3BvbnNlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpZmZTZXJ2ZXJJdGVtcyhjdXJyZW50VXJsRGlmZik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPE9iamVjdD4+IHtcbiAgICByZXR1cm4gdGhpcy5wb0h0dHBDbGllbnQuZ2V0KGN1cnJlbnRVcmxEaWZmKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Qm9keUFuZERhdGUoc2NoZW1hTmFtZSwgcmVzcG9uc2UpOiBhbnkge1xuICAgIGNvbnN0IGdldERhdGVGaWVsZE5hbWUgPSB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldERhdGVGaWVsZE5hbWUoKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlU3luY0RhdGUgPSByZXNwb25zZS5ib2R5W2dldERhdGVGaWVsZE5hbWVdO1xuXG4gICAgdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWFOYW1lXVsncmVzcG9uc2VEYXRlJ10gPSByZXNwb25zZVN5bmNEYXRlO1xuICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRTZXJ2ZXJEaWZmUmVjb3JkcyhzY2hlbWE6IFBvU3luY1NjaGVtYSwgYmFzZVVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpbml0aWFsQWN1bXVsYXRvclBhZ2UgPSB7IGVudGl0eTogc2NoZW1hLm5hbWUsIGRhdGE6IFtdIH07XG4gICAgY29uc3QgZGlmZlVybCA9IHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddO1xuXG4gICAgY29uc3Qgc2VydmVyUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmRpZmZTZXJ2ZXJJdGVtcyhkaWZmVXJsKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB0aGlzLmdldEJvZHlBbmREYXRlKHNjaGVtYS5uYW1lLCByZXNwb25zZSkpLFxuICAgICAgICBleHBhbmQoZGF0YSA9PiB0aGlzLnBhZ2luYXRlU2NoZW1hRGF0YShkYXRhLCBzY2hlbWEsIGJhc2VVcmwpKSxcbiAgICAgICAgcmVkdWNlKFxuICAgICAgICAgIChwYWdlQWN1bXVsYXRvciwgcmVxdWVzdEJvZHkpID0+IHRoaXMuY29uY2F0UGFnZUl0ZW1zKHBhZ2VBY3VtdWxhdG9yLCByZXF1ZXN0Qm9keSksXG4gICAgICAgICAgaW5pdGlhbEFjdW11bGF0b3JQYWdlXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKTtcblxuICAgIHJldHVybiBzZXJ2ZXJSZXNwb25zZS5kYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBodHRwT3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPiB8IG51bWJlcj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEgPSBhd2FpdCB0aGlzLmNyZWF0ZVBvSHR0cFJlcXVlc3REYXRhKFxuICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQudXJsLFxuICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQubWV0aG9kLFxuICAgICAgICBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQsXG4gICAgICAgIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZC5oZWFkZXJzXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnBvSHR0cENsaWVudC5jcmVhdGVSZXF1ZXN0KHJlcXVlc3REYXRhKS50b1Byb21pc2UoKTtcbiAgICAgIGNvbnN0IHBvSHR0cENvbW1hbmRSZXNwb25zZTogUG9TeW5jUmVzcG9uc2UgPSB7XG4gICAgICAgIGlkOiBldmVudFNvdXJjaW5nSXRlbS5pZCxcbiAgICAgICAgY3VzdG9tUmVxdWVzdElkOiBldmVudFNvdXJjaW5nSXRlbS5jdXN0b21SZXF1ZXN0SWQsXG4gICAgICAgIHJlcXVlc3Q6IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnJlc3BvbnNlU3ViamVjdC5uZXh0KHBvSHR0cENvbW1hbmRSZXNwb25zZSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBldmVudFNvdXJjaW5nSXRlbSk7XG4gICAgfSBjYXRjaCAoZXJyb3JIdHRwQ2xpZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGV2ZW50U291cmNpbmdJdGVtLCBlcnJvckh0dHBDbGllbnQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0RXZlbnRTb3VyY2luZ1F1ZXVlKGV2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPj4ge1xuICAgIGNvbnN0IGV2ZW50U291cmNpbmdVcGRhdGVkUXVldWUgPSBhd2FpdCB0aGlzLnBvU3RvcmFnZS5hcHBlbmRJdGVtVG9BcnJheShcbiAgICAgIFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZXZlbnRfc291cmNpbmdfbmFtZSxcbiAgICAgIGV2ZW50U291cmNpbmdJdGVtXG4gICAgKTtcblxuICAgIHRoaXMubm90aWZ5RXZlbnRDcmVhdGlvbigpO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShldmVudFNvdXJjaW5nVXBkYXRlZFF1ZXVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0T3BlcmF0aW9uKGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbTogUG9FdmVudFNvdXJjaW5nSXRlbSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb24uZ2V0KGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbS5zY2hlbWEpO1xuICAgIGNvbnN0IHVybCA9IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuZ2V0VXJsKGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSwgc2NoZW1hLCBQb1JlcXVlc3RUeXBlLlBPU1QpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kU2VydmVySXRlbSh1cmwsIFBvSHR0cFJlcXVlc3RUeXBlLlBPU1QsIGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbS5yZWNvcmQpO1xuICAgICAgY29uc3QgcmVjb3JkVXBkYXRlZEJ5U2VydmVyID0gcmVzcG9uc2UuYm9keTtcblxuICAgICAgYXdhaXQgdGhpcy5yZW1vdmVFdmVudFNvdXJjaW5nVmFsaWRJdGVtKHJlc3BvbnNlLnN0YXR1cywgY3VycmVudEV2ZW50U291cmNpbmdJdGVtKTtcblxuICAgICAgY29uc3QgaWQgPSBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW1BvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZV07XG4gICAgICBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS51cGRhdGUoc2NoZW1hLCByZWNvcmRVcGRhdGVkQnlTZXJ2ZXIsIGlkKTtcblxuICAgICAgY29uc3QgZXZlbnRTb3VyY2luZ0l0ZW1zOiBBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPiA9IGF3YWl0IHRoaXMucG9TdG9yYWdlLmdldChcbiAgICAgICAgUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVQZW5kaW5nRXZlbnRTb3VyY2luZyhcbiAgICAgICAgY3VycmVudEV2ZW50U291cmNpbmdJdGVtLFxuICAgICAgICBzY2hlbWEuaWRGaWVsZCxcbiAgICAgICAgcmVjb3JkVXBkYXRlZEJ5U2VydmVyLFxuICAgICAgICBldmVudFNvdXJjaW5nSXRlbXNcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoY3VycmVudEV2ZW50U291cmNpbmdJdGVtLCByZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyb3JIdHRwQ2xpZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kUmVzcG9uc2VTdWJqZWN0KGN1cnJlbnRFdmVudFNvdXJjaW5nSXRlbSwgZXJyb3JIdHRwQ2xpZW50LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTdGF0dXMoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gUG9FdmVudFNvdXJjaW5nU2VydmljZS5WQUxJRF9IVFRQX1NUQVRVU19DT0RFUy5pbmNsdWRlcyhzdGF0dXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlFdmVudENyZWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVtaXR0ZXIpIHtcbiAgICAgIHRoaXMuZW1pdHRlci5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYWdpbmF0ZVNjaGVtYURhdGEoZGF0YSwgc2NoZW1hLCBiYXNlVXJsKTogT2JzZXJ2YWJsZTxudWxsPiB7XG4gICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS50cmFuc2Zvcm0oZGF0YSk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5oYXNOZXh0KCkpIHtcbiAgICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydjdXJyZW50VXJsRGlmZiddID0gdGhpcy5idWlsZFVybFBhcmFtcyhcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBiYXNlVXJsLFxuICAgICAgICArK3RoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydwYWdlJ11cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB0aGlzLmRpZmZTZXJ2ZXJJdGVtcyh0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsnY3VycmVudFVybERpZmYnXSkucGlwZShcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHRoaXMuZ2V0Qm9keUFuZERhdGUoc2NoZW1hLm5hbWUsIHJlc3BvbnNlKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0oXG4gICAgc3RhdHVzLFxuICAgIGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtXG4gICk6IFByb21pc2U8QXJyYXk8UG9FdmVudFNvdXJjaW5nSXRlbT4+IHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU3RhdHVzKHN0YXR1cykgfHwgZXZlbnRTb3VyY2luZ0l0ZW0ub3BlcmF0aW9uID09PSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSHR0cCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRTb3VyY2luZ0l0ZW0oZXZlbnRTb3VyY2luZ0l0ZW0uaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0T3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtKTogUHJvbWlzZTxhbnk+IHtcbiAgICBzd2l0Y2ggKGV2ZW50U291cmNpbmdJdGVtLm9wZXJhdGlvbikge1xuICAgICAgY2FzZSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSW5zZXJ0OlxuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW0pO1xuXG4gICAgICBjYXNlIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5VcGRhdGU6XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbSk7XG5cbiAgICAgIGNhc2UgUG9FdmVudFNvdXJjaW5nT3BlcmF0aW9uLkRlbGV0ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlT3BlcmF0aW9uKGV2ZW50U291cmNpbmdJdGVtKTtcblxuICAgICAgY2FzZSBQb0V2ZW50U291cmNpbmdPcGVyYXRpb24uSHR0cDpcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cE9wZXJhdGlvbihldmVudFNvdXJjaW5nSXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZW5kUmVzcG9uc2VTdWJqZWN0KFxuICAgIGV2ZW50U291cmNpbmdJdGVtOiBQb0V2ZW50U291cmNpbmdJdGVtLFxuICAgIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8T2JqZWN0PiB8IEh0dHBFcnJvclJlc3BvbnNlIHwgUG9FdmVudFNvdXJjaW5nRXJyb3JSZXNwb25zZSxcbiAgICBpc1N1YmplY3RFcnJvcjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcG9TeW5jUmVzcG9uc2U6IFBvU3luY1Jlc3BvbnNlID0ge1xuICAgICAgaWQ6IGV2ZW50U291cmNpbmdJdGVtLmlkLFxuICAgICAgY3VzdG9tUmVxdWVzdElkOiBldmVudFNvdXJjaW5nSXRlbS5jdXN0b21SZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0OiBldmVudFNvdXJjaW5nSXRlbS5yZWNvcmQsXG4gICAgICByZXNwb25zZTogcmVzcG9uc2VcbiAgICB9O1xuXG4gICAgdGhpcy5zdG9wcGVkUXVldWVFdmVudFNvdXJjaW5nID0gaXNTdWJqZWN0RXJyb3I7XG4gICAgdGhpcy5yZXNwb25zZVN1YmplY3QubmV4dChwb1N5bmNSZXNwb25zZSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRTZXJ2ZXJJdGVtKHVybDogc3RyaW5nLCBtZXRob2Q6IFBvSHR0cFJlcXVlc3RUeXBlLCBib2R5PzogUG9FdmVudFNvdXJjaW5nSXRlbVsncmVjb3JkJ10pIHtcbiAgICBjb25zdCByZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEgPSBhd2FpdCB0aGlzLmNyZWF0ZVBvSHR0cFJlcXVlc3REYXRhKHVybCwgbWV0aG9kLCBib2R5KTtcblxuICAgIHJldHVybiB0aGlzLnBvSHR0cENsaWVudC5jcmVhdGVSZXF1ZXN0KHJlcXVlc3REYXRhKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlUG9IdHRwUmVxdWVzdERhdGEoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgbWV0aG9kOiBQb0h0dHBSZXF1ZXN0VHlwZSxcbiAgICByZWNvcmQ/OiBQb0V2ZW50U291cmNpbmdJdGVtWydyZWNvcmQnXSxcbiAgICBoZWFkZXJzPzogQXJyYXk8UG9IdHRwSGVhZGVyT3B0aW9uPlxuICApOiBQcm9taXNlPFBvSHR0cFJlcXVlc3REYXRhPiB7XG4gICAgbGV0IGJvZHkgPSByZWNvcmQuYm9keSA/PyByZWNvcmQ7XG5cbiAgICBpZiAocmVjb3JkLmJvZHlUeXBlID09PSAnRmlsZScpIHtcbiAgICAgIGJvZHkgPSBhd2FpdCB0aGlzLmNyZWF0ZUZvcm1EYXRhKGJvZHksIHJlY29yZC5maWxlTmFtZSwgcmVjb3JkLm1pbWVUeXBlLCByZWNvcmQuZm9ybUZpZWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB1cmwsIG1ldGhvZCwgYm9keSwgaGVhZGVycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVGb3JtRGF0YShcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICBtaW1lVHlwZTogc3RyaW5nLFxuICAgIGZvcm1GaWVsZDogc3RyaW5nID0gJ2ZpbGUnXG4gICk6IFByb21pc2U8Rm9ybURhdGE+IHtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdG9GaWxlKGJvZHksIGZpbGVOYW1lLCBtaW1lVHlwZSk7XG4gICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoZm9ybUZpZWxkLCBmaWxlLCBmaWxlTmFtZSk7XG4gICAgcmV0dXJuIGZvcm1EYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVPcGVyYXRpb24oZXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0pOiBQcm9taXNlPEFycmF5PGFueT4gfCBudW1iZXI+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvbi5nZXQoZXZlbnRTb3VyY2luZ0l0ZW0uc2NoZW1hKTtcbiAgICBjb25zdCB1cmwgPSBQb0V2ZW50U291cmNpbmdTZXJ2aWNlLmdldFVybChldmVudFNvdXJjaW5nSXRlbSwgc2NoZW1hLCBQb1JlcXVlc3RUeXBlLlBBVENIKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWNvcmRJZCA9IGV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtzY2hlbWEuaWRGaWVsZF07XG4gICAgICB0aGlzLmNoZWNrUmVjb3JkSWRFeGlzdHMocmVjb3JkSWQsIFBvRXZlbnRTb3VyY2luZ09wZXJhdGlvbi5VcGRhdGUpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFNlcnZlckl0ZW0odXJsLCBQb0h0dHBSZXF1ZXN0VHlwZS5QVVQsIGV2ZW50U291cmNpbmdJdGVtLnJlY29yZCk7XG4gICAgICBhd2FpdCB0aGlzLnJlbW92ZUV2ZW50U291cmNpbmdWYWxpZEl0ZW0ocmVzcG9uc2Uuc3RhdHVzLCBldmVudFNvdXJjaW5nSXRlbSk7XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIHJlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlcnJvckh0dHBDbGllbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRSZXNwb25zZVN1YmplY3QoZXZlbnRTb3VyY2luZ0l0ZW0sIGVycm9ySHR0cENsaWVudCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQZW5kaW5nRXZlbnRTb3VyY2luZyhcbiAgICBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW06IFBvRXZlbnRTb3VyY2luZ0l0ZW0sXG4gICAgaWRGaWVsZFNjaGVtYTogc3RyaW5nLFxuICAgIGluc2VydGVkOiBvYmplY3QsXG4gICAgZXZlbnRTb3VyY2luZ0l0ZW1zOiBBcnJheTxQb0V2ZW50U291cmNpbmdJdGVtPlxuICApIHtcbiAgICBpZiAoY3VycmVudEV2ZW50U291cmNpbmdJdGVtLnJlY29yZFtQb1NjaGVtYVV0aWwuc3luY0ludGVybmFsSWRGaWVsZE5hbWVdKSB7XG4gICAgICBldmVudFNvdXJjaW5nSXRlbXMuZm9yRWFjaCgoZXZlbnRTb3VyY2luZ0l0ZW0sIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzQ3VycmVudEV2ZW50U291cmNpbmdJdGVtID1cbiAgICAgICAgICAhZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW2lkRmllbGRTY2hlbWFdICYmXG4gICAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW1BvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZV0gPT09XG4gICAgICAgICAgICBjdXJyZW50RXZlbnRTb3VyY2luZ0l0ZW0ucmVjb3JkW1BvU2NoZW1hVXRpbC5zeW5jSW50ZXJuYWxJZEZpZWxkTmFtZV07XG5cbiAgICAgICAgaWYgKGlzQ3VycmVudEV2ZW50U291cmNpbmdJdGVtKSB7XG4gICAgICAgICAgZXZlbnRTb3VyY2luZ0l0ZW1zW3Bvc2l0aW9uXS5yZWNvcmRbaWRGaWVsZFNjaGVtYV0gPSBpbnNlcnRlZFtpZEZpZWxkU2NoZW1hXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnBvU3RvcmFnZS5zZXQoUG9FdmVudFNvdXJjaW5nU2VydmljZS5ldmVudF9zb3VyY2luZ19uYW1lLCBldmVudFNvdXJjaW5nSXRlbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWNvcmRzKHNlcnZlclJlY29yZHM6IEFycmF5PGFueT4sIHNjaGVtYTogUG9TeW5jU2NoZW1hKSB7XG4gICAgZm9yIChjb25zdCBzZXJ2ZXJSZWNvcmQgb2Ygc2VydmVyUmVjb3Jkcykge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVSZWNvcmRCeVNlcnZlclJlY29yZChzZXJ2ZXJSZWNvcmQsIHNjaGVtYSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSZWNvcmRCeVNlcnZlclJlY29yZChzZXJ2ZXJSZWNvcmQsIHNjaGVtYSkge1xuICAgIGNvbnN0IHJlY29yZElkID0gc2VydmVyUmVjb3JkW3NjaGVtYS5pZEZpZWxkXTtcbiAgICBjb25zdCBzdG9yYWdlUmVjb3JkID0gYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UuZ2V0KHNjaGVtYS5uYW1lLCByZWNvcmRJZCk7XG4gICAgY29uc3QgZXhpc3RzU3RvcmFnZVJlY29yZCA9ICEhT2JqZWN0LmtleXMoc3RvcmFnZVJlY29yZCkubGVuZ3RoO1xuXG4gICAgaWYgKGV4aXN0c1N0b3JhZ2VSZWNvcmQgJiYgc2VydmVyUmVjb3JkW3NjaGVtYS5kZWxldGVkRmllbGRdKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UucmVtb3ZlKHNjaGVtYS5uYW1lLCBzZXJ2ZXJSZWNvcmRbc2NoZW1hLmlkRmllbGRdKTtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RzU3RvcmFnZVJlY29yZCAmJiAhc2VydmVyUmVjb3JkW3NjaGVtYS5kZWxldGVkRmllbGRdKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UudXBkYXRlKHNjaGVtYSwgc2VydmVyUmVjb3JkKTtcbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0c1N0b3JhZ2VSZWNvcmQgJiYgIXNlcnZlclJlY29yZFtzY2hlbWEuZGVsZXRlZEZpZWxkXSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucG9TY2hlbWFTZXJ2aWNlLmNyZWF0ZShzY2hlbWEsIHNlcnZlclJlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVTdG9yYWdlQnlTY2hlbWEoc2NoZW1hOiBQb1N5bmNTY2hlbWEpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuY3JlYXRlU2NoZW1hU3luY0NvbmZpZyhzY2hlbWEubmFtZSk7XG5cbiAgICB0aGlzLnNjaGVtYXNTeW5jQ29uZmlnW3NjaGVtYS5uYW1lXVsncGFnZSddID0gMTtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7UG9TY2hlbWFVdGlsLmdldFVybChzY2hlbWEsIFBvUmVxdWVzdFR5cGUuRElGRil9LyR7c2NoZW1hLmxhc3RTeW5jfWA7XG4gICAgdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ2N1cnJlbnRVcmxEaWZmJ10gPSB0aGlzLmJ1aWxkVXJsUGFyYW1zKFxuICAgICAgc2NoZW1hLFxuICAgICAgYmFzZVVybCxcbiAgICAgIHRoaXMuc2NoZW1hc1N5bmNDb25maWdbc2NoZW1hLm5hbWVdWydwYWdlJ11cbiAgICApO1xuXG4gICAgY29uc3Qgc2VydmVyUmVjb3JkcyA9IGF3YWl0IHRoaXMuZ2V0U2VydmVyRGlmZlJlY29yZHMoc2NoZW1hLCBiYXNlVXJsKTtcblxuICAgIGF3YWl0IHRoaXMudXBkYXRlUmVjb3JkcyhzZXJ2ZXJSZWNvcmRzLCBzY2hlbWEpO1xuXG4gICAgc2NoZW1hLmxhc3RTeW5jID0gdGhpcy5zY2hlbWFzU3luY0NvbmZpZ1tzY2hlbWEubmFtZV1bJ3Jlc3BvbnNlRGF0ZSddO1xuICAgIGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uLnVwZGF0ZShzY2hlbWEpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yYWdlU2NoZW1hcyhzY2hlbWFzKTogQXJyYXk8UHJvbWlzZTxBcnJheTxhbnk+Pj4ge1xuICAgIHJldHVybiBzY2hlbWFzLm1hcCgoc2NoZW1hOiBQb1N5bmNTY2hlbWEpID0+IHRoaXMudXBkYXRlU3RvcmFnZUJ5U2NoZW1hKHNjaGVtYSkpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @docsPrivate
|
|
3
|
-
*
|
|
4
|
-
* @usedBy PoHttpClientService
|
|
5
|
-
*
|
|
6
|
-
* @description
|
|
7
|
-
*
|
|
8
|
-
* Define o cabeçalho da requisição HTTP.
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
/**
|
|
2
|
+
* @docsPrivate
|
|
3
|
+
*
|
|
4
|
+
* @usedBy PoHttpClientService
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
*
|
|
8
|
+
* Define o cabeçalho da requisição HTTP.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8taHR0cC1oZWFkZXItb3B0aW9uLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkb2NzUHJpdmF0ZVxuICpcbiAqIEB1c2VkQnkgUG9IdHRwQ2xpZW50U2VydmljZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIERlZmluZSBvIGNhYmXDp2FsaG8gZGEgcmVxdWlzacOnw6NvIEhUVFAuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBQb0h0dHBIZWFkZXJPcHRpb24ge1xuICAvKiogTm9tZSBkbyBjYWJlw6dhbGhvLiAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFZhbG9yIGRvIGNhYmXDp2FsaG8uICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLWh0dHAtY2xpZW50L2ludGVyZmFjZXMvcG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb0h0dHBIZWFkZXJPcHRpb24gfSBmcm9tICcuL3BvLWh0dHAtaGVhZGVyLW9wdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9IdHRwUmVxdWVzdFR5cGUgfSBmcm9tICcuLy4uL3BvLWh0dHAtcmVxdWVzdC10eXBlLmVudW0nO1xuXG4vKipcbiAqIEB1c2VkQnkgUG9TeW5jU2VydmljZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEludGVyZmFjZSBwYXJhIGRlZmluacOnw6NvIGRlIHVtYSByZXF1aXNpw6fDo28gSFRUUC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb0h0dHBSZXF1ZXN0RGF0YSB7XG4gIC8qKiBVUkwgcXVlIHNlcsOhIHV0aWxpemFkYSBuYSByZXF1aXNpw6fDo28uICovXG4gIHVybDogc3RyaW5nO1xuXG4gIC8qKiBDYWJlw6dhbGhvIGRhIHJlcXVpc2nDp8Ojby4gKi9cbiAgaGVhZGVycz86IEFycmF5PFBvSHR0cEhlYWRlck9wdGlvbj47XG5cbiAgLyoqIE3DqXRvZG8gSFRUUCBxdWUgc2Vyw6EgdXRpbGl6YWRvLiAqL1xuICBtZXRob2Q6IFBvSHR0cFJlcXVlc3RUeXBlO1xuXG4gIC8qKiBDb3JwbyBkYSByZXF1aXNpw6fDo28uICovXG4gIGJvZHk/OiBhbnk7XG5cbiAgLyoqIE5vbWUgZGEgcHJvcHJpZWRhZGUgcXVlIGNvbnRlcsOhIG8gYXJxdWl2byBlbnZpYWRvIHBhcmEgbyBzZXJ2aWRvciAqL1xuICBmb3JtRmllbGQ/OiBzdHJpbmc7XG5cbiAgLy8gVGlwbyBkbyBib2R5XG4gIGJvZHlUeXBlPzogc3RyaW5nO1xuXG4gIC8vIE1pbWVUeXBlIGRhIHJlcXVpc2nDp8OjbyBjYXNvIHNlamEgdW0gYXJxdWl2b1xuICBtaW1lVHlwZT86IHN0cmluZztcblxuICAvLyBOb21lIGRvIGFycXVpdm9cbiAgZmlsZU5hbWU/OiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcmVzcG9uc2UtYXBpLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1odHRwLWNsaWVudC9pbnRlcmZhY2VzL3BvLXJlc3BvbnNlLWFwaS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHVzZWRCeSBQb1F1ZXJ5QnVpbGRlclxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEludGVyZmFjZSBxdWUgcmVwcmVzZW50YSBhIGVzdHJ1dHVyYSBkZSByZXNwb3N0YSBkZSB1bWEgY29sZcOnw6NvIGRlIGl0ZW5zLlxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb1Jlc3BvbnNlQXBpIHtcbiAgLyoqIExpc3RhIGRlIGl0ZW5zIHJldG9ybmFkb3MuICovXG4gIGl0ZW1zOiBBcnJheTxvYmplY3Q+O1xuXG4gIC8qKiBJbmRpY2Egc2UgZXhpc3RlIHVtYSBwcsOzeGltYSBww6FnaW5hIGNvbSBtYWlzIHJlZ2lzdHJvcyBwYXJhIGFxdWVsYSBjb2xlw6fDo28gZGUgaXRlbnMuICovXG4gIGhhc05leHQ6IGJvb2xlYW47XG59XG4iXX0=
|