// Adding a bookmark to a new folder let bookmark = try await feed.addBookmark(activityId: "activity_123") // Adding to an existing folder let bookmarkWithFolder = try await feed.addBookmark( activityId: "activity_123", request: .init(folderId: "folder_456") ) // Update a bookmark (without a folder initially) - add custom data and move it to a new folder let updatedBookmark = try await feed.updateBookmark( activityId: "activity_123", request: .init( custom: ["color": "blue"], newFolder: .init( custom: ["icon": "π"], name: "New folder name" ) ) ) // Update a bookmark - move it from one existing folder to another existing folder let movedBookmark = try await feed.updateBookmark( activityId: "activity_123", request: .init( folderId: "folder_456", newFolderId: "folder_789" ) )Activity Feeds v3 is in beta β try it out!
Bookmarks
Overview
The API includes built-in support for bookmarking activities. Hereβs a quick example of how to use the bookmark API.
Adding Bookmarks
// Adding a bookmark to a new folder val bookmark: Result<BookmarkData> = feed.addBookmark(activityId = "activity_123") // Adding to an existing folder val bookmarkWithFolder: Result<BookmarkData> = feed.addBookmark( activityId = "activity_123", request = AddBookmarkRequest(folderId = "folder_456") ) // Update a bookmark (without a folder initially) - add custom data and move it to a new folder val updatedBookmark: Result<BookmarkData> = feed.updateBookmark( activityId = "activity_123", request = UpdateBookmarkRequest( custom = mapOf("color" to "blue"), newFolder = AddFolderRequest( custom = mapOf("icon" to "π"), name = "New folder name" ) ) ) // Update a bookmark - move it from one existing folder to another existing folder val movedBookmark: Result<BookmarkData> = feed.updateBookmark( activityId = "activity_123", request = UpdateBookmarkRequest( folderId = "folder_456", newFolderId = "folder_789" ) )// Adding a bookmark to a new folder const bookmark = await client.addBookmark({ activity_id: "activity_123", }); // Adding to an existing folder const bookmarkWithFolder = await client.addBookmark({ activity_id: "activity_123", folder_id: "folder_456", }); // Update a bookmark (without a folder initially) - add custom data and move it to a new folder const updatedBookmark = await client.updateBookmark({ activity_id: "activity_123", folder_id: "<old folder id>", new_folder: { name: "New folder name", custom: { icon: "π", }, }, custom: { color: "blue", }, }); // Update a bookmark - move it from one existing folder to another existing folder const movedBookmark = await client.updateBookmark({ activity_id: "activity_123", folder_id: "<old folder id>", new_folder_id: "<new folder id>", });// Adding a bookmark to a new folder final bookmark = await feed.addBookmark(activityId: 'activity_123'); // Adding to an existing folder final bookmarkWithFolder = await feed.addBookmark( activityId: 'activity_123', request: const AddBookmarkRequest(folderId: 'folder_456'), ); // Update a bookmark (without a folder initially) - add custom data and move it to a new folder final updatedBookmark = await feed.updateBookmark( activityId: 'activity_123', request: const UpdateBookmarkRequest( custom: {'color': 'blue'}, newFolder: AddFolderRequest( custom: {'icon': 'π'}, name: 'New folder name', ), ), ); // Update a bookmark - move it from one existing folder to another existing folder final movedBookmark = await feed.updateBookmark( activityId: 'activity_123', request: const UpdateBookmarkRequest( folderId: 'folder_456', newFolderId: 'folder_789', ), );// Adding a bookmark to a new folder const bookmark = await client.feeds.addBookmark({ activity_id: "activity_123", user_id: "<user_id>", }); // Adding to an existing folder const bookmarkWithFolder = await client.feeds.addBookmark({ activity_id: "activity_123", folder_id: "folder_456", user_id: "<user_id>", }); // Update a bookmark (without a folder initially) - add custom data and move it to a new folder const updatedBookmark = await client.feeds.updateBookmark({ activity_id: "activity_123", folder_id: "<old folder id>", new_folder: { name: "New folder name", custom: { icon: "π", }, }, custom: { color: "blue", }, user_id: "<user_id>", }); // Update a bookmark - move it from one existing folder to another existing folder const movedBookmark = await client.feeds.updateBookmark({ activity_id: "activity_123", folder_id: "<old folder id>", new_folder_id: "<new folder id>", user_id: "<user_id>", });// Adding a bookmark to a new folder _, err = client.Feeds().AddBookmark(context.Background(), activityID, &getstream.AddBookmarkRequest{ UserID: getstream.PtrTo("john"), }) if err != nil { log.Fatal("Error adding bookmark:", err) } // Adding to an existing folder _, err = client.Feeds().AddBookmark(context.Background(), activityID, &getstream.AddBookmarkRequest{ FolderID: getstream.PtrTo("folder_456"), UserID: getstream.PtrTo("john"), }) if err != nil { log.Fatal("Error adding bookmark to folder:", err) } // Update a bookmark (without a folder initially) - add custom data and move it to a new folder _, err = client.Feeds().UpdateBookmark(context.Background(), activityID, &getstream.UpdateBookmarkRequest{ FolderID: getstream.PtrTo("old folder id"), NewFolder: &getstream.AddFolderRequest{ Name: "New folder name", Custom: map[string]any{ "icon": "π", }, }, Custom: map[string]any{ "color": "blue", }, UserID: getstream.PtrTo("john"), }) if err != nil { log.Fatal("Error updating bookmark:", err) } // Update a bookmark - move it from one existing folder to another existing folder _, err = client.Feeds().UpdateBookmark(context.Background(), activityID, &getstream.UpdateBookmarkRequest{ FolderID: getstream.PtrTo("old folder id"), NewFolderID: getstream.PtrTo("new folder id"), UserID: getstream.PtrTo("john"), }) if err != nil { log.Fatal("Error moving bookmark:", err) }AddBookmarkRequest bookmarkRequest = AddBookmarkRequest.builder() .userID(testUserId) .newFolder(AddFolderRequest.builder().name("test-bookmarks1").build()) .build(); AddBookmarkResponse response = feeds.addBookmark(activityId, bookmarkRequest).execute().getData();// Adding a bookmark to a new folder $response = $feedsClient->addBookmark( 'activity_123', new GeneratedModels\AddBookmarkRequest( userID: 'user_123', newFolder: new GeneratedModels\AddFolderRequest(name: 'New folder name') ) ); // Adding to an existing folder $response = $feedsClient->addBookmark( 'activity_123', new GeneratedModels\AddBookmarkRequest( userID: 'user_123', folderID: 'folder_456' ) ); // Update a bookmark (without a folder initially) - add custom data and move it to a new folder $response = $feedsClient->updateBookmark( 'activity_123', new GeneratedModels\UpdateBookmarkRequest( userID: 'user_123', custom: (object)['color' => 'blue'], newFolder: new GeneratedModels\AddFolderRequest( name: 'New folder name', custom: (object)['icon' => 'π'] ) ) ); // Update a bookmark - move it from one existing folder to another existing folder $response = $feedsClient->updateBookmark( 'activity_123', new GeneratedModels\UpdateBookmarkRequest( userID: 'user_123', folderID: 'folder_456', newFolderID: 'folder_789' ) );var response = await _feedsV3Client.AddBookmarkAsync( activityId, new AddBookmarkRequest { UserID = _testUserId, NewFolder = new AddFolderRequest { Name = "test-bookmarks1" } } );response = self.client.feeds.add_bookmark( activity_id, user_id=self.test_user_id, new_folder=AddFolderRequest(name="test-bookmarks1"), )# Adding a bookmark to a new folder bookmark_request = GetStream::Generated::Models::AddBookmarkRequest.new( user_id: 'user123', new_folder: GetStream::Generated::Models::AddFolderRequest.new( name: 'test-bookmarks1' ) ) response = client.feeds.add_bookmark(activity_id, bookmark_request) # Adding to an existing folder bookmark_with_folder_request = GetStream::Generated::Models::AddBookmarkRequest.new( user_id: 'user123', folder_id: 'folder_456' ) response = client.feeds.add_bookmark(activity_id, bookmark_with_folder_request) # Update a bookmark (without a folder initially) - add custom data and move it to a new folder update_request = GetStream::Generated::Models::UpdateBookmarkRequest.new( user_id: 'user123', custom: { color: 'blue' }, new_folder: GetStream::Generated::Models::AddFolderRequest.new( name: 'New folder name', custom: { icon: 'π' } ) ) response = client.feeds.update_bookmark(activity_id, update_request) # Update a bookmark - move it from one existing folder to another existing folder move_request = GetStream::Generated::Models::UpdateBookmarkRequest.new( user_id: 'user123', folder_id: 'folder_456', new_folder_id: 'folder_789' ) response = client.feeds.update_bookmark(activity_id, move_request)Removing Bookmarks
// Removing a bookmark try await feed.deleteBookmark( activityId: "activity_123", folderId: "folder_456" ) // When you read a feed we include the bookmark try await feed.getOrCreate() print(feed.state.activities[0].ownBookmarks)// Removing a bookmark feed.deleteBookmark( activityId = "activity_123", folderId = "folder_456" ) // When you read a feed we include the bookmark feed.getOrCreate() feed.state.activities.collect { activities -> println(activities.first().ownBookmarks) }// Removing a bookmark await client.deleteBookmark({ activity_id: activityId, }); // When you read a feed we include the bookmark const response = await feed.getOrCreate({ watch: true }); console.log(feed.state.getLatestValue().activities?.[0].own_bookmarks); console.log(feed.state.getLatestValue().activities?.[0].bookmark_count);// Removing a bookmark await feed.deleteBookmark(activityId: 'activity_123', folderId: 'folder_456'); // When you read a feed we include the bookmark final feedData = await feed.getOrCreate(); print(feed.state.activities[0].ownBookmarks);// Removing a bookmark await serverClient.feeds.deleteBookmark({ activity_id: activityId, user_id: testUser2.id, }); // When you read a feed we include the bookmark const response = await feed.getOrCreate({ user_id: "sara" }); console.log(results.activities[0].own_bookmarks); console.log(results.activities[0].bookmark_count);_, err = client.Feeds().DeleteBookmark(context.Background(), activityID, &getstream.DeleteBookmarkRequest{ FolderID: getstream.PtrTo(folderID), UserID: getstream.PtrTo("john"), })UpdateBookmarkRequest updateRequest = UpdateBookmarkRequest.builder().folderID(folderID).userID(testUserId).build(); UpdateBookmarkResponse response = feeds.updateBookmark(activityId, updateRequest).execute().getData();// Removing a bookmark $response = $feedsClient->deleteBookmark( 'activity_123', 'folder_456', 'user_123' ); // When you read a feed we include the bookmark $feedResponse = $feedsClient->getOrCreateFeed('user', 'user_123', new GeneratedModels\GetOrCreateFeedRequest( userID: 'user_123' )); $activities = $feedResponse->getData()->activities; echo $activities[0]['own_bookmarks']; echo $activities[0]['bookmark_count'];var response = await _feedsV3Client.UpdateBookmarkAsync( activityId, new UpdateBookmarkRequest { UserID = _testUserId, FolderID = folderId // Use existing folder ID, not create new folder } );bookmark_data = bookmark_response.data folder_id = bookmark_data.bookmark.folder.id response = self.client.feeds.update_bookmark( activity_id, folder_id=folder_id, user_id=self.test_user_id )# Removing a bookmark response = client.feeds.delete_bookmark(activity_id, folder_id, 'user123') # When you read a feed we include the bookmark feed_response = client.feeds.get_or_create('user', 'user123') puts feed_response.activities[0].own_bookmarks puts feed_response.activities[0].bookmark_countQuerying Bookmarks
// Query bookmarks let query = BookmarksQuery(limit: 5) let bookmarkList = client.bookmarkList(for: query) let page1 = try await bookmarkList.get() // Get next page let page2 = try await bookmarkList.queryMoreBookmarks(limit: 3) // Query by activity ID let activityBookmarkList = client.bookmarkList( for: .init( filter: .equal(.activityId, "activity_123") ) ) let activityBookmarks = try await activityBookmarkList.get() // Query by folder ID let folderBookmarkList = client.bookmarkList( for: .init( filter: .equal(.folderId, "folder_456") ) ) let folderBookmarks = try await folderBookmarkList.get()// Query bookmarks val query = BookmarksQuery(limit = 5) val bookmarkList = client.bookmarkList(query = query) val page1: Result<List<BookmarkData>> = bookmarkList.get() // Get next page val page2: Result<List<BookmarkData>> = bookmarkList.queryMoreBookmarks(limit = 3) // Query by activity ID val activityBookmarkList = client.bookmarkList( query = BookmarksQuery( filter = BookmarksFilterField.activityId.equal("activity_123") ) ) val activityBookmarks: Result<List<BookmarkData>> = activityBookmarkList.get() // Query by folder ID val folderBookmarkList = client.bookmarkList( query = BookmarksQuery( filter = BookmarksFilterField.folderId.equal("folder_456") ) ) val folderBookmarks: Result<List<BookmarkData>> = folderBookmarkList.get()// Query bookmarks const firstPage = await client.queryBookmarks({ limit: 2, }); // Get next page const secondPage = await client.queryBookmarks({ limit: 2, next: firstPage.next, }); // Query by activity ID const response = await client.queryBookmarks({ filter: { activity_id: "activity_123", }, }); // Query by folder ID const response = await client.queryBookmarks({ filter: { folder_id: "folder_456", }, });// Query bookmarks const query = BookmarksQuery(limit: 5); final bookmarkList = client.bookmarkList(query); final page1 = await bookmarkList.get(); // Get next page final page2 = await bookmarkList.queryMoreBookmarks(limit: 3); // Query by activity ID final activityBookmarkList = client.bookmarkList( const BookmarksQuery( filter: Filter.equal(BookmarksFilterField.activityId, 'activity_123'), ), ); final activityBookmarks = await activityBookmarkList.get(); // Query by folder ID final folderBookmarkList = client.bookmarkList( const BookmarksQuery( filter: Filter.equal(BookmarksFilterField.folderId, 'folder_456'), ), ); final folderBookmarks = await folderBookmarkList.get();// Query bookmarks const firstPage = await client.feeds.queryBookmarks({ filter: { user_id: "<user id>", }, limit: 2, }); // Get next page const secondPage = await client.feeds.queryBookmarks({ filter: { user_id: "<user id>", }, limit: 2, next: firstPage.next, }); // Query by activity ID const response = await client.feeds.queryBookmarks({ filter: { user_id: "<user id>", activity_id: "activity_123", }, }); // Query by folder ID const response = await client.feeds.queryBookmarks({ filter: { user_id: "<user id>", folder_id: "folder_456", }, });// Query bookmarks firstPage, err := client.Feeds().QueryBookmarks(context.Background(), &getstream.QueryBookmarksRequest{ Filter: map[string]any{ "user_id": "john", }, Limit: getstream.PtrTo(2), }) if err != nil { log.Fatal("Error querying bookmarks:", err) } // Get next page _, err = client.Feeds().QueryBookmarks(context.Background(), &getstream.QueryBookmarksRequest{ Filter: map[string]any{ "user_id": "john", }, Limit: getstream.PtrTo(2), Next: firstPage.Data.Next, }) if err != nil { log.Fatal("Error querying next page bookmarks:", err) } // Query by activity ID _, err = client.Feeds().QueryBookmarks(context.Background(), &getstream.QueryBookmarksRequest{ Filter: map[string]any{ "user_id": "john", "activity_id": activityID, }, }) if err != nil { log.Fatal("Error querying bookmarks by activity ID:", err) } // Query by folder ID _, err = client.Feeds().QueryBookmarks(context.Background(), &getstream.QueryBookmarksRequest{ Filter: map[string]any{ "user_id": "john", "folder_id": folderID, }, }) if err != nil { log.Fatal("Error querying bookmarks by folder ID:", err) }Map<String, Object> filter = new HashMap<>(); filter.put("user_id", testUserId); QueryBookmarksRequest request = QueryBookmarksRequest.builder().limit(10).filter(filter).build(); QueryBookmarksResponse response = feeds.queryBookmarks(request).execute().getData();// Query bookmarks $firstPage = $feedsClient->queryBookmarks( new GeneratedModels\QueryBookmarksRequest( limit: 2, filter: (object)['user_id' => 'user_123'] ) ); // Get next page $secondPage = $feedsClient->queryBookmarks( new GeneratedModels\QueryBookmarksRequest( limit: 2, next: $firstPage->getData()->next, filter: (object)['user_id' => 'user_123'] ) ); // Query by activity ID $response = $feedsClient->queryBookmarks( new GeneratedModels\QueryBookmarksRequest( filter: (object)[ 'user_id' => 'user_123', 'activity_id' => 'activity_123' ] ) ); // Query by folder ID $response = $feedsClient->queryBookmarks( new GeneratedModels\QueryBookmarksRequest( filter: (object)[ 'user_id' => 'user_123', 'folder_id' => 'folder_456' ] ) );var response = await _feedsV3Client.QueryBookmarksAsync( new QueryBookmarksRequest { Limit = 10, Filter = new Dictionary<string, object> { ["user_id"] = _testUserId } } );response = self.client.feeds.query_bookmarks( limit=10, filter={"user_id": self.test_user_id} )# Query bookmarks query_request = GetStream::Generated::Models::QueryBookmarksRequest.new( limit: 10, filter: { user_id: 'user123' } ) response = client.feeds.query_bookmarks(query_request) # Query by activity ID activity_query_request = GetStream::Generated::Models::QueryBookmarksRequest.new( filter: { user_id: 'user123', activity_id: 'activity_123' } ) response = client.feeds.query_bookmarks(activity_query_request) # Query by folder ID folder_query_request = GetStream::Generated::Models::QueryBookmarksRequest.new( filter: { user_id: 'user123', folder_id: 'folder_456' } ) response = client.feeds.query_bookmarks(folder_query_request)Bookmarks Queryable Built-In Fields
| name | type | description | supported operations | example |
|---|---|---|---|---|
user_id | string or list of strings | The ID of the user who owns the bookmark | $in, $eq | { user_id: { $eq: 'user_123' } } |
activity_id | string or list of strings | The ID of the activity that was bookmarked | $in, $eq | { activity_id: { $eq: 'activity_123' } } |
folder_id | string or list of strings | The ID of the folder containing the bookmark | $eq, $in, $exists | { folder_id: { $exists: true } } |
created_at | string, must be formatted as an RFC3339 timestamp | The time the bookmark was created | $eq, $gt, $gte, $lt, $lte | { created_at: { $gte: '2023-12-04T09:30:20.45Z' } } |
updated_at | string, must be formatted as an RFC3339 timestamp | The time the bookmark was last updated | $eq, $gt, $gte, $lt, $lte | { updated_at: { $gte: '2023-12-04T09:30:20.45Z' } } |
Querying Bookmark Folders
// Query bookmark folders let query = BookmarkFoldersQuery(limit: 5) let bookmarkFolderList = client.bookmarkFolderList(for: query) let page1 = try await bookmarkFolderList.get() // Get next page let page2 = try await bookmarkFolderList.queryMoreBookmarkFolders(limit: 3) // Query by folder name (partial matching) let projectFolderList = client.bookmarkFolderList( for: .init( filter: .contains(.folderName, "project") ) ) let projectFolders = try await projectFolderList.get()// Query bookmark folders val query = BookmarkFoldersQuery(limit = 5) val bookmarkFolderList = client.bookmarkFolderList(query = query) val page1: Result<List<BookmarkFolderData>> = bookmarkFolderList.get() // Get next page val page2: Result<List<BookmarkFolderData>> = bookmarkFolderList.queryMoreBookmarkFolders(limit = 3) // Query by folder name (partial matching) val projectFolderList = client.bookmarkFolderList( query = BookmarkFoldersQuery( filter = BookmarkFoldersFilterField.folderName.contains("project") ) ) val projectFolders: Result<List<BookmarkFolderData>> = projectFolderList.get()// Query bookmark folders const firstPage = await client.queryBookmarkFolders({ limit: 2, }); // Get next page const secondPage = await client.queryBookmarkFolders({ limit: 2, next: firstPage.next, }); const response = await client.queryBookmarkFolders({ filter: { folder_name: { $contains: "project", }, }, limit: 2, next: firstPage.next, });// Query bookmark folders const query = BookmarkFoldersQuery(limit: 5); final bookmarkFolderList = client.bookmarkFolderList(query); final page1 = await bookmarkFolderList.get(); // Get next page final page2 = await bookmarkFolderList.queryMoreBookmarkFolders(limit: 3); // Query by folder name (partial matching) final projectFolderList = client.bookmarkFolderList( const BookmarkFoldersQuery( filter: Filter.contains(BookmarkFoldersFilterField.name, 'project'), ), ); final projectFolders = await projectFolderList.get();// Query bookmark folders const firstPage = await client.feeds.queryBookmarkFolders({ filter: { user_id: '<user id>' }, limit: 2 }); // Get next page const secondPage = await client.feeds.queryBookmarkFolders({ filter: { user_id: '<user id>' } limit: 2, next: firstPage.next, }); const response = await client.feeds.queryBookmarkFolders({ filter: { user_id: '<user id>', folder_name: { $contains: 'project' } }, limit: 2, next: firstPage.next, });// Query bookmark folders firstPage, err := client.Feeds().QueryBookmarkFolders(context.Background(), &getstream.QueryBookmarkFoldersRequest{ Filter: map[string]any{ "user_id": "<user id>", }, Limit: getstream.PtrTo(2), }) if err != nil { log.Fatal("Error querying bookmark folders:", err) } // Get next page _, err = client.Feeds().QueryBookmarkFolders(context.Background(), &getstream.QueryBookmarkFoldersRequest{ Filter: map[string]any{ "user_id": "<user id>", }, Limit: getstream.PtrTo(2), Next: firstPage.Data.Next, }) if err != nil { log.Fatal("Error querying bookmark folders second page:", err) } // Query with folder name filter _, err = client.Feeds().QueryBookmarkFolders(context.Background(), &getstream.QueryBookmarkFoldersRequest{ Filter: map[string]any{ "user_id": "<user id>", "folder_name": map[string]any{ "$contains": "project", }, }, Limit: getstream.PtrTo(2), Next: firstPage.Data.Next, }) if err != nil { log.Fatal("Error querying bookmark folders with filter:", err) }Map<String, Object> filter = new HashMap<>(); filter.put("user_id", testUserId); QueryBookmarksRequest request = QueryBookmarksRequest.builder().limit(10).filter(filter).build(); QueryBookmarksResponse response = feeds.queryBookmarks(request).execute().getData();// Query bookmark folders $firstPage = $feedsClient->queryBookmarkFolders( new GeneratedModels\QueryBookmarkFoldersRequest( limit: 2, filter: (object)['user_id' => 'user_123'] ) ); // Get next page $secondPage = $feedsClient->queryBookmarkFolders( new GeneratedModels\QueryBookmarkFoldersRequest( limit: 2, next: $firstPage->getData()->next, filter: (object)['user_id' => 'user_123'] ) ); // Query by folder name (partial matching) $response = $feedsClient->queryBookmarkFolders( new GeneratedModels\QueryBookmarkFoldersRequest( filter: (object)[ 'user_id' => 'user_123', 'folder_name' => [ '$contains' => 'project' ] ], limit: 2 ) );var response = await _feedsV3Client.QueryBookmarksAsync( new QueryBookmarksRequest { Limit = 10, Filter = new Dictionary<string, object> { ["user_id"] = _testUserId } } );response = self.client.feeds.query_bookmarks( limit=10, filter={"user_id": self.test_user_id} )# Query bookmarks query_request = GetStream::Generated::Models::QueryBookmarksRequest.new( limit: 10, filter: { user_id: 'user123' } ) response = client.feeds.query_bookmarks(query_request) # Query by activity ID activity_query_request = GetStream::Generated::Models::QueryBookmarksRequest.new( filter: { user_id: 'user123', activity_id: 'activity_123' } ) response = client.feeds.query_bookmarks(activity_query_request) # Query by folder ID folder_query_request = GetStream::Generated::Models::QueryBookmarksRequest.new( filter: { user_id: 'user123', folder_id: 'folder_456' } ) response = client.feeds.query_bookmarks(folder_query_request)Bookmark Folders Queryable Built-In Fields
| name | type | description | supported operations | example |
|---|---|---|---|---|
user_id | string or list of strings | The ID of the user who owns the folder | $in, $eq | { user_id: { $eq: 'user_123' } } |
folder_name | string or list of strings | The name of the bookmark folder | $eq, $in, $contains | { folder_name: { $contains: 'work' } } |
created_at | string, must be formatted as an RFC3339 timestamp | The time the folder was created | $eq, $gt, $gte, $lt, $lte | { created_at: { $gte: '2023-12-04T09:30:20.45Z' } } |
updated_at | string, must be formatted as an RFC3339 timestamp | The time the folder was last updated | $eq, $gt, $gte, $lt, $lte | { updated_at: { $gte: '2023-12-04T09:30:20.45Z' } } |