keez-invoicing 1.1.5
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/LICENSE +28 -0
- package/README.md +366 -0
- package/dist/coverage/lcov-report/block-navigation.js +71 -0
- package/dist/coverage/lcov-report/prettify.js +478 -0
- package/dist/coverage/lcov-report/sorter.js +177 -0
- package/dist/eslint.config.js +56 -0
- package/dist/jest.config.cjs +13 -0
- package/dist/jest.config.js +13 -0
- package/dist/src/api/__tests__/index.test.js +52 -0
- package/dist/src/api/authorise.js +48 -0
- package/dist/src/api/invoices/cancel.js +33 -0
- package/dist/src/api/invoices/create.js +97 -0
- package/dist/src/api/invoices/delete.js +33 -0
- package/dist/src/api/invoices/downloadPdf.js +31 -0
- package/dist/src/api/invoices/getAll.js +84 -0
- package/dist/src/api/invoices/sendMail.js +59 -0
- package/dist/src/api/invoices/submitEfactura.js +34 -0
- package/dist/src/api/invoices/update.js +61 -0
- package/dist/src/api/invoices/validate.js +39 -0
- package/dist/src/api/invoices/view.js +93 -0
- package/dist/src/api/items/create.js +42 -0
- package/dist/src/api/items/getAll.js +74 -0
- package/dist/src/api/items/getById.js +46 -0
- package/dist/src/api/items/index.js +14 -0
- package/dist/src/api/items/patch.js +49 -0
- package/dist/src/api/items/update.js +41 -0
- package/dist/src/config/constants.js +23 -0
- package/dist/src/config/constructorParam.js +3 -0
- package/dist/src/config/measureUnit.js +22 -0
- package/dist/src/config/paymentType.js +17 -0
- package/dist/src/config/paymentType.js.js +16 -0
- package/dist/src/dto/allInvoicesResponse.js +3 -0
- package/dist/src/dto/authResponse.js +3 -0
- package/dist/src/dto/common/index.js +3 -0
- package/dist/src/dto/common/paginationParams.js +3 -0
- package/dist/src/dto/createInvoiceRequest.js +3 -0
- package/dist/src/dto/invoiceResponse.js +3 -0
- package/dist/src/dto/invoices/index.js +3 -0
- package/dist/src/dto/invoices/invoiceFilterParams.js +3 -0
- package/dist/src/dto/invoices/invoiceRequestV2.js +3 -0
- package/dist/src/dto/invoices/sendInvoiceParams.js +3 -0
- package/dist/src/dto/items/allItemsResponse.js +3 -0
- package/dist/src/dto/items/index.js +3 -0
- package/dist/src/dto/items/itemRequest.js +3 -0
- package/dist/src/dto/items/itemResponse.js +3 -0
- package/dist/src/errors/KeezError.js +27 -0
- package/dist/src/helpers/logger.js +15 -0
- package/dist/src/index.js +15 -0
- package/dist/src/keezApi.js +283 -0
- package/dist/tests/additional-coverage.test.js +351 -0
- package/dist/tests/edge-cases.test.js +353 -0
- package/dist/tests/error-handling.test.js +224 -0
- package/dist/tests/filter-params.test.js +267 -0
- package/dist/tests/index.test.js +493 -0
- package/dist/tests/invoices-extended.test.js +168 -0
- package/dist/tests/items.test.js +142 -0
- package/dist/types/coverage/lcov-report/block-navigation.d.ts +1 -0
- package/dist/types/coverage/lcov-report/prettify.d.ts +0 -0
- package/dist/types/coverage/lcov-report/sorter.d.ts +1 -0
- package/dist/types/eslint.config.d.ts +2 -0
- package/dist/types/jest.config.d.cts +9 -0
- package/dist/types/jest.config.d.ts +9 -0
- package/dist/types/src/api/__tests__/index.test.d.ts +1 -0
- package/dist/types/src/api/authorise.d.ts +18 -0
- package/dist/types/src/api/invoices/cancel.d.ts +9 -0
- package/dist/types/src/api/invoices/create.d.ts +22 -0
- package/dist/types/src/api/invoices/delete.d.ts +9 -0
- package/dist/types/src/api/invoices/downloadPdf.d.ts +8 -0
- package/dist/types/src/api/invoices/getAll.d.ts +22 -0
- package/dist/types/src/api/invoices/sendMail.d.ts +24 -0
- package/dist/types/src/api/invoices/submitEfactura.d.ts +9 -0
- package/dist/types/src/api/invoices/update.d.ts +11 -0
- package/dist/types/src/api/invoices/validate.d.ts +21 -0
- package/dist/types/src/api/invoices/view.d.ts +22 -0
- package/dist/types/src/api/items/create.d.ts +10 -0
- package/dist/types/src/api/items/getAll.d.ts +10 -0
- package/dist/types/src/api/items/getById.d.ts +10 -0
- package/dist/types/src/api/items/index.d.ts +5 -0
- package/dist/types/src/api/items/patch.d.ts +11 -0
- package/dist/types/src/api/items/update.d.ts +11 -0
- package/dist/types/src/config/constants.d.ts +13 -0
- package/dist/types/src/config/constructorParam.d.ts +6 -0
- package/dist/types/src/config/measureUnit.d.ts +17 -0
- package/dist/types/src/config/paymentType.d.ts +12 -0
- package/dist/types/src/config/paymentType.js.d.ts +11 -0
- package/dist/types/src/dto/allInvoicesResponse.d.ts +21 -0
- package/dist/types/src/dto/authResponse.d.ts +7 -0
- package/dist/types/src/dto/common/index.d.ts +1 -0
- package/dist/types/src/dto/common/paginationParams.d.ts +4 -0
- package/dist/types/src/dto/createInvoiceRequest.d.ts +34 -0
- package/dist/types/src/dto/invoiceResponse.d.ts +48 -0
- package/dist/types/src/dto/invoices/index.d.ts +3 -0
- package/dist/types/src/dto/invoices/invoiceFilterParams.d.ts +8 -0
- package/dist/types/src/dto/invoices/invoiceRequestV2.d.ts +23 -0
- package/dist/types/src/dto/invoices/sendInvoiceParams.d.ts +5 -0
- package/dist/types/src/dto/items/allItemsResponse.d.ts +13 -0
- package/dist/types/src/dto/items/index.d.ts +3 -0
- package/dist/types/src/dto/items/itemRequest.d.ts +34 -0
- package/dist/types/src/dto/items/itemResponse.d.ts +15 -0
- package/dist/types/src/errors/KeezError.d.ts +11 -0
- package/dist/types/src/helpers/logger.d.ts +2 -0
- package/dist/types/src/index.d.ts +11 -0
- package/dist/types/src/keezApi.d.ts +114 -0
- package/dist/types/tests/additional-coverage.test.d.ts +1 -0
- package/dist/types/tests/edge-cases.test.d.ts +1 -0
- package/dist/types/tests/error-handling.test.d.ts +1 -0
- package/dist/types/tests/filter-params.test.d.ts +1 -0
- package/dist/types/tests/index.test.d.ts +1 -0
- package/dist/types/tests/invoices-extended.test.d.ts +1 -0
- package/dist/types/tests/items.test.d.ts +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KeezApi = void 0;
|
|
4
|
+
const authorise_1 = require("./api/authorise");
|
|
5
|
+
const getAll_1 = require("./api/invoices/getAll");
|
|
6
|
+
const view_1 = require("./api/invoices/view");
|
|
7
|
+
const sendMail_1 = require("./api/invoices/sendMail");
|
|
8
|
+
const create_1 = require("./api/invoices/create");
|
|
9
|
+
const validate_1 = require("./api/invoices/validate");
|
|
10
|
+
const update_1 = require("./api/invoices/update");
|
|
11
|
+
const delete_1 = require("./api/invoices/delete");
|
|
12
|
+
const submitEfactura_1 = require("./api/invoices/submitEfactura");
|
|
13
|
+
const cancel_1 = require("./api/invoices/cancel");
|
|
14
|
+
const downloadPdf_1 = require("./api/invoices/downloadPdf");
|
|
15
|
+
const logger_1 = require("./helpers/logger");
|
|
16
|
+
const items_1 = require("./api/items");
|
|
17
|
+
const keezLogger = logger_1.logger.child({ _library: 'KeezWrapper', _method: 'Main' });
|
|
18
|
+
class KeezApi {
|
|
19
|
+
constructor(params) {
|
|
20
|
+
this.authResponse = null;
|
|
21
|
+
this.appId = params.application_id;
|
|
22
|
+
this.apiSecret = params.secret;
|
|
23
|
+
this.apiClientId = params.client_eid;
|
|
24
|
+
this.isLive = params.live;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get the base domain for the API
|
|
28
|
+
* @returns {string} - The base domain
|
|
29
|
+
*/
|
|
30
|
+
getBaseDomain() {
|
|
31
|
+
return this.isLive ? 'https://app.keez.ro' : 'https://staging.keez.ro';
|
|
32
|
+
}
|
|
33
|
+
async checkIfTokenIsValid() {
|
|
34
|
+
if (!this.authToken || !this.authResponse || this.authResponse.expires_at < Date.now()) {
|
|
35
|
+
keezLogger.info('Token is invalid, generating a new one');
|
|
36
|
+
await this.generateToken();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async generateToken() {
|
|
40
|
+
const authResponse = await (0, authorise_1.apiGenerateToken)({
|
|
41
|
+
baseDomain: this.getBaseDomain(),
|
|
42
|
+
appId: this.appId,
|
|
43
|
+
apiSecret: this.apiSecret,
|
|
44
|
+
});
|
|
45
|
+
this.authResponse = authResponse;
|
|
46
|
+
this.authToken = authResponse.access_token;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Set live mode
|
|
50
|
+
*
|
|
51
|
+
* @param {boolean} mode - `False` will use the staging mode and `True` will use the production mode
|
|
52
|
+
*/
|
|
53
|
+
setLive(mode) {
|
|
54
|
+
this.isLive = mode;
|
|
55
|
+
}
|
|
56
|
+
// ==================== INVOICE METHODS ====================
|
|
57
|
+
/**
|
|
58
|
+
* Get all invoices with optional filtering and pagination
|
|
59
|
+
* @param params - Optional filter parameters
|
|
60
|
+
*/
|
|
61
|
+
async getAllInvoices(params) {
|
|
62
|
+
await this.checkIfTokenIsValid();
|
|
63
|
+
return (0, getAll_1.apiGetAllInvoices)({
|
|
64
|
+
baseDomain: this.getBaseDomain(),
|
|
65
|
+
appId: this.appId,
|
|
66
|
+
appClientId: this.apiClientId,
|
|
67
|
+
bearerToken: this.authToken,
|
|
68
|
+
filterParams: params,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get an invoice by its external ID
|
|
73
|
+
* @param invoiceExternalId - The external ID of the invoice
|
|
74
|
+
*/
|
|
75
|
+
async getInvoiceByExternalId(invoiceExternalId) {
|
|
76
|
+
await this.checkIfTokenIsValid();
|
|
77
|
+
return (0, view_1.apiGetInvoiceByExternalId)({
|
|
78
|
+
baseDomain: this.getBaseDomain(),
|
|
79
|
+
appId: this.appId,
|
|
80
|
+
appClientId: this.apiClientId,
|
|
81
|
+
bearerToken: this.authToken,
|
|
82
|
+
invoiceId: invoiceExternalId,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async sendInvoice(emailOrParams, invoiceExternalId) {
|
|
86
|
+
await this.checkIfTokenIsValid();
|
|
87
|
+
if (typeof emailOrParams === 'string') {
|
|
88
|
+
return (0, sendMail_1.apiSendInvoice)({
|
|
89
|
+
baseDomain: this.getBaseDomain(),
|
|
90
|
+
appId: this.appId,
|
|
91
|
+
bearerToken: this.authToken,
|
|
92
|
+
clientMail: emailOrParams,
|
|
93
|
+
invoiceId: invoiceExternalId,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return (0, sendMail_1.apiSendInvoice)({
|
|
97
|
+
baseDomain: this.getBaseDomain(),
|
|
98
|
+
appId: this.appId,
|
|
99
|
+
bearerToken: this.authToken,
|
|
100
|
+
emailParams: emailOrParams,
|
|
101
|
+
invoiceId: invoiceExternalId,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create a new invoice
|
|
106
|
+
* @param invoiceParams - The invoice parameters
|
|
107
|
+
*/
|
|
108
|
+
async createInvoice(invoiceParams) {
|
|
109
|
+
await this.checkIfTokenIsValid();
|
|
110
|
+
return (0, create_1.apiCreateInvoice)({
|
|
111
|
+
baseDomain: this.getBaseDomain(),
|
|
112
|
+
appId: this.appId,
|
|
113
|
+
appClientId: this.apiClientId,
|
|
114
|
+
bearerToken: this.authToken,
|
|
115
|
+
invoice: invoiceParams,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Validate an invoice
|
|
120
|
+
* @param invoiceExternalId - The external ID of the invoice
|
|
121
|
+
*/
|
|
122
|
+
async validateInvoice(invoiceExternalId) {
|
|
123
|
+
await this.checkIfTokenIsValid();
|
|
124
|
+
return (0, validate_1.apiValidateInvoice)({
|
|
125
|
+
baseDomain: this.getBaseDomain(),
|
|
126
|
+
appId: this.appId,
|
|
127
|
+
appClientId: this.apiClientId,
|
|
128
|
+
bearerToken: this.authToken,
|
|
129
|
+
invoiceId: invoiceExternalId,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Update an existing invoice
|
|
134
|
+
* @param invoiceId - The external ID of the invoice to update
|
|
135
|
+
* @param invoice - The updated invoice data
|
|
136
|
+
*/
|
|
137
|
+
async updateInvoice(invoiceId, invoice) {
|
|
138
|
+
await this.checkIfTokenIsValid();
|
|
139
|
+
return (0, update_1.apiUpdateInvoice)({
|
|
140
|
+
baseDomain: this.getBaseDomain(),
|
|
141
|
+
appId: this.appId,
|
|
142
|
+
appClientId: this.apiClientId,
|
|
143
|
+
bearerToken: this.authToken,
|
|
144
|
+
invoiceId,
|
|
145
|
+
invoice,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Delete an invoice
|
|
150
|
+
* @param invoiceId - The external ID of the invoice to delete
|
|
151
|
+
*/
|
|
152
|
+
async deleteInvoice(invoiceId) {
|
|
153
|
+
await this.checkIfTokenIsValid();
|
|
154
|
+
return (0, delete_1.apiDeleteInvoice)({
|
|
155
|
+
baseDomain: this.getBaseDomain(),
|
|
156
|
+
appId: this.appId,
|
|
157
|
+
appClientId: this.apiClientId,
|
|
158
|
+
bearerToken: this.authToken,
|
|
159
|
+
invoiceId,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Submit an invoice to eFactura (Romanian electronic invoicing system)
|
|
164
|
+
* @param invoiceId - The external ID of the invoice to submit
|
|
165
|
+
* @returns The upload index or confirmation from eFactura
|
|
166
|
+
*/
|
|
167
|
+
async submitInvoiceToEfactura(invoiceId) {
|
|
168
|
+
await this.checkIfTokenIsValid();
|
|
169
|
+
return (0, submitEfactura_1.apiSubmitEfactura)({
|
|
170
|
+
baseDomain: this.getBaseDomain(),
|
|
171
|
+
appId: this.appId,
|
|
172
|
+
appClientId: this.apiClientId,
|
|
173
|
+
bearerToken: this.authToken,
|
|
174
|
+
invoiceId,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Cancel an invoice
|
|
179
|
+
* @param invoiceId - The external ID of the invoice to cancel
|
|
180
|
+
*/
|
|
181
|
+
async cancelInvoice(invoiceId) {
|
|
182
|
+
await this.checkIfTokenIsValid();
|
|
183
|
+
return (0, cancel_1.apiCancelInvoice)({
|
|
184
|
+
baseDomain: this.getBaseDomain(),
|
|
185
|
+
appId: this.appId,
|
|
186
|
+
appClientId: this.apiClientId,
|
|
187
|
+
bearerToken: this.authToken,
|
|
188
|
+
invoiceId,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Download an invoice as PDF
|
|
193
|
+
* @param invoiceId - The external ID of the invoice
|
|
194
|
+
* @returns Buffer containing the PDF data
|
|
195
|
+
*/
|
|
196
|
+
async downloadInvoicePdf(invoiceId) {
|
|
197
|
+
await this.checkIfTokenIsValid();
|
|
198
|
+
return (0, downloadPdf_1.apiDownloadInvoicePdf)({
|
|
199
|
+
baseDomain: this.getBaseDomain(),
|
|
200
|
+
appId: this.appId,
|
|
201
|
+
bearerToken: this.authToken,
|
|
202
|
+
invoiceId,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// ==================== ITEM METHODS ====================
|
|
206
|
+
/**
|
|
207
|
+
* Get all items with optional filtering and pagination
|
|
208
|
+
* @param params - Optional filter parameters
|
|
209
|
+
*/
|
|
210
|
+
async getAllItems(params) {
|
|
211
|
+
await this.checkIfTokenIsValid();
|
|
212
|
+
return (0, items_1.apiGetAllItems)({
|
|
213
|
+
baseDomain: this.getBaseDomain(),
|
|
214
|
+
appId: this.appId,
|
|
215
|
+
appClientId: this.apiClientId,
|
|
216
|
+
bearerToken: this.authToken,
|
|
217
|
+
filterParams: params,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get an item by its external ID
|
|
222
|
+
* @param itemId - The external ID of the item
|
|
223
|
+
*/
|
|
224
|
+
async getItemByExternalId(itemId) {
|
|
225
|
+
await this.checkIfTokenIsValid();
|
|
226
|
+
return (0, items_1.apiGetItemById)({
|
|
227
|
+
baseDomain: this.getBaseDomain(),
|
|
228
|
+
appId: this.appId,
|
|
229
|
+
appClientId: this.apiClientId,
|
|
230
|
+
bearerToken: this.authToken,
|
|
231
|
+
itemId,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Create a new item
|
|
236
|
+
* @param item - The item data to create
|
|
237
|
+
* @returns The external ID of the created item
|
|
238
|
+
*/
|
|
239
|
+
async createItem(item) {
|
|
240
|
+
await this.checkIfTokenIsValid();
|
|
241
|
+
return (0, items_1.apiCreateItem)({
|
|
242
|
+
baseDomain: this.getBaseDomain(),
|
|
243
|
+
appId: this.appId,
|
|
244
|
+
appClientId: this.apiClientId,
|
|
245
|
+
bearerToken: this.authToken,
|
|
246
|
+
item,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Update an existing item (full replacement)
|
|
251
|
+
* @param itemId - The external ID of the item to update
|
|
252
|
+
* @param item - The updated item data
|
|
253
|
+
*/
|
|
254
|
+
async updateItem(itemId, item) {
|
|
255
|
+
await this.checkIfTokenIsValid();
|
|
256
|
+
return (0, items_1.apiUpdateItem)({
|
|
257
|
+
baseDomain: this.getBaseDomain(),
|
|
258
|
+
appId: this.appId,
|
|
259
|
+
appClientId: this.apiClientId,
|
|
260
|
+
bearerToken: this.authToken,
|
|
261
|
+
itemId,
|
|
262
|
+
item,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Partially update an existing item
|
|
267
|
+
* @param itemId - The external ID of the item to patch
|
|
268
|
+
* @param item - The fields to update
|
|
269
|
+
*/
|
|
270
|
+
async patchItem(itemId, item) {
|
|
271
|
+
await this.checkIfTokenIsValid();
|
|
272
|
+
return (0, items_1.apiPatchItem)({
|
|
273
|
+
baseDomain: this.getBaseDomain(),
|
|
274
|
+
appId: this.appId,
|
|
275
|
+
appClientId: this.apiClientId,
|
|
276
|
+
bearerToken: this.authToken,
|
|
277
|
+
itemId,
|
|
278
|
+
item,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
exports.KeezApi = KeezApi;
|
|
283
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VlekFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9rZWV6QXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtDQUFtRDtBQUNuRCxrREFBMEQ7QUFDMUQsOENBQWdFO0FBQ2hFLHNEQUF5RDtBQUV6RCxrREFBeUQ7QUFDekQsc0RBQTZEO0FBQzdELGtEQUF5RDtBQUN6RCxrREFBeUQ7QUFDekQsa0VBQWtFO0FBQ2xFLGtEQUF5RDtBQUN6RCw0REFBbUU7QUFFbkUsNkNBQTBDO0FBRTFDLHVDQUF5RztBQVV6RyxNQUFNLFVBQVUsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUU5RSxNQUFhLE9BQU87SUFRaEIsWUFBWSxNQUF1QjtRQUozQixpQkFBWSxHQUF3QixJQUFJLENBQUM7UUFLN0MsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO0lBQzNFLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyRixVQUFVLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7WUFDMUQsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYTtRQUN2QixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUEsNEJBQWdCLEVBQUM7WUFDeEMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUM1QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxPQUFPLENBQUMsSUFBYTtRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQsNERBQTREO0lBRTVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBNEI7UUFDcEQsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUEsMEJBQWlCLEVBQUM7WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsWUFBWSxFQUFFLE1BQU07U0FDdkIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBeUI7UUFDekQsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUEsZ0NBQXlCLEVBQUM7WUFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsU0FBUyxFQUFFLGlCQUFpQjtTQUMvQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBY00sS0FBSyxDQUFDLFdBQVcsQ0FDcEIsYUFBOEMsRUFDOUMsaUJBQXlCO1FBRXpCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxPQUFPLElBQUEseUJBQWMsRUFBQztnQkFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUMzQixVQUFVLEVBQUUsYUFBYTtnQkFDekIsU0FBUyxFQUFFLGlCQUFpQjthQUMvQixDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxJQUFBLHlCQUFjLEVBQUM7WUFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztZQUMzQixXQUFXLEVBQUUsYUFBYTtZQUMxQixTQUFTLEVBQUUsaUJBQWlCO1NBQy9CLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQTZCO1FBQ3BELE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFBLHlCQUFnQixFQUFDO1lBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQzNCLE9BQU8sRUFBRSxhQUFhO1NBQ3pCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsZUFBZSxDQUFDLGlCQUF5QjtRQUNsRCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBQSw2QkFBa0IsRUFBQztZQUN0QixVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztZQUMzQixTQUFTLEVBQUUsaUJBQWlCO1NBQy9CLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQixFQUFFLE9BQXlCO1FBQ25FLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFBLHlCQUFnQixFQUFDO1lBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQzNCLFNBQVM7WUFDVCxPQUFPO1NBQ1YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBaUI7UUFDeEMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUEseUJBQWdCLEVBQUM7WUFDcEIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsU0FBUztTQUNaLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQWlCO1FBQ2xELE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFBLGtDQUFpQixFQUFDO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQzNCLFNBQVM7U0FDWixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQjtRQUN4QyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBQSx5QkFBZ0IsRUFBQztZQUNwQixVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztZQUMzQixTQUFTO1NBQ1osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBaUI7UUFDN0MsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUEsbUNBQXFCLEVBQUM7WUFDekIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztZQUMzQixTQUFTO1NBQ1osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHlEQUF5RDtJQUV6RDs7O09BR0c7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQXlCO1FBQzlDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFBLHNCQUFjLEVBQUM7WUFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsWUFBWSxFQUFFLE1BQU07U0FDdkIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUFjO1FBQzNDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFBLHNCQUFjLEVBQUM7WUFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsTUFBTTtTQUNULENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUF1QjtRQUMzQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBQSxxQkFBYSxFQUFDO1lBQ2pCLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQzNCLElBQUk7U0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBYyxFQUFFLElBQXVCO1FBQzNELE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFBLHFCQUFhLEVBQUM7WUFDakIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsTUFBTTtZQUNOLElBQUk7U0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBYyxFQUFFLElBQXNCO1FBQ3pELE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFBLG9CQUFZLEVBQUM7WUFDaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsTUFBTTtZQUNOLElBQUk7U0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFqVEQsMEJBaVRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2VlekNvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25maWcvY29uc3RydWN0b3JQYXJhbSc7XG5pbXBvcnQgeyBhcGlHZW5lcmF0ZVRva2VuIH0gZnJvbSAnLi9hcGkvYXV0aG9yaXNlJztcbmltcG9ydCB7IGFwaUdldEFsbEludm9pY2VzIH0gZnJvbSAnLi9hcGkvaW52b2ljZXMvZ2V0QWxsJztcbmltcG9ydCB7IGFwaUdldEludm9pY2VCeUV4dGVybmFsSWQgfSBmcm9tICcuL2FwaS9pbnZvaWNlcy92aWV3JztcbmltcG9ydCB7IGFwaVNlbmRJbnZvaWNlIH0gZnJvbSAnLi9hcGkvaW52b2ljZXMvc2VuZE1haWwnO1xuaW1wb3J0IHsgSW52b2ljZVJlcXVlc3QgfSBmcm9tICcuL2R0by9jcmVhdGVJbnZvaWNlUmVxdWVzdCc7XG5pbXBvcnQgeyBhcGlDcmVhdGVJbnZvaWNlIH0gZnJvbSAnLi9hcGkvaW52b2ljZXMvY3JlYXRlJztcbmltcG9ydCB7IGFwaVZhbGlkYXRlSW52b2ljZSB9IGZyb20gJy4vYXBpL2ludm9pY2VzL3ZhbGlkYXRlJztcbmltcG9ydCB7IGFwaVVwZGF0ZUludm9pY2UgfSBmcm9tICcuL2FwaS9pbnZvaWNlcy91cGRhdGUnO1xuaW1wb3J0IHsgYXBpRGVsZXRlSW52b2ljZSB9IGZyb20gJy4vYXBpL2ludm9pY2VzL2RlbGV0ZSc7XG5pbXBvcnQgeyBhcGlTdWJtaXRFZmFjdHVyYSB9IGZyb20gJy4vYXBpL2ludm9pY2VzL3N1Ym1pdEVmYWN0dXJhJztcbmltcG9ydCB7IGFwaUNhbmNlbEludm9pY2UgfSBmcm9tICcuL2FwaS9pbnZvaWNlcy9jYW5jZWwnO1xuaW1wb3J0IHsgYXBpRG93bmxvYWRJbnZvaWNlUGRmIH0gZnJvbSAnLi9hcGkvaW52b2ljZXMvZG93bmxvYWRQZGYnO1xuaW1wb3J0IHsgQXV0aFJlc3BvbnNlIH0gZnJvbSAnLi9kdG8vYXV0aFJlc3BvbnNlJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vaGVscGVycy9sb2dnZXInO1xuaW1wb3J0IHsgSW52b2ljZUZpbHRlclBhcmFtcywgSW52b2ljZVJlcXVlc3RWMiwgU2VuZEludm9pY2VFbWFpbFBhcmFtcyB9IGZyb20gJy4vZHRvL2ludm9pY2VzJztcbmltcG9ydCB7IGFwaUdldEFsbEl0ZW1zLCBhcGlHZXRJdGVtQnlJZCwgYXBpQ3JlYXRlSXRlbSwgYXBpVXBkYXRlSXRlbSwgYXBpUGF0Y2hJdGVtIH0gZnJvbSAnLi9hcGkvaXRlbXMnO1xuaW1wb3J0IHtcbiAgICBBbGxJdGVtc1Jlc3BvbnNlLFxuICAgIENyZWF0ZUl0ZW1SZXF1ZXN0LFxuICAgIEl0ZW1GaWx0ZXJQYXJhbXMsXG4gICAgSXRlbVJlc3BvbnNlLFxuICAgIFBhdGNoSXRlbVJlcXVlc3QsXG4gICAgVXBkYXRlSXRlbVJlcXVlc3QsXG59IGZyb20gJy4vZHRvL2l0ZW1zJztcblxuY29uc3Qga2VlekxvZ2dlciA9IGxvZ2dlci5jaGlsZCh7IF9saWJyYXJ5OiAnS2VleldyYXBwZXInLCBfbWV0aG9kOiAnTWFpbicgfSk7XG5cbmV4cG9ydCBjbGFzcyBLZWV6QXBpIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGlTZWNyZXQ6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaUNsaWVudElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBhdXRoUmVzcG9uc2U6IEF1dGhSZXNwb25zZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgYXV0aFRva2VuOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpc0xpdmU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXM6IEtlZXpDb25zdHJ1Y3Rvcikge1xuICAgICAgICB0aGlzLmFwcElkID0gcGFyYW1zLmFwcGxpY2F0aW9uX2lkO1xuICAgICAgICB0aGlzLmFwaVNlY3JldCA9IHBhcmFtcy5zZWNyZXQ7XG4gICAgICAgIHRoaXMuYXBpQ2xpZW50SWQgPSBwYXJhbXMuY2xpZW50X2VpZDtcbiAgICAgICAgdGhpcy5pc0xpdmUgPSBwYXJhbXMubGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGJhc2UgZG9tYWluIGZvciB0aGUgQVBJXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYmFzZSBkb21haW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmFzZURvbWFpbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xpdmUgPyAnaHR0cHM6Ly9hcHAua2Vlei5ybycgOiAnaHR0cHM6Ly9zdGFnaW5nLmtlZXoucm8nO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tJZlRva2VuSXNWYWxpZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhUb2tlbiB8fCAhdGhpcy5hdXRoUmVzcG9uc2UgfHwgdGhpcy5hdXRoUmVzcG9uc2UuZXhwaXJlc19hdCA8IERhdGUubm93KCkpIHtcbiAgICAgICAgICAgIGtlZXpMb2dnZXIuaW5mbygnVG9rZW4gaXMgaW52YWxpZCwgZ2VuZXJhdGluZyBhIG5ldyBvbmUnKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVUb2tlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVRva2VuKCkge1xuICAgICAgICBjb25zdCBhdXRoUmVzcG9uc2UgPSBhd2FpdCBhcGlHZW5lcmF0ZVRva2VuKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcGlTZWNyZXQ6IHRoaXMuYXBpU2VjcmV0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hdXRoUmVzcG9uc2UgPSBhdXRoUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuYXV0aFRva2VuID0gYXV0aFJlc3BvbnNlLmFjY2Vzc190b2tlbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbGl2ZSBtb2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG1vZGUgLSBgRmFsc2VgIHdpbGwgdXNlIHRoZSBzdGFnaW5nIG1vZGUgYW5kIGBUcnVlYCB3aWxsIHVzZSB0aGUgcHJvZHVjdGlvbiBtb2RlXG4gICAgICovXG4gICAgcHVibGljIHNldExpdmUobW9kZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmlzTGl2ZSA9IG1vZGU7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT0gSU5WT0lDRSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGludm9pY2VzIHdpdGggb3B0aW9uYWwgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAgICogQHBhcmFtIHBhcmFtcyAtIE9wdGlvbmFsIGZpbHRlciBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldEFsbEludm9pY2VzKHBhcmFtcz86IEludm9pY2VGaWx0ZXJQYXJhbXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlHZXRBbGxJbnZvaWNlcyh7XG4gICAgICAgICAgICBiYXNlRG9tYWluOiB0aGlzLmdldEJhc2VEb21haW4oKSxcbiAgICAgICAgICAgIGFwcElkOiB0aGlzLmFwcElkLFxuICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IHRoaXMuYXBpQ2xpZW50SWQsXG4gICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICBmaWx0ZXJQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGludm9pY2UgYnkgaXRzIGV4dGVybmFsIElEXG4gICAgICogQHBhcmFtIGludm9pY2VFeHRlcm5hbElkIC0gVGhlIGV4dGVybmFsIElEIG9mIHRoZSBpbnZvaWNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldEludm9pY2VCeUV4dGVybmFsSWQoaW52b2ljZUV4dGVybmFsSWQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZUb2tlbklzVmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIGFwaUdldEludm9pY2VCeUV4dGVybmFsSWQoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaW52b2ljZUlkOiBpbnZvaWNlRXh0ZXJuYWxJZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBpbnZvaWNlIHZpYSBlbWFpbFxuICAgICAqIEBwYXJhbSBlbWFpbCAtIFRoZSByZWNpcGllbnQgZW1haWwgYWRkcmVzc1xuICAgICAqIEBwYXJhbSBpbnZvaWNlRXh0ZXJuYWxJZCAtIFRoZSBleHRlcm5hbCBJRCBvZiB0aGUgaW52b2ljZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kSW52b2ljZShlbWFpbDogc3RyaW5nLCBpbnZvaWNlRXh0ZXJuYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gaW52b2ljZSB2aWEgZW1haWwgd2l0aCBDQy9CQ0Mgc3VwcG9ydFxuICAgICAqIEBwYXJhbSBlbWFpbFBhcmFtcyAtIEVtYWlsIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRvLCBjYywgYW5kIGJjY1xuICAgICAqIEBwYXJhbSBpbnZvaWNlRXh0ZXJuYWxJZCAtIFRoZSBleHRlcm5hbCBJRCBvZiB0aGUgaW52b2ljZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kSW52b2ljZShlbWFpbFBhcmFtczogU2VuZEludm9pY2VFbWFpbFBhcmFtcywgaW52b2ljZUV4dGVybmFsSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICBwdWJsaWMgYXN5bmMgc2VuZEludm9pY2UoXG4gICAgICAgIGVtYWlsT3JQYXJhbXM6IHN0cmluZyB8IFNlbmRJbnZvaWNlRW1haWxQYXJhbXMsXG4gICAgICAgIGludm9pY2VFeHRlcm5hbElkOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZUb2tlbklzVmFsaWQoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbE9yUGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGFwaVNlbmRJbnZvaWNlKHtcbiAgICAgICAgICAgICAgICBiYXNlRG9tYWluOiB0aGlzLmdldEJhc2VEb21haW4oKSxcbiAgICAgICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICAgICAgY2xpZW50TWFpbDogZW1haWxPclBhcmFtcyxcbiAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6IGludm9pY2VFeHRlcm5hbElkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwaVNlbmRJbnZvaWNlKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICBlbWFpbFBhcmFtczogZW1haWxPclBhcmFtcyxcbiAgICAgICAgICAgIGludm9pY2VJZDogaW52b2ljZUV4dGVybmFsSWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBpbnZvaWNlXG4gICAgICogQHBhcmFtIGludm9pY2VQYXJhbXMgLSBUaGUgaW52b2ljZSBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNyZWF0ZUludm9pY2UoaW52b2ljZVBhcmFtczogSW52b2ljZVJlcXVlc3QpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlDcmVhdGVJbnZvaWNlKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGludm9pY2U6IGludm9pY2VQYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGFuIGludm9pY2VcbiAgICAgKiBAcGFyYW0gaW52b2ljZUV4dGVybmFsSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGludm9pY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVJbnZvaWNlKGludm9pY2VFeHRlcm5hbElkOiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlWYWxpZGF0ZUludm9pY2Uoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaW52b2ljZUlkOiBpbnZvaWNlRXh0ZXJuYWxJZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGV4aXN0aW5nIGludm9pY2VcbiAgICAgKiBAcGFyYW0gaW52b2ljZUlkIC0gVGhlIGV4dGVybmFsIElEIG9mIHRoZSBpbnZvaWNlIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBpbnZvaWNlIC0gVGhlIHVwZGF0ZWQgaW52b2ljZSBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZUludm9pY2UoaW52b2ljZUlkOiBzdHJpbmcsIGludm9pY2U6IEludm9pY2VSZXF1ZXN0VjIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlVcGRhdGVJbnZvaWNlKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGludm9pY2VJZCxcbiAgICAgICAgICAgIGludm9pY2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhbiBpbnZvaWNlXG4gICAgICogQHBhcmFtIGludm9pY2VJZCAtIFRoZSBleHRlcm5hbCBJRCBvZiB0aGUgaW52b2ljZSB0byBkZWxldGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlSW52b2ljZShpbnZvaWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZUb2tlbklzVmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIGFwaURlbGV0ZUludm9pY2Uoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaW52b2ljZUlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJtaXQgYW4gaW52b2ljZSB0byBlRmFjdHVyYSAoUm9tYW5pYW4gZWxlY3Ryb25pYyBpbnZvaWNpbmcgc3lzdGVtKVxuICAgICAqIEBwYXJhbSBpbnZvaWNlSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGludm9pY2UgdG8gc3VibWl0XG4gICAgICogQHJldHVybnMgVGhlIHVwbG9hZCBpbmRleCBvciBjb25maXJtYXRpb24gZnJvbSBlRmFjdHVyYVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzdWJtaXRJbnZvaWNlVG9FZmFjdHVyYShpbnZvaWNlSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlRva2VuSXNWYWxpZCgpO1xuICAgICAgICByZXR1cm4gYXBpU3VibWl0RWZhY3R1cmEoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaW52b2ljZUlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgYW4gaW52b2ljZVxuICAgICAqIEBwYXJhbSBpbnZvaWNlSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGludm9pY2UgdG8gY2FuY2VsXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNhbmNlbEludm9pY2UoaW52b2ljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlDYW5jZWxJbnZvaWNlKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGludm9pY2VJZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgYW4gaW52b2ljZSBhcyBQREZcbiAgICAgKiBAcGFyYW0gaW52b2ljZUlkIC0gVGhlIGV4dGVybmFsIElEIG9mIHRoZSBpbnZvaWNlXG4gICAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIFBERiBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkSW52b2ljZVBkZihpbnZvaWNlSWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlRva2VuSXNWYWxpZCgpO1xuICAgICAgICByZXR1cm4gYXBpRG93bmxvYWRJbnZvaWNlUGRmKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICBpbnZvaWNlSWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09IElURU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBpdGVtcyB3aXRoIG9wdGlvbmFsIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvblxuICAgICAqIEBwYXJhbSBwYXJhbXMgLSBPcHRpb25hbCBmaWx0ZXIgcGFyYW1ldGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRBbGxJdGVtcyhwYXJhbXM/OiBJdGVtRmlsdGVyUGFyYW1zKTogUHJvbWlzZTxBbGxJdGVtc1Jlc3BvbnNlPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlRva2VuSXNWYWxpZCgpO1xuICAgICAgICByZXR1cm4gYXBpR2V0QWxsSXRlbXMoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgZmlsdGVyUGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBpdGVtIGJ5IGl0cyBleHRlcm5hbCBJRFxuICAgICAqIEBwYXJhbSBpdGVtSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGl0ZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SXRlbUJ5RXh0ZXJuYWxJZChpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8SXRlbVJlc3BvbnNlPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlRva2VuSXNWYWxpZCgpO1xuICAgICAgICByZXR1cm4gYXBpR2V0SXRlbUJ5SWQoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaXRlbUlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaXRlbVxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gZGF0YSB0byBjcmVhdGVcbiAgICAgKiBAcmV0dXJucyBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGNyZWF0ZWQgaXRlbVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVJdGVtKGl0ZW06IENyZWF0ZUl0ZW1SZXF1ZXN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlDcmVhdGVJdGVtKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBleGlzdGluZyBpdGVtIChmdWxsIHJlcGxhY2VtZW50KVxuICAgICAqIEBwYXJhbSBpdGVtSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAgICogQHBhcmFtIGl0ZW0gLSBUaGUgdXBkYXRlZCBpdGVtIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlSXRlbShpdGVtSWQ6IHN0cmluZywgaXRlbTogVXBkYXRlSXRlbVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlVcGRhdGVJdGVtKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnRpYWxseSB1cGRhdGUgYW4gZXhpc3RpbmcgaXRlbVxuICAgICAqIEBwYXJhbSBpdGVtSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGl0ZW0gdG8gcGF0Y2hcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBmaWVsZHMgdG8gdXBkYXRlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBhdGNoSXRlbShpdGVtSWQ6IHN0cmluZywgaXRlbTogUGF0Y2hJdGVtUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZUb2tlbklzVmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIGFwaVBhdGNoSXRlbSh7XG4gICAgICAgICAgICBiYXNlRG9tYWluOiB0aGlzLmdldEJhc2VEb21haW4oKSxcbiAgICAgICAgICAgIGFwcElkOiB0aGlzLmFwcElkLFxuICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IHRoaXMuYXBpQ2xpZW50SWQsXG4gICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|