Skip to content

Commit 13f362f

Browse files
authored
Rename PSQLFrontendMessage to PostgresFrontendMessage (vapor#239)
1 parent 5dade1c commit 13f362f

30 files changed

+99
-99
lines changed

Sources/PostgresNIO/New/BufferedMessageEncoder.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct BufferedMessageEncoder {
1515
self.encoder = encoder
1616
}
1717

18-
mutating func encode(_ message: PSQLFrontendMessage) {
18+
mutating func encode(_ message: PostgresFrontendMessage) {
1919
switch self.state {
2020
case .flushed:
2121
self.state = .writable

Sources/PostgresNIO/New/Extensions/ByteBuffer+PSQL.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ internal extension ByteBuffer {
66
self.writeInteger(messageID.rawValue)
77
}
88

9-
mutating func psqlWriteFrontendMessageID(_ messageID: PSQLFrontendMessage.ID) {
9+
mutating func psqlWriteFrontendMessageID(_ messageID: PostgresFrontendMessage.ID) {
1010
self.writeInteger(messageID.rawValue)
1111
}
1212

Sources/PostgresNIO/New/Messages/Bind.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
struct Bind: PSQLMessagePayloadEncodable, Equatable {
66
/// The name of the destination portal (an empty string selects the unnamed portal).

Sources/PostgresNIO/New/Messages/Cancel.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
struct Cancel: PSQLMessagePayloadEncodable, Equatable {
66
/// The cancel request code. The value is chosen to contain 1234 in the most significant 16 bits,

Sources/PostgresNIO/New/Messages/Close.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
enum Close: PSQLMessagePayloadEncodable, Equatable {
66
case preparedStatement(String)

Sources/PostgresNIO/New/Messages/Describe.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
enum Describe: PSQLMessagePayloadEncodable, Equatable {
66

Sources/PostgresNIO/New/Messages/Execute.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
struct Execute: PSQLMessagePayloadEncodable, Equatable {
66
/// The name of the portal to execute (an empty string selects the unnamed portal).

Sources/PostgresNIO/New/Messages/Parse.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
struct Parse: PSQLMessagePayloadEncodable, Equatable {
66
/// The name of the destination prepared statement (an empty string selects the unnamed prepared statement).

Sources/PostgresNIO/New/Messages/Password.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
struct Password: PSQLMessagePayloadEncodable, Equatable {
66
let value: String

Sources/PostgresNIO/New/Messages/SASLInitialResponse.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
struct SASLInitialResponse: PSQLMessagePayloadEncodable, Equatable {
66

Sources/PostgresNIO/New/Messages/SASLResponse.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44

55
struct SASLResponse: PSQLMessagePayloadEncodable, Equatable {
66

Sources/PostgresNIO/New/Messages/SSLRequest.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44
/// A message asking the PostgreSQL server if TLS is supported
55
/// For more info, see https://www.postgresql.org/docs/10/static/protocol-flow.html#id-1.10.5.7.11
66
struct SSLRequest: PSQLMessagePayloadEncodable, Equatable {

Sources/PostgresNIO/New/Messages/Startup.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import NIOCore
22

3-
extension PSQLFrontendMessage {
3+
extension PostgresFrontendMessage {
44
struct Startup: PSQLMessagePayloadEncodable, Equatable {
55

66
/// Creates a `Startup` with "3.0" as the protocol version.

Sources/PostgresNIO/New/PSQLChannelHandler.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ final class PSQLChannelHandler: ChannelDuplexHandler {
398398
context: ChannelHandlerContext)
399399
{
400400
precondition(self.rowStream == nil, "Expected to not have an open stream at this point")
401-
let parse = PSQLFrontendMessage.Parse(
401+
let parse = PostgresFrontendMessage.Parse(
402402
preparedStatementName: statementName,
403403
query: query,
404404
parameters: [])
@@ -413,7 +413,7 @@ final class PSQLChannelHandler: ChannelDuplexHandler {
413413
executeStatement: PSQLExecuteStatement,
414414
context: ChannelHandlerContext
415415
) {
416-
let bind = PSQLFrontendMessage.Bind(
416+
let bind = PostgresFrontendMessage.Bind(
417417
portalName: "",
418418
preparedStatementName: executeStatement.name,
419419
bind: executeStatement.binds)
@@ -430,11 +430,11 @@ final class PSQLChannelHandler: ChannelDuplexHandler {
430430
{
431431
precondition(self.rowStream == nil, "Expected to not have an open stream at this point")
432432
let unnamedStatementName = ""
433-
let parse = PSQLFrontendMessage.Parse(
433+
let parse = PostgresFrontendMessage.Parse(
434434
preparedStatementName: unnamedStatementName,
435435
query: query.sql,
436436
parameters: query.binds.metadata.map(\.dataType))
437-
let bind = PSQLFrontendMessage.Bind(
437+
let bind = PostgresFrontendMessage.Bind(
438438
portalName: "",
439439
preparedStatementName: unnamedStatementName,
440440
bind: query.binds)
@@ -528,8 +528,8 @@ extension PSQLConnection.Configuration.Authentication {
528528
}
529529

530530
extension AuthContext {
531-
func toStartupParameters() -> PSQLFrontendMessage.Startup.Parameters {
532-
PSQLFrontendMessage.Startup.Parameters(
531+
func toStartupParameters() -> PostgresFrontendMessage.Startup.Parameters {
532+
PostgresFrontendMessage.Startup.Parameters(
533533
user: self.username,
534534
database: self.database,
535535
options: nil,

Sources/PostgresNIO/New/PSQLFrontendMessageEncoder.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11

22
struct PSQLFrontendMessageEncoder: MessageToByteEncoder {
3-
typealias OutboundIn = PSQLFrontendMessage
3+
typealias OutboundIn = PostgresFrontendMessage
44

55
init() {}
66

7-
func encode(data message: PSQLFrontendMessage, out buffer: inout ByteBuffer) {
7+
func encode(data message: PostgresFrontendMessage, out buffer: inout ByteBuffer) {
88
switch message {
99
case .bind(let bind):
1010
buffer.writeInteger(message.id.rawValue)
@@ -63,7 +63,7 @@ struct PSQLFrontendMessageEncoder: MessageToByteEncoder {
6363
}
6464

6565
private func encode<Payload: PSQLMessagePayloadEncodable>(
66-
messageID: PSQLFrontendMessage.ID,
66+
messageID: PostgresFrontendMessage.ID,
6767
payload: Payload,
6868
into buffer: inout ByteBuffer)
6969
{

Sources/PostgresNIO/New/PSQLFrontendMessage.swift renamed to Sources/PostgresNIO/New/PostgresFrontendMessage.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import NIOCore
44
///
55
/// All messages are defined in the official Postgres Documentation in the section
66
/// [Frontend/Backend Protocol – Message Formats](https://www.postgresql.org/docs/13/protocol-message-formats.html)
7-
enum PSQLFrontendMessage: Equatable {
7+
enum PostgresFrontendMessage: Equatable {
88
case bind(Bind)
99
case cancel(Cancel)
1010
case close(Close)
@@ -92,7 +92,7 @@ enum PSQLFrontendMessage: Equatable {
9292
}
9393
}
9494

95-
extension PSQLFrontendMessage {
95+
extension PostgresFrontendMessage {
9696

9797
var id: ID {
9898
switch self {

Tests/PostgresNIOTests/New/Extensions/PSQLFrontendMessageDecoder.swift

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
@testable import PostgresNIO
22

33
struct PSQLFrontendMessageDecoder: NIOSingleStepByteToMessageDecoder {
4-
typealias InboundOut = PSQLFrontendMessage
4+
typealias InboundOut = PostgresFrontendMessage
55

66
private(set) var isInStartup: Bool
77

88
init() {
99
self.isInStartup = true
1010
}
1111

12-
mutating func decode(buffer: inout ByteBuffer) throws -> PSQLFrontendMessage? {
12+
mutating func decode(buffer: inout ByteBuffer) throws -> PostgresFrontendMessage? {
1313
// make sure we have at least one byte to read
1414
guard buffer.readableBytes > 0 else {
1515
return nil
@@ -58,14 +58,14 @@ struct PSQLFrontendMessageDecoder: NIOSingleStepByteToMessageDecoder {
5858
}
5959
}
6060

61-
let parameters = PSQLFrontendMessage.Startup.Parameters(
61+
let parameters = PostgresFrontendMessage.Startup.Parameters(
6262
user: user!,
6363
database: database,
6464
options: options,
6565
replication: .false
6666
)
6767

68-
let startup = PSQLFrontendMessage.Startup(
68+
let startup = PostgresFrontendMessage.Startup(
6969
protocolVersion: 0x00_03_00_00,
7070
parameters: parameters
7171
)
@@ -95,7 +95,7 @@ struct PSQLFrontendMessageDecoder: NIOSingleStepByteToMessageDecoder {
9595
}
9696

9797
// 2. make sure we have a known message identifier
98-
guard let messageID = PSQLFrontendMessage.ID(rawValue: idByte) else {
98+
guard let messageID = PostgresFrontendMessage.ID(rawValue: idByte) else {
9999
throw PSQLDecodingError.unknownMessageIDReceived(messageID: idByte, messageBytes: completeMessageBuffer)
100100
}
101101

@@ -106,22 +106,22 @@ struct PSQLFrontendMessageDecoder: NIOSingleStepByteToMessageDecoder {
106106
// move reader index forward by five bytes
107107
slice.moveReaderIndex(forwardBy: 5)
108108

109-
return try PSQLFrontendMessage.decode(from: &slice, for: messageID)
109+
return try PostgresFrontendMessage.decode(from: &slice, for: messageID)
110110
} catch let error as PSQLPartialDecodingError {
111111
throw PSQLDecodingError.withPartialError(error, messageID: messageID.rawValue, messageBytes: completeMessageBuffer)
112112
} catch {
113113
preconditionFailure("Expected to only see `PartialDecodingError`s here.")
114114
}
115115
}
116116

117-
mutating func decodeLast(buffer: inout ByteBuffer, seenEOF: Bool) throws -> PSQLFrontendMessage? {
117+
mutating func decodeLast(buffer: inout ByteBuffer, seenEOF: Bool) throws -> PostgresFrontendMessage? {
118118
try self.decode(buffer: &buffer)
119119
}
120120
}
121121

122-
extension PSQLFrontendMessage {
122+
extension PostgresFrontendMessage {
123123

124-
static func decode(from buffer: inout ByteBuffer, for messageID: ID) throws -> PSQLFrontendMessage {
124+
static func decode(from buffer: inout ByteBuffer, for messageID: ID) throws -> PostgresFrontendMessage {
125125
switch messageID {
126126
case .bind:
127127
preconditionFailure("TODO: Unimplemented")

Tests/PostgresNIOTests/New/Messages/BindTests.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ class BindTests: XCTestCase {
1010
XCTAssertNoThrow(try bindings.append("Hello", context: .default))
1111
XCTAssertNoThrow(try bindings.append("World", context: .default))
1212
var byteBuffer = ByteBuffer()
13-
let bind = PSQLFrontendMessage.Bind(portalName: "", preparedStatementName: "", bind: bindings)
14-
let message = PSQLFrontendMessage.bind(bind)
13+
let bind = PostgresFrontendMessage.Bind(portalName: "", preparedStatementName: "", bind: bindings)
14+
let message = PostgresFrontendMessage.bind(bind)
1515
encoder.encode(data: message, out: &byteBuffer)
1616

1717
XCTAssertEqual(byteBuffer.readableBytes, 37)
18-
XCTAssertEqual(PSQLFrontendMessage.ID.bind.rawValue, byteBuffer.readInteger(as: UInt8.self))
18+
XCTAssertEqual(PostgresFrontendMessage.ID.bind.rawValue, byteBuffer.readInteger(as: UInt8.self))
1919
XCTAssertEqual(byteBuffer.readInteger(as: Int32.self), 36)
2020
XCTAssertEqual("", byteBuffer.readNullTerminatedString())
2121
XCTAssertEqual("", byteBuffer.readNullTerminatedString())

Tests/PostgresNIOTests/New/Messages/CancelTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ class CancelTests: XCTestCase {
77
func testEncodeCancel() {
88
let encoder = PSQLFrontendMessageEncoder()
99
var byteBuffer = ByteBuffer()
10-
let cancel = PSQLFrontendMessage.Cancel(processID: 1234, secretKey: 4567)
11-
let message = PSQLFrontendMessage.cancel(cancel)
10+
let cancel = PostgresFrontendMessage.Cancel(processID: 1234, secretKey: 4567)
11+
let message = PostgresFrontendMessage.cancel(cancel)
1212
encoder.encode(data: message, out: &byteBuffer)
1313

1414
XCTAssertEqual(byteBuffer.readableBytes, 16)

Tests/PostgresNIOTests/New/Messages/CloseTests.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ class CloseTests: XCTestCase {
77
func testEncodeClosePortal() {
88
let encoder = PSQLFrontendMessageEncoder()
99
var byteBuffer = ByteBuffer()
10-
let message = PSQLFrontendMessage.close(.portal("Hello"))
10+
let message = PostgresFrontendMessage.close(.portal("Hello"))
1111
encoder.encode(data: message, out: &byteBuffer)
1212

1313
XCTAssertEqual(byteBuffer.readableBytes, 12)
14-
XCTAssertEqual(PSQLFrontendMessage.ID.close.rawValue, byteBuffer.readInteger(as: UInt8.self))
14+
XCTAssertEqual(PostgresFrontendMessage.ID.close.rawValue, byteBuffer.readInteger(as: UInt8.self))
1515
XCTAssertEqual(11, byteBuffer.readInteger(as: Int32.self))
1616
XCTAssertEqual(UInt8(ascii: "P"), byteBuffer.readInteger(as: UInt8.self))
1717
XCTAssertEqual("Hello", byteBuffer.readNullTerminatedString())
@@ -21,11 +21,11 @@ class CloseTests: XCTestCase {
2121
func testEncodeCloseUnnamedStatement() {
2222
let encoder = PSQLFrontendMessageEncoder()
2323
var byteBuffer = ByteBuffer()
24-
let message = PSQLFrontendMessage.close(.preparedStatement(""))
24+
let message = PostgresFrontendMessage.close(.preparedStatement(""))
2525
encoder.encode(data: message, out: &byteBuffer)
2626

2727
XCTAssertEqual(byteBuffer.readableBytes, 7)
28-
XCTAssertEqual(PSQLFrontendMessage.ID.close.rawValue, byteBuffer.readInteger(as: UInt8.self))
28+
XCTAssertEqual(PostgresFrontendMessage.ID.close.rawValue, byteBuffer.readInteger(as: UInt8.self))
2929
XCTAssertEqual(6, byteBuffer.readInteger(as: Int32.self))
3030
XCTAssertEqual(UInt8(ascii: "S"), byteBuffer.readInteger(as: UInt8.self))
3131
XCTAssertEqual("", byteBuffer.readNullTerminatedString())

Tests/PostgresNIOTests/New/Messages/DescribeTests.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ class DescribeTests: XCTestCase {
77
func testEncodeDescribePortal() {
88
let encoder = PSQLFrontendMessageEncoder()
99
var byteBuffer = ByteBuffer()
10-
let message = PSQLFrontendMessage.describe(.portal("Hello"))
10+
let message = PostgresFrontendMessage.describe(.portal("Hello"))
1111
encoder.encode(data: message, out: &byteBuffer)
1212

1313
XCTAssertEqual(byteBuffer.readableBytes, 12)
14-
XCTAssertEqual(PSQLFrontendMessage.ID.describe.rawValue, byteBuffer.readInteger(as: UInt8.self))
14+
XCTAssertEqual(PostgresFrontendMessage.ID.describe.rawValue, byteBuffer.readInteger(as: UInt8.self))
1515
XCTAssertEqual(11, byteBuffer.readInteger(as: Int32.self))
1616
XCTAssertEqual(UInt8(ascii: "P"), byteBuffer.readInteger(as: UInt8.self))
1717
XCTAssertEqual("Hello", byteBuffer.readNullTerminatedString())
@@ -21,11 +21,11 @@ class DescribeTests: XCTestCase {
2121
func testEncodeDescribeUnnamedStatement() {
2222
let encoder = PSQLFrontendMessageEncoder()
2323
var byteBuffer = ByteBuffer()
24-
let message = PSQLFrontendMessage.describe(.preparedStatement(""))
24+
let message = PostgresFrontendMessage.describe(.preparedStatement(""))
2525
encoder.encode(data: message, out: &byteBuffer)
2626

2727
XCTAssertEqual(byteBuffer.readableBytes, 7)
28-
XCTAssertEqual(PSQLFrontendMessage.ID.describe.rawValue, byteBuffer.readInteger(as: UInt8.self))
28+
XCTAssertEqual(PostgresFrontendMessage.ID.describe.rawValue, byteBuffer.readInteger(as: UInt8.self))
2929
XCTAssertEqual(6, byteBuffer.readInteger(as: Int32.self))
3030
XCTAssertEqual(UInt8(ascii: "S"), byteBuffer.readInteger(as: UInt8.self))
3131
XCTAssertEqual("", byteBuffer.readNullTerminatedString())

Tests/PostgresNIOTests/New/Messages/ExecuteTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ class ExecuteTests: XCTestCase {
77
func testEncodeExecute() {
88
let encoder = PSQLFrontendMessageEncoder()
99
var byteBuffer = ByteBuffer()
10-
let message = PSQLFrontendMessage.execute(.init(portalName: "", maxNumberOfRows: 0))
10+
let message = PostgresFrontendMessage.execute(.init(portalName: "", maxNumberOfRows: 0))
1111
encoder.encode(data: message, out: &byteBuffer)
1212

1313
XCTAssertEqual(byteBuffer.readableBytes, 10) // 1 (id) + 4 (length) + 1 (empty null terminated string) + 4 (count)
14-
XCTAssertEqual(PSQLFrontendMessage.ID.execute.rawValue, byteBuffer.readInteger(as: UInt8.self))
14+
XCTAssertEqual(PostgresFrontendMessage.ID.execute.rawValue, byteBuffer.readInteger(as: UInt8.self))
1515
XCTAssertEqual(9, byteBuffer.readInteger(as: Int32.self)) // length
1616
XCTAssertEqual("", byteBuffer.readNullTerminatedString())
1717
XCTAssertEqual(0, byteBuffer.readInteger(as: Int32.self))

Tests/PostgresNIOTests/New/Messages/ParseTests.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ class ParseTests: XCTestCase {
77
func testEncode() {
88
let encoder = PSQLFrontendMessageEncoder()
99
var byteBuffer = ByteBuffer()
10-
let parse = PSQLFrontendMessage.Parse(
10+
let parse = PostgresFrontendMessage.Parse(
1111
preparedStatementName: "test",
1212
query: "SELECT version()",
1313
parameters: [.bool, .int8, .bytea, .varchar, .text, .uuid, .json, .jsonbArray])
14-
let message = PSQLFrontendMessage.parse(parse)
14+
let message = PostgresFrontendMessage.parse(parse)
1515
encoder.encode(data: message, out: &byteBuffer)
1616

1717
let length: Int = 1 + 4 + (parse.preparedStatementName.count + 1) + (parse.query.count + 1) + 2 + parse.parameters.count * 4
@@ -22,7 +22,7 @@ class ParseTests: XCTestCase {
2222
// + 1 query ()
2323

2424
XCTAssertEqual(byteBuffer.readableBytes, length)
25-
XCTAssertEqual(byteBuffer.readInteger(as: UInt8.self), PSQLFrontendMessage.ID.parse.rawValue)
25+
XCTAssertEqual(byteBuffer.readInteger(as: UInt8.self), PostgresFrontendMessage.ID.parse.rawValue)
2626
XCTAssertEqual(byteBuffer.readInteger(as: Int32.self), Int32(length - 1))
2727
XCTAssertEqual(byteBuffer.readNullTerminatedString(), parse.preparedStatementName)
2828
XCTAssertEqual(byteBuffer.readNullTerminatedString(), parse.query)

Tests/PostgresNIOTests/New/Messages/PasswordTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ class PasswordTests: XCTestCase {
88
let encoder = PSQLFrontendMessageEncoder()
99
var byteBuffer = ByteBuffer()
1010
// md522d085ed8dc3377968dc1c1a40519a2a = "abc123" with salt 1, 2, 3, 4
11-
let message = PSQLFrontendMessage.password(.init(value: "md522d085ed8dc3377968dc1c1a40519a2a"))
11+
let message = PostgresFrontendMessage.password(.init(value: "md522d085ed8dc3377968dc1c1a40519a2a"))
1212
encoder.encode(data: message, out: &byteBuffer)
1313

1414
let expectedLength = 41 // 1 (id) + 4 (length) + 35 (string) + 1 (null termination)
1515

1616
XCTAssertEqual(byteBuffer.readableBytes, expectedLength)
17-
XCTAssertEqual(byteBuffer.readInteger(as: UInt8.self), PSQLFrontendMessage.ID.password.rawValue)
17+
XCTAssertEqual(byteBuffer.readInteger(as: UInt8.self), PostgresFrontendMessage.ID.password.rawValue)
1818
XCTAssertEqual(byteBuffer.readInteger(as: Int32.self), Int32(expectedLength - 1)) // length
1919
XCTAssertEqual(byteBuffer.readNullTerminatedString(), "md522d085ed8dc3377968dc1c1a40519a2a")
2020
}

0 commit comments

Comments
 (0)