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.
Files changed (111) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +366 -0
  3. package/dist/coverage/lcov-report/block-navigation.js +71 -0
  4. package/dist/coverage/lcov-report/prettify.js +478 -0
  5. package/dist/coverage/lcov-report/sorter.js +177 -0
  6. package/dist/eslint.config.js +56 -0
  7. package/dist/jest.config.cjs +13 -0
  8. package/dist/jest.config.js +13 -0
  9. package/dist/src/api/__tests__/index.test.js +52 -0
  10. package/dist/src/api/authorise.js +48 -0
  11. package/dist/src/api/invoices/cancel.js +33 -0
  12. package/dist/src/api/invoices/create.js +97 -0
  13. package/dist/src/api/invoices/delete.js +33 -0
  14. package/dist/src/api/invoices/downloadPdf.js +31 -0
  15. package/dist/src/api/invoices/getAll.js +84 -0
  16. package/dist/src/api/invoices/sendMail.js +59 -0
  17. package/dist/src/api/invoices/submitEfactura.js +34 -0
  18. package/dist/src/api/invoices/update.js +61 -0
  19. package/dist/src/api/invoices/validate.js +39 -0
  20. package/dist/src/api/invoices/view.js +93 -0
  21. package/dist/src/api/items/create.js +42 -0
  22. package/dist/src/api/items/getAll.js +74 -0
  23. package/dist/src/api/items/getById.js +46 -0
  24. package/dist/src/api/items/index.js +14 -0
  25. package/dist/src/api/items/patch.js +49 -0
  26. package/dist/src/api/items/update.js +41 -0
  27. package/dist/src/config/constants.js +23 -0
  28. package/dist/src/config/constructorParam.js +3 -0
  29. package/dist/src/config/measureUnit.js +22 -0
  30. package/dist/src/config/paymentType.js +17 -0
  31. package/dist/src/config/paymentType.js.js +16 -0
  32. package/dist/src/dto/allInvoicesResponse.js +3 -0
  33. package/dist/src/dto/authResponse.js +3 -0
  34. package/dist/src/dto/common/index.js +3 -0
  35. package/dist/src/dto/common/paginationParams.js +3 -0
  36. package/dist/src/dto/createInvoiceRequest.js +3 -0
  37. package/dist/src/dto/invoiceResponse.js +3 -0
  38. package/dist/src/dto/invoices/index.js +3 -0
  39. package/dist/src/dto/invoices/invoiceFilterParams.js +3 -0
  40. package/dist/src/dto/invoices/invoiceRequestV2.js +3 -0
  41. package/dist/src/dto/invoices/sendInvoiceParams.js +3 -0
  42. package/dist/src/dto/items/allItemsResponse.js +3 -0
  43. package/dist/src/dto/items/index.js +3 -0
  44. package/dist/src/dto/items/itemRequest.js +3 -0
  45. package/dist/src/dto/items/itemResponse.js +3 -0
  46. package/dist/src/errors/KeezError.js +27 -0
  47. package/dist/src/helpers/logger.js +15 -0
  48. package/dist/src/index.js +15 -0
  49. package/dist/src/keezApi.js +283 -0
  50. package/dist/tests/additional-coverage.test.js +351 -0
  51. package/dist/tests/edge-cases.test.js +353 -0
  52. package/dist/tests/error-handling.test.js +224 -0
  53. package/dist/tests/filter-params.test.js +267 -0
  54. package/dist/tests/index.test.js +493 -0
  55. package/dist/tests/invoices-extended.test.js +168 -0
  56. package/dist/tests/items.test.js +142 -0
  57. package/dist/types/coverage/lcov-report/block-navigation.d.ts +1 -0
  58. package/dist/types/coverage/lcov-report/prettify.d.ts +0 -0
  59. package/dist/types/coverage/lcov-report/sorter.d.ts +1 -0
  60. package/dist/types/eslint.config.d.ts +2 -0
  61. package/dist/types/jest.config.d.cts +9 -0
  62. package/dist/types/jest.config.d.ts +9 -0
  63. package/dist/types/src/api/__tests__/index.test.d.ts +1 -0
  64. package/dist/types/src/api/authorise.d.ts +18 -0
  65. package/dist/types/src/api/invoices/cancel.d.ts +9 -0
  66. package/dist/types/src/api/invoices/create.d.ts +22 -0
  67. package/dist/types/src/api/invoices/delete.d.ts +9 -0
  68. package/dist/types/src/api/invoices/downloadPdf.d.ts +8 -0
  69. package/dist/types/src/api/invoices/getAll.d.ts +22 -0
  70. package/dist/types/src/api/invoices/sendMail.d.ts +24 -0
  71. package/dist/types/src/api/invoices/submitEfactura.d.ts +9 -0
  72. package/dist/types/src/api/invoices/update.d.ts +11 -0
  73. package/dist/types/src/api/invoices/validate.d.ts +21 -0
  74. package/dist/types/src/api/invoices/view.d.ts +22 -0
  75. package/dist/types/src/api/items/create.d.ts +10 -0
  76. package/dist/types/src/api/items/getAll.d.ts +10 -0
  77. package/dist/types/src/api/items/getById.d.ts +10 -0
  78. package/dist/types/src/api/items/index.d.ts +5 -0
  79. package/dist/types/src/api/items/patch.d.ts +11 -0
  80. package/dist/types/src/api/items/update.d.ts +11 -0
  81. package/dist/types/src/config/constants.d.ts +13 -0
  82. package/dist/types/src/config/constructorParam.d.ts +6 -0
  83. package/dist/types/src/config/measureUnit.d.ts +17 -0
  84. package/dist/types/src/config/paymentType.d.ts +12 -0
  85. package/dist/types/src/config/paymentType.js.d.ts +11 -0
  86. package/dist/types/src/dto/allInvoicesResponse.d.ts +21 -0
  87. package/dist/types/src/dto/authResponse.d.ts +7 -0
  88. package/dist/types/src/dto/common/index.d.ts +1 -0
  89. package/dist/types/src/dto/common/paginationParams.d.ts +4 -0
  90. package/dist/types/src/dto/createInvoiceRequest.d.ts +34 -0
  91. package/dist/types/src/dto/invoiceResponse.d.ts +48 -0
  92. package/dist/types/src/dto/invoices/index.d.ts +3 -0
  93. package/dist/types/src/dto/invoices/invoiceFilterParams.d.ts +8 -0
  94. package/dist/types/src/dto/invoices/invoiceRequestV2.d.ts +23 -0
  95. package/dist/types/src/dto/invoices/sendInvoiceParams.d.ts +5 -0
  96. package/dist/types/src/dto/items/allItemsResponse.d.ts +13 -0
  97. package/dist/types/src/dto/items/index.d.ts +3 -0
  98. package/dist/types/src/dto/items/itemRequest.d.ts +34 -0
  99. package/dist/types/src/dto/items/itemResponse.d.ts +15 -0
  100. package/dist/types/src/errors/KeezError.d.ts +11 -0
  101. package/dist/types/src/helpers/logger.d.ts +2 -0
  102. package/dist/types/src/index.d.ts +11 -0
  103. package/dist/types/src/keezApi.d.ts +114 -0
  104. package/dist/types/tests/additional-coverage.test.d.ts +1 -0
  105. package/dist/types/tests/edge-cases.test.d.ts +1 -0
  106. package/dist/types/tests/error-handling.test.d.ts +1 -0
  107. package/dist/types/tests/filter-params.test.d.ts +1 -0
  108. package/dist/types/tests/index.test.d.ts +1 -0
  109. package/dist/types/tests/invoices-extended.test.d.ts +1 -0
  110. package/dist/types/tests/items.test.d.ts +1 -0
  111. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VlekFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9rZWV6QXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtDQUFtRDtBQUNuRCxrREFBMEQ7QUFDMUQsOENBQWdFO0FBQ2hFLHNEQUF5RDtBQUV6RCxrREFBeUQ7QUFDekQsc0RBQTZEO0FBQzdELGtEQUF5RDtBQUN6RCxrREFBeUQ7QUFDekQsa0VBQWtFO0FBQ2xFLGtEQUF5RDtBQUN6RCw0REFBbUU7QUFFbkUsNkNBQTBDO0FBRTFDLHVDQUF5RztBQVV6RyxNQUFNLFVBQVUsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUU5RSxNQUFhLE9BQU87SUFRaEIsWUFBWSxNQUF1QjtRQUozQixpQkFBWSxHQUF3QixJQUFJLENBQUM7UUFLN0MsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO0lBQzNFLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyRixVQUFVLENBQUMsSUFB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QyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsTUFBTTtZQUNOLElBQUk7U0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBYyxFQUFFLElBQXNCO1FBQ3pELE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFBLG9CQUFZLEVBQUM7WUFDaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDM0IsTUFBTTtZQUNOLElBQUk7U0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFqVEQsMEJBaVRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2VlekNvbnN0cnVjdG9yIH0gZnJvbSAnLi9jb25maWcvY29uc3RydWN0b3JQYXJhbSc7XG5pbXBvcnQgeyBhcGlHZW5lcmF0ZVRva2VuIH0gZnJvbSAnLi9hcGkvYXV0aG9yaXNlJztcbmltcG9ydCB7IGFwaUdldEFsbEludm9pY2VzIH0gZnJvbSAnLi9hcGkvaW52b2ljZXMvZ2V0QWxsJztcbmltcG9ydCB7IGFwaUdldEludm9pY2VCeUV4dGVybmFsSWQgfSBmcm9tICcuL2FwaS9pbnZvaWNlcy92aWV3JztcbmltcG9ydCB7IGFwaVNlbmRJbnZvaWNlIH0gZnJvbSAnLi9hcGkvaW52b2ljZXMvc2VuZE1haWwnO1xuaW1wb3J0IHsgSW52b2ljZVJlcXVlc3QgfSBmcm9tICcuL2R0by9jcmVhdGVJbnZvaWNlUmVxdWVzdCc7XG5pbXBvcnQgeyBhcGlDcmVhdGVJbnZvaWNlIH0gZnJvbSAnLi9hcGkvaW52b2ljZXMvY3JlYXRlJztcbmltcG9ydCB7IGFwaVZhbGlkYXRlSW52b2ljZSB9IGZyb20gJy4vYXBpL2ludm9pY2VzL3ZhbGlkYXRlJztcbmltcG9ydCB7IGFwaVVwZGF0ZUludm9pY2UgfSBmcm9tICcuL2FwaS9pbnZvaWNlcy91cGRhdGUnO1xuaW1wb3J0IHsgYXBpRGVsZXRlSW52b2ljZSB9IGZyb20gJy4vYXBpL2ludm9pY2VzL2RlbGV0ZSc7XG5pbXBvcnQgeyBhcGlTdWJtaXRFZmFjdHVyYSB9IGZyb20gJy4vYXBpL2ludm9pY2VzL3N1Ym1pdEVmYWN0dXJhJztcbmltcG9ydCB7IGFwaUNhbmNlbEludm9pY2UgfSBmcm9tICcuL2FwaS9pbnZvaWNlcy9jYW5jZWwnO1xuaW1wb3J0IHsgYXBpRG93bmxvYWRJbnZvaWNlUGRmIH0gZnJvbSAnLi9hcGkvaW52b2ljZXMvZG93bmxvYWRQZGYnO1xuaW1wb3J0IHsgQXV0aFJlc3BvbnNlIH0gZnJvbSAnLi9kdG8vYXV0aFJlc3BvbnNlJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vaGVscGVycy9sb2dnZXInO1xuaW1wb3J0IHsgSW52b2ljZUZpbHRlclBhcmFtcywgSW52b2ljZVJlcXVlc3RWMiwgU2VuZEludm9pY2VFbWFpbFBhcmFtcyB9IGZyb20gJy4vZHRvL2ludm9pY2VzJztcbmltcG9ydCB7IGFwaUdldEFsbEl0ZW1zLCBhcGlHZXRJdGVtQnlJZCwgYXBpQ3JlYXRlSXRlbSwgYXBpVXBkYXRlSXRlbSwgYXBpUGF0Y2hJdGVtIH0gZnJvbSAnLi9hcGkvaXRlbXMnO1xuaW1wb3J0IHtcbiAgICBBbGxJdGVtc1Jlc3BvbnNlLFxuICAgIENyZWF0ZUl0ZW1SZXF1ZXN0LFxuICAgIEl0ZW1GaWx0ZXJQYXJhbXMsXG4gICAgSXRlbVJlc3BvbnNlLFxuICAgIFBhdGNoSXRlbVJlcXVlc3QsXG4gICAgVXBkYXRlSXRlbVJlcXVlc3QsXG59IGZyb20gJy4vZHRvL2l0ZW1zJztcblxuY29uc3Qga2VlekxvZ2dlciA9IGxvZ2dlci5jaGlsZCh7IF9saWJyYXJ5OiAnS2VleldyYXBwZXInLCBfbWV0aG9kOiAnTWFpbicgfSk7XG5cbmV4cG9ydCBjbGFzcyBLZWV6QXBpIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGlTZWNyZXQ6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaUNsaWVudElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBhdXRoUmVzcG9uc2U6IEF1dGhSZXNwb25zZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgYXV0aFRva2VuOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpc0xpdmU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXM6IEtlZXpDb25zdHJ1Y3Rvcikge1xuICAgICAgICB0aGlzLmFwcElkID0gcGFyYW1zLmFwcGxpY2F0aW9uX2lkO1xuICAgICAgICB0aGlzLmFwaVNlY3JldCA9IHBhcmFtcy5zZWNyZXQ7XG4gICAgICAgIHRoaXMuYXBpQ2xpZW50SWQgPSBwYXJhbXMuY2xpZW50X2VpZDtcbiAgICAgICAgdGhpcy5pc0xpdmUgPSBwYXJhbXMubGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGJhc2UgZG9tYWluIGZvciB0aGUgQVBJXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYmFzZSBkb21haW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmFzZURvbWFpbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xpdmUgPyAnaHR0cHM6Ly9hcHAua2Vlei5ybycgOiAnaHR0cHM6Ly9zdGFnaW5nLmtlZXoucm8nO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tJZlRva2VuSXNWYWxpZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhUb2tlbiB8fCAhdGhpcy5hdXRoUmVzcG9uc2UgfHwgdGhpcy5hdXRoUmVzcG9uc2UuZXhwaXJlc19hdCA8IERhdGUubm93KCkpIHtcbiAgICAgICAgICAgIGtlZXpMb2dnZXIuaW5mbygnVG9rZW4gaXMgaW52YWxpZCwgZ2VuZXJhdGluZyBhIG5ldyBvbmUnKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVUb2tlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVRva2VuKCkge1xuICAgICAgICBjb25zdCBhdXRoUmVzcG9uc2UgPSBhd2FpdCBhcGlHZW5lcmF0ZVRva2VuKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcGlTZWNyZXQ6IHRoaXMuYXBpU2VjcmV0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hdXRoUmVzcG9uc2UgPSBhdXRoUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuYXV0aFRva2VuID0gYXV0aFJlc3BvbnNlLmFjY2Vzc190b2tlbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbGl2ZSBtb2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG1vZGUgLSBgRmFsc2VgIHdpbGwgdXNlIHRoZSBzdGFnaW5nIG1vZGUgYW5kIGBUcnVlYCB3aWxsIHVzZSB0aGUgcHJvZHVjdGlvbiBtb2RlXG4gICAgICovXG4gICAgcHVibGljIHNldExpdmUobW9kZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmlzTGl2ZSA9IG1vZGU7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT0gSU5WT0lDRSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGludm9pY2VzIHdpdGggb3B0aW9uYWwgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAgICogQHBhcmFtIHBhcmFtcyAtIE9wdGlvbmFsIGZpbHRlciBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldEFsbEludm9pY2VzKHBhcmFtcz86IEludm9pY2VGaWx0ZXJQYXJhbXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlHZXRBbGxJbnZvaWNlcyh7XG4gICAgICAgICAgICBiYXNlRG9tYWluOiB0aGlzLmdldEJhc2VEb21haW4oKSxcbiAgICAgICAgICAgIGFwcElkOiB0aGlzLmFwcElkLFxuICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IHRoaXMuYXBpQ2xpZW50SWQsXG4gICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICBmaWx0ZXJQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGludm9pY2UgYnkgaXRzIGV4dGVybmFsIElEXG4gICAgICogQHBhcmFtIGludm9pY2VFeHRlcm5hbElkIC0gVGhlIGV4dGVybmFsIElEIG9mIHRoZSBpbnZvaWNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldEludm9pY2VCeUV4dGVybmFsSWQoaW52b2ljZUV4dGVybmFsSWQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZUb2tlbklzVmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIGFwaUdldEludm9pY2VCeUV4dGVybmFsSWQoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaW52b2ljZUlkOiBpbnZvaWNlRXh0ZXJuYWxJZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBpbnZvaWNlIHZpYSBlbWFpbFxuICAgICAqIEBwYXJhbSBlbWFpbCAtIFRoZSByZWNpcGllbnQgZW1haWwgYWRkcmVzc1xuICAgICAqIEBwYXJhbSBpbnZvaWNlRXh0ZXJuYWxJZCAtIFRoZSBleHRlcm5hbCBJRCBvZiB0aGUgaW52b2ljZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kSW52b2ljZShlbWFpbDogc3RyaW5nLCBpbnZvaWNlRXh0ZXJuYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gaW52b2ljZSB2aWEgZW1haWwgd2l0aCBDQy9CQ0Mgc3VwcG9ydFxuICAgICAqIEBwYXJhbSBlbWFpbFBhcmFtcyAtIEVtYWlsIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRvLCBjYywgYW5kIGJjY1xuICAgICAqIEBwYXJhbSBpbnZvaWNlRXh0ZXJuYWxJZCAtIFRoZSBleHRlcm5hbCBJRCBvZiB0aGUgaW52b2ljZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kSW52b2ljZShlbWFpbFBhcmFtczogU2VuZEludm9pY2VFbWFpbFBhcmFtcywgaW52b2ljZUV4dGVybmFsSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICBwdWJsaWMgYXN5bmMgc2VuZEludm9pY2UoXG4gICAgICAgIGVtYWlsT3JQYXJhbXM6IHN0cmluZyB8IFNlbmRJbnZvaWNlRW1haWxQYXJhbXMsXG4gICAgICAgIGludm9pY2VFeHRlcm5hbElkOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZUb2tlbklzVmFsaWQoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbE9yUGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGFwaVNlbmRJbnZvaWNlKHtcbiAgICAgICAgICAgICAgICBiYXNlRG9tYWluOiB0aGlzLmdldEJhc2VEb21haW4oKSxcbiAgICAgICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICAgICAgY2xpZW50TWFpbDogZW1haWxPclBhcmFtcyxcbiAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6IGludm9pY2VFeHRlcm5hbElkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwaVNlbmRJbnZvaWNlKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICBlbWFpbFBhcmFtczogZW1haWxPclBhcmFtcyxcbiAgICAgICAgICAgIGludm9pY2VJZDogaW52b2ljZUV4dGVybmFsSWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBpbnZvaWNlXG4gICAgICogQHBhcmFtIGludm9pY2VQYXJhbXMgLSBUaGUgaW52b2ljZSBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNyZWF0ZUludm9pY2UoaW52b2ljZVBhcmFtczogSW52b2ljZVJlcXVlc3QpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlDcmVhdGVJbnZvaWNlKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGludm9pY2U6IGludm9pY2VQYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGFuIGludm9pY2VcbiAgICAgKiBAcGFyYW0gaW52b2ljZUV4dGVybmFsSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGludm9pY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVJbnZvaWNlKGludm9pY2VFeHRlcm5hbElkOiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlWYWxpZGF0ZUludm9pY2Uoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaW52b2ljZUlkOiBpbnZvaWNlRXh0ZXJuYWxJZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGV4aXN0aW5nIGludm9pY2VcbiAgICAgKiBAcGFyYW0gaW52b2ljZUlkIC0gVGhlIGV4dGVybmFsIElEIG9mIHRoZSBpbnZvaWNlIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBpbnZvaWNlIC0gVGhlIHVwZGF0ZWQgaW52b2ljZSBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZUludm9pY2UoaW52b2ljZUlkOiBzdHJpbmcsIGludm9pY2U6IEludm9pY2VSZXF1ZXN0VjIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlVcGRhdGVJbnZvaWNlKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGludm9pY2VJZCxcbiAgICAgICAgICAgIGludm9pY2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhbiBpbnZvaWNlXG4gICAgICogQHBhcmFtIGludm9pY2VJZCAtIFRoZSBleHRlcm5hbCBJRCBvZiB0aGUgaW52b2ljZSB0byBkZWxldGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlSW52b2ljZShpbnZvaWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZUb2tlbklzVmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIGFwaURlbGV0ZUludm9pY2Uoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaW52b2ljZUlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJtaXQgYW4gaW52b2ljZSB0byBlRmFjdHVyYSAoUm9tYW5pYW4gZWxlY3Ryb25pYyBpbnZvaWNpbmcgc3lzdGVtKVxuICAgICAqIEBwYXJhbSBpbnZvaWNlSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGludm9pY2UgdG8gc3VibWl0XG4gICAgICogQHJldHVybnMgVGhlIHVwbG9hZCBpbmRleCBvciBjb25maXJtYXRpb24gZnJvbSBlRmFjdHVyYVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzdWJtaXRJbnZvaWNlVG9FZmFjdHVyYShpbnZvaWNlSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlRva2VuSXNWYWxpZCgpO1xuICAgICAgICByZXR1cm4gYXBpU3VibWl0RWZhY3R1cmEoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaW52b2ljZUlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgYW4gaW52b2ljZVxuICAgICAqIEBwYXJhbSBpbnZvaWNlSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGludm9pY2UgdG8gY2FuY2VsXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNhbmNlbEludm9pY2UoaW52b2ljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlDYW5jZWxJbnZvaWNlKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGludm9pY2VJZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgYW4gaW52b2ljZSBhcyBQREZcbiAgICAgKiBAcGFyYW0gaW52b2ljZUlkIC0gVGhlIGV4dGVybmFsIElEIG9mIHRoZSBpbnZvaWNlXG4gICAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIFBERiBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkSW52b2ljZVBkZihpbnZvaWNlSWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlRva2VuSXNWYWxpZCgpO1xuICAgICAgICByZXR1cm4gYXBpRG93bmxvYWRJbnZvaWNlUGRmKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICBpbnZvaWNlSWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09IElURU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBpdGVtcyB3aXRoIG9wdGlvbmFsIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvblxuICAgICAqIEBwYXJhbSBwYXJhbXMgLSBPcHRpb25hbCBmaWx0ZXIgcGFyYW1ldGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRBbGxJdGVtcyhwYXJhbXM/OiBJdGVtRmlsdGVyUGFyYW1zKTogUHJvbWlzZTxBbGxJdGVtc1Jlc3BvbnNlPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlRva2VuSXNWYWxpZCgpO1xuICAgICAgICByZXR1cm4gYXBpR2V0QWxsSXRlbXMoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgZmlsdGVyUGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBpdGVtIGJ5IGl0cyBleHRlcm5hbCBJRFxuICAgICAqIEBwYXJhbSBpdGVtSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGl0ZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SXRlbUJ5RXh0ZXJuYWxJZChpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8SXRlbVJlc3BvbnNlPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlRva2VuSXNWYWxpZCgpO1xuICAgICAgICByZXR1cm4gYXBpR2V0SXRlbUJ5SWQoe1xuICAgICAgICAgICAgYmFzZURvbWFpbjogdGhpcy5nZXRCYXNlRG9tYWluKCksXG4gICAgICAgICAgICBhcHBJZDogdGhpcy5hcHBJZCxcbiAgICAgICAgICAgIGFwcENsaWVudElkOiB0aGlzLmFwaUNsaWVudElkLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHRoaXMuYXV0aFRva2VuLFxuICAgICAgICAgICAgaXRlbUlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaXRlbVxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gZGF0YSB0byBjcmVhdGVcbiAgICAgKiBAcmV0dXJucyBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGNyZWF0ZWQgaXRlbVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVJdGVtKGl0ZW06IENyZWF0ZUl0ZW1SZXF1ZXN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlDcmVhdGVJdGVtKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBleGlzdGluZyBpdGVtIChmdWxsIHJlcGxhY2VtZW50KVxuICAgICAqIEBwYXJhbSBpdGVtSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAgICogQHBhcmFtIGl0ZW0gLSBUaGUgdXBkYXRlZCBpdGVtIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlSXRlbShpdGVtSWQ6IHN0cmluZywgaXRlbTogVXBkYXRlSXRlbVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmVG9rZW5Jc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBhcGlVcGRhdGVJdGVtKHtcbiAgICAgICAgICAgIGJhc2VEb21haW46IHRoaXMuZ2V0QmFzZURvbWFpbigpLFxuICAgICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXG4gICAgICAgICAgICBhcHBDbGllbnRJZDogdGhpcy5hcGlDbGllbnRJZCxcbiAgICAgICAgICAgIGJlYXJlclRva2VuOiB0aGlzLmF1dGhUb2tlbixcbiAgICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnRpYWxseSB1cGRhdGUgYW4gZXhpc3RpbmcgaXRlbVxuICAgICAqIEBwYXJhbSBpdGVtSWQgLSBUaGUgZXh0ZXJuYWwgSUQgb2YgdGhlIGl0ZW0gdG8gcGF0Y2hcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBmaWVsZHMgdG8gdXBkYXRlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBhdGNoSXRlbShpdGVtSWQ6IHN0cmluZywgaXRlbTogUGF0Y2hJdGVtUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZUb2tlbklzVmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIGFwaVBhdGNoSXRlbSh7XG4gICAgICAgICAgICBiYXNlRG9tYWluOiB0aGlzLmdldEJhc2VEb21haW4oKSxcbiAgICAgICAgICAgIGFwcElkOiB0aGlzLmFwcElkLFxuICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IHRoaXMuYXBpQ2xpZW50SWQsXG4gICAgICAgICAgICBiZWFyZXJUb2tlbjogdGhpcy5hdXRoVG9rZW4sXG4gICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=