@experteam-mx/ngx-services 18.9.20 → 20.0.0-beta
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 +80 -24
- package/fesm2022/experteam-mx-ngx-services.mjs +580 -438
- package/fesm2022/experteam-mx-ngx-services.mjs.map +1 -1
- package/index.d.ts +7667 -3
- package/package.json +6 -8
- package/esm2022/experteam-mx-ngx-services.mjs +0 -5
- package/esm2022/lib/apis/api-billing-do.service.mjs +0 -41
- package/esm2022/lib/apis/api-billing-gt.service.mjs +0 -61
- package/esm2022/lib/apis/api-billing-mx.service.mjs +0 -62
- package/esm2022/lib/apis/api-billing-pa.service.mjs +0 -105
- package/esm2022/lib/apis/api-billing-sv.service.mjs +0 -83
- package/esm2022/lib/apis/api-cash-operations.service.mjs +0 -93
- package/esm2022/lib/apis/api-catalogs.service.mjs +0 -616
- package/esm2022/lib/apis/api-companies.service.mjs +0 -1031
- package/esm2022/lib/apis/api-composition.service.mjs +0 -55
- package/esm2022/lib/apis/api-customs.service.mjs +0 -157
- package/esm2022/lib/apis/api-discounts.service.mjs +0 -243
- package/esm2022/lib/apis/api-e-tools-auto-billing.service.mjs +0 -75
- package/esm2022/lib/apis/api-events.service.mjs +0 -53
- package/esm2022/lib/apis/api-external-ops.service.mjs +0 -87
- package/esm2022/lib/apis/api-inventories.service.mjs +0 -208
- package/esm2022/lib/apis/api-invoices.service.mjs +0 -453
- package/esm2022/lib/apis/api-notifications.service.mjs +0 -104
- package/esm2022/lib/apis/api-open-items.service.mjs +0 -62
- package/esm2022/lib/apis/api-quote.service.mjs +0 -87
- package/esm2022/lib/apis/api-reports.service.mjs +0 -172
- package/esm2022/lib/apis/api-security.service.mjs +0 -245
- package/esm2022/lib/apis/api-services.service.mjs +0 -103
- package/esm2022/lib/apis/api-shipments.service.mjs +0 -116
- package/esm2022/lib/apis/api-supplies.service.mjs +0 -133
- package/esm2022/lib/apis/models/api-billing-do.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-billing-do.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-billing-mx.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-billing-mx.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-billing-pa.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-billing-pa.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-billing-sv.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-billing-sv.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-billing.models.mjs +0 -2
- package/esm2022/lib/apis/models/api-cash-operations.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-cash-operations.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-catalog.enum.mjs +0 -9
- package/esm2022/lib/apis/models/api-catalog.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-catalog.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-companies.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-companies.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-composition.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-composition.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-customs.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-customs.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-discounts.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-discounts.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-e-tools-auto-billing.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-e-tools-auto-billing.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-events.enum.mjs +0 -7
- package/esm2022/lib/apis/models/api-events.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-events.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-external-ops.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-external-ops.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-inventories.enum.mjs +0 -22
- package/esm2022/lib/apis/models/api-inventories.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-inventories.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-invoices.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-invoices.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-notifications.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-notifications.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-open-items.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-open-items.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-quote.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-quote.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-reports.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-reports.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-security.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-security.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-services.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-services.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-shipments.enums.mjs +0 -8
- package/esm2022/lib/apis/models/api-shipments.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-shipments.types.mjs +0 -2
- package/esm2022/lib/apis/models/api-supplies.interfaces.mjs +0 -2
- package/esm2022/lib/apis/models/api-supplies.types.mjs +0 -2
- package/esm2022/lib/apis/models/api.models.mjs +0 -2
- package/esm2022/lib/cypher/crypto.service.mjs +0 -93
- package/esm2022/lib/helpers/files.mjs +0 -9
- package/esm2022/lib/helpers/http.mjs +0 -66
- package/esm2022/lib/interceptors/api-headers.interceptor.mjs +0 -24
- package/esm2022/lib/interceptors/api-key.interceptor.mjs +0 -48
- package/esm2022/lib/interceptors/api-token.interceptor.mjs +0 -28
- package/esm2022/lib/interceptors/http-caching.interceptor.mjs +0 -37
- package/esm2022/lib/ngx-services.models.mjs +0 -11
- package/esm2022/lib/ngx-services.module.mjs +0 -33
- package/esm2022/lib/websockets/web-sockets.service.mjs +0 -115
- package/esm2022/public-api.mjs +0 -94
- package/lib/apis/api-billing-do.service.d.ts +0 -24
- package/lib/apis/api-billing-gt.service.d.ts +0 -38
- package/lib/apis/api-billing-mx.service.d.ts +0 -39
- package/lib/apis/api-billing-pa.service.d.ts +0 -68
- package/lib/apis/api-billing-sv.service.d.ts +0 -55
- package/lib/apis/api-cash-operations.service.d.ts +0 -62
- package/lib/apis/api-catalogs.service.d.ts +0 -451
- package/lib/apis/api-companies.service.d.ts +0 -714
- package/lib/apis/api-composition.service.d.ts +0 -35
- package/lib/apis/api-customs.service.d.ts +0 -110
- package/lib/apis/api-discounts.service.d.ts +0 -167
- package/lib/apis/api-e-tools-auto-billing.service.d.ts +0 -49
- package/lib/apis/api-events.service.d.ts +0 -33
- package/lib/apis/api-external-ops.service.d.ts +0 -54
- package/lib/apis/api-inventories.service.d.ts +0 -145
- package/lib/apis/api-invoices.service.d.ts +0 -317
- package/lib/apis/api-notifications.service.d.ts +0 -70
- package/lib/apis/api-open-items.service.d.ts +0 -41
- package/lib/apis/api-quote.service.d.ts +0 -65
- package/lib/apis/api-reports.service.d.ts +0 -120
- package/lib/apis/api-security.service.d.ts +0 -162
- package/lib/apis/api-services.service.d.ts +0 -67
- package/lib/apis/api-shipments.service.d.ts +0 -77
- package/lib/apis/api-supplies.service.d.ts +0 -93
- package/lib/apis/models/api-billing-do.interfaces.d.ts +0 -6
- package/lib/apis/models/api-billing-do.types.d.ts +0 -5
- package/lib/apis/models/api-billing-mx.interfaces.d.ts +0 -21
- package/lib/apis/models/api-billing-mx.types.d.ts +0 -13
- package/lib/apis/models/api-billing-pa.interfaces.d.ts +0 -26
- package/lib/apis/models/api-billing-pa.types.d.ts +0 -16
- package/lib/apis/models/api-billing-sv.interfaces.d.ts +0 -22
- package/lib/apis/models/api-billing-sv.types.d.ts +0 -21
- package/lib/apis/models/api-billing.models.d.ts +0 -27
- package/lib/apis/models/api-cash-operations.interfaces.d.ts +0 -40
- package/lib/apis/models/api-cash-operations.types.d.ts +0 -30
- package/lib/apis/models/api-catalog.enum.d.ts +0 -7
- package/lib/apis/models/api-catalog.interfaces.d.ts +0 -211
- package/lib/apis/models/api-catalog.types.d.ts +0 -213
- package/lib/apis/models/api-companies.interfaces.d.ts +0 -346
- package/lib/apis/models/api-companies.types.d.ts +0 -461
- package/lib/apis/models/api-composition.interfaces.d.ts +0 -272
- package/lib/apis/models/api-composition.types.d.ts +0 -9
- package/lib/apis/models/api-customs.interfaces.d.ts +0 -125
- package/lib/apis/models/api-customs.types.d.ts +0 -90
- package/lib/apis/models/api-discounts.interfaces.d.ts +0 -78
- package/lib/apis/models/api-discounts.types.d.ts +0 -89
- package/lib/apis/models/api-e-tools-auto-billing.interfaces.d.ts +0 -45
- package/lib/apis/models/api-e-tools-auto-billing.types.d.ts +0 -30
- package/lib/apis/models/api-events.enum.d.ts +0 -5
- package/lib/apis/models/api-events.interfaces.d.ts +0 -21
- package/lib/apis/models/api-events.types.d.ts +0 -14
- package/lib/apis/models/api-external-ops.interfaces.d.ts +0 -21
- package/lib/apis/models/api-external-ops.types.d.ts +0 -35
- package/lib/apis/models/api-inventories.enum.d.ts +0 -18
- package/lib/apis/models/api-inventories.interfaces.d.ts +0 -40
- package/lib/apis/models/api-inventories.types.d.ts +0 -62
- package/lib/apis/models/api-invoices.interfaces.d.ts +0 -277
- package/lib/apis/models/api-invoices.types.d.ts +0 -236
- package/lib/apis/models/api-notifications.interfaces.d.ts +0 -36
- package/lib/apis/models/api-notifications.types.d.ts +0 -34
- package/lib/apis/models/api-open-items.interfaces.d.ts +0 -32
- package/lib/apis/models/api-open-items.types.d.ts +0 -58
- package/lib/apis/models/api-quote.interfaces.d.ts +0 -13
- package/lib/apis/models/api-quote.types.d.ts +0 -17
- package/lib/apis/models/api-reports.interfaces.d.ts +0 -353
- package/lib/apis/models/api-reports.types.d.ts +0 -59
- package/lib/apis/models/api-security.interfaces.d.ts +0 -68
- package/lib/apis/models/api-security.types.d.ts +0 -72
- package/lib/apis/models/api-services.interfaces.d.ts +0 -49
- package/lib/apis/models/api-services.types.d.ts +0 -67
- package/lib/apis/models/api-shipments.enums.d.ts +0 -6
- package/lib/apis/models/api-shipments.interfaces.d.ts +0 -41
- package/lib/apis/models/api-shipments.types.d.ts +0 -121
- package/lib/apis/models/api-supplies.interfaces.d.ts +0 -40
- package/lib/apis/models/api-supplies.types.d.ts +0 -50
- package/lib/apis/models/api.models.d.ts +0 -36
- package/lib/cypher/crypto.service.d.ts +0 -15
- package/lib/helpers/files.d.ts +0 -2
- package/lib/helpers/http.d.ts +0 -38
- package/lib/interceptors/api-headers.interceptor.d.ts +0 -12
- package/lib/interceptors/api-key.interceptor.d.ts +0 -35
- package/lib/interceptors/api-token.interceptor.d.ts +0 -11
- package/lib/interceptors/http-caching.interceptor.d.ts +0 -12
- package/lib/ngx-services.models.d.ts +0 -63
- package/lib/ngx-services.module.d.ts +0 -16
- package/lib/websockets/web-sockets.service.d.ts +0 -49
- package/public-api.d.ts +0 -84
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { map } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common/http";
|
|
5
|
-
export class ApiInvoicesService {
|
|
6
|
-
environments;
|
|
7
|
-
http;
|
|
8
|
-
constructor(environments, http) {
|
|
9
|
-
this.environments = environments;
|
|
10
|
-
this.http = http;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Retrieves the API URL for invoices from the environments configuration.
|
|
14
|
-
*
|
|
15
|
-
* @return {string} The API URL for invoices.
|
|
16
|
-
*/
|
|
17
|
-
get url() {
|
|
18
|
-
return this.environments.apiInvoicesUrl ?? '';
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Sends an operation document to the server and processes the response.
|
|
22
|
-
*
|
|
23
|
-
* @param {OperationDocumentIn} body - The input data for the operation document.
|
|
24
|
-
* @return {Observable<OperationDocumentOut>} An observable containing the processed operation document output.
|
|
25
|
-
*/
|
|
26
|
-
postOperationDocument(body) {
|
|
27
|
-
return this.http.post(`${this.url}/operation/document`, body)
|
|
28
|
-
.pipe(map(({ data }) => data));
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Fetches and returns the collection receipt data for a given collection ID.
|
|
32
|
-
*
|
|
33
|
-
* @param {number} id - The unique identifier of the collection for which the receipt needs to be retrieved.
|
|
34
|
-
* @return {Observable<PrintCollectionReceiptOut>} An observable containing the collection receipt data.
|
|
35
|
-
*/
|
|
36
|
-
getPrintCollectionReceipt(id) {
|
|
37
|
-
return this.http.get(`${this.url}/operation/print/collection-receipt/${id}`)
|
|
38
|
-
.pipe(map(({ data }) => data));
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Handles the account payment operation by sending a POST request to the specified endpoint.
|
|
42
|
-
* Processes the response and returns the operation data.
|
|
43
|
-
*
|
|
44
|
-
* @param {OperationAccountPaymentIn} body The payload containing information for the account payment operation.
|
|
45
|
-
* @return {Observable<OperationAccountPaymentOut>} An observable emitting the processed account payment operation data.
|
|
46
|
-
*/
|
|
47
|
-
postOperationAccountPayment(body) {
|
|
48
|
-
return this.http.post(`${this.url}/operation/account-payment`, body)
|
|
49
|
-
.pipe(map(({ data }) => data));
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Cancels a payment receipt based on the provided input.
|
|
53
|
-
* This method sends a POST request to cancel a document.
|
|
54
|
-
*
|
|
55
|
-
* @param body The data required to cancel the payment receipt, encapsulated in a CancelPaymentReceiptIn object.
|
|
56
|
-
* @return An Observable representing the result of the cancellation. Emits an empty object on success.
|
|
57
|
-
*/
|
|
58
|
-
postOperationCancelDocument(body) {
|
|
59
|
-
return this.http.post(`${this.url}/operation/cancel-document`, body)
|
|
60
|
-
.pipe(map(({ data }) => data));
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Sends a POST request to cancel billing for a specific operation.
|
|
64
|
-
*
|
|
65
|
-
* @param {Object} params - The parameters for the cancellation request.
|
|
66
|
-
* @param {string} params.invoiceId - The ID of the invoice to be canceled.
|
|
67
|
-
* @param {Object} params.body - Additional data to be sent in the request body.
|
|
68
|
-
* @return {Observable<OperationCancelBillingOut>} An observable emitting the result of the cancellation operation.
|
|
69
|
-
*/
|
|
70
|
-
postOperationCancelBilling({ invoiceId, ...body }) {
|
|
71
|
-
return this.http.post(`${this.url}/operation/cancel-billing/${invoiceId}`, body)
|
|
72
|
-
.pipe(map(({ data }) => data));
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Fetches a list of customer types from the server.
|
|
76
|
-
*
|
|
77
|
-
* @param {QueryParams} params - Query parameters to filter or customize the request.
|
|
78
|
-
* @return {Observable<CustomerTypesOut>} An observable emitting the customer types fetched from the server.
|
|
79
|
-
*/
|
|
80
|
-
getCustomerTypes(params) {
|
|
81
|
-
return this.http.get(`${this.url}/customer-types`, { params })
|
|
82
|
-
.pipe(map(({ data }) => data));
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Retrieves document types specific to a given country.
|
|
86
|
-
*
|
|
87
|
-
* @param {QueryParams} params - The query parameters containing country-specific information.
|
|
88
|
-
* @return {Observable<CustomerDocumentTypesOut>} An observable emitting the document types available for the specified country.
|
|
89
|
-
*/
|
|
90
|
-
getCustomerDocumentTypes(params) {
|
|
91
|
-
return this.http.get(`${this.url}/customer-country-document-types`, { params })
|
|
92
|
-
.pipe(map(({ data }) => data));
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Fetches customer invoice details filtered by a custom invoice type.
|
|
96
|
-
*
|
|
97
|
-
* @param {InvoiceTypeCustomParamsIn} params - An object containing the filter parameters for the custom invoice type.
|
|
98
|
-
* @return {Observable<CustomersOut>} An observable containing customer invoice details of the specified type.
|
|
99
|
-
*/
|
|
100
|
-
getCustomers(params) {
|
|
101
|
-
return this.http.get(`${this.url}/customers`, { params })
|
|
102
|
-
.pipe(map(({ data }) => data));
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Sends a POST request to create or update an external shipment operation.
|
|
106
|
-
*
|
|
107
|
-
* @param {OperationShipmentExternalIn} params - The input parameters for the external shipment operation.
|
|
108
|
-
* @return {Observable<OperationShipmentExternalOut>} An observable that emits the result of the external shipment operation.
|
|
109
|
-
*/
|
|
110
|
-
postOperationShipmentExternal(params) {
|
|
111
|
-
return this.http.post(`${this.url}/operation/shipment/external`, params)
|
|
112
|
-
.pipe(map(({ data }) => data));
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Processes an external payment operation for a shipment.
|
|
116
|
-
*
|
|
117
|
-
* @param {OperationShipmentExternalIn} params - The input parameters required for the external payment operation.
|
|
118
|
-
* @return {Observable<OperationShipmentExternalOut>} An observable that emits the result of the external payment operation for a shipment.
|
|
119
|
-
*/
|
|
120
|
-
postOperationShipmentExternalPayment(params) {
|
|
121
|
-
return this.http.post(`${this.url}/operation/shipment/external/payment`, params)
|
|
122
|
-
.pipe(map(({ data }) => data));
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Retrieves and returns billing operation print details for a given document ID.
|
|
126
|
-
*
|
|
127
|
-
* @param {number} documentId - The ID of the document for which to fetch the print billing operation details.
|
|
128
|
-
* @return {Observable<OperationPrintDocumentOut>} An observable emitting the print billing operation details for the specified document.
|
|
129
|
-
*/
|
|
130
|
-
getOperationPrintDocument(documentId) {
|
|
131
|
-
return this.http.get(`${this.url}/operation/print/document/${documentId}`)
|
|
132
|
-
.pipe(map(({ data }) => data));
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Fetches all country payment types.
|
|
136
|
-
*
|
|
137
|
-
* @param {QueryParams} params - Query parameters to filter or customize the request.
|
|
138
|
-
* @return {Observable<CountryPaymentTypesOut>} An observable emitting the country payment types fetched from the server.
|
|
139
|
-
*/
|
|
140
|
-
getCountryPaymentTypes(params) {
|
|
141
|
-
return this.http.get(`${this.url}/country-payment-types`, { params })
|
|
142
|
-
.pipe(map(({ data }) => data));
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Updates an existing country payment type.
|
|
146
|
-
*
|
|
147
|
-
* @param {number} id - The ID of the country payment type to update.
|
|
148
|
-
* @param {CountryPaymentTypeIn} body - The updated data for the country payment type.
|
|
149
|
-
* @returns {Observable<CountryPaymentTypeOut>} An observable that emits the result of the update operation.
|
|
150
|
-
*/
|
|
151
|
-
putCountryPaymentType(id, body) {
|
|
152
|
-
return this.http.put(`${this.url}/country-payment-types/${id}`, body)
|
|
153
|
-
.pipe(map(({ data }) => data));
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Delete an existing country payment type.
|
|
157
|
-
*
|
|
158
|
-
* @param {number} id - The unique identifier of the country payment type to be deleted.
|
|
159
|
-
* @returns {Observable<CountryPaymentTypeOut>} An observable that emits the result of the delete operation.
|
|
160
|
-
*/
|
|
161
|
-
deleteCountryPaymentType(id) {
|
|
162
|
-
return this.http.delete(`${this.url}/country-payment-types/${id}`)
|
|
163
|
-
.pipe(map(({ data }) => data));
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Create a new country payment type resource.
|
|
167
|
-
*
|
|
168
|
-
* @param {CountryPaymentTypeIn} body - The input parameters required for create a new country payment type.
|
|
169
|
-
* @return {Observable<CountryPaymentTypeOut>} An observable that emits the result of create operation.
|
|
170
|
-
*/
|
|
171
|
-
postCountryPaymentType(body) {
|
|
172
|
-
return this.http.post(`${this.url}/country-payment-types`, body)
|
|
173
|
-
.pipe(map(({ data }) => data));
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Retrieves and returns a country payment type for a given ID.
|
|
177
|
-
*
|
|
178
|
-
* @param {number} id - The ID of the country payment type.
|
|
179
|
-
* @return {Observable<CountryPaymentTypeOut>} An observable that emits the result of show operation.
|
|
180
|
-
*/
|
|
181
|
-
getCountryPaymentType(id) {
|
|
182
|
-
return this.http.get(`${this.url}/country-payment-types/${id}`)
|
|
183
|
-
.pipe(map(({ data }) => data));
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Fetches all country payment type fields.
|
|
187
|
-
*
|
|
188
|
-
* @param {QueryParams} params - Query parameters to filter or customize the request.
|
|
189
|
-
* @return {Observable<CountryPaymentTypeFieldsOut>} An observable emitting the country payment type fields fetched from the server.
|
|
190
|
-
*/
|
|
191
|
-
getCountryPaymentTypeFields(params) {
|
|
192
|
-
return this.http.get(`${this.url}/country-payment-type-fields`, { params })
|
|
193
|
-
.pipe(map(({ data }) => data));
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Create a new country payment type field resource.
|
|
197
|
-
*
|
|
198
|
-
* @param {CountryPaymentTypeFieldIn} body - The input parameters required for create a new country payment type field.
|
|
199
|
-
* @return {Observable<CountryPaymentTypeFieldOut>} An observable that emits the result of create operation.
|
|
200
|
-
*/
|
|
201
|
-
postCountryPaymentTypeField(body) {
|
|
202
|
-
return this.http.post(`${this.url}/country-payment-type-fields`, body)
|
|
203
|
-
.pipe(map(({ data }) => data));
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Updates an existing country payment type field.
|
|
207
|
-
*
|
|
208
|
-
* @param {number} id - The ID of the country payment type field to update.
|
|
209
|
-
* @param {CountryPaymentTypeFieldIn} body - The updated data for the country payment type field.
|
|
210
|
-
* @returns {Observable<CountryPaymentTypeFieldOut>} An observable that emits the result of the update operation.
|
|
211
|
-
*/
|
|
212
|
-
putCountryPaymentTypeField(id, body) {
|
|
213
|
-
return this.http.put(`${this.url}/country-payment-type-fields/${id}`, body)
|
|
214
|
-
.pipe(map(({ data }) => data));
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Fetches all payment types.
|
|
218
|
-
*
|
|
219
|
-
* @param {QueryParams} params - Query parameters to filter or customize the request.
|
|
220
|
-
* @return {Observable<PaymentTypesOut>} An observable emitting the payment types fetched from the server.
|
|
221
|
-
*/
|
|
222
|
-
getPaymentTypes(params) {
|
|
223
|
-
return this.http.get(`${this.url}/payment-types`, { params })
|
|
224
|
-
.pipe(map(({ data }) => data));
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Fetches all payment type fields card.
|
|
228
|
-
*
|
|
229
|
-
* @param {QueryParams} params - Query parameters to filter or customize the request.
|
|
230
|
-
* @return {Observable<PaymentTypeFieldCardTypesOut>} An observable emitting the payment type fields card fetched from the server.
|
|
231
|
-
*/
|
|
232
|
-
getPaymentTypeFieldCardTypes(params) {
|
|
233
|
-
return this.http.get(`${this.url}/payment-type-field-card-types`, { params })
|
|
234
|
-
.pipe(map(({ data }) => data));
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Create a new payment type field card resource.
|
|
238
|
-
*
|
|
239
|
-
* @param {PaymentTypeFieldCardTypeIn} body - The input parameters required for create a new payment type field card.
|
|
240
|
-
* @return {Observable<PaymentTypeFieldCardTypeOut>} An observable that emits the result of create operation.
|
|
241
|
-
*/
|
|
242
|
-
postCountryPaymentTypeFieldCardType(body) {
|
|
243
|
-
return this.http.post(`${this.url}/payment-type-field-card-types`, body)
|
|
244
|
-
.pipe(map(({ data }) => data));
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Updates an existing payment type field card.
|
|
248
|
-
*
|
|
249
|
-
* @param {number} id - The ID of the payment type field card to update.
|
|
250
|
-
* @param {PaymentTypeFieldCardTypeIn} body - The updated data for the payment type field card.
|
|
251
|
-
* @returns {Observable<PaymentTypeFieldCardTypeOut>} An observable that emits the result of the update operation.
|
|
252
|
-
*/
|
|
253
|
-
putCountryPaymentTypeFieldCardType(id, body) {
|
|
254
|
-
return this.http.put(`${this.url}/payment-type-field-card-types/${id}`, body)
|
|
255
|
-
.pipe(map(({ data }) => data));
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Fetches all payment type fields accounts.
|
|
259
|
-
*
|
|
260
|
-
* @param {QueryParams} params - Query parameters to filter or customize the request.
|
|
261
|
-
* @return {Observable<PaymentTypeFieldAccountsOut>} An observable emitting the payment type fields accounts fetched from the server.
|
|
262
|
-
*/
|
|
263
|
-
getPaymentTypeFieldAccounts(params) {
|
|
264
|
-
return this.http.get(`${this.url}/payment-type-field-accounts`, { params })
|
|
265
|
-
.pipe(map(({ data }) => data));
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Create a new payment type field account resource.
|
|
269
|
-
*
|
|
270
|
-
* @param {PaymentTypeFieldAccountIn} body - The input parameters required for create a new payment type field account.
|
|
271
|
-
* @return {Observable<PaymentTypeFieldAccountOut>} An observable that emits the result of create operation.
|
|
272
|
-
*/
|
|
273
|
-
postCountryPaymentTypeFieldAccount(body) {
|
|
274
|
-
return this.http.post(`${this.url}/payment-type-field-accounts`, body)
|
|
275
|
-
.pipe(map(({ data }) => data));
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Updates an existing payment type field account.
|
|
279
|
-
*
|
|
280
|
-
* @param {number} id - The ID of the payment type field account to update.
|
|
281
|
-
* @param {PaymentTypeFieldAccountIn} body - The updated data for the payment type field account.
|
|
282
|
-
* @returns {Observable<PaymentTypeFieldAccountOut>} An observable that emits the result of the update operation.
|
|
283
|
-
*/
|
|
284
|
-
putCountryPaymentTypeFieldAccount(id, body) {
|
|
285
|
-
return this.http.put(`${this.url}/payment-type-field-accounts/${id}`, body)
|
|
286
|
-
.pipe(map(({ data }) => data));
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Fetches tolerance data from the server based on the provided query parameters.
|
|
290
|
-
*
|
|
291
|
-
* @param {QueryParams} params - The parameters to use for querying tolerances.
|
|
292
|
-
* @return {Observable<TolerancesOut>} An observable emitting the tolerance data.
|
|
293
|
-
*/
|
|
294
|
-
getTolerances(params) {
|
|
295
|
-
return this.http.get(`${this.url}/tolerances`, { params })
|
|
296
|
-
.pipe(map(({ data }) => data));
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* Retrieves the tolerance detail for a given identifier.
|
|
300
|
-
*
|
|
301
|
-
* @param {number} id - The unique identifier for the tolerance to retrieve.
|
|
302
|
-
* @return {Observable<ToleranceOut>} An observable containing the tolerance data.
|
|
303
|
-
*/
|
|
304
|
-
getTolerance(id) {
|
|
305
|
-
return this.http.get(`${this.url}/tolerances/${id}`)
|
|
306
|
-
.pipe(map(({ data }) => data));
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Sends a request to update or create a tolerance record using the provided data.
|
|
310
|
-
*
|
|
311
|
-
* @param {ToleranceIn} body - The tolerance input object containing the data to be sent in the request.
|
|
312
|
-
* @return {Observable<ToleranceOut>} An observable that emits the updated or created tolerance output object.
|
|
313
|
-
*/
|
|
314
|
-
postTolerance(body) {
|
|
315
|
-
return this.http.post(`${this.url}/tolerances`, body)
|
|
316
|
-
.pipe(map(({ data }) => data));
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Updates the tolerance with the specified ID using the provided data.
|
|
320
|
-
*
|
|
321
|
-
* @param {number} id - The unique identifier of the tolerance to update.
|
|
322
|
-
* @param {ToleranceIn} body - The data to update the tolerance with.
|
|
323
|
-
* @return {Observable<ToleranceOut>} An observable containing the updated tolerance information.
|
|
324
|
-
*/
|
|
325
|
-
putTolerance(id, body) {
|
|
326
|
-
return this.http.put(`${this.url}/tolerances/${id}`, body)
|
|
327
|
-
.pipe(map(({ data }) => data));
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Deletes the tolerance entry corresponding to the given ID.
|
|
331
|
-
*
|
|
332
|
-
* @param {number} id - The unique identifier of the tolerance to be deleted.
|
|
333
|
-
* @return {Observable<{}>} An Observable that emits the result of the delete operation.
|
|
334
|
-
*/
|
|
335
|
-
deleteTolerance(id) {
|
|
336
|
-
return this.http.delete(`${this.url}/tolerances/${id}`)
|
|
337
|
-
.pipe(map(({ data }) => data));
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Retrieves the document requests associated with a document ID.
|
|
341
|
-
*
|
|
342
|
-
* @param id - The unique identifier for the document.
|
|
343
|
-
* @returns An observable that emits the document requests data.
|
|
344
|
-
*/
|
|
345
|
-
getOperationDocumentRequests(id) {
|
|
346
|
-
return this.http.get(`${this.url}/operation/document/requests/${id}`)
|
|
347
|
-
.pipe(map(({ data }) => data));
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Retrieves a list of documents based on the provided query parameters.
|
|
351
|
-
*
|
|
352
|
-
* @param params - The query parameters to filter and paginate the documents
|
|
353
|
-
* @returns An Observable that emits the documents data when the HTTP request completes
|
|
354
|
-
*/
|
|
355
|
-
getDocuments(params) {
|
|
356
|
-
return this.http.get(`${this.url}/documents`, { params })
|
|
357
|
-
.pipe(map(({ data }) => data));
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Fetches document status values from the API.
|
|
361
|
-
*
|
|
362
|
-
* Sends an HTTP GET request to the service's `/document-status` endpoint using the supplied query parameters
|
|
363
|
-
* and returns the decoded `data` payload from the API success envelope.
|
|
364
|
-
*
|
|
365
|
-
* @param params - Query parameters to apply to the request (e.g. filtering, pagination, search).
|
|
366
|
-
* @returns An Observable that emits a DocumentStatusesOut object containing the document status data.
|
|
367
|
-
*/
|
|
368
|
-
getDocumentStatuses(params) {
|
|
369
|
-
return this.http.get(`${this.url}/document-status`, { params })
|
|
370
|
-
.pipe(map(({ data }) => data));
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Retrieves the XML print representation for a given operation (invoice).
|
|
374
|
-
*
|
|
375
|
-
* Sends an HTTP GET request to the backend endpoint `/operation/print/xml/{documentId}` and
|
|
376
|
-
* unwraps the `data` field from the API success response before emitting it.
|
|
377
|
-
*
|
|
378
|
-
* @param documentId - The numeric identifier of the document to fetch.
|
|
379
|
-
* @returns An Observable that emits the OperationPrintXmlOut payload on success and completes.
|
|
380
|
-
* The Observable will error if the HTTP request fails or the response does not contain the expected data.
|
|
381
|
-
*/
|
|
382
|
-
getOperationPrintXml(documentId) {
|
|
383
|
-
return this.http.get(`${this.url}/operation/print/xml/${documentId}`)
|
|
384
|
-
.pipe(map(({ data }) => data));
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Retrieves a list of providers based on the provided query parameters.
|
|
388
|
-
* @param params - Query parameters to filter or paginate the providers list
|
|
389
|
-
* @returns An Observable that emits the providers data
|
|
390
|
-
*/
|
|
391
|
-
getProviders(params) {
|
|
392
|
-
return this.http.get(`${this.url}/providers`, { params })
|
|
393
|
-
.pipe(map(({ data }) => data));
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Retrieves the document type ranges based on the provided query parameters.
|
|
397
|
-
* @param params - The query parameters to filter document type ranges
|
|
398
|
-
* @returns An Observable that emits the document type ranges data
|
|
399
|
-
*/
|
|
400
|
-
getDocumentsTypesRanges(params) {
|
|
401
|
-
return this.http.get(`${this.url}/document-type-ranges`, { params })
|
|
402
|
-
.pipe(map(({ data }) => data));
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Creates a new document type range.
|
|
406
|
-
* @param body - The document type range data to create
|
|
407
|
-
* @returns An observable that emits the created document type range
|
|
408
|
-
*/
|
|
409
|
-
postDocumentTypeRange(body) {
|
|
410
|
-
return this.http.post(`${this.url}/document-type-ranges`, body)
|
|
411
|
-
.pipe(map(({ data }) => data));
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Deletes a document type range by its identifier.
|
|
415
|
-
* @param id - The unique identifier of the document type range to delete
|
|
416
|
-
* @returns An Observable that emits the deleted DocumentTypeRangeOut object
|
|
417
|
-
*/
|
|
418
|
-
deleteDocumentsTypesRange(id) {
|
|
419
|
-
return this.http.delete(`${this.url}/document-type-ranges/${id}`)
|
|
420
|
-
.pipe(map(({ data }) => data));
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Updates a document type range for a given ID.
|
|
424
|
-
* @param id - The unique identifier of the document type range to update
|
|
425
|
-
* @param data - The document type range data to update
|
|
426
|
-
* @returns An Observable that emits the updated DocumentTypeRangeOut object
|
|
427
|
-
*/
|
|
428
|
-
putDocumentsTypeRange(id, data) {
|
|
429
|
-
return this.http.put(`${this.url}/document-type-ranges/${id}`, data)
|
|
430
|
-
.pipe(map(({ data }) => data));
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Retrieves the list of document types available for a specific country.
|
|
434
|
-
* @param params - Query parameters to filter or customize the country document types request
|
|
435
|
-
* @returns Observable containing the country document types data
|
|
436
|
-
*/
|
|
437
|
-
getCountryDocumentsTypes(params) {
|
|
438
|
-
return this.http.get(`${this.url}/country-document-types`, { params })
|
|
439
|
-
.pipe(map(({ data }) => data));
|
|
440
|
-
}
|
|
441
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiInvoicesService, deps: [{ token: 'env' }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
442
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiInvoicesService, providedIn: 'root' });
|
|
443
|
-
}
|
|
444
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiInvoicesService, decorators: [{
|
|
445
|
-
type: Injectable,
|
|
446
|
-
args: [{
|
|
447
|
-
providedIn: 'root'
|
|
448
|
-
}]
|
|
449
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
450
|
-
type: Inject,
|
|
451
|
-
args: ['env']
|
|
452
|
-
}] }, { type: i1.HttpClient }] });
|
|
453
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWludm9pY2VzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHBlcnRlYW0tbXgvbmd4LXNlcnZpY2VzL3NyYy9saWIvYXBpcy9hcGktaW52b2ljZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFjLE1BQU0sTUFBTSxDQUFBOzs7QUFnRHRDLE1BQU0sT0FBTyxrQkFBa0I7SUFFSjtJQUNmO0lBRlYsWUFDeUIsWUFBeUIsRUFDeEMsSUFBZ0I7UUFERCxpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUN4QyxTQUFJLEdBQUosSUFBSSxDQUFZO0lBQ3RCLENBQUM7SUFFTDs7OztPQUlHO0lBQ0gsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUE7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gscUJBQXFCLENBQUUsSUFBeUI7UUFDOUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBbUMsR0FBRyxJQUFJLENBQUMsR0FBRyxxQkFBcUIsRUFBRSxJQUFJLENBQUM7YUFDNUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gseUJBQXlCLENBQUUsRUFBVTtRQUNuQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF3QyxHQUFHLElBQUksQ0FBQyxHQUFHLHVDQUF1QyxFQUFFLEVBQUUsQ0FBQzthQUNoSCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFD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QUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxxQkFBcUIsQ0FBRSxFQUFVLEVBQUUsSUFBeUI7UUFDMUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBbUMsR0FBRyxJQUFJLENBQUMsR0FBRyx5QkFBeUIsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDO2FBQ25HLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUUsTUFBbUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBc0MsR0FBRyxJQUFJLENBQUMsR0FBRyx5QkFBeUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO2FBQ3hHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7d0dBM2RVLGtCQUFrQixrQkFFbkIsS0FBSzs0R0FGSixrQkFBa0IsY0FGakIsTUFBTTs7NEZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBR0ksTUFBTTsyQkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL25neC1zZXJ2aWNlcy5tb2RlbHMnXHJcbmltcG9ydCB7XHJcbiAgQ2FuY2VsUGF5bWVudFJlY2VpcHRJbixcclxuICBDb3VudHJ5RG9jdW1lbnRUeXBlc091dCxcclxuICBDb3VudHJ5UGF5bWVudFR5cGVGaWVsZEluLFxyXG4gIENvdW50cnlQYXltZW50VHlwZUZpZWxkT3V0LFxyXG4gIENvdW50cnlQYXltZW50VHlwZUZpZWxkc091dCxcclxuICBDb3VudHJ5UGF5bWVudFR5cGVJbixcclxuICBDb3VudHJ5UGF5bWVudFR5cGVPdXQsXHJcbiAgQ291bnRyeVBheW1lbnRUeXBlc091dCxcclxuICBDdXN0b21lckRvY3VtZW50VHlwZXNPdXQsXHJcbiAgQ3VzdG9tZXJzT3V0LFxyXG4gIEN1c3RvbWVyVHlwZXNPdXQsXHJcbiAgRG9jdW1lbnRTdGF0dXNlc091dCxcclxuICBEb2N1bWVudFR5cGVSYW5nZUluLFxyXG4gIERvY3VtZW50VHlwZVJhbmdlT3V0LFxyXG4gIERvY3VtZW50VHlwZVJhbmdlc091dCxcclxuICBHZXREb2N1bWVudHNPdXQsXHJcbiAgT3BlcmF0aW9uQWNjb3VudFBheW1lbnRJbixcclxuICBPcGVyYXRpb25BY2NvdW50UGF5bWVudE91dCxcclxuICBPcGVyYXRpb25DYW5jZWxCaWxsaW5nSW4sXHJcbiAgT3BlcmF0aW9uQ2FuY2VsQmlsbGluZ091dCxcclxuICBPcGVyYXRpb25Eb2N1bWVudEluLFxyXG4gIE9wZXJhdGlvbkRvY3VtZW50T3V0LFxyXG4gIE9wZXJhdGlvbkRvY3VtZW50UmVxdWVzdHNPdXQsXHJcbiAgT3BlcmF0aW9uUHJpbnREb2N1bWVudE91dCxcclxuICBPcGVyYXRpb25QcmludFhtbE91dCxcclxuICBPcGVyYXRpb25TaGlwbWVudEV4dGVybmFsSW4sXHJcbiAgT3BlcmF0aW9uU2hpcG1lbnRFeHRlcm5hbE91dCxcclxuICBQYXltZW50VHlwZUZpZWxkQWNjb3VudEluLFxyXG4gIFBheW1lbnRUeXBlRmllbGRBY2NvdW50T3V0LFxyXG4gIFBheW1lbnRUeXBlRmllbGRBY2NvdW50c091dCxcclxuICBQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGVJbixcclxuICBQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGVPdXQsXHJcbiAgUGF5bWVudFR5cGVGaWVsZENhcmRUeXBlc091dCxcclxuICBQYXltZW50VHlwZXNPdXQsXHJcbiAgUHJpbnRDb2xsZWN0aW9uUmVjZWlwdE91dCxcclxuICBQcm92aWRlcnNPdXQsXHJcbiAgVG9sZXJhbmNlSW4sXHJcbiAgVG9sZXJhbmNlT3V0LFxyXG4gIFRvbGVyYW5jZXNPdXQsXHJcbn0gZnJvbSAnLi9tb2RlbHMvYXBpLWludm9pY2VzLnR5cGVzJ1xyXG5pbXBvcnQgeyBBcGlTdWNjZXNzLCBRdWVyeVBhcmFtcyB9IGZyb20gJy4vbW9kZWxzL2FwaS5tb2RlbHMnXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcGlJbnZvaWNlc1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yIChcclxuICAgIEBJbmplY3QoJ2VudicpIHByaXZhdGUgZW52aXJvbm1lbnRzOiBFbnZpcm9ubWVudCxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG4gICkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgQVBJIFVSTCBmb3IgaW52b2ljZXMgZnJvbSB0aGUgZW52aXJvbm1lbnRzIGNvbmZpZ3VyYXRpb24uXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBBUEkgVVJMIGZvciBpbnZvaWNlcy5cclxuICAgKi9cclxuICBnZXQgdXJsICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRzLmFwaUludm9pY2VzVXJsID8/ICcnXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhbiBvcGVyYXRpb24gZG9jdW1lbnQgdG8gdGhlIHNlcnZlciBhbmQgcHJvY2Vzc2VzIHRoZSByZXNwb25zZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uRG9jdW1lbnRJbn0gYm9keSAtIFRoZSBpbnB1dCBkYXRhIGZvciB0aGUgb3BlcmF0aW9uIGRvY3VtZW50LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8T3BlcmF0aW9uRG9jdW1lbnRPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHByb2Nlc3NlZCBvcGVyYXRpb24gZG9jdW1lbnQgb3V0cHV0LlxyXG4gICAqL1xyXG4gIHBvc3RPcGVyYXRpb25Eb2N1bWVudCAoYm9keTogT3BlcmF0aW9uRG9jdW1lbnRJbik6IE9ic2VydmFibGU8T3BlcmF0aW9uRG9jdW1lbnRPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPE9wZXJhdGlvbkRvY3VtZW50T3V0Pj4oYCR7dGhpcy51cmx9L29wZXJhdGlvbi9kb2N1bWVudGAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiByZWNlaXB0IGRhdGEgZm9yIGEgZ2l2ZW4gY29sbGVjdGlvbiBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29sbGVjdGlvbiBmb3Igd2hpY2ggdGhlIHJlY2VpcHQgbmVlZHMgdG8gYmUgcmV0cmlldmVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UHJpbnRDb2xsZWN0aW9uUmVjZWlwdE91dD59IEFuIG9ic2VydmFibGUgY29udGFpbmluZyB0aGUgY29sbGVjdGlvbiByZWNlaXB0IGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0UHJpbnRDb2xsZWN0aW9uUmVjZWlwdCAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8UHJpbnRDb2xsZWN0aW9uUmVjZWlwdE91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxQcmludENvbGxlY3Rpb25SZWNlaXB0T3V0Pj4oYCR7dGhpcy51cmx9L29wZXJhdGlvbi9wcmludC9jb2xsZWN0aW9uLXJlY2VpcHQvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIGFjY291bnQgcGF5bWVudCBvcGVyYXRpb24gYnkgc2VuZGluZyBhIFBPU1QgcmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LlxyXG4gICAqIFByb2Nlc3NlcyB0aGUgcmVzcG9uc2UgYW5kIHJldHVybnMgdGhlIG9wZXJhdGlvbiBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPcGVyYXRpb25BY2NvdW50UGF5bWVudElufSBib2R5IFRoZSBwYXlsb2FkIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IHBheW1lbnQgb3BlcmF0aW9uLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8T3BlcmF0aW9uQWNjb3VudFBheW1lbnRPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBwcm9jZXNzZWQgYWNjb3VudCBwYXltZW50IG9wZXJhdGlvbiBkYXRhLlxyXG4gICAqL1xyXG4gIHBvc3RPcGVyYXRpb25BY2NvdW50UGF5bWVudCAoYm9keTogT3BlcmF0aW9uQWNjb3VudFBheW1lbnRJbik6IE9ic2VydmFibGU8T3BlcmF0aW9uQWNjb3VudFBheW1lbnRPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPE9wZXJhdGlvbkFjY291bnRQYXltZW50T3V0Pj4oYCR7dGhpcy51cmx9L29wZXJhdGlvbi9hY2NvdW50LXBheW1lbnRgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbmNlbHMgYSBwYXltZW50IHJlY2VpcHQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGlucHV0LlxyXG4gICAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgUE9TVCByZXF1ZXN0IHRvIGNhbmNlbCBhIGRvY3VtZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJvZHkgVGhlIGRhdGEgcmVxdWlyZWQgdG8gY2FuY2VsIHRoZSBwYXltZW50IHJlY2VpcHQsIGVuY2Fwc3VsYXRlZCBpbiBhIENhbmNlbFBheW1lbnRSZWNlaXB0SW4gb2JqZWN0LlxyXG4gICAqIEByZXR1cm4gQW4gT2JzZXJ2YWJsZSByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2FuY2VsbGF0aW9uLiBFbWl0cyBhbiBlbXB0eSBvYmplY3Qgb24gc3VjY2Vzcy5cclxuICAgKi9cclxuICBwb3N0T3BlcmF0aW9uQ2FuY2VsRG9jdW1lbnQgKGJvZHk6IENhbmNlbFBheW1lbnRSZWNlaXB0SW4pOiBPYnNlcnZhYmxlPHt9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2Vzczx7fT4+KGAke3RoaXMudXJsfS9vcGVyYXRpb24vY2FuY2VsLWRvY3VtZW50YCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBjYW5jZWwgYmlsbGluZyBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb24uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmludm9pY2VJZCAtIFRoZSBJRCBvZiB0aGUgaW52b2ljZSB0byBiZSBjYW5jZWxlZC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLmJvZHkgLSBBZGRpdGlvbmFsIGRhdGEgdG8gYmUgc2VudCBpbiB0aGUgcmVxdWVzdCBib2R5LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8T3BlcmF0aW9uQ2FuY2VsQmlsbGluZ091dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2FuY2VsbGF0aW9uIG9wZXJhdGlvbi5cclxuICAgKi9cclxuICBwb3N0T3BlcmF0aW9uQ2FuY2VsQmlsbGluZyAoeyBpbnZvaWNlSWQsIC4uLmJvZHkgfTogT3BlcmF0aW9uQ2FuY2VsQmlsbGluZ0luKTogT2JzZXJ2YWJsZTxPcGVyYXRpb25DYW5jZWxCaWxsaW5nT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxPcGVyYXRpb25DYW5jZWxCaWxsaW5nT3V0Pj4oYCR7dGhpcy51cmx9L29wZXJhdGlvbi9jYW5jZWwtYmlsbGluZy8ke2ludm9pY2VJZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgYSBsaXN0IG9mIGN1c3RvbWVyIHR5cGVzIGZyb20gdGhlIHNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIG9yIGN1c3RvbWl6ZSB0aGUgcmVxdWVzdC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEN1c3RvbWVyVHlwZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBjdXN0b21lciB0eXBlcyBmZXRjaGVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgKi9cclxuICBnZXRDdXN0b21lclR5cGVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxDdXN0b21lclR5cGVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEN1c3RvbWVyVHlwZXNPdXQ+PihgJHt0aGlzLnVybH0vY3VzdG9tZXItdHlwZXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBkb2N1bWVudCB0eXBlcyBzcGVjaWZpYyB0byBhIGdpdmVuIGNvdW50cnkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyBjb250YWluaW5nIGNvdW50cnktc3BlY2lmaWMgaW5mb3JtYXRpb24uXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDdXN0b21lckRvY3VtZW50VHlwZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBkb2N1bWVudCB0eXBlcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgY291bnRyeS5cclxuICAgKi9cclxuICBnZXRDdXN0b21lckRvY3VtZW50VHlwZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPEN1c3RvbWVyRG9jdW1lbnRUeXBlc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxDdXN0b21lckRvY3VtZW50VHlwZXNPdXQ+PihgJHt0aGlzLnVybH0vY3VzdG9tZXItY291bnRyeS1kb2N1bWVudC10eXBlc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBjdXN0b21lciBpbnZvaWNlIGRldGFpbHMgZmlsdGVyZWQgYnkgYSBjdXN0b20gaW52b2ljZSB0eXBlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtJbnZvaWNlVHlwZUN1c3RvbVBhcmFtc0lufSBwYXJhbXMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXN0b20gaW52b2ljZSB0eXBlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q3VzdG9tZXJzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIGN1c3RvbWVyIGludm9pY2UgZGV0YWlscyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuXHJcbiAgICovXHJcbiAgZ2V0Q3VzdG9tZXJzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxDdXN0b21lcnNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8Q3VzdG9tZXJzT3V0Pj4oYCR7dGhpcy51cmx9L2N1c3RvbWVyc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gY3JlYXRlIG9yIHVwZGF0ZSBhbiBleHRlcm5hbCBzaGlwbWVudCBvcGVyYXRpb24uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09wZXJhdGlvblNoaXBtZW50RXh0ZXJuYWxJbn0gcGFyYW1zIC0gVGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIHRoZSBleHRlcm5hbCBzaGlwbWVudCBvcGVyYXRpb24uXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxPcGVyYXRpb25TaGlwbWVudEV4dGVybmFsT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIGV4dGVybmFsIHNoaXBtZW50IG9wZXJhdGlvbi5cclxuICAgKi9cclxuICBwb3N0T3BlcmF0aW9uU2hpcG1lbnRFeHRlcm5hbCAocGFyYW1zOiBPcGVyYXRpb25TaGlwbWVudEV4dGVybmFsSW4pOiBPYnNlcnZhYmxlPE9wZXJhdGlvblNoaXBtZW50RXh0ZXJuYWxPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPE9wZXJhdGlvblNoaXBtZW50RXh0ZXJuYWxPdXQ+PihgJHt0aGlzLnVybH0vb3BlcmF0aW9uL3NoaXBtZW50L2V4dGVybmFsYCwgcGFyYW1zKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2Nlc3NlcyBhbiBleHRlcm5hbCBwYXltZW50IG9wZXJhdGlvbiBmb3IgYSBzaGlwbWVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uU2hpcG1lbnRFeHRlcm5hbElufSBwYXJhbXMgLSBUaGUgaW5wdXQgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgdGhlIGV4dGVybmFsIHBheW1lbnQgb3BlcmF0aW9uLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8T3BlcmF0aW9uU2hpcG1lbnRFeHRlcm5hbE91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHRoZSBleHRlcm5hbCBwYXltZW50IG9wZXJhdGlvbiBmb3IgYSBzaGlwbWVudC5cclxuICAgKi9cclxuICBwb3N0T3BlcmF0aW9uU2hpcG1lbnRFeHRlcm5hbFBheW1lbnQgKHBhcmFtczogT3BlcmF0aW9uU2hpcG1lbnRFeHRlcm5hbEluKTogT2JzZXJ2YWJsZTxPcGVyYXRpb25TaGlwbWVudEV4dGVybmFsT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxPcGVyYXRpb25TaGlwbWVudEV4dGVybmFsT3V0Pj4oYCR7dGhpcy51cmx9L29wZXJhdGlvbi9zaGlwbWVudC9leHRlcm5hbC9wYXltZW50YCwgcGFyYW1zKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhbmQgcmV0dXJucyBiaWxsaW5nIG9wZXJhdGlvbiBwcmludCBkZXRhaWxzIGZvciBhIGdpdmVuIGRvY3VtZW50IElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRvY3VtZW50SWQgLSBUaGUgSUQgb2YgdGhlIGRvY3VtZW50IGZvciB3aGljaCB0byBmZXRjaCB0aGUgcHJpbnQgYmlsbGluZyBvcGVyYXRpb24gZGV0YWlscy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPE9wZXJhdGlvblByaW50RG9jdW1lbnRPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBwcmludCBiaWxsaW5nIG9wZXJhdGlvbiBkZXRhaWxzIGZvciB0aGUgc3BlY2lmaWVkIGRvY3VtZW50LlxyXG4gICAqL1xyXG4gIGdldE9wZXJhdGlvblByaW50RG9jdW1lbnQgKGRvY3VtZW50SWQ6IG51bWJlcik6IE9ic2VydmFibGU8T3BlcmF0aW9uUHJpbnREb2N1bWVudE91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxPcGVyYXRpb25QcmludERvY3VtZW50T3V0Pj4oYCR7dGhpcy51cmx9L29wZXJhdGlvbi9wcmludC9kb2N1bWVudC8ke2RvY3VtZW50SWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGFsbCBjb3VudHJ5IHBheW1lbnQgdHlwZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBRdWVyeSBwYXJhbWV0ZXJzIHRvIGZpbHRlciBvciBjdXN0b21pemUgdGhlIHJlcXVlc3QuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb3VudHJ5UGF5bWVudFR5cGVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgY291bnRyeSBwYXltZW50IHR5cGVzIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqL1xyXG4gIGdldENvdW50cnlQYXltZW50VHlwZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPENvdW50cnlQYXltZW50VHlwZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8Q291bnRyeVBheW1lbnRUeXBlc091dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXBheW1lbnQtdHlwZXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgY291bnRyeSBwYXltZW50IHR5cGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIGNvdW50cnkgcGF5bWVudCB0eXBlIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge0NvdW50cnlQYXltZW50VHlwZUlufSBib2R5IC0gVGhlIHVwZGF0ZWQgZGF0YSBmb3IgdGhlIGNvdW50cnkgcGF5bWVudCB0eXBlLlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPENvdW50cnlQYXltZW50VHlwZU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHRoZSB1cGRhdGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIHB1dENvdW50cnlQYXltZW50VHlwZSAoaWQ6IG51bWJlciwgYm9keTogQ291bnRyeVBheW1lbnRUeXBlSW4pOiBPYnNlcnZhYmxlPENvdW50cnlQYXltZW50VHlwZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxDb3VudHJ5UGF5bWVudFR5cGVPdXQ+PihgJHt0aGlzLnVybH0vY291bnRyeS1wYXltZW50LXR5cGVzLyR7aWR9YCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYW4gZXhpc3RpbmcgY291bnRyeSBwYXltZW50IHR5cGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50cnkgcGF5bWVudCB0eXBlIHRvIGJlIGRlbGV0ZWQuXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Q291bnRyeVBheW1lbnRUeXBlT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIGRlbGV0ZSBvcGVyYXRpb24uXHJcbiAgICovXHJcbiAgZGVsZXRlQ291bnRyeVBheW1lbnRUeXBlIChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxDb3VudHJ5UGF5bWVudFR5cGVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPEFwaVN1Y2Nlc3M8Q291bnRyeVBheW1lbnRUeXBlT3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcGF5bWVudC10eXBlcy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGNvdW50cnkgcGF5bWVudCB0eXBlIHJlc291cmNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDb3VudHJ5UGF5bWVudFR5cGVJbn0gYm9keSAtIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBjcmVhdGUgYSBuZXcgY291bnRyeSBwYXltZW50IHR5cGUuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb3VudHJ5UGF5bWVudFR5cGVPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3VsdCBvZiBjcmVhdGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIHBvc3RDb3VudHJ5UGF5bWVudFR5cGUgKGJvZHk6IENvdW50cnlQYXltZW50VHlwZUluKTogT2JzZXJ2YWJsZTxDb3VudHJ5UGF5bWVudFR5cGVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPENvdW50cnlQYXltZW50VHlwZU91dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXBheW1lbnQtdHlwZXNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhbmQgcmV0dXJucyBhIGNvdW50cnkgcGF5bWVudCB0eXBlIGZvciBhIGdpdmVuIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSBjb3VudHJ5IHBheW1lbnQgdHlwZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlQYXltZW50VHlwZU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHNob3cgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGdldENvdW50cnlQYXltZW50VHlwZSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8Q291bnRyeVBheW1lbnRUeXBlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPENvdW50cnlQYXltZW50VHlwZU91dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXBheW1lbnQtdHlwZXMvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgYWxsIGNvdW50cnkgcGF5bWVudCB0eXBlIGZpZWxkcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIG9yIGN1c3RvbWl6ZSB0aGUgcmVxdWVzdC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlQYXltZW50VHlwZUZpZWxkc091dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIGNvdW50cnkgcGF5bWVudCB0eXBlIGZpZWxkcyBmZXRjaGVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgKi9cclxuICBnZXRDb3VudHJ5UGF5bWVudFR5cGVGaWVsZHMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPENvdW50cnlQYXltZW50VHlwZUZpZWxkc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxDb3VudHJ5UGF5bWVudFR5cGVGaWVsZHNPdXQ+PihgJHt0aGlzLnVybH0vY291bnRyeS1wYXltZW50LXR5cGUtZmllbGRzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBuZXcgY291bnRyeSBwYXltZW50IHR5cGUgZmllbGQgcmVzb3VyY2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0NvdW50cnlQYXltZW50VHlwZUZpZWxkSW59IGJvZHkgLSBUaGUgaW5wdXQgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgY3JlYXRlIGEgbmV3IGNvdW50cnkgcGF5bWVudCB0eXBlIGZpZWxkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q291bnRyeVBheW1lbnRUeXBlRmllbGRPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3VsdCBvZiBjcmVhdGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIHBvc3RDb3VudHJ5UGF5bWVudFR5cGVGaWVsZCAoYm9keTogQ291bnRyeVBheW1lbnRUeXBlRmllbGRJbik6IE9ic2VydmFibGU8Q291bnRyeVBheW1lbnRUeXBlRmllbGRPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPENvdW50cnlQYXltZW50VHlwZUZpZWxkT3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcGF5bWVudC10eXBlLWZpZWxkc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyBhbiBleGlzdGluZyBjb3VudHJ5IHBheW1lbnQgdHlwZSBmaWVsZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgY291bnRyeSBwYXltZW50IHR5cGUgZmllbGQgdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7Q291bnRyeVBheW1lbnRUeXBlRmllbGRJbn0gYm9keSAtIFRoZSB1cGRhdGVkIGRhdGEgZm9yIHRoZSBjb3VudHJ5IHBheW1lbnQgdHlwZSBmaWVsZC5cclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxDb3VudHJ5UGF5bWVudFR5cGVGaWVsZE91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHRoZSB1cGRhdGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIHB1dENvdW50cnlQYXltZW50VHlwZUZpZWxkIChpZDogbnVtYmVyLCBib2R5OiBDb3VudHJ5UGF5bWVudFR5cGVGaWVsZEluKTogT2JzZXJ2YWJsZTxDb3VudHJ5UGF5bWVudFR5cGVGaWVsZE91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxDb3VudHJ5UGF5bWVudFR5cGVGaWVsZE91dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXBheW1lbnQtdHlwZS1maWVsZHMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgYWxsIHBheW1lbnQgdHlwZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBRdWVyeSBwYXJhbWV0ZXJzIHRvIGZpbHRlciBvciBjdXN0b21pemUgdGhlIHJlcXVlc3QuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxQYXltZW50VHlwZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBwYXltZW50IHR5cGVzIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqL1xyXG4gIGdldFBheW1lbnRUeXBlcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8UGF5bWVudFR5cGVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPFBheW1lbnRUeXBlc091dD4+KGAke3RoaXMudXJsfS9wYXltZW50LXR5cGVzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGFsbCBwYXltZW50IHR5cGUgZmllbGRzIGNhcmQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBRdWVyeSBwYXJhbWV0ZXJzIHRvIGZpbHRlciBvciBjdXN0b21pemUgdGhlIHJlcXVlc3QuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcGF5bWVudCB0eXBlIGZpZWxkcyBjYXJkIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqL1xyXG4gIGdldFBheW1lbnRUeXBlRmllbGRDYXJkVHlwZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFBheW1lbnRUeXBlRmllbGRDYXJkVHlwZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8UGF5bWVudFR5cGVGaWVsZENhcmRUeXBlc091dD4+KGAke3RoaXMudXJsfS9wYXltZW50LXR5cGUtZmllbGQtY2FyZC10eXBlc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IHBheW1lbnQgdHlwZSBmaWVsZCBjYXJkIHJlc291cmNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGVJbn0gYm9keSAtIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBjcmVhdGUgYSBuZXcgcGF5bWVudCB0eXBlIGZpZWxkIGNhcmQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGVPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3VsdCBvZiBjcmVhdGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIHBvc3RDb3VudHJ5UGF5bWVudFR5cGVGaWVsZENhcmRUeXBlIChib2R5OiBQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGVJbik6IE9ic2VydmFibGU8UGF5bWVudFR5cGVGaWVsZENhcmRUeXBlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGVPdXQ+PihgJHt0aGlzLnVybH0vcGF5bWVudC10eXBlLWZpZWxkLWNhcmQtdHlwZXNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgcGF5bWVudCB0eXBlIGZpZWxkIGNhcmQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHBheW1lbnQgdHlwZSBmaWVsZCBjYXJkIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge1BheW1lbnRUeXBlRmllbGRDYXJkVHlwZUlufSBib2R5IC0gVGhlIHVwZGF0ZWQgZGF0YSBmb3IgdGhlIHBheW1lbnQgdHlwZSBmaWVsZCBjYXJkLlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFBheW1lbnRUeXBlRmllbGRDYXJkVHlwZU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHRoZSB1cGRhdGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIHB1dENvdW50cnlQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGUgKGlkOiBudW1iZXIsIGJvZHk6IFBheW1lbnRUeXBlRmllbGRDYXJkVHlwZUluKTogT2JzZXJ2YWJsZTxQYXltZW50VHlwZUZpZWxkQ2FyZFR5cGVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8UGF5bWVudFR5cGVGaWVsZENhcmRUeXBlT3V0Pj4oYCR7dGhpcy51cmx9L3BheW1lbnQtdHlwZS1maWVsZC1jYXJkLXR5cGVzLyR7aWR9YCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGFsbCBwYXltZW50IHR5cGUgZmllbGRzIGFjY291bnRzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyB0byBmaWx0ZXIgb3IgY3VzdG9taXplIHRoZSByZXF1ZXN0LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UGF5bWVudFR5cGVGaWVsZEFjY291bnRzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcGF5bWVudCB0eXBlIGZpZWxkcyBhY2NvdW50cyBmZXRjaGVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgKi9cclxuICBnZXRQYXltZW50VHlwZUZpZWxkQWNjb3VudHMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFBheW1lbnRUeXBlRmllbGRBY2NvdW50c091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxQYXltZW50VHlwZUZpZWxkQWNjb3VudHNPdXQ+PihgJHt0aGlzLnVybH0vcGF5bWVudC10eXBlLWZpZWxkLWFjY291bnRzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBuZXcgcGF5bWVudCB0eXBlIGZpZWxkIGFjY291bnQgcmVzb3VyY2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BheW1lbnRUeXBlRmllbGRBY2NvdW50SW59IGJvZHkgLSBUaGUgaW5wdXQgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgY3JlYXRlIGEgbmV3IHBheW1lbnQgdHlwZSBmaWVsZCBhY2NvdW50LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UGF5bWVudFR5cGVGaWVsZEFjY291bnRPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3VsdCBvZiBjcmVhdGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIHBvc3RDb3VudHJ5UGF5bWVudFR5cGVGaWVsZEFjY291bnQgKGJvZHk6IFBheW1lbnRUeXBlRmllbGRBY2NvdW50SW4pOiBPYnNlcnZhYmxlPFBheW1lbnRUeXBlRmllbGRBY2NvdW50T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxQYXltZW50VHlwZUZpZWxkQWNjb3VudE91dD4+KGAke3RoaXMudXJsfS9wYXltZW50LXR5cGUtZmllbGQtYWNjb3VudHNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgcGF5bWVudCB0eXBlIGZpZWxkIGFjY291bnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHBheW1lbnQgdHlwZSBmaWVsZCBhY2NvdW50IHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge1BheW1lbnRUeXBlRmllbGRBY2NvdW50SW59IGJvZHkgLSBUaGUgdXBkYXRlZCBkYXRhIGZvciB0aGUgcGF5bWVudCB0eXBlIGZpZWxkIGFjY291bnQuXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8UGF5bWVudFR5cGVGaWVsZEFjY291bnRPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3VsdCBvZiB0aGUgdXBkYXRlIG9wZXJhdGlvbi5cclxuICAgKi9cclxuICBwdXRDb3VudHJ5UGF5bWVudFR5cGVGaWVsZEFjY291bnQgKGlkOiBudW1iZXIsIGJvZHk6IFBheW1lbnRUeXBlRmllbGRBY2NvdW50SW4pOiBPYnNlcnZhYmxlPFBheW1lbnRUeXBlRmllbGRBY2NvdW50T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPFBheW1lbnRUeXBlRmllbGRBY2NvdW50T3V0Pj4oYCR7dGhpcy51cmx9L3BheW1lbnQtdHlwZS1maWVsZC1hY2NvdW50cy8ke2lkfWAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyB0b2xlcmFuY2UgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byB1c2UgZm9yIHF1ZXJ5aW5nIHRvbGVyYW5jZXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxUb2xlcmFuY2VzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgdG9sZXJhbmNlIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0VG9sZXJhbmNlcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8VG9sZXJhbmNlc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxUb2xlcmFuY2VzT3V0Pj4oYCR7dGhpcy51cmx9L3RvbGVyYW5jZXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgdG9sZXJhbmNlIGRldGFpbCBmb3IgYSBnaXZlbiBpZGVudGlmaWVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdG9sZXJhbmNlIHRvIHJldHJpZXZlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8VG9sZXJhbmNlT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSB0b2xlcmFuY2UgZGF0YS5cclxuICAgKi9cclxuICBnZXRUb2xlcmFuY2UgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFRvbGVyYW5jZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxUb2xlcmFuY2VPdXQ+PihgJHt0aGlzLnVybH0vdG9sZXJhbmNlcy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHVwZGF0ZSBvciBjcmVhdGUgYSB0b2xlcmFuY2UgcmVjb3JkIHVzaW5nIHRoZSBwcm92aWRlZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtUb2xlcmFuY2VJbn0gYm9keSAtIFRoZSB0b2xlcmFuY2UgaW5wdXQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgc2VudCBpbiB0aGUgcmVxdWVzdC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFRvbGVyYW5jZU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBvciBjcmVhdGVkIHRvbGVyYW5jZSBvdXRwdXQgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHBvc3RUb2xlcmFuY2UgKGJvZHk6IFRvbGVyYW5jZUluKTogT2JzZXJ2YWJsZTxUb2xlcmFuY2VPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPFRvbGVyYW5jZU91dD4+KGAke3RoaXMudXJsfS90b2xlcmFuY2VzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSB0b2xlcmFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIElEIHVzaW5nIHRoZSBwcm92aWRlZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0b2xlcmFuY2UgdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7VG9sZXJhbmNlSW59IGJvZHkgLSBUaGUgZGF0YSB0byB1cGRhdGUgdGhlIHRvbGVyYW5jZSB3aXRoLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8VG9sZXJhbmNlT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSB1cGRhdGVkIHRvbGVyYW5jZSBpbmZvcm1hdGlvbi5cclxuICAgKi9cclxuICBwdXRUb2xlcmFuY2UgKGlkOiBudW1iZXIsIGJvZHk6IFRvbGVyYW5jZUluKTogT2JzZXJ2YWJsZTxUb2xlcmFuY2VPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8VG9sZXJhbmNlT3V0Pj4oYCR7dGhpcy51cmx9L3RvbGVyYW5jZXMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgdGhlIHRvbGVyYW5jZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdG9sZXJhbmNlIHRvIGJlIGRlbGV0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTx7fT59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGRlbGV0ZVRvbGVyYW5jZSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8e30+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPEFwaVN1Y2Nlc3M8e30+PihgJHt0aGlzLnVybH0vdG9sZXJhbmNlcy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBkb2N1bWVudCByZXF1ZXN0cyBhc3NvY2lhdGVkIHdpdGggYSBkb2N1bWVudCBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGRvY3VtZW50LlxyXG4gICAqIEByZXR1cm5zIEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgZG9jdW1lbnQgcmVxdWVzdHMgZGF0YS5cclxuICAgKi9cclxuICBnZXRPcGVyYXRpb25Eb2N1bWVudFJlcXVlc3RzIChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxPcGVyYXRpb25Eb2N1bWVudFJlcXVlc3RzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPE9wZXJhdGlvbkRvY3VtZW50UmVxdWVzdHNPdXQ+PihgJHt0aGlzLnVybH0vb3BlcmF0aW9uL2RvY3VtZW50L3JlcXVlc3RzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGRvY3VtZW50cyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBmaWx0ZXIgYW5kIHBhZ2luYXRlIHRoZSBkb2N1bWVudHNcclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGRvY3VtZW50cyBkYXRhIHdoZW4gdGhlIEhUVFAgcmVxdWVzdCBjb21wbGV0ZXNcclxuICAgKi9cclxuICBnZXREb2N1bWVudHMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPEdldERvY3VtZW50c091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxHZXREb2N1bWVudHNPdXQ+PihgJHt0aGlzLnVybH0vZG9jdW1lbnRzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGRvY3VtZW50IHN0YXR1cyB2YWx1ZXMgZnJvbSB0aGUgQVBJLlxyXG4gICAqXHJcbiAgICogU2VuZHMgYW4gSFRUUCBHRVQgcmVxdWVzdCB0byB0aGUgc2VydmljZSdzIGAvZG9jdW1lbnQtc3RhdHVzYCBlbmRwb2ludCB1c2luZyB0aGUgc3VwcGxpZWQgcXVlcnkgcGFyYW1ldGVyc1xyXG4gICAqIGFuZCByZXR1cm5zIHRoZSBkZWNvZGVkIGBkYXRhYCBwYXlsb2FkIGZyb20gdGhlIEFQSSBzdWNjZXNzIGVudmVsb3BlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QgKGUuZy4gZmlsdGVyaW5nLCBwYWdpbmF0aW9uLCBzZWFyY2gpLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhIERvY3VtZW50U3RhdHVzZXNPdXQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRvY3VtZW50IHN0YXR1cyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldERvY3VtZW50U3RhdHVzZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPERvY3VtZW50U3RhdHVzZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8RG9jdW1lbnRTdGF0dXNlc091dD4+KGAke3RoaXMudXJsfS9kb2N1bWVudC1zdGF0dXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgWE1MIHByaW50IHJlcHJlc2VudGF0aW9uIGZvciBhIGdpdmVuIG9wZXJhdGlvbiAoaW52b2ljZSkuXHJcbiAgICpcclxuICAgKiBTZW5kcyBhbiBIVFRQIEdFVCByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kIGVuZHBvaW50IGAvb3BlcmF0aW9uL3ByaW50L3htbC97ZG9jdW1lbnRJZH1gIGFuZFxyXG4gICAqIHVud3JhcHMgdGhlIGBkYXRhYCBmaWVsZCBmcm9tIHRoZSBBUEkgc3VjY2VzcyByZXNwb25zZSBiZWZvcmUgZW1pdHRpbmcgaXQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZG9jdW1lbnRJZCAtIFRoZSBudW1lcmljIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHRvIGZldGNoLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgT3BlcmF0aW9uUHJpbnRYbWxPdXQgcGF5bG9hZCBvbiBzdWNjZXNzIGFuZCBjb21wbGV0ZXMuXHJcbiAgICogICAgICAgICAgVGhlIE9ic2VydmFibGUgd2lsbCBlcnJvciBpZiB0aGUgSFRUUCByZXF1ZXN0IGZhaWxzIG9yIHRoZSByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIHRoZSBleHBlY3RlZCBkYXRhLlxyXG4gICAqL1xyXG4gIGdldE9wZXJhdGlvblByaW50WG1sIChkb2N1bWVudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPE9wZXJhdGlvblByaW50WG1sT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPE9wZXJhdGlvblByaW50WG1sT3V0Pj4oYCR7dGhpcy51cmx9L29wZXJhdGlvbi9wcmludC94bWwvJHtkb2N1bWVudElkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBwcm92aWRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIG9yIHBhZ2luYXRlIHRoZSBwcm92aWRlcnMgbGlzdFxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcHJvdmlkZXJzIGRhdGFcclxuICAgKi9cclxuICBnZXRQcm92aWRlcnMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFByb3ZpZGVyc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxQcm92aWRlcnNPdXQ+PihgJHt0aGlzLnVybH0vcHJvdmlkZXJzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIGRvY3VtZW50IHR5cGUgcmFuZ2VzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBmaWx0ZXIgZG9jdW1lbnQgdHlwZSByYW5nZXNcclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGRvY3VtZW50IHR5cGUgcmFuZ2VzIGRhdGFcclxuICAgKi9cclxuICBnZXREb2N1bWVudHNUeXBlc1JhbmdlcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8RG9jdW1lbnRUeXBlUmFuZ2VzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPERvY3VtZW50VHlwZVJhbmdlc091dD4+KGAke3RoaXMudXJsfS9kb2N1bWVudC10eXBlLXJhbmdlc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB0eXBlIHJhbmdlLlxyXG4gICAqIEBwYXJhbSBib2R5IC0gVGhlIGRvY3VtZW50IHR5cGUgcmFuZ2UgZGF0YSB0byBjcmVhdGVcclxuICAgKiBAcmV0dXJucyBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgdHlwZSByYW5nZVxyXG4gICAqL1xyXG4gIHBvc3REb2N1bWVudFR5cGVSYW5nZSAoYm9keTogRG9jdW1lbnRUeXBlUmFuZ2VJbik6IE9ic2VydmFibGU8RG9jdW1lbnRUeXBlUmFuZ2VPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPERvY3VtZW50VHlwZVJhbmdlT3V0Pj4oYCR7dGhpcy51cmx9L2RvY3VtZW50LXR5cGUtcmFuZ2VzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIGEgZG9jdW1lbnQgdHlwZSByYW5nZSBieSBpdHMgaWRlbnRpZmllci5cclxuICAgKiBAcGFyYW0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHR5cGUgcmFuZ2UgdG8gZGVsZXRlXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBkZWxldGVkIERvY3VtZW50VHlwZVJhbmdlT3V0IG9iamVjdFxyXG4gICAqL1xyXG4gIGRlbGV0ZURvY3VtZW50c1R5cGVzUmFuZ2UgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHt9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxBcGlTdWNjZXNzPHt9Pj4oYCR7dGhpcy51cmx9L2RvY3VtZW50LXR5cGUtcmFuZ2VzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGEgZG9jdW1lbnQgdHlwZSByYW5nZSBmb3IgYSBnaXZlbiBJRC5cclxuICAgKiBAcGFyYW0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHR5cGUgcmFuZ2UgdG8gdXBkYXRlXHJcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZG9jdW1lbnQgdHlwZSByYW5nZSBkYXRhIHRvIHVwZGF0ZVxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBEb2N1bWVudFR5cGVSYW5nZU91dCBvYmplY3RcclxuICAgKi9cclxuICBwdXREb2N1bWVudHNUeXBlUmFuZ2UgKGlkOiBudW1iZXIsIGRhdGE6IERvY3VtZW50VHlwZVJhbmdlSW4pOiBPYnNlcnZhYmxlPERvY3VtZW50VHlwZVJhbmdlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPERvY3VtZW50VHlwZVJhbmdlT3V0Pj4oYCR7dGhpcy51cmx9L2RvY3VtZW50LXR5cGUtcmFuZ2VzLyR7aWR9YCwgZGF0YSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZG9jdW1lbnQgdHlwZXMgYXZhaWxhYmxlIGZvciBhIHNwZWNpZmljIGNvdW50cnkuXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIG9yIGN1c3RvbWl6ZSB0aGUgY291bnRyeSBkb2N1bWVudCB0eXBlcyByZXF1ZXN0XHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBjb3VudHJ5IGRvY3VtZW50IHR5cGVzIGRhdGFcclxuICAgKi9cclxuICBnZXRDb3VudHJ5RG9jdW1lbnRzVHlwZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPENvdW50cnlEb2N1bWVudFR5cGVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPENvdW50cnlEb2N1bWVudFR5cGVzT3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktZG9jdW1lbnQtdHlwZXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcbn1cclxuIl19
|