UNPKG

ngx-pesapal

Version:

Angular schematics lib for abstracting Pesapal APIs

114 lines 18.8 kB
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { DestroyRef, Inject, Injectable, inject } from '@angular/core'; import { catchError, map, switchMap } from 'rxjs'; import { baseURL } from '../types'; import { PESAPAL_CONFIGS } from '../configs'; import { StoreService } from './store.service'; import { TokenService } from './token.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import * as i0 from "@angular/core"; export class ApiService { constructor(credentials) { this.credentials = credentials; this.http = inject(HttpClient); this.destroy = inject(DestroyRef); this.token = inject(TokenService); this.store = inject(StoreService); } submitOrderRequest(data) { return this.token.AuthenticateKeys().pipe(takeUntilDestroyed(this.destroy), switchMap((tokenResponse) => { const requestBody = { ...data, notification_id: this.credentials.ipn_id // Set the notification_id here }; const token = new HttpHeaders({ 'Authorization': `Bearer ${tokenResponse.token}` }); return this.http.post(`${baseURL}/api/Transactions/SubmitOrderRequest`, requestBody, { headers: token }); }), catchError((error) => { throw new Error(JSON.stringify(error)); }), map((response) => { this.store.submitOrderResponseBs.next(response); return response; })); } /** * Retrieves transaction status from the Pesapal API based on the provided tracking ID. * This method sends a GET request to the Pesapal API endpoint responsible for retrieving transaction status. * * @param trackingId - The unique identifier for tracking the transaction. * @returns An Observable that resolves to the transaction status response (ITransactionStatusResponse). * @publicApi */ getTransactionStatus(trackingId) { return this.token.AuthenticateKeys().pipe(takeUntilDestroyed(this.destroy), switchMap((tokenResponse) => { const token = new HttpHeaders({ 'Authorization': `Bearer ${tokenResponse.token}` }); return this.http.get(`${baseURL}/api/Transactions/GetTransactionStatus?orderTrackingId=${trackingId}`, { headers: token }); }), catchError((error) => { throw new Error(JSON.stringify(error)); }), map((response) => { this.store.transactionStatusResponseBs.next(response); return response; })); } /** * Submits an recurring order request to Pesapal for processing and handling payment transactions. * The method sends a POST request to the Pesapal API endpoint responsible for recurring order submissions. * Upon successful submission, the response data is stored in an Observable for further processing. * * @param data - A partial or complete object conforming to the IRecurringPaymentsRequest interface * @returns An Observable that resolves to the response of the order submission as IRecurringPaymentsResponse * @publicApi */ submitRecurringPayment(data) { return this.token.AuthenticateKeys().pipe(takeUntilDestroyed(this.destroy), switchMap((tokenResponse) => { const requestBody = { ...data, notification_id: this.credentials.ipn_id // Set the notification_id here }; const token = new HttpHeaders({ 'Authorization': `Bearer ${tokenResponse.token}` }); return this.http.post(`${baseURL}/api/Transactions/SubmitRecurringPayment`, requestBody, { headers: token }); }), catchError((error) => { throw new Error(JSON.stringify(error)); }), map((response) => { this.store.refundsResponseBs.next(response); return response; })); } /** * Submits a payment refund. * Upon successful submission, the response data is stored in an Observable for further processing. * * @param data - A partial or complete object conforming to the IRefundRequest interface * @returns An Observable that resolves to the response of the order submission as IRefundResponse * @publicApi */ requestRefund(data) { return this.token.AuthenticateKeys().pipe(takeUntilDestroyed(this.destroy), switchMap((tokenResponse) => { const token = new HttpHeaders({ 'Authorization': `Bearer ${tokenResponse.token}` }); return this.http.post(`${baseURL}/api/Transactions/RequestRefund`, data, { headers: token }); }), catchError((error) => { throw new Error(JSON.stringify(error)); }), map((response) => { return response; })); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ApiService, deps: [{ token: PESAPAL_CONFIGS }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ApiService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ApiService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [PESAPAL_CONFIGS] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wZXNhcGFsL3NyYy9saWIvc2VydmljZXMvYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBYyxVQUFVLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQ0wsT0FBTyxFQVVSLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFNaEUsTUFBTSxPQUFPLFVBQVU7SUFPckIsWUFDbUMsV0FBa0I7UUFBbEIsZ0JBQVcsR0FBWCxXQUFXLENBQU87UUFON0MsU0FBSSxHQUFlLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNyQyxZQUFPLEdBQWUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3hDLFVBQUssR0FBaUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzFDLFVBQUssR0FBaUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBSWhELENBQUM7SUFFSSxrQkFBa0IsQ0FBQyxJQUF3RDtRQUNoRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQ3ZDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxP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RlQsTUFBTTs7MkZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVNJLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRGVzdHJveVJlZiwgSW5qZWN0LCBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBiYXNlVVJMLFxuICBJU3VibWl0T3JkZXJSZXNwb25zZSxcbiAgSVN1Ym1pdE9yZGVyUmVxdWVzdCxcbiAgSUtleXMsXG4gIElUcmFuc2FjdGlvblN0YXR1c1Jlc3BvbnNlLFxuICBJUmVjdXJyaW5nUGF5bWVudHNSZXF1ZXN0LFxuICBJUmVjdXJyaW5nUGF5bWVudHNSZXNwb25zZSxcbiAgSVJlZnVuZFJlcXVlc3QsXG4gIElSZWZ1bmRSZXNwb25zZSxcbiAgSVRva2VuUmVzcG9uc2Vcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgUEVTQVBBTF9DT05GSUdTIH0gZnJvbSAnLi4vY29uZmlncyc7XG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcGlTZXJ2aWNlIHtcblxuICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQgPSBpbmplY3QoSHR0cENsaWVudClcbiAgcHJpdmF0ZSBkZXN0cm95OiBEZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpXG4gIHByaXZhdGUgdG9rZW46IFRva2VuU2VydmljZSA9IGluamVjdChUb2tlblNlcnZpY2UpXG4gIHByaXZhdGUgc3RvcmU6IFN0b3JlU2VydmljZSA9IGluamVjdChTdG9yZVNlcnZpY2UpXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChQRVNBUEFMX0NPTkZJR1MpIHByaXZhdGUgY3JlZGVudGlhbHM6IElLZXlzXG4gICl7fVxuXG4gIHB1YmxpYyBzdWJtaXRPcmRlclJlcXVlc3QoZGF0YTogUGFydGlhbDxJU3VibWl0T3JkZXJSZXF1ZXN0PiB8IElTdWJtaXRPcmRlclJlcXVlc3QpOiBPYnNlcnZhYmxlPElTdWJtaXRPcmRlclJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW4uQXV0aGVudGljYXRlS2V5cygpLnBpcGUoXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95KSxcbiAgICAgIHN3aXRjaE1hcCgodG9rZW5SZXNwb25zZTogSVRva2VuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHk6IFBhcnRpYWw8SVN1Ym1pdE9yZGVyUmVxdWVzdD4gPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICBub3RpZmljYXRpb25faWQ6IHRoaXMuY3JlZGVudGlhbHMuaXBuX2lkIC8vIFNldCB0aGUgbm90aWZpY2F0aW9uX2lkIGhlcmVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdG9rZW46IEh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlblJlc3BvbnNlLnRva2VufWBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJU3VibWl0T3JkZXJSZXNwb25zZT4oXG4gICAgICAgICAgYCR7YmFzZVVSTH0vYXBpL1RyYW5zYWN0aW9ucy9TdWJtaXRPcmRlclJlcXVlc3RgLFxuICAgICAgICAgIHJlcXVlc3RCb2R5IGFzIElTdWJtaXRPcmRlclJlcXVlc3QsXG4gICAgICAgICAgeyBoZWFkZXJzOiB0b2tlbiB9XG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yKSlcbiAgICAgIH0pLFxuICAgICAgbWFwKChyZXNwb25zZTogSVN1Ym1pdE9yZGVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZS5zdWJtaXRPcmRlclJlc3BvbnNlQnMubmV4dChyZXNwb25zZSlcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gICAgLyoqXG4gICAqIFJldHJpZXZlcyB0cmFuc2FjdGlvbiBzdGF0dXMgZnJvbSB0aGUgUGVzYXBhbCBBUEkgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRyYWNraW5nIElELlxuICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBhIEdFVCByZXF1ZXN0IHRvIHRoZSBQZXNhcGFsIEFQSSBlbmRwb2ludCByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB0cmFuc2FjdGlvbiBzdGF0dXMuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFja2luZ0lkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0cmFja2luZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCByZXNvbHZlcyB0byB0aGUgdHJhbnNhY3Rpb24gc3RhdHVzIHJlc3BvbnNlIChJVHJhbnNhY3Rpb25TdGF0dXNSZXNwb25zZSkuXG4gICAqIEBwdWJsaWNBcGlcbiAgICovXG4gICAgcHVibGljIGdldFRyYW5zYWN0aW9uU3RhdHVzKHRyYWNraW5nSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8SVRyYW5zYWN0aW9uU3RhdHVzUmVzcG9uc2U+IHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLkF1dGhlbnRpY2F0ZUtleXMoKS5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95KSxcbiAgICAgICAgc3dpdGNoTWFwKCh0b2tlblJlc3BvbnNlOiBJVG9rZW5SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRva2VuOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlblJlc3BvbnNlLnRva2VufWBcbiAgICAgICAgICB9KVxuICBcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJVHJhbnNhY3Rpb25TdGF0dXNSZXNwb25zZT4oXG4gICAgICAgICAgICBgJHtiYXNlVVJMfS9hcGkvVHJhbnNhY3Rpb25zL0dldFRyYW5zYWN0aW9uU3RhdHVzP29yZGVyVHJhY2tpbmdJZD0ke3RyYWNraW5nSWR9YCxcbiAgICAgICAgICAgIHsgaGVhZGVyczogdG9rZW4gfVxuICAgICAgICAgIClcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKVxuICAgICAgICB9KSxcbiAgICAgICAgbWFwKChyZXNwb25zZTogSVRyYW5zYWN0aW9uU3RhdHVzUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLnN0b3JlLnRyYW5zYWN0aW9uU3RhdHVzUmVzcG9uc2VCcy5uZXh0KHJlc3BvbnNlKVxuICAgICAgICAgIHJldHVybiByZXNwb25zZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICogU3VibWl0cyBhbiByZWN1cnJpbmcgb3JkZXIgcmVxdWVzdCB0byBQZXNhcGFsIGZvciBwcm9jZXNzaW5nIGFuZCBoYW5kbGluZyBwYXltZW50IHRyYW5zYWN0aW9ucy4gXG4gICAqIFRoZSBtZXRob2Qgc2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gdGhlIFBlc2FwYWwgQVBJIGVuZHBvaW50IHJlc3BvbnNpYmxlIGZvciByZWN1cnJpbmcgb3JkZXIgc3VibWlzc2lvbnMuXG4gICAqIFVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uLCB0aGUgcmVzcG9uc2UgZGF0YSBpcyBzdG9yZWQgaW4gYW4gT2JzZXJ2YWJsZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIEEgcGFydGlhbCBvciBjb21wbGV0ZSBvYmplY3QgY29uZm9ybWluZyB0byB0aGUgSVJlY3VycmluZ1BheW1lbnRzUmVxdWVzdCBpbnRlcmZhY2VcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXNwb25zZSBvZiB0aGUgb3JkZXIgc3VibWlzc2lvbiBhcyBJUmVjdXJyaW5nUGF5bWVudHNSZXNwb25zZVxuICAgKiBAcHVibGljQXBpXG4gICAqL1xuICAgIHB1YmxpYyBzdWJtaXRSZWN1cnJpbmdQYXltZW50KGRhdGE6IFBhcnRpYWw8SVJlY3VycmluZ1BheW1lbnRzUmVxdWVzdD4gfCBJUmVjdXJyaW5nUGF5bWVudHNSZXF1ZXN0KTogT2JzZXJ2YWJsZTxJUmVjdXJyaW5nUGF5bWVudHNSZXNwb25zZT4ge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW4uQXV0aGVudGljYXRlS2V5cygpLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3kpLFxuICAgICAgICBzd2l0Y2hNYXAoKHRva2VuUmVzcG9uc2U6IElUb2tlblJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgbm90aWZpY2F0aW9uX2lkOiB0aGlzLmNyZWRlbnRpYWxzLmlwbl9pZCAvLyBTZXQgdGhlIG5vdGlmaWNhdGlvbl9pZCBoZXJlXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRva2VuOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlblJlc3BvbnNlLnRva2VufWBcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJUmVjdXJyaW5nUGF5bWVudHNSZXNwb25zZT4oXG4gICAgICAgICAgICBgJHtiYXNlVVJMfS9hcGkvVHJhbnNhY3Rpb25zL1N1Ym1pdFJlY3VycmluZ1BheW1lbnRgLCBcbiAgICAgICAgICAgIHJlcXVlc3RCb2R5IGFzIFBhcnRpYWw8SVJlY3VycmluZ1BheW1lbnRzUmVxdWVzdD4gfCBJUmVjdXJyaW5nUGF5bWVudHNSZXF1ZXN0LFxuICAgICAgICAgICAgeyBoZWFkZXJzOiB0b2tlbiB9XG4gICAgICAgICAgKVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpXG4gICAgICAgIH0pLFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBJUmVjdXJyaW5nUGF5bWVudHNSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RvcmUucmVmdW5kc1Jlc3BvbnNlQnMubmV4dChyZXNwb25zZSlcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG5cbiAgIC8qKlxuICAgKiBTdWJtaXRzIGEgcGF5bWVudCByZWZ1bmQuIFxuICAgKiBVcG9uIHN1Y2Nlc3NmdWwgc3VibWlzc2lvbiwgdGhlIHJlc3BvbnNlIGRhdGEgaXMgc3RvcmVkIGluIGFuIE9ic2VydmFibGUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBBIHBhcnRpYWwgb3IgY29tcGxldGUgb2JqZWN0IGNvbmZvcm1pbmcgdG8gdGhlIElSZWZ1bmRSZXF1ZXN0IGludGVyZmFjZVxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3BvbnNlIG9mIHRoZSBvcmRlciBzdWJtaXNzaW9uIGFzIElSZWZ1bmRSZXNwb25zZVxuICAgKiBAcHVibGljQXBpXG4gICAqL1xuICAgcHVibGljIHJlcXVlc3RSZWZ1bmQoZGF0YTogSVJlZnVuZFJlcXVlc3QpOiBPYnNlcnZhYmxlPElSZWZ1bmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnRva2VuLkF1dGhlbnRpY2F0ZUtleXMoKS5waXBlKFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveSksXG4gICAgICBzd2l0Y2hNYXAoKHRva2VuUmVzcG9uc2U6IElUb2tlblJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRva2VuOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW5SZXNwb25zZS50b2tlbn1gXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJUmVmdW5kUmVzcG9uc2U+KFxuICAgICAgICAgIGAke2Jhc2VVUkx9L2FwaS9UcmFuc2FjdGlvbnMvUmVxdWVzdFJlZnVuZGAsIFxuICAgICAgICAgIGRhdGEgYXMgSVJlZnVuZFJlcXVlc3QsXG4gICAgICAgICAgeyBoZWFkZXJzOiB0b2tlbiB9XG4gICAgICAgIClcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKVxuICAgICAgfSksXG4gICAgICBtYXAoKHJlc3BvbnNlOiBJUmVmdW5kUmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuIl19