github.com/livekit/protocol@v1.39.3/rpc/ingress.psrpc.go (about) 1 // Code generated by protoc-gen-psrpc v0.6.0, DO NOT EDIT. 2 // source: rpc/ingress.proto 3 4 package rpc 5 6 import ( 7 "context" 8 9 "github.com/livekit/psrpc" 10 "github.com/livekit/psrpc/pkg/client" 11 "github.com/livekit/psrpc/pkg/info" 12 "github.com/livekit/psrpc/pkg/rand" 13 "github.com/livekit/psrpc/pkg/server" 14 "github.com/livekit/psrpc/version" 15 ) 16 import google_protobuf "google.golang.org/protobuf/types/known/emptypb" 17 import livekit5 "github.com/livekit/protocol/livekit" 18 19 var _ = version.PsrpcVersion_0_6 20 21 // ================================ 22 // IngressInternal Client Interface 23 // ================================ 24 25 type IngressInternalClient interface { 26 StartIngress(ctx context.Context, req *StartIngressRequest, opts ...psrpc.RequestOption) (*livekit5.IngressInfo, error) 27 28 ListActiveIngress(ctx context.Context, topic string, req *ListActiveIngressRequest, opts ...psrpc.RequestOption) (<-chan *psrpc.Response[*ListActiveIngressResponse], error) 29 30 KillIngressSession(ctx context.Context, ingressId string, resourceId string, req *KillIngressSessionRequest, opts ...psrpc.RequestOption) (*google_protobuf.Empty, error) 31 32 // Close immediately, without waiting for pending RPCs 33 Close() 34 } 35 36 // ==================================== 37 // IngressInternal ServerImpl Interface 38 // ==================================== 39 40 type IngressInternalServerImpl interface { 41 StartIngress(context.Context, *StartIngressRequest) (*livekit5.IngressInfo, error) 42 StartIngressAffinity(context.Context, *StartIngressRequest) float32 43 44 ListActiveIngress(context.Context, *ListActiveIngressRequest) (*ListActiveIngressResponse, error) 45 46 KillIngressSession(context.Context, *KillIngressSessionRequest) (*google_protobuf.Empty, error) 47 } 48 49 // ================================ 50 // IngressInternal Server Interface 51 // ================================ 52 53 type IngressInternalServer interface { 54 RegisterListActiveIngressTopic(topic string) error 55 DeregisterListActiveIngressTopic(topic string) 56 RegisterKillIngressSessionTopic(ingressId string, resourceId string) error 57 DeregisterKillIngressSessionTopic(ingressId string, resourceId string) 58 59 // Close and wait for pending RPCs to complete 60 Shutdown() 61 62 // Close immediately, without waiting for pending RPCs 63 Kill() 64 } 65 66 // ====================== 67 // IngressInternal Client 68 // ====================== 69 70 type ingressInternalClient struct { 71 client *client.RPCClient 72 } 73 74 // NewIngressInternalClient creates a psrpc client that implements the IngressInternalClient interface. 75 func NewIngressInternalClient(bus psrpc.MessageBus, opts ...psrpc.ClientOption) (IngressInternalClient, error) { 76 sd := &info.ServiceDefinition{ 77 Name: "IngressInternal", 78 ID: rand.NewClientID(), 79 } 80 81 sd.RegisterMethod("StartIngress", true, false, true, false) 82 sd.RegisterMethod("ListActiveIngress", false, true, false, false) 83 sd.RegisterMethod("KillIngressSession", false, false, true, true) 84 85 rpcClient, err := client.NewRPCClient(sd, bus, opts...) 86 if err != nil { 87 return nil, err 88 } 89 90 return &ingressInternalClient{ 91 client: rpcClient, 92 }, nil 93 } 94 95 func (c *ingressInternalClient) StartIngress(ctx context.Context, req *StartIngressRequest, opts ...psrpc.RequestOption) (*livekit5.IngressInfo, error) { 96 return client.RequestSingle[*livekit5.IngressInfo](ctx, c.client, "StartIngress", nil, req, opts...) 97 } 98 99 func (c *ingressInternalClient) ListActiveIngress(ctx context.Context, topic string, req *ListActiveIngressRequest, opts ...psrpc.RequestOption) (<-chan *psrpc.Response[*ListActiveIngressResponse], error) { 100 return client.RequestMulti[*ListActiveIngressResponse](ctx, c.client, "ListActiveIngress", []string{topic}, req, opts...) 101 } 102 103 func (c *ingressInternalClient) KillIngressSession(ctx context.Context, ingressId string, resourceId string, req *KillIngressSessionRequest, opts ...psrpc.RequestOption) (*google_protobuf.Empty, error) { 104 return client.RequestSingle[*google_protobuf.Empty](ctx, c.client, "KillIngressSession", []string{ingressId, resourceId}, req, opts...) 105 } 106 107 func (s *ingressInternalClient) Close() { 108 s.client.Close() 109 } 110 111 // ====================== 112 // IngressInternal Server 113 // ====================== 114 115 type ingressInternalServer struct { 116 svc IngressInternalServerImpl 117 rpc *server.RPCServer 118 } 119 120 // NewIngressInternalServer builds a RPCServer that will route requests 121 // to the corresponding method in the provided svc implementation. 122 func NewIngressInternalServer(svc IngressInternalServerImpl, bus psrpc.MessageBus, opts ...psrpc.ServerOption) (IngressInternalServer, error) { 123 sd := &info.ServiceDefinition{ 124 Name: "IngressInternal", 125 ID: rand.NewServerID(), 126 } 127 128 s := server.NewRPCServer(sd, bus, opts...) 129 130 sd.RegisterMethod("StartIngress", true, false, true, false) 131 var err error 132 err = server.RegisterHandler(s, "StartIngress", nil, svc.StartIngress, svc.StartIngressAffinity) 133 if err != nil { 134 s.Close(false) 135 return nil, err 136 } 137 138 sd.RegisterMethod("ListActiveIngress", false, true, false, false) 139 sd.RegisterMethod("KillIngressSession", false, false, true, true) 140 return &ingressInternalServer{ 141 svc: svc, 142 rpc: s, 143 }, nil 144 } 145 146 func (s *ingressInternalServer) RegisterListActiveIngressTopic(topic string) error { 147 return server.RegisterHandler(s.rpc, "ListActiveIngress", []string{topic}, s.svc.ListActiveIngress, nil) 148 } 149 150 func (s *ingressInternalServer) DeregisterListActiveIngressTopic(topic string) { 151 s.rpc.DeregisterHandler("ListActiveIngress", []string{topic}) 152 } 153 154 func (s *ingressInternalServer) RegisterKillIngressSessionTopic(ingressId string, resourceId string) error { 155 return server.RegisterHandler(s.rpc, "KillIngressSession", []string{ingressId, resourceId}, s.svc.KillIngressSession, nil) 156 } 157 158 func (s *ingressInternalServer) DeregisterKillIngressSessionTopic(ingressId string, resourceId string) { 159 s.rpc.DeregisterHandler("KillIngressSession", []string{ingressId, resourceId}) 160 } 161 162 func (s *ingressInternalServer) Shutdown() { 163 s.rpc.Close(false) 164 } 165 166 func (s *ingressInternalServer) Kill() { 167 s.rpc.Close(true) 168 } 169 170 // =============================== 171 // IngressHandler Client Interface 172 // =============================== 173 174 type IngressHandlerClient interface { 175 UpdateIngress(ctx context.Context, topic string, req *livekit5.UpdateIngressRequest, opts ...psrpc.RequestOption) (*livekit5.IngressState, error) 176 177 DeleteIngress(ctx context.Context, topic string, req *livekit5.DeleteIngressRequest, opts ...psrpc.RequestOption) (*livekit5.IngressState, error) 178 179 DeleteWHIPResource(ctx context.Context, topic string, req *DeleteWHIPResourceRequest, opts ...psrpc.RequestOption) (*google_protobuf.Empty, error) 180 181 ICERestartWHIPResource(ctx context.Context, topic string, req *ICERestartWHIPResourceRequest, opts ...psrpc.RequestOption) (*ICERestartWHIPResourceResponse, error) 182 183 // Close immediately, without waiting for pending RPCs 184 Close() 185 } 186 187 // =================================== 188 // IngressHandler ServerImpl Interface 189 // =================================== 190 191 type IngressHandlerServerImpl interface { 192 UpdateIngress(context.Context, *livekit5.UpdateIngressRequest) (*livekit5.IngressState, error) 193 194 DeleteIngress(context.Context, *livekit5.DeleteIngressRequest) (*livekit5.IngressState, error) 195 196 DeleteWHIPResource(context.Context, *DeleteWHIPResourceRequest) (*google_protobuf.Empty, error) 197 198 ICERestartWHIPResource(context.Context, *ICERestartWHIPResourceRequest) (*ICERestartWHIPResourceResponse, error) 199 } 200 201 // =============================== 202 // IngressHandler Server Interface 203 // =============================== 204 205 type IngressHandlerServer interface { 206 RegisterUpdateIngressTopic(topic string) error 207 DeregisterUpdateIngressTopic(topic string) 208 RegisterDeleteIngressTopic(topic string) error 209 DeregisterDeleteIngressTopic(topic string) 210 RegisterDeleteWHIPResourceTopic(topic string) error 211 DeregisterDeleteWHIPResourceTopic(topic string) 212 RegisterICERestartWHIPResourceTopic(topic string) error 213 DeregisterICERestartWHIPResourceTopic(topic string) 214 215 // Close and wait for pending RPCs to complete 216 Shutdown() 217 218 // Close immediately, without waiting for pending RPCs 219 Kill() 220 } 221 222 // ===================== 223 // IngressHandler Client 224 // ===================== 225 226 type ingressHandlerClient struct { 227 client *client.RPCClient 228 } 229 230 // NewIngressHandlerClient creates a psrpc client that implements the IngressHandlerClient interface. 231 func NewIngressHandlerClient(bus psrpc.MessageBus, opts ...psrpc.ClientOption) (IngressHandlerClient, error) { 232 sd := &info.ServiceDefinition{ 233 Name: "IngressHandler", 234 ID: rand.NewClientID(), 235 } 236 237 sd.RegisterMethod("UpdateIngress", false, false, true, true) 238 sd.RegisterMethod("DeleteIngress", false, false, true, true) 239 sd.RegisterMethod("DeleteWHIPResource", false, false, true, true) 240 sd.RegisterMethod("ICERestartWHIPResource", false, false, true, true) 241 242 rpcClient, err := client.NewRPCClient(sd, bus, opts...) 243 if err != nil { 244 return nil, err 245 } 246 247 return &ingressHandlerClient{ 248 client: rpcClient, 249 }, nil 250 } 251 252 func (c *ingressHandlerClient) UpdateIngress(ctx context.Context, topic string, req *livekit5.UpdateIngressRequest, opts ...psrpc.RequestOption) (*livekit5.IngressState, error) { 253 return client.RequestSingle[*livekit5.IngressState](ctx, c.client, "UpdateIngress", []string{topic}, req, opts...) 254 } 255 256 func (c *ingressHandlerClient) DeleteIngress(ctx context.Context, topic string, req *livekit5.DeleteIngressRequest, opts ...psrpc.RequestOption) (*livekit5.IngressState, error) { 257 return client.RequestSingle[*livekit5.IngressState](ctx, c.client, "DeleteIngress", []string{topic}, req, opts...) 258 } 259 260 func (c *ingressHandlerClient) DeleteWHIPResource(ctx context.Context, topic string, req *DeleteWHIPResourceRequest, opts ...psrpc.RequestOption) (*google_protobuf.Empty, error) { 261 return client.RequestSingle[*google_protobuf.Empty](ctx, c.client, "DeleteWHIPResource", []string{topic}, req, opts...) 262 } 263 264 func (c *ingressHandlerClient) ICERestartWHIPResource(ctx context.Context, topic string, req *ICERestartWHIPResourceRequest, opts ...psrpc.RequestOption) (*ICERestartWHIPResourceResponse, error) { 265 return client.RequestSingle[*ICERestartWHIPResourceResponse](ctx, c.client, "ICERestartWHIPResource", []string{topic}, req, opts...) 266 } 267 268 func (s *ingressHandlerClient) Close() { 269 s.client.Close() 270 } 271 272 // ===================== 273 // IngressHandler Server 274 // ===================== 275 276 type ingressHandlerServer struct { 277 svc IngressHandlerServerImpl 278 rpc *server.RPCServer 279 } 280 281 // NewIngressHandlerServer builds a RPCServer that will route requests 282 // to the corresponding method in the provided svc implementation. 283 func NewIngressHandlerServer(svc IngressHandlerServerImpl, bus psrpc.MessageBus, opts ...psrpc.ServerOption) (IngressHandlerServer, error) { 284 sd := &info.ServiceDefinition{ 285 Name: "IngressHandler", 286 ID: rand.NewServerID(), 287 } 288 289 s := server.NewRPCServer(sd, bus, opts...) 290 291 sd.RegisterMethod("UpdateIngress", false, false, true, true) 292 sd.RegisterMethod("DeleteIngress", false, false, true, true) 293 sd.RegisterMethod("DeleteWHIPResource", false, false, true, true) 294 sd.RegisterMethod("ICERestartWHIPResource", false, false, true, true) 295 return &ingressHandlerServer{ 296 svc: svc, 297 rpc: s, 298 }, nil 299 } 300 301 func (s *ingressHandlerServer) RegisterUpdateIngressTopic(topic string) error { 302 return server.RegisterHandler(s.rpc, "UpdateIngress", []string{topic}, s.svc.UpdateIngress, nil) 303 } 304 305 func (s *ingressHandlerServer) DeregisterUpdateIngressTopic(topic string) { 306 s.rpc.DeregisterHandler("UpdateIngress", []string{topic}) 307 } 308 309 func (s *ingressHandlerServer) RegisterDeleteIngressTopic(topic string) error { 310 return server.RegisterHandler(s.rpc, "DeleteIngress", []string{topic}, s.svc.DeleteIngress, nil) 311 } 312 313 func (s *ingressHandlerServer) DeregisterDeleteIngressTopic(topic string) { 314 s.rpc.DeregisterHandler("DeleteIngress", []string{topic}) 315 } 316 317 func (s *ingressHandlerServer) RegisterDeleteWHIPResourceTopic(topic string) error { 318 return server.RegisterHandler(s.rpc, "DeleteWHIPResource", []string{topic}, s.svc.DeleteWHIPResource, nil) 319 } 320 321 func (s *ingressHandlerServer) DeregisterDeleteWHIPResourceTopic(topic string) { 322 s.rpc.DeregisterHandler("DeleteWHIPResource", []string{topic}) 323 } 324 325 func (s *ingressHandlerServer) RegisterICERestartWHIPResourceTopic(topic string) error { 326 return server.RegisterHandler(s.rpc, "ICERestartWHIPResource", []string{topic}, s.svc.ICERestartWHIPResource, nil) 327 } 328 329 func (s *ingressHandlerServer) DeregisterICERestartWHIPResourceTopic(topic string) { 330 s.rpc.DeregisterHandler("ICERestartWHIPResource", []string{topic}) 331 } 332 333 func (s *ingressHandlerServer) Shutdown() { 334 s.rpc.Close(false) 335 } 336 337 func (s *ingressHandlerServer) Kill() { 338 s.rpc.Close(true) 339 } 340 341 var psrpcFileDescriptor3 = []byte{ 342 // 748 bytes of a gzipped FileDescriptorProto 343 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcd, 0x6e, 0xdb, 0x46, 344 0x10, 0xc6, 0x52, 0xb2, 0x6a, 0x8d, 0x2c, 0x5b, 0x5e, 0xff, 0x80, 0x62, 0x21, 0xff, 0xd0, 0x17, 345 0x01, 0x45, 0xa9, 0x42, 0xbd, 0x14, 0x3d, 0x14, 0xae, 0x5b, 0x1b, 0x56, 0xed, 0x02, 0x06, 0x15, 346 0x23, 0x40, 0x02, 0x84, 0xa0, 0xc9, 0x15, 0xb3, 0x10, 0xc5, 0x65, 0x76, 0x57, 0x36, 0x74, 0x0b, 347 0x72, 0xd3, 0xbb, 0xe4, 0xa4, 0x27, 0xc8, 0x1b, 0xe5, 0x15, 0x02, 0x92, 0x4b, 0x59, 0xbf, 0x46, 348 0x2e, 0xb9, 0x69, 0xbe, 0x19, 0xce, 0xce, 0x7e, 0xf3, 0xed, 0x27, 0xd8, 0xe5, 0xb1, 0xd7, 0xa2, 349 0x51, 0xc0, 0x89, 0x10, 0x56, 0xcc, 0x99, 0x64, 0xb8, 0xc0, 0x63, 0xcf, 0xa8, 0xb2, 0x58, 0x52, 350 0x16, 0x29, 0xcc, 0x38, 0x08, 0xe9, 0x23, 0xe9, 0x53, 0xe9, 0xcc, 0x95, 0x1a, 0x3f, 0x07, 0x8c, 351 0x05, 0x21, 0x69, 0xa5, 0xd1, 0xc3, 0xb0, 0xd7, 0x22, 0x83, 0x58, 0x8e, 0xb2, 0xa4, 0x69, 0x80, 352 0x7e, 0x4b, 0x85, 0xfc, 0xdb, 0x93, 0xf4, 0x91, 0x74, 0xb2, 0xef, 0x6c, 0xf2, 0x61, 0x48, 0x84, 353 0x34, 0x3f, 0x22, 0xa8, 0xaf, 0x48, 0x8a, 0x98, 0x45, 0x82, 0xe0, 0x33, 0xa8, 0xa8, 0x73, 0x1c, 354 0xea, 0x0b, 0x1d, 0x9d, 0x14, 0x9a, 0xe5, 0x0b, 0x4d, 0x47, 0x36, 0x28, 0xb8, 0xe3, 0x0b, 0xfc, 355 0x17, 0xd4, 0xf2, 0x22, 0x41, 0x84, 0x48, 0x86, 0xd5, 0xb5, 0x93, 0x42, 0xb3, 0xd2, 0xde, 0xb3, 356 0x78, 0xec, 0x59, 0xaa, 0x69, 0x37, 0xcb, 0xd9, 0x3b, 0x74, 0x2e, 0x16, 0xe6, 0x5b, 0xa8, 0xff, 357 0x4b, 0x42, 0x22, 0xc9, 0xeb, 0xeb, 0xce, 0x9d, 0x4d, 0x04, 0x1b, 0x72, 0x8f, 0xa8, 0xf9, 0xf0, 358 0x31, 0x54, 0xb8, 0x82, 0x1c, 0xea, 0xeb, 0xe8, 0x04, 0x35, 0xcb, 0x36, 0xe4, 0x50, 0xc7, 0xc7, 359 0x0d, 0x00, 0x21, 0x39, 0x71, 0x07, 0x4e, 0x9f, 0x8c, 0x74, 0x2d, 0xcd, 0x97, 0x33, 0xe4, 0x86, 360 0x8c, 0xcc, 0x2f, 0x08, 0x1a, 0x9d, 0x7f, 0x2e, 0x6d, 0x22, 0xa4, 0xcb, 0xe5, 0x0f, 0x38, 0x01, 361 0x9f, 0x41, 0x75, 0x28, 0x08, 0x77, 0x7a, 0xdc, 0x0d, 0x06, 0x24, 0x92, 0x7a, 0x21, 0xad, 0xd8, 362 0x4a, 0xc0, 0x2b, 0x85, 0x61, 0x03, 0x36, 0x63, 0x57, 0x88, 0x27, 0xc6, 0x7d, 0xbd, 0x98, 0xe6, 363 0xa7, 0x31, 0x3e, 0x02, 0xf0, 0xdc, 0xc8, 0xa7, 0xbe, 0x2b, 0x89, 0xd0, 0x37, 0x12, 0x8e, 0xed, 364 0x19, 0xc4, 0xbc, 0x83, 0xa3, 0x75, 0x37, 0x50, 0x6b, 0xb2, 0x60, 0x4f, 0x72, 0xea, 0xf5, 0x43, 365 0xe2, 0x50, 0x8f, 0x38, 0xc2, 0x8f, 0x93, 0x61, 0xd4, 0x55, 0x76, 0x55, 0xaa, 0xe3, 0x91, 0x6e, 366 0x96, 0x30, 0x3f, 0x69, 0xb0, 0xd7, 0x4d, 0xba, 0xcd, 0x8b, 0x01, 0x37, 0xa1, 0x48, 0xa3, 0x1e, 367 0x4b, 0x3f, 0xac, 0xb4, 0xf7, 0x2d, 0xa5, 0xb5, 0x7c, 0x83, 0x9d, 0xa8, 0xc7, 0xec, 0xb4, 0x02, 368 0xef, 0xc3, 0x86, 0x64, 0x7d, 0x12, 0x29, 0x3a, 0xb2, 0x00, 0x1f, 0x40, 0xe9, 0x49, 0x38, 0x43, 369 0x1e, 0x2a, 0x0e, 0x36, 0x9e, 0xc4, 0x3d, 0x0f, 0xb1, 0x0d, 0xdb, 0x21, 0x0b, 0x02, 0x1a, 0x05, 370 0x4e, 0x8f, 0x92, 0xd0, 0x17, 0x7a, 0x31, 0x95, 0xc7, 0x2f, 0xa9, 0x3c, 0x56, 0x0c, 0x62, 0xdd, 371 0x66, 0xe5, 0x57, 0x69, 0xf5, 0x65, 0x24, 0xf9, 0xc8, 0xae, 0x86, 0xb3, 0x98, 0x71, 0x0e, 0x78, 372 0xb9, 0x08, 0xd7, 0xa0, 0x90, 0xec, 0x28, 0xbb, 0x78, 0xf2, 0x33, 0x19, 0xf4, 0xd1, 0x0d, 0x87, 373 0x24, 0x1f, 0x34, 0x0d, 0xfe, 0xd4, 0xfe, 0x40, 0xe6, 0x1d, 0x6c, 0xcf, 0x2b, 0x33, 0x59, 0xf4, 374 0xb3, 0xda, 0x55, 0x93, 0xf2, 0x54, 0xe8, 0x8b, 0x42, 0xd1, 0x16, 0x85, 0x62, 0xfe, 0x07, 0xf5, 375 0x1b, 0x1a, 0x86, 0x0b, 0x7a, 0x57, 0xdc, 0xfe, 0x0a, 0x3f, 0xa9, 0xd7, 0xa1, 0xe8, 0x5d, 0xf9, 376 0x38, 0xf2, 0x9a, 0xf6, 0x67, 0x0d, 0x76, 0xa6, 0xb4, 0x4b, 0xc2, 0x23, 0x37, 0xc4, 0xd7, 0xb0, 377 0x35, 0x4b, 0x16, 0xd6, 0xd7, 0xf1, 0x67, 0xac, 0x5c, 0x9d, 0xb9, 0x39, 0x19, 0xa3, 0xe2, 0x39, 378 0xfa, 0x0d, 0xe1, 0x77, 0xb0, 0xbb, 0xf4, 0xe8, 0x71, 0x23, 0x6d, 0xb7, 0xce, 0x29, 0x8c, 0xa3, 379 0x75, 0xe9, 0x4c, 0x84, 0x26, 0x4c, 0xc6, 0xa8, 0x54, 0x43, 0xe7, 0x5a, 0x13, 0x61, 0x06, 0x78, 380 0x99, 0x09, 0x9c, 0x75, 0x58, 0x4b, 0x91, 0x71, 0x68, 0x65, 0x2e, 0x66, 0xe5, 0x2e, 0x66, 0x5d, 381 0x26, 0x2e, 0x66, 0x9e, 0x4e, 0xc6, 0xa8, 0x51, 0x43, 0x46, 0x1d, 0xcf, 0xec, 0x07, 0xcf, 0x2e, 382 0xa3, 0xfd, 0x55, 0x9b, 0x6e, 0xf3, 0xda, 0x8d, 0xfc, 0x90, 0x70, 0xfc, 0x3f, 0x54, 0xef, 0xe3, 383 0xe4, 0x05, 0x3d, 0xdf, 0x2f, 0x27, 0x65, 0x0e, 0xcf, 0x4f, 0x3f, 0x58, 0xe4, 0xac, 0x2b, 0x5d, 384 0x49, 0xcc, 0xd2, 0x64, 0x8c, 0xb4, 0x1a, 0x4a, 0xda, 0x65, 0x2e, 0xb5, 0xdc, 0x6e, 0x0e, 0xff, 385 0xce, 0x76, 0xaf, 0x00, 0x2f, 0x9b, 0x9e, 0x62, 0x68, 0xad, 0x1b, 0xae, 0x65, 0x28, 0xef, 0x4a, 386 0xe1, 0x70, 0xb5, 0x55, 0x60, 0x33, 0x53, 0xdb, 0x4b, 0x4e, 0x68, 0x9c, 0xbd, 0x58, 0xa3, 0xd6, 387 0xac, 0x8e, 0xba, 0x38, 0x7d, 0x73, 0x1c, 0x50, 0xf9, 0x7e, 0xf8, 0x60, 0x79, 0x6c, 0xd0, 0x52, 388 0x77, 0xcd, 0xfe, 0x7f, 0x3c, 0x16, 0xb6, 0x78, 0xec, 0x3d, 0x94, 0xd2, 0xe8, 0xf7, 0x6f, 0x01, 389 0x00, 0x00, 0xff, 0xff, 0x93, 0x4e, 0x89, 0xdb, 0xdb, 0x06, 0x00, 0x00, 390 }