config.pb.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. // Code generated by protoc-gen-go.
  2. // source: v2ray.com/core/config.proto
  3. // DO NOT EDIT!
  4. /*
  5. Package core is a generated protocol buffer package.
  6. It is generated from these files:
  7. v2ray.com/core/config.proto
  8. It has these top-level messages:
  9. AllocationStrategyConcurrency
  10. AllocationStrategyRefresh
  11. AllocationStrategy
  12. InboundConnectionConfig
  13. OutboundConnectionConfig
  14. Config
  15. */
  16. package core
  17. import proto "github.com/golang/protobuf/proto"
  18. import fmt "fmt"
  19. import math "math"
  20. import v2ray_core_app_router "v2ray.com/core/app/router"
  21. import v2ray_core_app_dns "v2ray.com/core/app/dns"
  22. import v2ray_core_common_net "v2ray.com/core/common/net"
  23. import v2ray_core_common_net2 "v2ray.com/core/common/net"
  24. import v2ray_core_common_log "v2ray.com/core/common/log"
  25. import v2ray_core_transport_internet "v2ray.com/core/transport/internet"
  26. import v2ray_core_transport "v2ray.com/core/transport"
  27. import google_protobuf "github.com/golang/protobuf/ptypes/any"
  28. // Reference imports to suppress errors if they are not otherwise used.
  29. var _ = proto.Marshal
  30. var _ = fmt.Errorf
  31. var _ = math.Inf
  32. // This is a compile-time assertion to ensure that this generated file
  33. // is compatible with the proto package it is being compiled against.
  34. // A compilation error at this line likely means your copy of the
  35. // proto package needs to be updated.
  36. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
  37. type ConfigFormat int32
  38. const (
  39. ConfigFormat_Protobuf ConfigFormat = 0
  40. ConfigFormat_JSON ConfigFormat = 1
  41. )
  42. var ConfigFormat_name = map[int32]string{
  43. 0: "Protobuf",
  44. 1: "JSON",
  45. }
  46. var ConfigFormat_value = map[string]int32{
  47. "Protobuf": 0,
  48. "JSON": 1,
  49. }
  50. func (x ConfigFormat) String() string {
  51. return proto.EnumName(ConfigFormat_name, int32(x))
  52. }
  53. func (ConfigFormat) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
  54. type AllocationStrategy_Type int32
  55. const (
  56. // Always allocate all connection handlers.
  57. AllocationStrategy_Always AllocationStrategy_Type = 0
  58. // Randomly allocate specific range of handlers.
  59. AllocationStrategy_Random AllocationStrategy_Type = 1
  60. // External. Not supported yet.
  61. AllocationStrategy_External AllocationStrategy_Type = 2
  62. )
  63. var AllocationStrategy_Type_name = map[int32]string{
  64. 0: "Always",
  65. 1: "Random",
  66. 2: "External",
  67. }
  68. var AllocationStrategy_Type_value = map[string]int32{
  69. "Always": 0,
  70. "Random": 1,
  71. "External": 2,
  72. }
  73. func (x AllocationStrategy_Type) String() string {
  74. return proto.EnumName(AllocationStrategy_Type_name, int32(x))
  75. }
  76. func (AllocationStrategy_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} }
  77. type AllocationStrategyConcurrency struct {
  78. Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
  79. }
  80. func (m *AllocationStrategyConcurrency) Reset() { *m = AllocationStrategyConcurrency{} }
  81. func (m *AllocationStrategyConcurrency) String() string { return proto.CompactTextString(m) }
  82. func (*AllocationStrategyConcurrency) ProtoMessage() {}
  83. func (*AllocationStrategyConcurrency) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
  84. type AllocationStrategyRefresh struct {
  85. Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
  86. }
  87. func (m *AllocationStrategyRefresh) Reset() { *m = AllocationStrategyRefresh{} }
  88. func (m *AllocationStrategyRefresh) String() string { return proto.CompactTextString(m) }
  89. func (*AllocationStrategyRefresh) ProtoMessage() {}
  90. func (*AllocationStrategyRefresh) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
  91. type AllocationStrategy struct {
  92. Type AllocationStrategy_Type `protobuf:"varint,1,opt,name=type,enum=v2ray.core.AllocationStrategy_Type" json:"type,omitempty"`
  93. // Number of handlers (ports) running in parallel.
  94. Concurrency *AllocationStrategyConcurrency `protobuf:"bytes,2,opt,name=concurrency" json:"concurrency,omitempty"`
  95. // Number of minutes before a handler is regenerated.
  96. Refresh *AllocationStrategyRefresh `protobuf:"bytes,3,opt,name=refresh" json:"refresh,omitempty"`
  97. }
  98. func (m *AllocationStrategy) Reset() { *m = AllocationStrategy{} }
  99. func (m *AllocationStrategy) String() string { return proto.CompactTextString(m) }
  100. func (*AllocationStrategy) ProtoMessage() {}
  101. func (*AllocationStrategy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
  102. func (m *AllocationStrategy) GetConcurrency() *AllocationStrategyConcurrency {
  103. if m != nil {
  104. return m.Concurrency
  105. }
  106. return nil
  107. }
  108. func (m *AllocationStrategy) GetRefresh() *AllocationStrategyRefresh {
  109. if m != nil {
  110. return m.Refresh
  111. }
  112. return nil
  113. }
  114. // Config for an inbound connection handler.
  115. type InboundConnectionConfig struct {
  116. Protocol string `protobuf:"bytes,1,opt,name=protocol" json:"protocol,omitempty"`
  117. PortRange *v2ray_core_common_net.PortRange `protobuf:"bytes,2,opt,name=port_range,json=portRange" json:"port_range,omitempty"`
  118. ListenOn *v2ray_core_common_net2.IPOrDomain `protobuf:"bytes,3,opt,name=listen_on,json=listenOn" json:"listen_on,omitempty"`
  119. Tag string `protobuf:"bytes,4,opt,name=tag" json:"tag,omitempty"`
  120. AllocationStrategy *AllocationStrategy `protobuf:"bytes,5,opt,name=allocation_strategy,json=allocationStrategy" json:"allocation_strategy,omitempty"`
  121. StreamSettings *v2ray_core_transport_internet.StreamConfig `protobuf:"bytes,6,opt,name=stream_settings,json=streamSettings" json:"stream_settings,omitempty"`
  122. Settings *google_protobuf.Any `protobuf:"bytes,7,opt,name=settings" json:"settings,omitempty"`
  123. AllowPassiveConnection bool `protobuf:"varint,8,opt,name=allow_passive_connection,json=allowPassiveConnection" json:"allow_passive_connection,omitempty"`
  124. }
  125. func (m *InboundConnectionConfig) Reset() { *m = InboundConnectionConfig{} }
  126. func (m *InboundConnectionConfig) String() string { return proto.CompactTextString(m) }
  127. func (*InboundConnectionConfig) ProtoMessage() {}
  128. func (*InboundConnectionConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
  129. func (m *InboundConnectionConfig) GetPortRange() *v2ray_core_common_net.PortRange {
  130. if m != nil {
  131. return m.PortRange
  132. }
  133. return nil
  134. }
  135. func (m *InboundConnectionConfig) GetListenOn() *v2ray_core_common_net2.IPOrDomain {
  136. if m != nil {
  137. return m.ListenOn
  138. }
  139. return nil
  140. }
  141. func (m *InboundConnectionConfig) GetAllocationStrategy() *AllocationStrategy {
  142. if m != nil {
  143. return m.AllocationStrategy
  144. }
  145. return nil
  146. }
  147. func (m *InboundConnectionConfig) GetStreamSettings() *v2ray_core_transport_internet.StreamConfig {
  148. if m != nil {
  149. return m.StreamSettings
  150. }
  151. return nil
  152. }
  153. func (m *InboundConnectionConfig) GetSettings() *google_protobuf.Any {
  154. if m != nil {
  155. return m.Settings
  156. }
  157. return nil
  158. }
  159. type OutboundConnectionConfig struct {
  160. Protocol string `protobuf:"bytes,1,opt,name=protocol" json:"protocol,omitempty"`
  161. SendThrough *v2ray_core_common_net2.IPOrDomain `protobuf:"bytes,2,opt,name=send_through,json=sendThrough" json:"send_through,omitempty"`
  162. StreamSettings *v2ray_core_transport_internet.StreamConfig `protobuf:"bytes,3,opt,name=stream_settings,json=streamSettings" json:"stream_settings,omitempty"`
  163. Tag string `protobuf:"bytes,4,opt,name=tag" json:"tag,omitempty"`
  164. Settings *google_protobuf.Any `protobuf:"bytes,5,opt,name=settings" json:"settings,omitempty"`
  165. }
  166. func (m *OutboundConnectionConfig) Reset() { *m = OutboundConnectionConfig{} }
  167. func (m *OutboundConnectionConfig) String() string { return proto.CompactTextString(m) }
  168. func (*OutboundConnectionConfig) ProtoMessage() {}
  169. func (*OutboundConnectionConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
  170. func (m *OutboundConnectionConfig) GetSendThrough() *v2ray_core_common_net2.IPOrDomain {
  171. if m != nil {
  172. return m.SendThrough
  173. }
  174. return nil
  175. }
  176. func (m *OutboundConnectionConfig) GetStreamSettings() *v2ray_core_transport_internet.StreamConfig {
  177. if m != nil {
  178. return m.StreamSettings
  179. }
  180. return nil
  181. }
  182. func (m *OutboundConnectionConfig) GetSettings() *google_protobuf.Any {
  183. if m != nil {
  184. return m.Settings
  185. }
  186. return nil
  187. }
  188. type Config struct {
  189. Inbound []*InboundConnectionConfig `protobuf:"bytes,1,rep,name=inbound" json:"inbound,omitempty"`
  190. Outbound []*OutboundConnectionConfig `protobuf:"bytes,2,rep,name=outbound" json:"outbound,omitempty"`
  191. Log *v2ray_core_common_log.Config `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"`
  192. Router *v2ray_core_app_router.Config `protobuf:"bytes,4,opt,name=router" json:"router,omitempty"`
  193. Dns *v2ray_core_app_dns.Config `protobuf:"bytes,5,opt,name=dns" json:"dns,omitempty"`
  194. Transport *v2ray_core_transport.Config `protobuf:"bytes,6,opt,name=transport" json:"transport,omitempty"`
  195. }
  196. func (m *Config) Reset() { *m = Config{} }
  197. func (m *Config) String() string { return proto.CompactTextString(m) }
  198. func (*Config) ProtoMessage() {}
  199. func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
  200. func (m *Config) GetInbound() []*InboundConnectionConfig {
  201. if m != nil {
  202. return m.Inbound
  203. }
  204. return nil
  205. }
  206. func (m *Config) GetOutbound() []*OutboundConnectionConfig {
  207. if m != nil {
  208. return m.Outbound
  209. }
  210. return nil
  211. }
  212. func (m *Config) GetLog() *v2ray_core_common_log.Config {
  213. if m != nil {
  214. return m.Log
  215. }
  216. return nil
  217. }
  218. func (m *Config) GetRouter() *v2ray_core_app_router.Config {
  219. if m != nil {
  220. return m.Router
  221. }
  222. return nil
  223. }
  224. func (m *Config) GetDns() *v2ray_core_app_dns.Config {
  225. if m != nil {
  226. return m.Dns
  227. }
  228. return nil
  229. }
  230. func (m *Config) GetTransport() *v2ray_core_transport.Config {
  231. if m != nil {
  232. return m.Transport
  233. }
  234. return nil
  235. }
  236. func init() {
  237. proto.RegisterType((*AllocationStrategyConcurrency)(nil), "v2ray.core.AllocationStrategyConcurrency")
  238. proto.RegisterType((*AllocationStrategyRefresh)(nil), "v2ray.core.AllocationStrategyRefresh")
  239. proto.RegisterType((*AllocationStrategy)(nil), "v2ray.core.AllocationStrategy")
  240. proto.RegisterType((*InboundConnectionConfig)(nil), "v2ray.core.InboundConnectionConfig")
  241. proto.RegisterType((*OutboundConnectionConfig)(nil), "v2ray.core.OutboundConnectionConfig")
  242. proto.RegisterType((*Config)(nil), "v2ray.core.Config")
  243. proto.RegisterEnum("v2ray.core.ConfigFormat", ConfigFormat_name, ConfigFormat_value)
  244. proto.RegisterEnum("v2ray.core.AllocationStrategy_Type", AllocationStrategy_Type_name, AllocationStrategy_Type_value)
  245. }
  246. func init() { proto.RegisterFile("v2ray.com/core/config.proto", fileDescriptor0) }
  247. var fileDescriptor0 = []byte{
  248. // 751 bytes of a gzipped FileDescriptorProto
  249. 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x95, 0xed, 0x6e, 0xeb, 0x34,
  250. 0x1c, 0xc6, 0xd7, 0x97, 0x75, 0xe9, 0xbf, 0x63, 0x54, 0x66, 0x82, 0xac, 0x30, 0x54, 0xba, 0x17,
  251. 0x0a, 0x4c, 0x09, 0x0c, 0x4d, 0x20, 0x24, 0x18, 0x7b, 0x01, 0x69, 0x20, 0xd1, 0x2a, 0xdd, 0x27,
  252. 0xbe, 0x54, 0x5e, 0xe2, 0x65, 0x91, 0x12, 0x3b, 0xb2, 0xdd, 0x8d, 0x5c, 0x02, 0x37, 0x70, 0x6e,
  253. 0x6e, 0x37, 0x73, 0x14, 0xdb, 0x49, 0xdf, 0x77, 0x76, 0x74, 0xbe, 0x25, 0xf1, 0xf3, 0x7b, 0x6c,
  254. 0x3f, 0x8f, 0xdd, 0xc2, 0xe7, 0x8f, 0xa7, 0x1c, 0x67, 0x8e, 0xcf, 0x12, 0xd7, 0x67, 0x9c, 0xb8,
  255. 0x3e, 0xa3, 0xf7, 0x51, 0xe8, 0xa4, 0x9c, 0x49, 0x86, 0xa0, 0x18, 0xe4, 0xa4, 0x73, 0xbc, 0x20,
  256. 0xc4, 0x69, 0xea, 0x72, 0x36, 0x91, 0x84, 0xcf, 0x31, 0x9d, 0x83, 0x15, 0xba, 0x80, 0x8a, 0x79,
  257. 0xd1, 0xe1, 0xd2, 0xac, 0x49, 0xc2, 0xa8, 0x4b, 0x89, 0x74, 0x53, 0xc6, 0xa5, 0x51, 0x7d, 0xbd,
  258. 0x5e, 0x85, 0x83, 0x80, 0x13, 0x21, 0x8c, 0xf0, 0x78, 0xb5, 0x30, 0x66, 0xe1, 0xfc, 0xb4, 0xce,
  259. 0x82, 0x4e, 0x72, 0x4c, 0x45, 0x3e, 0xa1, 0x1b, 0x51, 0x49, 0x78, 0x6e, 0x3c, 0xa7, 0x3f, 0x5a,
  260. 0xab, 0x9f, 0x93, 0xed, 0x85, 0x8c, 0x85, 0x31, 0x71, 0xd5, 0xdb, 0xdd, 0xe4, 0xde, 0xc5, 0x34,
  261. 0xd3, 0x43, 0xbd, 0x33, 0xd8, 0xbf, 0x88, 0x63, 0xe6, 0x63, 0x19, 0x31, 0x3a, 0x92, 0x1c, 0x4b,
  262. 0x12, 0x66, 0x57, 0x8c, 0xfa, 0x13, 0xce, 0x09, 0xf5, 0x33, 0xb4, 0x0b, 0x9b, 0x8f, 0x38, 0x9e,
  263. 0x10, 0xbb, 0xd2, 0xad, 0xf4, 0x3f, 0xf2, 0xf4, 0x4b, 0xef, 0x07, 0xd8, 0x5b, 0xc6, 0x3c, 0x72,
  264. 0xcf, 0x89, 0x78, 0x58, 0x83, 0xfc, 0x5f, 0x05, 0xb4, 0xcc, 0xa0, 0x9f, 0xa0, 0x2e, 0xb3, 0x54,
  265. 0x6b, 0x77, 0x4e, 0x0f, 0x9c, 0x69, 0xa3, 0xce, 0xb2, 0xda, 0xb9, 0xcd, 0x52, 0xe2, 0x29, 0x00,
  266. 0xfd, 0x0d, 0x2d, 0x7f, 0xba, 0x4e, 0xbb, 0xda, 0xad, 0xf4, 0x5b, 0xa7, 0xdf, 0xbc, 0xcc, 0xcf,
  267. 0x6c, 0xcc, 0x9b, 0xa5, 0xd1, 0x39, 0x6c, 0x71, 0xbd, 0x7a, 0xbb, 0xa6, 0x8c, 0x8e, 0x5e, 0x36,
  268. 0x32, 0x5b, 0xf5, 0x0a, 0xaa, 0x77, 0x02, 0xf5, 0x7c, 0x6d, 0x08, 0xa0, 0x71, 0x11, 0x3f, 0xe1,
  269. 0x4c, 0xb4, 0x37, 0xf2, 0x67, 0x0f, 0xd3, 0x80, 0x25, 0xed, 0x0a, 0xda, 0x06, 0xeb, 0x8f, 0xff,
  270. 0xf2, 0x0a, 0x71, 0xdc, 0xae, 0xf6, 0x9e, 0x6b, 0xf0, 0xd9, 0x0d, 0xbd, 0x63, 0x13, 0x1a, 0x5c,
  271. 0x31, 0x4a, 0x89, 0x9f, 0x7b, 0x5f, 0xa9, 0xca, 0x50, 0x07, 0x2c, 0x55, 0x8d, 0xcf, 0x62, 0x15,
  272. 0x4a, 0xd3, 0x2b, 0xdf, 0xd1, 0x39, 0x40, 0xde, 0xee, 0x98, 0x63, 0x1a, 0x12, 0xb3, 0xe5, 0xee,
  273. 0xec, 0x4a, 0xf5, 0xc1, 0x72, 0x28, 0x91, 0xce, 0x90, 0x71, 0xe9, 0xe5, 0x3a, 0xaf, 0x99, 0x16,
  274. 0x8f, 0xe8, 0x37, 0x68, 0xc6, 0x91, 0x90, 0x84, 0x8e, 0x19, 0x35, 0x3b, 0xfd, 0x6a, 0x0d, 0x7f,
  275. 0x33, 0x1c, 0xf0, 0x6b, 0x96, 0xe0, 0x88, 0x7a, 0x96, 0x66, 0x06, 0x14, 0xb5, 0xa1, 0x26, 0x71,
  276. 0x68, 0xd7, 0xd5, 0xba, 0xf2, 0x47, 0x34, 0x80, 0x4f, 0x70, 0x19, 0xcf, 0x58, 0x98, 0x7c, 0xec,
  277. 0x4d, 0xe5, 0xfd, 0xe5, 0x3b, 0x52, 0x44, 0x78, 0xf9, 0x40, 0xdc, 0xc2, 0xc7, 0x42, 0x72, 0x82,
  278. 0x93, 0xb1, 0x20, 0x52, 0x46, 0x34, 0x14, 0x76, 0x43, 0x99, 0x7d, 0x37, 0x6b, 0x56, 0x9e, 0x74,
  279. 0xa7, 0xb8, 0x19, 0xce, 0x48, 0x51, 0x3a, 0x45, 0x6f, 0x47, 0x7b, 0x8c, 0x8c, 0x05, 0xfa, 0x1e,
  280. 0xac, 0xd2, 0x6e, 0x4b, 0xd9, 0xed, 0x3a, 0xfa, 0x56, 0x38, 0xc5, 0xad, 0x70, 0x2e, 0x68, 0xe6,
  281. 0x95, 0x2a, 0xf4, 0x33, 0xd8, 0xf9, 0xea, 0x9e, 0xc6, 0x29, 0x16, 0x22, 0x7a, 0x24, 0x63, 0xbf,
  282. 0x6c, 0xca, 0xb6, 0xba, 0x95, 0xbe, 0xe5, 0x7d, 0xaa, 0xc6, 0x87, 0x7a, 0x78, 0xda, 0x63, 0xef,
  283. 0x4d, 0x15, 0xec, 0xc1, 0x44, 0xbe, 0x7f, 0xbd, 0xd7, 0xb0, 0x2d, 0x08, 0x0d, 0xc6, 0xf2, 0x81,
  284. 0xb3, 0x49, 0xf8, 0x60, 0x0a, 0x7e, 0x45, 0x41, 0xad, 0x1c, 0xbb, 0xd5, 0xd4, 0xaa, 0x00, 0x6b,
  285. 0x1f, 0x1e, 0xe0, 0x72, 0xf3, 0xb3, 0x91, 0x6e, 0xbe, 0x26, 0xd2, 0xde, 0x73, 0x15, 0x1a, 0x26,
  286. 0x86, 0x5f, 0x61, 0x2b, 0xd2, 0x17, 0xc0, 0xae, 0x74, 0x6b, 0xfd, 0xd6, 0xfc, 0xcd, 0x5f, 0x73,
  287. 0x37, 0xbc, 0x82, 0x41, 0xbf, 0x83, 0xc5, 0x4c, 0xc2, 0x76, 0x55, 0xf1, 0x87, 0xb3, 0xfc, 0xba,
  288. 0xf4, 0xbd, 0x92, 0x42, 0x2e, 0xd4, 0x62, 0x16, 0x9a, 0x64, 0xf6, 0x57, 0x44, 0x1c, 0xb3, 0xd0,
  289. 0x31, 0x54, 0xae, 0x44, 0x67, 0xd0, 0xd0, 0x7f, 0x27, 0x2a, 0x83, 0x05, 0x06, 0xa7, 0xa9, 0xa3,
  290. 0x47, 0x0b, 0xc6, 0x88, 0xd1, 0x09, 0xd4, 0x02, 0x5a, 0x04, 0xd4, 0x59, 0x64, 0x02, 0x2a, 0xca,
  291. 0x49, 0x02, 0x2a, 0xd0, 0x2f, 0xd0, 0x2c, 0x8b, 0x31, 0xc7, 0xfe, 0x8b, 0xd5, 0xad, 0x19, 0x6a,
  292. 0x2a, 0xff, 0xf6, 0x18, 0xb6, 0xf5, 0xc7, 0x3f, 0x19, 0x4f, 0xb0, 0xcc, 0x7f, 0x72, 0x86, 0xa6,
  293. 0x87, 0xf6, 0x06, 0xb2, 0xa0, 0xfe, 0xd7, 0x68, 0xf0, 0x4f, 0xbb, 0x72, 0x79, 0x00, 0x3b, 0x3e,
  294. 0x4b, 0x66, 0x5c, 0x2f, 0x5b, 0x9a, 0x53, 0xea, 0x7f, 0xeb, 0xf9, 0xa7, 0xbb, 0x86, 0xaa, 0xf0,
  295. 0xc7, 0xb7, 0x01, 0x00, 0x00, 0xff, 0xff, 0xba, 0x3e, 0xa7, 0x09, 0x7f, 0x07, 0x00, 0x00,
  296. }