@senior-gestao-pessoas/hcmxt-bridge-lib 1.0.2 → 1.0.3

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.
@@ -19,6 +19,7 @@ export class XtBridgeService {
19
19
  this.MAX_CHUNKS = 1000;
20
20
  this.DEFAULT_MAX_RETRIES = 3;
21
21
  this.DEFAULT_RETRY_DELAY = 10000;
22
+ this.DEFAULT_NO_WAIT = false;
22
23
  this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID = 'hcm.hcmxt_bridge_lib.toast.error.response_process_failed_with_id';
23
24
  this.retryTimeouts = new Map();
24
25
  this.initializeCefCommunication();
@@ -170,6 +171,7 @@ export class XtBridgeService {
170
171
  chunkSize: bridgeConfig?.chunkSize ?? this.DEFAULT_CHUNK_SIZE,
171
172
  maxRetries: bridgeConfig?.maxRetries ?? this.DEFAULT_MAX_RETRIES,
172
173
  retryDelay: bridgeConfig?.retryDelay ?? this.DEFAULT_RETRY_DELAY,
174
+ noWait: bridgeConfig?.noWait ?? this.DEFAULT_NO_WAIT
173
175
  };
174
176
  const retryKey = this.generateRequestId();
175
177
  return new Observable((subscriber) => {
@@ -192,7 +194,7 @@ export class XtBridgeService {
192
194
  }
193
195
  const requestId = this.generateRequestId();
194
196
  state.currentRequestId = requestId;
195
- state.currentInnerSub = this.executeAttempt(requestId, context.action, context.payload, context.config.functionName, context.config.timeout, context.config.chunkSize).subscribe({
197
+ state.currentInnerSub = this.executeAttempt(requestId, context.action, context.payload, context.config.functionName, context.config.timeout, context.config.chunkSize, context.config.noWait).subscribe({
196
198
  next: (data) => this.handleAttemptSuccess(data, subscriber, retryKey),
197
199
  error: (error) => this.handleAttemptError(error, attemptNumber, state, retryKey, subscriber, context),
198
200
  });
@@ -239,11 +241,29 @@ export class XtBridgeService {
239
241
  /**
240
242
  * Execute a single attempt of the request
241
243
  */
242
- executeAttempt(requestId, action, payload, functionName, timeout, chunkSize) {
244
+ /**
245
+ * Execute a single attempt of the request
246
+ * @param requestId Unique request ID
247
+ * @param action Action name
248
+ * @param payload Payload data
249
+ * @param functionName Backend function name
250
+ * @param timeout Timeout in ms
251
+ * @param chunkSize Chunk size in bytes
252
+ * @param noWait If true, do not wait for a response (fire and forget)
253
+ */
254
+ executeAttempt(requestId, action, payload, functionName, timeout, chunkSize, noWait) {
243
255
  // Create subject for this specific request
244
256
  const responseSubject = new Subject();
245
257
  this.responseSubjects.set(requestId, responseSubject);
246
258
  this.requestOrder.push(requestId);
259
+ if (noWait) {
260
+ // Fire and forget: send request via invokeNative with XtBridgeRequest format, do not track response or timeout
261
+ this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);
262
+ // Return an observable that completes immediately
263
+ return new Observable((subscriber) => {
264
+ subscriber.complete();
265
+ });
266
+ }
247
267
  // Set up timeout to prevent hanging requests
248
268
  const setupTimeout = setTimeout(() => {
249
269
  const subject = this.responseSubjects.get(requestId);
@@ -254,6 +274,21 @@ export class XtBridgeService {
254
274
  }, timeout);
255
275
  this.requestTimeouts.set(requestId, setupTimeout);
256
276
  // Send request via invokeNative with XtBridgeRequest format
277
+ this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);
278
+ // Return observable that completes after first response
279
+ return responseSubject.asObservable().pipe(take(1));
280
+ }
281
+ /**
282
+ * Send a request using invokeNative
283
+ * @param requestId Unique request ID
284
+ * @param action Action name
285
+ * @param payload Payload data
286
+ * @param functionName Backend function name
287
+ * @param timeout Timeout in ms
288
+ * @param chunkSize Chunk size in bytes
289
+ * @param responseSubject Subject to emit response or error to
290
+ */
291
+ sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject) {
257
292
  if (globalThis.invokeNative) {
258
293
  try {
259
294
  const request = JSON.stringify({
@@ -279,8 +314,6 @@ export class XtBridgeService {
279
314
  responseSubject.error(error);
280
315
  this.cleanupRequest(requestId);
281
316
  }
282
- // Return observable that completes after first response
283
- return responseSubject.asObservable().pipe(take(1));
284
317
  }
285
318
  /**
286
319
  * Handle response from CEF - Thread-safe, prevents response mixing
@@ -456,4 +489,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
456
489
  providedIn: 'root'
457
490
  }]
458
491
  }], ctorParameters: function () { return []; } });
459
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHQtYnJpZGdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvc3JjL2xpYi9zZXJ2aWNlcy94dC1icmlkZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBdUUzRCxNQUFNLE9BQU8sZUFBZTtJQWtCMUI7UUFoQmlCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQ25ELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN6QyxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNoRSxpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUNuQixpQkFBWSxHQUFHLElBQUksR0FBRyxFQUE2RCxDQUFDO1FBQ3BGLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELDRDQUF1QyxHQUFHLGlCQUFpQixDQUFDO1FBQzVELDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyx1QkFBa0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsZUFBZTtRQUMvQyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQUN4Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsZ0RBQTJDLEdB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QUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztZQUN0QixRQUFRLEVBQUUsT0FBTztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQywwQ0FBMEMsQ0FBQztZQUN0RixNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO1NBQ3ZELENBQUMsQ0FBQztJQUNMLENBQUM7K0dBeGhCVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFh0QnJpZGdlUmVxdWVzdCB7XG4gIGlkOiBzdHJpbmc7XG4gIGFjdGlvbjogc3RyaW5nO1xuICBwYXlsb2FkPzogYW55O1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBYdEJyaWRnZVJlc3BvbnNlIHtcbiAgaWQ6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZGF0YT86IGFueTtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZUNvbmZpZyB7XG4gIC8vIE5vbWUgZGEgZnVuw6fDo28gbm8gQmFjay1FbmQgKGRlZmF1bHQ6IFwiWHRCcmlkZ2VSZXF1ZXN0XCIpXG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcblxuICAvLyBUaW1lb3V0IHBhcmEgcmVxdWlzacOnw7VlcyBlbSBtcyAoZGVmYXVsdDogMzAwMDApXG4gIHJlcXVlc3RUaW1lb3V0PzogbnVtYmVyO1xuXG4gIC8vIFRhbWFuaG8gZGUgY2h1bmsgcGFyYSBkYWRvcyBncmFuZGVzIGVtIGJ5dGVzIChkZWZhdWx0OiA2NEtCKVxuICBjaHVua1NpemU/OiBudW1iZXI7XG5cbiAgLy8gTsO6bWVybyBtw6F4aW1vIGRlIHRlbnRhdGl2YXMgZW0gY2FzbyBkZSBmYWxoYSAoZGVmYXVsdDogMylcbiAgbWF4UmV0cmllcz86IG51bWJlcjtcblxuICAvLyBEZWxheSBlbnRyZSB0ZW50YXRpdmFzIGVtIG1zIChkZWZhdWx0OiAxMDAwMClcbiAgcmV0cnlEZWxheT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFJlc29sdmVkQnJpZGdlQ29uZmlnIHtcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgY2h1bmtTaXplOiBudW1iZXI7XG4gIG1heFJldHJpZXM6IG51bWJlcjtcbiAgcmV0cnlEZWxheTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQXR0ZW1wdFN0YXRlIHtcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgY3VycmVudElubmVyU3ViOiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH0gfCBudWxsO1xuICBjdXJyZW50UmVxdWVzdElkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgQXR0ZW1wdENvbnRleHQge1xuICBhY3Rpb246IHN0cmluZztcbiAgcGF5bG9hZDogYW55O1xuICBjb25maWc6IFJlc29sdmVkQnJpZGdlQ29uZmlnO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIC8vIENFRiBpbmplY3RlZCBmdW5jdGlvbnNcbiAgICBjZWZTZW5kVG9TZXJ2ZXI/OiAocmVxdWVzdERhdGE6IHN0cmluZykgPT4gdm9pZDtcbiAgICAvLyBBbmd1bGFyIGNhbGxiYWNrIGZ1bmN0aW9uc1xuICAgIGhhbmRsZUNlZlJlc3BvbnNlPzogKHJlc3BvbnNlRGF0YTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIC8vIE5hdGl2ZSBpbnZva2UgZnVuY3Rpb24gZm9yIFh0IGVtdWxhdG9yXG4gICAgaW52b2tlTmF0aXZlPzogKHR5cGU6IG51bWJlciwgcGF5bG9hZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIC8vIEFwcCBjb21wb25lbnQgY2FsbGJhY2tzIC0gY2FsbGVkIGJ5IHNlcnZlciB3aXRoIHJlcXVlc3QgSURcbiAgICByZXNvbHZlRnVuY3Rpb24/OiAoaWQ6IHN0cmluZywgZGF0YTogYW55KSA9PiB2b2lkO1xuICAgIHJlamVjdEZ1bmN0aW9uPzogKGlkOiBzdHJpbmcsIGVycm9yOiBhbnkpID0+IHZvaWQ7XG4gIH1cbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgWHRCcmlkZ2VTZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlc3BvbnNlU3ViamVjdHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RUaW1lb3V0cyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblN0YXR1cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlcXVlc3RPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaHVua0J1ZmZlcnMgPSBuZXcgTWFwPHN0cmluZywgeyBjaHVua3M6IE1hcDxudW1iZXIsIHN0cmluZz47IGxhc3RTZXE/OiBudW1iZXIgfT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZSA9IGluamVjdChNZXNzYWdlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRpb25TZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9YVF9CUklER0VfUkVRVUVTVF9GVU5DVElPTl9OQU1FID0gXCJYdEJyaWRnZVJlcXVlc3RcIjtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1JFUVVFU1RfVElNRV9PVVQgPSAzMDAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0NIVU5LX1NJWkUgPSA2NCAqIDEwMjQ7IC8vIERlZmF1bHQgNjRLQlxuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9DSFVOS1MgPSAxMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTUFYX1JFVFJJRVMgPSAzO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfUkVUUllfREVMQVkgPSAxMDAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBUT0FTVF9FUlJPUl9SRVNQT05TRV9QUk9DRVNTX0ZBSUxFRF9XSVRIX0lEID0gJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlc3BvbnNlX3Byb2Nlc3NfZmFpbGVkX3dpdGhfaWQnO1xuICBwcml2YXRlIHJlYWRvbmx5IHJldHJ5VGltZW91dHMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNlZkNvbW11bmljYXRpb24oKTtcbiAgICB0aGlzLmNoZWNrQ2VmQXZhaWxhYmlsaXR5KCk7XG4gICAgLy8gUmVnaXN0cmFyIGNhbGxiYWNrcyBnbG9iYWlzIHBhcmEgbyBzZXJ2aWRvciBjaGFtYXJcbiAgICB0aGlzLnJlZ2lzdGVyR2xvYmFsQ2FsbGJhY2tzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGdsb2JhbCBjYWxsYmFja3MgdGhhdCB0aGUgc2VydmVyIHdpbGwgaW52b2tlXG4gICAqIFNlcnZpZG9yIGNoYW1hIGRvY3VtZW50LmFwcC5nNS5yZXNvbHZlRnVuY3Rpb24oaWQsIGRhdGEpIG91IGRvY3VtZW50LmFwcC5nNS5yZWplY3RGdW5jdGlvbihpZCwgZXJyb3IpXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyR2xvYmFsQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIC8vIENyaWFyIGVzdHJ1dHVyYSBkb2N1bWVudC5hcHAuZzUgc2UgbsOjbyBleGlzdGlyXG4gICAgaWYgKCEoZG9jdW1lbnQgYXMgYW55KS5hcHApIHtcbiAgICAgIChkb2N1bWVudCBhcyBhbnkpLmFwcCA9IHt9O1xuICAgIH1cbiAgICBpZiAoIShkb2N1bWVudCBhcyBhbnkpLmFwcC5nNSkge1xuICAgICAgKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1ID0ge307XG4gICAgfVxuXG4gICAgLy8gU2FsdmFyIHJlZmVyw6puY2lhcyBvcmlnaW5haXMgc2UgZXhpc3RpcmVtIChkbyBBcHBDb21wb25lbnQpXG4gICAgY29uc3Qgb3JpZ2luYWxSZXNvbHZlID0gKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlc29sdmVGdW5jdGlvbjtcbiAgICBjb25zdCBvcmlnaW5hbFJlamVjdCA9IChkb2N1bWVudCBhcyBhbnkpLmFwcC5nNS5yZWplY3RGdW5jdGlvbjtcblxuICAgIC8vIERlZmluaXIgbm92YSByZXNvbHZlRnVuY3Rpb25cbiAgICAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVzb2x2ZUZ1bmN0aW9uID0gKGlkOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gQ2hhbWFyIG9yaWdpbmFsIGRvIEFwcENvbXBvbmVudCBzZSBleGlzdGlyXG4gICAgICBpZiAob3JpZ2luYWxSZXNvbHZlICYmIHR5cGVvZiBvcmlnaW5hbFJlc29sdmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvcmlnaW5hbFJlc29sdmUuY2FsbChnbG9iYWxUaGlzLCBpZCwgZGF0YSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5jYWxsYmFja19mYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzYXIgdmlhIFh0QnJpZGdlU2VydmljZVxuICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJDYWxsYmFjayhpZCwgZGF0YSwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvLyBEZWZpbmlyIG5vdmEgcmVqZWN0RnVuY3Rpb25cbiAgICAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVqZWN0RnVuY3Rpb24gPSAoaWQ6IHN0cmluZywgZXJyb3I6IGFueSkgPT4ge1xuICAgICAgLy8gQ2hhbWFyIG9yaWdpbmFsIGRvIEFwcENvbXBvbmVudCBzZSBleGlzdGlyXG4gICAgICBpZiAob3JpZ2luYWxSZWplY3QgJiYgdHlwZW9mIG9yaWdpbmFsUmVqZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3JpZ2luYWxSZWplY3QuY2FsbChnbG9iYWxUaGlzLCBpZCwgZXJyb3IpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY2FsbGJhY2tfZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2Vzc2FyIHZpYSBYdEJyaWRnZVNlcnZpY2VcbiAgICAgIHRoaXMuaGFuZGxlU2VydmVyQ2FsbGJhY2soaWQsIGVycm9yLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLy8gVGFtYsOpbSByZWdpc3RyYXIgZW0gd2luZG93IHBhcmEgY29tcGF0aWJpbGlkYWRlXG4gICAgKGdsb2JhbFRoaXMgYXMgYW55KS5yZXNvbHZlRnVuY3Rpb24gPSAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVzb2x2ZUZ1bmN0aW9uO1xuICAgIChnbG9iYWxUaGlzIGFzIGFueSkucmVqZWN0RnVuY3Rpb24gPSAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVqZWN0RnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBDRUYgY29tbXVuaWNhdGlvbiBieSBzZXR0aW5nIHVwIHRoZSBnbG9iYWwgY2FsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNlZkNvbW11bmljYXRpb24oKTogdm9pZCB7XG4gICAgLy8gU2V0IHVwIGdsb2JhbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IENFRiB3aWxsIGNhbGwgKGZvciBkaXJlY3QgcmVzcG9uc2VzKVxuICAgIChnbG9iYWxUaGlzIGFzIGFueSkuaGFuZGxlQ2VmUmVzcG9uc2UgPSAocmVzcG9uc2VEYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBKU09OLnBhcnNlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5yZXNwb25zZV9wYXJzZV9mYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjYWxsYmFjayBmcm9tIHNlcnZlciB2aWEgcmVzb2x2ZUZ1bmN0aW9uL3JlamVjdEZ1bmN0aW9uXG4gICAqIFByb2Nlc3NhIHRhbnRvIHJlc3Bvc3RhcyBzaW1wbGVzIHF1YW50byBjaHVua2VkXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlcnZlckNhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IGFueSwgaXNFcnJvcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZ2V0KGlkKTtcblxuICAgIGlmICghc3ViamVjdCkge1xuICAgICAgdGhpcy5zaG93RXJyb3IodGhpcy5UT0FTVF9FUlJPUl9SRVNQT05TRV9QUk9DRVNTX0ZBSUxFRF9XSVRIX0lELCB7IGlkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgcGFyc2VkRGF0YSA9IGRhdGE7XG5cbiAgICAgIC8vIFBhcnNlIEpTT04gc2UgZm9yIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcih0aGlzLlRPQVNUX0VSUk9SX1JFU1BPTlNFX1BST0NFU1NfRkFJTEVEX1dJVEhfSUQsIHsgaWQgfSk7XG4gICAgICAgICAgcGFyc2VkRGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzUGFyc2VkRGF0YU9iamVjdCA9IHBhcnNlZERhdGEgJiYgdHlwZW9mIHBhcnNlZERhdGEgPT09ICdvYmplY3QnO1xuICAgICAgLy8gVmVyaWZpY2FyIHNlIMOpIHJlc3Bvc3RhIGNodW5rZWQgeyBjaHVuaywgc2VxLCBsYXN0IH1cbiAgICAgIGlmIChoYXNQYXJzZWREYXRhT2JqZWN0ICYmIHBhcnNlZERhdGEuY2h1bmsgJiYgcGFyc2VkRGF0YS5zZXEgIT09IHVuZGVmaW5lZCAmJiBwYXJzZWREYXRhLmxhc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhhbmRsZUNodW5rUmVzcG9uc2UoaWQsIHBhcnNlZERhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc3Bvc3RhIG5vcm1hbCAobsOjby1jaHVua2VkKVxuICAgICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNc2cgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyBkYXRhIDogSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKHRoaXMuVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCwgeyBpZCB9KTtcbiAgICAgICAgc3ViamVjdC5lcnJvcihuZXcgRXJyb3IoZXJyb3JNc2cpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YmplY3QubmV4dChwYXJzZWREYXRhKTtcbiAgICAgIH1cblxuICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKHRoaXMuVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCwgeyBpZCB9KTtcbiAgICAgIHN1YmplY3QuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChpZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIENFRiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0NlZkF2YWlsYWJpbGl0eSgpOiB2b2lkIHtcbiAgICBjb25zdCBpc0F2YWlsYWJsZSA9IHR5cGVvZiAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNlZlNlbmRUb1NlcnZlciA9PT0gJ2Z1bmN0aW9uJztcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMubmV4dChpc0F2YWlsYWJsZSk7XG5cbiAgICBpZiAoIWlzQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY2VmX3VuYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHVuaXF1ZSBJRCBmb3IgcmVxdWVzdHMgLSBndWFyYW50ZWVkIHVuaXF1ZSBldmVuIHdpdGggY29uY3VycmVudCBjYWxsc1xuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJlcXVlc3RJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmFuZG9tID0gY3J5cHRvLnJhbmRvbVVVSUQoKS5zcGxpdCgnLScpLmpvaW4oJycpO1xuICAgIGNvbnN0IGNvdW50ZXIgPSB0aGlzLnJlc3BvbnNlU3ViamVjdHMuc2l6ZTsgLy8gQWRkaXRpb25hbCB1bmlxdWVuZXNzXG4gICAgcmV0dXJuIGByZXFfJHt0aW1lc3RhbXB9XyR7cmFuZG9tfV8ke2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHJlcXVlc3QgdG8gc2VydmVyIHZpYSBDRUYgLSBUaHJlYWQtc2FmZSB3aXRoIHRpbWVvdXQgcHJvdGVjdGlvbiBhbmQgcmV0cnkgcmVzaWxpZW5jZVxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIE5vbWUgZGEgYcOnw6NvL0FQSSBhIHNlciBpbnZvY2FkYSBubyBCYWNrLUVuZFxuICAgKiBAcGFyYW0gbG9jYWxlIExvY2FsZSBvYnJpZ2F0w7NyaW8gcGFyYSBpbnRlcm5hY2lvbmFsaXphciBhcyBtZW5zYWdlbnMgZGUgVG9hc3QgKGV4OiAncHQtQlInLCAnZW4tVVMnLCAnZXMtRVMnKS5cbiAgICogICAgICAgICAgICAgICBBdHVhbGl6YSBvIGxvY2FsZSBhdGl2byBkbyBUcmFuc2xhdGlvblNlcnZpY2UgYW50ZXMgZGUgZW52aWFyIGEgcmVxdWlzacOnw6NvLlxuICAgKiBAcGFyYW0gcGF5bG9hZCBEYWRvcyBhIHNlcmVtIGVudmlhZG9zIGFvIEJhY2stRW5kXG4gICAqIEBwYXJhbSBicmlkZ2VDb25maWcgQ29uZmlndXJhw6fDtWVzIG9wY2lvbmFpcyBkYSByZXF1aXNpw6fDo29cbiAgICovXG4gIHNlbmRSZXF1ZXN0PFQgPSBhbnk+KGFjdGlvbjogc3RyaW5nLCBsb2NhbGU6IHN0cmluZywgcGF5bG9hZD86IGFueSwgYnJpZGdlQ29uZmlnPzogQnJpZGdlQ29uZmlnKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0TG9jYWxlKGxvY2FsZSk7XG5cbiAgICBjb25zdCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRCcmlkZ2VDb25maWcgPSB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGJyaWRnZUNvbmZpZz8uZnVuY3Rpb25OYW1lID8/IHRoaXMuREVGQVVMVF9YVF9CUklER0VfUkVRVUVTVF9GVU5DVElPTl9OQU1FLFxuICAgICAgdGltZW91dDogYnJpZGdlQ29uZmlnPy5yZXF1ZXN0VGltZW91dCA/PyB0aGlzLkRFRkFVTFRfUkVRVUVTVF9USU1FX09VVCxcbiAgICAgIGNodW5rU2l6ZTogYnJpZGdlQ29uZmlnPy5jaHVua1NpemUgPz8gdGhpcy5ERUZBVUxUX0NIVU5LX1NJWkUsXG4gICAgICBtYXhSZXRyaWVzOiBicmlkZ2VDb25maWc/Lm1heFJldHJpZXMgPz8gdGhpcy5ERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgcmV0cnlEZWxheTogYnJpZGdlQ29uZmlnPy5yZXRyeURlbGF5ID8/IHRoaXMuREVGQVVMVF9SRVRSWV9ERUxBWSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0cnlLZXkgPSB0aGlzLmdlbmVyYXRlUmVxdWVzdElkKCk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlOiBBdHRlbXB0U3RhdGUgPSB7XG4gICAgICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgICAgICBjdXJyZW50SW5uZXJTdWI6IG51bGwsXG4gICAgICAgIGN1cnJlbnRSZXF1ZXN0SWQ6IG51bGwsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb250ZXh0OiBBdHRlbXB0Q29udGV4dCA9IHsgYWN0aW9uLCBwYXlsb2FkLCBjb25maWc6IHJlc29sdmVkQ29uZmlnIH07XG5cbiAgICAgIHRoaXMucnVuQXR0ZW1wdDxUPigwLCBzdGF0ZSwgcmV0cnlLZXksIHN1YnNjcmliZXIsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gKCkgPT4gdGhpcy5jYW5jZWxTZW5kUmVxdWVzdChzdGF0ZSwgcmV0cnlLZXkpO1xuICAgIH0pLnBpcGUodGFrZSgxKSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgc2luZ2xlIGF0dGVtcHQgYW5kIHNjaGVkdWxlIHJldHJpZXMgb24gZXJyb3JcbiAgICovXG4gIHByaXZhdGUgcnVuQXR0ZW1wdDxUPihcbiAgICBhdHRlbXB0TnVtYmVyOiBudW1iZXIsXG4gICAgc3RhdGU6IEF0dGVtcHRTdGF0ZSxcbiAgICByZXRyeUtleTogc3RyaW5nLFxuICAgIHN1YnNjcmliZXI6IHsgbmV4dDogKHY6IFQpID0+IHZvaWQ7IGVycm9yOiAoZTogYW55KSA9PiB2b2lkOyBjb21wbGV0ZTogKCkgPT4gdm9pZCB9LFxuICAgIGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0XG4gICk6IHZvaWQge1xuICAgIGlmIChzdGF0ZS5hYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5nZW5lcmF0ZVJlcXVlc3RJZCgpO1xuICAgIHN0YXRlLmN1cnJlbnRSZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG5cbiAgICBzdGF0ZS5jdXJyZW50SW5uZXJTdWIgPSB0aGlzLmV4ZWN1dGVBdHRlbXB0PFQ+KFxuICAgICAgcmVxdWVzdElkLFxuICAgICAgY29udGV4dC5hY3Rpb24sXG4gICAgICBjb250ZXh0LnBheWxvYWQsXG4gICAgICBjb250ZXh0LmNvbmZpZy5mdW5jdGlvbk5hbWUsXG4gICAgICBjb250ZXh0LmNvbmZpZy50aW1lb3V0LFxuICAgICAgY29udGV4dC5jb25maWcuY2h1bmtTaXplXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHRoaXMuaGFuZGxlQXR0ZW1wdFN1Y2Nlc3M8VD4oZGF0YSwgc3Vic2NyaWJlciwgcmV0cnlLZXkpLFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4gdGhpcy5oYW5kbGVBdHRlbXB0RXJyb3I8VD4oXG4gICAgICAgIGVycm9yLCBhdHRlbXB0TnVtYmVyLCBzdGF0ZSwgcmV0cnlLZXksIHN1YnNjcmliZXIsIGNvbnRleHRcbiAgICAgICksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUF0dGVtcHRTdWNjZXNzPFQ+KFxuICAgIGRhdGE6IFQsXG4gICAgc3Vic2NyaWJlcjogeyBuZXh0OiAodjogVCkgPT4gdm9pZDsgY29tcGxldGU6ICgpID0+IHZvaWQgfSxcbiAgICByZXRyeUtleTogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHN1YnNjcmliZXIubmV4dChkYXRhKTtcbiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5yZXRyeVRpbWVvdXRzLmRlbGV0ZShyZXRyeUtleSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUF0dGVtcHRFcnJvcjxUPihcbiAgICBlcnJvcjogYW55LFxuICAgIGF0dGVtcHROdW1iZXI6IG51bWJlcixcbiAgICBzdGF0ZTogQXR0ZW1wdFN0YXRlLFxuICAgIHJldHJ5S2V5OiBzdHJpbmcsXG4gICAgc3Vic2NyaWJlcjogeyBuZXh0OiAodjogVCkgPT4gdm9pZDsgZXJyb3I6IChlOiBhbnkpID0+IHZvaWQ7IGNvbXBsZXRlOiAoKSA9PiB2b2lkIH0sXG4gICAgY29udGV4dDogQXR0ZW1wdENvbnRleHRcbiAgKTogdm9pZCB7XG4gICAgaWYgKHN0YXRlLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXR0ZW1wdE51bWJlciA8IGNvbnRleHQuY29uZmlnLm1heFJldHJpZXMpIHtcbiAgICAgIGNvbnN0IHJldHJ5VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJldHJ5VGltZW91dHMuZGVsZXRlKHJldHJ5S2V5KTtcbiAgICAgICAgdGhpcy5ydW5BdHRlbXB0PFQ+KGF0dGVtcHROdW1iZXIgKyAxLCBzdGF0ZSwgcmV0cnlLZXksIHN1YnNjcmliZXIsIGNvbnRleHQpO1xuICAgICAgfSwgY29udGV4dC5jb25maWcucmV0cnlEZWxheSk7XG4gICAgICB0aGlzLnJldHJ5VGltZW91dHMuc2V0KHJldHJ5S2V5LCByZXRyeVRpbWVvdXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5jb21tdW5pY2F0aW9uX2ZhaWxlZF9hZnRlcl9yZXRyaWVzJywge1xuICAgICAgYXR0ZW1wdHM6IGNvbnRleHQuY29uZmlnLm1heFJldHJpZXMgKyAxXG4gICAgfSk7XG4gICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbFNlbmRSZXF1ZXN0KHN0YXRlOiBBdHRlbXB0U3RhdGUsIHJldHJ5S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzdGF0ZS5hYm9ydGVkID0gdHJ1ZTtcblxuICAgIC8vIENhbmNlbGFyIHJldHJ5IGFnZW5kYWRvXG4gICAgY29uc3QgcGVuZGluZ1JldHJ5ID0gdGhpcy5yZXRyeVRpbWVvdXRzLmdldChyZXRyeUtleSk7XG4gICAgaWYgKHBlbmRpbmdSZXRyeSkge1xuICAgICAgY2xlYXJUaW1lb3V0KHBlbmRpbmdSZXRyeSk7XG4gICAgICB0aGlzLnJldHJ5VGltZW91dHMuZGVsZXRlKHJldHJ5S2V5KTtcbiAgICB9XG5cbiAgICAvLyBDYW5jZWxhciB0ZW50YXRpdmEgZW0gYW5kYW1lbnRvXG4gICAgaWYgKHN0YXRlLmN1cnJlbnRJbm5lclN1Yikge1xuICAgICAgc3RhdGUuY3VycmVudElubmVyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gTGltcGFyIHJlcXVpc2nDp8OjbyBwZW5kZW50ZSBubyBzZXJ2aWRvclxuICAgIGlmIChzdGF0ZS5jdXJyZW50UmVxdWVzdElkKSB7XG4gICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHN0YXRlLmN1cnJlbnRSZXF1ZXN0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc2luZ2xlIGF0dGVtcHQgb2YgdGhlIHJlcXVlc3RcbiAgICovXG4gIHByaXZhdGUgZXhlY3V0ZUF0dGVtcHQ8VD4oXG4gICAgcmVxdWVzdElkOiBzdHJpbmcsXG4gICAgYWN0aW9uOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogYW55LFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgIHRpbWVvdXQ6IG51bWJlcixcbiAgICBjaHVua1NpemU6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAvLyBDcmVhdGUgc3ViamVjdCBmb3IgdGhpcyBzcGVjaWZpYyByZXF1ZXN0XG4gICAgY29uc3QgcmVzcG9uc2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0cy5zZXQocmVxdWVzdElkLCByZXNwb25zZVN1YmplY3QpO1xuICAgIHRoaXMucmVxdWVzdE9yZGVyLnB1c2gocmVxdWVzdElkKTtcblxuICAgIC8vIFNldCB1cCB0aW1lb3V0IHRvIHByZXZlbnQgaGFuZ2luZyByZXF1ZXN0c1xuICAgIGNvbnN0IHNldHVwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMucmVzcG9uc2VTdWJqZWN0cy5nZXQocmVxdWVzdElkKTtcbiAgICAgIGlmIChzdWJqZWN0KSB7XG4gICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKGBSZXF1ZXN0ICR7cmVxdWVzdElkfSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zYCkpO1xuICAgICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgfSwgdGltZW91dCk7XG5cbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5zZXQocmVxdWVzdElkLCBzZXR1cFRpbWVvdXQpO1xuXG4gICAgLy8gU2VuZCByZXF1ZXN0IHZpYSBpbnZva2VOYXRpdmUgd2l0aCBYdEJyaWRnZVJlcXVlc3QgZm9ybWF0XG4gICAgaWYgKChnbG9iYWxUaGlzIGFzIGFueSkuaW52b2tlTmF0aXZlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIFwiaWRcIjogcmVxdWVzdElkLFxuICAgICAgICAgIFwicGFyYW1ldGVyc1wiOiBbXG4gICAgICAgICAgICB7IFwicGFyYW1ldHJvXCI6IGFjdGlvbiB9LFxuICAgICAgICAgICAgeyBcInBhcmFtZXRyb1wiOiBwYXlsb2FkID8gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCB8fCB7fSkgOiBcIlwiIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICBjaHVua1NpemVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KS5pbnZva2VOYXRpdmUoMCwgYCMjIyR7cmVxdWVzdH1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5yZXF1ZXN0X3NlbmRfZmFpbGVkJyk7XG4gICAgICAgIHJlc3BvbnNlU3ViamVjdC5lcnJvcihlcnJvcik7XG4gICAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlcXVlc3Rfc2VuZF9mYWlsZWQnKTtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdDRUYgY29tbXVuaWNhdGlvbiBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXNwb25zZVN1YmplY3QuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChyZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBvYnNlcnZhYmxlIHRoYXQgY29tcGxldGVzIGFmdGVyIGZpcnN0IHJlc3BvbnNlXG4gICAgcmV0dXJuIHJlc3BvbnNlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgdGFrZSgxKVxuICAgICkgYXMgT2JzZXJ2YWJsZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVzcG9uc2UgZnJvbSBDRUYgLSBUaHJlYWQtc2FmZSwgcHJldmVudHMgcmVzcG9uc2UgbWl4aW5nXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlOiBYdEJyaWRnZVJlc3BvbnNlKTogdm9pZCB7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLmludmFsaWRfcmVzcG9uc2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbnlSZXNwb25zZTogYW55ID0gcmVzcG9uc2UgYXMgYW55O1xuXG4gICAgLy8gU3Vwb3J0ZSBhIGNodW5rZWQgcmVzcG9uc2UgKGV4OiB7IGlkPywgY2h1bmssIHNlcSwgbGFzdCB9KVxuICAgIGlmIChhbnlSZXNwb25zZS5jaHVuaykge1xuICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IGFueVJlc3BvbnNlLmlkIHx8IHRoaXMucmVxdWVzdE9yZGVyLmF0KC0xKTtcbiAgICAgIGlmICghcmVzb2x2ZWRJZCkge1xuICAgICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuaW52YWxpZF9yZXNwb25zZScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlQ2h1bmtSZXNwb25zZShyZXNvbHZlZElkLCBhbnlSZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5pZCkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlc3BvbnNlX21pc3NpbmdfaWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5yZXNwb25zZVN1YmplY3RzLmdldChyZXNwb25zZS5pZCk7XG5cbiAgICB0aGlzLmhhbmRsZVN1YmplY3Qoc3ViamVjdCwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWJqZWN0KHN1YmplY3Q6IFN1YmplY3Q8YW55PiB8IHVuZGVmaW5lZCwgcmVzcG9uc2U6IFh0QnJpZGdlUmVzcG9uc2UpIHtcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgLy8gQ2xlYXIgdGltZW91dCBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5yZXF1ZXN0VGltZW91dHMuZ2V0KHJlc3BvbnNlLmlkKTtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGltZW91dHMuZGVsZXRlKHJlc3BvbnNlLmlkKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzcG9uc2UgbWF0Y2hlZCB0byBjb3JyZWN0IHJlcXVlc3QgSUQgLSBzYWZlIHRvIHByb2Nlc3NcbiAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgIHN1YmplY3QubmV4dChyZXNwb25zZS5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKHJlc3BvbnNlLmVycm9yID8/ICdTZXJ2ZXIgZXJyb3InKSk7XG4gICAgICB9XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZGVsZXRlKHJlc3BvbnNlLmlkKTtcbiAgICAgIHRoaXMucmVxdWVzdE9yZGVyID0gdGhpcy5yZXF1ZXN0T3JkZXIuZmlsdGVyKGlkID0+IGlkICE9PSByZXNwb25zZS5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG1hdGNoaW5nIHJlcXVlc3QgSUQgLSBjb3VsZCBiZSBsYXRlL2R1cGxpY2F0ZSByZXNwb25zZVxuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlc3BvbnNlX3Vua25vd25faWQnLCB7IGlkOiByZXNwb25zZS5pZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNodW5rZWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgY2FsbGJhY2tcbiAgICogQmFja2VuZCBjaGFtYSByZXNvbHZlRnVuY3Rpb24gbcO6bHRpcGxhcyB2ZXplcyBjb20gY2h1bmtzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUNodW5rUmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIGNodW5rUmVzcG9uc2U6IHsgY2h1bms6IHN0cmluZzsgc2VxOiBudW1iZXI7IGxhc3Q6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZ2V0KHJlcXVlc3RJZCk7XG4gICAgaWYgKCFzdWJqZWN0KSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY2h1bmtfdW5rbm93bl9pZCcsIHsgaWQ6IHJlcXVlc3RJZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbmljaWFsaXphciBidWZmZXIgc2UgbsOjbyBleGlzdGlyXG4gICAgbGV0IGJ1ZmZlciA9IHRoaXMuY2h1bmtCdWZmZXJzLmdldChyZXF1ZXN0SWQpO1xuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICBidWZmZXIgPSB7IGNodW5rczogbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKSB9O1xuICAgICAgdGhpcy5jaHVua0J1ZmZlcnMuc2V0KHJlcXVlc3RJZCwgYnVmZmVyKTtcbiAgICB9XG5cbiAgICAvLyBBcm1hemVuYXIgY2h1bmtcbiAgICBidWZmZXIuY2h1bmtzLnNldChjaHVua1Jlc3BvbnNlLnNlcSwgY2h1bmtSZXNwb25zZS5jaHVuayk7XG5cbiAgICBpZiAoYnVmZmVyLmNodW5rcy5zaXplID4gdGhpcy5NQVhfQ0hVTktTKSB7XG4gICAgICBzdWJqZWN0LmVycm9yKG5ldyBFcnJvcignTGltaXRlIGRlIGNodW5rcyBleGNlZGlkbycpKTtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5jaHVua19saW1pdF9leGNlZWRlZCcsIHsgaWQ6IHJlcXVlc3RJZCB9KTtcbiAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNYXJjYXIgc2VxdcOqbmNpYSBmaW5hbCBzZSBmb3IgbyDDumx0aW1vIGNodW5rXG4gICAgaWYgKGNodW5rUmVzcG9uc2UubGFzdCkge1xuICAgICAgYnVmZmVyLmxhc3RTZXEgPSBjaHVua1Jlc3BvbnNlLnNlcTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYXIgc2UgdG9kb3Mgb3MgY2h1bmtzIGZvcmFtIHJlY2ViaWRvc1xuICAgIGlmIChidWZmZXIubGFzdFNlcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBEZXRlY3RhciBzZSDDqSAwLWJhc2VkIG91IDEtYmFzZWRcbiAgICAgIGNvbnN0IGlzWmVyb0Jhc2VkID0gYnVmZmVyLmNodW5rcy5oYXMoMCk7XG4gICAgICBjb25zdCBleHBlY3RlZFNpemUgPSBpc1plcm9CYXNlZCA/IGJ1ZmZlci5sYXN0U2VxICsgMSA6IGJ1ZmZlci5sYXN0U2VxO1xuXG4gICAgICAvLyBBZ3VhcmRhciB0b2RvcyBvcyBjaHVua3NcbiAgICAgIGlmIChidWZmZXIuY2h1bmtzLnNpemUgIT09IGV4cGVjdGVkU2l6ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRvZG9zIG9zIGNodW5rcyByZWNlYmlkb3MgLSBtb250YXIgcmVzcG9zdGEgZmluYWxcbiAgICAgIGNvbnN0IGNodW5rc09yZGVyZWQgPSBBcnJheS5mcm9tKGJ1ZmZlci5jaHVua3MuZW50cmllcygpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYVswXSAtIGJbMF0pXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeVsxXSlcbiAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNodW5rc09yZGVyZWQpO1xuICAgICAgICBzdWJqZWN0Lm5leHQocGFyc2VkKTtcbiAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnNob3dFcnJvcih0aGlzLlRPQVNUX0VSUk9SX1JFU1BPTlNFX1BST0NFU1NfRkFJTEVEX1dJVEhfSUQsIHsgaWQ6IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgc3ViamVjdC5lcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBjaHVua2VkIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChyZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCByZXF1ZXN0IHRyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIGNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZXNwb25zZVN1YmplY3RzLmRlbGV0ZShyZXF1ZXN0SWQpO1xuICAgIHRoaXMucmVxdWVzdE9yZGVyID0gdGhpcy5yZXF1ZXN0T3JkZXIuZmlsdGVyKGlkID0+IGlkICE9PSByZXF1ZXN0SWQpO1xuICAgIHRoaXMuY2h1bmtCdWZmZXJzLmRlbGV0ZShyZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMucmVxdWVzdFRpbWVvdXRzLmdldChyZXF1ZXN0SWQpO1xuICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5kZWxldGUocmVxdWVzdElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbm5lY3Rpb24gc3RhdHVzIGFzIG9ic2VydmFibGVcbiAgICovXG4gIGdldENvbm5lY3Rpb25TdGF0dXMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXR1cy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBDRUYgaXMgY3VycmVudGx5IGF2YWlsYWJsZVxuICAgKi9cbiAgaXNDZWZBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXR1cy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwIHBlbmRpbmcgcmVxdWVzdHMgKGNhbGwgb24gY29tcG9uZW50IGRlc3Ryb3kpXG4gICAqL1xuICBjbGVhbnVwKCk6IHZvaWQge1xuICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0cy5mb3JFYWNoKChzdWJqZWN0KSA9PiB7XG4gICAgICBzdWJqZWN0LmVycm9yKG5ldyBFcnJvcignU2VydmljZSBjbGVhbnVwIC0gcmVxdWVzdCBjYW5jZWxsZWQnKSk7XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNwb25zZVN1YmplY3RzLmNsZWFyKCk7XG5cbiAgICAvLyBDbGVhciBhbGwgdGltZW91dHNcbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5mb3JFYWNoKHRpbWVvdXQgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5jbGVhcigpO1xuXG4gICAgLy8gQ2xlYXIgcGVuZGluZyByZXRyaWVzXG4gICAgdGhpcy5yZXRyeVRpbWVvdXRzLmZvckVhY2godGltZW91dCA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpO1xuICAgIHRoaXMucmV0cnlUaW1lb3V0cy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZWJ1ZyBpbmZvIGFib3V0IHBlbmRpbmcgcmVxdWVzdHNcbiAgICovXG4gIGdldERlYnVnSW5mbygpOiB7IHBlbmRpbmdSZXF1ZXN0czogbnVtYmVyOyBhY3RpdmVUaW1lb3V0czogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nUmVxdWVzdHM6IHRoaXMucmVzcG9uc2VTdWJqZWN0cy5zaXplLFxuICAgICAgYWN0aXZlVGltZW91dHM6IHRoaXMucmVxdWVzdFRpbWVvdXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYSBsb2NhbGl6ZWQgZXJyb3IgdG9hc3QgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93RXJyb3Ioa2V5OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4pOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3Iuc3VtbWFyeScpLFxuICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoa2V5LCBwYXJhbXMpXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
492
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHQtYnJpZGdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvc3JjL2xpYi9zZXJ2aWNlcy94dC1icmlkZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBMkUzRCxNQUFNLE9BQU8sZUFBZTtJQW1CMUI7UUFqQmlCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQ25ELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN6QyxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNoRSxpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUNuQixpQkFBWSxHQUFHLElBQUksR0FBRyxFQUE2RCxDQUFDO1FBQ3BGLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELDRDQUF1QyxHQUFHLGlCQUFpQixDQUFDO1FBQzVELDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyx1QkFBa0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsZUFBZTtRQUMvQyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQUN4Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsb0JBQWUsR0FB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SW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4vdHJhbnNsYXRpb24uc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgWHRCcmlkZ2VSZXF1ZXN0IHtcbiAgaWQ6IHN0cmluZztcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIHBheWxvYWQ/OiBhbnk7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFh0QnJpZGdlUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkYXRhPzogYW55O1xuICBlcnJvcj86IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlQ29uZmlnIHtcbiAgLy8gTm9tZSBkYSBmdW7Dp8OjbyBubyBCYWNrLUVuZCAoZGVmYXVsdDogXCJYdEJyaWRnZVJlcXVlc3RcIilcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8vIFRpbWVvdXQgcGFyYSByZXF1aXNpw6fDtWVzIGVtIG1zIChkZWZhdWx0OiAzMDAwMClcbiAgcmVxdWVzdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLy8gVGFtYW5obyBkZSBjaHVuayBwYXJhIGRhZG9zIGdyYW5kZXMgZW0gYnl0ZXMgKGRlZmF1bHQ6IDY0S0IpXG4gIGNodW5rU2l6ZT86IG51bWJlcjtcblxuICAvLyBOw7ptZXJvIG3DoXhpbW8gZGUgdGVudGF0aXZhcyBlbSBjYXNvIGRlIGZhbGhhIChkZWZhdWx0OiAzKVxuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuXG4gIC8vIERlbGF5IGVudHJlIHRlbnRhdGl2YXMgZW0gbXMgKGRlZmF1bHQ6IDEwMDAwKVxuICByZXRyeURlbGF5PzogbnVtYmVyO1xuXG4gIC8vIFNlIHRydWUsIG7Do28gYWd1YXJkYSByZXNwb3N0YSBkbyBCYWNrLUVuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICBub1dhaXQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRCcmlkZ2VDb25maWcge1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgdGltZW91dDogbnVtYmVyO1xuICBjaHVua1NpemU6IG51bWJlcjtcbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICByZXRyeURlbGF5OiBudW1iZXI7XG4gIG5vV2FpdDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEF0dGVtcHRTdGF0ZSB7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIGN1cnJlbnRJbm5lclN1YjogeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9IHwgbnVsbDtcbiAgY3VycmVudFJlcXVlc3RJZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIEF0dGVtcHRDb250ZXh0IHtcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIHBheWxvYWQ6IGFueTtcbiAgY29uZmlnOiBSZXNvbHZlZEJyaWRnZUNvbmZpZztcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAvLyBDRUYgaW5qZWN0ZWQgZnVuY3Rpb25zXG4gICAgY2VmU2VuZFRvU2VydmVyPzogKHJlcXVlc3REYXRhOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgLy8gQW5ndWxhciBjYWxsYmFjayBmdW5jdGlvbnNcbiAgICBoYW5kbGVDZWZSZXNwb25zZT86IChyZXNwb25zZURhdGE6IHN0cmluZykgPT4gdm9pZDtcbiAgICAvLyBOYXRpdmUgaW52b2tlIGZ1bmN0aW9uIGZvciBYdCBlbXVsYXRvclxuICAgIGludm9rZU5hdGl2ZT86ICh0eXBlOiBudW1iZXIsIHBheWxvYWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICAvLyBBcHAgY29tcG9uZW50IGNhbGxiYWNrcyAtIGNhbGxlZCBieSBzZXJ2ZXIgd2l0aCByZXF1ZXN0IElEXG4gICAgcmVzb2x2ZUZ1bmN0aW9uPzogKGlkOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gdm9pZDtcbiAgICByZWplY3RGdW5jdGlvbj86IChpZDogc3RyaW5nLCBlcnJvcjogYW55KSA9PiB2b2lkO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFh0QnJpZGdlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZXNwb25zZVN1YmplY3RzID0gbmV3IE1hcDxzdHJpbmcsIFN1YmplY3Q8YW55Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0VGltZW91dHMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25TdGF0dXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZXF1ZXN0T3JkZXI6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2h1bmtCdWZmZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgY2h1bmtzOiBNYXA8bnVtYmVyLCBzdHJpbmc+OyBsYXN0U2VxPzogbnVtYmVyIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2UgPSBpbmplY3QoTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0aW9uU2VydmljZSA9IGluamVjdChUcmFuc2xhdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfWFRfQlJJREdFX1JFUVVFU1RfRlVOQ1RJT05fTkFNRSA9IFwiWHRCcmlkZ2VSZXF1ZXN0XCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9SRVFVRVNUX1RJTUVfT1VUID0gMzAwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0OyAvLyBEZWZhdWx0IDY0S0JcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfQ0hVTktTID0gMTAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX01BWF9SRVRSSUVTID0gMztcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1JFVFJZX0RFTEFZID0gMTAwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9OT19XQUlUID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCA9ICdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5yZXNwb25zZV9wcm9jZXNzX2ZhaWxlZF93aXRoX2lkJztcbiAgcHJpdmF0ZSByZWFkb25seSByZXRyeVRpbWVvdXRzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmluaXRpYWxpemVDZWZDb21tdW5pY2F0aW9uKCk7XG4gICAgdGhpcy5jaGVja0NlZkF2YWlsYWJpbGl0eSgpO1xuICAgIC8vIFJlZ2lzdHJhciBjYWxsYmFja3MgZ2xvYmFpcyBwYXJhIG8gc2Vydmlkb3IgY2hhbWFyXG4gICAgdGhpcy5yZWdpc3Rlckdsb2JhbENhbGxiYWNrcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBnbG9iYWwgY2FsbGJhY2tzIHRoYXQgdGhlIHNlcnZlciB3aWxsIGludm9rZVxuICAgKiBTZXJ2aWRvciBjaGFtYSBkb2N1bWVudC5hcHAuZzUucmVzb2x2ZUZ1bmN0aW9uKGlkLCBkYXRhKSBvdSBkb2N1bWVudC5hcHAuZzUucmVqZWN0RnVuY3Rpb24oaWQsIGVycm9yKVxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3Rlckdsb2JhbENhbGxiYWNrcygpOiB2b2lkIHtcbiAgICAvLyBDcmlhciBlc3RydXR1cmEgZG9jdW1lbnQuYXBwLmc1IHNlIG7Do28gZXhpc3RpclxuICAgIGlmICghKGRvY3VtZW50IGFzIGFueSkuYXBwKSB7XG4gICAgICAoZG9jdW1lbnQgYXMgYW55KS5hcHAgPSB7fTtcbiAgICB9XG4gICAgaWYgKCEoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUpIHtcbiAgICAgIChkb2N1bWVudCBhcyBhbnkpLmFwcC5nNSA9IHt9O1xuICAgIH1cblxuICAgIC8vIFNhbHZhciByZWZlcsOqbmNpYXMgb3JpZ2luYWlzIHNlIGV4aXN0aXJlbSAoZG8gQXBwQ29tcG9uZW50KVxuICAgIGNvbnN0IG9yaWdpbmFsUmVzb2x2ZSA9IChkb2N1bWVudCBhcyBhbnkpLmFwcC5nNS5yZXNvbHZlRnVuY3Rpb247XG4gICAgY29uc3Qgb3JpZ2luYWxSZWplY3QgPSAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVqZWN0RnVuY3Rpb247XG5cbiAgICAvLyBEZWZpbmlyIG5vdmEgcmVzb2x2ZUZ1bmN0aW9uXG4gICAgKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlc29sdmVGdW5jdGlvbiA9IChpZDogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcbiAgICAgIC8vIENoYW1hciBvcmlnaW5hbCBkbyBBcHBDb21wb25lbnQgc2UgZXhpc3RpclxuICAgICAgaWYgKG9yaWdpbmFsUmVzb2x2ZSAmJiB0eXBlb2Ygb3JpZ2luYWxSZXNvbHZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3JpZ2luYWxSZXNvbHZlLmNhbGwoZ2xvYmFsVGhpcywgaWQsIGRhdGEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY2FsbGJhY2tfZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2Vzc2FyIHZpYSBYdEJyaWRnZVNlcnZpY2VcbiAgICAgIHRoaXMuaGFuZGxlU2VydmVyQ2FsbGJhY2soaWQsIGRhdGEsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLy8gRGVmaW5pciBub3ZhIHJlamVjdEZ1bmN0aW9uXG4gICAgKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlamVjdEZ1bmN0aW9uID0gKGlkOiBzdHJpbmcsIGVycm9yOiBhbnkpID0+IHtcbiAgICAgIC8vIENoYW1hciBvcmlnaW5hbCBkbyBBcHBDb21wb25lbnQgc2UgZXhpc3RpclxuICAgICAgaWYgKG9yaWdpbmFsUmVqZWN0ICYmIHR5cGVvZiBvcmlnaW5hbFJlamVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG9yaWdpbmFsUmVqZWN0LmNhbGwoZ2xvYmFsVGhpcywgaWQsIGVycm9yKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLmNhbGxiYWNrX2ZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3NhciB2aWEgWHRCcmlkZ2VTZXJ2aWNlXG4gICAgICB0aGlzLmhhbmRsZVNlcnZlckNhbGxiYWNrKGlkLCBlcnJvciwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8vIFRhbWLDqW0gcmVnaXN0cmFyIGVtIHdpbmRvdyBwYXJhIGNvbXBhdGliaWxpZGFkZVxuICAgIChnbG9iYWxUaGlzIGFzIGFueSkucmVzb2x2ZUZ1bmN0aW9uID0gKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlc29sdmVGdW5jdGlvbjtcbiAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLnJlamVjdEZ1bmN0aW9uID0gKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlamVjdEZ1bmN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgQ0VGIGNvbW11bmljYXRpb24gYnkgc2V0dGluZyB1cCB0aGUgZ2xvYmFsIGNhbGxiYWNrXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVDZWZDb21tdW5pY2F0aW9uKCk6IHZvaWQge1xuICAgIC8vIFNldCB1cCBnbG9iYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBDRUYgd2lsbCBjYWxsIChmb3IgZGlyZWN0IHJlc3BvbnNlcylcbiAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLmhhbmRsZUNlZlJlc3BvbnNlID0gKHJlc3BvbnNlRGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZTogYW55ID0gSlNPTi5wYXJzZShyZXNwb25zZURhdGEpO1xuICAgICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IucmVzcG9uc2VfcGFyc2VfZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2FsbGJhY2sgZnJvbSBzZXJ2ZXIgdmlhIHJlc29sdmVGdW5jdGlvbi9yZWplY3RGdW5jdGlvblxuICAgKiBQcm9jZXNzYSB0YW50byByZXNwb3N0YXMgc2ltcGxlcyBxdWFudG8gY2h1bmtlZFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTZXJ2ZXJDYWxsYmFjayhpZDogc3RyaW5nLCBkYXRhOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5yZXNwb25zZVN1YmplY3RzLmdldChpZCk7XG5cbiAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKHRoaXMuVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCwgeyBpZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHBhcnNlZERhdGEgPSBkYXRhO1xuXG4gICAgICAvLyBQYXJzZSBKU09OIHNlIGZvciBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3IodGhpcy5UT0FTVF9FUlJPUl9SRVNQT05TRV9QUk9DRVNTX0ZBSUxFRF9XSVRIX0lELCB7IGlkIH0pO1xuICAgICAgICAgIHBhcnNlZERhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc1BhcnNlZERhdGFPYmplY3QgPSBwYXJzZWREYXRhICYmIHR5cGVvZiBwYXJzZWREYXRhID09PSAnb2JqZWN0JztcbiAgICAgIC8vIFZlcmlmaWNhciBzZSDDqSByZXNwb3N0YSBjaHVua2VkIHsgY2h1bmssIHNlcSwgbGFzdCB9XG4gICAgICBpZiAoaGFzUGFyc2VkRGF0YU9iamVjdCAmJiBwYXJzZWREYXRhLmNodW5rICYmIHBhcnNlZERhdGEuc2VxICE9PSB1bmRlZmluZWQgJiYgcGFyc2VkRGF0YS5sYXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDaHVua1Jlc3BvbnNlKGlkLCBwYXJzZWREYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNwb3N0YSBub3JtYWwgKG7Do28tY2h1bmtlZClcbiAgICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gZGF0YSA6IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICB0aGlzLnNob3dFcnJvcih0aGlzLlRPQVNUX0VSUk9SX1JFU1BPTlNFX1BST0NFU1NfRkFJTEVEX1dJVEhfSUQsIHsgaWQgfSk7XG4gICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKGVycm9yTXNnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJqZWN0Lm5leHQocGFyc2VkRGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QoaWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcih0aGlzLlRPQVNUX0VSUk9SX1JFU1BPTlNFX1BST0NFU1NfRkFJTEVEX1dJVEhfSUQsIHsgaWQgfSk7XG4gICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QoaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBDRUYgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tDZWZBdmFpbGFiaWxpdHkoKTogdm9pZCB7XG4gICAgY29uc3QgaXNBdmFpbGFibGUgPSB0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5jZWZTZW5kVG9TZXJ2ZXIgPT09ICdmdW5jdGlvbic7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzLm5leHQoaXNBdmFpbGFibGUpO1xuXG4gICAgaWYgKCFpc0F2YWlsYWJsZSkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLmNlZl91bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIHJlcXVlc3RzIC0gZ3VhcmFudGVlZCB1bmlxdWUgZXZlbiB3aXRoIGNvbmN1cnJlbnQgY2FsbHNcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVSZXF1ZXN0SWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJhbmRvbSA9IGNyeXB0by5yYW5kb21VVUlEKCkuc3BsaXQoJy0nKS5qb2luKCcnKTtcbiAgICBjb25zdCBjb3VudGVyID0gdGhpcy5yZXNwb25zZVN1YmplY3RzLnNpemU7IC8vIEFkZGl0aW9uYWwgdW5pcXVlbmVzc1xuICAgIHJldHVybiBgcmVxXyR7dGltZXN0YW1wfV8ke3JhbmRvbX1fJHtjb3VudGVyfWA7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCByZXF1ZXN0IHRvIHNlcnZlciB2aWEgQ0VGIC0gVGhyZWFkLXNhZmUgd2l0aCB0aW1lb3V0IHByb3RlY3Rpb24gYW5kIHJldHJ5IHJlc2lsaWVuY2VcbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbiBOb21lIGRhIGHDp8Ojby9BUEkgYSBzZXIgaW52b2NhZGEgbm8gQmFjay1FbmRcbiAgICogQHBhcmFtIGxvY2FsZSBMb2NhbGUgb2JyaWdhdMOzcmlvIHBhcmEgaW50ZXJuYWNpb25hbGl6YXIgYXMgbWVuc2FnZW5zIGRlIFRvYXN0IChleDogJ3B0LUJSJywgJ2VuLVVTJywgJ2VzLUVTJykuXG4gICAqICAgICAgICAgICAgICAgQXR1YWxpemEgbyBsb2NhbGUgYXRpdm8gZG8gVHJhbnNsYXRpb25TZXJ2aWNlIGFudGVzIGRlIGVudmlhciBhIHJlcXVpc2nDp8Ojby5cbiAgICogQHBhcmFtIHBheWxvYWQgRGFkb3MgYSBzZXJlbSBlbnZpYWRvcyBhbyBCYWNrLUVuZFxuICAgKiBAcGFyYW0gYnJpZGdlQ29uZmlnIENvbmZpZ3VyYcOnw7VlcyBvcGNpb25haXMgZGEgcmVxdWlzacOnw6NvXG4gICAqL1xuICBzZW5kUmVxdWVzdDxUID0gYW55PihhY3Rpb246IHN0cmluZywgbG9jYWxlOiBzdHJpbmcsIHBheWxvYWQ/OiBhbnksIGJyaWRnZUNvbmZpZz86IEJyaWRnZUNvbmZpZyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldExvY2FsZShsb2NhbGUpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkQnJpZGdlQ29uZmlnID0ge1xuICAgICAgZnVuY3Rpb25OYW1lOiBicmlkZ2VDb25maWc/LmZ1bmN0aW9uTmFtZSA/PyB0aGlzLkRFRkFVTFRfWFRfQlJJREdFX1JFUVVFU1RfRlVOQ1RJT05fTkFNRSxcbiAgICAgIHRpbWVvdXQ6IGJyaWRnZUNvbmZpZz8ucmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5ERUZBVUxUX1JFUVVFU1RfVElNRV9PVVQsXG4gICAgICBjaHVua1NpemU6IGJyaWRnZUNvbmZpZz8uY2h1bmtTaXplID8/IHRoaXMuREVGQVVMVF9DSFVOS19TSVpFLFxuICAgICAgbWF4UmV0cmllczogYnJpZGdlQ29uZmlnPy5tYXhSZXRyaWVzID8/IHRoaXMuREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgICAgIHJldHJ5RGVsYXk6IGJyaWRnZUNvbmZpZz8ucmV0cnlEZWxheSA/PyB0aGlzLkRFRkFVTFRfUkVUUllfREVMQVksXG4gICAgICBub1dhaXQ6IGJyaWRnZUNvbmZpZz8ubm9XYWl0ID8/IHRoaXMuREVGQVVMVF9OT19XQUlUXG4gICAgfTtcblxuICAgIGNvbnN0IHJldHJ5S2V5ID0gdGhpcy5nZW5lcmF0ZVJlcXVlc3RJZCgpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFQ+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZTogQXR0ZW1wdFN0YXRlID0ge1xuICAgICAgICBhYm9ydGVkOiBmYWxzZSxcbiAgICAgICAgY3VycmVudElubmVyU3ViOiBudWxsLFxuICAgICAgICBjdXJyZW50UmVxdWVzdElkOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29udGV4dDogQXR0ZW1wdENvbnRleHQgPSB7IGFjdGlvbiwgcGF5bG9hZCwgY29uZmlnOiByZXNvbHZlZENvbmZpZyB9O1xuXG4gICAgICB0aGlzLnJ1bkF0dGVtcHQ8VD4oMCwgc3RhdGUsIHJldHJ5S2V5LCBzdWJzY3JpYmVyLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuICgpID0+IHRoaXMuY2FuY2VsU2VuZFJlcXVlc3Qoc3RhdGUsIHJldHJ5S2V5KTtcbiAgICB9KS5waXBlKHRha2UoMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIHNpbmdsZSBhdHRlbXB0IGFuZCBzY2hlZHVsZSByZXRyaWVzIG9uIGVycm9yXG4gICAqL1xuICBwcml2YXRlIHJ1bkF0dGVtcHQ8VD4oXG4gICAgYXR0ZW1wdE51bWJlcjogbnVtYmVyLFxuICAgIHN0YXRlOiBBdHRlbXB0U3RhdGUsXG4gICAgcmV0cnlLZXk6IHN0cmluZyxcbiAgICBzdWJzY3JpYmVyOiB7IG5leHQ6ICh2OiBUKSA9PiB2b2lkOyBlcnJvcjogKGU6IGFueSkgPT4gdm9pZDsgY29tcGxldGU6ICgpID0+IHZvaWQgfSxcbiAgICBjb250ZXh0OiBBdHRlbXB0Q29udGV4dFxuICApOiB2b2lkIHtcbiAgICBpZiAoc3RhdGUuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0SWQoKTtcbiAgICBzdGF0ZS5jdXJyZW50UmVxdWVzdElkID0gcmVxdWVzdElkO1xuXG4gICAgc3RhdGUuY3VycmVudElubmVyU3ViID0gdGhpcy5leGVjdXRlQXR0ZW1wdDxUPihcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIGNvbnRleHQuYWN0aW9uLFxuICAgICAgY29udGV4dC5wYXlsb2FkLFxuICAgICAgY29udGV4dC5jb25maWcuZnVuY3Rpb25OYW1lLFxuICAgICAgY29udGV4dC5jb25maWcudGltZW91dCxcbiAgICAgIGNvbnRleHQuY29uZmlnLmNodW5rU2l6ZSxcbiAgICAgIGNvbnRleHQuY29uZmlnLm5vV2FpdFxuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB0aGlzLmhhbmRsZUF0dGVtcHRTdWNjZXNzPFQ+KGRhdGEsIHN1YnNjcmliZXIsIHJldHJ5S2V5KSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMuaGFuZGxlQXR0ZW1wdEVycm9yPFQ+KFxuICAgICAgICBlcnJvciwgYXR0ZW1wdE51bWJlciwgc3RhdGUsIHJldHJ5S2V5LCBzdWJzY3JpYmVyLCBjb250ZXh0XG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBdHRlbXB0U3VjY2VzczxUPihcbiAgICBkYXRhOiBULFxuICAgIHN1YnNjcmliZXI6IHsgbmV4dDogKHY6IFQpID0+IHZvaWQ7IGNvbXBsZXRlOiAoKSA9PiB2b2lkIH0sXG4gICAgcmV0cnlLZXk6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7XG4gICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIHRoaXMucmV0cnlUaW1lb3V0cy5kZWxldGUocmV0cnlLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBdHRlbXB0RXJyb3I8VD4oXG4gICAgZXJyb3I6IGFueSxcbiAgICBhdHRlbXB0TnVtYmVyOiBudW1iZXIsXG4gICAgc3RhdGU6IEF0dGVtcHRTdGF0ZSxcbiAgICByZXRyeUtleTogc3RyaW5nLFxuICAgIHN1YnNjcmliZXI6IHsgbmV4dDogKHY6IFQpID0+IHZvaWQ7IGVycm9yOiAoZTogYW55KSA9PiB2b2lkOyBjb21wbGV0ZTogKCkgPT4gdm9pZCB9LFxuICAgIGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0XG4gICk6IHZvaWQge1xuICAgIGlmIChzdGF0ZS5hYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHROdW1iZXIgPCBjb250ZXh0LmNvbmZpZy5tYXhSZXRyaWVzKSB7XG4gICAgICBjb25zdCByZXRyeVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXRyeVRpbWVvdXRzLmRlbGV0ZShyZXRyeUtleSk7XG4gICAgICAgIHRoaXMucnVuQXR0ZW1wdDxUPihhdHRlbXB0TnVtYmVyICsgMSwgc3RhdGUsIHJldHJ5S2V5LCBzdWJzY3JpYmVyLCBjb250ZXh0KTtcbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLnJldHJ5RGVsYXkpO1xuICAgICAgdGhpcy5yZXRyeVRpbWVvdXRzLnNldChyZXRyeUtleSwgcmV0cnlUaW1lb3V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY29tbXVuaWNhdGlvbl9mYWlsZWRfYWZ0ZXJfcmV0cmllcycsIHtcbiAgICAgIGF0dGVtcHRzOiBjb250ZXh0LmNvbmZpZy5tYXhSZXRyaWVzICsgMVxuICAgIH0pO1xuICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxTZW5kUmVxdWVzdChzdGF0ZTogQXR0ZW1wdFN0YXRlLCByZXRyeUtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgc3RhdGUuYWJvcnRlZCA9IHRydWU7XG5cbiAgICAvLyBDYW5jZWxhciByZXRyeSBhZ2VuZGFkb1xuICAgIGNvbnN0IHBlbmRpbmdSZXRyeSA9IHRoaXMucmV0cnlUaW1lb3V0cy5nZXQocmV0cnlLZXkpO1xuICAgIGlmIChwZW5kaW5nUmV0cnkpIHtcbiAgICAgIGNsZWFyVGltZW91dChwZW5kaW5nUmV0cnkpO1xuICAgICAgdGhpcy5yZXRyeVRpbWVvdXRzLmRlbGV0ZShyZXRyeUtleSk7XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsYXIgdGVudGF0aXZhIGVtIGFuZGFtZW50b1xuICAgIGlmIChzdGF0ZS5jdXJyZW50SW5uZXJTdWIpIHtcbiAgICAgIHN0YXRlLmN1cnJlbnRJbm5lclN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIExpbXBhciByZXF1aXNpw6fDo28gcGVuZGVudGUgbm8gc2Vydmlkb3JcbiAgICBpZiAoc3RhdGUuY3VycmVudFJlcXVlc3RJZCkge1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChzdGF0ZS5jdXJyZW50UmVxdWVzdElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBhdHRlbXB0IG9mIHRoZSByZXF1ZXN0XG4gICAqL1xuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBhdHRlbXB0IG9mIHRoZSByZXF1ZXN0XG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgVW5pcXVlIHJlcXVlc3QgSURcbiAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGRhdGFcbiAgICogQHBhcmFtIGZ1bmN0aW9uTmFtZSBCYWNrZW5kIGZ1bmN0aW9uIG5hbWVcbiAgICogQHBhcmFtIHRpbWVvdXQgVGltZW91dCBpbiBtc1xuICAgKiBAcGFyYW0gY2h1bmtTaXplIENodW5rIHNpemUgaW4gYnl0ZXNcbiAgICogQHBhcmFtIG5vV2FpdCBJZiB0cnVlLCBkbyBub3Qgd2FpdCBmb3IgYSByZXNwb25zZSAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgKi9cbiAgcHJpdmF0ZSBleGVjdXRlQXR0ZW1wdDxUPihcbiAgICByZXF1ZXN0SWQ6IHN0cmluZyxcbiAgICBhY3Rpb246IHN0cmluZyxcbiAgICBwYXlsb2FkOiBhbnksXG4gICAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgdGltZW91dDogbnVtYmVyLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyLFxuICAgIG5vV2FpdDogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAvLyBDcmVhdGUgc3ViamVjdCBmb3IgdGhpcyBzcGVjaWZpYyByZXF1ZXN0XG4gICAgY29uc3QgcmVzcG9uc2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0cy5zZXQocmVxdWVzdElkLCByZXNwb25zZVN1YmplY3QpO1xuICAgIHRoaXMucmVxdWVzdE9yZGVyLnB1c2gocmVxdWVzdElkKTtcblxuICAgIGlmIChub1dhaXQpIHtcbiAgICAgIC8vIEZpcmUgYW5kIGZvcmdldDogc2VuZCByZXF1ZXN0IHZpYSBpbnZva2VOYXRpdmUgd2l0aCBYdEJyaWRnZVJlcXVlc3QgZm9ybWF0LCBkbyBub3QgdHJhY2sgcmVzcG9uc2Ugb3IgdGltZW91dFxuICAgICAgdGhpcy5zZW5kUmVxdWVzdEludm9rZU5hdGl2ZShyZXF1ZXN0SWQsIGFjdGlvbiwgcGF5bG9hZCwgZnVuY3Rpb25OYW1lLCBjaHVua1NpemUsIHJlc3BvbnNlU3ViamVjdCk7XG5cbiAgICAgIC8vIFJldHVybiBhbiBvYnNlcnZhYmxlIHRoYXQgY29tcGxldGVzIGltbWVkaWF0ZWx5XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIHRpbWVvdXQgdG8gcHJldmVudCBoYW5naW5nIHJlcXVlc3RzXG4gICAgY29uc3Qgc2V0dXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5yZXNwb25zZVN1YmplY3RzLmdldChyZXF1ZXN0SWQpO1xuICAgICAgaWYgKHN1YmplY3QpIHtcbiAgICAgICAgc3ViamVjdC5lcnJvcihuZXcgRXJyb3IoYFJlcXVlc3QgJHtyZXF1ZXN0SWR9IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXNgKSk7XG4gICAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgIH1cbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzLnNldChyZXF1ZXN0SWQsIHNldHVwVGltZW91dCk7XG5cbiAgICAvLyBTZW5kIHJlcXVlc3QgdmlhIGludm9rZU5hdGl2ZSB3aXRoIFh0QnJpZGdlUmVxdWVzdCBmb3JtYXRcbiAgICB0aGlzLnNlbmRSZXF1ZXN0SW52b2tlTmF0aXZlKHJlcXVlc3RJZCwgYWN0aW9uLCBwYXlsb2FkLCBmdW5jdGlvbk5hbWUsIGNodW5rU2l6ZSwgcmVzcG9uc2VTdWJqZWN0KTtcblxuICAgIC8vIFJldHVybiBvYnNlcnZhYmxlIHRoYXQgY29tcGxldGVzIGFmdGVyIGZpcnN0IHJlc3BvbnNlXG4gICAgcmV0dXJuIHJlc3BvbnNlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgdGFrZSgxKVxuICAgICkgYXMgT2JzZXJ2YWJsZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgcmVxdWVzdCB1c2luZyBpbnZva2VOYXRpdmVcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBVbmlxdWUgcmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZGF0YVxuICAgKiBAcGFyYW0gZnVuY3Rpb25OYW1lIEJhY2tlbmQgZnVuY3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gdGltZW91dCBUaW1lb3V0IGluIG1zXG4gICAqIEBwYXJhbSBjaHVua1NpemUgQ2h1bmsgc2l6ZSBpbiBieXRlc1xuICAgKiBAcGFyYW0gcmVzcG9uc2VTdWJqZWN0IFN1YmplY3QgdG8gZW1pdCByZXNwb25zZSBvciBlcnJvciB0b1xuICAgKi9cbiAgcHJpdmF0ZSBzZW5kUmVxdWVzdEludm9rZU5hdGl2ZShcbiAgICByZXF1ZXN0SWQ6IHN0cmluZyxcbiAgICBhY3Rpb246IHN0cmluZyxcbiAgICBwYXlsb2FkOiBhbnksXG4gICAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgY2h1bmtTaXplOiBudW1iZXIsXG4gICAgcmVzcG9uc2VTdWJqZWN0OiBTdWJqZWN0PGFueT4pIHtcbiAgICBpZiAoKGdsb2JhbFRoaXMgYXMgYW55KS5pbnZva2VOYXRpdmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgXCJpZFwiOiByZXF1ZXN0SWQsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IFtcbiAgICAgICAgICAgIHsgXCJwYXJhbWV0cm9cIjogYWN0aW9uIH0sXG4gICAgICAgICAgICB7IFwicGFyYW1ldHJvXCI6IHBheWxvYWQgPyBKU09OLnN0cmluZ2lmeShwYXlsb2FkIHx8IHt9KSA6IFwiXCIgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIGNodW5rU2l6ZVxuICAgICAgICB9KTtcblxuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLmludm9rZU5hdGl2ZSgwLCBgIyMjJHtyZXF1ZXN0fWApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlcXVlc3Rfc2VuZF9mYWlsZWQnKTtcbiAgICAgICAgcmVzcG9uc2VTdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChyZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IucmVxdWVzdF9zZW5kX2ZhaWxlZCcpO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0NFRiBjb21tdW5pY2F0aW9uIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJlc3BvbnNlU3ViamVjdC5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSByZXNwb25zZSBmcm9tIENFRiAtIFRocmVhZC1zYWZlLCBwcmV2ZW50cyByZXNwb25zZSBtaXhpbmdcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2U6IFh0QnJpZGdlUmVzcG9uc2UpOiB2b2lkIHtcbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuaW52YWxpZF9yZXNwb25zZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFueVJlc3BvbnNlOiBhbnkgPSByZXNwb25zZSBhcyBhbnk7XG5cbiAgICAvLyBTdXBvcnRlIGEgY2h1bmtlZCByZXNwb25zZSAoZXg6IHsgaWQ/LCBjaHVuaywgc2VxLCBsYXN0IH0pXG4gICAgaWYgKGFueVJlc3BvbnNlLmNodW5rKSB7XG4gICAgICBjb25zdCByZXNvbHZlZElkID0gYW55UmVzcG9uc2UuaWQgfHwgdGhpcy5yZXF1ZXN0T3JkZXIuYXQoLTEpO1xuICAgICAgaWYgKCFyZXNvbHZlZElkKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5pbnZhbGlkX3Jlc3BvbnNlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVDaHVua1Jlc3BvbnNlKHJlc29sdmVkSWQsIGFueVJlc3BvbnNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLmlkKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IucmVzcG9uc2VfbWlzc2luZ19pZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZ2V0KHJlc3BvbnNlLmlkKTtcblxuICAgIHRoaXMuaGFuZGxlU3ViamVjdChzdWJqZWN0LCByZXNwb25zZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1YmplY3Qoc3ViamVjdDogU3ViamVjdDxhbnk+IHwgdW5kZWZpbmVkLCByZXNwb25zZTogWHRCcmlkZ2VSZXNwb25zZSkge1xuICAgIGlmIChzdWJqZWN0KSB7XG4gICAgICAvLyBDbGVhciB0aW1lb3V0IGZvciB0aGlzIHJlcXVlc3RcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnJlcXVlc3RUaW1lb3V0cy5nZXQocmVzcG9uc2UuaWQpO1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5kZWxldGUocmVzcG9uc2UuaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNwb25zZSBtYXRjaGVkIHRvIGNvcnJlY3QgcmVxdWVzdCBJRCAtIHNhZmUgdG8gcHJvY2Vzc1xuICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgc3ViamVjdC5uZXh0KHJlc3BvbnNlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3ViamVjdC5lcnJvcihuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IgPz8gJ1NlcnZlciBlcnJvcicpKTtcbiAgICAgIH1cbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0cy5kZWxldGUocmVzcG9uc2UuaWQpO1xuICAgICAgdGhpcy5yZXF1ZXN0T3JkZXIgPSB0aGlzLnJlcXVlc3RPcmRlci5maWx0ZXIoaWQgPT4gaWQgIT09IHJlc3BvbnNlLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gbWF0Y2hpbmcgcmVxdWVzdCBJRCAtIGNvdWxkIGJlIGxhdGUvZHVwbGljYXRlIHJlc3BvbnNlXG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IucmVzcG9uc2VfdW5rbm93bl9pZCcsIHsgaWQ6IHJlc3BvbnNlLmlkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2h1bmtlZCByZXNwb25zZSBmcm9tIHNlcnZlciBjYWxsYmFja1xuICAgKiBCYWNrZW5kIGNoYW1hIHJlc29sdmVGdW5jdGlvbiBtw7psdGlwbGFzIHZlemVzIGNvbSBjaHVua3NcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQ2h1bmtSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgY2h1bmtSZXNwb25zZTogeyBjaHVuazogc3RyaW5nOyBzZXE6IG51bWJlcjsgbGFzdDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgY29uc3Qgc3ViamVjdCA9IHRoaXMucmVzcG9uc2VTdWJqZWN0cy5nZXQocmVxdWVzdElkKTtcbiAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5jaHVua191bmtub3duX2lkJywgeyBpZDogcmVxdWVzdElkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluaWNpYWxpemFyIGJ1ZmZlciBzZSBuw6NvIGV4aXN0aXJcbiAgICBsZXQgYnVmZmVyID0gdGhpcy5jaHVua0J1ZmZlcnMuZ2V0KHJlcXVlc3RJZCk7XG4gICAgaWYgKCFidWZmZXIpIHtcbiAgICAgIGJ1ZmZlciA9IHsgY2h1bmtzOiBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpIH07XG4gICAgICB0aGlzLmNodW5rQnVmZmVycy5zZXQocmVxdWVzdElkLCBidWZmZXIpO1xuICAgIH1cblxuICAgIC8vIEFybWF6ZW5hciBjaHVua1xuICAgIGJ1ZmZlci5jaHVua3Muc2V0KGNodW5rUmVzcG9uc2Uuc2VxLCBjaHVua1Jlc3BvbnNlLmNodW5rKTtcblxuICAgIGlmIChidWZmZXIuY2h1bmtzLnNpemUgPiB0aGlzLk1BWF9DSFVOS1MpIHtcbiAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKCdMaW1pdGUgZGUgY2h1bmtzIGV4Y2VkaWRvJykpO1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLmNodW5rX2xpbWl0X2V4Y2VlZGVkJywgeyBpZDogcmVxdWVzdElkIH0pO1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChyZXF1ZXN0SWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1hcmNhciBzZXF1w6puY2lhIGZpbmFsIHNlIGZvciBvIMO6bHRpbW8gY2h1bmtcbiAgICBpZiAoY2h1bmtSZXNwb25zZS5sYXN0KSB7XG4gICAgICBidWZmZXIubGFzdFNlcSA9IGNodW5rUmVzcG9uc2Uuc2VxO1xuICAgIH1cblxuICAgIC8vIFZlcmlmaWNhciBzZSB0b2RvcyBvcyBjaHVua3MgZm9yYW0gcmVjZWJpZG9zXG4gICAgaWYgKGJ1ZmZlci5sYXN0U2VxICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIERldGVjdGFyIHNlIMOpIDAtYmFzZWQgb3UgMS1iYXNlZFxuICAgICAgY29uc3QgaXNaZXJvQmFzZWQgPSBidWZmZXIuY2h1bmtzLmhhcygwKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2l6ZSA9IGlzWmVyb0Jhc2VkID8gYnVmZmVyLmxhc3RTZXEgKyAxIDogYnVmZmVyLmxhc3RTZXE7XG5cbiAgICAgIC8vIEFndWFyZGFyIHRvZG9zIG9zIGNodW5rc1xuICAgICAgaWYgKGJ1ZmZlci5jaHVua3Muc2l6ZSAhPT0gZXhwZWN0ZWRTaXplKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVG9kb3Mgb3MgY2h1bmtzIHJlY2ViaWRvcyAtIG1vbnRhciByZXNwb3N0YSBmaW5hbFxuICAgICAgY29uc3QgY2h1bmtzT3JkZXJlZCA9IEFycmF5LmZyb20oYnVmZmVyLmNodW5rcy5lbnRyaWVzKCkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhWzBdIC0gYlswXSlcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5WzFdKVxuICAgICAgICAuam9pbignJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2h1bmtzT3JkZXJlZCk7XG4gICAgICAgIHN1YmplY3QubmV4dChwYXJzZWQpO1xuICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKHRoaXMuVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCwgeyBpZDogcmVxdWVzdElkIH0pO1xuICAgICAgICBzdWJqZWN0LmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIGNodW5rZWQgcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHJlcXVlc3QgdHJhY2tpbmdcbiAgICovXG4gIHByaXZhdGUgY2xlYW51cFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgdGhpcy5yZXF1ZXN0T3JkZXIgPSB0aGlzLnJlcXVlc3RPcmRlci5maWx0ZXIoaWQgPT4gaWQgIT09IHJlcXVlc3RJZCk7XG4gICAgdGhpcy5jaHVua0J1ZmZlcnMuZGVsZXRlKHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5yZXF1ZXN0VGltZW91dHMuZ2V0KHJlcXVlc3RJZCk7XG4gICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzLmRlbGV0ZShyZXF1ZXN0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29ubmVjdGlvbiBzdGF0dXMgYXMgb2JzZXJ2YWJsZVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvblN0YXR1cygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uU3RhdHVzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIENFRiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlXG4gICAqL1xuICBpc0NlZkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uU3RhdHVzLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgcGVuZGluZyByZXF1ZXN0cyAoY2FsbCBvbiBjb21wb25lbnQgZGVzdHJveSlcbiAgICovXG4gIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNwb25zZVN1YmplY3RzLmZvckVhY2goKHN1YmplY3QpID0+IHtcbiAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKCdTZXJ2aWNlIGNsZWFudXAgLSByZXF1ZXN0IGNhbmNlbGxlZCcpKTtcbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlc3BvbnNlU3ViamVjdHMuY2xlYXIoKTtcblxuICAgIC8vIENsZWFyIGFsbCB0aW1lb3V0c1xuICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzLmZvckVhY2godGltZW91dCA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpO1xuICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzLmNsZWFyKCk7XG5cbiAgICAvLyBDbGVhciBwZW5kaW5nIHJldHJpZXNcbiAgICB0aGlzLnJldHJ5VGltZW91dHMuZm9yRWFjaCh0aW1lb3V0ID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KSk7XG4gICAgdGhpcy5yZXRyeVRpbWVvdXRzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRlYnVnIGluZm8gYWJvdXQgcGVuZGluZyByZXF1ZXN0c1xuICAgKi9cbiAgZ2V0RGVidWdJbmZvKCk6IHsgcGVuZGluZ1JlcXVlc3RzOiBudW1iZXI7IGFjdGl2ZVRpbWVvdXRzOiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0czogdGhpcy5yZXNwb25zZVN1YmplY3RzLnNpemUsXG4gICAgICBhY3RpdmVUaW1lb3V0czogdGhpcy5yZXF1ZXN0VGltZW91dHMuc2l6ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhIGxvY2FsaXplZCBlcnJvciB0b2FzdCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHNob3dFcnJvcihrZXk6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPik6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5zdW1tYXJ5JyksXG4gICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShrZXksIHBhcmFtcylcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -152,6 +152,7 @@ class XtBridgeService {
152
152
  this.MAX_CHUNKS = 1000;
153
153
  this.DEFAULT_MAX_RETRIES = 3;
154
154
  this.DEFAULT_RETRY_DELAY = 10000;
155
+ this.DEFAULT_NO_WAIT = false;
155
156
  this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID = 'hcm.hcmxt_bridge_lib.toast.error.response_process_failed_with_id';
156
157
  this.retryTimeouts = new Map();
157
158
  this.initializeCefCommunication();
@@ -303,6 +304,7 @@ class XtBridgeService {
303
304
  chunkSize: bridgeConfig?.chunkSize ?? this.DEFAULT_CHUNK_SIZE,
304
305
  maxRetries: bridgeConfig?.maxRetries ?? this.DEFAULT_MAX_RETRIES,
305
306
  retryDelay: bridgeConfig?.retryDelay ?? this.DEFAULT_RETRY_DELAY,
307
+ noWait: bridgeConfig?.noWait ?? this.DEFAULT_NO_WAIT
306
308
  };
307
309
  const retryKey = this.generateRequestId();
308
310
  return new Observable((subscriber) => {
@@ -325,7 +327,7 @@ class XtBridgeService {
325
327
  }
326
328
  const requestId = this.generateRequestId();
327
329
  state.currentRequestId = requestId;
328
- state.currentInnerSub = this.executeAttempt(requestId, context.action, context.payload, context.config.functionName, context.config.timeout, context.config.chunkSize).subscribe({
330
+ state.currentInnerSub = this.executeAttempt(requestId, context.action, context.payload, context.config.functionName, context.config.timeout, context.config.chunkSize, context.config.noWait).subscribe({
329
331
  next: (data) => this.handleAttemptSuccess(data, subscriber, retryKey),
330
332
  error: (error) => this.handleAttemptError(error, attemptNumber, state, retryKey, subscriber, context),
331
333
  });
@@ -372,11 +374,29 @@ class XtBridgeService {
372
374
  /**
373
375
  * Execute a single attempt of the request
374
376
  */
375
- executeAttempt(requestId, action, payload, functionName, timeout, chunkSize) {
377
+ /**
378
+ * Execute a single attempt of the request
379
+ * @param requestId Unique request ID
380
+ * @param action Action name
381
+ * @param payload Payload data
382
+ * @param functionName Backend function name
383
+ * @param timeout Timeout in ms
384
+ * @param chunkSize Chunk size in bytes
385
+ * @param noWait If true, do not wait for a response (fire and forget)
386
+ */
387
+ executeAttempt(requestId, action, payload, functionName, timeout, chunkSize, noWait) {
376
388
  // Create subject for this specific request
377
389
  const responseSubject = new Subject();
378
390
  this.responseSubjects.set(requestId, responseSubject);
379
391
  this.requestOrder.push(requestId);
392
+ if (noWait) {
393
+ // Fire and forget: send request via invokeNative with XtBridgeRequest format, do not track response or timeout
394
+ this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);
395
+ // Return an observable that completes immediately
396
+ return new Observable((subscriber) => {
397
+ subscriber.complete();
398
+ });
399
+ }
380
400
  // Set up timeout to prevent hanging requests
381
401
  const setupTimeout = setTimeout(() => {
382
402
  const subject = this.responseSubjects.get(requestId);
@@ -387,6 +407,21 @@ class XtBridgeService {
387
407
  }, timeout);
388
408
  this.requestTimeouts.set(requestId, setupTimeout);
389
409
  // Send request via invokeNative with XtBridgeRequest format
410
+ this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);
411
+ // Return observable that completes after first response
412
+ return responseSubject.asObservable().pipe(take(1));
413
+ }
414
+ /**
415
+ * Send a request using invokeNative
416
+ * @param requestId Unique request ID
417
+ * @param action Action name
418
+ * @param payload Payload data
419
+ * @param functionName Backend function name
420
+ * @param timeout Timeout in ms
421
+ * @param chunkSize Chunk size in bytes
422
+ * @param responseSubject Subject to emit response or error to
423
+ */
424
+ sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject) {
390
425
  if (globalThis.invokeNative) {
391
426
  try {
392
427
  const request = JSON.stringify({
@@ -412,8 +447,6 @@ class XtBridgeService {
412
447
  responseSubject.error(error);
413
448
  this.cleanupRequest(requestId);
414
449
  }
415
- // Return observable that completes after first response
416
- return responseSubject.asObservable().pipe(take(1));
417
450
  }
418
451
  /**
419
452
  * Handle response from CEF - Thread-safe, prevents response mixing
@@ -1 +1 @@
1
- {"version":3,"file":"senior-gestao-pessoas-hcmxt-bridge-lib.mjs","sources":["../../lib/src/lib/services/translation.service.ts","../../lib/src/lib/services/xt-bridge.service.ts","../../lib/src/public-api.ts","../../lib/src/senior-gestao-pessoas-hcmxt-bridge-lib.ts"],"sourcesContent":["import { Injectable, LOCALE_ID, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nimport ptBR from '../locale/pt-BR.json';\nimport enUS from '../locale/en-US.json';\nimport esES from '../locale/es-ES.json';\n\nexport type SupportedLocale = 'pt-BR' | 'en-US' | 'es-ES';\n\nexport type TranslationDictionary = Readonly<Record<string, string>>;\n\nexport const DEFAULT_LOCALE: SupportedLocale = 'pt-BR';\n\nconst BUILT_IN_TRANSLATIONS: Readonly<Record<SupportedLocale, TranslationDictionary>> = {\n 'pt-BR': ptBR as TranslationDictionary,\n 'en-US': enUS as TranslationDictionary,\n 'es-ES': esES as TranslationDictionary,\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TranslationService {\n\n private readonly translations = new Map<SupportedLocale, TranslationDictionary>(\n Object.entries(BUILT_IN_TRANSLATIONS) as [SupportedLocale, TranslationDictionary][]\n );\n\n private readonly localeSubject: BehaviorSubject<SupportedLocale>;\n\n constructor() {\n const angularLocale = inject(LOCALE_ID, { optional: true }) as string | null;\n this.localeSubject = new BehaviorSubject<SupportedLocale>(this.resolveLocale(angularLocale));\n }\n\n /**\n * Get the currently active locale.\n */\n getLocale(): SupportedLocale {\n return this.localeSubject.value;\n }\n\n /**\n * Change the active locale. Falls back to the default if unsupported.\n */\n setLocale(locale: string | null | undefined): void {\n this.localeSubject.next(this.resolveLocale(locale));\n }\n\n /**\n * Register or override translations for a given locale.\n * Useful for consumers that want to customize the built-in messages.\n */\n registerTranslations(locale: SupportedLocale, dictionary: TranslationDictionary): void {\n const existing = this.translations.get(locale) ?? {};\n this.translations.set(locale, { ...existing, ...dictionary });\n }\n\n /**\n * Translate a key using the active locale, with optional placeholder interpolation.\n * Placeholders use {name} syntax. If the key is not found, the key itself is returned.\n */\n translate(key: string, params?: Record<string, string | number>): string {\n const dict = this.translations.get(this.localeSubject.value)\n ?? this.translations.get(DEFAULT_LOCALE)\n ?? {};\n\n const template = Object.hasOwn(dict, key)\n ? dict[key]\n : (this.translations.get(DEFAULT_LOCALE)?.[key] ?? key);\n\n return this.interpolate(template, params);\n }\n\n private interpolate(template: string, params?: Record<string, string | number>): string {\n if (!params) {\n return template;\n }\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => {\n return Object.hasOwn(params, name)\n ? String(params[name])\n : match;\n });\n }\n\n private resolveLocale(locale: string | null | undefined): SupportedLocale {\n if (!locale) {\n return DEFAULT_LOCALE;\n }\n\n const normalized = locale.replace('_', '-');\n\n if (this.isSupported(normalized)) {\n return normalized;\n }\n\n const lang = normalized.split('-')[0].toLowerCase();\n switch (lang) {\n case 'pt':\n return 'pt-BR';\n case 'en':\n return 'en-US';\n case 'es':\n return 'es-ES';\n default:\n return DEFAULT_LOCALE;\n }\n }\n\n private isSupported(locale: string): locale is SupportedLocale {\n return this.translations.has(locale as SupportedLocale);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { MessageService } from 'primeng/api';\nimport { TranslationService } from './translation.service';\n\nexport interface XtBridgeRequest {\n id: string;\n action: string;\n payload?: any;\n timestamp: number;\n}\n\nexport interface XtBridgeResponse {\n id: string;\n success: boolean;\n data?: any;\n error?: string;\n timestamp: number;\n}\n\nexport interface BridgeConfig {\n // Nome da função no Back-End (default: \"XtBridgeRequest\")\n functionName?: string;\n\n // Timeout para requisições em ms (default: 30000)\n requestTimeout?: number;\n\n // Tamanho de chunk para dados grandes em bytes (default: 64KB)\n chunkSize?: number;\n\n // Número máximo de tentativas em caso de falha (default: 3)\n maxRetries?: number;\n\n // Delay entre tentativas em ms (default: 10000)\n retryDelay?: number;\n}\n\ninterface ResolvedBridgeConfig {\n functionName: string;\n timeout: number;\n chunkSize: number;\n maxRetries: number;\n retryDelay: number;\n}\n\ninterface AttemptState {\n aborted: boolean;\n currentInnerSub: { unsubscribe: () => void } | null;\n currentRequestId: string | null;\n}\n\ninterface AttemptContext {\n action: string;\n payload: any;\n config: ResolvedBridgeConfig;\n}\n\ndeclare global {\n interface Window {\n // CEF injected functions\n cefSendToServer?: (requestData: string) => void;\n // Angular callback functions\n handleCefResponse?: (responseData: string) => void;\n // Native invoke function for Xt emulator\n invokeNative?: (type: number, payload: string) => void;\n // App component callbacks - called by server with request ID\n resolveFunction?: (id: string, data: any) => void;\n rejectFunction?: (id: string, error: any) => void;\n }\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class XtBridgeService {\n\n private readonly responseSubjects = new Map<string, Subject<any>>();\n private readonly requestTimeouts = new Map<string, any>();\n private readonly connectionStatus = new BehaviorSubject<boolean>(false);\n private requestOrder: string[] = [];\n private readonly chunkBuffers = new Map<string, { chunks: Map<number, string>; lastSeq?: number }>();\n private readonly messageService = inject(MessageService);\n private readonly translationService = inject(TranslationService);\n private readonly DEFAULT_XT_BRIDGE_REQUEST_FUNCTION_NAME = \"XtBridgeRequest\";\n private readonly DEFAULT_REQUEST_TIME_OUT = 30000;\n private readonly DEFAULT_CHUNK_SIZE = 64 * 1024; // Default 64KB\n private readonly MAX_CHUNKS = 1000;\n private readonly DEFAULT_MAX_RETRIES = 3;\n private readonly DEFAULT_RETRY_DELAY = 10000;\n private readonly TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID = 'hcm.hcmxt_bridge_lib.toast.error.response_process_failed_with_id';\n private readonly retryTimeouts = new Map<string, any>();\n\n constructor() {\n this.initializeCefCommunication();\n this.checkCefAvailability();\n // Registrar callbacks globais para o servidor chamar\n this.registerGlobalCallbacks();\n }\n /**\n * Register global callbacks that the server will invoke\n * Servidor chama document.app.g5.resolveFunction(id, data) ou document.app.g5.rejectFunction(id, error)\n */\n private registerGlobalCallbacks(): void {\n // Criar estrutura document.app.g5 se não existir\n if (!(document as any).app) {\n (document as any).app = {};\n }\n if (!(document as any).app.g5) {\n (document as any).app.g5 = {};\n }\n\n // Salvar referências originais se existirem (do AppComponent)\n const originalResolve = (document as any).app.g5.resolveFunction;\n const originalReject = (document as any).app.g5.rejectFunction;\n\n // Definir nova resolveFunction\n (document as any).app.g5.resolveFunction = (id: string, data: any) => {\n // Chamar original do AppComponent se existir\n if (originalResolve && typeof originalResolve === 'function') {\n try {\n originalResolve.call(globalThis, id, data);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.callback_failed');\n }\n }\n\n // Processar via XtBridgeService\n this.handleServerCallback(id, data, false);\n };\n\n // Definir nova rejectFunction\n (document as any).app.g5.rejectFunction = (id: string, error: any) => {\n // Chamar original do AppComponent se existir\n if (originalReject && typeof originalReject === 'function') {\n try {\n originalReject.call(globalThis, id, error);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.callback_failed');\n }\n }\n\n // Processar via XtBridgeService\n this.handleServerCallback(id, error, true);\n };\n\n // Também registrar em window para compatibilidade\n (globalThis as any).resolveFunction = (document as any).app.g5.resolveFunction;\n (globalThis as any).rejectFunction = (document as any).app.g5.rejectFunction;\n }\n\n /**\n * Initialize CEF communication by setting up the global callback\n */\n private initializeCefCommunication(): void {\n // Set up global callback function that CEF will call (for direct responses)\n (globalThis as any).handleCefResponse = (responseData: string) => {\n try {\n const response: any = JSON.parse(responseData);\n this.handleResponse(response);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_parse_failed');\n }\n };\n }\n\n /**\n * Handle callback from server via resolveFunction/rejectFunction\n * Processa tanto respostas simples quanto chunked\n */\n private handleServerCallback(id: string, data: any, isError: boolean): void {\n const subject = this.responseSubjects.get(id);\n\n if (!subject) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n return;\n }\n\n try {\n let parsedData = data;\n\n // Parse JSON se for string\n if (typeof data === 'string') {\n try {\n parsedData = JSON.parse(data);\n } catch {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n parsedData = data;\n }\n }\n\n const hasParsedDataObject = parsedData && typeof parsedData === 'object';\n // Verificar se é resposta chunked { chunk, seq, last }\n if (hasParsedDataObject && parsedData.chunk && parsedData.seq !== undefined && parsedData.last !== undefined) {\n this.handleChunkResponse(id, parsedData);\n return;\n }\n\n // Resposta normal (não-chunked)\n if (isError) {\n const errorMsg = typeof data === 'string' ? data : JSON.stringify(data);\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n subject.error(new Error(errorMsg));\n } else {\n subject.next(parsedData);\n }\n\n subject.complete();\n this.cleanupRequest(id);\n } catch (error) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n subject.error(error);\n this.cleanupRequest(id);\n }\n }\n\n /**\n * Check if CEF functions are available\n */\n private checkCefAvailability(): void {\n const isAvailable = typeof (globalThis as any).cefSendToServer === 'function';\n this.connectionStatus.next(isAvailable);\n\n if (!isAvailable) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.cef_unavailable');\n }\n }\n\n /**\n * Generate unique ID for requests - guaranteed unique even with concurrent calls\n */\n private generateRequestId(): string {\n const timestamp = Date.now();\n const random = crypto.randomUUID().split('-').join('');\n const counter = this.responseSubjects.size; // Additional uniqueness\n return `req_${timestamp}_${random}_${counter}`;\n }\n\n /**\n * Send request to server via CEF - Thread-safe with timeout protection and retry resilience\n *\n * @param action Nome da ação/API a ser invocada no Back-End\n * @param locale Locale obrigatório para internacionalizar as mensagens de Toast (ex: 'pt-BR', 'en-US', 'es-ES').\n * Atualiza o locale ativo do TranslationService antes de enviar a requisição.\n * @param payload Dados a serem enviados ao Back-End\n * @param bridgeConfig Configurações opcionais da requisição\n */\n sendRequest<T = any>(action: string, locale: string, payload?: any, bridgeConfig?: BridgeConfig): Observable<T> {\n this.translationService.setLocale(locale);\n\n const resolvedConfig: ResolvedBridgeConfig = {\n functionName: bridgeConfig?.functionName ?? this.DEFAULT_XT_BRIDGE_REQUEST_FUNCTION_NAME,\n timeout: bridgeConfig?.requestTimeout ?? this.DEFAULT_REQUEST_TIME_OUT,\n chunkSize: bridgeConfig?.chunkSize ?? this.DEFAULT_CHUNK_SIZE,\n maxRetries: bridgeConfig?.maxRetries ?? this.DEFAULT_MAX_RETRIES,\n retryDelay: bridgeConfig?.retryDelay ?? this.DEFAULT_RETRY_DELAY,\n };\n\n const retryKey = this.generateRequestId();\n\n return new Observable<T>((subscriber) => {\n const state: AttemptState = {\n aborted: false,\n currentInnerSub: null,\n currentRequestId: null,\n };\n\n const context: AttemptContext = { action, payload, config: resolvedConfig };\n\n this.runAttempt<T>(0, state, retryKey, subscriber, context);\n\n return () => this.cancelSendRequest(state, retryKey);\n }).pipe(take(1));\n }\n\n /**\n * Run a single attempt and schedule retries on error\n */\n private runAttempt<T>(\n attemptNumber: number,\n state: AttemptState,\n retryKey: string,\n subscriber: { next: (v: T) => void; error: (e: any) => void; complete: () => void },\n context: AttemptContext\n ): void {\n if (state.aborted) {\n return;\n }\n\n const requestId = this.generateRequestId();\n state.currentRequestId = requestId;\n\n state.currentInnerSub = this.executeAttempt<T>(\n requestId,\n context.action,\n context.payload,\n context.config.functionName,\n context.config.timeout,\n context.config.chunkSize\n ).subscribe({\n next: (data) => this.handleAttemptSuccess<T>(data, subscriber, retryKey),\n error: (error) => this.handleAttemptError<T>(\n error, attemptNumber, state, retryKey, subscriber, context\n ),\n });\n }\n\n private handleAttemptSuccess<T>(\n data: T,\n subscriber: { next: (v: T) => void; complete: () => void },\n retryKey: string\n ): void {\n subscriber.next(data);\n subscriber.complete();\n this.retryTimeouts.delete(retryKey);\n }\n\n private handleAttemptError<T>(\n error: any,\n attemptNumber: number,\n state: AttemptState,\n retryKey: string,\n subscriber: { next: (v: T) => void; error: (e: any) => void; complete: () => void },\n context: AttemptContext\n ): void {\n if (state.aborted) {\n return;\n }\n\n if (attemptNumber < context.config.maxRetries) {\n const retryTimeout = setTimeout(() => {\n this.retryTimeouts.delete(retryKey);\n this.runAttempt<T>(attemptNumber + 1, state, retryKey, subscriber, context);\n }, context.config.retryDelay);\n this.retryTimeouts.set(retryKey, retryTimeout);\n return;\n }\n\n this.showError('hcm.hcmxt_bridge_lib.toast.error.communication_failed_after_retries', {\n attempts: context.config.maxRetries + 1\n });\n subscriber.error(error);\n }\n\n private cancelSendRequest(state: AttemptState, retryKey: string): void {\n state.aborted = true;\n\n // Cancelar retry agendado\n const pendingRetry = this.retryTimeouts.get(retryKey);\n if (pendingRetry) {\n clearTimeout(pendingRetry);\n this.retryTimeouts.delete(retryKey);\n }\n\n // Cancelar tentativa em andamento\n if (state.currentInnerSub) {\n state.currentInnerSub.unsubscribe();\n }\n\n // Limpar requisição pendente no servidor\n if (state.currentRequestId) {\n this.cleanupRequest(state.currentRequestId);\n }\n }\n\n /**\n * Execute a single attempt of the request\n */\n private executeAttempt<T>(\n requestId: string,\n action: string,\n payload: any,\n functionName: string,\n timeout: number,\n chunkSize: number\n ): Observable<T> {\n // Create subject for this specific request\n const responseSubject = new Subject<any>();\n this.responseSubjects.set(requestId, responseSubject);\n this.requestOrder.push(requestId);\n\n // Set up timeout to prevent hanging requests\n const setupTimeout = setTimeout(() => {\n const subject = this.responseSubjects.get(requestId);\n if (subject) {\n subject.error(new Error(`Request ${requestId} timed out after ${timeout}ms`));\n this.cleanupRequest(requestId);\n }\n }, timeout);\n\n this.requestTimeouts.set(requestId, setupTimeout);\n\n // Send request via invokeNative with XtBridgeRequest format\n if ((globalThis as any).invokeNative) {\n try {\n const request = JSON.stringify({\n \"id\": requestId,\n \"parameters\": [\n { \"parametro\": action },\n { \"parametro\": payload ? JSON.stringify(payload || {}) : \"\" }\n ],\n functionName,\n chunkSize\n });\n\n (globalThis as any).invokeNative(0, `###${request}`);\n } catch (error) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.request_send_failed');\n responseSubject.error(error);\n this.cleanupRequest(requestId);\n }\n } else {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.request_send_failed');\n const error = new Error('CEF communication not available');\n responseSubject.error(error);\n this.cleanupRequest(requestId);\n }\n\n // Return observable that completes after first response\n return responseSubject.asObservable().pipe(\n take(1)\n ) as Observable<T>;\n }\n\n /**\n * Handle response from CEF - Thread-safe, prevents response mixing\n */\n private handleResponse(response: XtBridgeResponse): void {\n if (!response) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.invalid_response');\n return;\n }\n\n const anyResponse: any = response as any;\n\n // Suporte a chunked response (ex: { id?, chunk, seq, last })\n if (anyResponse.chunk) {\n const resolvedId = anyResponse.id || this.requestOrder.at(-1);\n if (!resolvedId) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.invalid_response');\n return;\n }\n\n this.handleChunkResponse(resolvedId, anyResponse);\n return;\n }\n\n if (!response.id) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_missing_id');\n return;\n }\n\n const subject = this.responseSubjects.get(response.id);\n\n this.handleSubject(subject, response);\n }\n\n private handleSubject(subject: Subject<any> | undefined, response: XtBridgeResponse) {\n if (subject) {\n // Clear timeout for this request\n const timeout = this.requestTimeouts.get(response.id);\n if (timeout) {\n clearTimeout(timeout);\n this.requestTimeouts.delete(response.id);\n }\n\n // Response matched to correct request ID - safe to process\n if (response.success) {\n subject.next(response.data);\n } else {\n subject.error(new Error(response.error ?? 'Server error'));\n }\n subject.complete();\n this.responseSubjects.delete(response.id);\n this.requestOrder = this.requestOrder.filter(id => id !== response.id);\n } else {\n // No matching request ID - could be late/duplicate response\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_unknown_id', { id: response.id });\n }\n }\n\n /**\n * Handle chunked response from server callback\n * Backend chama resolveFunction múltiplas vezes com chunks\n */\n private handleChunkResponse(requestId: string, chunkResponse: { chunk: string; seq: number; last: boolean }): void {\n const subject = this.responseSubjects.get(requestId);\n if (!subject) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.chunk_unknown_id', { id: requestId });\n return;\n }\n\n // Inicializar buffer se não existir\n let buffer = this.chunkBuffers.get(requestId);\n if (!buffer) {\n buffer = { chunks: new Map<number, string>() };\n this.chunkBuffers.set(requestId, buffer);\n }\n\n // Armazenar chunk\n buffer.chunks.set(chunkResponse.seq, chunkResponse.chunk);\n\n if (buffer.chunks.size > this.MAX_CHUNKS) {\n subject.error(new Error('Limite de chunks excedido'));\n this.showError('hcm.hcmxt_bridge_lib.toast.error.chunk_limit_exceeded', { id: requestId });\n this.cleanupRequest(requestId);\n return;\n }\n\n // Marcar sequência final se for o último chunk\n if (chunkResponse.last) {\n buffer.lastSeq = chunkResponse.seq;\n }\n\n // Verificar se todos os chunks foram recebidos\n if (buffer.lastSeq !== undefined) {\n // Detectar se é 0-based ou 1-based\n const isZeroBased = buffer.chunks.has(0);\n const expectedSize = isZeroBased ? buffer.lastSeq + 1 : buffer.lastSeq;\n\n // Aguardar todos os chunks\n if (buffer.chunks.size !== expectedSize) {\n return;\n }\n\n // Todos os chunks recebidos - montar resposta final\n const chunksOrdered = Array.from(buffer.chunks.entries())\n .sort((a, b) => a[0] - b[0])\n .map((entry) => entry[1])\n .join('');\n\n try {\n const parsed = JSON.parse(chunksOrdered);\n subject.next(parsed);\n subject.complete();\n this.cleanupRequest(requestId);\n } catch (error) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id: requestId });\n subject.error(new Error(`Failed to parse chunked response: ${error}`));\n this.cleanupRequest(requestId);\n }\n }\n }\n\n /**\n * Clean up request tracking\n */\n private cleanupRequest(requestId: string): void {\n this.responseSubjects.delete(requestId);\n this.requestOrder = this.requestOrder.filter(id => id !== requestId);\n this.chunkBuffers.delete(requestId);\n\n const timeout = this.requestTimeouts.get(requestId);\n if (timeout) {\n clearTimeout(timeout);\n this.requestTimeouts.delete(requestId);\n }\n }\n\n /**\n * Get connection status as observable\n */\n getConnectionStatus(): Observable<boolean> {\n return this.connectionStatus.asObservable();\n }\n\n /**\n * Check if CEF is currently available\n */\n isCefAvailable(): boolean {\n return this.connectionStatus.value;\n }\n\n /**\n * Cleanup pending requests (call on component destroy)\n */\n cleanup(): void {\n this.responseSubjects.forEach((subject) => {\n subject.error(new Error('Service cleanup - request cancelled'));\n subject.complete();\n });\n this.responseSubjects.clear();\n\n // Clear all timeouts\n this.requestTimeouts.forEach(timeout => clearTimeout(timeout));\n this.requestTimeouts.clear();\n\n // Clear pending retries\n this.retryTimeouts.forEach(timeout => clearTimeout(timeout));\n this.retryTimeouts.clear();\n }\n\n /**\n * Get debug info about pending requests\n */\n getDebugInfo(): { pendingRequests: number; activeTimeouts: number } {\n return {\n pendingRequests: this.responseSubjects.size,\n activeTimeouts: this.requestTimeouts.size\n };\n }\n\n /**\n * Display a localized error toast message\n */\n private showError(key: string, params?: Record<string, string | number>): void {\n this.messageService.add({\n severity: 'error',\n summary: this.translationService.translate('hcm.hcmxt_bridge_lib.toast.error.summary'),\n detail: this.translationService.translate(key, params)\n });\n }\n}\n","/*\n * Public API Surface of hcmxt-bridge-lib\n */\n\n// Services\nexport { XtBridgeService, XtBridgeRequest, XtBridgeResponse, BridgeConfig } from './lib/services/xt-bridge.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,MAAM,cAAc,GAAoB,OAAO,CAAC;AAEvD,MAAM,qBAAqB,GAA6D;AACtF,IAAA,OAAO,EAAE,IAA6B;AACtC,IAAA,OAAO,EAAE,IAA6B;AACtC,IAAA,OAAO,EAAE,IAA6B;CACvC,CAAC;MAKW,kBAAkB,CAAA;AAQ7B,IAAA,WAAA,GAAA;QANiB,IAAY,CAAA,YAAA,GAAG,IAAI,GAAG,CACrC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAA+C,CACpF,CAAC;AAKA,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAkB,CAAC;AAC7E,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,eAAe,CAAkB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;KAC9F;AAED;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;KACjC;AAED;;AAEG;AACH,IAAA,SAAS,CAAC,MAAiC,EAAA;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;KACrD;AAED;;;AAGG;IACH,oBAAoB,CAAC,MAAuB,EAAE,UAAiC,EAAA;AAC7E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;KAC/D;AAED;;;AAGG;IACH,SAAS,CAAC,GAAW,EAAE,MAAwC,EAAA;AAC7D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACvD,eAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC;AACrC,eAAA,EAAE,CAAC;QAER,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;AACvC,cAAE,IAAI,CAAC,GAAG,CAAC;AACX,eAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;KAC3C;IAEO,WAAW,CAAC,QAAgB,EAAE,MAAwC,EAAA;QAC5E,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,QAAQ,CAAC;AACjB,SAAA;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,IAAY,KAAI;AAC5D,YAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;AAChC,kBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;kBACpB,KAAK,CAAC;AACZ,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,aAAa,CAAC,MAAiC,EAAA;QACrD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,cAAc,CAAC;AACvB,SAAA;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE5C,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;AAChC,YAAA,OAAO,UAAU,CAAC;AACnB,SAAA;AAED,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACpD,QAAA,QAAQ,IAAI;AACV,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,OAAO,CAAC;AACjB,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,OAAO,CAAC;AACjB,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,OAAO,CAAC;AACjB,YAAA;AACE,gBAAA,OAAO,cAAc,CAAC;AACzB,SAAA;KACF;AAEO,IAAA,WAAW,CAAC,MAAc,EAAA;QAChC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAyB,CAAC,CAAC;KACzD;+GAzFU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCsDY,eAAe,CAAA;AAkB1B,IAAA,WAAA,GAAA;AAhBiB,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,GAAG,EAAwB,CAAC;AACnD,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,GAAG,EAAe,CAAC;AACzC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;QAChE,IAAY,CAAA,YAAA,GAAa,EAAE,CAAC;AACnB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,GAAG,EAA6D,CAAC;AACpF,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACxC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAChD,IAAuC,CAAA,uCAAA,GAAG,iBAAiB,CAAC;QAC5D,IAAwB,CAAA,wBAAA,GAAG,KAAK,CAAC;AACjC,QAAA,IAAA,CAAA,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;QAC/B,IAAU,CAAA,UAAA,GAAG,IAAI,CAAC;QAClB,IAAmB,CAAA,mBAAA,GAAG,CAAC,CAAC;QACxB,IAAmB,CAAA,mBAAA,GAAG,KAAK,CAAC;QAC5B,IAA2C,CAAA,2CAAA,GAAG,kEAAkE,CAAC;AACjH,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAe,CAAC;QAGtD,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;;QAE5B,IAAI,CAAC,uBAAuB,EAAE,CAAC;KAChC;AACD;;;AAGG;IACK,uBAAuB,GAAA;;AAE7B,QAAA,IAAI,CAAE,QAAgB,CAAC,GAAG,EAAE;AACzB,YAAA,QAAgB,CAAC,GAAG,GAAG,EAAE,CAAC;AAC5B,SAAA;AACD,QAAA,IAAI,CAAE,QAAgB,CAAC,GAAG,CAAC,EAAE,EAAE;AAC5B,YAAA,QAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;AAC/B,SAAA;;QAGD,MAAM,eAAe,GAAI,QAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC;QACjE,MAAM,cAAc,GAAI,QAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC;;AAG9D,QAAA,QAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,GAAG,CAAC,EAAU,EAAE,IAAS,KAAI;;AAEnE,YAAA,IAAI,eAAe,IAAI,OAAO,eAAe,KAAK,UAAU,EAAE;gBAC5D,IAAI;oBACF,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,iBAAA;gBAAC,MAAM;AACN,oBAAA,IAAI,CAAC,SAAS,CAAC,kDAAkD,CAAC,CAAC;AACpE,iBAAA;AACF,aAAA;;YAGD,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7C,SAAC,CAAC;;AAGD,QAAA,QAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,GAAG,CAAC,EAAU,EAAE,KAAU,KAAI;;AAEnE,YAAA,IAAI,cAAc,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE;gBAC1D,IAAI;oBACF,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5C,iBAAA;gBAAC,MAAM;AACN,oBAAA,IAAI,CAAC,SAAS,CAAC,kDAAkD,CAAC,CAAC;AACpE,iBAAA;AACF,aAAA;;YAGD,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC7C,SAAC,CAAC;;QAGD,UAAkB,CAAC,eAAe,GAAI,QAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC;QAC9E,UAAkB,CAAC,cAAc,GAAI,QAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC;KAC9E;AAED;;AAEG;IACK,0BAA0B,GAAA;;AAE/B,QAAA,UAAkB,CAAC,iBAAiB,GAAG,CAAC,YAAoB,KAAI;YAC/D,IAAI;gBACF,MAAM,QAAQ,GAAQ,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC/C,gBAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC/B,aAAA;YAAC,MAAM;AACN,gBAAA,IAAI,CAAC,SAAS,CAAC,wDAAwD,CAAC,CAAC;AAC1E,aAAA;AACH,SAAC,CAAC;KACH;AAED;;;AAGG;AACK,IAAA,oBAAoB,CAAC,EAAU,EAAE,IAAS,EAAE,OAAgB,EAAA;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACzE,OAAO;AACR,SAAA;QAED,IAAI;YACF,IAAI,UAAU,GAAG,IAAI,CAAC;;AAGtB,YAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAC5B,IAAI;AACF,oBAAA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC/B,iBAAA;gBAAC,MAAM;oBACN,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;oBACzE,UAAU,GAAG,IAAI,CAAC;AACnB,iBAAA;AACF,aAAA;YAED,MAAM,mBAAmB,GAAG,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,CAAC;;AAEzE,YAAA,IAAI,mBAAmB,IAAI,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE;AAC5G,gBAAA,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;gBACzC,OAAO;AACR,aAAA;;AAGD,YAAA,IAAI,OAAO,EAAE;AACX,gBAAA,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACxE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzE,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpC,aAAA;AAAM,iBAAA;AACL,gBAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC1B,aAAA;YAED,OAAO,CAAC,QAAQ,EAAE,CAAC;AACnB,YAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AACzB,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACzE,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrB,YAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AACzB,SAAA;KACF;AAED;;AAEG;IACK,oBAAoB,GAAA;QAC1B,MAAM,WAAW,GAAG,OAAQ,UAAkB,CAAC,eAAe,KAAK,UAAU,CAAC;AAC9E,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExC,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,kDAAkD,CAAC,CAAC;AACpE,SAAA;KACF;AAED;;AAEG;IACK,iBAAiB,GAAA;AACvB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC7B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC3C,QAAA,OAAO,OAAO,SAAS,CAAA,CAAA,EAAI,MAAM,CAAI,CAAA,EAAA,OAAO,EAAE,CAAC;KAChD;AAED;;;;;;;;AAQG;AACH,IAAA,WAAW,CAAU,MAAc,EAAE,MAAc,EAAE,OAAa,EAAE,YAA2B,EAAA;AAC7F,QAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAE1C,QAAA,MAAM,cAAc,GAAyB;AAC3C,YAAA,YAAY,EAAE,YAAY,EAAE,YAAY,IAAI,IAAI,CAAC,uCAAuC;AACxF,YAAA,OAAO,EAAE,YAAY,EAAE,cAAc,IAAI,IAAI,CAAC,wBAAwB;AACtE,YAAA,SAAS,EAAE,YAAY,EAAE,SAAS,IAAI,IAAI,CAAC,kBAAkB;AAC7D,YAAA,UAAU,EAAE,YAAY,EAAE,UAAU,IAAI,IAAI,CAAC,mBAAmB;AAChE,YAAA,UAAU,EAAE,YAAY,EAAE,UAAU,IAAI,IAAI,CAAC,mBAAmB;SACjE,CAAC;AAEF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAE1C,QAAA,OAAO,IAAI,UAAU,CAAI,CAAC,UAAU,KAAI;AACtC,YAAA,MAAM,KAAK,GAAiB;AAC1B,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,eAAe,EAAE,IAAI;AACrB,gBAAA,gBAAgB,EAAE,IAAI;aACvB,CAAC;YAEF,MAAM,OAAO,GAAmB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AAE5E,YAAA,IAAI,CAAC,UAAU,CAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAE5D,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SACtD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KAClB;AAED;;AAEG;IACK,UAAU,CAChB,aAAqB,EACrB,KAAmB,EACnB,QAAgB,EAChB,UAAmF,EACnF,OAAuB,EAAA;QAEvB,IAAI,KAAK,CAAC,OAAO,EAAE;YACjB,OAAO;AACR,SAAA;AAED,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3C,QAAA,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;AAEnC,QAAA,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CACzC,SAAS,EACT,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,MAAM,CAAC,YAAY,EAC3B,OAAO,CAAC,MAAM,CAAC,OAAO,EACtB,OAAO,CAAC,MAAM,CAAC,SAAS,CACzB,CAAC,SAAS,CAAC;AACV,YAAA,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,CAAI,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;YACxE,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,kBAAkB,CACvC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAC3D;AACF,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,oBAAoB,CAC1B,IAAO,EACP,UAA0D,EAC1D,QAAgB,EAAA;AAEhB,QAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,UAAU,CAAC,QAAQ,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;KACrC;IAEO,kBAAkB,CACxB,KAAU,EACV,aAAqB,EACrB,KAAmB,EACnB,QAAgB,EAChB,UAAmF,EACnF,OAAuB,EAAA;QAEvB,IAAI,KAAK,CAAC,OAAO,EAAE;YACjB,OAAO;AACR,SAAA;AAED,QAAA,IAAI,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE;AAC7C,YAAA,MAAM,YAAY,GAAG,UAAU,CAAC,MAAK;AACnC,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACpC,gBAAA,IAAI,CAAC,UAAU,CAAI,aAAa,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAC9E,aAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC/C,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,qEAAqE,EAAE;AACpF,YAAA,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC;AACxC,SAAA,CAAC,CAAC;AACH,QAAA,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KACzB;IAEO,iBAAiB,CAAC,KAAmB,EAAE,QAAgB,EAAA;AAC7D,QAAA,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;;QAGrB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACtD,QAAA,IAAI,YAAY,EAAE;YAChB,YAAY,CAAC,YAAY,CAAC,CAAC;AAC3B,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACrC,SAAA;;QAGD,IAAI,KAAK,CAAC,eAAe,EAAE;AACzB,YAAA,KAAK,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;AACrC,SAAA;;QAGD,IAAI,KAAK,CAAC,gBAAgB,EAAE;AAC1B,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAC7C,SAAA;KACF;AAED;;AAEG;IACK,cAAc,CACpB,SAAiB,EACjB,MAAc,EACd,OAAY,EACZ,YAAoB,EACpB,OAAe,EACf,SAAiB,EAAA;;AAGjB,QAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAO,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;AAGlC,QAAA,MAAM,YAAY,GAAG,UAAU,CAAC,MAAK;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACrD,YAAA,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAW,QAAA,EAAA,SAAS,CAAoB,iBAAA,EAAA,OAAO,CAAI,EAAA,CAAA,CAAC,CAAC,CAAC;AAC9E,gBAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;AAChC,aAAA;SACF,EAAE,OAAO,CAAC,CAAC;QAEZ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;;QAGlD,IAAK,UAAkB,CAAC,YAAY,EAAE;YACpC,IAAI;AACF,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;AAC7B,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,YAAY,EAAE;wBACZ,EAAE,WAAW,EAAE,MAAM,EAAE;AACvB,wBAAA,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;AAC9D,qBAAA;oBACD,YAAY;oBACZ,SAAS;AACV,iBAAA,CAAC,CAAC;gBAEF,UAAkB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAM,GAAA,EAAA,OAAO,CAAE,CAAA,CAAC,CAAC;AACtD,aAAA;AAAC,YAAA,OAAO,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,SAAS,CAAC,sDAAsD,CAAC,CAAC;AACvE,gBAAA,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,gBAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;AAChC,aAAA;AACF,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,sDAAsD,CAAC,CAAC;AACvE,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AAC3D,YAAA,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;AAChC,SAAA;;AAGD,QAAA,OAAO,eAAe,CAAC,YAAY,EAAE,CAAC,IAAI,CACxC,IAAI,CAAC,CAAC,CAAC,CACS,CAAC;KACpB;AAED;;AAEG;AACK,IAAA,cAAc,CAAC,QAA0B,EAAA;QAC/C,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,SAAS,CAAC,mDAAmD,CAAC,CAAC;YACpE,OAAO;AACR,SAAA;QAED,MAAM,WAAW,GAAQ,QAAe,CAAC;;QAGzC,IAAI,WAAW,CAAC,KAAK,EAAE;AACrB,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,IAAI,CAAC,SAAS,CAAC,mDAAmD,CAAC,CAAC;gBACpE,OAAO;AACR,aAAA;AAED,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAClD,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,sDAAsD,CAAC,CAAC;YACvE,OAAO;AACR,SAAA;AAED,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAEvD,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;KACvC;IAEO,aAAa,CAAC,OAAiC,EAAE,QAA0B,EAAA;AACjF,QAAA,IAAI,OAAO,EAAE;;AAEX,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtD,YAAA,IAAI,OAAO,EAAE;gBACX,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC1C,aAAA;;YAGD,IAAI,QAAQ,CAAC,OAAO,EAAE;AACpB,gBAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7B,aAAA;AAAM,iBAAA;AACL,gBAAA,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC;AAC5D,aAAA;YACD,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxE,SAAA;AAAM,aAAA;;AAEL,YAAA,IAAI,CAAC,SAAS,CAAC,sDAAsD,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7F,SAAA;KACF;AAED;;;AAGG;IACK,mBAAmB,CAAC,SAAiB,EAAE,aAA4D,EAAA;QACzG,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,SAAS,CAAC,mDAAmD,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACvF,OAAO;AACR,SAAA;;QAGD,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,GAAG,EAAE,MAAM,EAAE,IAAI,GAAG,EAAkB,EAAE,CAAC;YAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC1C,SAAA;;AAGD,QAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAE1D,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS,CAAC,uDAAuD,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3F,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO;AACR,SAAA;;QAGD,IAAI,aAAa,CAAC,IAAI,EAAE;AACtB,YAAA,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC;AACpC,SAAA;;AAGD,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE;;YAEhC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzC,YAAA,MAAM,YAAY,GAAG,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;;AAGvE,YAAA,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE;gBACvC,OAAO;AACR,aAAA;;AAGD,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACtD,iBAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3B,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC;iBACxB,IAAI,CAAC,EAAE,CAAC,CAAC;YAEZ,IAAI;gBACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACzC,gBAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,OAAO,CAAC,QAAQ,EAAE,CAAC;AACnB,gBAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;AAChC,aAAA;AAAC,YAAA,OAAO,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpF,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAA,kCAAA,EAAqC,KAAK,CAAA,CAAE,CAAC,CAAC,CAAC;AACvE,gBAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;AAChC,aAAA;AACF,SAAA;KACF;AAED;;AAEG;AACK,IAAA,cAAc,CAAC,SAAiB,EAAA;AACtC,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,SAAS,CAAC,CAAC;AACrE,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACpD,QAAA,IAAI,OAAO,EAAE;YACX,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACxC,SAAA;KACF;AAED;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;KAC7C;AAED;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;KACpC;AAED;;AAEG;IACH,OAAO,GAAA;QACL,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YACxC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,QAAQ,EAAE,CAAC;AACrB,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;;AAG9B,QAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;;AAG7B,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;KAC5B;AAED;;AAEG;IACH,YAAY,GAAA;QACV,OAAO;AACL,YAAA,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI;AAC3C,YAAA,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;SAC1C,CAAC;KACH;AAED;;AAEG;IACK,SAAS,CAAC,GAAW,EAAE,MAAwC,EAAA;AACrE,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,YAAA,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,0CAA0C,CAAC;YACtF,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;AACvD,SAAA,CAAC,CAAC;KACJ;+GAxhBU,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;AC1ED;;AAEG;AAEH;;ACJA;;AAEG;;;;"}
1
+ {"version":3,"file":"senior-gestao-pessoas-hcmxt-bridge-lib.mjs","sources":["../../lib/src/lib/services/translation.service.ts","../../lib/src/lib/services/xt-bridge.service.ts","../../lib/src/public-api.ts","../../lib/src/senior-gestao-pessoas-hcmxt-bridge-lib.ts"],"sourcesContent":["import { Injectable, LOCALE_ID, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nimport ptBR from '../locale/pt-BR.json';\nimport enUS from '../locale/en-US.json';\nimport esES from '../locale/es-ES.json';\n\nexport type SupportedLocale = 'pt-BR' | 'en-US' | 'es-ES';\n\nexport type TranslationDictionary = Readonly<Record<string, string>>;\n\nexport const DEFAULT_LOCALE: SupportedLocale = 'pt-BR';\n\nconst BUILT_IN_TRANSLATIONS: Readonly<Record<SupportedLocale, TranslationDictionary>> = {\n 'pt-BR': ptBR as TranslationDictionary,\n 'en-US': enUS as TranslationDictionary,\n 'es-ES': esES as TranslationDictionary,\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TranslationService {\n\n private readonly translations = new Map<SupportedLocale, TranslationDictionary>(\n Object.entries(BUILT_IN_TRANSLATIONS) as [SupportedLocale, TranslationDictionary][]\n );\n\n private readonly localeSubject: BehaviorSubject<SupportedLocale>;\n\n constructor() {\n const angularLocale = inject(LOCALE_ID, { optional: true }) as string | null;\n this.localeSubject = new BehaviorSubject<SupportedLocale>(this.resolveLocale(angularLocale));\n }\n\n /**\n * Get the currently active locale.\n */\n getLocale(): SupportedLocale {\n return this.localeSubject.value;\n }\n\n /**\n * Change the active locale. Falls back to the default if unsupported.\n */\n setLocale(locale: string | null | undefined): void {\n this.localeSubject.next(this.resolveLocale(locale));\n }\n\n /**\n * Register or override translations for a given locale.\n * Useful for consumers that want to customize the built-in messages.\n */\n registerTranslations(locale: SupportedLocale, dictionary: TranslationDictionary): void {\n const existing = this.translations.get(locale) ?? {};\n this.translations.set(locale, { ...existing, ...dictionary });\n }\n\n /**\n * Translate a key using the active locale, with optional placeholder interpolation.\n * Placeholders use {name} syntax. If the key is not found, the key itself is returned.\n */\n translate(key: string, params?: Record<string, string | number>): string {\n const dict = this.translations.get(this.localeSubject.value)\n ?? this.translations.get(DEFAULT_LOCALE)\n ?? {};\n\n const template = Object.hasOwn(dict, key)\n ? dict[key]\n : (this.translations.get(DEFAULT_LOCALE)?.[key] ?? key);\n\n return this.interpolate(template, params);\n }\n\n private interpolate(template: string, params?: Record<string, string | number>): string {\n if (!params) {\n return template;\n }\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => {\n return Object.hasOwn(params, name)\n ? String(params[name])\n : match;\n });\n }\n\n private resolveLocale(locale: string | null | undefined): SupportedLocale {\n if (!locale) {\n return DEFAULT_LOCALE;\n }\n\n const normalized = locale.replace('_', '-');\n\n if (this.isSupported(normalized)) {\n return normalized;\n }\n\n const lang = normalized.split('-')[0].toLowerCase();\n switch (lang) {\n case 'pt':\n return 'pt-BR';\n case 'en':\n return 'en-US';\n case 'es':\n return 'es-ES';\n default:\n return DEFAULT_LOCALE;\n }\n }\n\n private isSupported(locale: string): locale is SupportedLocale {\n return this.translations.has(locale as SupportedLocale);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { MessageService } from 'primeng/api';\nimport { TranslationService } from './translation.service';\n\nexport interface XtBridgeRequest {\n id: string;\n action: string;\n payload?: any;\n timestamp: number;\n}\n\nexport interface XtBridgeResponse {\n id: string;\n success: boolean;\n data?: any;\n error?: string;\n timestamp: number;\n}\n\nexport interface BridgeConfig {\n // Nome da função no Back-End (default: \"XtBridgeRequest\")\n functionName?: string;\n\n // Timeout para requisições em ms (default: 30000)\n requestTimeout?: number;\n\n // Tamanho de chunk para dados grandes em bytes (default: 64KB)\n chunkSize?: number;\n\n // Número máximo de tentativas em caso de falha (default: 3)\n maxRetries?: number;\n\n // Delay entre tentativas em ms (default: 10000)\n retryDelay?: number;\n\n // Se true, não aguarda resposta do Back-End (fire and forget)\n noWait?: boolean;\n}\n\ninterface ResolvedBridgeConfig {\n functionName: string;\n timeout: number;\n chunkSize: number;\n maxRetries: number;\n retryDelay: number;\n noWait: boolean;\n}\n\ninterface AttemptState {\n aborted: boolean;\n currentInnerSub: { unsubscribe: () => void } | null;\n currentRequestId: string | null;\n}\n\ninterface AttemptContext {\n action: string;\n payload: any;\n config: ResolvedBridgeConfig;\n}\n\ndeclare global {\n interface Window {\n // CEF injected functions\n cefSendToServer?: (requestData: string) => void;\n // Angular callback functions\n handleCefResponse?: (responseData: string) => void;\n // Native invoke function for Xt emulator\n invokeNative?: (type: number, payload: string) => void;\n // App component callbacks - called by server with request ID\n resolveFunction?: (id: string, data: any) => void;\n rejectFunction?: (id: string, error: any) => void;\n }\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class XtBridgeService {\n\n private readonly responseSubjects = new Map<string, Subject<any>>();\n private readonly requestTimeouts = new Map<string, any>();\n private readonly connectionStatus = new BehaviorSubject<boolean>(false);\n private requestOrder: string[] = [];\n private readonly chunkBuffers = new Map<string, { chunks: Map<number, string>; lastSeq?: number }>();\n private readonly messageService = inject(MessageService);\n private readonly translationService = inject(TranslationService);\n private readonly DEFAULT_XT_BRIDGE_REQUEST_FUNCTION_NAME = \"XtBridgeRequest\";\n private readonly DEFAULT_REQUEST_TIME_OUT = 30000;\n private readonly DEFAULT_CHUNK_SIZE = 64 * 1024; // Default 64KB\n private readonly MAX_CHUNKS = 1000;\n private readonly DEFAULT_MAX_RETRIES = 3;\n private readonly DEFAULT_RETRY_DELAY = 10000;\n private readonly DEFAULT_NO_WAIT = false;\n private readonly TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID = 'hcm.hcmxt_bridge_lib.toast.error.response_process_failed_with_id';\n private readonly retryTimeouts = new Map<string, any>();\n\n constructor() {\n this.initializeCefCommunication();\n this.checkCefAvailability();\n // Registrar callbacks globais para o servidor chamar\n this.registerGlobalCallbacks();\n }\n /**\n * Register global callbacks that the server will invoke\n * Servidor chama document.app.g5.resolveFunction(id, data) ou document.app.g5.rejectFunction(id, error)\n */\n private registerGlobalCallbacks(): void {\n // Criar estrutura document.app.g5 se não existir\n if (!(document as any).app) {\n (document as any).app = {};\n }\n if (!(document as any).app.g5) {\n (document as any).app.g5 = {};\n }\n\n // Salvar referências originais se existirem (do AppComponent)\n const originalResolve = (document as any).app.g5.resolveFunction;\n const originalReject = (document as any).app.g5.rejectFunction;\n\n // Definir nova resolveFunction\n (document as any).app.g5.resolveFunction = (id: string, data: any) => {\n // Chamar original do AppComponent se existir\n if (originalResolve && typeof originalResolve === 'function') {\n try {\n originalResolve.call(globalThis, id, data);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.callback_failed');\n }\n }\n\n // Processar via XtBridgeService\n this.handleServerCallback(id, data, false);\n };\n\n // Definir nova rejectFunction\n (document as any).app.g5.rejectFunction = (id: string, error: any) => {\n // Chamar original do AppComponent se existir\n if (originalReject && typeof originalReject === 'function') {\n try {\n originalReject.call(globalThis, id, error);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.callback_failed');\n }\n }\n\n // Processar via XtBridgeService\n this.handleServerCallback(id, error, true);\n };\n\n // Também registrar em window para compatibilidade\n (globalThis as any).resolveFunction = (document as any).app.g5.resolveFunction;\n (globalThis as any).rejectFunction = (document as any).app.g5.rejectFunction;\n }\n\n /**\n * Initialize CEF communication by setting up the global callback\n */\n private initializeCefCommunication(): void {\n // Set up global callback function that CEF will call (for direct responses)\n (globalThis as any).handleCefResponse = (responseData: string) => {\n try {\n const response: any = JSON.parse(responseData);\n this.handleResponse(response);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_parse_failed');\n }\n };\n }\n\n /**\n * Handle callback from server via resolveFunction/rejectFunction\n * Processa tanto respostas simples quanto chunked\n */\n private handleServerCallback(id: string, data: any, isError: boolean): void {\n const subject = this.responseSubjects.get(id);\n\n if (!subject) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n return;\n }\n\n try {\n let parsedData = data;\n\n // Parse JSON se for string\n if (typeof data === 'string') {\n try {\n parsedData = JSON.parse(data);\n } catch {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n parsedData = data;\n }\n }\n\n const hasParsedDataObject = parsedData && typeof parsedData === 'object';\n // Verificar se é resposta chunked { chunk, seq, last }\n if (hasParsedDataObject && parsedData.chunk && parsedData.seq !== undefined && parsedData.last !== undefined) {\n this.handleChunkResponse(id, parsedData);\n return;\n }\n\n // Resposta normal (não-chunked)\n if (isError) {\n const errorMsg = typeof data === 'string' ? data : JSON.stringify(data);\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n subject.error(new Error(errorMsg));\n } else {\n subject.next(parsedData);\n }\n\n subject.complete();\n this.cleanupRequest(id);\n } catch (error) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n subject.error(error);\n this.cleanupRequest(id);\n }\n }\n\n /**\n * Check if CEF functions are available\n */\n private checkCefAvailability(): void {\n const isAvailable = typeof (globalThis as any).cefSendToServer === 'function';\n this.connectionStatus.next(isAvailable);\n\n if (!isAvailable) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.cef_unavailable');\n }\n }\n\n /**\n * Generate unique ID for requests - guaranteed unique even with concurrent calls\n */\n private generateRequestId(): string {\n const timestamp = Date.now();\n const random = crypto.randomUUID().split('-').join('');\n const counter = this.responseSubjects.size; // Additional uniqueness\n return `req_${timestamp}_${random}_${counter}`;\n }\n\n /**\n * Send request to server via CEF - Thread-safe with timeout protection and retry resilience\n *\n * @param action Nome da ação/API a ser invocada no Back-End\n * @param locale Locale obrigatório para internacionalizar as mensagens de Toast (ex: 'pt-BR', 'en-US', 'es-ES').\n * Atualiza o locale ativo do TranslationService antes de enviar a requisição.\n * @param payload Dados a serem enviados ao Back-End\n * @param bridgeConfig Configurações opcionais da requisição\n */\n sendRequest<T = any>(action: string, locale: string, payload?: any, bridgeConfig?: BridgeConfig): Observable<T> {\n this.translationService.setLocale(locale);\n\n const resolvedConfig: ResolvedBridgeConfig = {\n functionName: bridgeConfig?.functionName ?? this.DEFAULT_XT_BRIDGE_REQUEST_FUNCTION_NAME,\n timeout: bridgeConfig?.requestTimeout ?? this.DEFAULT_REQUEST_TIME_OUT,\n chunkSize: bridgeConfig?.chunkSize ?? this.DEFAULT_CHUNK_SIZE,\n maxRetries: bridgeConfig?.maxRetries ?? this.DEFAULT_MAX_RETRIES,\n retryDelay: bridgeConfig?.retryDelay ?? this.DEFAULT_RETRY_DELAY,\n noWait: bridgeConfig?.noWait ?? this.DEFAULT_NO_WAIT\n };\n\n const retryKey = this.generateRequestId();\n\n return new Observable<T>((subscriber) => {\n const state: AttemptState = {\n aborted: false,\n currentInnerSub: null,\n currentRequestId: null,\n };\n\n const context: AttemptContext = { action, payload, config: resolvedConfig };\n\n this.runAttempt<T>(0, state, retryKey, subscriber, context);\n\n return () => this.cancelSendRequest(state, retryKey);\n }).pipe(take(1));\n }\n\n /**\n * Run a single attempt and schedule retries on error\n */\n private runAttempt<T>(\n attemptNumber: number,\n state: AttemptState,\n retryKey: string,\n subscriber: { next: (v: T) => void; error: (e: any) => void; complete: () => void },\n context: AttemptContext\n ): void {\n if (state.aborted) {\n return;\n }\n\n const requestId = this.generateRequestId();\n state.currentRequestId = requestId;\n\n state.currentInnerSub = this.executeAttempt<T>(\n requestId,\n context.action,\n context.payload,\n context.config.functionName,\n context.config.timeout,\n context.config.chunkSize,\n context.config.noWait\n ).subscribe({\n next: (data) => this.handleAttemptSuccess<T>(data, subscriber, retryKey),\n error: (error) => this.handleAttemptError<T>(\n error, attemptNumber, state, retryKey, subscriber, context\n ),\n });\n }\n\n private handleAttemptSuccess<T>(\n data: T,\n subscriber: { next: (v: T) => void; complete: () => void },\n retryKey: string\n ): void {\n subscriber.next(data);\n subscriber.complete();\n this.retryTimeouts.delete(retryKey);\n }\n\n private handleAttemptError<T>(\n error: any,\n attemptNumber: number,\n state: AttemptState,\n retryKey: string,\n subscriber: { next: (v: T) => void; error: (e: any) => void; complete: () => void },\n context: AttemptContext\n ): void {\n if (state.aborted) {\n return;\n }\n\n if (attemptNumber < context.config.maxRetries) {\n const retryTimeout = setTimeout(() => {\n this.retryTimeouts.delete(retryKey);\n this.runAttempt<T>(attemptNumber + 1, state, retryKey, subscriber, context);\n }, context.config.retryDelay);\n this.retryTimeouts.set(retryKey, retryTimeout);\n return;\n }\n\n this.showError('hcm.hcmxt_bridge_lib.toast.error.communication_failed_after_retries', {\n attempts: context.config.maxRetries + 1\n });\n subscriber.error(error);\n }\n\n private cancelSendRequest(state: AttemptState, retryKey: string): void {\n state.aborted = true;\n\n // Cancelar retry agendado\n const pendingRetry = this.retryTimeouts.get(retryKey);\n if (pendingRetry) {\n clearTimeout(pendingRetry);\n this.retryTimeouts.delete(retryKey);\n }\n\n // Cancelar tentativa em andamento\n if (state.currentInnerSub) {\n state.currentInnerSub.unsubscribe();\n }\n\n // Limpar requisição pendente no servidor\n if (state.currentRequestId) {\n this.cleanupRequest(state.currentRequestId);\n }\n }\n\n /**\n * Execute a single attempt of the request\n */\n /**\n * Execute a single attempt of the request\n * @param requestId Unique request ID\n * @param action Action name\n * @param payload Payload data\n * @param functionName Backend function name\n * @param timeout Timeout in ms\n * @param chunkSize Chunk size in bytes\n * @param noWait If true, do not wait for a response (fire and forget)\n */\n private executeAttempt<T>(\n requestId: string,\n action: string,\n payload: any,\n functionName: string,\n timeout: number,\n chunkSize: number,\n noWait: boolean\n ): Observable<T> {\n // Create subject for this specific request\n const responseSubject = new Subject<any>();\n this.responseSubjects.set(requestId, responseSubject);\n this.requestOrder.push(requestId);\n\n if (noWait) {\n // Fire and forget: send request via invokeNative with XtBridgeRequest format, do not track response or timeout\n this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);\n\n // Return an observable that completes immediately\n return new Observable<T>((subscriber) => {\n subscriber.complete();\n });\n }\n\n // Set up timeout to prevent hanging requests\n const setupTimeout = setTimeout(() => {\n const subject = this.responseSubjects.get(requestId);\n if (subject) {\n subject.error(new Error(`Request ${requestId} timed out after ${timeout}ms`));\n this.cleanupRequest(requestId);\n }\n }, timeout);\n\n this.requestTimeouts.set(requestId, setupTimeout);\n\n // Send request via invokeNative with XtBridgeRequest format\n this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);\n\n // Return observable that completes after first response\n return responseSubject.asObservable().pipe(\n take(1)\n ) as Observable<T>;\n }\n\n /**\n * Send a request using invokeNative\n * @param requestId Unique request ID\n * @param action Action name\n * @param payload Payload data\n * @param functionName Backend function name\n * @param timeout Timeout in ms\n * @param chunkSize Chunk size in bytes\n * @param responseSubject Subject to emit response or error to\n */\n private sendRequestInvokeNative(\n requestId: string,\n action: string,\n payload: any,\n functionName: string,\n chunkSize: number,\n responseSubject: Subject<any>) {\n if ((globalThis as any).invokeNative) {\n try {\n const request = JSON.stringify({\n \"id\": requestId,\n \"parameters\": [\n { \"parametro\": action },\n { \"parametro\": payload ? JSON.stringify(payload || {}) : \"\" }\n ],\n functionName,\n chunkSize\n });\n\n (globalThis as any).invokeNative(0, `###${request}`);\n } catch (error) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.request_send_failed');\n responseSubject.error(error);\n this.cleanupRequest(requestId);\n }\n } else {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.request_send_failed');\n const error = new Error('CEF communication not available');\n responseSubject.error(error);\n this.cleanupRequest(requestId);\n }\n }\n\n /**\n * Handle response from CEF - Thread-safe, prevents response mixing\n */\n private handleResponse(response: XtBridgeResponse): void {\n if (!response) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.invalid_response');\n return;\n }\n\n const anyResponse: any = response as any;\n\n // Suporte a chunked response (ex: { id?, chunk, seq, last })\n if (anyResponse.chunk) {\n const resolvedId = anyResponse.id || this.requestOrder.at(-1);\n if (!resolvedId) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.invalid_response');\n return;\n }\n\n this.handleChunkResponse(resolvedId, anyResponse);\n return;\n }\n\n if (!response.id) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_missing_id');\n return;\n }\n\n const subject = this.responseSubjects.get(response.id);\n\n this.handleSubject(subject, response);\n }\n\n private handleSubject(subject: Subject<any> | undefined, response: XtBridgeResponse) {\n if (subject) {\n // Clear timeout for this request\n const timeout = this.requestTimeouts.get(response.id);\n if (timeout) {\n clearTimeout(timeout);\n this.requestTimeouts.delete(response.id);\n }\n\n // Response matched to correct request ID - safe to process\n if (response.success) {\n subject.next(response.data);\n } else {\n subject.error(new Error(response.error ?? 'Server error'));\n }\n subject.complete();\n this.responseSubjects.delete(response.id);\n this.requestOrder = this.requestOrder.filter(id => id !== response.id);\n } else {\n // No matching request ID - could be late/duplicate response\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_unknown_id', { id: response.id });\n }\n }\n\n /**\n * Handle chunked response from server callback\n * Backend chama resolveFunction múltiplas vezes com chunks\n */\n private handleChunkResponse(requestId: string, chunkResponse: { chunk: string; seq: number; last: boolean }): void {\n const subject = this.responseSubjects.get(requestId);\n if (!subject) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.chunk_unknown_id', { id: requestId });\n return;\n }\n\n // Inicializar buffer se não existir\n let buffer = this.chunkBuffers.get(requestId);\n if (!buffer) {\n buffer = { chunks: new Map<number, string>() };\n this.chunkBuffers.set(requestId, buffer);\n }\n\n // Armazenar chunk\n buffer.chunks.set(chunkResponse.seq, chunkResponse.chunk);\n\n if (buffer.chunks.size > this.MAX_CHUNKS) {\n subject.error(new Error('Limite de chunks excedido'));\n this.showError('hcm.hcmxt_bridge_lib.toast.error.chunk_limit_exceeded', { id: requestId });\n this.cleanupRequest(requestId);\n return;\n }\n\n // Marcar sequência final se for o último chunk\n if (chunkResponse.last) {\n buffer.lastSeq = chunkResponse.seq;\n }\n\n // Verificar se todos os chunks foram recebidos\n if (buffer.lastSeq !== undefined) {\n // Detectar se é 0-based ou 1-based\n const isZeroBased = buffer.chunks.has(0);\n const expectedSize = isZeroBased ? buffer.lastSeq + 1 : buffer.lastSeq;\n\n // Aguardar todos os chunks\n if (buffer.chunks.size !== expectedSize) {\n return;\n }\n\n // Todos os chunks recebidos - montar resposta final\n const chunksOrdered = Array.from(buffer.chunks.entries())\n .sort((a, b) => a[0] - b[0])\n .map((entry) => entry[1])\n .join('');\n\n try {\n const parsed = JSON.parse(chunksOrdered);\n subject.next(parsed);\n subject.complete();\n this.cleanupRequest(requestId);\n } catch (error) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id: requestId });\n subject.error(new Error(`Failed to parse chunked response: ${error}`));\n this.cleanupRequest(requestId);\n }\n }\n }\n\n /**\n * Clean up request tracking\n */\n private cleanupRequest(requestId: string): void {\n this.responseSubjects.delete(requestId);\n this.requestOrder = this.requestOrder.filter(id => id !== requestId);\n this.chunkBuffers.delete(requestId);\n\n const timeout = this.requestTimeouts.get(requestId);\n if (timeout) {\n clearTimeout(timeout);\n this.requestTimeouts.delete(requestId);\n }\n }\n\n /**\n * Get connection status as observable\n */\n getConnectionStatus(): Observable<boolean> {\n return this.connectionStatus.asObservable();\n }\n\n /**\n * Check if CEF is currently available\n */\n isCefAvailable(): boolean {\n return this.connectionStatus.value;\n }\n\n /**\n * Cleanup pending requests (call on component destroy)\n */\n cleanup(): void {\n this.responseSubjects.forEach((subject) => {\n subject.error(new Error('Service cleanup - request cancelled'));\n subject.complete();\n });\n this.responseSubjects.clear();\n\n // Clear all timeouts\n this.requestTimeouts.forEach(timeout => clearTimeout(timeout));\n this.requestTimeouts.clear();\n\n // Clear pending retries\n this.retryTimeouts.forEach(timeout => clearTimeout(timeout));\n this.retryTimeouts.clear();\n }\n\n /**\n * Get debug info about pending requests\n */\n getDebugInfo(): { pendingRequests: number; activeTimeouts: number } {\n return {\n pendingRequests: this.responseSubjects.size,\n activeTimeouts: this.requestTimeouts.size\n };\n }\n\n /**\n * Display a localized error toast message\n */\n private showError(key: string, params?: Record<string, string | number>): void {\n this.messageService.add({\n severity: 'error',\n summary: this.translationService.translate('hcm.hcmxt_bridge_lib.toast.error.summary'),\n detail: this.translationService.translate(key, params)\n });\n }\n}\n","/*\n * Public API Surface of hcmxt-bridge-lib\n */\n\n// Services\nexport { XtBridgeService, XtBridgeRequest, XtBridgeResponse, BridgeConfig } from './lib/services/xt-bridge.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ export interface BridgeConfig {
19
19
  chunkSize?: number;
20
20
  maxRetries?: number;
21
21
  retryDelay?: number;
22
+ noWait?: boolean;
22
23
  }
23
24
  declare global {
24
25
  interface Window {
@@ -43,6 +44,7 @@ export declare class XtBridgeService {
43
44
  private readonly MAX_CHUNKS;
44
45
  private readonly DEFAULT_MAX_RETRIES;
45
46
  private readonly DEFAULT_RETRY_DELAY;
47
+ private readonly DEFAULT_NO_WAIT;
46
48
  private readonly TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID;
47
49
  private readonly retryTimeouts;
48
50
  constructor();
@@ -88,7 +90,28 @@ export declare class XtBridgeService {
88
90
  /**
89
91
  * Execute a single attempt of the request
90
92
  */
93
+ /**
94
+ * Execute a single attempt of the request
95
+ * @param requestId Unique request ID
96
+ * @param action Action name
97
+ * @param payload Payload data
98
+ * @param functionName Backend function name
99
+ * @param timeout Timeout in ms
100
+ * @param chunkSize Chunk size in bytes
101
+ * @param noWait If true, do not wait for a response (fire and forget)
102
+ */
91
103
  private executeAttempt;
104
+ /**
105
+ * Send a request using invokeNative
106
+ * @param requestId Unique request ID
107
+ * @param action Action name
108
+ * @param payload Payload data
109
+ * @param functionName Backend function name
110
+ * @param timeout Timeout in ms
111
+ * @param chunkSize Chunk size in bytes
112
+ * @param responseSubject Subject to emit response or error to
113
+ */
114
+ private sendRequestInvokeNative;
92
115
  /**
93
116
  * Handle response from CEF - Thread-safe, prevents response mixing
94
117
  */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "../node_modules/ng-packagr/package.schema.json",
3
3
  "name": "@senior-gestao-pessoas/hcmxt-bridge-lib",
4
- "version": "1.0.2",
4
+ "version": "1.0.3",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "http://git.senior.com.br/gestao-pessoas/hcmxt-bridge-lib"