@tryheliumai/paywall-sdk-react-native 0.1.23 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -6
- package/ios/HeliumSwiftInterface.swift +9 -6
- package/ios/HeliumUpsellViewManager.swift +1 -1
- package/lib/commonjs/purchase-handlers.js +3 -1
- package/lib/commonjs/purchase-handlers.js.map +1 -1
- package/lib/module/purchase-handlers.js +3 -1
- package/lib/module/purchase-handlers.js.map +1 -1
- package/lib/typescript/commonjs/src/purchase-handlers.d.ts +3 -3
- package/lib/typescript/commonjs/src/purchase-handlers.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types.d.ts +5 -1
- package/lib/typescript/commonjs/src/types.d.ts.map +1 -1
- package/lib/typescript/module/src/purchase-handlers.d.ts +3 -3
- package/lib/typescript/module/src/purchase-handlers.d.ts.map +1 -1
- package/lib/typescript/module/src/types.d.ts +5 -1
- package/lib/typescript/module/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/purchase-handlers.ts +4 -4
- package/src/types.ts +5 -1
package/README.md
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 'SDK Quickstart (React Native)'
|
|
3
|
-
description: 'Integrate Helium into your React Native App'
|
|
4
|
-
icon: 'code'
|
|
5
|
-
---
|
|
6
|
-
|
|
7
1
|
## **Background**
|
|
8
2
|
|
|
9
3
|
Get set up with the Helium SDK for iOS in 5 minutes. Reach out over your Helium slack channel, or email founders@tryhelium.com for any questions.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
//
|
|
7
7
|
|
|
8
8
|
import Foundation
|
|
9
|
-
import
|
|
9
|
+
import Helium
|
|
10
10
|
import SwiftUI
|
|
11
11
|
import UIKit
|
|
12
12
|
import React
|
|
@@ -28,6 +28,7 @@ class PurchaseState: ObservableObject {
|
|
|
28
28
|
struct PurchaseResponse {
|
|
29
29
|
let transactionId: String
|
|
30
30
|
let status: String
|
|
31
|
+
let error: String?
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
@Published var pendingResponses: [String: (PurchaseResponse) -> Void] = [:]
|
|
@@ -47,16 +48,15 @@ class BridgingPaywallDelegate: HeliumPaywallDelegate {
|
|
|
47
48
|
public func makePurchase(productId: String) async -> HeliumPaywallTransactionStatus {
|
|
48
49
|
return await withCheckedContinuation { continuation in
|
|
49
50
|
let transactionId = UUID().uuidString
|
|
50
|
-
|
|
51
|
+
// Store continuation callback
|
|
52
|
+
purchaseState.pendingResponses[transactionId] = { response in
|
|
51
53
|
let userInfo: [String: Any] = [
|
|
52
|
-
NSLocalizedDescriptionKey: "Failed to make purchase",
|
|
54
|
+
NSLocalizedDescriptionKey: response.error ?? "Failed to make purchase",
|
|
53
55
|
NSLocalizedFailureReasonErrorKey: "An unknown error occurred",
|
|
54
56
|
NSLocalizedRecoverySuggestionErrorKey: "Please try again later"
|
|
55
57
|
]
|
|
56
58
|
let failureError = NSError(domain: "PaywallErrorDomain", code: 1001, userInfo: userInfo)
|
|
57
59
|
|
|
58
|
-
// Store continuation callback
|
|
59
|
-
purchaseState.pendingResponses[transactionId] = { response in
|
|
60
60
|
let status: HeliumPaywallTransactionStatus = switch response.status {
|
|
61
61
|
case "completed": .purchased
|
|
62
62
|
case "purchased": .purchased
|
|
@@ -88,12 +88,15 @@ class BridgingPaywallDelegate: HeliumPaywallDelegate {
|
|
|
88
88
|
return
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
let error = response["error"] as? String
|
|
92
|
+
|
|
91
93
|
// Remove callback before executing to prevent multiple calls
|
|
92
94
|
purchaseState.pendingResponses.removeValue(forKey: transactionId)
|
|
93
95
|
|
|
94
96
|
callback(PurchaseState.PurchaseResponse(
|
|
95
97
|
transactionId: transactionId,
|
|
96
|
-
status: status
|
|
98
|
+
status: status,
|
|
99
|
+
error: error
|
|
97
100
|
))
|
|
98
101
|
}
|
|
99
102
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DemoHeliumCallbacks","events","makePurchase","productId","push","timestamp","Date","event","type","restorePurchases","onHeliumPaywallEvent","getEventHistory","exports"],"sourceRoot":"../../src","sources":["purchase-handlers.ts"],"mappings":";;;;;;AAQE;AACO,MAAMA,mBAAmB,CAA4B;EAClDC,MAAM,GAAsC,EAAE;EAEtD,MAAMC,YAAYA,CAACC,SAAiB,
|
|
1
|
+
{"version":3,"names":["DemoHeliumCallbacks","events","makePurchase","productId","push","timestamp","Date","event","type","status","restorePurchases","onHeliumPaywallEvent","getEventHistory","exports"],"sourceRoot":"../../src","sources":["purchase-handlers.ts"],"mappings":";;;;;;AAQE;AACO,MAAMA,mBAAmB,CAA4B;EAClDC,MAAM,GAAsC,EAAE;EAEtD,MAAMC,YAAYA,CAACC,SAAiB,EAAiC;IACnE,IAAI,CAACF,MAAM,CAACG,IAAI,CAAC;MAAEC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC;MAAEC,KAAK,EAAE;QAAEC,IAAI,EAAE,UAAU;QAAEL;MAAU;IAAE,CAAC,CAAC;IACnF,OAAO;MAAEM,MAAM,EAAE;IAAuC,CAAC;EAC3D;EAEA,MAAMC,gBAAgBA,CAAA,EAAqB;IACzC,IAAI,CAACT,MAAM,CAACG,IAAI,CAAC;MAAEC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC;MAAEC,KAAK,EAAE;QAAEC,IAAI,EAAE;MAAU;IAAE,CAAC,CAAC;IACvE,OAAO,IAAI;EACb;EAEAG,oBAAoBA,CAACJ,KAAU,EAAQ;IACrC,IAAI,CAACN,MAAM,CAACG,IAAI,CAAC;MAAEC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC;MAAEC;IAAM,CAAC,CAAC;EACpD;EAEAK,eAAeA,CAAA,EAAG;IAChB,OAAO,IAAI,CAACX,MAAM;EACpB;AACF;AAACY,OAAA,CAAAb,mBAAA,GAAAA,mBAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DemoHeliumCallbacks","events","makePurchase","productId","push","timestamp","Date","event","type","restorePurchases","onHeliumPaywallEvent","getEventHistory"],"sourceRoot":"../../src","sources":["purchase-handlers.ts"],"mappings":";;AAQE;AACA,OAAO,MAAMA,mBAAmB,CAA4B;EAClDC,MAAM,GAAsC,EAAE;EAEtD,MAAMC,YAAYA,CAACC,SAAiB,
|
|
1
|
+
{"version":3,"names":["DemoHeliumCallbacks","events","makePurchase","productId","push","timestamp","Date","event","type","status","restorePurchases","onHeliumPaywallEvent","getEventHistory"],"sourceRoot":"../../src","sources":["purchase-handlers.ts"],"mappings":";;AAQE;AACA,OAAO,MAAMA,mBAAmB,CAA4B;EAClDC,MAAM,GAAsC,EAAE;EAEtD,MAAMC,YAAYA,CAACC,SAAiB,EAAiC;IACnE,IAAI,CAACF,MAAM,CAACG,IAAI,CAAC;MAAEC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC;MAAEC,KAAK,EAAE;QAAEC,IAAI,EAAE,UAAU;QAAEL;MAAU;IAAE,CAAC,CAAC;IACnF,OAAO;MAAEM,MAAM,EAAE;IAAuC,CAAC;EAC3D;EAEA,MAAMC,gBAAgBA,CAAA,EAAqB;IACzC,IAAI,CAACT,MAAM,CAACG,IAAI,CAAC;MAAEC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC;MAAEC,KAAK,EAAE;QAAEC,IAAI,EAAE;MAAU;IAAE,CAAC,CAAC;IACvE,OAAO,IAAI;EACb;EAEAG,oBAAoBA,CAACJ,KAAU,EAAQ;IACrC,IAAI,CAACN,MAAM,CAACG,IAAI,CAAC;MAAEC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC;MAAEC;IAAM,CAAC,CAAC;EACpD;EAEAK,eAAeA,CAAA,EAAG;IAChB,OAAO,IAAI,CAACX,MAAM;EACpB;AACF","ignoreList":[]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HeliumPurchaseResult } from './types';
|
|
2
2
|
export interface HeliumCallbacks {
|
|
3
|
-
makePurchase: (productId: string) => Promise<
|
|
3
|
+
makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;
|
|
4
4
|
restorePurchases: () => Promise<boolean>;
|
|
5
5
|
onHeliumPaywallEvent: (event: any) => void;
|
|
6
6
|
}
|
|
7
7
|
export declare class DemoHeliumCallbacks implements HeliumCallbacks {
|
|
8
8
|
private events;
|
|
9
|
-
makePurchase(productId: string): Promise<
|
|
9
|
+
makePurchase(productId: string): Promise<HeliumPurchaseResult>;
|
|
10
10
|
restorePurchases(): Promise<boolean>;
|
|
11
11
|
onHeliumPaywallEvent(event: any): void;
|
|
12
12
|
getEventHistory(): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purchase-handlers.d.ts","sourceRoot":"","sources":["../../../../src/purchase-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"purchase-handlers.d.ts","sourceRoot":"","sources":["../../../../src/purchase-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnE,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,oBAAoB,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAC5C;AAGD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,MAAM,CAAyC;IAEjD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAK9D,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1C,oBAAoB,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAItC,eAAe;mBAhBc,IAAI;eAAS,GAAG;;CAmB9C"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
export type HeliumTransactionStatus = 'completed' | 'failed' | 'cancelled' | 'pending' | 'restored';
|
|
2
|
+
export type HeliumPurchaseResult = {
|
|
3
|
+
status: HeliumTransactionStatus;
|
|
4
|
+
error?: string;
|
|
5
|
+
};
|
|
2
6
|
export type HeliumDownloadStatus = 'success' | 'failed' | 'inProgress' | 'notStarted';
|
|
3
7
|
export interface HeliumCallbacks {
|
|
4
|
-
makePurchase: (productId: string) => Promise<
|
|
8
|
+
makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;
|
|
5
9
|
restorePurchases: () => Promise<boolean>;
|
|
6
10
|
onHeliumPaywallEvent: (event: any) => void;
|
|
7
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AACpG,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AACpG,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnE,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,oBAAoB,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,GAAG,CAAC;CACb"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HeliumPurchaseResult } from './types';
|
|
2
2
|
export interface HeliumCallbacks {
|
|
3
|
-
makePurchase: (productId: string) => Promise<
|
|
3
|
+
makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;
|
|
4
4
|
restorePurchases: () => Promise<boolean>;
|
|
5
5
|
onHeliumPaywallEvent: (event: any) => void;
|
|
6
6
|
}
|
|
7
7
|
export declare class DemoHeliumCallbacks implements HeliumCallbacks {
|
|
8
8
|
private events;
|
|
9
|
-
makePurchase(productId: string): Promise<
|
|
9
|
+
makePurchase(productId: string): Promise<HeliumPurchaseResult>;
|
|
10
10
|
restorePurchases(): Promise<boolean>;
|
|
11
11
|
onHeliumPaywallEvent(event: any): void;
|
|
12
12
|
getEventHistory(): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purchase-handlers.d.ts","sourceRoot":"","sources":["../../../../src/purchase-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"purchase-handlers.d.ts","sourceRoot":"","sources":["../../../../src/purchase-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnE,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,oBAAoB,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAC5C;AAGD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,MAAM,CAAyC;IAEjD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAK9D,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1C,oBAAoB,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAItC,eAAe;mBAhBc,IAAI;eAAS,GAAG;;CAmB9C"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
export type HeliumTransactionStatus = 'completed' | 'failed' | 'cancelled' | 'pending' | 'restored';
|
|
2
|
+
export type HeliumPurchaseResult = {
|
|
3
|
+
status: HeliumTransactionStatus;
|
|
4
|
+
error?: string;
|
|
5
|
+
};
|
|
2
6
|
export type HeliumDownloadStatus = 'success' | 'failed' | 'inProgress' | 'notStarted';
|
|
3
7
|
export interface HeliumCallbacks {
|
|
4
|
-
makePurchase: (productId: string) => Promise<
|
|
8
|
+
makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;
|
|
5
9
|
restorePurchases: () => Promise<boolean>;
|
|
6
10
|
onHeliumPaywallEvent: (event: any) => void;
|
|
7
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AACpG,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AACpG,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnE,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,oBAAoB,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,GAAG,CAAC;CACb"}
|
package/package.json
CHANGED
package/src/purchase-handlers.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { HeliumTransactionStatus } from './types';
|
|
1
|
+
import type { HeliumTransactionStatus, HeliumPurchaseResult } from './types';
|
|
2
2
|
|
|
3
3
|
export interface HeliumCallbacks {
|
|
4
|
-
makePurchase: (productId: string) => Promise<
|
|
4
|
+
makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;
|
|
5
5
|
restorePurchases: () => Promise<boolean>; // Modified to return Promise
|
|
6
6
|
onHeliumPaywallEvent: (event: any) => void;
|
|
7
7
|
}
|
|
@@ -10,9 +10,9 @@ export interface HeliumCallbacks {
|
|
|
10
10
|
export class DemoHeliumCallbacks implements HeliumCallbacks {
|
|
11
11
|
private events: { timestamp: Date; event: any }[] = [];
|
|
12
12
|
|
|
13
|
-
async makePurchase(productId: string): Promise<
|
|
13
|
+
async makePurchase(productId: string): Promise<HeliumPurchaseResult> {
|
|
14
14
|
this.events.push({ timestamp: new Date(), event: { type: 'purchase', productId } });
|
|
15
|
-
return 'completed' as HeliumTransactionStatus;
|
|
15
|
+
return { status: 'completed' as HeliumTransactionStatus };
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
async restorePurchases(): Promise<boolean> {
|
package/src/types.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
export type HeliumTransactionStatus = 'completed' | 'failed' | 'cancelled' | 'pending' | 'restored';
|
|
2
|
+
export type HeliumPurchaseResult = {
|
|
3
|
+
status: HeliumTransactionStatus;
|
|
4
|
+
error?: string; // Optional error message
|
|
5
|
+
};
|
|
2
6
|
export type HeliumDownloadStatus = 'success' | 'failed' | 'inProgress' | 'notStarted';
|
|
3
7
|
|
|
4
8
|
export interface HeliumCallbacks {
|
|
5
|
-
makePurchase: (productId: string) => Promise<
|
|
9
|
+
makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;
|
|
6
10
|
restorePurchases: () => Promise<boolean>;
|
|
7
11
|
onHeliumPaywallEvent: (event: any) => void;
|
|
8
12
|
}
|