@xsolla/payment-client-core 0.2.45 → 0.2.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/esm2022/lib/core/agreements-group.const.mjs +17 -0
  2. package/esm2022/lib/core/extended-window.interface.mjs +1 -1
  3. package/esm2022/lib/core/sdk-payment-systems/apple-pay/apple-pay-integration.type.mjs +6 -2
  4. package/esm2022/lib/core/sdk-payment-systems/apple-pay/apple-pay-params-builder.service.mjs +90 -0
  5. package/esm2022/lib/core/sdk-payment-systems/apple-pay/apple-pay-session.interface.mjs +2 -0
  6. package/esm2022/lib/core/sdk-payment-systems/apple-pay/apple-pay.errors.enum.mjs +6 -3
  7. package/esm2022/lib/core/sdk-payment-systems/apple-pay/apple-pay.service.mjs +64 -87
  8. package/esm2022/lib/core/sdk-payment-systems/apple-pay/checkout-params.interface.mjs +1 -1
  9. package/esm2022/lib/core/sdk-payment-systems/apple-pay/session-handlers/braintree.handler.mjs +80 -0
  10. package/esm2022/lib/core/sdk-payment-systems/apple-pay/session-handlers/checkout.handler.mjs +65 -0
  11. package/esm2022/lib/core/sdk-payment-systems/apple-pay/session-handlers/session-handler.abstract.mjs +31 -0
  12. package/esm2022/lib/core/sdk-payment-systems/apple-pay/session-handlers/session-handler.type.mjs +2 -0
  13. package/esm2022/lib/core/settings/project.interface.mjs +1 -1
  14. package/esm2022/lib/core-library.module.mjs +7 -1
  15. package/esm2022/lib/core-library.service.mjs +4 -1
  16. package/fesm2022/xsolla-payment-client-core.mjs +317 -84
  17. package/fesm2022/xsolla-payment-client-core.mjs.map +1 -1
  18. package/lib/core/extended-window.interface.d.ts +1 -1
  19. package/lib/core/sdk-payment-systems/apple-pay/apple-pay-integration.type.d.ts +5 -1
  20. package/lib/core/sdk-payment-systems/apple-pay/apple-pay-params-builder.service.d.ts +15 -0
  21. package/lib/core/sdk-payment-systems/apple-pay/apple-pay-session.interface.d.ts +135 -0
  22. package/lib/core/sdk-payment-systems/apple-pay/apple-pay.errors.enum.d.ts +5 -2
  23. package/lib/core/sdk-payment-systems/apple-pay/apple-pay.service.d.ts +24 -13
  24. package/lib/core/sdk-payment-systems/apple-pay/checkout-params.interface.d.ts +1 -0
  25. package/lib/core/sdk-payment-systems/apple-pay/session-handlers/braintree.handler.d.ts +16 -0
  26. package/lib/core/sdk-payment-systems/apple-pay/session-handlers/checkout.handler.d.ts +13 -0
  27. package/lib/core/sdk-payment-systems/apple-pay/session-handlers/session-handler.abstract.d.ts +13 -0
  28. package/lib/core/sdk-payment-systems/apple-pay/session-handlers/session-handler.type.d.ts +3 -0
  29. package/lib/core/settings/project.interface.d.ts +1 -0
  30. package/lib/core-library.service.d.ts +3 -0
  31. package/package.json +1 -1
  32. package/xsolla-payment-client-core-0.2.46.tgz +0 -0
  33. package/esm2022/lib/core/agreementsGroup.const.mjs +0 -17
  34. package/xsolla-payment-client-core-0.2.45.tgz +0 -0
  35. /package/lib/core/{agreementsGroup.const.d.ts → agreements-group.const.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { ApplePaySession } from 'braintree-web';
1
+ import { ApplePaySession } from './sdk-payment-systems/apple-pay/apple-pay-session.interface';
2
2
  import { GooglePayLibrary } from './sdk-payment-systems/google-pay/google-pay-library.interface';
3
3
  export interface ExtendedWindow extends Window {
4
4
  PerformanceObserver?: typeof PerformanceObserver;
@@ -1 +1,5 @@
1
- export type ApplePayIntegration = 'redirect' | 'none';
1
+ export declare enum ApplePayIntegrationType {
2
+ redirect = "redirect",
3
+ native = "native"
4
+ }
5
+ export type ApplePayIntegration = ApplePayIntegrationType;
@@ -0,0 +1,15 @@
1
+ import { PaymentForm } from '../../payment/payment-form.interface';
2
+ import { XpsSummary } from '../../payment/xps-summary.interface';
3
+ import { ApplePayParams } from './apple-pay-params.interface';
4
+ import * as i0 from "@angular/core";
5
+ export declare class ApplePayParamsBuilderService {
6
+ private readonly agreementFieldsNames;
7
+ buildParams(paymentForm: PaymentForm): ApplePayParams | null;
8
+ updateParams(params: ApplePayParams, summary: XpsSummary): ApplePayParams;
9
+ private getJsonValueFromField;
10
+ private getAppleToken;
11
+ private getTotalAmount;
12
+ private getTotalCurrency;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<ApplePayParamsBuilderService, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<ApplePayParamsBuilderService>;
15
+ }
@@ -0,0 +1,135 @@
1
+ export declare class ApplePaySession {
2
+ static STATUS_SUCCESS: number;
3
+ static STATUS_FAILURE: number;
4
+ onvalidatemerchant: (this: ApplePaySession, event: ApplePayValidEvent) => void;
5
+ onpaymentauthorized: (this: ApplePaySession, event: ApplePayPaymentAuthorizedEvent) => void;
6
+ onshippingcontactselected: (this: ApplePaySession, event: ApplePayOnShippingContactSelectedEvent) => void;
7
+ onshippingmethodselected: (this: ApplePaySession, event: ApplePayOnShippingMethodSelectedEvent) => void;
8
+ completeShippingContactSelection: (this: ApplePaySession, shippingContactUpdate: ApplePayShippingContactUpdate) => void;
9
+ oncancel: (this: ApplePaySession, event?: ApplePayOnCancelEvent) => void;
10
+ constructor(version: number, paymentRequest: ApplePayPaymentRequest);
11
+ static supportsVersion(version: number): boolean;
12
+ static canMakePayments(): boolean;
13
+ completeMerchantValidation(merchantSession: ApplePayMerchantSession): void;
14
+ completePayment(status: number): void;
15
+ abort(): void;
16
+ begin(): void;
17
+ }
18
+ export interface ApplePayValidEvent {
19
+ validationURL: string;
20
+ }
21
+ export interface ApplePayPaymentAuthorizedEvent {
22
+ payment: ApplePayPayment;
23
+ }
24
+ export interface ApplePayOnShippingContactSelectedEvent {
25
+ shippingContact: {
26
+ locality: string;
27
+ country: string;
28
+ postalCode: string;
29
+ administrativeArea: string;
30
+ countryCode: string;
31
+ };
32
+ }
33
+ export interface ApplePayOnShippingMethodSelectedEvent {
34
+ shippingMethod: {
35
+ label: string;
36
+ detail: string;
37
+ amount: string;
38
+ identifier: string;
39
+ dateComponentsRange: {
40
+ startDateComponents: {
41
+ years: number;
42
+ months: number;
43
+ days: number;
44
+ hours: number;
45
+ };
46
+ endDateComponents: {
47
+ years: number;
48
+ months: number;
49
+ days: number;
50
+ hours: number;
51
+ };
52
+ };
53
+ };
54
+ }
55
+ export interface ApplePayShippingContactUpdate {
56
+ status: 'STATUS_SUCCESS' | 'STATUS_FAILURE';
57
+ newTotal: ApplePayLineItem;
58
+ newLineItems?: ApplePayLineItem[];
59
+ }
60
+ export interface ApplePayOnCancelEvent {
61
+ type: string;
62
+ sessionError: {
63
+ code: string;
64
+ info?: {
65
+ [key: string]: unknown;
66
+ };
67
+ };
68
+ }
69
+ export interface ApplePayPayment {
70
+ token: ApplePayPaymentToken;
71
+ billingContact?: ApplePayPaymentContact;
72
+ shippingContact?: ApplePayPaymentContact;
73
+ }
74
+ export interface ApplePayPaymentToken {
75
+ paymentMethod: {
76
+ displayName: string;
77
+ network: string;
78
+ type: string;
79
+ };
80
+ transactionIdentifier: string;
81
+ }
82
+ export interface ApplePayPaymentRequest {
83
+ countryCode: string;
84
+ currencyCode: string;
85
+ supportedNetworks: string[] | undefined;
86
+ merchantCapabilities: string[] | undefined;
87
+ total: ApplePayLineItem;
88
+ lineItems?: ApplePayLineItem[];
89
+ requiredShippingContactFields?: string[];
90
+ requiredBillingContactFields?: string[];
91
+ shippingMethods?: ApplePayShippingMethod[];
92
+ shippingType?: string;
93
+ }
94
+ export interface ApplePayLineItem {
95
+ amount: string;
96
+ label: string;
97
+ type?: 'final' | 'pending';
98
+ paymentTiming?: 'immediate' | 'recurring' | 'deferred' | 'automaticReload';
99
+ recurringPaymentStartDate?: Date;
100
+ recurringPaymentIntervalUnit?: 'year' | 'month' | 'day' | 'hour' | 'minute';
101
+ recurringPaymentIntervalCount?: number;
102
+ recurringPaymentEndDate?: Date;
103
+ deferredPaymentDate?: Date;
104
+ automaticReloadPaymentThresholdAmount?: string;
105
+ }
106
+ export interface ApplePayShippingMethod {
107
+ identifier: string;
108
+ label: string;
109
+ detail: string;
110
+ amount: string;
111
+ }
112
+ export interface ApplePayMerchantSession {
113
+ merchantIdentifier: string;
114
+ displayName: string;
115
+ signature: string;
116
+ nonce: string;
117
+ epochTimestamp: number;
118
+ }
119
+ export interface GetMerchantSessionResponse {
120
+ merchantSession: ApplePayMerchantSession;
121
+ }
122
+ export interface ApplePayPaymentContact {
123
+ emailAddress?: string;
124
+ phoneNumber?: string;
125
+ givenName?: string;
126
+ familyName?: string;
127
+ addressLines?: string[];
128
+ locality?: string;
129
+ subLocality?: string;
130
+ administrativeArea?: string;
131
+ subAdministrativeArea?: string;
132
+ postalCode?: string;
133
+ country?: string;
134
+ countryCode?: string;
135
+ }
@@ -1,4 +1,7 @@
1
1
  export declare enum ApplePayErrors {
2
- paymentError = "paymentError",
3
- deviceIsNotCapableError = "deviceIsNotCapableError"
2
+ paymentError = "Apple Pay: payment error",
3
+ deviceIsNotCapableError = "Apple Pay: device is not capable",
4
+ cancelled = "Apple Pay: payment cancelled",
5
+ merchantValidationError = "Apple Pay: merchant validation error",
6
+ braintreeInitializeError = "Apple Pay: Braintree library is not initialized"
4
7
  }
@@ -1,16 +1,24 @@
1
1
  import { Observable } from 'rxjs';
2
- import { ApplePayParams } from './apple-pay-params.interface';
3
2
  import { ExtendedWindow } from '../../extended-window.interface';
4
- import { ApplePayErrors } from './apple-pay.errors.enum';
3
+ import { SummaryFinanceDetailsAdapterService } from '../../payment/finance-details/summary/summary-finance-details-adapter.service';
5
4
  import { UserAgentService } from '../../user-agent/user-agent.service';
6
5
  import { ApplePayIntegration } from './apple-pay-integration.type';
7
- import { SummaryFinanceDetailsAdapterService } from '../../payment/finance-details/summary/summary-finance-details-adapter.service';
6
+ import { ApplePayParams } from './apple-pay-params.interface';
7
+ import { ApplePayErrors } from './apple-pay.errors.enum';
8
+ import { BraintreeHandler } from './session-handlers/braintree.handler';
9
+ import { CheckoutHandler } from './session-handlers/checkout.handler';
10
+ import { PaymentForm } from '../../payment/payment-form.interface';
11
+ import { ApplePayParamsBuilderService } from './apple-pay-params-builder.service';
12
+ import { ElkLoggerService } from '../../exceptions-handling/elk/elk-logger.service';
8
13
  import * as i0 from "@angular/core";
9
14
  export declare class ApplePayService {
10
15
  private readonly window;
11
16
  private readonly userAgentService;
12
17
  private readonly summaryFinanceDetailsAdapterService;
13
- private readonly agreementFieldsNames;
18
+ private readonly braintreeHandler;
19
+ private readonly checkoutHandler;
20
+ private readonly appleParamsBuilder;
21
+ private readonly elkLoggerService;
14
22
  private readonly payment;
15
23
  private readonly error;
16
24
  private readonly integrationType;
@@ -22,24 +30,27 @@ export declare class ApplePayService {
22
30
  get payment$(): Observable<string>;
23
31
  get error$(): Observable<ApplePayErrors>;
24
32
  get integrationType$(): Observable<ApplePayIntegration>;
25
- constructor(window: ExtendedWindow, userAgentService: UserAgentService, summaryFinanceDetailsAdapterService: SummaryFinanceDetailsAdapterService);
26
- setApplePayParams(data: unknown): void;
27
- initLibrary(tokenKey: string): Promise<void>;
33
+ constructor(window: ExtendedWindow, userAgentService: UserAgentService, summaryFinanceDetailsAdapterService: SummaryFinanceDetailsAdapterService, braintreeHandler: BraintreeHandler, checkoutHandler: CheckoutHandler, appleParamsBuilder: ApplePayParamsBuilderService, elkLoggerService: ElkLoggerService);
34
+ setApplePayParams(data: {
35
+ paymentForm: PaymentForm;
36
+ }): void;
37
+ initBraintreeLibrary(tokenKey: string): Promise<void>;
28
38
  redirectToPaymentPage(parameters: ApplePayParams, token: string, isSandbox?: boolean): string | undefined;
29
- setOrder(data: unknown): void;
30
- isDeviceCapable(): boolean;
39
+ setOrder(data: {
40
+ paymentForm: PaymentForm;
41
+ }): void;
42
+ get isDeviceCapable(): boolean;
31
43
  getTokenNonceFieldData(tokenNonce: string): {
32
44
  name: string;
33
45
  value: string;
34
46
  };
35
47
  updateApplePayParams(data: unknown): void;
48
+ proceedCheckout(parameters: ApplePayParams, iframeIntegrationEnabled?: boolean): void;
49
+ private getSessionHandler;
36
50
  private loadBraintree;
37
- private getAppleToken;
38
- private getTotalAmount;
39
- private getTotalCurrency;
40
- private getJsonValueFromField;
41
51
  private emitError;
42
52
  private emitIntegrationType;
53
+ private subscribeToHandlers;
43
54
  static ɵfac: i0.ɵɵFactoryDeclaration<ApplePayService, never>;
44
55
  static ɵprov: i0.ɵɵInjectableDeclaration<ApplePayService>;
45
56
  }
@@ -13,4 +13,5 @@ export interface ApplePayCheckoutParams {
13
13
  payInstanceAccountId: string;
14
14
  getApplePaySessionUrl: string;
15
15
  payViaCheckoutUrl: string;
16
+ topLevelDomain?: string;
16
17
  }
@@ -0,0 +1,16 @@
1
+ import { ApplePay } from 'braintree-web';
2
+ import { ElkLoggerService } from '../../../exceptions-handling/elk/elk-logger.service';
3
+ import { ExtendedWindow } from '../../../extended-window.interface';
4
+ import { ApplePayParams } from '../apple-pay-params.interface';
5
+ import { ApplePaySessionHandlerAbstract } from './session-handler.abstract';
6
+ import * as i0 from "@angular/core";
7
+ export declare class BraintreeHandler extends ApplePaySessionHandlerAbstract {
8
+ private readonly window;
9
+ private readonly elkLoggerService;
10
+ private paymentClient;
11
+ constructor(window: ExtendedWindow, elkLoggerService: ElkLoggerService);
12
+ setClient(client: ApplePay): void;
13
+ startSession(params: ApplePayParams, iframeIntegrationEnabled: boolean): void;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<BraintreeHandler, never>;
15
+ static ɵprov: i0.ɵɵInjectableDeclaration<BraintreeHandler>;
16
+ }
@@ -0,0 +1,13 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { ExtendedWindow } from '../../../extended-window.interface';
3
+ import { ApplePayParams } from '../apple-pay-params.interface';
4
+ import { ApplePaySessionHandlerAbstract } from './session-handler.abstract';
5
+ import * as i0 from "@angular/core";
6
+ export declare class CheckoutHandler extends ApplePaySessionHandlerAbstract {
7
+ private readonly window;
8
+ private readonly http;
9
+ constructor(window: ExtendedWindow, http: HttpClient);
10
+ startSession(params: ApplePayParams, iframeIntegrationEnabled: boolean): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<CheckoutHandler, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<CheckoutHandler>;
13
+ }
@@ -0,0 +1,13 @@
1
+ import { Observable, Subject } from 'rxjs';
2
+ import { ApplePayParams } from '../apple-pay-params.interface';
3
+ import { ApplePayErrors } from '../apple-pay.errors.enum';
4
+ import { ApplePayPaymentRequest } from '../apple-pay-session.interface';
5
+ export declare abstract class ApplePaySessionHandlerAbstract {
6
+ protected readonly payment: Subject<string>;
7
+ private readonly _errorSubject;
8
+ get error$(): Observable<ApplePayErrors>;
9
+ get payment$(): Observable<string>;
10
+ abstract startSession(params: ApplePayParams, iframe: boolean): void;
11
+ protected emitError(error: ApplePayErrors): void;
12
+ protected buildPaymentRequest(params: ApplePayParams): ApplePayPaymentRequest;
13
+ }
@@ -0,0 +1,3 @@
1
+ import { BraintreeHandler } from './braintree.handler';
2
+ import { CheckoutHandler } from './checkout.handler';
3
+ export type ApplePaySessionHandler = BraintreeHandler | CheckoutHandler;
@@ -29,4 +29,5 @@ export interface Project {
29
29
  isMerchantManageSavedMethods?: boolean;
30
30
  trackingInfo: TrackingInfo[] | [];
31
31
  isSubtotalVisibleByDefault?: boolean;
32
+ isApplePayIframeIntegrationTurnedOn?: boolean;
32
33
  }
@@ -48,6 +48,8 @@ import { ScriptTrackerService } from './core/script-tracker/script-tracker.servi
48
48
  import { SyncResponse } from './core/payment/sync/response/sync-response.class';
49
49
  import { XpsSummary } from './core/payment/xps-summary.interface';
50
50
  import { SubmitResponse } from './core/payment/submit/response/submit-response.class';
51
+ import { DeepReadonly } from './core/deep-readonly.type';
52
+ import { Project } from './core/settings/project.interface';
51
53
  import * as i0 from "@angular/core";
52
54
  export declare class CoreLibraryService {
53
55
  private readonly settingsService;
@@ -110,6 +112,7 @@ export declare class CoreLibraryService {
110
112
  get paymentForm$(): Observable<FormControlStatus | null>;
111
113
  get formResponse$(): Observable<FormResponse | null>;
112
114
  get formResponseValue(): FormResponse | null;
115
+ get projectSettings(): DeepReadonly<Project>;
113
116
  static ɵfac: i0.ɵɵFactoryDeclaration<CoreLibraryService, never>;
114
117
  static ɵprov: i0.ɵɵInjectableDeclaration<CoreLibraryService>;
115
118
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/payment-client-core",
3
- "version": "0.2.45",
3
+ "version": "0.2.46",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.3.3",
6
6
  "@angular/core": "^17.3.3",
@@ -1,17 +0,0 @@
1
- import { FieldNames } from './payment/field-names.enum';
2
- export const agreementsGroup = [
3
- FieldNames.licenseDisclaimer,
4
- FieldNames.termsAndConditions,
5
- FieldNames.termsAndConditionsHtcEula,
6
- FieldNames.termsAndConditionsAtariTc,
7
- FieldNames.termsAndConditionsAtariPp,
8
- FieldNames.termsAndConditionsRolandEula,
9
- FieldNames.termsAndConditionsRobloxEula,
10
- FieldNames.termsAndConditionsDeusLoVultEula,
11
- FieldNames.termsAndConditionsOnzenga,
12
- FieldNames.take2Taxes,
13
- FieldNames.rockstarTaxes,
14
- FieldNames.omnibusDirective,
15
- FieldNames.koreaLimitsInstruction,
16
- ];
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdyZWVtZW50c0dyb3VwLmNvbnN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGF5bWVudC1jbGllbnQtY29yZS9zcmMvbGliL2NvcmUvYWdyZWVtZW50c0dyb3VwLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0IsVUFBVSxDQUFDLGlCQUFpQjtJQUM1QixVQUFVLENBQUMsa0JBQWtCO0lBQzdCLFVBQVUsQ0FBQyx5QkFBeUI7SUFDcEMsVUFBVSxDQUFDLHlCQUF5QjtJQUNwQyxVQUFVLENBQUMseUJBQXlCO0lBQ3BDLFVBQVUsQ0FBQyw0QkFBNEI7SUFDdkMsVUFBVSxDQUFDLDRCQUE0QjtJQUN2QyxVQUFVLENBQUMsZ0NBQWdDO0lBQzNDLFVBQVUsQ0FBQyx5QkFBeUI7SUFDcEMsVUFBVSxDQUFDLFVBQVU7SUFDckIsVUFBVSxDQUFDLGFBQWE7SUFDeEIsVUFBVSxDQUFDLGdCQUFnQjtJQUMzQixVQUFVLENBQUMsc0JBQXNCO0NBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWVsZE5hbWVzIH0gZnJvbSAnLi9wYXltZW50L2ZpZWxkLW5hbWVzLmVudW0nO1xuXG5leHBvcnQgY29uc3QgYWdyZWVtZW50c0dyb3VwID0gW1xuICBGaWVsZE5hbWVzLmxpY2Vuc2VEaXNjbGFpbWVyLFxuICBGaWVsZE5hbWVzLnRlcm1zQW5kQ29uZGl0aW9ucyxcbiAgRmllbGROYW1lcy50ZXJtc0FuZENvbmRpdGlvbnNIdGNFdWxhLFxuICBGaWVsZE5hbWVzLnRlcm1zQW5kQ29uZGl0aW9uc0F0YXJpVGMsXG4gIEZpZWxkTmFtZXMudGVybXNBbmRDb25kaXRpb25zQXRhcmlQcCxcbiAgRmllbGROYW1lcy50ZXJtc0FuZENvbmRpdGlvbnNSb2xhbmRFdWxhLFxuICBGaWVsZE5hbWVzLnRlcm1zQW5kQ29uZGl0aW9uc1JvYmxveEV1bGEsXG4gIEZpZWxkTmFtZXMudGVybXNBbmRDb25kaXRpb25zRGV1c0xvVnVsdEV1bGEsXG4gIEZpZWxkTmFtZXMudGVybXNBbmRDb25kaXRpb25zT256ZW5nYSxcbiAgRmllbGROYW1lcy50YWtlMlRheGVzLFxuICBGaWVsZE5hbWVzLnJvY2tzdGFyVGF4ZXMsXG4gIEZpZWxkTmFtZXMub21uaWJ1c0RpcmVjdGl2ZSxcbiAgRmllbGROYW1lcy5rb3JlYUxpbWl0c0luc3RydWN0aW9uLFxuXTtcbiJdfQ==