From ef46990f8528d479f5bde7c617ab2c7e0fcfe615 Mon Sep 17 00:00:00 2001 From: Sam Calder-Mason Date: Mon, 29 Apr 2024 14:10:31 +1000 Subject: [PATCH 1/7] feat(cl-mimicry): Add LIBP2P_GOSSIPSUB_ATTESTATION --- deploy/local/docker-compose/prometheus.yaml | 3 + .../docker-compose/vector-http-kafka.yaml | 17 + .../vector-kafka-clickhouse-libp2p.yaml | 1723 +++++++++ .../vector-kafka-clickhouse.yaml | 1668 +------- .../035_libp2p_gossipsub_attestation.up.sql | 100 + ...bp2p_gossipsub_beacon_attestation.down.sql | 2 + docker-compose.yml | 31 + go.mod | 2 +- go.sum | 4 +- pkg/clmimicry/config.go | 27 +- pkg/clmimicry/event.go | 53 + pkg/clmimicry/gossipsub_attestation.go | 183 + pkg/proto/xatu/event_ingester.pb.go | 3407 +++++++++-------- pkg/proto/xatu/event_ingester.proto | 57 + .../service/event-ingester/event/event.go | 3 + .../trace_gossipsub_beacon_attestation.go | 46 + 16 files changed, 4314 insertions(+), 3012 deletions(-) create mode 100644 deploy/local/docker-compose/vector-kafka-clickhouse-libp2p.yaml create mode 100644 deploy/migrations/clickhouse/035_libp2p_gossipsub_attestation.up.sql create mode 100644 deploy/migrations/clickhouse/035_libp2p_gossipsub_beacon_attestation.down.sql create mode 100644 pkg/clmimicry/gossipsub_attestation.go create mode 100644 pkg/server/service/event-ingester/event/libp2p/trace_gossipsub_beacon_attestation.go diff --git a/deploy/local/docker-compose/prometheus.yaml b/deploy/local/docker-compose/prometheus.yaml index 633a39f6..f4a227cc 100644 --- a/deploy/local/docker-compose/prometheus.yaml +++ b/deploy/local/docker-compose/prometheus.yaml @@ -5,6 +5,9 @@ scrape_configs: - job_name: 'vector-kafka-clickhouse' static_configs: - targets: ['vector-kafka-clickhouse:9598'] + - job_name: 'vector-kafka-clickhouse-libp2p' + static_configs: + - targets: ['vector-kafka-clickhouse-libp2p:9598'] - job_name: 'vector-http-kafka' static_configs: - targets: ['vector-http-kafka:9598'] \ No newline at end of file diff --git a/deploy/local/docker-compose/vector-http-kafka.yaml b/deploy/local/docker-compose/vector-http-kafka.yaml index d15d5fbc..d9b8aac6 100644 --- a/deploy/local/docker-compose/vector-http-kafka.yaml +++ b/deploy/local/docker-compose/vector-http-kafka.yaml @@ -64,6 +64,7 @@ transforms: libp2p_trace_handle_metadata: .event.name == "LIBP2P_TRACE_HANDLE_METADATA" libp2p_trace_handle_status: .event.name == "LIBP2P_TRACE_HANDLE_STATUS" libp2p_trace_gossipsub_beacon_block : .event.name == "LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK" + libp2p_trace_gossipsub_beacon_attestation : .event.name == "LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION" sinks: metrics: type: prometheus_exporter @@ -839,3 +840,19 @@ sinks: enabled: true encoding: codec: json + libp2p_trace_gossipsub_beacon_attestation_kafka: + type: kafka + buffer: + max_events: 500000 + batch: + timeout_secs: 0.5 + inputs: + - xatu_server_events_router.libp2p_trace_gossipsub_beacon_attestation + bootstrap_servers: "${KAFKA_BROKERS}" + key_field: "event.id" + topic: libp2p-trace-gossipsub-beacon-attestation + compression: snappy + healthcheck: + enabled: true + encoding: + codec: json diff --git a/deploy/local/docker-compose/vector-kafka-clickhouse-libp2p.yaml b/deploy/local/docker-compose/vector-kafka-clickhouse-libp2p.yaml new file mode 100644 index 00000000..232decac --- /dev/null +++ b/deploy/local/docker-compose/vector-kafka-clickhouse-libp2p.yaml @@ -0,0 +1,1723 @@ +api: + enabled: true + address: 0.0.0.0:8686 + playground: true +acknowledgements: + enabled: true +sources: + internal_metrics: + type: internal_metrics + libp2p_trace_kafka: + type: kafka + bootstrap_servers: "${KAFKA_BROKERS}" + group_id: xatu-vector-kafka-clickhouse-libp2p-trace + key_field: "event.id" + decoding: + codec: json + topics: + - "^libp2p-trace.+" + auto_offset_reset: earliest + librdkafka_options: + message.max.bytes: "10485760" # 10MB +transforms: + xatu_server_events_meta: + type: remap + inputs: + - libp2p_trace_kafka + source: |- + .meta_client_name = .meta.client.name + .meta_client_id = .meta.client.id + .meta_client_version = .meta.client.version + .meta_client_implementation = .meta.client.implementation + .meta_client_os = .meta.client.os + if exists(.meta.server.client.ip) && is_string(.meta.server.client.ip) { + if is_ipv4!(.meta.server.client.ip) { + .meta_client_ip = ip_to_ipv6!(.meta.server.client.ip) + } else if is_ipv6!(.meta.server.client.ip) { + .meta_client_ip = .meta.server.client.ip + } + } + if exists(.meta.server.client.geo) { + .meta_client_geo_city = .meta.server.client.geo.city + .meta_client_geo_country = .meta.server.client.geo.country + .meta_client_geo_country_code = .meta.server.client.geo.country_code + .meta_client_geo_continent_code = .meta.server.client.geo.continent_code + .meta_client_geo_longitude = .meta.server.client.geo.longitude + .meta_client_geo_latitude = .meta.server.client.geo.latitude + .meta_client_geo_autonomous_system_number = .meta.server.client.geo.autonomous_system_number + .meta_client_geo_autonomous_system_organization = .meta.server.client.geo.autonomous_system_organization + } + .meta_network_id = .meta.client.ethereum.network.id + .meta_network_name = .meta.client.ethereum.network.name + if exists(.meta.client.ethereum.consensus) { + .meta_consensus_implementation = .meta.client.ethereum.consensus.implementation + if is_string(.meta.client.ethereum.consensus.version) { + version, err = split(.meta.client.ethereum.consensus.version, "/", limit: 3) + if err == null && length(version) > 1 { + .meta_consensus_version = version[1] + } + if is_string(.meta_consensus_version) { + sematic_version, err = split(.meta_consensus_version, ".", limit: 3) + if err == null { + if sematic_version[0] != null { + version_major, err = replace(sematic_version[0], "v", "", count: 1) + if err == null { + .meta_consensus_version_major = version_major + .meta_consensus_version_minor = sematic_version[1] + if sematic_version[2] != null { + version_patch, err = replace(sematic_version[2], r'[-+ ](.*)', "") + if err == null { + .meta_consensus_version_patch = version_patch + } + } + } + } + } + } + } + } + if exists(.meta.client.ethereum.execution) { + if exists(.meta.client.ethereum.execution.fork_id) { + .meta_execution_fork_id_hash = .meta.client.ethereum.execution.fork_id.hash + .meta_execution_fork_id_next = .meta.client.ethereum.execution.fork_id.next + } + } + if exists(.meta.client.labels) { + .meta_labels = .meta.client.labels + } + + # handle event name pathing and map it back to .data, .meta.client.additional_data, .meta.server.additional_data + if !exists(.data) { + data, err = get(value: ., path: [.event.name]) + if err == null { + .data = data + } else { + .error = err + .error_description = "failed to get data" + log(., level: "error", rate_limit_secs: 60) + } + + cleanedUpData, err = remove(value: ., path: [.event.name]) + if err == null { + . = cleanedUpData + } else { + .error = err + .error_description = "failed to remove data" + log(., level: "error", rate_limit_secs: 60) + } + + if exists(.meta.client) { + clientAdditionalData, err = get(value: .meta.client, path: [.event.name]) + if err == null { + .meta.client.additional_data = clientAdditionalData + } else { + .error = err + .error_description = "failed to get client additional data" + log(., level: "error", rate_limit_secs: 60) + } + + cleanedUpClient, err = remove(value: .meta.client, path: [.event.name]) + if err == null { + .meta.client = cleanedUpClient + } else { + .error = err + .error_description = "failed to remove client additional data" + log(., level: "error", rate_limit_secs: 60) + } + } + + if exists(.meta.server) { + serverAdditionalData, err = get(value: .meta.server, path: [.event.name]) + if err == null { + .meta.server.additional_data = serverAdditionalData + } else { + .error = err + .error_description = "failed to get server additional data" + log(., level: "error", rate_limit_secs: 60) + } + + cleanedUpClient, err = remove(value: .meta.server, path: [.event.name]) + if err == null { + .meta.server = cleanedUpClient + } else { + .error = err + .error_description = "failed to remove server additional data" + log(., level: "error", rate_limit_secs: 60) + } + } + } + if exists(.meta.client.additional_data.peer.user_agent) { + agent, err = split(.meta.client.additional_data.peer.user_agent, "/", limit: 4) + if err == null && length(agent) > 1 { + implementation, err = downcase(agent[0]) + if err == null { + .peer_implementation = implementation + # handle teku case with teku/teku/v1.1.1 + if agent[0] == agent[1] { + .peer_version = agent[2] + } else { + .peer_version = agent[1] + } + } + } + if is_string(.peer_version) { + sematic_version, err = split(.peer_version, ".", limit: 3) + if err == null { + if sematic_version[0] != null { + version_major, err = replace(sematic_version[0], "v", "", count: 1) + if err == null { + .peer_version_major = version_major + .peer_version_minor = sematic_version[1] + if sematic_version[2] != null { + version_patch, err = replace(sematic_version[2], r'[-+ ](.*)', "") + if err == null { + .peer_version_patch = version_patch + } + } + } + } + } + } + } + if exists(.meta.server.additional_data.peer.geo) { + .peer_geo_city = .meta.server.additional_data.peer.geo.city + .peer_geo_country = .meta.server.additional_data.peer.geo.country + .peer_geo_country_code = .meta.server.additional_data.peer.geo.country_code + .peer_geo_continent_code = .meta.server.additional_data.peer.geo.continent_code + .peer_geo_longitude = .meta.server.additional_data.peer.geo.longitude + .peer_geo_latitude = .meta.server.additional_data.peer.geo.latitude + .peer_geo_autonomous_system_number = .meta.server.additional_data.peer.geo.autonomous_system_number + .peer_geo_autonomous_system_organization = .meta.server.additional_data.peer.geo.autonomous_system_organization + } + + # delete kafka fields + del(.timestamp) + del(.topic) + del(.source_type) + del(.partition) + del(.offset) + del(.message_key) + del(.headers) + del(.path) + xatu_server_events_router: + type: route + inputs: + - xatu_server_events_meta + route: + libp2p_trace_connected: .event.name == "LIBP2P_TRACE_CONNECTED" + libp2p_trace_disconnected: .event.name == "LIBP2P_TRACE_DISCONNECTED" + libp2p_trace_add_peer: .event.name == "LIBP2P_TRACE_ADD_PEER" + libp2p_trace_remove_peer: .event.name == "LIBP2P_TRACE_REMOVE_PEER" + libp2p_trace_recv_rpc: .event.name == "LIBP2P_TRACE_RECV_RPC" + libp2p_trace_send_rpc: .event.name == "LIBP2P_TRACE_SEND_RPC" + libp2p_trace_join: .event.name == "LIBP2P_TRACE_JOIN" + libp2p_trace_handle_metadata: .event.name == "LIBP2P_TRACE_HANDLE_METADATA" + libp2p_trace_handle_status: .event.name == "LIBP2P_TRACE_HANDLE_STATUS" + libp2p_trace_gossipsub_beacon_block: .event.name == "LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK" + libp2p_trace_gossipsub_beacon_attestation: .event.name == "LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION" + xatu_server_events_router_matched: + type: log_to_metric + inputs: + - xatu_server_events_router.libp2p_trace_connected + - xatu_server_events_router.libp2p_trace_disconnected + - xatu_server_events_router.libp2p_trace_add_peer + - xatu_server_events_router.libp2p_trace_remove_peer + - xatu_server_events_router.libp2p_trace_recv_rpc + - xatu_server_events_router.libp2p_trace_send_rpc + - xatu_server_events_router.libp2p_trace_join + - xatu_server_events_router.libp2p_trace_handle_metadata + - xatu_server_events_router.libp2p_trace_handle_status + - xatu_server_events_router.libp2p_trace_gossipsub_beacon_block + - xatu_server_events_router.libp2p_trace_gossipsub_beacon_attestation + metrics: + - type: counter + field: event.name + namespace: xatu + name: xatu_server_events_matched + tags: + event: "{{event.name}}" + source: "xatu-kafka-clickhouse" + xatu_server_events_router_unmatched: + type: log_to_metric + inputs: + - xatu_server_events_router._unmatched + metrics: + - type: counter + field: event.name + namespace: xatu + name: xatu_server_events_unmatched + tags: + event: "{{event.name}}" + source: "xatu-kafka-clickhouse" + libp2p_trace_peer_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_connected + - xatu_server_events_router.libp2p_trace_disconnected + source: |- + .peer_id = .data.remote_peer + key, err = .data.remote_peer + .meta_network_name + if err != null { + .error = err + .error_description = "failed to generate unique key" + log(., level: "error", rate_limit_secs: 60) + } + .unique_key = seahash(key) + .updated_date_time = to_unix_timestamp(now()) + del(.event) + del(.meta) + del(.data) + libp2p_trace_connected_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_connected + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + peer_id_key, err = .data.remote_peer + .meta_network_name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .remote_peer_id_unique_key = seahash(peer_id_key) + addrParts, err = split(.data.remote_maddrs, "/") + if err != null { + .error = err + .error_description = "failed to split remote_maddrs" + log(., level: "error", rate_limit_secs: 60) + } else { + if length(addrParts) >= 5 { + .remote_protocol = addrParts[1] + .remote_ip = addrParts[2] + .remote_transport_protocol = addrParts[3] + .remote_port = addrParts[4] + } else { + .error_description = "failed to split remote_maddrs" + log(., level: "error", rate_limit_secs: 60) + } + } + if exists(.meta.server.additional_data.peer.geo) { + .remote_geo_city = .meta.server.additional_data.peer.geo.city + .remote_geo_country = .meta.server.additional_data.peer.geo.country + .remote_geo_country_code = .meta.server.additional_data.peer.geo.country_code + .remote_geo_continent_code = .meta.server.additional_data.peer.geo.continent_code + .remote_geo_longitude = .meta.server.additional_data.peer.geo.longitude + .remote_geo_latitude = .meta.server.additional_data.peer.geo.latitude + .remote_geo_autonomous_system_number = .meta.server.additional_data.peer.geo.autonomous_system_number + .remote_geo_autonomous_system_organization = .meta.server.additional_data.peer.geo.autonomous_system_organization + } + if is_string(.data.agent_version) { + agent_version_cleaned = replace(to_string!(.data.agent_version), "teku/teku", "teku", count: 1) + agent_version = split(agent_version_cleaned, "/", limit: 4) + if length(agent_version) > 0 { + if is_string(agent_version[0]) { + implementation, err = downcase(agent_version[0]) + if err == null { + .remote_agent_implementation = implementation + } + } + } + if length(agent_version) > 1 { + if is_string(agent_version[1]) { + .remote_agent_version = agent_version[1] + if is_string(.remote_agent_version) { + sematic_version, err = split(.remote_agent_version, ".", limit: 3) + if err == null { + if sematic_version[0] != null { + version_major, err = replace(sematic_version[0], "v", "", count: 1) + if err == null { + .remote_agent_version_major = version_major + .remote_agent_version_minor = sematic_version[1] + if sematic_version[2] != null { + version_patch, err = replace(sematic_version[2], r'[-+ ](.*)', "") + if err == null { + .remote_agent_version_patch = version_patch + } + } + } + } + } + } + } + } + if length(agent_version) > 2 { + if is_string(agent_version[2]) && .remote_agent_implementation != "prysm" { + .remote_agent_platform = agent_version[2] + } + } + } + .direction = .data.direction + opened, err = parse_timestamp(.data.opened, format: "%+") + if err == null { + .opened = to_unix_timestamp(opened) + } else { + .error = err + .error_description = "failed to parse opened" + log(., level: "error", rate_limit_secs: 60) + } + .transient = .data.transient + .unique_key = seahash(.event.id) + .updated_date_time = to_unix_timestamp(now()) + del(.event) + del(.meta) + del(.data) + libp2p_trace_disconnected_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_disconnected + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + peer_id_key, err = .data.remote_peer + .meta_network_name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .remote_peer_id_unique_key = seahash(peer_id_key) + addrParts, err = split(.data.remote_maddrs, "/") + if err != null { + .error = err + .error_description = "failed to split remote_maddrs" + log(., level: "error", rate_limit_secs: 60) + } else { + if length(addrParts) >= 5 { + .remote_protocol = addrParts[1] + .remote_ip = addrParts[2] + .remote_transport_protocol = addrParts[3] + .remote_port = addrParts[4] + } else { + .error_description = "failed to split remote_maddrs" + log(., level: "error", rate_limit_secs: 60) + } + } + if exists(.meta.server.additional_data.peer.geo) { + .remote_geo_city = .meta.server.additional_data.peer.geo.city + .remote_geo_country = .meta.server.additional_data.peer.geo.country + .remote_geo_country_code = .meta.server.additional_data.peer.geo.country_code + .remote_geo_continent_code = .meta.server.additional_data.peer.geo.continent_code + .remote_geo_longitude = .meta.server.additional_data.peer.geo.longitude + .remote_geo_latitude = .meta.server.additional_data.peer.geo.latitude + .remote_geo_autonomous_system_number = .meta.server.additional_data.peer.geo.autonomous_system_number + .remote_geo_autonomous_system_organization = .meta.server.additional_data.peer.geo.autonomous_system_organization + } + if is_string(.data.agent_version) { + agent_version_cleaned = replace(to_string!(.data.agent_version), "teku/teku", "teku", count: 1) + agent_version = split(agent_version_cleaned, "/", limit: 4) + if length(agent_version) > 0 { + if is_string(agent_version[0]) { + implementation, err = downcase(agent_version[0]) + if err == null { + .remote_agent_implementation = implementation + } + } + } + if length(agent_version) > 1 { + if is_string(agent_version[1]) { + .remote_agent_version = agent_version[1] + if is_string(.remote_agent_version) { + sematic_version, err = split(.remote_agent_version, ".", limit: 3) + if err == null { + if sematic_version[0] != null { + version_major, err = replace(sematic_version[0], "v", "", count: 1) + if err == null { + .remote_agent_version_major = version_major + .remote_agent_version_minor = sematic_version[1] + if sematic_version[2] != null { + version_patch, err = replace(sematic_version[2], r'[-+ ](.*)', "") + if err == null { + .remote_agent_version_patch = version_patch + } + } + } + } + } + } + } + } + if length(agent_version) > 2 { + if is_string(agent_version[2]) && .remote_agent_implementation != "prysm" { + .remote_agent_platform = agent_version[2] + } + } + } + .direction = .data.direction + opened, err = parse_timestamp(.data.opened, format: "%+") + if err == null { + .opened = to_unix_timestamp(opened) + } else { + .error = err + .error_description = "failed to parse opened" + log(., level: "error", rate_limit_secs: 60) + } + .transient = .data.transient + .unique_key = seahash(.event.id) + .updated_date_time = to_unix_timestamp(now()) + del(.event) + del(.meta) + del(.data) + libp2p_trace_add_peer_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_add_peer + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + peer_id_key, err = .data.peer_id + .meta_network_name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .peer_id_unique_key = seahash(peer_id_key) + .protocol = .data.protocol + .unique_key = seahash(.event.id) + .updated_date_time = to_unix_timestamp(now()) + del(.event) + del(.meta) + del(.data) + del(.path) + libp2p_trace_remove_peer_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_remove_peer + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + peer_id_key, err = .data.peer_id + .meta_network_name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .peer_id_unique_key = seahash(peer_id_key) + .unique_key = seahash(.event.id) + .updated_date_time = to_unix_timestamp(now()) + del(.event) + del(.meta) + del(.data) + del(.path) + libp2p_trace_join_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_join + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + topicParts, err = split(.data.topic, "/") + if err != null { + .error = err + .error_description = "failed to split topic" + log(., level: "error", rate_limit_secs: 60) + } else { + if length(topicParts) == 5 { + .topic_layer = topicParts[1] + .topic_fork_digest_value = topicParts[2] + .topic_name = topicParts[3] + .topic_encoding = topicParts[4] + } else { + .error_description = "failed to split topic" + log(., level: "error", rate_limit_secs: 60) + } + } + peer_id_key, err = .meta.client.additional_data.metadata.peer_id + .meta_network_name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .peer_id_unique_key = seahash(peer_id_key) + .unique_key = seahash(.event.id) + .updated_date_time = to_unix_timestamp(now()) + del(.event) + del(.meta) + del(.data) + del(.path) + + libp2p_trace_gossipsub_beacon_block_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_gossipsub_beacon_block + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + + peer_id_key, err = .meta.client.additional_data.metadata.peer_id + .meta.ethereum.network.name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .peer_id_unique_key = seahash(peer_id_key) + .unique_key = seahash(.event.id) + + .proposer_index = .data.proposer_index + + + .propagation_slot_start_diff = .meta.client.additional_data.propagation.slot_start_diff + .block = .data.block + + .slot = .data.slot + slot_start_date_time, err = parse_timestamp(.meta.client.additional_data.slot.start_date_time, format: "%+"); + if err == null { + .slot_start_date_time = to_unix_timestamp(slot_start_date_time) + } else { + .error = err + .error_description = "failed to parse slot start date time" + log(., level: "error", rate_limit_secs: 60) + } + .epoch = .meta.client.additional_data.epoch.number + epoch_start_date_time, err = parse_timestamp(.meta.client.additional_data.epoch.start_date_time, format: "%+"); + if err == null { + .epoch_start_date_time = to_unix_timestamp(epoch_start_date_time) + } else { + .error = err + .error_description = "failed to parse epoch start date time" + log(., level: "error", rate_limit_secs: 60) + } + + .wallclock_slot = .meta.client.additional_data.wallclock_slot.number + wallclock_slot_start_date_time, err = parse_timestamp(.meta.client.additional_data.wallclock_slot.start_date_time, format: "%+"); + if err == null { + .wallclock_slot_start_date_time = to_unix_timestamp(wallclock_slot_start_date_time) + } else { + .error = err + .error_description = "failed to parse wallclock slot start date time" + log(., level: "error", rate_limit_secs: 60) + } + .wallclock_epoch = .meta.client.additional_data.epoch.number + wallclock_epoch_start_date_time, err = parse_timestamp(.meta.client.additional_data.wallclock_epoch.start_date_time, format: "%+"); + if err == null { + .wallclock_epoch_start_date_time = to_unix_timestamp(wallclock_epoch_start_date_time) + } else { + .error = err + .error_description = "failed to parse wallclock epoch start date time" + log(., level: "error", rate_limit_secs: 60) + } + + topicParts, err = split(.meta.client.additional_data.topic, "/") + if err != null { + .error = err + .error_description = "failed to split topic" + } else { + if length(topicParts) != 5 { + errDebug = { + "topic": .meta.client.additional_data.topic, + } + .error_description = "failed to split topic" + } + } + + .topic_layer = topicParts[1] + .topic_fork_digest_value = topicParts[2] + .topic_name = topicParts[3] + .topic_encoding = topicParts[4] + + .message_size = .meta.client.additional_data.message_size + .message_id = .meta.client.additional_data.message_id + + .updated_date_time = to_unix_timestamp(now()) + + del(.event) + del(.meta) + del(.data) + del(.path) + libp2p_trace_gossipsub_beacon_attestation_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_gossipsub_beacon_attestation + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + + peer_id_key, err = .meta.client.additional_data.metadata.peer_id + .meta.ethereum.network.name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .peer_id_unique_key = seahash(peer_id_key) + .unique_key = seahash(.event.id) + + .attesting_validator_index = .meta.client.additional_data.attesting_validator.index + .attesting_validator_committee_index = .meta.client.additional_data.attesting_validator.committee_index + + .propagation_slot_start_diff = .meta.client.additional_data.propagation.slot_start_diff + .beacon_block_root = .data.data.beacon_block_root + .committee_index = .data.data.index + + .slot = .data.data.slot + slot_start_date_time, err = parse_timestamp(.meta.client.additional_data.slot.start_date_time, format: "%+"); + if err == null { + .slot_start_date_time = to_unix_timestamp(slot_start_date_time) + } else { + .error = err + .error_description = "failed to parse slot start date time" + log(., level: "error", rate_limit_secs: 60) + } + .epoch = .meta.client.additional_data.epoch.number + epoch_start_date_time, err = parse_timestamp(.meta.client.additional_data.epoch.start_date_time, format: "%+"); + if err == null { + .epoch_start_date_time = to_unix_timestamp(epoch_start_date_time) + } else { + .error = err + .error_description = "failed to parse epoch start date time" + log(., level: "error", rate_limit_secs: 60) + } + + .wallclock_slot = .meta.client.additional_data.wallclock_slot.number + wallclock_slot_start_date_time, err = parse_timestamp(.meta.client.additional_data.wallclock_slot.start_date_time, format: "%+"); + if err == null { + .wallclock_slot_start_date_time = to_unix_timestamp(wallclock_slot_start_date_time) + } else { + .error = err + .error_description = "failed to parse wallclock slot start date time" + log(., level: "error", rate_limit_secs: 60) + } + .wallclock_epoch = .meta.client.additional_data.epoch.number + wallclock_epoch_start_date_time, err = parse_timestamp(.meta.client.additional_data.wallclock_epoch.start_date_time, format: "%+"); + if err == null { + .wallclock_epoch_start_date_time = to_unix_timestamp(wallclock_epoch_start_date_time) + } else { + .error = err + .error_description = "failed to parse wallclock epoch start date time" + log(., level: "error", rate_limit_secs: 60) + } + + .source_epoch = .data.data.source.epoch + source_epoch_start_date_time, err = parse_timestamp(.meta.client.additional_data.source.epoch.start_date_time, format: "%+"); + if err == null { + .source_epoch_start_date_time = to_unix_timestamp(source_epoch_start_date_time) + } else { + .error = err + .error_description = "failed to parse source epoch start date time" + log(., level: "error", rate_limit_secs: 60) + } + .source_root = .data.data.source.root + .target_epoch = .data.data.target.epoch + target_epoch_start_date_time, err = parse_timestamp(.meta.client.additional_data.target.epoch.start_date_time, format: "%+"); + if err == null { + .target_epoch_start_date_time = to_unix_timestamp(target_epoch_start_date_time) + } else { + .error = err + .error_description = "failed to parse target epoch start date time" + log(., level: "error", rate_limit_secs: 60) + } + + .target_root = .data.data.target.root + topicParts, err = split(.meta.client.additional_data.topic, "/") + if err != null { + .error = err + .error_description = "failed to split topic" + } else { + if length(topicParts) != 5 { + .errDebug = { + "topic": .meta.client.additional_data.topic, + } + .error_description = "failed to split topic" + log(., level: "error", rate_limit_secs: 60) + } + } + + .topic_layer = topicParts[1] + .topic_fork_digest_value = topicParts[2] + .topic_name = topicParts[3] + .topic_encoding = topicParts[4] + + .message_size = .meta.client.additional_data.message_size + .message_id = .meta.client.additional_data.message_id + + .updated_date_time = to_unix_timestamp(now()) + + del(.event) + del(.meta) + del(.data) + del(.path) + libp2p_trace_rpc_exploder: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_recv_rpc + - xatu_server_events_router.libp2p_trace_send_rpc + source: |- + # Parsing the main RPC event + .unique_key = seahash(.event.id) + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + .updated_date_time = to_unix_timestamp(now()) + + # Emit the main RPC event record + events = [] + + peer_id_key, err = .data.meta.peer_id + .meta_network_name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + + rootEvent = { + "event_name": .event.name, + "unique_key": .unique_key, + "key": .event.id, + "event_date_time": .event_date_time, + "updated_date_time": .updated_date_time, + "peer_id_unique_key": seahash(peer_id_key), + "meta_client_name": .meta_client_name, + "meta_client_id": .meta_client_id, + "meta_client_version": .meta_client_version, + "meta_client_implementation": .meta_client_implementation, + "meta_client_os": .meta_client_os, + "meta_client_ip": .meta_client_ip, + "meta_network_id": .meta_network_id, + "meta_network_name": .meta_network_name, + "meta_client_geo_city": .meta_client_geo_city, + "meta_client_geo_country": .meta_client_geo_country, + "meta_client_geo_country_code": .meta_client_geo_country_code, + "meta_client_geo_continent_code": .meta_client_geo_continent_code, + "meta_client_geo_longitude": .meta_client_geo_longitude, + "meta_client_geo_latitude": .meta_client_geo_latitude, + "meta_client_geo_autonomous_system_number": .meta_client_geo_autonomous_system_number, + "meta_client_geo_autonomous_system_organization": .meta_client_geo_autonomous_system_organization + } + + if .error != null { + log(., level: "error", rate_limit_secs: 60) + assert!(.error == null, message: join!(["Error occurred when generating libp2p_rpc base event: ", .error_description])) + } + + error = null + errorMsg = "" + errDebug = {} + + if .data.meta.subscriptions != null { + for_each(array!(.data.meta.subscriptions)) -> |_index, sub| { + key, err = rootEvent.key + "rpc_meta_subscription" + to_string(_index) + if err != null { + errDebug = { + "root_event_key": rootEvent.key, + "index": _index, + } + error = err + errorMsg = "failed to generate unique key for rpc_meta_subscription" + } + + unique_key = seahash(key) + + topicParts, err = split(sub.topic_id, "/") + if err != null { + .error = err + .error_description = "failed to split topic for rpc_meta_subscription" + } else { + if length(topicParts) != 5 { + errDebug = { + "topic_id": sub.topic_id, + } + .error_description = "failed to split topic for rpc_meta_subscription" + } + } + + events = push(events, { + "event_name": "LIBP2P_TRACE_RPC_META_SUBSCRIPTION", + "unique_key": unique_key, + "control_index": _index, + "rpc_meta_unique_key": rootEvent.unique_key, + "subscribe": sub.subscribe, + "topic_layer": topicParts[1], + "topic_fork_digest_value": topicParts[2], + "topic_name": topicParts[3], + "topic_encoding": topicParts[4], + "updated_date_time": rootEvent.updated_date_time, + "event_date_time": rootEvent.event_date_time, + "peer_id_unique_key": rootEvent.peer_id_unique_key, + "meta_client_name": rootEvent.meta_client_name, + "meta_client_id": rootEvent.meta_client_id, + "meta_client_version": rootEvent.meta_client_version, + "meta_client_implementation": rootEvent.meta_client_implementation, + "meta_client_os": rootEvent.meta_client_os, + "meta_client_ip": rootEvent.meta_client_ip, + "meta_network_id": rootEvent.meta_network_id, + "meta_network_name": rootEvent.meta_network_name, + "meta_client_geo_city": rootEvent.meta_client_geo_city, + "meta_client_geo_country": rootEvent.meta_client_geo_country, + "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, + "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, + "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, + "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, + "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, + "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization + }) + } + } + + if error != null { + log(., level: "error", rate_limit_secs: 60) + assert!(error == null, message: join!(["Error occurred when generating libp2p_rpc_meta events: ", errorMsg])) + } + + if .data.meta.messages != null { + for_each(array!(.data.meta.messages)) -> |_index, message| { + key, err = rootEvent.key + "rpc_meta_message" + to_string(_index) + if err != null { + errDebug = { + "root_event_key": rootEvent.key, + "index": _index, + } + error = err + errorMsg = "failed to generate unique key for rpc_meta_message" + } + + unique_key = seahash(key) + + topicParts, err = split(message.topic, "/") + if err != null { + .error = err + .error_description = "failed to split topic for rpc_meta_message" + } else { + if length(topicParts) != 5 { + errDebug = { + "topic_id": message.topic, + } + .error_description = "failed to split topic for rpc_meta_message" + } + } + + events = push(events, { + "event_name": "LIBP2P_TRACE_RPC_META_MESSAGE", + "unique_key": unique_key, + "control_index": _index, + "rpc_meta_unique_key": rootEvent.unique_key, + "topic_layer": topicParts[1], + "topic_fork_digest_value": topicParts[2], + "topic_name": topicParts[3], + "topic_encoding": topicParts[4], + "updated_date_time": rootEvent.updated_date_time, + "event_date_time": rootEvent.event_date_time, + "peer_id_unique_key": rootEvent.peer_id_unique_key, + "meta_client_name": rootEvent.meta_client_name, + "meta_client_id": rootEvent.meta_client_id, + "meta_client_version": rootEvent.meta_client_version, + "meta_client_implementation": rootEvent.meta_client_implementation, + "meta_client_os": rootEvent.meta_client_os, + "meta_client_ip": rootEvent.meta_client_ip, + "meta_network_id": rootEvent.meta_network_id, + "meta_network_name": rootEvent.meta_network_name, + "meta_client_geo_city": rootEvent.meta_client_geo_city, + "meta_client_geo_country": rootEvent.meta_client_geo_country, + "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, + "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, + "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, + "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, + "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, + "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization + }) + } + } + + metaControl = [] + if .data.meta.control != null { + metaControl = .data.meta.control + } + + if metaControl.ihave != null { + for_each(array!(metaControl.ihave)) -> |_ihaveindex, ihave| { + metaMessageIds = [] + if ihave.message_ids != null { + metaMessageIds = ihave.message_ids + } + for_each(array!(metaMessageIds)) -> |_messageindex, message_id| { + key, err = rootEvent.key + "rpc_meta_control_ihave" +to_string(_ihaveindex)+ "_" + to_string(_messageindex) + if err != null { + errDebug = { + "root_event_key": rootEvent.key, + "index": _messageindex, + } + error = err + errorMsg = "failed to generate unique key for rpc_meta_control_ihave" + } + + unique_key = seahash(key) + + topicParts, err = split(ihave.topic_id, "/") + if err != null { + .error = err + .error_description = "failed to split topic for rpc_meta_control_ihave" + } else { + if length(topicParts) != 5 { + errDebug = { + "topic_id": ihave.topic_id, + } + .error_description = "failed to split topic for rpc_meta_control_ihave" + } + } + + events = push(events, { + "event_name": "LIBP2P_TRACE_RPC_META_CONTROL_IHAVE", + "unique_key": unique_key, + "rpc_meta_unique_key": rootEvent.unique_key, + "message_index": _messageindex, + "control_index": _ihaveindex, + "message_id": message_id, + "topic_layer": topicParts[1], + "topic_fork_digest_value": topicParts[2], + "topic_name": topicParts[3], + "topic_encoding": topicParts[4], + "updated_date_time": rootEvent.updated_date_time, + "event_date_time": rootEvent.event_date_time, + "peer_id_unique_key": rootEvent.peer_id_unique_key, + "meta_client_name": rootEvent.meta_client_name, + "meta_client_id": rootEvent.meta_client_id, + "meta_client_version": rootEvent.meta_client_version, + "meta_client_implementation": rootEvent.meta_client_implementation, + "meta_client_os": rootEvent.meta_client_os, + "meta_client_ip": rootEvent.meta_client_ip, + "meta_network_id": rootEvent.meta_network_id, + "meta_network_name": rootEvent.meta_network_name, + "meta_client_geo_city": rootEvent.meta_client_geo_city, + "meta_client_geo_country": rootEvent.meta_client_geo_country, + "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, + "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, + "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, + "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, + "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, + "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization + }) + } + } + } + + if metaControl.iwant != null { + for_each(array!(metaControl.iwant)) -> |_iwantindex, iwant| { + metaMessageIds = [] + if iwant.message_ids != null { + metaIHave = iwant.message_ids + } + for_each(array!(iwant.message_ids)) -> |_messageindex, message_id| { + key, err = rootEvent.key + "rpc_meta_control_iwant" + to_string(_iwantindex)+ "_" + to_string(_messageindex) + if err != null { + errDebug = { + "root_event_key": rootEvent.key, + "index": _messageindex, + } + error = err + errorMsg = "failed to generate unique key for rpc_meta_control_iwant" + } + + unique_key = seahash(key) + + events = push(events, { + "event_name": "LIBP2P_TRACE_RPC_META_CONTROL_IWANT", + "unique_key": unique_key, + "rpc_meta_unique_key": rootEvent.unique_key, + "message_index": _messageindex, + "control_index": _iwantindex, + "message_id": message_id, + "updated_date_time": rootEvent.updated_date_time, + "event_date_time": rootEvent.event_date_time, + "peer_id_unique_key": rootEvent.peer_id_unique_key, + "meta_client_name": rootEvent.meta_client_name, + "meta_client_id": rootEvent.meta_client_id, + "meta_client_version": rootEvent.meta_client_version, + "meta_client_implementation": rootEvent.meta_client_implementation, + "meta_client_os": rootEvent.meta_client_os, + "meta_client_ip": rootEvent.meta_client_ip, + "meta_network_id": rootEvent.meta_network_id, + "meta_network_name": rootEvent.meta_network_name, + "meta_client_geo_city": rootEvent.meta_client_geo_city, + "meta_client_geo_country": rootEvent.meta_client_geo_country, + "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, + "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, + "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, + "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, + "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, + "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization + }) + } + } + } + + + if metaControl.graft != null { + for_each(array!(metaControl.graft)) -> |_index, graft| { + key, err = rootEvent.key + "rpc_meta_control_graft" + to_string(_index)+ "_" + graft.topic_id + if err != null { + errDebug = { + "root_event_key": rootEvent.key, + "topic_id": graft.topic_id, + } + error = err + errorMsg = "failed to generate unique key for rpc_meta_control_graft" + } + + unique_key = seahash(key) + + topicParts, err = split(graft.topic_id, "/") + if err != null { + .error = err + .error_description = "failed to split topic for rpc_meta_control_graft" + } else { + if length(topicParts) != 5 { + errDebug = { + "topic_id": graft.topic_id, + } + .error_description = "failed to split topic for rpc_meta_control_graft" + } + } + + events = push(events, { + "event_name": "LIBP2P_TRACE_RPC_META_CONTROL_GRAFT", + "unique_key": unique_key, + "rpc_meta_unique_key": rootEvent.unique_key, + "control_index": _index, + "topic_layer": topicParts[1], + "topic_fork_digest_value": topicParts[2], + "topic_name": topicParts[3], + "topic_encoding": topicParts[4], + "updated_date_time": rootEvent.updated_date_time, + "event_date_time": rootEvent.event_date_time, + "peer_id_unique_key": rootEvent.peer_id_unique_key, + "meta_client_name": rootEvent.meta_client_name, + "meta_client_id": rootEvent.meta_client_id, + "meta_client_version": rootEvent.meta_client_version, + "meta_client_implementation": rootEvent.meta_client_implementation, + "meta_client_os": rootEvent.meta_client_os, + "meta_client_ip": rootEvent.meta_client_ip, + "meta_network_id": rootEvent.meta_network_id, + "meta_network_name": rootEvent.meta_network_name, + "meta_client_geo_city": rootEvent.meta_client_geo_city, + "meta_client_geo_country": rootEvent.meta_client_geo_country, + "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, + "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, + "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, + "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, + "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, + "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization + }) + } + } + + if metaControl.prune != null { + for_each(array!(metaControl.prune)) -> |_pruneIndex, prune| { + metaPeerIds = [] + if prune.peer_ids != null { + metaPeerIds = prune.peer_ids + } + for_each(array!(metaPeerIds)) -> |_peerIndex, peer_id| { + key, err = rootEvent.key + "rpc_meta_control_prune" + to_string(_pruneIndex)+ "_" + to_string(_peerIndex) + if err != null { + errDebug = { + "root_event_key": rootEvent.key, + "topic_id": prune.topic_id, + "prune_index": _pruneIndex, + "peer_id": peer_id + } + error = err + errorMsg = "failed to generate unique key for rpc_meta_control_prune" + } + + peer_id_key, err = peer_id + rootEvent.meta_network_name + if err != null { + errDebug = { + "root_meta_network_name": rootEvent.key, + "peer_id": peer_id, + } + .error = err + .error_description = "failed to generate peer id unique key for rpc_meta_control_prune" + } + + unique_key = seahash(key) + graft_peer_id_unique_key = seahash(peer_id_key) + + topicParts, err = split(prune.topic_id, "/") + if err != null { + .error = err + .error_description = "failed to split topic for rpc_meta_control_prune" + } else { + if length(topicParts) != 5 { + errDebug = { + "topic_id": prune.topic_id, + } + .error_description = "failed to split topic for rpc_meta_control_prune" + } + } + + events = push(events, { + "event_name": "LIBP2P_TRACE_RPC_META_CONTROL_PRUNE", + "unique_key": unique_key, + "rpc_meta_unique_key": rootEvent.unique_key, + "control_index": _pruneIndex, + "peer_id_index": _peerIndex, + "topic_layer": topicParts[1], + "topic_fork_digest_value": topicParts[2], + "topic_name": topicParts[3], + "topic_encoding": topicParts[4], + "updated_date_time": rootEvent.updated_date_time, + "event_date_time": rootEvent.event_date_time, + "peer_id_unique_key": rootEvent.peer_id_unique_key, + "graft_peer_id_unique_key": graft_peer_id_unique_key, + "meta_client_name": rootEvent.meta_client_name, + "meta_client_id": rootEvent.meta_client_id, + "meta_client_version": rootEvent.meta_client_version, + "meta_client_implementation": rootEvent.meta_client_implementation, + "meta_client_os": rootEvent.meta_client_os, + "meta_client_ip": rootEvent.meta_client_ip, + "meta_network_id": rootEvent.meta_network_id, + "meta_network_name": rootEvent.meta_network_name, + "meta_client_geo_city": rootEvent.meta_client_geo_city, + "meta_client_geo_country": rootEvent.meta_client_geo_country, + "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, + "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, + "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, + "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, + "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, + "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization + }) + } + } + } + + if error != null { + .error = error + .error_description = errorMsg + log(., level: "error", rate_limit_secs: 60) + assert!(error == null, message: join!(["Error occurred when generating libp2p_rpc_meta events: ", errorMsg])) + } + + del(rootEvent.key) + + events = push(events, rootEvent) + + . = events + + libp2p_trace_rpc_events_formatted: + type: route + inputs: + - libp2p_trace_rpc_exploder + route: + meta_control_prune: .event_name == "LIBP2P_TRACE_RPC_META_CONTROL_PRUNE" + meta_control_graft: .event_name == "LIBP2P_TRACE_RPC_META_CONTROL_GRAFT" + meta_control_iwant: .event_name == "LIBP2P_TRACE_RPC_META_CONTROL_IWANT" + meta_control_ihave: .event_name == "LIBP2P_TRACE_RPC_META_CONTROL_IHAVE" + meta_message: .event_name == "LIBP2P_TRACE_RPC_META_MESSAGE" + meta_subscription: .event_name == "LIBP2P_TRACE_RPC_META_SUBSCRIPTION" + recv_rpc: .event_name == "LIBP2P_TRACE_RECV_RPC" + send_rpc: .event_name == "LIBP2P_TRACE_SEND_RPC" + libp2p_trace_handle_status_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_handle_status + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + + peer_id_key, err = .data.peer_id + .meta.ethereum.network.name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .peer_id_unique_key = seahash(peer_id_key) + .unique_key = seahash(.event.id) + + if .data.error != null { + .error = .data.error + } + + if .data.request != null { + .request_finalized_epoch = .data.request.finalized_epoch + .request_finalized_root = .data.request.finalized_root + .request_fork_digest = .data.request.fork_digest + .request_head_root = .data.request.head_root + .request_head_slot = .data.request.head_slot + } + if .data.response != null { + .response_finalized_epoch = .data.response.finalized_epoch + .response_finalized_root = .data.response.finalized_root + .response_fork_digest = .data.response.fork_digest + .response_head_root = .data.response.head_root + .response_head_slot = .data.response.head_slot + } + + .latency_milliseconds, err = .data.latency * 1000 + if err != null { + .error = err + .error_description = "failed to convert latency to millseconds" + log(., level: "error", rate_limit_secs: 60) + } + + .protocol = .data.protocol_id + + .updated_date_time = to_unix_timestamp(now()) + + del(.event) + del(.meta) + del(.data) + del(.path) + libp2p_trace_handle_metadata_formatted: + type: remap + inputs: + - xatu_server_events_router.libp2p_trace_handle_metadata + source: |- + event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); + if err == null { + .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") + } else { + .error = err + .error_description = "failed to parse event date time" + log(., level: "error", rate_limit_secs: 60) + } + + peer_id_key, err = .data.peer_id + .meta.ethereum.network.name + if err != null { + .error = err + .error_description = "failed to generate peer id unique key" + log(., level: "error", rate_limit_secs: 60) + } + .peer_id_unique_key = seahash(peer_id_key) + .unique_key = seahash(.event.id) + + if .data.error != null { + .error = .data.error + } + + .attnets = .data.metadata.attnets + .seq_number = .data.metadata.seq_number + .syncnets = .data.metadata.syncnets + + .latency_milliseconds, err = .data.latency * 1000 + if err != null { + .error = err + .error_description = "failed to convert latency to millseconds" + log(., level: "error", rate_limit_secs: 60) + } + + .protocol = .data.protocol_id + + .updated_date_time = to_unix_timestamp(now()) + + del(.event) + del(.meta) + del(.data) + del(.path) +sinks: + metrics: + type: prometheus_exporter + address: 0.0.0.0:9598 + inputs: + - xatu_server_events_router_matched + - xatu_server_events_router_unmatched + - internal_metrics + libp2p_trace_peer_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_peer_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_peer + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_connected_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_connected_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_connected + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_disconnected_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_disconnected_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_disconnected + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_add_peer_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_add_peer_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_add_peer + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_removed_peer_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_remove_peer_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_remove_peer + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_join_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_join_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_join + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_rpc_meta_control_prune_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_rpc_events_formatted.meta_control_prune + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_rpc_meta_control_prune + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_rpc_meta_control_graft_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_rpc_events_formatted.meta_control_graft + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_rpc_meta_control_graft + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_rpc_meta_control_iwant_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_rpc_events_formatted.meta_control_iwant + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_rpc_meta_control_iwant + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_rpc_meta_control_ihave_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_rpc_events_formatted.meta_control_ihave + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_rpc_meta_control_ihave + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_rpc_meta_message_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_rpc_events_formatted.meta_message + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_rpc_meta_message + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_rpc_meta_subscription_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_rpc_events_formatted.meta_subscription + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_rpc_meta_subscription + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_recv_rpc_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_rpc_events_formatted.recv_rpc + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_recv_rpc + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_send_rpc_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_rpc_events_formatted.send_rpc + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_send_rpc + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_handle_status_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_handle_status_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_handle_status + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_handle_metadata_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_handle_metadata_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_handle_metadata + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_gossipsub_beacon_block_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_gossipsub_beacon_block_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_gossipsub_beacon_block + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + libp2p_trace_gossipsub_beacon_attestation_clickhouse: + type: clickhouse + inputs: + - libp2p_trace_gossipsub_beacon_attestation_formatted + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: libp2p_gossipsub_beacon_attestation + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false diff --git a/deploy/local/docker-compose/vector-kafka-clickhouse.yaml b/deploy/local/docker-compose/vector-kafka-clickhouse.yaml index adc28f11..814d9ae1 100644 --- a/deploy/local/docker-compose/vector-kafka-clickhouse.yaml +++ b/deploy/local/docker-compose/vector-kafka-clickhouse.yaml @@ -109,18 +109,6 @@ sources: - "^beacon-api-eth-v1-proposer-.+" librdkafka_options: message.max.bytes: "10485760" # 10MB - libp2p_trace_kafka: - type: kafka - bootstrap_servers: "${KAFKA_BROKERS}" - group_id: xatu-vector-kafka-clickhouse-libp2p-trace - key_field: "event.id" - decoding: - codec: json - topics: - - "^libp2p-trace.+" - auto_offset_reset: earliest - librdkafka_options: - message.max.bytes: "10485760" # 10MB transforms: xatu_server_events_meta: type: remap @@ -134,7 +122,6 @@ transforms: - beacon_api_eth_v1_beacon_blob_sidecar_kafka - beacon_p2p_events_kafka - beacon_api_eth_v1_proposer_kafka - - libp2p_trace_kafka source: |- .meta_client_name = .meta.client.name .meta_client_id = .meta.client.id @@ -350,16 +337,6 @@ transforms: eth_v2_beacon_block: .event.name == "BEACON_API_ETH_V2_BEACON_BLOCK" mempool_transaction_v2: .event.name == "MEMPOOL_TRANSACTION_V2" mempool_transaction: .event.name == "MEMPOOL_TRANSACTION" - libp2p_trace_connected: .event.name == "LIBP2P_TRACE_CONNECTED" - libp2p_trace_disconnected: .event.name == "LIBP2P_TRACE_DISCONNECTED" - libp2p_trace_add_peer: .event.name == "LIBP2P_TRACE_ADD_PEER" - libp2p_trace_remove_peer: .event.name == "LIBP2P_TRACE_REMOVE_PEER" - libp2p_trace_recv_rpc: .event.name == "LIBP2P_TRACE_RECV_RPC" - libp2p_trace_send_rpc: .event.name == "LIBP2P_TRACE_SEND_RPC" - libp2p_trace_join: .event.name == "LIBP2P_TRACE_JOIN" - libp2p_trace_handle_metadata: .event.name == "LIBP2P_TRACE_HANDLE_METADATA" - libp2p_trace_handle_status: .event.name == "LIBP2P_TRACE_HANDLE_STATUS" - libp2p_trace_gossipsub_beacon_block: .event.name == "LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK" xatu_server_events_router_matched: type: log_to_metric inputs: @@ -398,16 +375,6 @@ transforms: - xatu_server_events_router.eth_v2_beacon_block_v2 - xatu_server_events_router.mempool_transaction - xatu_server_events_router.mempool_transaction_v2 - - xatu_server_events_router.libp2p_trace_connected - - xatu_server_events_router.libp2p_trace_disconnected - - xatu_server_events_router.libp2p_trace_add_peer - - xatu_server_events_router.libp2p_trace_remove_peer - - xatu_server_events_router.libp2p_trace_recv_rpc - - xatu_server_events_router.libp2p_trace_send_rpc - - xatu_server_events_router.libp2p_trace_join - - xatu_server_events_router.libp2p_trace_handle_metadata - - xatu_server_events_router.libp2p_trace_handle_status - - xatu_server_events_router.libp2p_trace_gossipsub_beacon_block metrics: - type: counter field: event.name @@ -1773,1372 +1740,125 @@ transforms: del(.event) del(.meta) del(.data) - libp2p_trace_peer_formatted: - type: remap +sinks: + metrics: + type: prometheus_exporter + address: 0.0.0.0:9598 inputs: - - xatu_server_events_router.libp2p_trace_connected - - xatu_server_events_router.libp2p_trace_disconnected - source: |- - .peer_id = .data.remote_peer - key, err = .data.remote_peer + .meta_network_name - if err != null { - .error = err - .error_description = "failed to generate unique key" - log(., level: "error", rate_limit_secs: 60) - } - .unique_key = seahash(key) - .updated_date_time = to_unix_timestamp(now()) - del(.event) - del(.meta) - del(.data) - libp2p_trace_connected_formatted: - type: remap + - xatu_server_events_router_matched + - xatu_server_events_router_unmatched + - internal_metrics + beacon_api_eth_v1_beacon_committee_clickhouse: + type: clickhouse inputs: - - xatu_server_events_router.libp2p_trace_connected - source: |- - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - peer_id_key, err = .data.remote_peer + .meta_network_name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - .remote_peer_id_unique_key = seahash(peer_id_key) - addrParts, err = split(.data.remote_maddrs, "/") - if err != null { - .error = err - .error_description = "failed to split remote_maddrs" - log(., level: "error", rate_limit_secs: 60) - } else { - if length(addrParts) >= 5 { - .remote_protocol = addrParts[1] - .remote_ip = addrParts[2] - .remote_transport_protocol = addrParts[3] - .remote_port = addrParts[4] - } else { - .error_description = "failed to split remote_maddrs" - log(., level: "error", rate_limit_secs: 60) - } - } - if exists(.meta.server.additional_data.peer.geo) { - .remote_geo_city = .meta.server.additional_data.peer.geo.city - .remote_geo_country = .meta.server.additional_data.peer.geo.country - .remote_geo_country_code = .meta.server.additional_data.peer.geo.country_code - .remote_geo_continent_code = .meta.server.additional_data.peer.geo.continent_code - .remote_geo_longitude = .meta.server.additional_data.peer.geo.longitude - .remote_geo_latitude = .meta.server.additional_data.peer.geo.latitude - .remote_geo_autonomous_system_number = .meta.server.additional_data.peer.geo.autonomous_system_number - .remote_geo_autonomous_system_organization = .meta.server.additional_data.peer.geo.autonomous_system_organization - } - if is_string(.data.agent_version) { - agent_version_cleaned = replace(to_string!(.data.agent_version), "teku/teku", "teku", count: 1) - agent_version = split(agent_version_cleaned, "/", limit: 4) - if length(agent_version) > 0 { - if is_string(agent_version[0]) { - implementation, err = downcase(agent_version[0]) - if err == null { - .remote_agent_implementation = implementation - } - } - } - if length(agent_version) > 1 { - if is_string(agent_version[1]) { - .remote_agent_version = agent_version[1] - if is_string(.remote_agent_version) { - sematic_version, err = split(.remote_agent_version, ".", limit: 3) - if err == null { - if sematic_version[0] != null { - version_major, err = replace(sematic_version[0], "v", "", count: 1) - if err == null { - .remote_agent_version_major = version_major - .remote_agent_version_minor = sematic_version[1] - if sematic_version[2] != null { - version_patch, err = replace(sematic_version[2], r'[-+ ](.*)', "") - if err == null { - .remote_agent_version_patch = version_patch - } - } - } - } - } - } - } - } - if length(agent_version) > 2 { - if is_string(agent_version[2]) && .remote_agent_implementation != "prysm" { - .remote_agent_platform = agent_version[2] - } - } - } - .direction = .data.direction - opened, err = parse_timestamp(.data.opened, format: "%+") - if err == null { - .opened = to_unix_timestamp(opened) - } else { - .error = err - .error_description = "failed to parse opened" - log(., level: "error", rate_limit_secs: 60) - } - .transient = .data.transient - .unique_key = seahash(.event.id) - .updated_date_time = to_unix_timestamp(now()) - del(.event) - del(.meta) - del(.data) - libp2p_trace_disconnected_formatted: - type: remap + - beacon_api_eth_v1_beacon_committee_formatted + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: beacon_api_eth_v1_beacon_committee + batch: + max_bytes: 52428800 + max_events: 1000000 + timeout_secs: 1 + buffer: + max_events: 1000000 + healthcheck: + enabled: true + skip_unknown_fields: false + beacon_api_eth_v1_events_head_clickhouse: + type: clickhouse inputs: - - xatu_server_events_router.libp2p_trace_disconnected - source: |- - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - peer_id_key, err = .data.remote_peer + .meta_network_name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - .remote_peer_id_unique_key = seahash(peer_id_key) - addrParts, err = split(.data.remote_maddrs, "/") - if err != null { - .error = err - .error_description = "failed to split remote_maddrs" - log(., level: "error", rate_limit_secs: 60) - } else { - if length(addrParts) >= 5 { - .remote_protocol = addrParts[1] - .remote_ip = addrParts[2] - .remote_transport_protocol = addrParts[3] - .remote_port = addrParts[4] - } else { - .error_description = "failed to split remote_maddrs" - log(., level: "error", rate_limit_secs: 60) - } - } - if exists(.meta.server.additional_data.peer.geo) { - .remote_geo_city = .meta.server.additional_data.peer.geo.city - .remote_geo_country = .meta.server.additional_data.peer.geo.country - .remote_geo_country_code = .meta.server.additional_data.peer.geo.country_code - .remote_geo_continent_code = .meta.server.additional_data.peer.geo.continent_code - .remote_geo_longitude = .meta.server.additional_data.peer.geo.longitude - .remote_geo_latitude = .meta.server.additional_data.peer.geo.latitude - .remote_geo_autonomous_system_number = .meta.server.additional_data.peer.geo.autonomous_system_number - .remote_geo_autonomous_system_organization = .meta.server.additional_data.peer.geo.autonomous_system_organization - } - if is_string(.data.agent_version) { - agent_version_cleaned = replace(to_string!(.data.agent_version), "teku/teku", "teku", count: 1) - agent_version = split(agent_version_cleaned, "/", limit: 4) - if length(agent_version) > 0 { - if is_string(agent_version[0]) { - implementation, err = downcase(agent_version[0]) - if err == null { - .remote_agent_implementation = implementation - } - } - } - if length(agent_version) > 1 { - if is_string(agent_version[1]) { - .remote_agent_version = agent_version[1] - if is_string(.remote_agent_version) { - sematic_version, err = split(.remote_agent_version, ".", limit: 3) - if err == null { - if sematic_version[0] != null { - version_major, err = replace(sematic_version[0], "v", "", count: 1) - if err == null { - .remote_agent_version_major = version_major - .remote_agent_version_minor = sematic_version[1] - if sematic_version[2] != null { - version_patch, err = replace(sematic_version[2], r'[-+ ](.*)', "") - if err == null { - .remote_agent_version_patch = version_patch - } - } - } - } - } - } - } - } - if length(agent_version) > 2 { - if is_string(agent_version[2]) && .remote_agent_implementation != "prysm" { - .remote_agent_platform = agent_version[2] - } - } - } - .direction = .data.direction - opened, err = parse_timestamp(.data.opened, format: "%+") - if err == null { - .opened = to_unix_timestamp(opened) - } else { - .error = err - .error_description = "failed to parse opened" - log(., level: "error", rate_limit_secs: 60) - } - .transient = .data.transient - .unique_key = seahash(.event.id) - .updated_date_time = to_unix_timestamp(now()) - del(.event) - del(.meta) - del(.data) - libp2p_trace_add_peer_formatted: - type: remap + - beacon_api_eth_v1_events_head_formatted + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: beacon_api_eth_v1_events_head + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + beacon_api_eth_v1_events_blob_sidecar_clickhouse: + type: clickhouse inputs: - - xatu_server_events_router.libp2p_trace_add_peer - source: |- - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - peer_id_key, err = .data.peer_id + .meta_network_name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - .peer_id_unique_key = seahash(peer_id_key) - .protocol = .data.protocol - .unique_key = seahash(.event.id) - .updated_date_time = to_unix_timestamp(now()) - del(.event) - del(.meta) - del(.data) - del(.path) - libp2p_trace_remove_peer_formatted: - type: remap + - beacon_api_eth_v1_events_blob_sidecar_formatted + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: beacon_api_eth_v1_events_blob_sidecar + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + beacon_api_eth_v1_events_block_clickhouse: + type: clickhouse inputs: - - xatu_server_events_router.libp2p_trace_remove_peer - source: |- - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - peer_id_key, err = .data.peer_id + .meta_network_name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - .peer_id_unique_key = seahash(peer_id_key) - .unique_key = seahash(.event.id) - .updated_date_time = to_unix_timestamp(now()) - del(.event) - del(.meta) - del(.data) - del(.path) - libp2p_trace_join_formatted: - type: remap + - beacon_api_eth_v1_events_block_formatted + auth: + strategy: basic + user: "${CLICKHOUSE_USER}" + password: "${CLICKHOUSE_PASSWORD}" + database: default + endpoint: "${CLICKHOUSE_ENDPOINT}" + table: beacon_api_eth_v1_events_block + batch: + max_bytes: 52428800 + max_events: 200000 + timeout_secs: 1 + buffer: + max_events: 200000 + healthcheck: + enabled: true + skip_unknown_fields: false + beacon_api_eth_v1_events_attestation_clickhouse: + type: clickhouse inputs: - - xatu_server_events_router.libp2p_trace_join - source: |- - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - topicParts, err = split(.data.topic, "/") - if err != null { - .error = err - .error_description = "failed to split topic" - log(., level: "error", rate_limit_secs: 60) - } else { - if length(topicParts) == 5 { - .topic_layer = topicParts[1] - .topic_fork_digest_value = topicParts[2] - .topic_name = topicParts[3] - .topic_encoding = topicParts[4] - } else { - .error_description = "failed to split topic" - log(., level: "error", rate_limit_secs: 60) - } - } - peer_id_key, err = .meta.client.additional_data.metadata.peer_id + .meta_network_name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - .peer_id_unique_key = seahash(peer_id_key) - .unique_key = seahash(.event.id) - .updated_date_time = to_unix_timestamp(now()) - del(.event) - del(.meta) - del(.data) - del(.path) - - libp2p_trace_gossipsub_beacon_block_formatted: - type: remap - inputs: - - xatu_server_events_router.libp2p_trace_gossipsub_beacon_block - source: |- - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - - peer_id_key, err = .meta.client.additional_data.metadata.peer_id + .meta.ethereum.network.name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - .peer_id_unique_key = seahash(peer_id_key) - .unique_key = seahash(.event.id) - - .proposer_index = .data.proposer_index - - - .propagation_slot_start_diff = .meta.client.additional_data.propagation.slot_start_diff - .block = .data.block - - .slot = .data.slot - slot_start_date_time, err = parse_timestamp(.meta.client.additional_data.slot.start_date_time, format: "%+"); - if err == null { - .slot_start_date_time = to_unix_timestamp(slot_start_date_time) - } else { - .error = err - .error_description = "failed to parse slot start date time" - log(., level: "error", rate_limit_secs: 60) - } - .epoch = .meta.client.additional_data.epoch.number - epoch_start_date_time, err = parse_timestamp(.meta.client.additional_data.epoch.start_date_time, format: "%+"); - if err == null { - .epoch_start_date_time = to_unix_timestamp(epoch_start_date_time) - } else { - .error = err - .error_description = "failed to parse epoch start date time" - log(., level: "error", rate_limit_secs: 60) - } - - .wallclock_slot = .meta.client.additional_data.wallclock_slot.number - wallclock_slot_start_date_time, err = parse_timestamp(.meta.client.additional_data.wallclock_slot.start_date_time, format: "%+"); - if err == null { - .wallclock_slot_start_date_time = to_unix_timestamp(wallclock_slot_start_date_time) - } else { - .error = err - .error_description = "failed to parse wallclock slot start date time" - log(., level: "error", rate_limit_secs: 60) - } - .wallclock_epoch = .meta.client.additional_data.epoch.number - wallclock_epoch_start_date_time, err = parse_timestamp(.meta.client.additional_data.wallclock_epoch.start_date_time, format: "%+"); - if err == null { - .wallclock_epoch_start_date_time = to_unix_timestamp(wallclock_epoch_start_date_time) - } else { - .error = err - .error_description = "failed to parse wallclock epoch start date time" - log(., level: "error", rate_limit_secs: 60) - } - - topicParts, err = split(.meta.client.additional_data.topic, "/") - if err != null { - .error = err - .error_description = "failed to split topic" - } else { - if length(topicParts) != 5 { - errDebug = { - "topic": .meta.client.additional_data.topic, - } - .error_description = "failed to split topic" - } - } - - .topic_layer = topicParts[1] - .topic_fork_digest_value = topicParts[2] - .topic_name = topicParts[3] - .topic_encoding = topicParts[4] - - .message_size = .meta.client.additional_data.message_size - .message_id = .meta.client.additional_data.message_id - - .updated_date_time = to_unix_timestamp(now()) - - del(.event) - del(.meta) - del(.data) - del(.path) - libp2p_trace_rpc_exploder: - type: remap - inputs: - - xatu_server_events_router.libp2p_trace_recv_rpc - - xatu_server_events_router.libp2p_trace_send_rpc - source: |- - # Parsing the main RPC event - .unique_key = seahash(.event.id) - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - .updated_date_time = to_unix_timestamp(now()) - - # Emit the main RPC event record - events = [] - - peer_id_key, err = .data.meta.peer_id + .meta_network_name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - - rootEvent = { - "event_name": .event.name, - "unique_key": .unique_key, - "key": .event.id, - "event_date_time": .event_date_time, - "updated_date_time": .updated_date_time, - "peer_id_unique_key": seahash(peer_id_key), - "meta_client_name": .meta_client_name, - "meta_client_id": .meta_client_id, - "meta_client_version": .meta_client_version, - "meta_client_implementation": .meta_client_implementation, - "meta_client_os": .meta_client_os, - "meta_client_ip": .meta_client_ip, - "meta_network_id": .meta_network_id, - "meta_network_name": .meta_network_name, - "meta_client_geo_city": .meta_client_geo_city, - "meta_client_geo_country": .meta_client_geo_country, - "meta_client_geo_country_code": .meta_client_geo_country_code, - "meta_client_geo_continent_code": .meta_client_geo_continent_code, - "meta_client_geo_longitude": .meta_client_geo_longitude, - "meta_client_geo_latitude": .meta_client_geo_latitude, - "meta_client_geo_autonomous_system_number": .meta_client_geo_autonomous_system_number, - "meta_client_geo_autonomous_system_organization": .meta_client_geo_autonomous_system_organization - } - - if .error != null { - log(., level: "error", rate_limit_secs: 60) - assert!(.error == null, message: join!(["Error occurred when generating libp2p_rpc base event: ", .error_description])) - } - - error = null - errorMsg = "" - errDebug = {} - - if .data.meta.subscriptions != null { - for_each(array!(.data.meta.subscriptions)) -> |_index, sub| { - key, err = rootEvent.key + "rpc_meta_subscription" + to_string(_index) - if err != null { - errDebug = { - "root_event_key": rootEvent.key, - "index": _index, - } - error = err - errorMsg = "failed to generate unique key for rpc_meta_subscription" - } - - unique_key = seahash(key) - - topicParts, err = split(sub.topic_id, "/") - if err != null { - .error = err - .error_description = "failed to split topic for rpc_meta_subscription" - } else { - if length(topicParts) != 5 { - errDebug = { - "topic_id": sub.topic_id, - } - .error_description = "failed to split topic for rpc_meta_subscription" - } - } - - events = push(events, { - "event_name": "LIBP2P_TRACE_RPC_META_SUBSCRIPTION", - "unique_key": unique_key, - "control_index": _index, - "rpc_meta_unique_key": rootEvent.unique_key, - "subscribe": sub.subscribe, - "topic_layer": topicParts[1], - "topic_fork_digest_value": topicParts[2], - "topic_name": topicParts[3], - "topic_encoding": topicParts[4], - "updated_date_time": rootEvent.updated_date_time, - "event_date_time": rootEvent.event_date_time, - "peer_id_unique_key": rootEvent.peer_id_unique_key, - "meta_client_name": rootEvent.meta_client_name, - "meta_client_id": rootEvent.meta_client_id, - "meta_client_version": rootEvent.meta_client_version, - "meta_client_implementation": rootEvent.meta_client_implementation, - "meta_client_os": rootEvent.meta_client_os, - "meta_client_ip": rootEvent.meta_client_ip, - "meta_network_id": rootEvent.meta_network_id, - "meta_network_name": rootEvent.meta_network_name, - "meta_client_geo_city": rootEvent.meta_client_geo_city, - "meta_client_geo_country": rootEvent.meta_client_geo_country, - "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, - "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, - "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, - "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, - "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, - "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization - }) - } - } - - if error != null { - log(., level: "error", rate_limit_secs: 60) - assert!(error == null, message: join!(["Error occurred when generating libp2p_rpc_meta events: ", errorMsg])) - } - - if .data.meta.messages != null { - for_each(array!(.data.meta.messages)) -> |_index, message| { - key, err = rootEvent.key + "rpc_meta_message" + to_string(_index) - if err != null { - errDebug = { - "root_event_key": rootEvent.key, - "index": _index, - } - error = err - errorMsg = "failed to generate unique key for rpc_meta_message" - } - - unique_key = seahash(key) - - topicParts, err = split(message.topic, "/") - if err != null { - .error = err - .error_description = "failed to split topic for rpc_meta_message" - } else { - if length(topicParts) != 5 { - errDebug = { - "topic_id": message.topic, - } - .error_description = "failed to split topic for rpc_meta_message" - } - } - - events = push(events, { - "event_name": "LIBP2P_TRACE_RPC_META_MESSAGE", - "unique_key": unique_key, - "control_index": _index, - "rpc_meta_unique_key": rootEvent.unique_key, - "topic_layer": topicParts[1], - "topic_fork_digest_value": topicParts[2], - "topic_name": topicParts[3], - "topic_encoding": topicParts[4], - "updated_date_time": rootEvent.updated_date_time, - "event_date_time": rootEvent.event_date_time, - "peer_id_unique_key": rootEvent.peer_id_unique_key, - "meta_client_name": rootEvent.meta_client_name, - "meta_client_id": rootEvent.meta_client_id, - "meta_client_version": rootEvent.meta_client_version, - "meta_client_implementation": rootEvent.meta_client_implementation, - "meta_client_os": rootEvent.meta_client_os, - "meta_client_ip": rootEvent.meta_client_ip, - "meta_network_id": rootEvent.meta_network_id, - "meta_network_name": rootEvent.meta_network_name, - "meta_client_geo_city": rootEvent.meta_client_geo_city, - "meta_client_geo_country": rootEvent.meta_client_geo_country, - "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, - "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, - "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, - "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, - "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, - "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization - }) - } - } - - metaControl = [] - if .data.meta.control != null { - metaControl = .data.meta.control - } - - if metaControl.ihave != null { - for_each(array!(metaControl.ihave)) -> |_ihaveindex, ihave| { - metaMessageIds = [] - if ihave.message_ids != null { - metaMessageIds = ihave.message_ids - } - for_each(array!(metaMessageIds)) -> |_messageindex, message_id| { - key, err = rootEvent.key + "rpc_meta_control_ihave" +to_string(_ihaveindex)+ "_" + to_string(_messageindex) - if err != null { - errDebug = { - "root_event_key": rootEvent.key, - "index": _messageindex, - } - error = err - errorMsg = "failed to generate unique key for rpc_meta_control_ihave" - } - - unique_key = seahash(key) - - topicParts, err = split(ihave.topic_id, "/") - if err != null { - .error = err - .error_description = "failed to split topic for rpc_meta_control_ihave" - } else { - if length(topicParts) != 5 { - errDebug = { - "topic_id": ihave.topic_id, - } - .error_description = "failed to split topic for rpc_meta_control_ihave" - } - } - - events = push(events, { - "event_name": "LIBP2P_TRACE_RPC_META_CONTROL_IHAVE", - "unique_key": unique_key, - "rpc_meta_unique_key": rootEvent.unique_key, - "message_index": _messageindex, - "control_index": _ihaveindex, - "message_id": message_id, - "topic_layer": topicParts[1], - "topic_fork_digest_value": topicParts[2], - "topic_name": topicParts[3], - "topic_encoding": topicParts[4], - "updated_date_time": rootEvent.updated_date_time, - "event_date_time": rootEvent.event_date_time, - "peer_id_unique_key": rootEvent.peer_id_unique_key, - "meta_client_name": rootEvent.meta_client_name, - "meta_client_id": rootEvent.meta_client_id, - "meta_client_version": rootEvent.meta_client_version, - "meta_client_implementation": rootEvent.meta_client_implementation, - "meta_client_os": rootEvent.meta_client_os, - "meta_client_ip": rootEvent.meta_client_ip, - "meta_network_id": rootEvent.meta_network_id, - "meta_network_name": rootEvent.meta_network_name, - "meta_client_geo_city": rootEvent.meta_client_geo_city, - "meta_client_geo_country": rootEvent.meta_client_geo_country, - "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, - "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, - "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, - "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, - "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, - "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization - }) - } - } - } - - if metaControl.iwant != null { - for_each(array!(metaControl.iwant)) -> |_iwantindex, iwant| { - metaMessageIds = [] - if iwant.message_ids != null { - metaIHave = iwant.message_ids - } - for_each(array!(iwant.message_ids)) -> |_messageindex, message_id| { - key, err = rootEvent.key + "rpc_meta_control_iwant" + to_string(_iwantindex)+ "_" + to_string(_messageindex) - if err != null { - errDebug = { - "root_event_key": rootEvent.key, - "index": _messageindex, - } - error = err - errorMsg = "failed to generate unique key for rpc_meta_control_iwant" - } - - unique_key = seahash(key) - - events = push(events, { - "event_name": "LIBP2P_TRACE_RPC_META_CONTROL_IWANT", - "unique_key": unique_key, - "rpc_meta_unique_key": rootEvent.unique_key, - "message_index": _messageindex, - "control_index": _iwantindex, - "message_id": message_id, - "updated_date_time": rootEvent.updated_date_time, - "event_date_time": rootEvent.event_date_time, - "peer_id_unique_key": rootEvent.peer_id_unique_key, - "meta_client_name": rootEvent.meta_client_name, - "meta_client_id": rootEvent.meta_client_id, - "meta_client_version": rootEvent.meta_client_version, - "meta_client_implementation": rootEvent.meta_client_implementation, - "meta_client_os": rootEvent.meta_client_os, - "meta_client_ip": rootEvent.meta_client_ip, - "meta_network_id": rootEvent.meta_network_id, - "meta_network_name": rootEvent.meta_network_name, - "meta_client_geo_city": rootEvent.meta_client_geo_city, - "meta_client_geo_country": rootEvent.meta_client_geo_country, - "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, - "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, - "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, - "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, - "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, - "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization - }) - } - } - } - - - if metaControl.graft != null { - for_each(array!(metaControl.graft)) -> |_index, graft| { - key, err = rootEvent.key + "rpc_meta_control_graft" + to_string(_index)+ "_" + graft.topic_id - if err != null { - errDebug = { - "root_event_key": rootEvent.key, - "topic_id": graft.topic_id, - } - error = err - errorMsg = "failed to generate unique key for rpc_meta_control_graft" - } - - unique_key = seahash(key) - - topicParts, err = split(graft.topic_id, "/") - if err != null { - .error = err - .error_description = "failed to split topic for rpc_meta_control_graft" - } else { - if length(topicParts) != 5 { - errDebug = { - "topic_id": graft.topic_id, - } - .error_description = "failed to split topic for rpc_meta_control_graft" - } - } - - events = push(events, { - "event_name": "LIBP2P_TRACE_RPC_META_CONTROL_GRAFT", - "unique_key": unique_key, - "rpc_meta_unique_key": rootEvent.unique_key, - "control_index": _index, - "topic_layer": topicParts[1], - "topic_fork_digest_value": topicParts[2], - "topic_name": topicParts[3], - "topic_encoding": topicParts[4], - "updated_date_time": rootEvent.updated_date_time, - "event_date_time": rootEvent.event_date_time, - "peer_id_unique_key": rootEvent.peer_id_unique_key, - "meta_client_name": rootEvent.meta_client_name, - "meta_client_id": rootEvent.meta_client_id, - "meta_client_version": rootEvent.meta_client_version, - "meta_client_implementation": rootEvent.meta_client_implementation, - "meta_client_os": rootEvent.meta_client_os, - "meta_client_ip": rootEvent.meta_client_ip, - "meta_network_id": rootEvent.meta_network_id, - "meta_network_name": rootEvent.meta_network_name, - "meta_client_geo_city": rootEvent.meta_client_geo_city, - "meta_client_geo_country": rootEvent.meta_client_geo_country, - "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, - "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, - "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, - "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, - "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, - "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization - }) - } - } - - if metaControl.prune != null { - for_each(array!(metaControl.prune)) -> |_pruneIndex, prune| { - metaPeerIds = [] - if prune.peer_ids != null { - metaPeerIds = prune.peer_ids - } - for_each(array!(metaPeerIds)) -> |_peerIndex, peer_id| { - key, err = rootEvent.key + "rpc_meta_control_prune" + to_string(_pruneIndex)+ "_" + to_string(_peerIndex) - if err != null { - errDebug = { - "root_event_key": rootEvent.key, - "topic_id": prune.topic_id, - "prune_index": _pruneIndex, - "peer_id": peer_id - } - error = err - errorMsg = "failed to generate unique key for rpc_meta_control_prune" - } - - peer_id_key, err = peer_id + rootEvent.meta_network_name - if err != null { - errDebug = { - "root_meta_network_name": rootEvent.key, - "peer_id": peer_id, - } - .error = err - .error_description = "failed to generate peer id unique key for rpc_meta_control_prune" - } - - unique_key = seahash(key) - graft_peer_id_unique_key = seahash(peer_id_key) - - topicParts, err = split(prune.topic_id, "/") - if err != null { - .error = err - .error_description = "failed to split topic for rpc_meta_control_prune" - } else { - if length(topicParts) != 5 { - errDebug = { - "topic_id": prune.topic_id, - } - .error_description = "failed to split topic for rpc_meta_control_prune" - } - } - - events = push(events, { - "event_name": "LIBP2P_TRACE_RPC_META_CONTROL_PRUNE", - "unique_key": unique_key, - "rpc_meta_unique_key": rootEvent.unique_key, - "control_index": _pruneIndex, - "peer_id_index": _peerIndex, - "topic_layer": topicParts[1], - "topic_fork_digest_value": topicParts[2], - "topic_name": topicParts[3], - "topic_encoding": topicParts[4], - "updated_date_time": rootEvent.updated_date_time, - "event_date_time": rootEvent.event_date_time, - "peer_id_unique_key": rootEvent.peer_id_unique_key, - "graft_peer_id_unique_key": graft_peer_id_unique_key, - "meta_client_name": rootEvent.meta_client_name, - "meta_client_id": rootEvent.meta_client_id, - "meta_client_version": rootEvent.meta_client_version, - "meta_client_implementation": rootEvent.meta_client_implementation, - "meta_client_os": rootEvent.meta_client_os, - "meta_client_ip": rootEvent.meta_client_ip, - "meta_network_id": rootEvent.meta_network_id, - "meta_network_name": rootEvent.meta_network_name, - "meta_client_geo_city": rootEvent.meta_client_geo_city, - "meta_client_geo_country": rootEvent.meta_client_geo_country, - "meta_client_geo_country_code": rootEvent.meta_client_geo_country_code, - "meta_client_geo_continent_code": rootEvent.meta_client_geo_continent_code, - "meta_client_geo_longitude": rootEvent.meta_client_geo_longitude, - "meta_client_geo_latitude": rootEvent.meta_client_geo_latitude, - "meta_client_geo_autonomous_system_number": rootEvent.meta_client_geo_autonomous_system_number, - "meta_client_geo_autonomous_system_organization": rootEvent.meta_client_geo_autonomous_system_organization - }) - } - } - } - - if error != null { - .error = error - .error_description = errorMsg - log(., level: "error", rate_limit_secs: 60) - assert!(error == null, message: join!(["Error occurred when generating libp2p_rpc_meta events: ", errorMsg])) - } - - del(rootEvent.key) - - events = push(events, rootEvent) - - . = events - - libp2p_trace_rpc_events_formatted: - type: route - inputs: - - libp2p_trace_rpc_exploder - route: - meta_control_prune: .event_name == "LIBP2P_TRACE_RPC_META_CONTROL_PRUNE" - meta_control_graft: .event_name == "LIBP2P_TRACE_RPC_META_CONTROL_GRAFT" - meta_control_iwant: .event_name == "LIBP2P_TRACE_RPC_META_CONTROL_IWANT" - meta_control_ihave: .event_name == "LIBP2P_TRACE_RPC_META_CONTROL_IHAVE" - meta_message: .event_name == "LIBP2P_TRACE_RPC_META_MESSAGE" - meta_subscription: .event_name == "LIBP2P_TRACE_RPC_META_SUBSCRIPTION" - recv_rpc: .event_name == "LIBP2P_TRACE_RECV_RPC" - send_rpc: .event_name == "LIBP2P_TRACE_SEND_RPC" - libp2p_trace_handle_status_formatted: - type: remap - inputs: - - xatu_server_events_router.libp2p_trace_handle_status - source: |- - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - - peer_id_key, err = .data.peer_id + .meta.ethereum.network.name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - .peer_id_unique_key = seahash(peer_id_key) - .unique_key = seahash(.event.id) - - if .data.error != null { - .error = .data.error - } - - if .data.request != null { - .request_finalized_epoch = .data.request.finalized_epoch - .request_finalized_root = .data.request.finalized_root - .request_fork_digest = .data.request.fork_digest - .request_head_root = .data.request.head_root - .request_head_slot = .data.request.head_slot - } - if .data.response != null { - .response_finalized_epoch = .data.response.finalized_epoch - .response_finalized_root = .data.response.finalized_root - .response_fork_digest = .data.response.fork_digest - .response_head_root = .data.response.head_root - .response_head_slot = .data.response.head_slot - } - - .latency_milliseconds, err = .data.latency * 1000 - if err != null { - .error = err - .error_description = "failed to convert latency to millseconds" - log(., level: "error", rate_limit_secs: 60) - } - - .protocol = .data.protocol_id - - .updated_date_time = to_unix_timestamp(now()) - - del(.event) - del(.meta) - del(.data) - del(.path) - libp2p_trace_handle_metadata_formatted: - type: remap - inputs: - - xatu_server_events_router.libp2p_trace_handle_metadata - source: |- - event_date_time, err = parse_timestamp(.event.date_time, format: "%+"); - if err == null { - .event_date_time = to_unix_timestamp(event_date_time, unit: "milliseconds") - } else { - .error = err - .error_description = "failed to parse event date time" - log(., level: "error", rate_limit_secs: 60) - } - - peer_id_key, err = .data.peer_id + .meta.ethereum.network.name - if err != null { - .error = err - .error_description = "failed to generate peer id unique key" - log(., level: "error", rate_limit_secs: 60) - } - .peer_id_unique_key = seahash(peer_id_key) - .unique_key = seahash(.event.id) - - if .data.error != null { - .error = .data.error - } - - .attnets = .data.metadata.attnets - .seq_number = .data.metadata.seq_number - .syncnets = .data.metadata.syncnets - - .latency_milliseconds, err = .data.latency * 1000 - if err != null { - .error = err - .error_description = "failed to convert latency to millseconds" - log(., level: "error", rate_limit_secs: 60) - } - - .protocol = .data.protocol_id - - .updated_date_time = to_unix_timestamp(now()) - - del(.event) - del(.meta) - del(.data) - del(.path) -sinks: - metrics: - type: prometheus_exporter - address: 0.0.0.0:9598 - inputs: - - xatu_server_events_router_matched - - xatu_server_events_router_unmatched - - internal_metrics - beacon_api_eth_v1_beacon_committee_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_beacon_committee_formatted - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_beacon_committee - batch: - max_bytes: 52428800 - max_events: 1000000 - timeout_secs: 1 - buffer: - max_events: 1000000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_events_head_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_events_head_formatted - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_events_head - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_events_blob_sidecar_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_events_blob_sidecar_formatted - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_events_blob_sidecar - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_events_block_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_events_block_formatted - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_events_block - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_events_attestation_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_events_attestation_formatted - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_events_attestation - batch: - max_bytes: 52428800 - max_events: 1000000 - timeout_secs: 1 - buffer: - max_events: 1000000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_validator_attestation_data: - type: clickhouse - inputs: - - beacon_api_eth_v1_validator_attestation_data_formatted - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_validator_attestation_data - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_events_voluntary_exit_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_events_voluntary_exit_formatted - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_events_voluntary_exit - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_events_finalized_checkpoint_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_events_finalized_checkpoint_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_events_finalized_checkpoint - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_events_chain_reorg_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_events_chain_reorg_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_events_chain_reorg - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v1_events_contribution_and_proof_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v1_events_contribution_and_proof_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_events_contribution_and_proof - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - mempool_transaction_events_clickhouse: - type: clickhouse - inputs: - - mempool_transaction_events_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: mempool_transaction - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - beacon_api_eth_v2_beacon_block_clickhouse: - type: clickhouse - inputs: - - beacon_api_eth_v2_beacon_block_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v2_beacon_block - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - canonical_beacon_block_clickhouse: - type: clickhouse - inputs: - - canonical_beacon_block_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_block - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - canonical_beacon_block_proposer_slashing_clickhouse: - type: clickhouse - inputs: - - canonical_beacon_block_proposer_slashing_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_block_proposer_slashing - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - canonical_beacon_block_attester_slashing_clickhouse: - type: clickhouse - inputs: - - canonical_beacon_block_attester_slashing_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_block_attester_slashing - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - canonical_beacon_block_bls_to_execution_change_clickhouse: - type: clickhouse - inputs: - - canonical_beacon_block_bls_to_execution_change_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_block_bls_to_execution_change + - beacon_api_eth_v1_events_attestation_formatted auth: strategy: basic user: "${CLICKHOUSE_USER}" password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - canonical_beacon_block_execution_transaction_clickhouse: - type: clickhouse - inputs: - - canonical_beacon_block_execution_transaction_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_block_execution_transaction - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" + table: beacon_api_eth_v1_events_attestation batch: max_bytes: 52428800 - max_events: 200000 + max_events: 1000000 timeout_secs: 1 buffer: - max_events: 200000 + max_events: 1000000 healthcheck: enabled: true skip_unknown_fields: false - canonical_beacon_block_voluntary_exit_clickhouse: + beacon_api_eth_v1_validator_attestation_data: type: clickhouse inputs: - - canonical_beacon_block_voluntary_exit_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_block_voluntary_exit + - beacon_api_eth_v1_validator_attestation_data_formatted auth: strategy: basic user: "${CLICKHOUSE_USER}" password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - canonical_beacon_block_deposit_clickhouse: - type: clickhouse - inputs: - - canonical_beacon_block_deposit_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_block_deposit - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" + table: beacon_api_eth_v1_validator_attestation_data batch: max_bytes: 52428800 max_events: 200000 @@ -3148,37 +1868,17 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - canonical_beacon_block_withdrawal_clickhouse: + beacon_api_eth_v1_events_voluntary_exit_clickhouse: type: clickhouse inputs: - - canonical_beacon_block_withdrawal_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_block_withdrawal + - beacon_api_eth_v1_events_voluntary_exit_formatted auth: strategy: basic user: "${CLICKHOUSE_USER}" password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - canonical_beacon_blob_sidecar_clickhouse: - type: clickhouse - inputs: - - canonical_beacon_blob_sidecar_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_blob_sidecar - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" + table: beacon_api_eth_v1_events_voluntary_exit batch: max_bytes: 52428800 max_events: 200000 @@ -3188,13 +1888,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - blockprint_block_classification_clickhouse: + beacon_api_eth_v1_events_finalized_checkpoint_clickhouse: type: clickhouse inputs: - - blockprint_block_classification_formatted + - beacon_api_eth_v1_events_finalized_checkpoint_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_block_classification + table: beacon_api_eth_v1_events_finalized_checkpoint auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3208,33 +1908,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - beacon_p2p_attestation_clickhouse: - type: clickhouse - inputs: - - beacon_p2p_attestation_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_p2p_attestation - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 1000000 - timeout_secs: 1 - buffer: - max_events: 1000000 - healthcheck: - enabled: true - skip_unknown_fields: false - canonical_beacon_proposer_duty_clickhouse: + beacon_api_eth_v1_events_chain_reorg_clickhouse: type: clickhouse inputs: - - canonical_beacon_proposer_duty_formatted + - beacon_api_eth_v1_events_chain_reorg_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_proposer_duty + table: beacon_api_eth_v1_events_chain_reorg auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3248,13 +1928,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - eth_v1_proposer_duty_clickhouse: + beacon_api_eth_v1_events_contribution_and_proof_clickhouse: type: clickhouse inputs: - - eth_v1_proposer_duty_formatted + - beacon_api_eth_v1_events_contribution_and_proof_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: beacon_api_eth_v1_proposer_duty + table: beacon_api_eth_v1_events_contribution_and_proof auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3268,13 +1948,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - canonical_beacon_block_elaborated_attestation_clickhouse: + mempool_transaction_events_clickhouse: type: clickhouse inputs: - - canonical_beacon_block_elatorated_attestation_formatted + - mempool_transaction_events_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: canonical_beacon_elaborated_attestation + table: mempool_transaction auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3288,53 +1968,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_peer_clickhouse: - type: clickhouse - inputs: - - libp2p_trace_peer_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_peer - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - libp2p_trace_connected_clickhouse: - type: clickhouse - inputs: - - libp2p_trace_connected_formatted - database: default - endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_connected - auth: - strategy: basic - user: "${CLICKHOUSE_USER}" - password: "${CLICKHOUSE_PASSWORD}" - batch: - max_bytes: 52428800 - max_events: 200000 - timeout_secs: 1 - buffer: - max_events: 200000 - healthcheck: - enabled: true - skip_unknown_fields: false - libp2p_trace_disconnected_clickhouse: + beacon_api_eth_v2_beacon_block_clickhouse: type: clickhouse inputs: - - libp2p_trace_disconnected_formatted + - beacon_api_eth_v2_beacon_block_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_disconnected + table: beacon_api_eth_v2_beacon_block auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3348,13 +1988,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_add_peer_clickhouse: + canonical_beacon_block_clickhouse: type: clickhouse inputs: - - libp2p_trace_add_peer_formatted + - canonical_beacon_block_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_add_peer + table: canonical_beacon_block auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3368,13 +2008,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_removed_peer_clickhouse: + canonical_beacon_block_proposer_slashing_clickhouse: type: clickhouse inputs: - - libp2p_trace_remove_peer_formatted + - canonical_beacon_block_proposer_slashing_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_remove_peer + table: canonical_beacon_block_proposer_slashing auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3388,13 +2028,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_join_clickhouse: + canonical_beacon_block_attester_slashing_clickhouse: type: clickhouse inputs: - - libp2p_trace_join_formatted + - canonical_beacon_block_attester_slashing_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_join + table: canonical_beacon_block_attester_slashing auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3408,13 +2048,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_rpc_meta_control_prune_clickhouse: + canonical_beacon_block_bls_to_execution_change_clickhouse: type: clickhouse inputs: - - libp2p_trace_rpc_events_formatted.meta_control_prune + - canonical_beacon_block_bls_to_execution_change_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_rpc_meta_control_prune + table: canonical_beacon_block_bls_to_execution_change auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3428,13 +2068,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_rpc_meta_control_graft_clickhouse: + canonical_beacon_block_execution_transaction_clickhouse: type: clickhouse inputs: - - libp2p_trace_rpc_events_formatted.meta_control_graft + - canonical_beacon_block_execution_transaction_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_rpc_meta_control_graft + table: canonical_beacon_block_execution_transaction auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3448,13 +2088,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_rpc_meta_control_iwant_clickhouse: + canonical_beacon_block_voluntary_exit_clickhouse: type: clickhouse inputs: - - libp2p_trace_rpc_events_formatted.meta_control_iwant + - canonical_beacon_block_voluntary_exit_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_rpc_meta_control_iwant + table: canonical_beacon_block_voluntary_exit auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3468,13 +2108,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_rpc_meta_control_ihave_clickhouse: + canonical_beacon_block_deposit_clickhouse: type: clickhouse inputs: - - libp2p_trace_rpc_events_formatted.meta_control_ihave + - canonical_beacon_block_deposit_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_rpc_meta_control_ihave + table: canonical_beacon_block_deposit auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3488,13 +2128,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_rpc_meta_message_clickhouse: + canonical_beacon_block_withdrawal_clickhouse: type: clickhouse inputs: - - libp2p_trace_rpc_events_formatted.meta_message + - canonical_beacon_block_withdrawal_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_rpc_meta_message + table: canonical_beacon_block_withdrawal auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3508,13 +2148,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_rpc_meta_subscription_clickhouse: + canonical_beacon_blob_sidecar_clickhouse: type: clickhouse inputs: - - libp2p_trace_rpc_events_formatted.meta_subscription + - canonical_beacon_blob_sidecar_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_rpc_meta_subscription + table: canonical_beacon_blob_sidecar auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3528,13 +2168,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_recv_rpc_clickhouse: + blockprint_block_classification_clickhouse: type: clickhouse inputs: - - libp2p_trace_rpc_events_formatted.recv_rpc + - blockprint_block_classification_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_recv_rpc + table: beacon_block_classification auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3548,33 +2188,33 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_send_rpc_clickhouse: + beacon_p2p_attestation_clickhouse: type: clickhouse inputs: - - libp2p_trace_rpc_events_formatted.send_rpc + - beacon_p2p_attestation_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_send_rpc + table: beacon_p2p_attestation auth: strategy: basic user: "${CLICKHOUSE_USER}" password: "${CLICKHOUSE_PASSWORD}" batch: max_bytes: 52428800 - max_events: 200000 + max_events: 1000000 timeout_secs: 1 buffer: - max_events: 200000 + max_events: 1000000 healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_handle_status_clickhouse: + canonical_beacon_proposer_duty_clickhouse: type: clickhouse inputs: - - libp2p_trace_handle_status_formatted + - canonical_beacon_proposer_duty_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_handle_status + table: canonical_beacon_proposer_duty auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3588,13 +2228,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_handle_metadata_clickhouse: + eth_v1_proposer_duty_clickhouse: type: clickhouse inputs: - - libp2p_trace_handle_metadata_formatted + - eth_v1_proposer_duty_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_handle_metadata + table: beacon_api_eth_v1_proposer_duty auth: strategy: basic user: "${CLICKHOUSE_USER}" @@ -3608,13 +2248,13 @@ sinks: healthcheck: enabled: true skip_unknown_fields: false - libp2p_trace_gossipsub_beacon_block_clickhouse: + canonical_beacon_block_elaborated_attestation_clickhouse: type: clickhouse inputs: - - libp2p_trace_gossipsub_beacon_block_formatted + - canonical_beacon_block_elatorated_attestation_formatted database: default endpoint: "${CLICKHOUSE_ENDPOINT}" - table: libp2p_gossipsub_beacon_block + table: canonical_beacon_elaborated_attestation auth: strategy: basic user: "${CLICKHOUSE_USER}" diff --git a/deploy/migrations/clickhouse/035_libp2p_gossipsub_attestation.up.sql b/deploy/migrations/clickhouse/035_libp2p_gossipsub_attestation.up.sql new file mode 100644 index 00000000..3059bdd1 --- /dev/null +++ b/deploy/migrations/clickhouse/035_libp2p_gossipsub_attestation.up.sql @@ -0,0 +1,100 @@ +CREATE TABLE libp2p_gossipsub_beacon_attestation_local on cluster '{cluster}' ( + unique_key Int64, + event_date_time DateTime64(3) Codec(DoubleDelta, ZSTD(1)), + slot UInt32 Codec(DoubleDelta, ZSTD(1)), + slot_start_date_time DateTime Codec(DoubleDelta, ZSTD(1)), + epoch UInt32 Codec(DoubleDelta, ZSTD(1)), + epoch_start_date_time DateTime Codec(DoubleDelta, ZSTD(1)), + committee_index LowCardinality(String), + attesting_validator_index Nullable(UInt32) Codec(ZSTD(1)), + attesting_validator_committee_index LowCardinality(String), + wallclock_slot UInt32 Codec(DoubleDelta, ZSTD(1)), + wallclock_slot_start_date_time DateTime Codec(DoubleDelta, ZSTD(1)), + wallclock_epoch UInt32 Codec(DoubleDelta, ZSTD(1)), + wallclock_epoch_start_date_time DateTime Codec(DoubleDelta, ZSTD(1)), + propagation_slot_start_diff UInt32 Codec(ZSTD(1)), + peer_id_unique_key Int64, + message_id String CODEC(ZSTD(1)), + message_size UInt32 Codec(ZSTD(1)), + topic_layer LowCardinality(String), + topic_fork_digest_value LowCardinality(String), + topic_name LowCardinality(String), + topic_encoding LowCardinality(String), + aggregation_bits String Codec(ZSTD(1)), + beacon_block_root FixedString(66) Codec(ZSTD(1)), + source_epoch UInt32 Codec(DoubleDelta, ZSTD(1)), + source_epoch_start_date_time DateTime Codec(DoubleDelta, ZSTD(1)), + source_root FixedString(66) Codec(ZSTD(1)), + target_epoch UInt32 Codec(DoubleDelta, ZSTD(1)), + target_epoch_start_date_time DateTime Codec(DoubleDelta, ZSTD(1)), + target_root FixedString(66) Codec(ZSTD(1)), + meta_client_name LowCardinality(String), + meta_client_id String Codec(ZSTD(1)), + meta_client_version LowCardinality(String), + meta_client_implementation LowCardinality(String), + meta_client_os LowCardinality(String), + meta_client_ip Nullable(IPv6) Codec(ZSTD(1)), + meta_client_geo_city LowCardinality(String) Codec(ZSTD(1)), + meta_client_geo_country LowCardinality(String) Codec(ZSTD(1)), + meta_client_geo_country_code LowCardinality(String) Codec(ZSTD(1)), + meta_client_geo_continent_code LowCardinality(String) Codec(ZSTD(1)), + meta_client_geo_longitude Nullable(Float64) Codec(ZSTD(1)), + meta_client_geo_latitude Nullable(Float64) Codec(ZSTD(1)), + meta_client_geo_autonomous_system_number Nullable(UInt32) Codec(ZSTD(1)), + meta_client_geo_autonomous_system_organization Nullable(String) Codec(ZSTD(1)), + meta_network_id Int32 Codec(DoubleDelta, ZSTD(1)), + meta_network_name LowCardinality(String) +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) +PARTITION BY toStartOfMonth(slot_start_date_time) +ORDER BY (slot_start_date_time, meta_network_name, meta_client_name); + +ALTER TABLE libp2p_gossipsub_beacon_attestation_local ON CLUSTER '{cluster}' +MODIFY COMMENT 'Table for libp2p gossipsub beacon attestation data.', +COMMENT COLUMN unique_key 'Unique identifier for each record', +COMMENT COLUMN event_date_time 'Timestamp of the event with millisecond precision', +COMMENT COLUMN slot 'Slot number associated with the event', +COMMENT COLUMN slot_start_date_time 'Start date and time of the slot', +COMMENT COLUMN wallclock_slot 'Slot number of the wall clock when the event was received', +COMMENT COLUMN wallclock_slot_start_date_time 'Start date and time of the wall clock slot when the event was received', +COMMENT COLUMN wallclock_epoch 'Epoch number of the wall clock when the event was received', +COMMENT COLUMN wallclock_epoch_start_date_time 'Start date and time of the wall clock epoch when the event was received', +COMMENT COLUMN propagation_slot_start_diff 'Difference in slot start time for propagation', +COMMENT COLUMN peer_id_unique_key 'Unique key associated with the identifier of the peer', +COMMENT COLUMN message_id 'Identifier of the message', +COMMENT COLUMN message_size 'Size of the message in bytes', +COMMENT COLUMN topic_layer 'Layer of the topic in the gossipsub protocol', +COMMENT COLUMN topic_fork_digest_value 'Fork digest value of the topic', +COMMENT COLUMN topic_name 'Name of the topic', +COMMENT COLUMN topic_encoding 'Encoding used for the topic', +COMMENT COLUMN aggregation_bits 'The aggregation bits of the event in the attestation', +COMMENT COLUMN beacon_block_root 'The beacon block root hash in the attestation', +COMMENT COLUMN epoch 'The epoch number in the attestation', +COMMENT COLUMN epoch_start_date_time 'The wall clock time when the epoch started', +COMMENT COLUMN source_epoch 'The source epoch number in the attestation', +COMMENT COLUMN source_epoch_start_date_time 'The wall clock time when the source epoch started', +COMMENT COLUMN source_root 'The source beacon block root hash in the attestation', +COMMENT COLUMN target_epoch 'The target epoch number in the attestation', +COMMENT COLUMN target_epoch_start_date_time 'The wall clock time when the target epoch started', +COMMENT COLUMN target_root 'The target beacon block root hash in the attestation', +COMMENT COLUMN committee_index 'The committee index in the attestation', +COMMENT COLUMN attesting_validator_index 'The index of the validator attesting to the event', +COMMENT COLUMN attesting_validator_committee_index 'The committee index of the attesting validator', +COMMENT COLUMN meta_client_name 'Name of the client that generated the event', +COMMENT COLUMN meta_client_id 'Unique Session ID of the client that generated the event. This changes every time the client is restarted.', +COMMENT COLUMN meta_client_version 'Version of the client that generated the event', +COMMENT COLUMN meta_client_implementation 'Implementation of the client that generated the event', +COMMENT COLUMN meta_client_os 'Operating system of the client that generated the event', +COMMENT COLUMN meta_client_ip 'IP address of the client that generated the event', +COMMENT COLUMN meta_client_geo_city 'City of the client that generated the event', +COMMENT COLUMN meta_client_geo_country 'Country of the client that generated the event', +COMMENT COLUMN meta_client_geo_country_code 'Country code of the client that generated the event', +COMMENT COLUMN meta_client_geo_continent_code 'Continent code of the client that generated the event', +COMMENT COLUMN meta_client_geo_longitude 'Longitude of the client that generated the event', +COMMENT COLUMN meta_client_geo_latitude 'Latitude of the client that generated the event', +COMMENT COLUMN meta_client_geo_autonomous_system_number 'Autonomous system number of the client that generated the event', +COMMENT COLUMN meta_client_geo_autonomous_system_organization 'Autonomous system organization of the client that generated the event', +COMMENT COLUMN meta_network_id 'Network ID associated with the client', +COMMENT COLUMN meta_network_name 'Name of the network associated with the client'; + +CREATE TABLE libp2p_gossipsub_beacon_attestation on cluster '{cluster}' AS libp2p_gossipsub_beacon_attestation_local +ENGINE = Distributed('{cluster}', default, libp2p_gossipsub_beacon_attestation_local, rand()); diff --git a/deploy/migrations/clickhouse/035_libp2p_gossipsub_beacon_attestation.down.sql b/deploy/migrations/clickhouse/035_libp2p_gossipsub_beacon_attestation.down.sql new file mode 100644 index 00000000..63f8a094 --- /dev/null +++ b/deploy/migrations/clickhouse/035_libp2p_gossipsub_beacon_attestation.down.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS libp2p_gossipsub_beacon_attestation ON CLUSTER '{cluster}'; +DROP TABLE IF EXISTS libp2p_gossipsub_beacon_attestation_local ON CLUSTER '{cluster}'; diff --git a/docker-compose.yml b/docker-compose.yml index 9d665249..0701a157 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -249,6 +249,7 @@ services: "libp2p-trace-handle-metadata" "libp2p-trace-handle-status" "libp2p-trace-gossipsub-beacon-block" + "libp2p-trace-gossipsub-beacon-attestation" ) for topic in "$${topics[@]}"; do echo "Creating topic: $$topic"; @@ -371,6 +372,36 @@ services: condition: service_completed_successfully init-kafka: condition: service_completed_successfully + vector-kafka-clickhouse-libp2p: + profiles: + - "" + image: timberio/vector:0.37.1-alpine + volumes: + - ./deploy/local/docker-compose/vector-kafka-clickhouse-libp2p.yaml:/etc/vector/vector.yaml + networks: + - xatu-net + environment: + CLICKHOUSE_ENDPOINT: "clickhouse-01:8123" + CLICKHOUSE_USER: default + CLICKHOUSE_PASSWORD: "" + KAFKA_BROKERS: "kafka:29092" + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:8686/health"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 5s + depends_on: + kafka: + condition: service_healthy + clickhouse-01: + condition: service_healthy + clickhouse-02: + condition: service_healthy + clickhouse-migrator: + condition: service_completed_successfully + init-kafka: + condition: service_completed_successfully postgres-migrator: profiles: - "" diff --git a/go.mod b/go.mod index 66a24673..db358a84 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/ethpandaops/xatu go 1.22.0 -replace github.com/probe-lab/hermes => github.com/ethpandaops/hermes v0.0.0-20240424055612-d87881163f3b +replace github.com/probe-lab/hermes => github.com/ethpandaops/hermes v0.0.0-20240429023931-ef619176b78b require ( github.com/IBM/sarama v1.43.0 diff --git a/go.sum b/go.sum index 17670f03..72170a6f 100644 --- a/go.sum +++ b/go.sum @@ -266,8 +266,8 @@ github.com/ethpandaops/ethcore v0.0.0-20240422023000-2a5727b18756 h1:8JWjrRfP14m github.com/ethpandaops/ethcore v0.0.0-20240422023000-2a5727b18756/go.mod h1:ZvKqL6CKxiraefdXPHeJurV2pDD/f2HF2uklDVdrry8= github.com/ethpandaops/ethwallclock v0.3.0 h1:xF5fwtBf+bHFHZKBnwiPFEuelW3sMM7SD3ZNFq1lJY4= github.com/ethpandaops/ethwallclock v0.3.0/go.mod h1:y0Cu+mhGLlem19vnAV2x0hpFS5KZ7oOi2SWYayv9l24= -github.com/ethpandaops/hermes v0.0.0-20240424055612-d87881163f3b h1:Iigwjof7KReOiEPHRAl3KWXFYDkVBN3GjxC8qwzdfwM= -github.com/ethpandaops/hermes v0.0.0-20240424055612-d87881163f3b/go.mod h1:WOtvdP1zl53vuoOX6PRZ9oAbbJUiDso50efmAjoUZzI= +github.com/ethpandaops/hermes v0.0.0-20240429023931-ef619176b78b h1:0fr/NoefWDlw0nwKIttVJnF9E8JZ98MyBu1N2hZvpik= +github.com/ethpandaops/hermes v0.0.0-20240429023931-ef619176b78b/go.mod h1:WOtvdP1zl53vuoOX6PRZ9oAbbJUiDso50efmAjoUZzI= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= diff --git a/pkg/clmimicry/config.go b/pkg/clmimicry/config.go index f1ff396e..c6d2e93e 100644 --- a/pkg/clmimicry/config.go +++ b/pkg/clmimicry/config.go @@ -35,6 +35,9 @@ type Config struct { // Node is the configuration for the node Node NodeConfig `yaml:"node"` + + // Events is the configuration for the events + Events EventConfig `yaml:"events"` } func (c *Config) Validate() error { @@ -48,10 +51,14 @@ func (c *Config) Validate() error { for _, output := range c.Outputs { if err := output.Validate(); err != nil { - return fmt.Errorf("output %s: %w", output.Name, err) + return fmt.Errorf("invalid output config %s: %w", output.Name, err) } } + if err := c.Events.Validate(); err != nil { + return fmt.Errorf("invalid events config: %w", err) + } + return nil } @@ -122,3 +129,21 @@ func (h *NodeConfig) AsHermesConfig() *hermes.NodeConfig { DialConcurrency: h.DialConcurrency, } } + +type EventConfig struct { + RecvRPCEnabled bool `yaml:"recvRpcEnabled" default:"false"` + SendRPCEnabled bool `yaml:"sendRpcEnabled" default:"false"` + AddPeerEnabled bool `yaml:"addPeerEnabled" default:"true"` + RemovePeerEnabled bool `yaml:"removePeerEnabled" default:"true"` + ConnectedEnabled bool `yaml:"connectedEnabled" default:"true"` + DisconnectedEnabled bool `yaml:"disconnectedEnabled" default:"true"` + JoinEnabled bool `yaml:"joinEnabled" default:"true"` + HandleMetadataEnabled bool `yaml:"handleMetadataEnabled" default:"true"` + HandleStatusEnabled bool `yaml:"handleStatusEnabled" default:"true"` + GossipSubBeaconBlockEnabled bool `yaml:"gossipSubBeaconBlockEnabled" default:"true"` + GossipSubAttestationEnabled bool `yaml:"gossipSubAttestationEnabled" default:"true"` +} + +func (e *EventConfig) Validate() error { + return nil +} diff --git a/pkg/clmimicry/event.go b/pkg/clmimicry/event.go index df82c9c5..e4256410 100644 --- a/pkg/clmimicry/event.go +++ b/pkg/clmimicry/event.go @@ -34,24 +34,61 @@ func (m *Mimicry) handleHermesEvent(ctx context.Context, event *host.TraceEvent) switch event.Type { case "ADD_PEER": + if !m.Config.Events.AddPeerEnabled { + return nil + } + return m.handleAddPeerEvent(ctx, clientMeta, traceMeta, event) case "RECV_RPC": + if !m.Config.Events.RecvRPCEnabled { + return nil + } + return m.handleRecvRPCEvent(ctx, clientMeta, traceMeta, event) case "SEND_RPC": + if !m.Config.Events.SendRPCEnabled { + return nil + } + return m.handleSendRPCEvent(ctx, clientMeta, traceMeta, event) case "CONNECTED": + if !m.Config.Events.ConnectedEnabled { + return nil + } + return m.handleConnectedEvent(ctx, clientMeta, traceMeta, event) case "DISCONNECTED": + if !m.Config.Events.DisconnectedEnabled { + return nil + } + return m.handleDisconnectedEvent(ctx, clientMeta, traceMeta, event) case "REMOVE_PEER": + if !m.Config.Events.RemovePeerEnabled { + return nil + } + return m.handleRemovePeerEvent(ctx, clientMeta, traceMeta, event) case "JOIN": + if !m.Config.Events.JoinEnabled { + return nil + } + return m.handleJoinEvent(ctx, clientMeta, traceMeta, event) case "HANDLE_METADATA": + if !m.Config.Events.HandleMetadataEnabled { + return nil + } + return m.handleHandleMetadataEvent(ctx, clientMeta, traceMeta, event) case "HANDLE_STATUS": + if !m.Config.Events.HandleStatusEnabled { + return nil + } + return m.handleHandleStatusEvent(ctx, clientMeta, traceMeta, event) case "HANDLE_MESSAGE": + // Handle message events are specific to gossipsub return m.handleHandleMessageEvent(ctx, clientMeta, traceMeta, event) default: m.log.WithField("type", event.Type).Trace("Unsupported Hermes event") @@ -408,7 +445,23 @@ func (m *Mimicry) handleHandleMessageEvent(ctx context.Context, return errors.New("missing topic in HandleMessage event") } + if strings.Contains(topic, "beacon_attestation") { + if !m.Config.Events.GossipSubAttestationEnabled { + return nil + } + + if err := m.handleGossipAttestation(ctx, clientMeta, event, payload); err != nil { + return errors.Wrap(err, "failed to handle gossipsub beacon attestation") + } + + return nil + } + if strings.Contains(topic, "beacon_block") { + if !m.Config.Events.GossipSubBeaconBlockEnabled { + return nil + } + if err := m.handleGossipBeaconBlock(ctx, clientMeta, event, payload); err != nil { return errors.Wrap(err, "failed to handle gossipsub beacon block") } diff --git a/pkg/clmimicry/gossipsub_attestation.go b/pkg/clmimicry/gossipsub_attestation.go new file mode 100644 index 00000000..b23e43d9 --- /dev/null +++ b/pkg/clmimicry/gossipsub_attestation.go @@ -0,0 +1,183 @@ +package clmimicry + +import ( + "context" + "fmt" + "time" + + "github.com/attestantio/go-eth2-client/spec/phase0" + v1 "github.com/ethpandaops/xatu/pkg/proto/eth/v1" + "github.com/ethpandaops/xatu/pkg/proto/libp2p" + "github.com/ethpandaops/xatu/pkg/proto/xatu" + "github.com/google/uuid" + "github.com/probe-lab/hermes/host" + ethtypes "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" + "google.golang.org/protobuf/types/known/wrapperspb" +) + +func (m *Mimicry) handleGossipAttestation(ctx context.Context, + clientMeta *xatu.ClientMeta, + event *host.TraceEvent, payload map[string]any) error { + // Extract attestation data + eAttestation, ok := payload["Attestation"].(*ethtypes.Attestation) + if !ok { + return fmt.Errorf("invalid attestation") + } + + attestation := &v1.Attestation{ + AggregationBits: string(""), + Data: &v1.AttestationData{ + Slot: uint64(eAttestation.Data.Slot), + BeaconBlockRoot: fmt.Sprintf("0x%x", eAttestation.Data.BeaconBlockRoot), + Source: &v1.Checkpoint{ + Epoch: uint64(eAttestation.Data.Source.Epoch), + Root: fmt.Sprintf("0x%x", eAttestation.Data.Source.Root), + }, + Target: &v1.Checkpoint{ + Epoch: uint64(eAttestation.Data.Target.Epoch), + Root: fmt.Sprintf("0x%x", eAttestation.Data.Target.Root), + }, + Index: uint64(eAttestation.Data.CommitteeIndex), + }, + } + + metadata, ok := proto.Clone(clientMeta).(*xatu.ClientMeta) + if !ok { + return fmt.Errorf("failed to clone client metadata") + } + + additionalData, err := m.createAdditionalGossipSubAttestationData(ctx, payload, eAttestation) + if err != nil { + return fmt.Errorf("failed to create additional data: %w", err) + } + + metadata.AdditionalData = &xatu.ClientMeta_Libp2PTraceGossipsubBeaconAttestation{ + Libp2PTraceGossipsubBeaconAttestation: additionalData, + } + + timestamp, ok := payload["Timestamp"].(time.Time) + if !ok { + return fmt.Errorf("invalid timestamp") + } + + decoratedEvent := &xatu.DecoratedEvent{ + Event: &xatu.Event{ + Name: xatu.Event_LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION, + DateTime: timestamppb.New(timestamp.Add(m.clockDrift)), + Id: uuid.New().String(), + }, + Meta: &xatu.Meta{ + Client: metadata, + }, + Data: &xatu.DecoratedEvent_Libp2PTraceGossipsubBeaconAttestation{ + Libp2PTraceGossipsubBeaconAttestation: attestation, + }, + } + + return m.handleNewDecoratedEvent(ctx, decoratedEvent) +} + +func (m *Mimicry) createAdditionalGossipSubAttestationData(ctx context.Context, + payload map[string]any, + attestation *ethtypes.Attestation, +) (*xatu.ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData, error) { + wallclockSlot, wallclockEpoch, err := m.ethereum.Metadata().Wallclock().Now() + if err != nil { + return nil, fmt.Errorf("failed to get wallclock time: %w", err) + } + + timestamp, ok := payload["Timestamp"].(time.Time) + if !ok { + return nil, fmt.Errorf("invalid timestamp") + } + + // Add Clock Drift + timestampAdjusted := timestamp.Add(m.clockDrift) + + attestionSlot := m.ethereum.Metadata().Wallclock().Slots().FromNumber(uint64(attestation.Data.Slot)) + epoch := m.ethereum.Metadata().Wallclock().Epochs().FromSlot(uint64(attestation.Data.Slot)) + + extra := &xatu.ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData{ + WallclockSlot: &xatu.SlotV2{ + Number: &wrapperspb.UInt64Value{Value: wallclockSlot.Number()}, + StartDateTime: timestamppb.New(wallclockSlot.TimeWindow().Start()), + }, + WallclockEpoch: &xatu.EpochV2{ + Number: &wrapperspb.UInt64Value{Value: wallclockEpoch.Number()}, + StartDateTime: timestamppb.New(wallclockEpoch.TimeWindow().Start()), + }, + Slot: &xatu.SlotV2{ + Number: &wrapperspb.UInt64Value{Value: attestionSlot.Number()}, + StartDateTime: timestamppb.New(attestionSlot.TimeWindow().Start()), + }, + Epoch: &xatu.EpochV2{ + Number: &wrapperspb.UInt64Value{Value: epoch.Number()}, + StartDateTime: timestamppb.New(epoch.TimeWindow().Start()), + }, + Propagation: &xatu.PropagationV2{ + SlotStartDiff: &wrapperspb.UInt64Value{ + Value: uint64(timestampAdjusted.Sub(attestionSlot.TimeWindow().Start()).Milliseconds()), + }, + }, + } + + targetEpoch := m.ethereum.Metadata().Wallclock().Epochs().FromNumber(uint64(attestation.Data.Target.Epoch)) + extra.Target = &xatu.ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData{ + Epoch: &xatu.EpochV2{ + Number: &wrapperspb.UInt64Value{Value: targetEpoch.Number()}, + StartDateTime: timestamppb.New(targetEpoch.TimeWindow().Start()), + }, + } + + sourceEpoch := m.ethereum.Metadata().Wallclock().Epochs().FromNumber(uint64(attestation.Data.Source.Epoch)) + extra.Source = &xatu.ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData{ + Epoch: &xatu.EpochV2{ + Number: &wrapperspb.UInt64Value{Value: sourceEpoch.Number()}, + StartDateTime: timestamppb.New(sourceEpoch.TimeWindow().Start()), + }, + } + + peerID, ok := payload["PeerID"].(string) + if ok { + extra.Metadata = &libp2p.TraceEventMetadata{ + PeerId: wrapperspb.String(peerID), + } + } + + topic, ok := payload["Topic"].(string) + if ok { + extra.Topic = wrapperspb.String(topic) + } + + msgID, ok := payload["MsgID"].(string) + if ok { + extra.MessageId = wrapperspb.String(msgID) + } + + msgSize, ok := payload["MsgSize"].(int) + if ok { + extra.MessageSize = wrapperspb.UInt32(uint32(msgSize)) + } + + // If the attestation is unaggreated, we can append the validator position within the committee + if attestation.AggregationBits.Count() == 1 { + position := uint64(attestation.AggregationBits.BitIndices()[0]) + + validatorIndex, err := m.ethereum.Duties().GetValidatorIndex( + phase0.Epoch(epoch.Number()), + phase0.Slot(attestation.Data.Slot), + phase0.CommitteeIndex(attestation.Data.CommitteeIndex), + position, + ) + if err == nil { + extra.AttestingValidator = &xatu.AttestingValidatorV2{ + CommitteeIndex: &wrapperspb.UInt64Value{Value: position}, + Index: &wrapperspb.UInt64Value{Value: uint64(validatorIndex)}, + } + } + } + + return extra, nil +} diff --git a/pkg/proto/xatu/event_ingester.pb.go b/pkg/proto/xatu/event_ingester.pb.go index d4446eef..facf8d8f 100644 --- a/pkg/proto/xatu/event_ingester.pb.go +++ b/pkg/proto/xatu/event_ingester.pb.go @@ -80,6 +80,7 @@ const ( Event_LIBP2P_TRACE_HANDLE_METADATA Event_Name = 47 Event_LIBP2P_TRACE_HANDLE_STATUS Event_Name = 48 Event_LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK Event_Name = 49 + Event_LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION Event_Name = 50 ) // Enum value maps for Event_Name. @@ -135,6 +136,7 @@ var ( 47: "LIBP2P_TRACE_HANDLE_METADATA", 48: "LIBP2P_TRACE_HANDLE_STATUS", 49: "LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK", + 50: "LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION", } Event_Name_value = map[string]int32{ "BEACON_API_ETH_V1_EVENTS_UNKNOWN": 0, @@ -187,6 +189,7 @@ var ( "LIBP2P_TRACE_HANDLE_METADATA": 47, "LIBP2P_TRACE_HANDLE_STATUS": 48, "LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK": 49, + "LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION": 50, } ) @@ -1071,6 +1074,7 @@ type ClientMeta struct { // *ClientMeta_Libp2PTraceHandleMetadata // *ClientMeta_Libp2PTraceHandleStatus // *ClientMeta_Libp2PTraceGossipsubBeaconBlock + // *ClientMeta_Libp2PTraceGossipsubBeaconAttestation AdditionalData isClientMeta_AdditionalData `protobuf_oneof:"AdditionalData"` } @@ -1498,6 +1502,13 @@ func (x *ClientMeta) GetLibp2PTraceGossipsubBeaconBlock() *ClientMeta_Additional return nil } +func (x *ClientMeta) GetLibp2PTraceGossipsubBeaconAttestation() *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData { + if x, ok := x.GetAdditionalData().(*ClientMeta_Libp2PTraceGossipsubBeaconAttestation); ok { + return x.Libp2PTraceGossipsubBeaconAttestation + } + return nil +} + type isClientMeta_AdditionalData interface { isClientMeta_AdditionalData() } @@ -1766,6 +1777,11 @@ type ClientMeta_Libp2PTraceGossipsubBeaconBlock struct { Libp2PTraceGossipsubBeaconBlock *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconBlockData `protobuf:"bytes,57,opt,name=libp2p_trace_gossipsub_beacon_block,json=LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK,proto3,oneof"` } +type ClientMeta_Libp2PTraceGossipsubBeaconAttestation struct { + // AdditionalLibP2PTraceGossipSubBeaconAttestationData contains additional data about the gossip sub beacon attestation event. + Libp2PTraceGossipsubBeaconAttestation *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData `protobuf:"bytes,58,opt,name=libp2p_trace_gossipsub_beacon_attestation,json=LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION,proto3,oneof"` +} + func (*ClientMeta_EthV1EventsAttestation) isClientMeta_AdditionalData() {} func (*ClientMeta_EthV1EventsHead) isClientMeta_AdditionalData() {} @@ -1860,6 +1876,8 @@ func (*ClientMeta_Libp2PTraceHandleStatus) isClientMeta_AdditionalData() {} func (*ClientMeta_Libp2PTraceGossipsubBeaconBlock) isClientMeta_AdditionalData() {} +func (*ClientMeta_Libp2PTraceGossipsubBeaconAttestation) isClientMeta_AdditionalData() {} + type ServerMeta struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2163,6 +2181,7 @@ type DecoratedEvent struct { // *DecoratedEvent_Libp2PTraceHandleMetadata // *DecoratedEvent_Libp2PTraceHandleStatus // *DecoratedEvent_Libp2PTraceGossipsubBeaconBlock + // *DecoratedEvent_Libp2PTraceGossipsubBeaconAttestation Data isDecoratedEvent_Data `protobuf_oneof:"data"` } @@ -2559,6 +2578,13 @@ func (x *DecoratedEvent) GetLibp2PTraceGossipsubBeaconBlock() *gossipsub.BeaconB return nil } +func (x *DecoratedEvent) GetLibp2PTraceGossipsubBeaconAttestation() *v1.Attestation { + if x, ok := x.GetData().(*DecoratedEvent_Libp2PTraceGossipsubBeaconAttestation); ok { + return x.Libp2PTraceGossipsubBeaconAttestation + } + return nil +} + type isDecoratedEvent_Data interface { isDecoratedEvent_Data() } @@ -2762,6 +2788,10 @@ type DecoratedEvent_Libp2PTraceGossipsubBeaconBlock struct { Libp2PTraceGossipsubBeaconBlock *gossipsub.BeaconBlock `protobuf:"bytes,49,opt,name=libp2p_trace_gossipsub_beacon_block,json=LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK,proto3,oneof"` } +type DecoratedEvent_Libp2PTraceGossipsubBeaconAttestation struct { + Libp2PTraceGossipsubBeaconAttestation *v1.Attestation `protobuf:"bytes,50,opt,name=libp2p_trace_gossipsub_beacon_attestation,json=LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION,proto3,oneof"` +} + func (*DecoratedEvent_EthV1EventsAttestation) isDecoratedEvent_Data() {} func (*DecoratedEvent_EthV1EventsBlock) isDecoratedEvent_Data() {} @@ -2856,6 +2886,8 @@ func (*DecoratedEvent_Libp2PTraceHandleStatus) isDecoratedEvent_Data() {} func (*DecoratedEvent_Libp2PTraceGossipsubBeaconBlock) isDecoratedEvent_Data() {} +func (*DecoratedEvent_Libp2PTraceGossipsubBeaconAttestation) isDecoratedEvent_Data() {} + type ClientMeta_Ethereum struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6686,6 +6718,252 @@ func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconBlockData) GetMessageId( return nil } +type ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Epoch contains the epoch information for the source. + Epoch *EpochV2 `protobuf:"bytes,1,opt,name=epoch,proto3" json:"epoch,omitempty"` +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData) Reset() { + *x = ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData{} + if protoimpl.UnsafeEnabled { + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData) ProtoMessage() {} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData) ProtoReflect() protoreflect.Message { + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[77] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData.ProtoReflect.Descriptor instead. +func (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData) Descriptor() ([]byte, []int) { + return file_pkg_proto_xatu_event_ingester_proto_rawDescGZIP(), []int{14, 58} +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData) GetEpoch() *EpochV2 { + if x != nil { + return x.Epoch + } + return nil +} + +type ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Epoch contains the epoch information for the target. + Epoch *EpochV2 `protobuf:"bytes,1,opt,name=epoch,proto3" json:"epoch,omitempty"` +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData) Reset() { + *x = ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData{} + if protoimpl.UnsafeEnabled { + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData) ProtoMessage() {} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData) ProtoReflect() protoreflect.Message { + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[78] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData.ProtoReflect.Descriptor instead. +func (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData) Descriptor() ([]byte, []int) { + return file_pkg_proto_xatu_event_ingester_proto_rawDescGZIP(), []int{14, 59} +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData) GetEpoch() *EpochV2 { + if x != nil { + return x.Epoch + } + return nil +} + +type ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Source contains information for the best currently justified checkpoint. + Source *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + // Target contains information of the block at the start of the current + // epoch. + Target *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` + // Slot contains the slot information for the attestation. + Slot *SlotV2 `protobuf:"bytes,3,opt,name=slot,proto3" json:"slot,omitempty"` + // Epoch contains the epoch information for the attestation. + Epoch *EpochV2 `protobuf:"bytes,4,opt,name=epoch,proto3" json:"epoch,omitempty"` + // Propagation contains information about the propagation of the + // attestation. + Propagation *PropagationV2 `protobuf:"bytes,5,opt,name=propagation,proto3" json:"propagation,omitempty"` + // AttestingValidator contains data about the validator that created the + // attestation. Note: only available for unaggregated attestations. + AttestingValidator *AttestingValidatorV2 `protobuf:"bytes,6,opt,name=attesting_validator,proto3" json:"attesting_validator,omitempty"` + // WallclockEpoch contains the epoch information for the attestation on the wall clock when the attestation was received. + WallclockEpoch *EpochV2 `protobuf:"bytes,7,opt,name=wallclock_epoch,proto3" json:"wallclock_epoch,omitempty"` + // WallclockSlot contains the slot information for the attestation on the wall clock when the attestation was received. + WallclockSlot *SlotV2 `protobuf:"bytes,8,opt,name=wallclock_slot,proto3" json:"wallclock_slot,omitempty"` + // Metadata contains additional trace event metadata. + Metadata *libp2p.TraceEventMetadata `protobuf:"bytes,9,opt,name=metadata,proto3" json:"metadata,omitempty"` + // Topic is the gossip sub topic the beacon block was received on. + Topic *wrapperspb.StringValue `protobuf:"bytes,10,opt,name=topic,proto3" json:"topic,omitempty"` + // MessageSize is the size of the beacon block message in bytes. + MessageSize *wrapperspb.UInt32Value `protobuf:"bytes,11,opt,name=message_size,proto3" json:"message_size,omitempty"` + // MessageID is a unique identifier for the beacon block message. + MessageId *wrapperspb.StringValue `protobuf:"bytes,12,opt,name=message_id,proto3" json:"message_id,omitempty"` +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) Reset() { + *x = ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData{} + if protoimpl.UnsafeEnabled { + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) ProtoMessage() {} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) ProtoReflect() protoreflect.Message { + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[79] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData.ProtoReflect.Descriptor instead. +func (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) Descriptor() ([]byte, []int) { + return file_pkg_proto_xatu_event_ingester_proto_rawDescGZIP(), []int{14, 60} +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetSource() *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData { + if x != nil { + return x.Source + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetTarget() *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData { + if x != nil { + return x.Target + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetSlot() *SlotV2 { + if x != nil { + return x.Slot + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetEpoch() *EpochV2 { + if x != nil { + return x.Epoch + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetPropagation() *PropagationV2 { + if x != nil { + return x.Propagation + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetAttestingValidator() *AttestingValidatorV2 { + if x != nil { + return x.AttestingValidator + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetWallclockEpoch() *EpochV2 { + if x != nil { + return x.WallclockEpoch + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetWallclockSlot() *SlotV2 { + if x != nil { + return x.WallclockSlot + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetMetadata() *libp2p.TraceEventMetadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetTopic() *wrapperspb.StringValue { + if x != nil { + return x.Topic + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetMessageSize() *wrapperspb.UInt32Value { + if x != nil { + return x.MessageSize + } + return nil +} + +func (x *ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData) GetMessageId() *wrapperspb.StringValue { + if x != nil { + return x.MessageId + } + return nil +} + type ClientMeta_Ethereum_Network struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6700,7 +6978,7 @@ type ClientMeta_Ethereum_Network struct { func (x *ClientMeta_Ethereum_Network) Reset() { *x = ClientMeta_Ethereum_Network{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[77] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6713,7 +6991,7 @@ func (x *ClientMeta_Ethereum_Network) String() string { func (*ClientMeta_Ethereum_Network) ProtoMessage() {} func (x *ClientMeta_Ethereum_Network) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[77] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6755,7 +7033,7 @@ type ClientMeta_Ethereum_Execution struct { func (x *ClientMeta_Ethereum_Execution) Reset() { *x = ClientMeta_Ethereum_Execution{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[78] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6768,7 +7046,7 @@ func (x *ClientMeta_Ethereum_Execution) String() string { func (*ClientMeta_Ethereum_Execution) ProtoMessage() {} func (x *ClientMeta_Ethereum_Execution) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[78] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6805,7 +7083,7 @@ type ClientMeta_Ethereum_Consensus struct { func (x *ClientMeta_Ethereum_Consensus) Reset() { *x = ClientMeta_Ethereum_Consensus{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[79] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6818,7 +7096,7 @@ func (x *ClientMeta_Ethereum_Consensus) String() string { func (*ClientMeta_Ethereum_Consensus) ProtoMessage() {} func (x *ClientMeta_Ethereum_Consensus) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[79] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6860,7 +7138,7 @@ type ServerMeta_Event struct { func (x *ServerMeta_Event) Reset() { *x = ServerMeta_Event{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[80] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6873,7 +7151,7 @@ func (x *ServerMeta_Event) String() string { func (*ServerMeta_Event) ProtoMessage() {} func (x *ServerMeta_Event) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[80] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6928,7 +7206,7 @@ type ServerMeta_Geo struct { func (x *ServerMeta_Geo) Reset() { *x = ServerMeta_Geo{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[81] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6941,7 +7219,7 @@ func (x *ServerMeta_Geo) String() string { func (*ServerMeta_Geo) ProtoMessage() {} func (x *ServerMeta_Geo) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[81] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7028,7 +7306,7 @@ type ServerMeta_Client struct { func (x *ServerMeta_Client) Reset() { *x = ServerMeta_Client{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[82] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7041,7 +7319,7 @@ func (x *ServerMeta_Client) String() string { func (*ServerMeta_Client) ProtoMessage() {} func (x *ServerMeta_Client) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[82] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7083,7 +7361,7 @@ type ServerMeta_Peer struct { func (x *ServerMeta_Peer) Reset() { *x = ServerMeta_Peer{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[83] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7096,7 +7374,7 @@ func (x *ServerMeta_Peer) String() string { func (*ServerMeta_Peer) ProtoMessage() {} func (x *ServerMeta_Peer) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[83] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7130,7 +7408,7 @@ type ServerMeta_AdditionalBeaconP2PAttestationData struct { func (x *ServerMeta_AdditionalBeaconP2PAttestationData) Reset() { *x = ServerMeta_AdditionalBeaconP2PAttestationData{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[84] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7143,7 +7421,7 @@ func (x *ServerMeta_AdditionalBeaconP2PAttestationData) String() string { func (*ServerMeta_AdditionalBeaconP2PAttestationData) ProtoMessage() {} func (x *ServerMeta_AdditionalBeaconP2PAttestationData) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[84] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7177,7 +7455,7 @@ type ServerMeta_AdditionalLibp2PTraceConnectedData struct { func (x *ServerMeta_AdditionalLibp2PTraceConnectedData) Reset() { *x = ServerMeta_AdditionalLibp2PTraceConnectedData{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[85] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7190,7 +7468,7 @@ func (x *ServerMeta_AdditionalLibp2PTraceConnectedData) String() string { func (*ServerMeta_AdditionalLibp2PTraceConnectedData) ProtoMessage() {} func (x *ServerMeta_AdditionalLibp2PTraceConnectedData) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[85] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7224,7 +7502,7 @@ type ServerMeta_AdditionalLibp2PTraceDisconnectedData struct { func (x *ServerMeta_AdditionalLibp2PTraceDisconnectedData) Reset() { *x = ServerMeta_AdditionalLibp2PTraceDisconnectedData{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[86] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7237,7 +7515,7 @@ func (x *ServerMeta_AdditionalLibp2PTraceDisconnectedData) String() string { func (*ServerMeta_AdditionalLibp2PTraceDisconnectedData) ProtoMessage() {} func (x *ServerMeta_AdditionalLibp2PTraceDisconnectedData) ProtoReflect() protoreflect.Message { - mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[86] + mi := &file_pkg_proto_xatu_event_ingester_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7393,7 +7671,7 @@ var file_pkg_proto_xatu_event_ingester_proto_rawDesc = []byte{ 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x8b, 0x8c, 0x01, 0x0a, 0x0a, 0x43, 0x6c, 0x69, + 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0xa2, 0x95, 0x01, 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, @@ -7805,126 +8083,199 @@ var file_pkg_proto_xatu_event_ingester_proto_rawDesc = []byte{ 0x75, 0x62, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x23, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x47, 0x4f, 0x53, 0x53, 0x49, 0x50, 0x53, 0x55, 0x42, 0x5f, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x1a, 0x80, 0x03, 0x0a, 0x08, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x12, 0x3b, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, - 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x52, 0x09, 0x63, - 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x1a, 0x2d, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x33, 0x0a, 0x09, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x46, 0x6f, 0x72, - 0x6b, 0x49, 0x44, 0x52, 0x07, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x1a, 0x4d, 0x0a, 0x09, - 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, - 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x1a, 0x4d, 0x0a, 0x26, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, - 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x1a, 0x49, 0x0a, 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, - 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x4d, 0x0a, 0x26, 0x41, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, - 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, - 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x88, 0x03, 0x0a, 0x24, 0x41, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, - 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, - 0x74, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x72, - 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x13, 0x61, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x41, 0x74, - 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x96, 0x03, 0x0a, 0x26, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, - 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, - 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, - 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, - 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x97, - 0x01, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, - 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x48, 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x72, 0x6f, - 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x9f, 0x01, 0x0a, 0x1f, 0x41, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x48, 0x65, 0x61, 0x64, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, + 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x12, 0xa4, 0x01, 0x0a, 0x29, 0x6c, 0x69, 0x62, + 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, + 0x73, 0x75, 0x62, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x53, 0x75, 0x62, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x48, 0x00, 0x52, 0x29, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, + 0x43, 0x45, 0x5f, 0x47, 0x4f, 0x53, 0x53, 0x49, 0x50, 0x53, 0x55, 0x42, 0x5f, 0x42, 0x45, 0x41, + 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x1a, + 0x80, 0x03, 0x0a, 0x08, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x12, 0x3b, 0x0a, 0x07, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x09, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x65, + 0x6e, 0x73, 0x75, 0x73, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x1a, + 0x2d, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x33, + 0x0a, 0x09, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x07, 0x66, + 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x52, 0x07, 0x66, 0x6f, 0x72, 0x6b, + 0x5f, 0x69, 0x64, 0x1a, 0x4d, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, + 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, + 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x4d, 0x0a, 0x26, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x32, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, + 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x49, 0x0a, 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, + 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x1a, 0x4d, 0x0a, 0x26, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x98, 0x01, 0x0a, 0x1e, 0x41, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, + 0x68, 0x1a, 0x88, 0x03, 0x0a, 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, + 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x70, + 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x4a, 0x0a, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x96, 0x03, 0x0a, + 0x26, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, + 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, + 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x41, 0x74, 0x74, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, + 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x97, 0x01, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x48, + 0x65, 0x61, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, + 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, + 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, + 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x9f, 0x01, 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, + 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x48, 0x65, 0x61, 0x64, 0x56, 0x32, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, + 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, + 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, + 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x1a, 0x98, 0x01, 0x0a, 0x1e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, + 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa0, 0x01, 0x0a, + 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, + 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, + 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, + 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x4b, 0x0a, 0x26, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, + 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, + 0x79, 0x45, 0x78, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x4f, 0x0a, 0x28, + 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, + 0x69, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x51, 0x0a, + 0x2c, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, + 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x1a, 0x55, 0x0a, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, + 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x56, 0x32, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, + 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x9d, 0x01, 0x0a, 0x23, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, + 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, + 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, + 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa5, 0x01, 0x0a, 0x25, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x67, 0x56, 0x32, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, + 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, + 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, + 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0xb3, 0x01, 0x0a, 0x39, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, + 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, @@ -7932,383 +8283,370 @@ var file_pkg_proto_xatu_event_ingester_proto_rawDesc = []byte{ 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa0, 0x01, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, - 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, - 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, - 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x4b, 0x0a, 0x26, 0x41, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x4f, 0x0a, 0x28, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x56, 0x6f, - 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, - 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x51, 0x0a, 0x2c, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x46, - 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x55, 0x0a, 0x2e, 0x41, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x1a, 0x9d, 0x01, 0x0a, 0x23, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, - 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, - 0x65, 0x6f, 0x72, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x70, - 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x1a, 0xa5, 0x01, 0x0a, 0x25, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, - 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, - 0x65, 0x6f, 0x72, 0x67, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, - 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, - 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, - 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xb3, 0x01, 0x0a, 0x39, 0x41, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, - 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, 0x6f, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, - 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x72, 0x6f, - 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xbb, - 0x01, 0x0a, 0x3b, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, - 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, - 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, - 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, - 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x9f, 0x01, 0x0a, - 0x2d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x6e, - 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa3, - 0x01, 0x0a, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, - 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x70, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xad, 0x02, 0x0a, 0x12, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, - 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x31, 0x0a, 0x0d, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, - 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2e, - 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, - 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x48, - 0x0a, 0x1f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, - 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x1a, 0xef, 0x02, 0x0a, 0x14, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, - 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x56, 0x32, 0x12, 0x33, 0x0a, - 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xbb, 0x01, 0x0a, 0x3b, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x56, + 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x56, 0x32, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x12, 0x30, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6c, + 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, - 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x66, 0x0a, 0x1f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x12, 0x4e, 0x0a, 0x13, + 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, + 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x9f, 0x01, 0x0a, 0x2d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x6e, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, + 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa3, 0x01, 0x0a, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x70, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x4c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, + 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xad, 0x02, 0x0a, 0x12, + 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x12, 0x31, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2e, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x48, 0x0a, 0x1f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x12, + 0x30, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0xef, 0x02, 0x0a, 0x14, + 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x56, 0x32, 0x12, 0x33, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x0c, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x0c, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x66, 0x0a, 0x1f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x1f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, + 0x5f, 0x6d, 0x73, 0x12, 0x4e, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x65, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, - 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x08, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x5f, 0x6d, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x65, 0x0a, + 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, + 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x1a, 0x69, 0x0a, 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, + 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x08, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x1a, 0x69, 0x0a, - 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, - 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x56, - 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, + 0x68, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x1a, + 0xa1, 0x01, 0x0a, 0x27, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, + 0x68, 0x56, 0x31, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x4f, 0x72, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x06, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x46, 0x6f, + 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, - 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x08, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x1a, 0xa1, 0x01, 0x0a, 0x27, 0x41, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x44, 0x65, 0x62, 0x75, - 0x67, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x65, 0x4f, 0x72, 0x67, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x12, 0x39, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x1a, 0xa7, 0x01, 0x0a, - 0x29, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, - 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x4f, 0x72, 0x67, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, - 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x56, - 0x32, 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, - 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x56, 0x32, 0x52, - 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x1a, 0x6b, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, - 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x1a, 0xf2, 0x01, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, - 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, - 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x1a, 0x9a, 0x05, 0x0a, 0x22, 0x41, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x05, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x1a, 0xa7, 0x01, 0x0a, 0x29, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, + 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x65, 0x4f, 0x72, 0x67, 0x56, 0x32, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x12, 0x3b, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x1a, 0x6b, 0x0a, + 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, + 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, + 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x1a, 0xf2, 0x01, 0x0a, 0x20, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x32, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x67, - 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x03, 0x67, 0x61, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x61, 0x6c, - 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x67, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x5f, 0x63, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x67, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x5f, 0x63, 0x61, 0x70, 0x12, - 0x20, 0x0a, 0x0b, 0x67, 0x61, 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x61, 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, - 0x70, 0x12, 0x38, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, + 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x67, 0x61, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x1a, + 0x9a, 0x05, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4d, 0x65, + 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, + 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, + 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x32, + 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x6e, + 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x2e, 0x0a, 0x03, 0x67, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x67, 0x61, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x67, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x5f, + 0x63, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x61, 0x73, 0x5f, 0x74, + 0x69, 0x70, 0x5f, 0x63, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x67, 0x61, 0x73, 0x5f, 0x66, 0x65, + 0x65, 0x5f, 0x63, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x61, 0x73, + 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x12, 0x38, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x62, + 0x5f, 0x67, 0x61, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, + 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x66, + 0x65, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x62, 0x6c, + 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x12, 0x20, + 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0f, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, + 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x62, 0x6c, + 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x12, 0x3a, 0x0a, 0x18, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, + 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x18, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, + 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x1a, 0x89, 0x02, 0x0a, + 0x1e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, + 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, + 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x12, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x18, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x1a, 0x8d, 0x05, 0x0a, 0x20, 0x41, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, + 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, + 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x4c, + 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x58, 0x0a, 0x18, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x23, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x08, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x62, - 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, - 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x62, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x6c, 0x6f, - 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, - 0x63, 0x61, 0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x62, 0x6c, 0x6f, - 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x62, 0x6c, 0x6f, - 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x1a, 0x89, 0x02, 0x0a, 0x1e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x65, 0x52, 0x23, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x18, + 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, + 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x1a, 0x5d, 0x0a, 0x2e, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, + 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x5d, 0x0a, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x5a, 0x0a, 0x2b, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1e, 0x0a, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x1a, 0x8d, 0x05, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x1a, 0x54, 0x0a, 0x25, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x4c, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x58, 0x0a, 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, - 0x6e, 0x0a, 0x23, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x23, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, - 0x3e, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, - 0x54, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x16, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x18, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x1a, 0x5d, 0x0a, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, - 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x1a, 0x5d, 0x0a, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, - 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, - 0x5a, 0x0a, 0x2b, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, - 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x6f, 0x6c, - 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, - 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x54, 0x0a, 0x25, 0x41, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x1a, 0x61, 0x0a, 0x32, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, - 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, - 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0xd5, 0x02, 0x0a, 0x32, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4a, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, + 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x61, 0x0a, 0x32, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, + 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0xd5, 0x02, 0x0a, 0x32, + 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x4a, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, + 0x26, 0x0a, 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x5f, + 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, + 0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x62, 0x6c, 0x6f, 0x62, 0x5f, + 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x62, 0x6c, 0x6f, 0x62, 0x5f, + 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x1a, 0x57, 0x0a, 0x28, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x74, 0x0a, 0x2b, + 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, + 0x6f, 0x74, 0x1a, 0x8b, 0x02, 0x0a, 0x17, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x66, + 0x0a, 0x1f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, + 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x12, 0x4e, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x61, 0x6c, 0x6c, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, - 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x62, 0x6c, - 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x3a, 0x0a, 0x18, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, - 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x18, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, - 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x1a, 0x57, 0x0a, 0x28, - 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0x74, 0x0a, 0x2b, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, - 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x1a, 0x8b, 0x02, 0x0a, 0x17, - 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x66, 0x0a, 0x1f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x73, 0x6c, 0x6f, - 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x12, - 0x4e, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x12, - 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0xdc, 0x02, 0x0a, 0x2b, 0x41, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x65, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x1a, 0xdc, 0x02, 0x0a, 0x2b, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, + 0x74, 0x68, 0x56, 0x31, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x74, 0x74, + 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, + 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, + 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, + 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, + 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x44, 0x0a, 0x08, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x1a, + 0xa4, 0x01, 0x0a, 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, + 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x69, 0x64, + 0x65, 0x63, 0x61, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, + 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, + 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x99, 0x02, 0x0a, 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, + 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, + 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x12, 0x46, 0x0a, 0x0f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x1a, 0xa9, 0x04, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x50, 0x32, 0x50, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, @@ -8318,738 +8656,762 @@ var file_pkg_proto_xatu_event_ingester_proto_rawDesc = []byte{ 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x32, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, - 0x6f, 0x74, 0x12, 0x44, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x1a, 0xa4, 0x01, 0x0a, 0x24, 0x41, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, - 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, - 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, - 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, - 0x99, 0x02, 0x0a, 0x24, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, - 0x68, 0x56, 0x31, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x69, 0x64, - 0x65, 0x63, 0x61, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, - 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, - 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, - 0x3a, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x12, 0x46, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6d, 0x70, 0x74, - 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, - 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x1a, 0xa9, 0x04, 0x0a, 0x22, - 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x50, 0x32, 0x50, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, - 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, - 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x35, 0x0a, 0x0b, 0x70, - 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x13, 0x61, 0x74, 0x74, + 0x61, 0x74, 0x61, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x73, + 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x23, 0x0a, + 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, + 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x25, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x12, 0x38, 0x0a, - 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x1a, 0x84, 0x01, 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x65, 0x72, 0x44, 0x75, 0x74, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, - 0x6f, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x1a, 0x97, - 0x03, 0x0a, 0x33, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, - 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x6c, 0x61, - 0x62, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x4a, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x56, 0x32, 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, + 0x70, 0x32, 0x70, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x12, 0x34, + 0x0a, 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, - 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x1a, 0x5f, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x62, 0x0a, 0x23, 0x41, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, - 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5f, 0x0a, - 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, - 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x63, 0x76, 0x52, 0x50, 0x43, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, - 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5f, - 0x0a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, - 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x50, 0x43, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, - 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, - 0x5c, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, - 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, - 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x61, 0x0a, - 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, - 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, + 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x1a, 0x84, + 0x01, 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, + 0x56, 0x31, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x44, 0x75, 0x74, 0x79, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, + 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, + 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x5f, 0x69, 0x64, 0x1a, 0x97, 0x03, 0x0a, 0x33, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x32, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4a, 0x0a, 0x11, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, + 0x6c, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x4f, 0x0a, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, + 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, 0x41, + 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4f, + 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x74, 0x68, 0x56, 0x31, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x56, 0x32, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x1a, + 0x5f, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, + 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x1a, 0x64, 0x0a, 0x25, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, - 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x1a, 0x62, 0x0a, 0x23, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, + 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, + 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5f, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x63, + 0x76, 0x52, 0x50, 0x43, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5f, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x53, 0x65, + 0x6e, 0x64, 0x52, 0x50, 0x43, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x66, 0x0a, 0x27, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x48, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, - 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x64, - 0x0a, 0x25, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, - 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5c, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x4a, + 0x6f, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x1a, 0x8d, 0x04, 0x0a, 0x2d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x47, 0x6f, - 0x73, 0x73, 0x69, 0x70, 0x53, 0x75, 0x62, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, - 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x37, 0x0a, - 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x34, 0x0a, 0x0e, 0x77, 0x61, 0x6c, 0x6c, 0x63, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x0e, 0x77, 0x61, - 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, - 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, - 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x32, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x74, - 0x6f, 0x70, 0x69, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0xca, 0x09, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x16, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x50, - 0x32, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x50, 0x32, 0x50, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x16, 0x42, 0x45, 0x41, - 0x43, 0x4f, 0x4e, 0x5f, 0x50, 0x32, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x12, 0x6d, 0x0a, 0x16, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, - 0x41, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x4c, 0x69, 0x62, 0x70, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x16, 0x4c, 0x49, 0x42, 0x50, - 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, - 0x45, 0x44, 0x12, 0x76, 0x0a, 0x19, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, - 0x43, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x64, 0x61, 0x74, 0x61, 0x1a, 0x61, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x64, 0x0a, 0x25, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, + 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x66, 0x0a, + 0x27, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, + 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x64, 0x0a, 0x25, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x8d, 0x04, 0x0a, 0x2d, + 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x53, 0x75, 0x62, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, + 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, + 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x37, 0x0a, 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x0f, 0x77, 0x61, + 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x34, 0x0a, + 0x0e, 0x77, 0x61, 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, + 0x74, 0x56, 0x32, 0x52, 0x0e, 0x77, 0x61, 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x52, 0x0b, 0x70, + 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x3c, 0x0a, + 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x1a, 0x60, 0x0a, 0x39, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x53, 0x75, 0x62, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x60, 0x0a, + 0x39, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, + 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x53, 0x75, 0x62, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x1a, + 0xa9, 0x06, 0x0a, 0x33, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, + 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x53, + 0x75, 0x62, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x62, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x47, + 0x6f, 0x73, 0x73, 0x69, 0x70, 0x53, 0x75, 0x62, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x50, 0x32, 0x50, 0x54, 0x72, + 0x61, 0x63, 0x65, 0x47, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x53, 0x75, 0x62, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x20, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x04, 0x73, 0x6c, 0x6f, + 0x74, 0x12, 0x23, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x56, 0x32, 0x52, + 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, + 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, + 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x13, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x0a, 0x0f, 0x77, + 0x61, 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x56, 0x32, 0x52, 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x12, 0x34, 0x0a, 0x0e, 0x77, 0x61, 0x6c, 0x6c, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x56, 0x32, 0x52, 0x0e, 0x77, 0x61, 0x6c, 0x6c, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x40, 0x0a, 0x0c, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x3c, 0x0a, + 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0xca, 0x09, + 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x05, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x6d, 0x0a, 0x16, 0x42, + 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x50, 0x32, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x50, 0x32, + 0x50, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, + 0x48, 0x00, 0x52, 0x16, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x50, 0x32, 0x50, 0x5f, 0x41, + 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x6d, 0x0a, 0x16, 0x4c, 0x49, + 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, + 0x43, 0x54, 0x45, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x70, 0x32, 0x50, 0x54, 0x72, 0x61, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, + 0x00, 0x52, 0x16, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, + 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x12, 0x76, 0x0a, 0x19, 0x4c, 0x49, 0x42, + 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, + 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x70, 0x32, 0x50, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x19, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, + 0x52, 0x41, 0x43, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, + 0x44, 0x1a, 0x53, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x12, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x12, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0xb7, 0x02, 0x0a, 0x03, 0x47, 0x65, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, + 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0b, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x25, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x61, 0x74, 0x69, 0x74, 0x75, + 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, + 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x12, 0x38, 0x0a, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x18, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x1c, 0x41, 0x75, + 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x1e, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0x40, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x65, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x6f, 0x52, 0x03, 0x67, + 0x65, 0x6f, 0x1a, 0x2e, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x65, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x6f, 0x52, 0x03, 0x67, + 0x65, 0x6f, 0x1a, 0x4f, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x50, 0x32, 0x50, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, + 0x65, 0x65, 0x72, 0x1a, 0x4f, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x4c, 0x69, 0x62, 0x70, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x65, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, + 0x70, 0x65, 0x65, 0x72, 0x1a, 0x52, 0x0a, 0x25, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x70, 0x32, 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, - 0x19, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x44, 0x49, - 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x1a, 0x53, 0x0a, 0x05, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x12, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, - 0xb7, 0x02, 0x0a, 0x03, 0x47, 0x65, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, - 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, - 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x4c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4c, - 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, - 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x38, 0x0a, 0x16, 0x41, 0x75, 0x74, - 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x61, 0x75, 0x74, 0x6f, 0x6e, - 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x1c, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, - 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, 0x61, 0x75, 0x74, 0x6f, 0x6e, - 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x40, 0x0a, 0x06, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x70, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x65, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x6f, 0x52, 0x03, 0x67, 0x65, 0x6f, 0x1a, 0x2e, 0x0a, 0x04, 0x50, - 0x65, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x65, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, - 0x74, 0x61, 0x2e, 0x47, 0x65, 0x6f, 0x52, 0x03, 0x67, 0x65, 0x6f, 0x1a, 0x4f, 0x0a, 0x22, 0x41, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x50, - 0x32, 0x50, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x61, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x1a, 0x4f, 0x0a, 0x22, - 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x70, 0x32, 0x50, - 0x54, 0x72, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, - 0x74, 0x61, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x1a, 0x52, 0x0a, - 0x25, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x70, 0x32, - 0x50, 0x54, 0x72, 0x61, 0x63, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, - 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x22, 0x5a, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x06, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x78, 0x61, - 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x06, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, - 0xf3, 0x10, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x38, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xf9, 0x0f, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, - 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, - 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, - 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x52, - 0x45, 0x4f, 0x52, 0x47, 0x10, 0x02, 0x12, 0x31, 0x0a, 0x2d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, - 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x45, - 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x45, 0x41, - 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x10, 0x04, 0x12, 0x2b, 0x0a, 0x27, - 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, - 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, - 0x52, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x10, 0x05, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x45, 0x41, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, + 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0x5a, 0x0a, 0x04, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x28, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x06, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x06, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0xa2, 0x11, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0xa8, 0x10, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x06, 0x12, 0x33, 0x0a, 0x2f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, + 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x22, 0x0a, 0x1e, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, + 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, + 0x4b, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, - 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x44, - 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x45, 0x4d, 0x50, - 0x4f, 0x4f, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x08, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, - 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, - 0x4f, 0x43, 0x4b, 0x10, 0x09, 0x12, 0x27, 0x0a, 0x23, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x10, 0x02, 0x12, 0x31, 0x0a, + 0x2d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, + 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, + 0x5a, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x03, + 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, + 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x48, 0x45, 0x41, + 0x44, 0x10, 0x04, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, + 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, + 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x10, 0x05, + 0x12, 0x28, 0x0a, 0x24, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, + 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x54, 0x54, + 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x33, 0x0a, 0x2f, 0x42, 0x45, + 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x10, 0x07, 0x12, + 0x17, 0x0a, 0x13, 0x4d, 0x45, 0x4d, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x08, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x45, 0x41, 0x43, + 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, + 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x09, 0x12, 0x27, 0x0a, 0x23, + 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, + 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, + 0x49, 0x43, 0x45, 0x10, 0x0a, 0x12, 0x2d, 0x0a, 0x29, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, - 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x10, 0x0a, 0x12, 0x2d, - 0x0a, 0x29, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, - 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, - 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x10, 0x0b, 0x12, 0x26, 0x0a, - 0x22, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, - 0x56, 0x31, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, - 0x54, 0x45, 0x45, 0x10, 0x0c, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, - 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x0d, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x45, 0x41, 0x43, 0x4f, - 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x56, 0x32, 0x10, 0x0e, 0x12, 0x2b, + 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4f, + 0x52, 0x47, 0x10, 0x0b, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, + 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x45, 0x10, 0x0c, 0x12, 0x30, 0x0a, 0x2c, + 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, + 0x31, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x45, + 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x0d, 0x12, 0x25, + 0x0a, 0x21, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, + 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, + 0x5f, 0x56, 0x32, 0x10, 0x0e, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x53, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x5f, 0x56, 0x32, + 0x10, 0x0f, 0x12, 0x34, 0x0a, 0x30, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, + 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x46, + 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x10, 0x10, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x45, 0x41, 0x43, + 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x5f, 0x56, 0x32, 0x10, 0x11, 0x12, 0x2e, + 0x0a, 0x2a, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, + 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, + 0x54, 0x41, 0x52, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x5f, 0x56, 0x32, 0x10, 0x12, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, - 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, - 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x5f, 0x56, 0x32, 0x10, 0x0f, 0x12, 0x34, 0x0a, 0x30, 0x42, + 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, + 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x10, 0x13, 0x12, 0x36, 0x0a, 0x32, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, - 0x44, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x10, - 0x10, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, - 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x48, 0x45, - 0x41, 0x44, 0x5f, 0x56, 0x32, 0x10, 0x11, 0x12, 0x2e, 0x0a, 0x2a, 0x42, 0x45, 0x41, 0x43, 0x4f, - 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x53, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x45, 0x58, - 0x49, 0x54, 0x5f, 0x56, 0x32, 0x10, 0x12, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x45, 0x41, 0x43, 0x4f, - 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x56, 0x32, 0x10, 0x13, 0x12, 0x36, 0x0a, 0x32, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x49, 0x42, 0x55, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x56, + 0x32, 0x10, 0x14, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x45, 0x4d, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x10, 0x15, 0x12, + 0x25, 0x0a, 0x21, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, + 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, + 0x4b, 0x5f, 0x56, 0x32, 0x10, 0x16, 0x12, 0x2a, 0x0a, 0x26, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, + 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x56, 0x32, + 0x10, 0x17, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, + 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, + 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x5f, + 0x56, 0x32, 0x10, 0x18, 0x12, 0x34, 0x0a, 0x30, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, + 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x45, 0x52, 0x5f, + 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x19, 0x12, 0x34, 0x0a, 0x30, 0x42, 0x45, + 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, + 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x1a, + 0x12, 0x31, 0x0a, 0x2d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, + 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, + 0x43, 0x4b, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x45, 0x58, 0x49, + 0x54, 0x10, 0x1b, 0x12, 0x2a, 0x0a, 0x26, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, + 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x10, 0x1c, 0x12, + 0x3a, 0x0a, 0x36, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, + 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, + 0x4b, 0x5f, 0x42, 0x4c, 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x1d, 0x12, 0x38, 0x0a, 0x34, 0x42, + 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, + 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x45, 0x58, + 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x1e, 0x12, 0x2d, 0x0a, 0x29, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, + 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, + 0x41, 0x4c, 0x10, 0x1f, 0x12, 0x29, 0x0a, 0x25, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, - 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, - 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x56, 0x32, 0x10, 0x14, 0x12, 0x1a, 0x0a, 0x16, - 0x4d, 0x45, 0x4d, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x10, 0x15, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, - 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x56, 0x32, 0x10, 0x16, 0x12, - 0x2a, 0x0a, 0x26, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, - 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, - 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x56, 0x32, 0x10, 0x17, 0x12, 0x30, 0x0a, 0x2c, 0x42, + 0x5f, 0x42, 0x4c, 0x4f, 0x42, 0x5f, 0x53, 0x49, 0x44, 0x45, 0x43, 0x41, 0x52, 0x10, 0x20, 0x12, + 0x23, 0x0a, 0x1f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x5f, 0x42, 0x4c, + 0x4f, 0x43, 0x4b, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x21, 0x12, 0x29, 0x0a, 0x25, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, + 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x42, 0x4c, 0x4f, 0x42, 0x5f, 0x53, 0x49, 0x44, 0x45, 0x43, 0x41, 0x52, 0x10, 0x22, 0x12, + 0x1a, 0x0a, 0x16, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x50, 0x32, 0x50, 0x5f, 0x41, 0x54, + 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x23, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, - 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, - 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x5f, 0x56, 0x32, 0x10, 0x18, 0x12, 0x34, 0x0a, - 0x30, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, - 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, - 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, - 0x47, 0x10, 0x19, 0x12, 0x34, 0x0a, 0x30, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, - 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, - 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, 0x5f, 0x53, - 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x1a, 0x12, 0x31, 0x0a, 0x2d, 0x42, 0x45, 0x41, - 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, - 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x56, 0x4f, 0x4c, 0x55, - 0x4e, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x10, 0x1b, 0x12, 0x2a, 0x0a, 0x26, - 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, - 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x44, - 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x10, 0x1c, 0x12, 0x3a, 0x0a, 0x36, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, - 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x4c, 0x53, 0x5f, 0x54, - 0x4f, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x10, 0x1d, 0x12, 0x38, 0x0a, 0x34, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, - 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, - 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x1e, 0x12, 0x2d, - 0x0a, 0x29, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, - 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, - 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x10, 0x1f, 0x12, 0x29, 0x0a, - 0x25, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, - 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x42, 0x5f, 0x53, - 0x49, 0x44, 0x45, 0x43, 0x41, 0x52, 0x10, 0x20, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x4c, 0x4f, 0x43, - 0x4b, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x43, 0x4c, 0x41, - 0x53, 0x53, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x21, 0x12, 0x29, 0x0a, - 0x25, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, - 0x56, 0x31, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x42, 0x5f, 0x53, - 0x49, 0x44, 0x45, 0x43, 0x41, 0x52, 0x10, 0x22, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x50, 0x32, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x23, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, - 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, - 0x45, 0x52, 0x5f, 0x44, 0x55, 0x54, 0x59, 0x10, 0x24, 0x12, 0x39, 0x0a, 0x35, 0x42, 0x45, 0x41, - 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, - 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x45, 0x4c, 0x41, 0x42, - 0x4f, 0x52, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, - 0x52, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x26, - 0x12, 0x1d, 0x0a, 0x19, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, - 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x27, 0x12, + 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x54, 0x59, 0x10, 0x24, + 0x12, 0x39, 0x0a, 0x35, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, + 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, + 0x43, 0x4b, 0x5f, 0x45, 0x4c, 0x41, 0x42, 0x4f, 0x52, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, + 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x1a, 0x0a, 0x16, 0x4c, + 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, + 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x26, 0x12, 0x1d, 0x0a, 0x19, 0x4c, 0x49, 0x42, 0x50, 0x32, + 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, + 0x43, 0x54, 0x45, 0x44, 0x10, 0x27, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, + 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x50, 0x45, 0x45, 0x52, 0x10, + 0x28, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, + 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x50, 0x45, 0x45, 0x52, 0x10, 0x29, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, - 0x41, 0x44, 0x44, 0x5f, 0x50, 0x45, 0x45, 0x52, 0x10, 0x28, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x49, - 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, - 0x45, 0x5f, 0x50, 0x45, 0x45, 0x52, 0x10, 0x29, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, 0x42, 0x50, - 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x56, 0x5f, 0x52, 0x50, - 0x43, 0x10, 0x2a, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, - 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x52, 0x50, 0x43, 0x10, 0x2b, 0x12, 0x19, - 0x0a, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x44, - 0x52, 0x4f, 0x50, 0x5f, 0x52, 0x50, 0x43, 0x10, 0x2c, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x49, 0x42, - 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x10, 0x2d, - 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x2e, 0x12, 0x20, 0x0a, 0x1c, 0x4c, 0x49, - 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x4c, - 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x10, 0x2f, 0x12, 0x1e, 0x0a, 0x1a, - 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x48, 0x41, 0x4e, - 0x44, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x30, 0x12, 0x27, 0x0a, 0x23, + 0x52, 0x45, 0x43, 0x56, 0x5f, 0x52, 0x50, 0x43, 0x10, 0x2a, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, + 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, + 0x52, 0x50, 0x43, 0x10, 0x2b, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, + 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x52, 0x50, 0x43, 0x10, 0x2c, + 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, + 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x10, 0x2d, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x49, 0x42, 0x50, 0x32, + 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x2e, 0x12, 0x20, 0x0a, 0x1c, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, + 0x45, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x4c, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, + 0x41, 0x10, 0x2f, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, + 0x41, 0x43, 0x45, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x10, 0x30, 0x12, 0x27, 0x0a, 0x23, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, + 0x41, 0x43, 0x45, 0x5f, 0x47, 0x4f, 0x53, 0x53, 0x49, 0x50, 0x53, 0x55, 0x42, 0x5f, 0x42, 0x45, + 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x31, 0x12, 0x2d, 0x0a, 0x29, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x47, 0x4f, 0x53, - 0x53, 0x49, 0x50, 0x53, 0x55, 0x42, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, - 0x4f, 0x43, 0x4b, 0x10, 0x31, 0x22, 0xd4, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x63, 0x6f, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x6d, - 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x67, 0x0a, 0x19, 0x65, - 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x24, - 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, - 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x5a, 0x0a, 0x13, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, - 0x52, 0x1e, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, - 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, - 0x12, 0x6b, 0x0a, 0x19, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x67, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6f, 0x72, - 0x67, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x24, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, - 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x53, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x12, 0x86, 0x01, - 0x0a, 0x22, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, - 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x2d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, - 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x45, 0x43, - 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x12, 0x57, 0x0a, 0x12, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, - 0x52, 0x1d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, - 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x12, - 0x74, 0x0a, 0x1c, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, - 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x27, 0x42, 0x45, - 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, 0x52, 0x59, - 0x5f, 0x45, 0x58, 0x49, 0x54, 0x12, 0x8b, 0x01, 0x0a, 0x24, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x02, 0x18, 0x01, - 0x48, 0x00, 0x52, 0x2f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, - 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x4f, 0x4e, - 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x52, - 0x4f, 0x4f, 0x46, 0x12, 0x36, 0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x13, 0x4d, 0x45, 0x4d, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, - 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x5a, 0x0a, 0x13, 0x65, - 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x1e, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, - 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, - 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x12, 0x5e, 0x0a, 0x12, 0x65, 0x74, 0x68, 0x5f, 0x76, - 0x31, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, - 0x48, 0x00, 0x52, 0x23, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, - 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, - 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x12, 0x6d, 0x0a, 0x18, 0x65, 0x74, 0x68, 0x5f, 0x76, - 0x31, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x65, - 0x6f, 0x72, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x6f, 0x72, 0x67, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x29, 0x42, 0x45, 0x41, - 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, - 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, - 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x12, 0x5d, 0x0a, 0x17, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, - 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x48, - 0x00, 0x52, 0x22, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, - 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, - 0x49, 0x54, 0x54, 0x45, 0x45, 0x12, 0x79, 0x0a, 0x21, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x56, 0x32, - 0x48, 0x00, 0x52, 0x2c, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, - 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, - 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x12, 0x6b, 0x0a, 0x1c, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x32, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x32, 0x48, 0x00, 0x52, 0x27, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, + 0x53, 0x49, 0x50, 0x53, 0x55, 0x42, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x54, + 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x32, 0x22, 0xce, 0x28, 0x0a, 0x0e, + 0x44, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x21, + 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, 0x65, 0x74, + 0x61, 0x12, 0x67, 0x0a, 0x19, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, + 0x18, 0x01, 0x48, 0x00, 0x52, 0x24, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, - 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x12, 0x5e, 0x0a, - 0x16, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x76, 0x32, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x48, 0x00, 0x52, 0x21, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x56, 0x32, 0x12, 0x6f, 0x0a, - 0x1c, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x67, 0x5f, 0x76, 0x32, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x6f, 0x72, - 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x27, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, - 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, - 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x5f, 0x56, 0x32, 0x12, 0x8a, - 0x01, 0x0a, 0x25, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x56, 0x32, 0x48, 0x00, 0x52, 0x30, 0x42, 0x45, 0x41, 0x43, 0x4f, - 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x5f, 0x43, 0x48, - 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x56, 0x32, 0x12, 0x5b, 0x0a, 0x15, 0x65, - 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x68, 0x65, 0x61, - 0x64, 0x5f, 0x76, 0x32, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x65, - 0x61, 0x64, 0x56, 0x32, 0x48, 0x00, 0x52, 0x20, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, + 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x5a, 0x0a, 0x13, 0x65, 0x74, + 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x1e, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, - 0x5f, 0x48, 0x45, 0x41, 0x44, 0x5f, 0x56, 0x32, 0x12, 0x78, 0x0a, 0x1f, 0x65, 0x74, 0x68, 0x5f, - 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, - 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, - 0x69, 0x74, 0x56, 0x32, 0x48, 0x00, 0x52, 0x2a, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, + 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x12, 0x6b, 0x0a, 0x19, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, + 0x6f, 0x72, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x67, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x24, 0x42, + 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x52, 0x45, + 0x4f, 0x52, 0x47, 0x12, 0x86, 0x01, 0x0a, 0x22, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x2d, 0x42, + 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, + 0x44, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x12, 0x57, 0x0a, 0x12, + 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x68, 0x65, + 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, + 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x1d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, - 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x5f, - 0x56, 0x32, 0x12, 0x8f, 0x01, 0x0a, 0x27, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x76, 0x32, 0x18, 0x16, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x56, 0x32, 0x48, 0x00, - 0x52, 0x32, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, - 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, - 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x4f, - 0x46, 0x5f, 0x56, 0x32, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x32, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x16, 0x4d, 0x45, 0x4d, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, - 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x12, 0x5e, - 0x0a, 0x16, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x76, 0x32, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x5f, 0x48, 0x45, 0x41, 0x44, 0x12, 0x74, 0x0a, 0x1c, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, + 0x5f, 0x65, 0x78, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x42, 0x02, 0x18, 0x01, + 0x48, 0x00, 0x52, 0x27, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, + 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x56, 0x4f, 0x4c, + 0x55, 0x4e, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x12, 0x8b, 0x01, 0x0a, 0x24, + 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x2f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x12, 0x36, 0x0a, 0x13, 0x6d, 0x65, 0x6d, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x13, 0x4d, 0x45, + 0x4d, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x12, 0x5a, 0x0a, 0x13, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x48, 0x00, 0x52, 0x21, 0x42, 0x45, 0x41, - 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, - 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x56, 0x32, 0x12, 0x62, - 0x0a, 0x15, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x68, - 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x32, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6b, - 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x26, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, - 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, - 0x56, 0x32, 0x12, 0x71, 0x0a, 0x1b, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x66, 0x6f, 0x72, - 0x6b, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x67, 0x5f, 0x76, - 0x32, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x44, - 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x6f, 0x72, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x2c, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, - 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, - 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4f, - 0x52, 0x47, 0x5f, 0x56, 0x32, 0x12, 0x82, 0x01, 0x0a, 0x25, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, - 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x61, 0x74, - 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x18, - 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, - 0x68, 0x69, 0x6e, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x30, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, - 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x45, - 0x52, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x12, 0x82, 0x01, 0x0a, 0x25, 0x65, - 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x69, 0x6e, 0x67, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x30, 0x42, + 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x1e, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, - 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x12, - 0x7f, 0x0a, 0x22, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, - 0x5f, 0x65, 0x78, 0x69, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x61, - 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x56, 0x32, 0x48, - 0x00, 0x52, 0x2d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, + 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x12, 0x5e, 0x0a, + 0x12, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x68, 0x6f, + 0x69, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, + 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x23, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, + 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x12, 0x6d, 0x0a, + 0x18, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x68, 0x6f, + 0x69, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, + 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x65, 0x6f, 0x72, 0x67, 0x42, 0x02, 0x18, 0x01, 0x48, + 0x00, 0x52, 0x29, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, + 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, + 0x43, 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x12, 0x5d, 0x0a, 0x17, + 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x65, 0x48, 0x00, 0x52, 0x22, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, + 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x45, 0x12, 0x79, 0x0a, 0x21, 0x65, + 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, + 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x56, 0x32, 0x48, 0x00, 0x52, 0x2c, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x12, 0x6b, 0x0a, 0x1c, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x32, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x27, 0x42, 0x45, 0x41, 0x43, + 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x32, 0x12, 0x5e, 0x0a, 0x16, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x76, 0x32, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x48, 0x00, + 0x52, 0x21, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, + 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, + 0x5f, 0x56, 0x32, 0x12, 0x6f, 0x0a, 0x1c, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x67, + 0x5f, 0x76, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x27, 0x42, 0x45, 0x41, + 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x4f, 0x52, + 0x47, 0x5f, 0x56, 0x32, 0x12, 0x8a, 0x01, 0x0a, 0x25, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x56, 0x32, 0x48, 0x00, 0x52, + 0x30, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, + 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, + 0x5a, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x56, + 0x32, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x76, 0x32, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x56, 0x32, 0x48, 0x00, 0x52, 0x20, 0x42, 0x45, + 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x5f, 0x56, 0x32, 0x12, 0x78, + 0x0a, 0x1f, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x76, + 0x32, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6e, + 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, 0x56, 0x32, 0x48, 0x00, 0x52, 0x2a, 0x42, 0x45, + 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, 0x52, 0x59, + 0x5f, 0x45, 0x58, 0x49, 0x54, 0x5f, 0x56, 0x32, 0x12, 0x8f, 0x01, 0x0a, 0x27, 0x65, 0x74, 0x68, + 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x5f, 0x76, 0x32, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x78, 0x61, 0x74, + 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x56, 0x32, 0x48, 0x00, 0x52, 0x32, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, + 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, + 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, + 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x56, 0x32, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x65, + 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x76, 0x32, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x16, 0x4d, 0x45, + 0x4d, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x56, 0x32, 0x12, 0x5e, 0x0a, 0x16, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x76, 0x32, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x32, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x48, + 0x00, 0x52, 0x21, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, - 0x4b, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, 0x52, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x54, - 0x12, 0x65, 0x0a, 0x1b, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, - 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x56, 0x32, 0x48, 0x00, 0x52, - 0x26, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, - 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, - 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x12, 0x98, 0x01, 0x0a, 0x2b, 0x65, 0x74, 0x68, 0x5f, - 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x62, 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x36, 0x42, 0x45, 0x41, 0x43, - 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, - 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x4c, 0x53, 0x5f, 0x54, - 0x4f, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x12, 0x83, 0x01, 0x0a, 0x29, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x00, 0x52, 0x34, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, - 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, - 0x43, 0x4b, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x6e, 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x5f, - 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x56, 0x32, 0x48, 0x00, 0x52, 0x29, 0x42, - 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, - 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x57, 0x49, - 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x12, 0x6a, 0x0a, 0x1a, 0x65, 0x74, 0x68, 0x5f, - 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, - 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x78, - 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x48, 0x00, 0x52, 0x25, 0x42, + 0x4b, 0x5f, 0x56, 0x32, 0x12, 0x62, 0x0a, 0x15, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x66, + 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x32, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x56, 0x32, 0x48, 0x00, + 0x52, 0x26, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, + 0x5f, 0x56, 0x31, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, + 0x48, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x56, 0x32, 0x12, 0x71, 0x0a, 0x1b, 0x65, 0x74, 0x68, 0x5f, + 0x76, 0x31, 0x5f, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x72, + 0x65, 0x6f, 0x72, 0x67, 0x5f, 0x76, 0x32, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x6f, 0x72, 0x6b, 0x43, 0x68, + 0x6f, 0x69, 0x63, 0x65, 0x52, 0x65, 0x6f, 0x72, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x2c, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x42, 0x5f, 0x53, 0x49, 0x44, - 0x45, 0x43, 0x41, 0x52, 0x12, 0x70, 0x0a, 0x1f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x70, 0x72, 0x69, - 0x6e, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x78, 0x61, 0x74, 0x75, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x50, 0x52, 0x49, 0x4e, - 0x54, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x49, 0x46, 0x49, - 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x6b, 0x0a, 0x20, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, - 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x6c, - 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x6c, 0x6f, 0x62, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x48, 0x00, 0x52, 0x25, 0x42, 0x45, - 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, - 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x42, 0x5f, 0x53, 0x49, 0x44, 0x45, - 0x43, 0x41, 0x52, 0x12, 0x54, 0x0a, 0x16, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x70, 0x32, - 0x70, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x25, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, - 0x00, 0x52, 0x16, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x50, 0x32, 0x50, 0x5f, 0x41, 0x54, - 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x5a, 0x0a, 0x14, 0x65, 0x74, 0x68, - 0x5f, 0x76, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x75, 0x74, - 0x79, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x44, 0x75, - 0x74, 0x79, 0x48, 0x00, 0x52, 0x1f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, - 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, - 0x5f, 0x44, 0x55, 0x54, 0x59, 0x12, 0x8f, 0x01, 0x0a, 0x2a, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, - 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x6c, - 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x61, 0x74, - 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, - 0x52, 0x35, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, + 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x48, 0x4f, 0x49, + 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4f, 0x52, 0x47, 0x5f, 0x56, 0x32, 0x12, 0x82, 0x01, 0x0a, 0x25, + 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, + 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x30, + 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, + 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41, + 0x54, 0x54, 0x45, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, + 0x12, 0x82, 0x01, 0x0a, 0x25, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x56, + 0x32, 0x48, 0x00, 0x52, 0x30, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, + 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, + 0x4f, 0x43, 0x4b, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x4c, 0x41, + 0x53, 0x48, 0x49, 0x4e, 0x47, 0x12, 0x7f, 0x0a, 0x22, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, + 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x76, 0x6f, 0x6c, + 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, + 0x78, 0x69, 0x74, 0x56, 0x32, 0x48, 0x00, 0x52, 0x2d, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, + 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4e, 0x54, 0x41, 0x52, + 0x59, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x12, 0x65, 0x0a, 0x1b, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, + 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x56, 0x32, 0x48, 0x00, 0x52, 0x26, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, + 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x12, 0x98, 0x01, + 0x0a, 0x2b, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x32, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x4c, 0x53, 0x54, 0x6f, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x56, 0x32, 0x48, 0x00, + 0x52, 0x36, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, - 0x5f, 0x45, 0x4c, 0x41, 0x42, 0x4f, 0x52, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x54, 0x45, - 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x4c, 0x0a, 0x15, 0x6c, 0x69, 0x62, 0x70, 0x32, - 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, - 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, - 0x62, 0x70, 0x32, 0x70, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, - 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x41, 0x44, 0x44, - 0x5f, 0x50, 0x45, 0x45, 0x52, 0x12, 0x55, 0x0a, 0x18, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x65, - 0x72, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, - 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x65, 0x65, 0x72, - 0x48, 0x00, 0x52, 0x18, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, - 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x50, 0x45, 0x45, 0x52, 0x12, 0x4c, 0x0a, 0x15, - 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, - 0x76, 0x5f, 0x72, 0x70, 0x63, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x78, 0x61, - 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x52, 0x65, 0x63, 0x76, 0x52, 0x50, - 0x43, 0x48, 0x00, 0x52, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, - 0x45, 0x5f, 0x52, 0x45, 0x43, 0x56, 0x5f, 0x52, 0x50, 0x43, 0x12, 0x4c, 0x0a, 0x15, 0x6c, 0x69, - 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, - 0x72, 0x70, 0x63, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x78, 0x61, 0x74, 0x75, - 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x50, 0x43, 0x48, - 0x00, 0x52, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, - 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x52, 0x50, 0x43, 0x12, 0x41, 0x0a, 0x11, 0x6c, 0x69, 0x62, 0x70, - 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x2c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, - 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, - 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x12, 0x50, 0x0a, 0x16, 0x6c, - 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, - 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, - 0x41, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x12, 0x59, 0x0a, - 0x19, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x64, 0x69, - 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x19, 0x4c, - 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x12, 0x61, 0x0a, 0x1c, 0x6c, 0x69, 0x62, 0x70, - 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x48, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x1c, 0x4c, - 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x48, 0x41, 0x4e, 0x44, - 0x4c, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x12, 0x5b, 0x0a, 0x1a, 0x6c, - 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x48, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x4c, 0x49, - 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x4c, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x12, 0x7a, 0x0a, 0x23, 0x6c, 0x69, 0x62, 0x70, - 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x73, - 0x75, 0x62, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, - 0x70, 0x32, 0x70, 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, 0x73, 0x75, 0x62, 0x2e, 0x65, 0x74, - 0x68, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, - 0x23, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x47, 0x4f, - 0x53, 0x53, 0x49, 0x50, 0x53, 0x55, 0x42, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, - 0x4c, 0x4f, 0x43, 0x4b, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x58, 0x0a, 0x0d, + 0x5f, 0x42, 0x4c, 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x12, 0x83, 0x01, 0x0a, 0x29, 0x65, 0x74, 0x68, + 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x34, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, + 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x6e, + 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x56, + 0x32, 0x48, 0x00, 0x52, 0x29, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, + 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, + 0x4f, 0x43, 0x4b, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x12, 0x6a, + 0x0a, 0x1a, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, + 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x18, 0x22, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, + 0x72, 0x48, 0x00, 0x52, 0x25, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, + 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x42, 0x4c, + 0x4f, 0x42, 0x5f, 0x53, 0x49, 0x44, 0x45, 0x43, 0x41, 0x52, 0x12, 0x70, 0x0a, 0x1f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x23, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1f, 0x42, 0x4c, 0x4f, + 0x43, 0x4b, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x43, 0x4c, + 0x41, 0x53, 0x53, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x6b, 0x0a, 0x20, + 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, + 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, + 0x48, 0x00, 0x52, 0x25, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, + 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, + 0x42, 0x5f, 0x53, 0x49, 0x44, 0x45, 0x43, 0x41, 0x52, 0x12, 0x54, 0x0a, 0x16, 0x62, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x5f, 0x70, 0x32, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x16, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, + 0x50, 0x32, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x12, + 0x5a, 0x0a, 0x14, 0x65, 0x74, 0x68, 0x5f, 0x76, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x65, 0x72, 0x5f, 0x64, 0x75, 0x74, 0x79, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x72, 0x44, 0x75, 0x74, 0x79, 0x48, 0x00, 0x52, 0x1f, 0x42, 0x45, 0x41, 0x43, + 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x31, 0x5f, 0x50, 0x52, + 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x54, 0x59, 0x12, 0x8f, 0x01, 0x0a, 0x2a, + 0x65, 0x74, 0x68, 0x5f, 0x76, 0x32, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x35, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, + 0x50, 0x49, 0x5f, 0x45, 0x54, 0x48, 0x5f, 0x56, 0x32, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, + 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x45, 0x4c, 0x41, 0x42, 0x4f, 0x52, 0x41, 0x54, 0x45, + 0x44, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x12, 0x4c, 0x0a, + 0x15, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x64, + 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x78, + 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x65, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, + 0x43, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x50, 0x45, 0x45, 0x52, 0x12, 0x55, 0x0a, 0x18, 0x6c, + 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x50, 0x65, 0x65, 0x72, 0x48, 0x00, 0x52, 0x18, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, + 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x50, 0x45, + 0x45, 0x52, 0x12, 0x4c, 0x0a, 0x15, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x76, 0x5f, 0x72, 0x70, 0x63, 0x18, 0x2a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, + 0x52, 0x65, 0x63, 0x76, 0x52, 0x50, 0x43, 0x48, 0x00, 0x52, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, + 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x56, 0x5f, 0x52, 0x50, 0x43, + 0x12, 0x4c, 0x0a, 0x15, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x72, 0x70, 0x63, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x53, 0x65, + 0x6e, 0x64, 0x52, 0x50, 0x43, 0x48, 0x00, 0x52, 0x15, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, + 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x52, 0x50, 0x43, 0x12, 0x41, + 0x0a, 0x11, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x6a, + 0x6f, 0x69, 0x6e, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x78, 0x61, 0x74, 0x75, + 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x11, + 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x4a, 0x4f, 0x49, + 0x4e, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x2d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, 0x4c, 0x49, 0x42, + 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, + 0x54, 0x45, 0x44, 0x12, 0x59, 0x0a, 0x19, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, + 0x61, 0x63, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, + 0x62, 0x70, 0x32, 0x70, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x19, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, + 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x12, 0x61, + 0x0a, 0x1c, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x2f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, + 0x32, 0x70, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x48, 0x00, 0x52, 0x1c, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, + 0x45, 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x4c, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, + 0x41, 0x12, 0x5b, 0x0a, 0x1a, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, + 0x70, 0x32, 0x70, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x48, 0x00, 0x52, 0x1a, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, + 0x5f, 0x48, 0x41, 0x4e, 0x44, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x12, 0x7a, + 0x0a, 0x23, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x67, + 0x6f, 0x73, 0x73, 0x69, 0x70, 0x73, 0x75, 0x62, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x78, 0x61, + 0x74, 0x75, 0x2e, 0x6c, 0x69, 0x62, 0x70, 0x32, 0x70, 0x2e, 0x67, 0x6f, 0x73, 0x73, 0x69, 0x70, + 0x73, 0x75, 0x62, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x23, 0x4c, 0x49, 0x42, 0x50, 0x32, 0x50, 0x5f, 0x54, 0x52, + 0x41, 0x43, 0x45, 0x5f, 0x47, 0x4f, 0x53, 0x53, 0x49, 0x50, 0x53, 0x55, 0x42, 0x5f, 0x42, 0x45, + 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x12, 0x78, 0x0a, 0x29, 0x6c, 0x69, + 0x62, 0x70, 0x32, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x67, 0x6f, 0x73, 0x73, 0x69, + 0x70, 0x73, 0x75, 0x62, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x61, 0x74, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x78, 0x61, 0x74, 0x75, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x29, 0x4c, 0x49, 0x42, 0x50, 0x32, + 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x5f, 0x47, 0x4f, 0x53, 0x53, 0x49, 0x50, 0x53, 0x55, + 0x42, 0x5f, 0x42, 0x45, 0x41, 0x43, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x58, 0x0a, 0x0d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x19, 0x2e, 0x78, 0x61, 0x74, 0x75, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, @@ -9074,7 +9436,7 @@ func file_pkg_proto_xatu_event_ingester_proto_rawDescGZIP() []byte { } var file_pkg_proto_xatu_event_ingester_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_pkg_proto_xatu_event_ingester_proto_msgTypes = make([]protoimpl.MessageInfo, 87) +var file_pkg_proto_xatu_event_ingester_proto_msgTypes = make([]protoimpl.MessageInfo, 90) var file_pkg_proto_xatu_event_ingester_proto_goTypes = []interface{}{ (Event_Name)(0), // 0: xatu.Event.Name (*CreateEventsRequest)(nil), // 1: xatu.CreateEventsRequest @@ -9154,83 +9516,86 @@ var file_pkg_proto_xatu_event_ingester_proto_goTypes = []interface{}{ (*ClientMeta_AdditionalLibP2PTraceHandleMetadataData)(nil), // 75: xatu.ClientMeta.AdditionalLibP2PTraceHandleMetadataData (*ClientMeta_AdditionalLibP2PTraceHandleStatusData)(nil), // 76: xatu.ClientMeta.AdditionalLibP2PTraceHandleStatusData (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconBlockData)(nil), // 77: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData - (*ClientMeta_Ethereum_Network)(nil), // 78: xatu.ClientMeta.Ethereum.Network - (*ClientMeta_Ethereum_Execution)(nil), // 79: xatu.ClientMeta.Ethereum.Execution - (*ClientMeta_Ethereum_Consensus)(nil), // 80: xatu.ClientMeta.Ethereum.Consensus - (*ServerMeta_Event)(nil), // 81: xatu.ServerMeta.Event - (*ServerMeta_Geo)(nil), // 82: xatu.ServerMeta.Geo - (*ServerMeta_Client)(nil), // 83: xatu.ServerMeta.Client - (*ServerMeta_Peer)(nil), // 84: xatu.ServerMeta.Peer - (*ServerMeta_AdditionalBeaconP2PAttestationData)(nil), // 85: xatu.ServerMeta.AdditionalBeaconP2PAttestationData - (*ServerMeta_AdditionalLibp2PTraceConnectedData)(nil), // 86: xatu.ServerMeta.AdditionalLibp2PTraceConnectedData - (*ServerMeta_AdditionalLibp2PTraceDisconnectedData)(nil), // 87: xatu.ServerMeta.AdditionalLibp2PTraceDisconnectedData - (*timestamppb.Timestamp)(nil), // 88: google.protobuf.Timestamp - (*wrapperspb.UInt64Value)(nil), // 89: google.protobuf.UInt64Value - (*v1.ForkChoice)(nil), // 90: xatu.eth.v1.ForkChoice - (*v1.EventChainReorg)(nil), // 91: xatu.eth.v1.EventChainReorg - (*v1.ForkChoiceV2)(nil), // 92: xatu.eth.v1.ForkChoiceV2 - (*v1.EventChainReorgV2)(nil), // 93: xatu.eth.v1.EventChainReorgV2 - (*v1.Attestation)(nil), // 94: xatu.eth.v1.Attestation - (*v1.EventBlock)(nil), // 95: xatu.eth.v1.EventBlock - (*v1.EventFinalizedCheckpoint)(nil), // 96: xatu.eth.v1.EventFinalizedCheckpoint - (*v1.EventHead)(nil), // 97: xatu.eth.v1.EventHead - (*v1.EventVoluntaryExit)(nil), // 98: xatu.eth.v1.EventVoluntaryExit - (*v1.EventContributionAndProof)(nil), // 99: xatu.eth.v1.EventContributionAndProof - (*v2.EventBlock)(nil), // 100: xatu.eth.v2.EventBlock - (*v1.Committee)(nil), // 101: xatu.eth.v1.Committee - (*v1.AttestationDataV2)(nil), // 102: xatu.eth.v1.AttestationDataV2 - (*v1.AttestationV2)(nil), // 103: xatu.eth.v1.AttestationV2 - (*v1.EventBlockV2)(nil), // 104: xatu.eth.v1.EventBlockV2 - (*v1.EventFinalizedCheckpointV2)(nil), // 105: xatu.eth.v1.EventFinalizedCheckpointV2 - (*v1.EventHeadV2)(nil), // 106: xatu.eth.v1.EventHeadV2 - (*v1.EventVoluntaryExitV2)(nil), // 107: xatu.eth.v1.EventVoluntaryExitV2 - (*v1.EventContributionAndProofV2)(nil), // 108: xatu.eth.v1.EventContributionAndProofV2 - (*v2.EventBlockV2)(nil), // 109: xatu.eth.v2.EventBlockV2 - (*v1.AttesterSlashingV2)(nil), // 110: xatu.eth.v1.AttesterSlashingV2 - (*v1.ProposerSlashingV2)(nil), // 111: xatu.eth.v1.ProposerSlashingV2 - (*v1.SignedVoluntaryExitV2)(nil), // 112: xatu.eth.v1.SignedVoluntaryExitV2 - (*v1.DepositV2)(nil), // 113: xatu.eth.v1.DepositV2 - (*v2.SignedBLSToExecutionChangeV2)(nil), // 114: xatu.eth.v2.SignedBLSToExecutionChangeV2 - (*v1.Transaction)(nil), // 115: xatu.eth.v1.Transaction - (*v1.WithdrawalV2)(nil), // 116: xatu.eth.v1.WithdrawalV2 - (*v1.EventBlobSidecar)(nil), // 117: xatu.eth.v1.EventBlobSidecar - (*blockprint.BlockClassification)(nil), // 118: xatu.blockprint.BlockClassification - (*v1.BlobSidecar)(nil), // 119: xatu.eth.v1.BlobSidecar - (*v1.ProposerDuty)(nil), // 120: xatu.eth.v1.ProposerDuty - (*v1.ElaboratedAttestation)(nil), // 121: xatu.eth.v1.ElaboratedAttestation - (*libp2p.AddPeer)(nil), // 122: xatu.libp2p.AddPeer - (*libp2p.RemovePeer)(nil), // 123: xatu.libp2p.RemovePeer - (*libp2p.RecvRPC)(nil), // 124: xatu.libp2p.RecvRPC - (*libp2p.SendRPC)(nil), // 125: xatu.libp2p.SendRPC - (*libp2p.Join)(nil), // 126: xatu.libp2p.Join - (*libp2p.Connected)(nil), // 127: xatu.libp2p.Connected - (*libp2p.Disconnected)(nil), // 128: xatu.libp2p.Disconnected - (*libp2p.HandleMetadata)(nil), // 129: xatu.libp2p.HandleMetadata - (*libp2p.HandleStatus)(nil), // 130: xatu.libp2p.HandleStatus - (*gossipsub.BeaconBlock)(nil), // 131: xatu.libp2p.gossipsub.eth.BeaconBlock - (*wrapperspb.UInt32Value)(nil), // 132: google.protobuf.UInt32Value - (*libp2p.Peer)(nil), // 133: xatu.libp2p.Peer - (*wrapperspb.BoolValue)(nil), // 134: google.protobuf.BoolValue - (*libp2p.TraceEventMetadata)(nil), // 135: xatu.libp2p.TraceEventMetadata - (*wrapperspb.StringValue)(nil), // 136: google.protobuf.StringValue + (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData)(nil), // 78: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData + (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData)(nil), // 79: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData + (*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData)(nil), // 80: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData + (*ClientMeta_Ethereum_Network)(nil), // 81: xatu.ClientMeta.Ethereum.Network + (*ClientMeta_Ethereum_Execution)(nil), // 82: xatu.ClientMeta.Ethereum.Execution + (*ClientMeta_Ethereum_Consensus)(nil), // 83: xatu.ClientMeta.Ethereum.Consensus + (*ServerMeta_Event)(nil), // 84: xatu.ServerMeta.Event + (*ServerMeta_Geo)(nil), // 85: xatu.ServerMeta.Geo + (*ServerMeta_Client)(nil), // 86: xatu.ServerMeta.Client + (*ServerMeta_Peer)(nil), // 87: xatu.ServerMeta.Peer + (*ServerMeta_AdditionalBeaconP2PAttestationData)(nil), // 88: xatu.ServerMeta.AdditionalBeaconP2PAttestationData + (*ServerMeta_AdditionalLibp2PTraceConnectedData)(nil), // 89: xatu.ServerMeta.AdditionalLibp2PTraceConnectedData + (*ServerMeta_AdditionalLibp2PTraceDisconnectedData)(nil), // 90: xatu.ServerMeta.AdditionalLibp2PTraceDisconnectedData + (*timestamppb.Timestamp)(nil), // 91: google.protobuf.Timestamp + (*wrapperspb.UInt64Value)(nil), // 92: google.protobuf.UInt64Value + (*v1.ForkChoice)(nil), // 93: xatu.eth.v1.ForkChoice + (*v1.EventChainReorg)(nil), // 94: xatu.eth.v1.EventChainReorg + (*v1.ForkChoiceV2)(nil), // 95: xatu.eth.v1.ForkChoiceV2 + (*v1.EventChainReorgV2)(nil), // 96: xatu.eth.v1.EventChainReorgV2 + (*v1.Attestation)(nil), // 97: xatu.eth.v1.Attestation + (*v1.EventBlock)(nil), // 98: xatu.eth.v1.EventBlock + (*v1.EventFinalizedCheckpoint)(nil), // 99: xatu.eth.v1.EventFinalizedCheckpoint + (*v1.EventHead)(nil), // 100: xatu.eth.v1.EventHead + (*v1.EventVoluntaryExit)(nil), // 101: xatu.eth.v1.EventVoluntaryExit + (*v1.EventContributionAndProof)(nil), // 102: xatu.eth.v1.EventContributionAndProof + (*v2.EventBlock)(nil), // 103: xatu.eth.v2.EventBlock + (*v1.Committee)(nil), // 104: xatu.eth.v1.Committee + (*v1.AttestationDataV2)(nil), // 105: xatu.eth.v1.AttestationDataV2 + (*v1.AttestationV2)(nil), // 106: xatu.eth.v1.AttestationV2 + (*v1.EventBlockV2)(nil), // 107: xatu.eth.v1.EventBlockV2 + (*v1.EventFinalizedCheckpointV2)(nil), // 108: xatu.eth.v1.EventFinalizedCheckpointV2 + (*v1.EventHeadV2)(nil), // 109: xatu.eth.v1.EventHeadV2 + (*v1.EventVoluntaryExitV2)(nil), // 110: xatu.eth.v1.EventVoluntaryExitV2 + (*v1.EventContributionAndProofV2)(nil), // 111: xatu.eth.v1.EventContributionAndProofV2 + (*v2.EventBlockV2)(nil), // 112: xatu.eth.v2.EventBlockV2 + (*v1.AttesterSlashingV2)(nil), // 113: xatu.eth.v1.AttesterSlashingV2 + (*v1.ProposerSlashingV2)(nil), // 114: xatu.eth.v1.ProposerSlashingV2 + (*v1.SignedVoluntaryExitV2)(nil), // 115: xatu.eth.v1.SignedVoluntaryExitV2 + (*v1.DepositV2)(nil), // 116: xatu.eth.v1.DepositV2 + (*v2.SignedBLSToExecutionChangeV2)(nil), // 117: xatu.eth.v2.SignedBLSToExecutionChangeV2 + (*v1.Transaction)(nil), // 118: xatu.eth.v1.Transaction + (*v1.WithdrawalV2)(nil), // 119: xatu.eth.v1.WithdrawalV2 + (*v1.EventBlobSidecar)(nil), // 120: xatu.eth.v1.EventBlobSidecar + (*blockprint.BlockClassification)(nil), // 121: xatu.blockprint.BlockClassification + (*v1.BlobSidecar)(nil), // 122: xatu.eth.v1.BlobSidecar + (*v1.ProposerDuty)(nil), // 123: xatu.eth.v1.ProposerDuty + (*v1.ElaboratedAttestation)(nil), // 124: xatu.eth.v1.ElaboratedAttestation + (*libp2p.AddPeer)(nil), // 125: xatu.libp2p.AddPeer + (*libp2p.RemovePeer)(nil), // 126: xatu.libp2p.RemovePeer + (*libp2p.RecvRPC)(nil), // 127: xatu.libp2p.RecvRPC + (*libp2p.SendRPC)(nil), // 128: xatu.libp2p.SendRPC + (*libp2p.Join)(nil), // 129: xatu.libp2p.Join + (*libp2p.Connected)(nil), // 130: xatu.libp2p.Connected + (*libp2p.Disconnected)(nil), // 131: xatu.libp2p.Disconnected + (*libp2p.HandleMetadata)(nil), // 132: xatu.libp2p.HandleMetadata + (*libp2p.HandleStatus)(nil), // 133: xatu.libp2p.HandleStatus + (*gossipsub.BeaconBlock)(nil), // 134: xatu.libp2p.gossipsub.eth.BeaconBlock + (*wrapperspb.UInt32Value)(nil), // 135: google.protobuf.UInt32Value + (*libp2p.Peer)(nil), // 136: xatu.libp2p.Peer + (*wrapperspb.BoolValue)(nil), // 137: google.protobuf.BoolValue + (*libp2p.TraceEventMetadata)(nil), // 138: xatu.libp2p.TraceEventMetadata + (*wrapperspb.StringValue)(nil), // 139: google.protobuf.StringValue } var file_pkg_proto_xatu_event_ingester_proto_depIdxs = []int32{ 19, // 0: xatu.CreateEventsRequest.events:type_name -> xatu.DecoratedEvent - 88, // 1: xatu.Epoch.start_date_time:type_name -> google.protobuf.Timestamp - 89, // 2: xatu.EpochV2.number:type_name -> google.protobuf.UInt64Value - 88, // 3: xatu.EpochV2.start_date_time:type_name -> google.protobuf.Timestamp - 88, // 4: xatu.Slot.start_date_time:type_name -> google.protobuf.Timestamp - 89, // 5: xatu.SlotV2.number:type_name -> google.protobuf.UInt64Value - 88, // 6: xatu.SlotV2.start_date_time:type_name -> google.protobuf.Timestamp - 89, // 7: xatu.PropagationV2.slot_start_diff:type_name -> google.protobuf.UInt64Value - 89, // 8: xatu.AttestingValidatorV2.committee_index:type_name -> google.protobuf.UInt64Value - 89, // 9: xatu.AttestingValidatorV2.index:type_name -> google.protobuf.UInt64Value - 90, // 10: xatu.DebugForkChoiceReorg.before:type_name -> xatu.eth.v1.ForkChoice - 90, // 11: xatu.DebugForkChoiceReorg.after:type_name -> xatu.eth.v1.ForkChoice - 91, // 12: xatu.DebugForkChoiceReorg.event:type_name -> xatu.eth.v1.EventChainReorg - 92, // 13: xatu.DebugForkChoiceReorgV2.before:type_name -> xatu.eth.v1.ForkChoiceV2 - 92, // 14: xatu.DebugForkChoiceReorgV2.after:type_name -> xatu.eth.v1.ForkChoiceV2 - 93, // 15: xatu.DebugForkChoiceReorgV2.event:type_name -> xatu.eth.v1.EventChainReorgV2 + 91, // 1: xatu.Epoch.start_date_time:type_name -> google.protobuf.Timestamp + 92, // 2: xatu.EpochV2.number:type_name -> google.protobuf.UInt64Value + 91, // 3: xatu.EpochV2.start_date_time:type_name -> google.protobuf.Timestamp + 91, // 4: xatu.Slot.start_date_time:type_name -> google.protobuf.Timestamp + 92, // 5: xatu.SlotV2.number:type_name -> google.protobuf.UInt64Value + 91, // 6: xatu.SlotV2.start_date_time:type_name -> google.protobuf.Timestamp + 92, // 7: xatu.PropagationV2.slot_start_diff:type_name -> google.protobuf.UInt64Value + 92, // 8: xatu.AttestingValidatorV2.committee_index:type_name -> google.protobuf.UInt64Value + 92, // 9: xatu.AttestingValidatorV2.index:type_name -> google.protobuf.UInt64Value + 93, // 10: xatu.DebugForkChoiceReorg.before:type_name -> xatu.eth.v1.ForkChoice + 93, // 11: xatu.DebugForkChoiceReorg.after:type_name -> xatu.eth.v1.ForkChoice + 94, // 12: xatu.DebugForkChoiceReorg.event:type_name -> xatu.eth.v1.EventChainReorg + 95, // 13: xatu.DebugForkChoiceReorgV2.before:type_name -> xatu.eth.v1.ForkChoiceV2 + 95, // 14: xatu.DebugForkChoiceReorgV2.after:type_name -> xatu.eth.v1.ForkChoiceV2 + 96, // 15: xatu.DebugForkChoiceReorgV2.event:type_name -> xatu.eth.v1.EventChainReorgV2 4, // 16: xatu.BlockIdentifier.epoch:type_name -> xatu.EpochV2 6, // 17: xatu.BlockIdentifier.slot:type_name -> xatu.SlotV2 20, // 18: xatu.ClientMeta.ethereum:type_name -> xatu.ClientMeta.Ethereum @@ -9282,214 +9647,230 @@ var file_pkg_proto_xatu_event_ingester_proto_depIdxs = []int32{ 75, // 64: xatu.ClientMeta.libp2p_trace_handle_metadata:type_name -> xatu.ClientMeta.AdditionalLibP2PTraceHandleMetadataData 76, // 65: xatu.ClientMeta.libp2p_trace_handle_status:type_name -> xatu.ClientMeta.AdditionalLibP2PTraceHandleStatusData 77, // 66: xatu.ClientMeta.libp2p_trace_gossipsub_beacon_block:type_name -> xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData - 81, // 67: xatu.ServerMeta.event:type_name -> xatu.ServerMeta.Event - 83, // 68: xatu.ServerMeta.client:type_name -> xatu.ServerMeta.Client - 85, // 69: xatu.ServerMeta.BEACON_P2P_ATTESTATION:type_name -> xatu.ServerMeta.AdditionalBeaconP2PAttestationData - 86, // 70: xatu.ServerMeta.LIBP2P_TRACE_CONNECTED:type_name -> xatu.ServerMeta.AdditionalLibp2PTraceConnectedData - 87, // 71: xatu.ServerMeta.LIBP2P_TRACE_DISCONNECTED:type_name -> xatu.ServerMeta.AdditionalLibp2PTraceDisconnectedData - 15, // 72: xatu.Meta.client:type_name -> xatu.ClientMeta - 16, // 73: xatu.Meta.server:type_name -> xatu.ServerMeta - 0, // 74: xatu.Event.name:type_name -> xatu.Event.Name - 88, // 75: xatu.Event.date_time:type_name -> google.protobuf.Timestamp - 18, // 76: xatu.DecoratedEvent.event:type_name -> xatu.Event - 17, // 77: xatu.DecoratedEvent.meta:type_name -> xatu.Meta - 94, // 78: xatu.DecoratedEvent.eth_v1_events_attestation:type_name -> xatu.eth.v1.Attestation - 95, // 79: xatu.DecoratedEvent.eth_v1_events_block:type_name -> xatu.eth.v1.EventBlock - 91, // 80: xatu.DecoratedEvent.eth_v1_events_chain_reorg:type_name -> xatu.eth.v1.EventChainReorg - 96, // 81: xatu.DecoratedEvent.eth_v1_events_finalized_checkpoint:type_name -> xatu.eth.v1.EventFinalizedCheckpoint - 97, // 82: xatu.DecoratedEvent.eth_v1_events_head:type_name -> xatu.eth.v1.EventHead - 98, // 83: xatu.DecoratedEvent.eth_v1_events_voluntary_exit:type_name -> xatu.eth.v1.EventVoluntaryExit - 99, // 84: xatu.DecoratedEvent.eth_v1_events_contribution_and_proof:type_name -> xatu.eth.v1.EventContributionAndProof - 100, // 85: xatu.DecoratedEvent.eth_v2_beacon_block:type_name -> xatu.eth.v2.EventBlock - 90, // 86: xatu.DecoratedEvent.eth_v1_fork_choice:type_name -> xatu.eth.v1.ForkChoice - 12, // 87: xatu.DecoratedEvent.eth_v1_fork_choice_reorg:type_name -> xatu.DebugForkChoiceReorg - 101, // 88: xatu.DecoratedEvent.eth_v1_beacon_committee:type_name -> xatu.eth.v1.Committee - 102, // 89: xatu.DecoratedEvent.eth_v1_validator_attestation_data:type_name -> xatu.eth.v1.AttestationDataV2 - 103, // 90: xatu.DecoratedEvent.eth_v1_events_attestation_v2:type_name -> xatu.eth.v1.AttestationV2 - 104, // 91: xatu.DecoratedEvent.eth_v1_events_block_v2:type_name -> xatu.eth.v1.EventBlockV2 - 93, // 92: xatu.DecoratedEvent.eth_v1_events_chain_reorg_v2:type_name -> xatu.eth.v1.EventChainReorgV2 - 105, // 93: xatu.DecoratedEvent.eth_v1_events_finalized_checkpoint_v2:type_name -> xatu.eth.v1.EventFinalizedCheckpointV2 - 106, // 94: xatu.DecoratedEvent.eth_v1_events_head_v2:type_name -> xatu.eth.v1.EventHeadV2 - 107, // 95: xatu.DecoratedEvent.eth_v1_events_voluntary_exit_v2:type_name -> xatu.eth.v1.EventVoluntaryExitV2 - 108, // 96: xatu.DecoratedEvent.eth_v1_events_contribution_and_proof_v2:type_name -> xatu.eth.v1.EventContributionAndProofV2 - 109, // 97: xatu.DecoratedEvent.eth_v2_beacon_block_v2:type_name -> xatu.eth.v2.EventBlockV2 - 92, // 98: xatu.DecoratedEvent.eth_v1_fork_choice_v2:type_name -> xatu.eth.v1.ForkChoiceV2 - 13, // 99: xatu.DecoratedEvent.eth_v1_fork_choice_reorg_v2:type_name -> xatu.DebugForkChoiceReorgV2 - 110, // 100: xatu.DecoratedEvent.eth_v2_beacon_block_attester_slashing:type_name -> xatu.eth.v1.AttesterSlashingV2 - 111, // 101: xatu.DecoratedEvent.eth_v2_beacon_block_proposer_slashing:type_name -> xatu.eth.v1.ProposerSlashingV2 - 112, // 102: xatu.DecoratedEvent.eth_v2_beacon_block_voluntary_exit:type_name -> xatu.eth.v1.SignedVoluntaryExitV2 - 113, // 103: xatu.DecoratedEvent.eth_v2_beacon_block_deposit:type_name -> xatu.eth.v1.DepositV2 - 114, // 104: xatu.DecoratedEvent.eth_v2_beacon_block_bls_to_execution_change:type_name -> xatu.eth.v2.SignedBLSToExecutionChangeV2 - 115, // 105: xatu.DecoratedEvent.eth_v2_beacon_block_execution_transaction:type_name -> xatu.eth.v1.Transaction - 116, // 106: xatu.DecoratedEvent.eth_v2_beacon_block_withdrawal:type_name -> xatu.eth.v1.WithdrawalV2 - 117, // 107: xatu.DecoratedEvent.eth_v1_events_blob_sidecar:type_name -> xatu.eth.v1.EventBlobSidecar - 118, // 108: xatu.DecoratedEvent.blockprint_block_classification:type_name -> xatu.blockprint.BlockClassification - 119, // 109: xatu.DecoratedEvent.eth_v1_beacon_block_blob_sidecar:type_name -> xatu.eth.v1.BlobSidecar - 103, // 110: xatu.DecoratedEvent.beacon_p2p_attestation:type_name -> xatu.eth.v1.AttestationV2 - 120, // 111: xatu.DecoratedEvent.eth_v1_proposer_duty:type_name -> xatu.eth.v1.ProposerDuty - 121, // 112: xatu.DecoratedEvent.eth_v2_beacon_block_elaborated_attestation:type_name -> xatu.eth.v1.ElaboratedAttestation - 122, // 113: xatu.DecoratedEvent.libp2p_trace_add_peer:type_name -> xatu.libp2p.AddPeer - 123, // 114: xatu.DecoratedEvent.libp2p_trace_remove_peer:type_name -> xatu.libp2p.RemovePeer - 124, // 115: xatu.DecoratedEvent.libp2p_trace_recv_rpc:type_name -> xatu.libp2p.RecvRPC - 125, // 116: xatu.DecoratedEvent.libp2p_trace_send_rpc:type_name -> xatu.libp2p.SendRPC - 126, // 117: xatu.DecoratedEvent.libp2p_trace_join:type_name -> xatu.libp2p.Join - 127, // 118: xatu.DecoratedEvent.libp2p_trace_connected:type_name -> xatu.libp2p.Connected - 128, // 119: xatu.DecoratedEvent.libp2p_trace_disconnected:type_name -> xatu.libp2p.Disconnected - 129, // 120: xatu.DecoratedEvent.libp2p_trace_handle_metadata:type_name -> xatu.libp2p.HandleMetadata - 130, // 121: xatu.DecoratedEvent.libp2p_trace_handle_status:type_name -> xatu.libp2p.HandleStatus - 131, // 122: xatu.DecoratedEvent.libp2p_trace_gossipsub_beacon_block:type_name -> xatu.libp2p.gossipsub.eth.BeaconBlock - 78, // 123: xatu.ClientMeta.Ethereum.network:type_name -> xatu.ClientMeta.Ethereum.Network - 79, // 124: xatu.ClientMeta.Ethereum.execution:type_name -> xatu.ClientMeta.Ethereum.Execution - 80, // 125: xatu.ClientMeta.Ethereum.consensus:type_name -> xatu.ClientMeta.Ethereum.Consensus - 3, // 126: xatu.ClientMeta.AdditionalEthV1AttestationSourceData.epoch:type_name -> xatu.Epoch - 4, // 127: xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data.epoch:type_name -> xatu.EpochV2 - 3, // 128: xatu.ClientMeta.AdditionalEthV1AttestationTargetData.epoch:type_name -> xatu.Epoch - 4, // 129: xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data.epoch:type_name -> xatu.EpochV2 - 22, // 130: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceData - 24, // 131: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetData - 5, // 132: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.slot:type_name -> xatu.Slot - 3, // 133: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.epoch:type_name -> xatu.Epoch - 8, // 134: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.propagation:type_name -> xatu.Propagation - 10, // 135: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.attesting_validator:type_name -> xatu.AttestingValidator - 23, // 136: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data - 25, // 137: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data - 6, // 138: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.slot:type_name -> xatu.SlotV2 - 4, // 139: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.epoch:type_name -> xatu.EpochV2 - 9, // 140: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.propagation:type_name -> xatu.PropagationV2 - 11, // 141: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.attesting_validator:type_name -> xatu.AttestingValidatorV2 - 3, // 142: xatu.ClientMeta.AdditionalEthV1EventsHeadData.epoch:type_name -> xatu.Epoch - 5, // 143: xatu.ClientMeta.AdditionalEthV1EventsHeadData.slot:type_name -> xatu.Slot - 8, // 144: xatu.ClientMeta.AdditionalEthV1EventsHeadData.propagation:type_name -> xatu.Propagation - 4, // 145: xatu.ClientMeta.AdditionalEthV1EventsHeadV2Data.epoch:type_name -> xatu.EpochV2 - 6, // 146: xatu.ClientMeta.AdditionalEthV1EventsHeadV2Data.slot:type_name -> xatu.SlotV2 - 9, // 147: xatu.ClientMeta.AdditionalEthV1EventsHeadV2Data.propagation:type_name -> xatu.PropagationV2 - 3, // 148: xatu.ClientMeta.AdditionalEthV1EventsBlockData.epoch:type_name -> xatu.Epoch - 5, // 149: xatu.ClientMeta.AdditionalEthV1EventsBlockData.slot:type_name -> xatu.Slot - 8, // 150: xatu.ClientMeta.AdditionalEthV1EventsBlockData.propagation:type_name -> xatu.Propagation - 4, // 151: xatu.ClientMeta.AdditionalEthV1EventsBlockV2Data.epoch:type_name -> xatu.EpochV2 - 6, // 152: xatu.ClientMeta.AdditionalEthV1EventsBlockV2Data.slot:type_name -> xatu.SlotV2 - 9, // 153: xatu.ClientMeta.AdditionalEthV1EventsBlockV2Data.propagation:type_name -> xatu.PropagationV2 - 3, // 154: xatu.ClientMeta.AdditionalEthV1EventsVoluntaryExitData.epoch:type_name -> xatu.Epoch - 4, // 155: xatu.ClientMeta.AdditionalEthV1EventsVoluntaryExitV2Data.epoch:type_name -> xatu.EpochV2 - 3, // 156: xatu.ClientMeta.AdditionalEthV1EventsFinalizedCheckpointData.epoch:type_name -> xatu.Epoch - 4, // 157: xatu.ClientMeta.AdditionalEthV1EventsFinalizedCheckpointV2Data.epoch:type_name -> xatu.EpochV2 - 3, // 158: xatu.ClientMeta.AdditionalEthV1EventsChainReorgData.epoch:type_name -> xatu.Epoch - 5, // 159: xatu.ClientMeta.AdditionalEthV1EventsChainReorgData.slot:type_name -> xatu.Slot - 8, // 160: xatu.ClientMeta.AdditionalEthV1EventsChainReorgData.propagation:type_name -> xatu.Propagation - 4, // 161: xatu.ClientMeta.AdditionalEthV1EventsChainReorgV2Data.epoch:type_name -> xatu.EpochV2 - 6, // 162: xatu.ClientMeta.AdditionalEthV1EventsChainReorgV2Data.slot:type_name -> xatu.SlotV2 - 9, // 163: xatu.ClientMeta.AdditionalEthV1EventsChainReorgV2Data.propagation:type_name -> xatu.PropagationV2 - 3, // 164: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionData.epoch:type_name -> xatu.Epoch - 5, // 165: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionData.slot:type_name -> xatu.Slot - 8, // 166: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionData.propagation:type_name -> xatu.Propagation - 4, // 167: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionV2Data.epoch:type_name -> xatu.EpochV2 - 6, // 168: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionV2Data.slot:type_name -> xatu.SlotV2 - 9, // 169: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionV2Data.propagation:type_name -> xatu.PropagationV2 - 38, // 170: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofData.contribution:type_name -> xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionData - 39, // 171: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofV2Data.contribution:type_name -> xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionV2Data - 3, // 172: xatu.ClientMeta.ForkChoiceSnapshot.request_epoch:type_name -> xatu.Epoch - 5, // 173: xatu.ClientMeta.ForkChoiceSnapshot.request_slot:type_name -> xatu.Slot - 88, // 174: xatu.ClientMeta.ForkChoiceSnapshot.timestamp:type_name -> google.protobuf.Timestamp - 4, // 175: xatu.ClientMeta.ForkChoiceSnapshotV2.request_epoch:type_name -> xatu.EpochV2 - 6, // 176: xatu.ClientMeta.ForkChoiceSnapshotV2.request_slot:type_name -> xatu.SlotV2 - 89, // 177: xatu.ClientMeta.ForkChoiceSnapshotV2.requested_at_slot_start_diff_ms:type_name -> google.protobuf.UInt64Value - 89, // 178: xatu.ClientMeta.ForkChoiceSnapshotV2.request_duration_ms:type_name -> google.protobuf.UInt64Value - 88, // 179: xatu.ClientMeta.ForkChoiceSnapshotV2.timestamp:type_name -> google.protobuf.Timestamp - 42, // 180: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceData.Snapshot:type_name -> xatu.ClientMeta.ForkChoiceSnapshot - 43, // 181: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceV2Data.Snapshot:type_name -> xatu.ClientMeta.ForkChoiceSnapshotV2 - 42, // 182: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceReOrgData.before:type_name -> xatu.ClientMeta.ForkChoiceSnapshot - 42, // 183: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceReOrgData.after:type_name -> xatu.ClientMeta.ForkChoiceSnapshot - 43, // 184: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceReOrgV2Data.before:type_name -> xatu.ClientMeta.ForkChoiceSnapshotV2 - 43, // 185: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceReOrgV2Data.after:type_name -> xatu.ClientMeta.ForkChoiceSnapshotV2 - 4, // 186: xatu.ClientMeta.AdditionalEthV1BeaconCommitteeData.epoch:type_name -> xatu.EpochV2 - 6, // 187: xatu.ClientMeta.AdditionalEthV1BeaconCommitteeData.slot:type_name -> xatu.SlotV2 - 89, // 188: xatu.ClientMeta.AdditionalMempoolTransactionV2Data.nonce:type_name -> google.protobuf.UInt64Value - 89, // 189: xatu.ClientMeta.AdditionalMempoolTransactionV2Data.gas:type_name -> google.protobuf.UInt64Value - 132, // 190: xatu.ClientMeta.AdditionalMempoolTransactionV2Data.type:type_name -> google.protobuf.UInt32Value - 89, // 191: xatu.ClientMeta.AdditionalMempoolTransactionV2Data.blob_gas:type_name -> google.protobuf.UInt64Value - 3, // 192: xatu.ClientMeta.AdditionalEthV2BeaconBlockData.epoch:type_name -> xatu.Epoch - 5, // 193: xatu.ClientMeta.AdditionalEthV2BeaconBlockData.slot:type_name -> xatu.Slot - 4, // 194: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.epoch:type_name -> xatu.EpochV2 - 6, // 195: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.slot:type_name -> xatu.SlotV2 - 89, // 196: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.transactions_count:type_name -> google.protobuf.UInt64Value - 89, // 197: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.transactions_total_bytes:type_name -> google.protobuf.UInt64Value - 89, // 198: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.transactions_total_bytes_compressed:type_name -> google.protobuf.UInt64Value - 89, // 199: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.total_bytes:type_name -> google.protobuf.UInt64Value - 89, // 200: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.total_bytes_compressed:type_name -> google.protobuf.UInt64Value - 14, // 201: xatu.ClientMeta.AdditionalEthV2BeaconBlockAttesterSlashingData.block:type_name -> xatu.BlockIdentifier - 14, // 202: xatu.ClientMeta.AdditionalEthV2BeaconBlockProposerSlashingData.block:type_name -> xatu.BlockIdentifier - 14, // 203: xatu.ClientMeta.AdditionalEthV2BeaconBlockVoluntaryExitData.block:type_name -> xatu.BlockIdentifier - 14, // 204: xatu.ClientMeta.AdditionalEthV2BeaconBlockDepositData.block:type_name -> xatu.BlockIdentifier - 14, // 205: xatu.ClientMeta.AdditionalEthV2BeaconBlockBLSToExecutionChangeData.block:type_name -> xatu.BlockIdentifier - 14, // 206: xatu.ClientMeta.AdditionalEthV2BeaconBlockExecutionTransactionData.block:type_name -> xatu.BlockIdentifier - 89, // 207: xatu.ClientMeta.AdditionalEthV2BeaconBlockExecutionTransactionData.position_in_block:type_name -> google.protobuf.UInt64Value - 14, // 208: xatu.ClientMeta.AdditionalEthV2BeaconBlockWithdrawalData.block:type_name -> xatu.BlockIdentifier - 4, // 209: xatu.ClientMeta.AdditionalBlockprintBlockClassificationData.epoch:type_name -> xatu.EpochV2 - 6, // 210: xatu.ClientMeta.AdditionalBlockprintBlockClassificationData.slot:type_name -> xatu.SlotV2 - 89, // 211: xatu.ClientMeta.AttestationDataSnapshot.requested_at_slot_start_diff_ms:type_name -> google.protobuf.UInt64Value - 89, // 212: xatu.ClientMeta.AttestationDataSnapshot.request_duration_ms:type_name -> google.protobuf.UInt64Value - 88, // 213: xatu.ClientMeta.AttestationDataSnapshot.timestamp:type_name -> google.protobuf.Timestamp - 23, // 214: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data - 25, // 215: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data - 4, // 216: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.epoch:type_name -> xatu.EpochV2 - 6, // 217: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.slot:type_name -> xatu.SlotV2 - 61, // 218: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.Snapshot:type_name -> xatu.ClientMeta.AttestationDataSnapshot - 4, // 219: xatu.ClientMeta.AdditionalEthV1EventsBlobSidecarData.epoch:type_name -> xatu.EpochV2 - 6, // 220: xatu.ClientMeta.AdditionalEthV1EventsBlobSidecarData.slot:type_name -> xatu.SlotV2 - 9, // 221: xatu.ClientMeta.AdditionalEthV1EventsBlobSidecarData.propagation:type_name -> xatu.PropagationV2 - 4, // 222: xatu.ClientMeta.AdditionalEthV1BeaconBlobSidecarData.epoch:type_name -> xatu.EpochV2 - 6, // 223: xatu.ClientMeta.AdditionalEthV1BeaconBlobSidecarData.slot:type_name -> xatu.SlotV2 - 89, // 224: xatu.ClientMeta.AdditionalEthV1BeaconBlobSidecarData.data_size:type_name -> google.protobuf.UInt64Value - 89, // 225: xatu.ClientMeta.AdditionalEthV1BeaconBlobSidecarData.data_empty_size:type_name -> google.protobuf.UInt64Value - 23, // 226: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data - 25, // 227: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data - 6, // 228: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.slot:type_name -> xatu.SlotV2 - 4, // 229: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.epoch:type_name -> xatu.EpochV2 - 9, // 230: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.propagation:type_name -> xatu.PropagationV2 - 11, // 231: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.attesting_validator:type_name -> xatu.AttestingValidatorV2 - 133, // 232: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.peer:type_name -> xatu.libp2p.Peer - 132, // 233: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.subnet:type_name -> google.protobuf.UInt32Value - 134, // 234: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.validated:type_name -> google.protobuf.BoolValue - 4, // 235: xatu.ClientMeta.AdditionalEthV1ProposerDutyData.epoch:type_name -> xatu.EpochV2 - 6, // 236: xatu.ClientMeta.AdditionalEthV1ProposerDutyData.slot:type_name -> xatu.SlotV2 - 14, // 237: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.block:type_name -> xatu.BlockIdentifier - 89, // 238: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.position_in_block:type_name -> google.protobuf.UInt64Value - 4, // 239: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.epoch:type_name -> xatu.EpochV2 - 6, // 240: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.slot:type_name -> xatu.SlotV2 - 23, // 241: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data - 25, // 242: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data - 135, // 243: xatu.ClientMeta.AdditionalLibP2PTraceAddPeerData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 135, // 244: xatu.ClientMeta.AdditionalLibP2PTraceRemovePeerData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 135, // 245: xatu.ClientMeta.AdditionalLibP2PTraceRecvRPCData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 135, // 246: xatu.ClientMeta.AdditionalLibP2PTraceSendRPCData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 135, // 247: xatu.ClientMeta.AdditionalLibP2PTraceJoinData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 135, // 248: xatu.ClientMeta.AdditionalLibP2PTraceConnectedData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 135, // 249: xatu.ClientMeta.AdditionalLibP2PTraceDisconnectedData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 135, // 250: xatu.ClientMeta.AdditionalLibP2PTraceHandleMetadataData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 135, // 251: xatu.ClientMeta.AdditionalLibP2PTraceHandleStatusData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 4, // 252: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.epoch:type_name -> xatu.EpochV2 - 6, // 253: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.slot:type_name -> xatu.SlotV2 - 4, // 254: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.wallclock_epoch:type_name -> xatu.EpochV2 - 6, // 255: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.wallclock_slot:type_name -> xatu.SlotV2 - 9, // 256: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.propagation:type_name -> xatu.PropagationV2 - 135, // 257: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.metadata:type_name -> xatu.libp2p.TraceEventMetadata - 136, // 258: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.topic:type_name -> google.protobuf.StringValue - 132, // 259: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.message_size:type_name -> google.protobuf.UInt32Value - 136, // 260: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.message_id:type_name -> google.protobuf.StringValue - 7, // 261: xatu.ClientMeta.Ethereum.Execution.fork_id:type_name -> xatu.ForkID - 88, // 262: xatu.ServerMeta.Event.received_date_time:type_name -> google.protobuf.Timestamp - 82, // 263: xatu.ServerMeta.Client.geo:type_name -> xatu.ServerMeta.Geo - 82, // 264: xatu.ServerMeta.Peer.geo:type_name -> xatu.ServerMeta.Geo - 84, // 265: xatu.ServerMeta.AdditionalBeaconP2PAttestationData.peer:type_name -> xatu.ServerMeta.Peer - 84, // 266: xatu.ServerMeta.AdditionalLibp2PTraceConnectedData.peer:type_name -> xatu.ServerMeta.Peer - 84, // 267: xatu.ServerMeta.AdditionalLibp2PTraceDisconnectedData.peer:type_name -> xatu.ServerMeta.Peer - 1, // 268: xatu.EventIngester.CreateEvents:input_type -> xatu.CreateEventsRequest - 2, // 269: xatu.EventIngester.CreateEvents:output_type -> xatu.CreateEventsResponse - 269, // [269:270] is the sub-list for method output_type - 268, // [268:269] is the sub-list for method input_type - 268, // [268:268] is the sub-list for extension type_name - 268, // [268:268] is the sub-list for extension extendee - 0, // [0:268] is the sub-list for field type_name + 80, // 67: xatu.ClientMeta.libp2p_trace_gossipsub_beacon_attestation:type_name -> xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData + 84, // 68: xatu.ServerMeta.event:type_name -> xatu.ServerMeta.Event + 86, // 69: xatu.ServerMeta.client:type_name -> xatu.ServerMeta.Client + 88, // 70: xatu.ServerMeta.BEACON_P2P_ATTESTATION:type_name -> xatu.ServerMeta.AdditionalBeaconP2PAttestationData + 89, // 71: xatu.ServerMeta.LIBP2P_TRACE_CONNECTED:type_name -> xatu.ServerMeta.AdditionalLibp2PTraceConnectedData + 90, // 72: xatu.ServerMeta.LIBP2P_TRACE_DISCONNECTED:type_name -> xatu.ServerMeta.AdditionalLibp2PTraceDisconnectedData + 15, // 73: xatu.Meta.client:type_name -> xatu.ClientMeta + 16, // 74: xatu.Meta.server:type_name -> xatu.ServerMeta + 0, // 75: xatu.Event.name:type_name -> xatu.Event.Name + 91, // 76: xatu.Event.date_time:type_name -> google.protobuf.Timestamp + 18, // 77: xatu.DecoratedEvent.event:type_name -> xatu.Event + 17, // 78: xatu.DecoratedEvent.meta:type_name -> xatu.Meta + 97, // 79: xatu.DecoratedEvent.eth_v1_events_attestation:type_name -> xatu.eth.v1.Attestation + 98, // 80: xatu.DecoratedEvent.eth_v1_events_block:type_name -> xatu.eth.v1.EventBlock + 94, // 81: xatu.DecoratedEvent.eth_v1_events_chain_reorg:type_name -> xatu.eth.v1.EventChainReorg + 99, // 82: xatu.DecoratedEvent.eth_v1_events_finalized_checkpoint:type_name -> xatu.eth.v1.EventFinalizedCheckpoint + 100, // 83: xatu.DecoratedEvent.eth_v1_events_head:type_name -> xatu.eth.v1.EventHead + 101, // 84: xatu.DecoratedEvent.eth_v1_events_voluntary_exit:type_name -> xatu.eth.v1.EventVoluntaryExit + 102, // 85: xatu.DecoratedEvent.eth_v1_events_contribution_and_proof:type_name -> xatu.eth.v1.EventContributionAndProof + 103, // 86: xatu.DecoratedEvent.eth_v2_beacon_block:type_name -> xatu.eth.v2.EventBlock + 93, // 87: xatu.DecoratedEvent.eth_v1_fork_choice:type_name -> xatu.eth.v1.ForkChoice + 12, // 88: xatu.DecoratedEvent.eth_v1_fork_choice_reorg:type_name -> xatu.DebugForkChoiceReorg + 104, // 89: xatu.DecoratedEvent.eth_v1_beacon_committee:type_name -> xatu.eth.v1.Committee + 105, // 90: xatu.DecoratedEvent.eth_v1_validator_attestation_data:type_name -> xatu.eth.v1.AttestationDataV2 + 106, // 91: xatu.DecoratedEvent.eth_v1_events_attestation_v2:type_name -> xatu.eth.v1.AttestationV2 + 107, // 92: xatu.DecoratedEvent.eth_v1_events_block_v2:type_name -> xatu.eth.v1.EventBlockV2 + 96, // 93: xatu.DecoratedEvent.eth_v1_events_chain_reorg_v2:type_name -> xatu.eth.v1.EventChainReorgV2 + 108, // 94: xatu.DecoratedEvent.eth_v1_events_finalized_checkpoint_v2:type_name -> xatu.eth.v1.EventFinalizedCheckpointV2 + 109, // 95: xatu.DecoratedEvent.eth_v1_events_head_v2:type_name -> xatu.eth.v1.EventHeadV2 + 110, // 96: xatu.DecoratedEvent.eth_v1_events_voluntary_exit_v2:type_name -> xatu.eth.v1.EventVoluntaryExitV2 + 111, // 97: xatu.DecoratedEvent.eth_v1_events_contribution_and_proof_v2:type_name -> xatu.eth.v1.EventContributionAndProofV2 + 112, // 98: xatu.DecoratedEvent.eth_v2_beacon_block_v2:type_name -> xatu.eth.v2.EventBlockV2 + 95, // 99: xatu.DecoratedEvent.eth_v1_fork_choice_v2:type_name -> xatu.eth.v1.ForkChoiceV2 + 13, // 100: xatu.DecoratedEvent.eth_v1_fork_choice_reorg_v2:type_name -> xatu.DebugForkChoiceReorgV2 + 113, // 101: xatu.DecoratedEvent.eth_v2_beacon_block_attester_slashing:type_name -> xatu.eth.v1.AttesterSlashingV2 + 114, // 102: xatu.DecoratedEvent.eth_v2_beacon_block_proposer_slashing:type_name -> xatu.eth.v1.ProposerSlashingV2 + 115, // 103: xatu.DecoratedEvent.eth_v2_beacon_block_voluntary_exit:type_name -> xatu.eth.v1.SignedVoluntaryExitV2 + 116, // 104: xatu.DecoratedEvent.eth_v2_beacon_block_deposit:type_name -> xatu.eth.v1.DepositV2 + 117, // 105: xatu.DecoratedEvent.eth_v2_beacon_block_bls_to_execution_change:type_name -> xatu.eth.v2.SignedBLSToExecutionChangeV2 + 118, // 106: xatu.DecoratedEvent.eth_v2_beacon_block_execution_transaction:type_name -> xatu.eth.v1.Transaction + 119, // 107: xatu.DecoratedEvent.eth_v2_beacon_block_withdrawal:type_name -> xatu.eth.v1.WithdrawalV2 + 120, // 108: xatu.DecoratedEvent.eth_v1_events_blob_sidecar:type_name -> xatu.eth.v1.EventBlobSidecar + 121, // 109: xatu.DecoratedEvent.blockprint_block_classification:type_name -> xatu.blockprint.BlockClassification + 122, // 110: xatu.DecoratedEvent.eth_v1_beacon_block_blob_sidecar:type_name -> xatu.eth.v1.BlobSidecar + 106, // 111: xatu.DecoratedEvent.beacon_p2p_attestation:type_name -> xatu.eth.v1.AttestationV2 + 123, // 112: xatu.DecoratedEvent.eth_v1_proposer_duty:type_name -> xatu.eth.v1.ProposerDuty + 124, // 113: xatu.DecoratedEvent.eth_v2_beacon_block_elaborated_attestation:type_name -> xatu.eth.v1.ElaboratedAttestation + 125, // 114: xatu.DecoratedEvent.libp2p_trace_add_peer:type_name -> xatu.libp2p.AddPeer + 126, // 115: xatu.DecoratedEvent.libp2p_trace_remove_peer:type_name -> xatu.libp2p.RemovePeer + 127, // 116: xatu.DecoratedEvent.libp2p_trace_recv_rpc:type_name -> xatu.libp2p.RecvRPC + 128, // 117: xatu.DecoratedEvent.libp2p_trace_send_rpc:type_name -> xatu.libp2p.SendRPC + 129, // 118: xatu.DecoratedEvent.libp2p_trace_join:type_name -> xatu.libp2p.Join + 130, // 119: xatu.DecoratedEvent.libp2p_trace_connected:type_name -> xatu.libp2p.Connected + 131, // 120: xatu.DecoratedEvent.libp2p_trace_disconnected:type_name -> xatu.libp2p.Disconnected + 132, // 121: xatu.DecoratedEvent.libp2p_trace_handle_metadata:type_name -> xatu.libp2p.HandleMetadata + 133, // 122: xatu.DecoratedEvent.libp2p_trace_handle_status:type_name -> xatu.libp2p.HandleStatus + 134, // 123: xatu.DecoratedEvent.libp2p_trace_gossipsub_beacon_block:type_name -> xatu.libp2p.gossipsub.eth.BeaconBlock + 97, // 124: xatu.DecoratedEvent.libp2p_trace_gossipsub_beacon_attestation:type_name -> xatu.eth.v1.Attestation + 81, // 125: xatu.ClientMeta.Ethereum.network:type_name -> xatu.ClientMeta.Ethereum.Network + 82, // 126: xatu.ClientMeta.Ethereum.execution:type_name -> xatu.ClientMeta.Ethereum.Execution + 83, // 127: xatu.ClientMeta.Ethereum.consensus:type_name -> xatu.ClientMeta.Ethereum.Consensus + 3, // 128: xatu.ClientMeta.AdditionalEthV1AttestationSourceData.epoch:type_name -> xatu.Epoch + 4, // 129: xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data.epoch:type_name -> xatu.EpochV2 + 3, // 130: xatu.ClientMeta.AdditionalEthV1AttestationTargetData.epoch:type_name -> xatu.Epoch + 4, // 131: xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data.epoch:type_name -> xatu.EpochV2 + 22, // 132: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceData + 24, // 133: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetData + 5, // 134: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.slot:type_name -> xatu.Slot + 3, // 135: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.epoch:type_name -> xatu.Epoch + 8, // 136: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.propagation:type_name -> xatu.Propagation + 10, // 137: xatu.ClientMeta.AdditionalEthV1EventsAttestationData.attesting_validator:type_name -> xatu.AttestingValidator + 23, // 138: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data + 25, // 139: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data + 6, // 140: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.slot:type_name -> xatu.SlotV2 + 4, // 141: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.epoch:type_name -> xatu.EpochV2 + 9, // 142: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.propagation:type_name -> xatu.PropagationV2 + 11, // 143: xatu.ClientMeta.AdditionalEthV1EventsAttestationV2Data.attesting_validator:type_name -> xatu.AttestingValidatorV2 + 3, // 144: xatu.ClientMeta.AdditionalEthV1EventsHeadData.epoch:type_name -> xatu.Epoch + 5, // 145: xatu.ClientMeta.AdditionalEthV1EventsHeadData.slot:type_name -> xatu.Slot + 8, // 146: xatu.ClientMeta.AdditionalEthV1EventsHeadData.propagation:type_name -> xatu.Propagation + 4, // 147: xatu.ClientMeta.AdditionalEthV1EventsHeadV2Data.epoch:type_name -> xatu.EpochV2 + 6, // 148: xatu.ClientMeta.AdditionalEthV1EventsHeadV2Data.slot:type_name -> xatu.SlotV2 + 9, // 149: xatu.ClientMeta.AdditionalEthV1EventsHeadV2Data.propagation:type_name -> xatu.PropagationV2 + 3, // 150: xatu.ClientMeta.AdditionalEthV1EventsBlockData.epoch:type_name -> xatu.Epoch + 5, // 151: xatu.ClientMeta.AdditionalEthV1EventsBlockData.slot:type_name -> xatu.Slot + 8, // 152: xatu.ClientMeta.AdditionalEthV1EventsBlockData.propagation:type_name -> xatu.Propagation + 4, // 153: xatu.ClientMeta.AdditionalEthV1EventsBlockV2Data.epoch:type_name -> xatu.EpochV2 + 6, // 154: xatu.ClientMeta.AdditionalEthV1EventsBlockV2Data.slot:type_name -> xatu.SlotV2 + 9, // 155: xatu.ClientMeta.AdditionalEthV1EventsBlockV2Data.propagation:type_name -> xatu.PropagationV2 + 3, // 156: xatu.ClientMeta.AdditionalEthV1EventsVoluntaryExitData.epoch:type_name -> xatu.Epoch + 4, // 157: xatu.ClientMeta.AdditionalEthV1EventsVoluntaryExitV2Data.epoch:type_name -> xatu.EpochV2 + 3, // 158: xatu.ClientMeta.AdditionalEthV1EventsFinalizedCheckpointData.epoch:type_name -> xatu.Epoch + 4, // 159: xatu.ClientMeta.AdditionalEthV1EventsFinalizedCheckpointV2Data.epoch:type_name -> xatu.EpochV2 + 3, // 160: xatu.ClientMeta.AdditionalEthV1EventsChainReorgData.epoch:type_name -> xatu.Epoch + 5, // 161: xatu.ClientMeta.AdditionalEthV1EventsChainReorgData.slot:type_name -> xatu.Slot + 8, // 162: xatu.ClientMeta.AdditionalEthV1EventsChainReorgData.propagation:type_name -> xatu.Propagation + 4, // 163: xatu.ClientMeta.AdditionalEthV1EventsChainReorgV2Data.epoch:type_name -> xatu.EpochV2 + 6, // 164: xatu.ClientMeta.AdditionalEthV1EventsChainReorgV2Data.slot:type_name -> xatu.SlotV2 + 9, // 165: xatu.ClientMeta.AdditionalEthV1EventsChainReorgV2Data.propagation:type_name -> xatu.PropagationV2 + 3, // 166: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionData.epoch:type_name -> xatu.Epoch + 5, // 167: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionData.slot:type_name -> xatu.Slot + 8, // 168: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionData.propagation:type_name -> xatu.Propagation + 4, // 169: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionV2Data.epoch:type_name -> xatu.EpochV2 + 6, // 170: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionV2Data.slot:type_name -> xatu.SlotV2 + 9, // 171: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionV2Data.propagation:type_name -> xatu.PropagationV2 + 38, // 172: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofData.contribution:type_name -> xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionData + 39, // 173: xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofV2Data.contribution:type_name -> xatu.ClientMeta.AdditionalEthV1EventsContributionAndProofContributionV2Data + 3, // 174: xatu.ClientMeta.ForkChoiceSnapshot.request_epoch:type_name -> xatu.Epoch + 5, // 175: xatu.ClientMeta.ForkChoiceSnapshot.request_slot:type_name -> xatu.Slot + 91, // 176: xatu.ClientMeta.ForkChoiceSnapshot.timestamp:type_name -> google.protobuf.Timestamp + 4, // 177: xatu.ClientMeta.ForkChoiceSnapshotV2.request_epoch:type_name -> xatu.EpochV2 + 6, // 178: xatu.ClientMeta.ForkChoiceSnapshotV2.request_slot:type_name -> xatu.SlotV2 + 92, // 179: xatu.ClientMeta.ForkChoiceSnapshotV2.requested_at_slot_start_diff_ms:type_name -> google.protobuf.UInt64Value + 92, // 180: xatu.ClientMeta.ForkChoiceSnapshotV2.request_duration_ms:type_name -> google.protobuf.UInt64Value + 91, // 181: xatu.ClientMeta.ForkChoiceSnapshotV2.timestamp:type_name -> google.protobuf.Timestamp + 42, // 182: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceData.Snapshot:type_name -> xatu.ClientMeta.ForkChoiceSnapshot + 43, // 183: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceV2Data.Snapshot:type_name -> xatu.ClientMeta.ForkChoiceSnapshotV2 + 42, // 184: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceReOrgData.before:type_name -> xatu.ClientMeta.ForkChoiceSnapshot + 42, // 185: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceReOrgData.after:type_name -> xatu.ClientMeta.ForkChoiceSnapshot + 43, // 186: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceReOrgV2Data.before:type_name -> xatu.ClientMeta.ForkChoiceSnapshotV2 + 43, // 187: xatu.ClientMeta.AdditionalEthV1DebugForkChoiceReOrgV2Data.after:type_name -> xatu.ClientMeta.ForkChoiceSnapshotV2 + 4, // 188: xatu.ClientMeta.AdditionalEthV1BeaconCommitteeData.epoch:type_name -> xatu.EpochV2 + 6, // 189: xatu.ClientMeta.AdditionalEthV1BeaconCommitteeData.slot:type_name -> xatu.SlotV2 + 92, // 190: xatu.ClientMeta.AdditionalMempoolTransactionV2Data.nonce:type_name -> google.protobuf.UInt64Value + 92, // 191: xatu.ClientMeta.AdditionalMempoolTransactionV2Data.gas:type_name -> google.protobuf.UInt64Value + 135, // 192: xatu.ClientMeta.AdditionalMempoolTransactionV2Data.type:type_name -> google.protobuf.UInt32Value + 92, // 193: xatu.ClientMeta.AdditionalMempoolTransactionV2Data.blob_gas:type_name -> google.protobuf.UInt64Value + 3, // 194: xatu.ClientMeta.AdditionalEthV2BeaconBlockData.epoch:type_name -> xatu.Epoch + 5, // 195: xatu.ClientMeta.AdditionalEthV2BeaconBlockData.slot:type_name -> xatu.Slot + 4, // 196: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.epoch:type_name -> xatu.EpochV2 + 6, // 197: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.slot:type_name -> xatu.SlotV2 + 92, // 198: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.transactions_count:type_name -> google.protobuf.UInt64Value + 92, // 199: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.transactions_total_bytes:type_name -> google.protobuf.UInt64Value + 92, // 200: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.transactions_total_bytes_compressed:type_name -> google.protobuf.UInt64Value + 92, // 201: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.total_bytes:type_name -> google.protobuf.UInt64Value + 92, // 202: xatu.ClientMeta.AdditionalEthV2BeaconBlockV2Data.total_bytes_compressed:type_name -> google.protobuf.UInt64Value + 14, // 203: xatu.ClientMeta.AdditionalEthV2BeaconBlockAttesterSlashingData.block:type_name -> xatu.BlockIdentifier + 14, // 204: xatu.ClientMeta.AdditionalEthV2BeaconBlockProposerSlashingData.block:type_name -> xatu.BlockIdentifier + 14, // 205: xatu.ClientMeta.AdditionalEthV2BeaconBlockVoluntaryExitData.block:type_name -> xatu.BlockIdentifier + 14, // 206: xatu.ClientMeta.AdditionalEthV2BeaconBlockDepositData.block:type_name -> xatu.BlockIdentifier + 14, // 207: xatu.ClientMeta.AdditionalEthV2BeaconBlockBLSToExecutionChangeData.block:type_name -> xatu.BlockIdentifier + 14, // 208: xatu.ClientMeta.AdditionalEthV2BeaconBlockExecutionTransactionData.block:type_name -> xatu.BlockIdentifier + 92, // 209: xatu.ClientMeta.AdditionalEthV2BeaconBlockExecutionTransactionData.position_in_block:type_name -> google.protobuf.UInt64Value + 14, // 210: xatu.ClientMeta.AdditionalEthV2BeaconBlockWithdrawalData.block:type_name -> xatu.BlockIdentifier + 4, // 211: xatu.ClientMeta.AdditionalBlockprintBlockClassificationData.epoch:type_name -> xatu.EpochV2 + 6, // 212: xatu.ClientMeta.AdditionalBlockprintBlockClassificationData.slot:type_name -> xatu.SlotV2 + 92, // 213: xatu.ClientMeta.AttestationDataSnapshot.requested_at_slot_start_diff_ms:type_name -> google.protobuf.UInt64Value + 92, // 214: xatu.ClientMeta.AttestationDataSnapshot.request_duration_ms:type_name -> google.protobuf.UInt64Value + 91, // 215: xatu.ClientMeta.AttestationDataSnapshot.timestamp:type_name -> google.protobuf.Timestamp + 23, // 216: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data + 25, // 217: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data + 4, // 218: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.epoch:type_name -> xatu.EpochV2 + 6, // 219: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.slot:type_name -> xatu.SlotV2 + 61, // 220: xatu.ClientMeta.AdditionalEthV1ValidatorAttestationDataData.Snapshot:type_name -> xatu.ClientMeta.AttestationDataSnapshot + 4, // 221: xatu.ClientMeta.AdditionalEthV1EventsBlobSidecarData.epoch:type_name -> xatu.EpochV2 + 6, // 222: xatu.ClientMeta.AdditionalEthV1EventsBlobSidecarData.slot:type_name -> xatu.SlotV2 + 9, // 223: xatu.ClientMeta.AdditionalEthV1EventsBlobSidecarData.propagation:type_name -> xatu.PropagationV2 + 4, // 224: xatu.ClientMeta.AdditionalEthV1BeaconBlobSidecarData.epoch:type_name -> xatu.EpochV2 + 6, // 225: xatu.ClientMeta.AdditionalEthV1BeaconBlobSidecarData.slot:type_name -> xatu.SlotV2 + 92, // 226: xatu.ClientMeta.AdditionalEthV1BeaconBlobSidecarData.data_size:type_name -> google.protobuf.UInt64Value + 92, // 227: xatu.ClientMeta.AdditionalEthV1BeaconBlobSidecarData.data_empty_size:type_name -> google.protobuf.UInt64Value + 23, // 228: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data + 25, // 229: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data + 6, // 230: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.slot:type_name -> xatu.SlotV2 + 4, // 231: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.epoch:type_name -> xatu.EpochV2 + 9, // 232: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.propagation:type_name -> xatu.PropagationV2 + 11, // 233: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.attesting_validator:type_name -> xatu.AttestingValidatorV2 + 136, // 234: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.peer:type_name -> xatu.libp2p.Peer + 135, // 235: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.subnet:type_name -> google.protobuf.UInt32Value + 137, // 236: xatu.ClientMeta.AdditionalBeaconP2PAttestationData.validated:type_name -> google.protobuf.BoolValue + 4, // 237: xatu.ClientMeta.AdditionalEthV1ProposerDutyData.epoch:type_name -> xatu.EpochV2 + 6, // 238: xatu.ClientMeta.AdditionalEthV1ProposerDutyData.slot:type_name -> xatu.SlotV2 + 14, // 239: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.block:type_name -> xatu.BlockIdentifier + 92, // 240: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.position_in_block:type_name -> google.protobuf.UInt64Value + 4, // 241: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.epoch:type_name -> xatu.EpochV2 + 6, // 242: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.slot:type_name -> xatu.SlotV2 + 23, // 243: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.source:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationSourceV2Data + 25, // 244: xatu.ClientMeta.AdditionalEthV2BeaconBlockElaboratedAttestationData.target:type_name -> xatu.ClientMeta.AdditionalEthV1AttestationTargetV2Data + 138, // 245: xatu.ClientMeta.AdditionalLibP2PTraceAddPeerData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 138, // 246: xatu.ClientMeta.AdditionalLibP2PTraceRemovePeerData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 138, // 247: xatu.ClientMeta.AdditionalLibP2PTraceRecvRPCData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 138, // 248: xatu.ClientMeta.AdditionalLibP2PTraceSendRPCData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 138, // 249: xatu.ClientMeta.AdditionalLibP2PTraceJoinData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 138, // 250: xatu.ClientMeta.AdditionalLibP2PTraceConnectedData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 138, // 251: xatu.ClientMeta.AdditionalLibP2PTraceDisconnectedData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 138, // 252: xatu.ClientMeta.AdditionalLibP2PTraceHandleMetadataData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 138, // 253: xatu.ClientMeta.AdditionalLibP2PTraceHandleStatusData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 4, // 254: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.epoch:type_name -> xatu.EpochV2 + 6, // 255: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.slot:type_name -> xatu.SlotV2 + 4, // 256: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.wallclock_epoch:type_name -> xatu.EpochV2 + 6, // 257: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.wallclock_slot:type_name -> xatu.SlotV2 + 9, // 258: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.propagation:type_name -> xatu.PropagationV2 + 138, // 259: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 139, // 260: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.topic:type_name -> google.protobuf.StringValue + 135, // 261: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.message_size:type_name -> google.protobuf.UInt32Value + 139, // 262: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconBlockData.message_id:type_name -> google.protobuf.StringValue + 4, // 263: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData.epoch:type_name -> xatu.EpochV2 + 4, // 264: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData.epoch:type_name -> xatu.EpochV2 + 78, // 265: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.source:type_name -> xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData + 79, // 266: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.target:type_name -> xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData + 6, // 267: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.slot:type_name -> xatu.SlotV2 + 4, // 268: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.epoch:type_name -> xatu.EpochV2 + 9, // 269: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.propagation:type_name -> xatu.PropagationV2 + 11, // 270: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.attesting_validator:type_name -> xatu.AttestingValidatorV2 + 4, // 271: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.wallclock_epoch:type_name -> xatu.EpochV2 + 6, // 272: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.wallclock_slot:type_name -> xatu.SlotV2 + 138, // 273: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.metadata:type_name -> xatu.libp2p.TraceEventMetadata + 139, // 274: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.topic:type_name -> google.protobuf.StringValue + 135, // 275: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.message_size:type_name -> google.protobuf.UInt32Value + 139, // 276: xatu.ClientMeta.AdditionalLibP2PTraceGossipSubBeaconAttestationData.message_id:type_name -> google.protobuf.StringValue + 7, // 277: xatu.ClientMeta.Ethereum.Execution.fork_id:type_name -> xatu.ForkID + 91, // 278: xatu.ServerMeta.Event.received_date_time:type_name -> google.protobuf.Timestamp + 85, // 279: xatu.ServerMeta.Client.geo:type_name -> xatu.ServerMeta.Geo + 85, // 280: xatu.ServerMeta.Peer.geo:type_name -> xatu.ServerMeta.Geo + 87, // 281: xatu.ServerMeta.AdditionalBeaconP2PAttestationData.peer:type_name -> xatu.ServerMeta.Peer + 87, // 282: xatu.ServerMeta.AdditionalLibp2PTraceConnectedData.peer:type_name -> xatu.ServerMeta.Peer + 87, // 283: xatu.ServerMeta.AdditionalLibp2PTraceDisconnectedData.peer:type_name -> xatu.ServerMeta.Peer + 1, // 284: xatu.EventIngester.CreateEvents:input_type -> xatu.CreateEventsRequest + 2, // 285: xatu.EventIngester.CreateEvents:output_type -> xatu.CreateEventsResponse + 285, // [285:286] is the sub-list for method output_type + 284, // [284:285] is the sub-list for method input_type + 284, // [284:284] is the sub-list for extension type_name + 284, // [284:284] is the sub-list for extension extendee + 0, // [0:284] is the sub-list for field type_name } func init() { file_pkg_proto_xatu_event_ingester_proto_init() } @@ -10411,7 +10792,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientMeta_Ethereum_Network); i { + switch v := v.(*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData); i { case 0: return &v.state case 1: @@ -10423,7 +10804,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientMeta_Ethereum_Execution); i { + switch v := v.(*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData); i { case 0: return &v.state case 1: @@ -10435,7 +10816,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientMeta_Ethereum_Consensus); i { + switch v := v.(*ClientMeta_AdditionalLibP2PTraceGossipSubBeaconAttestationData); i { case 0: return &v.state case 1: @@ -10447,7 +10828,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerMeta_Event); i { + switch v := v.(*ClientMeta_Ethereum_Network); i { case 0: return &v.state case 1: @@ -10459,7 +10840,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerMeta_Geo); i { + switch v := v.(*ClientMeta_Ethereum_Execution); i { case 0: return &v.state case 1: @@ -10471,7 +10852,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerMeta_Client); i { + switch v := v.(*ClientMeta_Ethereum_Consensus); i { case 0: return &v.state case 1: @@ -10483,7 +10864,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerMeta_Peer); i { + switch v := v.(*ServerMeta_Event); i { case 0: return &v.state case 1: @@ -10495,7 +10876,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerMeta_AdditionalBeaconP2PAttestationData); i { + switch v := v.(*ServerMeta_Geo); i { case 0: return &v.state case 1: @@ -10507,7 +10888,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerMeta_AdditionalLibp2PTraceConnectedData); i { + switch v := v.(*ServerMeta_Client); i { case 0: return &v.state case 1: @@ -10519,6 +10900,42 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { } } file_pkg_proto_xatu_event_ingester_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerMeta_Peer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pkg_proto_xatu_event_ingester_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerMeta_AdditionalBeaconP2PAttestationData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pkg_proto_xatu_event_ingester_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerMeta_AdditionalLibp2PTraceConnectedData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pkg_proto_xatu_event_ingester_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerMeta_AdditionalLibp2PTraceDisconnectedData); i { case 0: return &v.state @@ -10579,6 +10996,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { (*ClientMeta_Libp2PTraceHandleMetadata)(nil), (*ClientMeta_Libp2PTraceHandleStatus)(nil), (*ClientMeta_Libp2PTraceGossipsubBeaconBlock)(nil), + (*ClientMeta_Libp2PTraceGossipsubBeaconAttestation)(nil), } file_pkg_proto_xatu_event_ingester_proto_msgTypes[15].OneofWrappers = []interface{}{ (*ServerMeta_BEACON_P2P_ATTESTATION)(nil), @@ -10633,6 +11051,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { (*DecoratedEvent_Libp2PTraceHandleMetadata)(nil), (*DecoratedEvent_Libp2PTraceHandleStatus)(nil), (*DecoratedEvent_Libp2PTraceGossipsubBeaconBlock)(nil), + (*DecoratedEvent_Libp2PTraceGossipsubBeaconAttestation)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -10640,7 +11059,7 @@ func file_pkg_proto_xatu_event_ingester_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_pkg_proto_xatu_event_ingester_proto_rawDesc, NumEnums: 1, - NumMessages: 87, + NumMessages: 90, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/proto/xatu/event_ingester.proto b/pkg/proto/xatu/event_ingester.proto index 2699fd16..0e1b8586 100644 --- a/pkg/proto/xatu/event_ingester.proto +++ b/pkg/proto/xatu/event_ingester.proto @@ -841,6 +841,58 @@ message ClientMeta { // MessageID is a unique identifier for the beacon block message. google.protobuf.StringValue message_id = 9 [ json_name = "message_id" ]; } + + message AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData { + // Epoch contains the epoch information for the source. + EpochV2 epoch = 1; + } + + message AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData { + // Epoch contains the epoch information for the target. + EpochV2 epoch = 1; + } + + message AdditionalLibP2PTraceGossipSubBeaconAttestationData { + // Source contains information for the best currently justified checkpoint. + AdditionalLibP2PTraceGossipSubBeaconAttestationSourceData source = 1; + + // Target contains information of the block at the start of the current + // epoch. + AdditionalLibP2PTraceGossipSubBeaconAttestationTargetData target = 2; + + // Slot contains the slot information for the attestation. + SlotV2 slot = 3; + + // Epoch contains the epoch information for the attestation. + EpochV2 epoch = 4; + + // Propagation contains information about the propagation of the + // attestation. + PropagationV2 propagation = 5; + + // AttestingValidator contains data about the validator that created the + // attestation. Note: only available for unaggregated attestations. + AttestingValidatorV2 attesting_validator = 6 + [ json_name = "attesting_validator" ]; + + // WallclockEpoch contains the epoch information for the attestation on the wall clock when the attestation was received. + EpochV2 wallclock_epoch = 7 [ json_name = "wallclock_epoch" ]; + + // WallclockSlot contains the slot information for the attestation on the wall clock when the attestation was received. + SlotV2 wallclock_slot = 8 [ json_name = "wallclock_slot" ]; + + // Metadata contains additional trace event metadata. + xatu.libp2p.TraceEventMetadata metadata = 9; + + // Topic is the gossip sub topic the beacon block was received on. + google.protobuf.StringValue topic = 10; + + // MessageSize is the size of the beacon block message in bytes. + google.protobuf.UInt32Value message_size = 11 [ json_name = "message_size" ]; + + // MessageID is a unique identifier for the beacon block message. + google.protobuf.StringValue message_id = 12 [ json_name = "message_id" ]; + } // AdditionalData contains additional, computed data as set by the client // about the event. @@ -1021,6 +1073,8 @@ message ClientMeta { // AdditionalLibP2PTraceGossipSubBeaconBlockData contains additional data about the gossip sub beacon block event. AdditionalLibP2PTraceGossipSubBeaconBlockData libp2p_trace_gossipsub_beacon_block = 57 [ json_name = "LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK" ]; + // AdditionalLibP2PTraceGossipSubBeaconAttestationData contains additional data about the gossip sub beacon attestation event. + AdditionalLibP2PTraceGossipSubBeaconAttestationData libp2p_trace_gossipsub_beacon_attestation = 58 [ json_name = "LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION" ]; } } @@ -1161,6 +1215,7 @@ message Event { LIBP2P_TRACE_HANDLE_METADATA = 47; LIBP2P_TRACE_HANDLE_STATUS = 48; LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK = 49; + LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION = 50; } // Name is the name of the event. Name name = 1; @@ -1290,5 +1345,7 @@ message DecoratedEvent { [ json_name = "LIBP2P_TRACE_HANDLE_STATUS" ]; xatu.libp2p.gossipsub.eth.BeaconBlock libp2p_trace_gossipsub_beacon_block = 49 [ json_name = "LIBP2P_TRACE_GOSSIPSUB_BEACON_BLOCK" ]; + xatu.eth.v1.Attestation libp2p_trace_gossipsub_beacon_attestation = 50 + [ json_name = "LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION" ]; }; } diff --git a/pkg/server/service/event-ingester/event/event.go b/pkg/server/service/event-ingester/event/event.go index a920eb77..301d9e45 100644 --- a/pkg/server/service/event-ingester/event/event.go +++ b/pkg/server/service/event-ingester/event/event.go @@ -67,6 +67,7 @@ var ( TypeLibP2PTraceHandleStatus Type = Type(libp2p.TraceHandleStatusType) TypeLibP2PTraceHandleMetadata Type = Type(libp2p.TraceHandleMetadataType) TypeLibP2PTraceGossipSubBeaconBlock Type = Type(libp2p.TraceGossipSubBeaconBlockType) + TypeLibP2PTraceGossipSubBeaconAttestation Type = Type(libp2p.TraceGossipSubBeaconAttestationType) ) type Event interface { @@ -177,6 +178,8 @@ func New(eventType Type, log logrus.FieldLogger, event *xatu.DecoratedEvent, cac return libp2p.NewTraceHandleMetadata(log, event), nil case TypeLibP2PTraceGossipSubBeaconBlock: return libp2p.NewTraceGossipSubBeaconBlock(log, event), nil + case TypeLibP2PTraceGossipSubBeaconAttestation: + return libp2p.NewTraceGossipSubBeaconAttestation(log, event), nil default: return nil, fmt.Errorf("event type %s is unknown", eventType) } diff --git a/pkg/server/service/event-ingester/event/libp2p/trace_gossipsub_beacon_attestation.go b/pkg/server/service/event-ingester/event/libp2p/trace_gossipsub_beacon_attestation.go new file mode 100644 index 00000000..8b4e1f18 --- /dev/null +++ b/pkg/server/service/event-ingester/event/libp2p/trace_gossipsub_beacon_attestation.go @@ -0,0 +1,46 @@ +package libp2p + +import ( + "context" + "errors" + + "github.com/ethpandaops/xatu/pkg/proto/xatu" + "github.com/sirupsen/logrus" +) + +var ( + TraceGossipSubBeaconAttestationType = xatu.Event_LIBP2P_TRACE_GOSSIPSUB_BEACON_ATTESTATION.String() +) + +type TraceGossipSubBeaconAttestation struct { + log logrus.FieldLogger + event *xatu.DecoratedEvent +} + +func NewTraceGossipSubBeaconAttestation(log logrus.FieldLogger, event *xatu.DecoratedEvent) *TraceGossipSubBeaconAttestation { + return &TraceGossipSubBeaconAttestation{ + log: log.WithField("event", TraceGossipSubBeaconAttestationType), + event: event, + } +} + +func (gsb *TraceGossipSubBeaconAttestation) Type() string { + return TraceGossipSubBeaconAttestationType +} + +func (gsb *TraceGossipSubBeaconAttestation) Validate(ctx context.Context) error { + _, ok := gsb.event.Data.(*xatu.DecoratedEvent_Libp2PTraceGossipsubBeaconAttestation) + if !ok { + return errors.New("failed to cast event data to TraceGossipSubBeaconAttestation") + } + + return nil +} + +func (gsb *TraceGossipSubBeaconAttestation) Filter(ctx context.Context) bool { + return false +} + +func (gsb *TraceGossipSubBeaconAttestation) AppendServerMeta(ctx context.Context, meta *xatu.ServerMeta) *xatu.ServerMeta { + return meta +} From 1c398f1d4424eff0f89218b0a6bc5d3dd18404da Mon Sep 17 00:00:00 2001 From: Sam Calder-Mason Date: Mon, 29 Apr 2024 14:42:27 +1000 Subject: [PATCH 2/7] Add grafana dashboards --- .../dashboards/xatu/basic_overview.json | 724 +-- .../grafana/dashboards/xatu/gossipsub.json | 4265 +++++++++++++++++ 2 files changed, 4680 insertions(+), 309 deletions(-) create mode 100644 deploy/local/docker-compose/grafana/dashboards/xatu/gossipsub.json diff --git a/deploy/local/docker-compose/grafana/dashboards/xatu/basic_overview.json b/deploy/local/docker-compose/grafana/dashboards/xatu/basic_overview.json index 91f27bef..d67b33d0 100644 --- a/deploy/local/docker-compose/grafana/dashboards/xatu/basic_overview.json +++ b/deploy/local/docker-compose/grafana/dashboards/xatu/basic_overview.json @@ -1,339 +1,445 @@ { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 4, - "links": [], - "liveNow": false, - "panels": [ + "annotations": { + "list": [ { + "builtIn": 1, "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" + "type": "grafana", + "uid": "-- Grafana --" }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 9, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] } }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum by(event) (increase(xatu_server_event_ingester_decorated_events_received_total[5m]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Events Ingested by Xatu Server", - "type": "timeseries" + "overrides": [] }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" + "gridPos": { + "h": 10, + "w": 9, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(event) (increase(xatu_server_event_ingester_decorated_events_received_total[5m]))", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Events Ingested by Xatu Server", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } }, - "overrides": [] + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "gridPos": { - "h": 10, - "w": 15, - "x": 9, - "y": 0 + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 15, + "x": 9, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Last *", + "sortDesc": true }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(component_id, component_kind, component_type) (increase(vector_component_received_events_total{component_type=\"kafka\", component_kind=\"sink\"}[5m])) != 0", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{component_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Vector to Kafka", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "sum by(component_id, component_kind, component_type) (increase(vector_component_received_events_total{component_type!~\"internal_metrics|log_to_metric|prometheus_exporter\"}[5m]))", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] } - ], - "title": "Vector Events", - "type": "timeseries" + }, + "overrides": [] }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" + "gridPos": { + "h": 10, + "w": 9, + "x": 0, + "y": 10 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "increase(vector_component_errors_total[5m])", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Vector Errors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "thresholdsStyle": { + "mode": "off" } }, - "overrides": [] + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "gridPos": { - "h": 10, - "w": 7, - "x": 0, - "y": 10 + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 15, + "x": 9, + "y": 10 + }, + "id": 3, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Last *", + "sortDesc": true }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "increase(vector_component_errors_total[5m])", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Vector Errors", - "type": "timeseries" - } - ], - "refresh": "", - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-30m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Basic Overview", - "uid": "e1aea0f4-d6ff-4fb1-91a4-e18e4e31e42a", - "version": 2, - "weekStart": "" - } \ No newline at end of file + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(component_id, component_kind, component_type) (increase(vector_component_received_events_total{component_type=\"clickhouse\", component_kind=\"sink\"}[5m])) != 0", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{component_id}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Vector to Clickhouse", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Overview", + "uid": "e1aea220f4-d6ff-4fb1-91a4-e18e4e31e42a", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/deploy/local/docker-compose/grafana/dashboards/xatu/gossipsub.json b/deploy/local/docker-compose/grafana/dashboards/xatu/gossipsub.json new file mode 100644 index 00000000..c3a73534 --- /dev/null +++ b/deploy/local/docker-compose/grafana/dashboards/xatu/gossipsub.json @@ -0,0 +1,4265 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "dark-red", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": true, + "tags": [], + "type": "tags" + }, + "type": "dashboard" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "expr": "", + "iconColor": "red", + "name": "Slot annotations", + "target": { + "limit": 2000, + "matchAny": true, + "refId": "Anno", + "tags": [ + "slot", + "xatu" + ], + "type": "tags" + } + } + ] + }, + "description": "", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 4, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 28, + "panels": [], + "title": "Summary", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 30, + "interval": "$interval", + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "alias": "", + "column": "meta_client_name" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "meta_client_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${client_name}" + ] + }, + { + "condition": "AND", + "filterType": "custom", + "key": "meta_network_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${network_name}" + ] + } + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n count(DISTINCT(meta_client_name))\nFROM default.libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from:date:seconds})\n AND slot_start_date_time <= (toDateTime(${__to:date:seconds}) - INTERVAL 1 MINUTE)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY time\nORDER BY time\nLIMIT 1000", + "refId": "A" + } + ], + "title": "Active sentries", + "type": "stat" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 4, + "y": 1 + }, + "id": 34, + "interval": "$interval", + "options": { + "basemap": { + "config": {}, + "name": "Layer 0", + "type": "default" + }, + "controls": { + "mouseWheelZoom": true, + "showAttribution": true, + "showDebug": false, + "showMeasure": false, + "showScale": false, + "showZoom": true + }, + "layers": [ + { + "config": { + "showLegend": false, + "style": { + "color": { + "fixed": "dark-green" + }, + "opacity": 0.4, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "field": "count", + "fixed": 5, + "max": 5, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "text": { + "fixed": "", + "mode": "field" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + "filterData": { + "id": "byRefId", + "options": "A" + }, + "location": { + "geohash": "meta_client_geo_city", + "latitude": "latitude", + "longitude": "longitude", + "mode": "coords" + }, + "name": "Layer 1", + "tooltip": true, + "type": "markers" + } + ], + "tooltip": { + "mode": "details" + }, + "view": { + "allLayers": true, + "id": "coords", + "lat": 5.747627, + "lon": 22, + "zoom": 1 + } + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "column": "meta_client_name" + } + ], + "columns": [ + { + "name": "meta_client_geo_longitude" + }, + { + "name": "meta_client_geo_latitude" + }, + { + "name": "meta_client_geo_city" + }, + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_geo_longitude", + "meta_client_geo_latitude", + "meta_client_geo_city" + ], + "mode": "aggregate", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n meta_client_geo_latitude as latitude,\n meta_client_geo_longitude as longitude,\n meta_client_geo_city as city,\n count(DISTINCT meta_client_name) as `count`\n \nFROM \n libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= now() - toIntervalMinute(2)\n AND slot_start_date_time <= now() - toIntervalMinute(1)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY\n slot_start_date_time,\n meta_client_geo_longitude,\n meta_client_geo_latitude,\n meta_client_geo_city\nORDER BY slot_start_date_time DESC\nLIMIT 1 by latitude, longitude\n", + "refId": "A" + } + ], + "title": "Active Sentries", + "type": "geomap" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 8, + "y": 1 + }, + "id": 193, + "interval": "$interval", + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "refId": "A" + } + ], + "title": "Peers sending us blocks", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 54, + "panels": [], + "title": "Summary per client", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 0, + "y": 10 + }, + "id": 46, + "interval": "$interval", + "maxPerRow": 12, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "repeat": "geo_continent_code", + "repeatDirection": "h", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "alias": "", + "column": "meta_client_name" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "meta_client_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${client_name}" + ] + }, + { + "condition": "AND", + "filterType": "custom", + "key": "meta_network_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${network_name}" + ] + } + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n count(DISTINCT(meta_client_name))\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from:date:seconds})\n AND slot_start_date_time <= (toDateTime(${__to:date:seconds}) - INTERVAL 1 MINUTE)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code = '${geo_continent_code}'\nGROUP BY time\nORDER BY time\nLIMIT 1000", + "refId": "A" + } + ], + "title": "Active sentries ${geo_continent_code}", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 14 + }, + "id": 17, + "panels": [], + "title": "Blocks", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } + }, + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "min" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p50" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 4 + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "p95", + "average", + "p50", + "p05", + "min" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 36, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(propagation_slot_start_diff) max,\n quantile(0.95)(propagation_slot_start_diff) p95,\n avg(propagation_slot_start_diff) average,\n quantile(0.50)(propagation_slot_start_diff) p50,\n quantile(0.05)(propagation_slot_start_diff) p05,\n min(propagation_slot_start_diff) min\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Block arrival time in slot", + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateYlOrRd", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDE22E36FB877C574" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 24, + "x": 0, + "y": 24 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 39, + "interval": "$interval_tight", + "legend": { + "show": true + }, + "options": { + "calculate": false, + "calculation": { + "xBuckets": { + "mode": "size" + } + }, + "cellGap": 2, + "cellValues": {}, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Plasma", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "le" + }, + "showValue": "never", + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "dtdurationms" + } + }, + "pluginVersion": "10.4.2", + "reverseYBuckets": false, + "targets": [ + { + "database": "default", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDE22E36FB877C574" + }, + "dateTimeColDataType": "slot_start_date_time", + "dateTimeType": "DATETIME", + "editorMode": "builder", + "extrapolate": true, + "format": "time_series", + "formattedQuery": "SELECT\n $timeSeries + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, $heatmap_interval)), $heatmap_interval) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE $timeFilter\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY\n timestamp,\n diff", + "hide": false, + "intervalFactor": 1, + "query": "SELECT\n $timeSeries + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, $heatmap_interval)), $heatmap_interval) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE $timeFilter\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY\n timestamp,\n diff", + "rawQuery": "SELECT\n (intDiv(toUInt32(slot_start_date_time), 60) * 60) * 1000 + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, 250)), 250) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE slot_start_date_time >= toDateTime(1714092003) AND slot_start_date_time <= toDateTime(1714113603)\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN ('xatu-cl-mimicry-sfo3-holesky-002','xatu-cl-mimicry-syd1-holesky-002','xatu-cl-mimicry-sfo3-holesky-001','xatu-cl-mimicry-syd1-holesky-001')\n AND meta_network_name IN ('holesky')\nGROUP BY\n timestamp,\n diff", + "refId": "A", + "round": "0s", + "skip_comments": true, + "table": "libp2p_gossipsub_beacon_block" + } + ], + "title": "Block arrival time in slot", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "std dev population" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p90 - p10" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 37 + }, + "id": 59, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n stddevPop(propagation_slot_start_diff) `std dev population`,\n quantile(0.90)(propagation_slot_start_diff) - quantile(0.10)(propagation_slot_start_diff) `p90 - p10`\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND propagation_slot_start_diff < 10000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Block arrival time spread", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } + }, + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "min" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p50" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 4 + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "p95", + "average", + "p50", + "p05", + "min" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 43 + }, + "id": 37, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(diff) max,\n quantile(0.95)(diff) p95,\n avg(diff) average,\n quantile(0.50)(diff) p50,\n quantile(0.05)(diff) p05,\n min(diff) min\nFROM (\n SELECT\n slot,\n slot_start_date_time,\n block,\n meta_network_name,\n max(propagation_slot_start_diff) - min(propagation_slot_start_diff) AS diff\n FROM libp2p_gossipsub_beacon_block FINAL\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n GROUP BY slot, slot_start_date_time, block, meta_network_name\n)\nWHERE\n diff > 0\n AND diff < 100000\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Block arrival time difference between sentries (by consensus client)", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 23, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 51 + }, + "id": 38, + "interval": "12s", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "alias": "name", + "column": "meta_client_name" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n slot_start_date_time,\n count(DISTINCT(block))\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY slot_start_date_time\nORDER BY slot_start_date_time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Unique Blocks per slot", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 12, + "y": 51 + }, + "id": 31, + "interval": "$interval", + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.2.0", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "max", + "alias": "", + "column": "epoch" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(epoch)\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Latest epoch", + "type": "stat" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 18, + "y": 51 + }, + "id": 32, + "interval": "$interval", + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.2.0", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "max", + "alias": "", + "column": "slot" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(slot)\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000\n", + "refId": "A" + } + ], + "title": "Latest slot", + "type": "stat" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 23, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 57 + }, + "id": 156, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "alias": "name", + "column": "meta_client_name" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n meta_client_name as name,\n COUNT(block) as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time, meta_client_name\nORDER BY time ASC\nLIMIT 100000", + "refId": "A" + } + ], + "title": "Blocks per instance", + "transformations": [ + { + "id": "partitionByValues", + "options": { + "fields": [ + "name" + ] + } + } + ], + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 66 + }, + "id": 174, + "panels": [], + "title": "Block size", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/^(?!bucketed_bytes$).+$/" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + }, + { + "id": "max" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "max" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" + }, + "properties": [ + { + "id": "custom.lineStyle" + }, + { + "id": "color", + "value": { + "fixedColor": "light-green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "min" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p50" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 4 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 17, + "x": 0, + "y": 67 + }, + "id": 173, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xField": "bucketed_bytes" + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "WITH \n filtered AS (\n SELECT \n message_size, \n floor(message_size / 25600) * 25600 AS bucketed_bytes,\n propagation_slot_start_diff\n FROM \n default.libp2p_gossipsub_beacon_block FINAL\n WHERE \n slot_start_date_time >= $__fromTime AND \n slot_start_date_time <= $__toTime AND\n propagation_slot_start_diff < 8000 AND\n meta_client_name IN (${client_name}) AND\n meta_network_name IN (${network_name}) AND\n meta_client_geo_continent_code IN (${geo_continent_code})\n )\nSELECT \n bucketed_bytes,\n MAX(propagation_slot_start_diff) AS max,\n quantile(0.95)(propagation_slot_start_diff) AS p95,\n AVG(propagation_slot_start_diff) AS avg,\n quantile(0.50)(propagation_slot_start_diff) AS p50,\n quantile(0.05)(propagation_slot_start_diff) AS p05,\n MIN(propagation_slot_start_diff) AS min\nFROM \n filtered\nGROUP BY \n bucketed_bytes\nORDER BY \n bucketed_bytes ASC;\n", + "refId": "A" + } + ], + "title": "Block arrival time for block size (compressed, 25KiB buckets)", + "type": "trend" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/^(?!bucketed_bytes$).+$/" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + }, + { + "id": "max" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "max" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 7, + "x": 17, + "y": 67 + }, + "id": 191, + "interval": "$interval_tight", + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.2.0", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "WITH \n filtered AS (\n SELECT \n message_size, \n floor(message_size / 102400) * 102400 AS bucketed_bytes,\n propagation_slot_start_diff\n FROM \n default.libp2p_gossipsub_beacon_block FINAL\n WHERE \n slot_start_date_time >= $__fromTime AND \n slot_start_date_time <= $__toTime AND\n propagation_slot_start_diff < 8000 AND\n meta_client_name IN (${client_name}) AND\n meta_network_name IN (${network_name}) AND\n meta_client_geo_continent_code IN (${geo_continent_code})\n )\nSELECT \n bucketed_bytes,\n MAX(propagation_slot_start_diff) AS max,\n quantile(0.95)(propagation_slot_start_diff) AS p95,\n AVG(propagation_slot_start_diff) AS avg,\n quantile(0.50)(propagation_slot_start_diff) AS p50,\n quantile(0.05)(propagation_slot_start_diff) AS p05,\n MIN(propagation_slot_start_diff) AS min\nFROM \n filtered\nGROUP BY \n bucketed_bytes\nORDER BY \n bucketed_bytes ASC;\n", + "refId": "A" + } + ], + "title": "Block propagation for block size (100KiB buckets)", + "type": "table" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 76 + }, + "id": 8, + "panels": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 300000, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } + }, + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 34 + }, + { + "id": "custom.lineWidth", + "value": 1 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "min" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 1 + }, + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p50" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 1 + }, + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "average", + "p50", + "p05", + "min", + "p95" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 77 + }, + "id": 95, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.3", + "queryType": "table", + "rawSql": "\nSELECT\n $__timeInterval(slot_start_date_time) as time,\n max(propagation_slot_start_diff) max,\n quantile(0.95)(propagation_slot_start_diff) p95,\n avg(propagation_slot_start_diff) average,\n quantile(0.50)(propagation_slot_start_diff) p50,\n quantile(0.05)(propagation_slot_start_diff) p05,\n min(propagation_slot_start_diff) min\nFROM default.${attestation_prefix}beacon_api_eth_v1_events_attestation\nWHERE\n $__timeFilter(slot_start_date_time)\n AND propagation_slot_start_diff < 384000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Attestation arrival time in slot", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "description": "Similar to inclusion distance but instead of when it was included in a block, it's instead when a sentry saw a attestation and the \"distance\" between its target and the current slot. \"0\" being the attestation for the current slot, \"1\" being current slot - 1 etc.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent" + }, + { + "color": "#EAB839", + "value": 1 + }, + { + "color": "#6ED0E0", + "value": 2 + }, + { + "color": "#EF843C", + "value": 5 + }, + { + "color": "#E24D42", + "value": 10 + }, + { + "color": "#1F78C1", + "value": 20 + }, + { + "color": "#BA43A9", + "value": 30 + }, + { + "color": "#705DA0", + "value": 50 + }, + { + "color": "#508642", + "value": 75 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 86 + }, + "id": 151, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "builderOptions": { + "database": "default", + "fields": [ + "event_date_time" + ], + "filters": [], + "limit": 100, + "metrics": [], + "mode": "trend", + "orderBy": [], + "table": "${table_prefix}beacon_api_eth_v1_events_attestation", + "timeField": "slot_start_date_time", + "timeFieldType": "DateTime" + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "format": 1, + "meta": { + "builderOptions": { + "database": "default", + "fields": [ + "event_date_time" + ], + "filters": [], + "limit": 100, + "metrics": [], + "mode": "trend", + "orderBy": [], + "table": "${table_prefix}beacon_api_eth_v1_events_attestation", + "timeField": "slot_start_date_time", + "timeFieldType": "DateTime" + } + }, + "queryType": "sql", + "rawSql": "SELECT\n toDateTime(slot_start_date_time) as time,\n percent\nFROM \n(\n SELECT\n slot_start_date_time,\n interval,\n round((inclusion_count / interval_total) * 100, 2) AS percent\n FROM\n (\n SELECT\n slot_start_date_time,\n interval,\n inclusion_count,\n sum(inclusion_count) OVER (PARTITION BY slot_start_date_time) AS interval_total\n FROM\n (\n SELECT\n slot_start_date_time,\n floor(divide(propagation_slot_start_diff, 12000)) as interval,\n count(DISTINCT source_root, target_root, aggregation_bits, beacon_block_root, attesting_validator_index, attesting_validator_committee_index) as inclusion_count\n FROM default.${attestation_prefix}beacon_api_eth_v1_events_attestation\n\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\n GROUP BY\n slot_start_date_time,\n interval\n ORDER BY inclusion_count DESC\n )\n )\n)\nORDER BY time ASC, percent DESC", + "refId": "A", + "selectedFormat": 4 + } + ], + "title": "Attestation seen distance", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "percent": { + "aggregations": [ + "allValues" + ], + "operation": "aggregate" + }, + "time": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "extractFields", + "options": { + "source": "percent (allValues)" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "percent (allValues)": true + }, + "indexByName": {}, + "renameByName": {} + } + } + ], + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateYlOrRd", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDE22E36FB877C574" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 19, + "w": 24, + "x": 0, + "y": 93 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 75, + "interval": "$interval_tight", + "legend": { + "show": true + }, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": {}, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Plasma", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "le" + }, + "showValue": "never", + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "dtdurationms" + } + }, + "pluginVersion": "10.2.0", + "reverseYBuckets": false, + "targets": [ + { + "database": "default", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDE22E36FB877C574" + }, + "dateColDataType": "", + "dateLoading": false, + "dateTimeColDataType": "slot_start_date_time", + "dateTimeType": "DATETIME", + "datetimeLoading": false, + "extrapolate": true, + "format": "time_series", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "interval": "", + "intervalFactor": 1, + "query": "SELECT\n $timeSeries + 12000 as timestamp,\n toUInt8(propagation_slot_start_diff / ${heatmap_interval}) * ${heatmap_interval} as diff,\n sum(toUInt16(1)) as count\nFROM ${attestation_prefix}beacon_api_eth_v1_events_attestation\n\nWHERE $timeFilter\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND diff < 30000\n AND isNotNull(attesting_validator_index)\n\nGROUP BY\n timestamp,\n diff\n \nLIMIT 10000000\n", + "rawQuery": "SELECT\n (intDiv(toUInt32(slot_start_date_time), 12) * 12) * 1000 + 12000 as timestamp,\n toUInt8(propagation_slot_start_diff / 1000) * 1000 as diff,\n sum(toUInt16(1)) as count\nFROM beacon_api_eth_v1_events_attestation\n\nWHERE slot_start_date_time >= toDateTime(1705537008) AND slot_start_date_time <= toDateTime(1705540608)\n AND meta_client_name IN ('xatu-sentry-ams3-mainnet-prysm-001','xatu-sentry-sfo3-mainnet-prysm-001','xatu-sentry-syd1-mainnet-nimbus-001','xatu-sentry-syd1-mainnet-lodestar-001','xatu-sentry-sfo3-mainnet-lighthouse-001','xatu-sentry-syd1-mainnet-teku-001','xatu-sentry-ams3-mainnet-lighthouse-001','xatu-sentry-sfo3-mainnet-lodestar-001','xatu-sentry-ams3-mainnet-teku-001','xatu-sentry-syd1-mainnet-lighthouse-001','xatu-sentry-ams3-mainnet-lodestar-001','xatu-sentry-sfo3-mainnet-teku-001','xatu-sentry-sfo3-mainnet-nimbus-001','xatu-sentry-ams3-mainnet-nimbus-001','xatu-sentry-syd1-mainnet-prysm-001')\n AND meta_network_name IN ('mainnet')\n AND meta_client_geo_continent_code IN ('OC','NA','EU')\n AND meta_consensus_implementation IN ('teku','prysm','nimbus','lodestar','lighthouse')\n AND meta_consensus_version IN ('v4.6.0-rc.0-2e8e160+','v24.1.1-8cfce8-stateofus','v1.14.0','Unknown (linux amd64)','vUNKNOWN+g44161eb')\n AND diff < 30000\n AND isNotNull(attesting_validator_index)\n\nGROUP BY\n timestamp,\n diff\n \nLIMIT 10000000", + "refId": "A", + "round": "12s", + "skip_comments": true, + "table": "${table_prefix}beacon_api_eth_v1_events_attestation", + "tableLoading": false + } + ], + "title": "Attestation arrival time in slot", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "description": "For a given slot, what beacon block roots had attestations against them", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent" + }, + { + "color": "#EAB839", + "value": 1 + }, + { + "color": "#6ED0E0", + "value": 2 + }, + { + "color": "#EF843C", + "value": 5 + }, + { + "color": "#E24D42", + "value": 10 + }, + { + "color": "#1F78C1", + "value": 20 + }, + { + "color": "#BA43A9", + "value": 30 + }, + { + "color": "#705DA0", + "value": 50 + }, + { + "color": "#508642", + "value": 75 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 112 + }, + "id": 117, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "builderOptions": { + "database": "default", + "fields": [ + "event_date_time" + ], + "filters": [], + "limit": 100, + "metrics": [], + "mode": "trend", + "orderBy": [], + "table": "${table_prefix}beacon_api_eth_v1_events_attestation", + "timeField": "slot_start_date_time", + "timeFieldType": "DateTime" + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "format": 1, + "meta": { + "builderOptions": { + "database": "default", + "fields": [ + "event_date_time" + ], + "filters": [], + "limit": 100, + "metrics": [], + "mode": "trend", + "orderBy": [], + "table": "${table_prefix}beacon_api_eth_v1_events_attestation", + "timeField": "slot_start_date_time", + "timeFieldType": "DateTime" + } + }, + "queryType": "sql", + "rawSql": "SELECT\n toDateTime(slot_start_date_time) as time,\n percent\nFROM \n(\n SELECT\n slot_start_date_time,\n beacon_block_root,\n round((attestation_count / beacon_block_root_total) * 100, 2) AS percent\n FROM\n (\n SELECT\n slot_start_date_time,\n beacon_block_root,\n attestation_count,\n sum(attestation_count) OVER (PARTITION BY slot_start_date_time) AS beacon_block_root_total\n FROM\n (\n SELECT\n slot_start_date_time,\n beacon_block_root,\n sum(toUInt32(1)) AS attestation_count\n FROM default.${attestation_prefix}beacon_api_eth_v1_events_attestation\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\n GROUP BY\n slot_start_date_time,\n beacon_block_root\n ORDER BY attestation_count DESC\n )\n )\n)\nORDER BY time ASC, percent DESC", + "refId": "A", + "selectedFormat": 4 + } + ], + "title": "Attestation agreement", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "percent": { + "aggregations": [ + "allValues" + ], + "operation": "aggregate" + }, + "time": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "extractFields", + "options": { + "source": "percent (allValues)" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "percent (allValues)": true + }, + "indexByName": {}, + "renameByName": {} + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 300000, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "std dev population" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p90 - p10" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 119 + }, + "id": 100, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.3", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n stddevPop(propagation_slot_start_diff) `std dev population`,\n quantile(0.90)(propagation_slot_start_diff) - quantile(0.10)(propagation_slot_start_diff) `p90 - p10`\nFROM default.${attestation_prefix}beacon_api_eth_v1_events_attestation\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\n AND propagation_slot_start_diff < 384000\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Attestation arrival time spread", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "description": "The difference between when an attestation is seen by the first and last sentry", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 3600000, + "lineInterpolation": "smooth", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } + }, + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "min" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p50" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 4 + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "p95", + "average", + "p50", + "p05", + "min" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 125 + }, + "id": 41, + "interval": "$interval_loose", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.3", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(diff) max,\n quantile(0.95)(diff) p95,\n avg(diff) average,\n quantile(0.50)(diff) p50,\n quantile(0.05)(diff) p05,\n min(diff) min\nFROM (\n SELECT\n slot,\n slot_start_date_time,\n aggregation_bits,\n committee_index,\n meta_network_name,\n max(propagation_slot_start_diff) - min(propagation_slot_start_diff) AS diff,\n COUNT(*) as count\n FROM ${attestation_prefix}beacon_api_eth_v1_events_attestation\n WHERE\n $__timeFilter(slot_start_date_time)\n AND slot_start_date_time <= toDateTime(${__to:date:seconds})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\n GROUP BY slot, slot_start_date_time, aggregation_bits, committee_index, meta_network_name\n HAVING diff > 0 AND diff < 30000 AND count > 1\n)\nGROUP BY time\nORDER BY time ASC\nLIMIT 100000\n", + "refId": "A" + } + ], + "title": "Attestation propagation difference between sentries", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 23, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 300000, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 133 + }, + "id": 3, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "builderOptions": { + "database": "default", + "fields": [], + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "metrics": [ + { + "aggregation": "count", + "alias": "name", + "field": "meta_client_name" + } + ], + "mode": "trend", + "orderBy": [], + "table": "${table_prefix}beacon_api_eth_v1_events_attestation", + "timeField": "slot_start_date_time", + "timeFieldType": "DateTime" + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "format": 1, + "meta": { + "builderOptions": { + "database": "default", + "fields": [], + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "metrics": [ + { + "aggregation": "count", + "alias": "name", + "field": "meta_client_name" + } + ], + "mode": "trend", + "orderBy": [], + "table": "${table_prefix}beacon_api_eth_v1_events_attestation", + "timeField": "slot_start_date_time", + "timeFieldType": "DateTime" + } + }, + "queryType": "sql", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n meta_client_name as name,\n sumMerge(attestations) as count\nFROM default.${table_prefix}beacon_api_slot\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\nGROUP BY time, meta_client_name\nORDER BY time ASC\nLIMIT 10000", + "refId": "A", + "selectedFormat": 4 + } + ], + "title": "Attestations per sentry", + "transformations": [ + { + "id": "partitionByValues", + "options": { + "fields": [ + "name" + ] + } + } + ], + "type": "timeseries" + } + ], + "title": "Attestations", + "type": "row" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "mainnet" + ], + "value": [ + "mainnet" + ] + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "definition": "SELECT meta_network_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\nGROUP BY meta_network_name ", + "hide": 0, + "includeAll": true, + "label": "Network", + "multi": true, + "name": "network_name", + "options": [], + "query": "SELECT meta_network_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\nGROUP BY meta_network_name ", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "definition": "SELECT meta_client_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_name ", + "hide": 0, + "includeAll": true, + "label": "Sentry", + "multi": true, + "name": "client_name", + "options": [], + "query": "SELECT meta_client_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_name ", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "PDF61E9E97939C7ED" + }, + "definition": "SELECT meta_client_geo_continent_code\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_geo_continent_code ", + "hide": 0, + "includeAll": true, + "label": "Continent", + "multi": true, + "name": "geo_continent_code", + "options": [], + "query": "SELECT meta_client_geo_continent_code\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_geo_continent_code ", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "250", + "value": "250" + }, + "hide": 0, + "includeAll": false, + "label": "Heatmap interval (MS)", + "multi": false, + "name": "heatmap_interval", + "options": [ + { + "selected": false, + "text": "100", + "value": "100" + }, + { + "selected": true, + "text": "250", + "value": "250" + } + ], + "query": "100,250", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "auto": true, + "auto_count": 300, + "auto_min": "12s", + "current": { + "selected": false, + "text": "auto", + "value": "$__auto_interval_interval_tight" + }, + "hide": 2, + "name": "interval_tight", + "options": [ + { + "selected": true, + "text": "auto", + "value": "$__auto_interval_interval_tight" + }, + { + "selected": false, + "text": "12s", + "value": "12s" + }, + { + "selected": false, + "text": "60s", + "value": "60s" + }, + { + "selected": false, + "text": "384s", + "value": "384s" + }, + { + "selected": false, + "text": "3840s", + "value": "3840s" + }, + { + "selected": false, + "text": "92160s", + "value": "92160s" + } + ], + "query": "12s,60s,384s,3840s,92160s", + "refresh": 2, + "skipUrlSync": false, + "type": "interval" + }, + { + "auto": true, + "auto_count": 50, + "auto_min": "12s", + "current": { + "selected": false, + "text": "auto", + "value": "$__auto_interval_interval" + }, + "hide": 2, + "name": "interval", + "options": [ + { + "selected": true, + "text": "auto", + "value": "$__auto_interval_interval" + }, + { + "selected": false, + "text": "12s", + "value": "12s" + }, + { + "selected": false, + "text": "60s", + "value": "60s" + }, + { + "selected": false, + "text": "384s", + "value": "384s" + }, + { + "selected": false, + "text": "3840s", + "value": "3840s" + }, + { + "selected": false, + "text": "92160s", + "value": "92160s" + } + ], + "query": "12s,60s,384s,3840s,92160s", + "refresh": 2, + "skipUrlSync": false, + "type": "interval" + }, + { + "auto": true, + "auto_count": 50, + "auto_min": "12s", + "current": { + "selected": false, + "text": "auto", + "value": "$__auto_interval_interval_loose" + }, + "hide": 2, + "name": "interval_loose", + "options": [ + { + "selected": true, + "text": "auto", + "value": "$__auto_interval_interval_loose" + }, + { + "selected": false, + "text": "384s", + "value": "384s" + }, + { + "selected": false, + "text": "3840s", + "value": "3840s" + }, + { + "selected": false, + "text": "92160s", + "value": "92160s" + } + ], + "query": "384s,3840s,92160s", + "refresh": 2, + "skipUrlSync": false, + "type": "interval" + }, + { + "current": { + "selected": true, + "text": "", + "value": "" + }, + "description": "Table prefix", + "hide": 0, + "label": "Prefix", + "name": "table_prefix", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": "", + "value": "" + }, + "description": "Table prefix for attestations", + "hide": 0, + "label": "Attestation Prefix", + "name": "attestation_prefix", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "textbox" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Gossipsub Events", + "uid": "d49d224e-0b6a-4319-b968-63afd535db55", + "version": 1, + "weekStart": "" + } \ No newline at end of file From 13d140e045bbfb212dbf4d2013662aac20aaa080 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:18:15 +1000 Subject: [PATCH 3/7] gleeb (#319) --- .../clickhouse/032_libp2p_trace.up.sql | 116 +++++++++--------- .../033_libp2p_trace_metadata_status.up.sql | 14 +-- .../034_libp2p_gossipsub_beacon_block.up.sql | 8 +- ...ibp2p_gossipsub_beacon_attestation.up.sql} | 8 +- 4 files changed, 75 insertions(+), 71 deletions(-) rename deploy/migrations/clickhouse/{035_libp2p_gossipsub_attestation.up.sql => 035_libp2p_gossipsub_beacon_attestation.up.sql} (96%) diff --git a/deploy/migrations/clickhouse/032_libp2p_trace.up.sql b/deploy/migrations/clickhouse/032_libp2p_trace.up.sql index 7d7c2b98..ad2f6eee 100644 --- a/deploy/migrations/clickhouse/032_libp2p_trace.up.sql +++ b/deploy/migrations/clickhouse/032_libp2p_trace.up.sql @@ -46,7 +46,7 @@ CREATE TABLE libp2p_add_peer_local ON CLUSTER '{cluster}' meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_add_peer_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the peers added to the libp2p client.', @@ -73,7 +73,7 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_add_peer ON CLUSTER '{cluster}' AS libp2p_add_peer_local -ENGINE = Distributed('{cluster}', default, libp2p_add_peer_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_add_peer_local, unique_key); -- Creating local and distributed tables for libp2p_remove_peer CREATE TABLE libp2p_remove_peer_local ON CLUSTER '{cluster}' @@ -100,7 +100,7 @@ CREATE TABLE libp2p_remove_peer_local ON CLUSTER '{cluster}' meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_remove_peer_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the peers removed from the libp2p client.', @@ -126,12 +126,14 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_remove_peer ON CLUSTER '{cluster}' AS libp2p_remove_peer_local -ENGINE = Distributed('{cluster}', default, libp2p_remove_peer_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_remove_peer_local, unique_key); -- Creating tables for RPC meta data with ReplicatedReplacingMergeTree and Distributed engines CREATE TABLE libp2p_rpc_meta_message_local ON CLUSTER '{cluster}' ( unique_key Int64, + updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), + event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), control_index Int32 CODEC(DoubleDelta, ZSTD(1)), rpc_meta_unique_key Int64, message_id String CODEC(ZSTD(1)), @@ -139,8 +141,6 @@ CREATE TABLE libp2p_rpc_meta_message_local ON CLUSTER '{cluster}' topic_fork_digest_value LowCardinality(String), topic_name LowCardinality(String), topic_encoding LowCardinality(String), - updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), - event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), peer_id_unique_key Int64, meta_client_name LowCardinality(String), meta_client_id String CODEC(ZSTD(1)), @@ -158,12 +158,14 @@ CREATE TABLE libp2p_rpc_meta_message_local ON CLUSTER '{cluster}' meta_client_geo_autonomous_system_organization Nullable(String) CODEC(ZSTD(1)), meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) -ORDER BY (event_date_time, control_index); +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +ORDER BY (event_date_time, unique_key, control_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_message_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the RPC meta messages from the peer', COMMENT COLUMN unique_key 'Unique identifier for each RPC message record', +COMMENT COLUMN event_date_time 'Timestamp of the RPC event', +COMMENT COLUMN updated_date_time 'Timestamp when the RPC message record was last updated', COMMENT COLUMN control_index 'Position in the RPC meta message array', COMMENT COLUMN rpc_meta_unique_key 'Unique key associated with the RPC metadata', COMMENT COLUMN message_id 'Identifier of the message', @@ -171,8 +173,6 @@ COMMENT COLUMN topic_layer 'Layer of the topic', COMMENT COLUMN topic_fork_digest_value 'Fork digest value of the topic', COMMENT COLUMN topic_name 'Name of the topic', COMMENT COLUMN topic_encoding 'Encoding of the topic', -COMMENT COLUMN updated_date_time 'Timestamp when the RPC message record was last updated', -COMMENT COLUMN event_date_time 'Timestamp of the RPC event', COMMENT COLUMN peer_id_unique_key 'Unique key associated with the identifier of the peer involved in the RPC', COMMENT COLUMN meta_client_name 'Name of the client that generated the event', COMMENT COLUMN meta_client_id 'Unique Session ID of the client that generated the event. This changes every time the client is restarted.', @@ -192,11 +192,13 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_rpc_meta_message ON CLUSTER '{cluster}' AS libp2p_rpc_meta_message_local -ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_message_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_message_local, unique_key); CREATE TABLE libp2p_rpc_meta_subscription_local ON CLUSTER '{cluster}' ( unique_key Int64, + updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), + event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), control_index Int32 CODEC(DoubleDelta, ZSTD(1)), rpc_meta_unique_key Int64, subscribe Bool, @@ -204,8 +206,6 @@ CREATE TABLE libp2p_rpc_meta_subscription_local ON CLUSTER '{cluster}' topic_fork_digest_value LowCardinality(String), topic_name LowCardinality(String), topic_encoding LowCardinality(String), - updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), - event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), peer_id_unique_key Int64, meta_client_name LowCardinality(String), meta_client_id String CODEC(ZSTD(1)), @@ -223,12 +223,14 @@ CREATE TABLE libp2p_rpc_meta_subscription_local ON CLUSTER '{cluster}' meta_client_geo_autonomous_system_organization Nullable(String) CODEC(ZSTD(1)), meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) -ORDER BY (event_date_time, control_index); +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +ORDER BY (event_date_time, unique_key, control_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_subscription_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the RPC subscriptions from the peer.', COMMENT COLUMN unique_key 'Unique identifier for each RPC subscription record', +COMMENT COLUMN updated_date_time 'Timestamp when the RPC subscription record was last updated', +COMMENT COLUMN event_date_time 'Timestamp of the RPC subscription event', COMMENT COLUMN control_index 'Position in the RPC meta subscription array', COMMENT COLUMN rpc_meta_unique_key 'Unique key associated with the RPC subscription metadata', COMMENT COLUMN subscribe 'Boolean indicating if it is a subscription or unsubscription', @@ -236,8 +238,6 @@ COMMENT COLUMN topic_layer 'Layer of the topic', COMMENT COLUMN topic_fork_digest_value 'Fork digest value of the topic', COMMENT COLUMN topic_name 'Name of the topic', COMMENT COLUMN topic_encoding 'Encoding of the topic', -COMMENT COLUMN updated_date_time 'Timestamp when the RPC subscription record was last updated', -COMMENT COLUMN event_date_time 'Timestamp of the RPC subscription event', COMMENT COLUMN peer_id_unique_key 'Unique key associated with the identifier of the peer involved in the subscription', COMMENT COLUMN meta_client_name 'Name of the client that generated the event', COMMENT COLUMN meta_client_id 'Unique Session ID of the client that generated the event. This changes every time the client is restarted.', @@ -257,11 +257,13 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_rpc_meta_subscription ON CLUSTER '{cluster}' AS libp2p_rpc_meta_subscription_local -ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_subscription_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_subscription_local, unique_key); CREATE TABLE libp2p_rpc_meta_control_ihave_local ON CLUSTER '{cluster}' ( unique_key Int64, + updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), + event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), rpc_meta_unique_key Int64, message_index Int32 CODEC(DoubleDelta, ZSTD(1)), control_index Int32 CODEC(DoubleDelta, ZSTD(1)), @@ -270,8 +272,6 @@ CREATE TABLE libp2p_rpc_meta_control_ihave_local ON CLUSTER '{cluster}' topic_name LowCardinality(String), topic_encoding LowCardinality(String), message_id String CODEC(ZSTD(1)), - updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), - event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), peer_id_unique_key Int64, meta_client_name LowCardinality(String), meta_client_id String CODEC(ZSTD(1)), @@ -289,12 +289,14 @@ CREATE TABLE libp2p_rpc_meta_control_ihave_local ON CLUSTER '{cluster}' meta_client_geo_autonomous_system_organization Nullable(String) CODEC(ZSTD(1)), meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) -ORDER BY (event_date_time, control_index, message_index); +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +ORDER BY (event_date_time, unique_key, control_index, message_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_control_ihave_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the "I have" control messages from the peer.', COMMENT COLUMN unique_key 'Unique identifier for each "I have" control record', +COMMENT COLUMN updated_date_time 'Timestamp when the "I have" control record was last updated', +COMMENT COLUMN event_date_time 'Timestamp of the "I have" control event', COMMENT COLUMN control_index 'Position in the RPC meta control IWANT array', COMMENT COLUMN message_index 'Position in the RPC meta control IWANT message_ids array', COMMENT COLUMN rpc_meta_unique_key 'Unique key associated with the "I have" control metadata', @@ -303,8 +305,6 @@ COMMENT COLUMN topic_fork_digest_value 'Fork digest value of the topic', COMMENT COLUMN topic_name 'Name of the topic', COMMENT COLUMN topic_encoding 'Encoding of the topic', COMMENT COLUMN message_id 'Identifier of the message associated with the "I have" control', -COMMENT COLUMN updated_date_time 'Timestamp when the "I have" control record was last updated', -COMMENT COLUMN event_date_time 'Timestamp of the "I have" control event', COMMENT COLUMN peer_id_unique_key 'Unique key associated with the identifier of the peer involved in the I have control', COMMENT COLUMN meta_client_name 'Name of the client that generated the event', COMMENT COLUMN meta_client_id 'Unique Session ID of the client that generated the event. This changes every time the client is restarted.', @@ -324,17 +324,17 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_rpc_meta_control_ihave ON CLUSTER '{cluster}' AS libp2p_rpc_meta_control_ihave_local -ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_control_ihave_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_control_ihave_local, unique_key); CREATE TABLE libp2p_rpc_meta_control_iwant_local ON CLUSTER '{cluster}' ( unique_key Int64, + updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), + event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), control_index Int32 CODEC(DoubleDelta, ZSTD(1)), message_index Int32 CODEC(DoubleDelta, ZSTD(1)), rpc_meta_unique_key Int64, message_id String CODEC(ZSTD(1)), - updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), - event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), peer_id_unique_key Int64, meta_client_name LowCardinality(String), meta_client_id String CODEC(ZSTD(1)), @@ -352,18 +352,18 @@ CREATE TABLE libp2p_rpc_meta_control_iwant_local ON CLUSTER '{cluster}' meta_client_geo_autonomous_system_organization Nullable(String) CODEC(ZSTD(1)), meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) -ORDER BY (event_date_time, control_index, message_index); +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +ORDER BY (event_date_time, unique_key, control_index, message_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_control_iwant_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the "I want" control messages from the peer.', COMMENT COLUMN unique_key 'Unique identifier for each "I want" control record', +COMMENT COLUMN updated_date_time 'Timestamp when the "I want" control record was last updated', +COMMENT COLUMN event_date_time 'Timestamp of the "I want" control event', COMMENT COLUMN message_index 'Position in the RPC meta control IWANT message_ids array', COMMENT COLUMN control_index 'Position in the RPC meta control IWANT array', COMMENT COLUMN rpc_meta_unique_key 'Unique key associated with the "I want" control metadata', COMMENT COLUMN message_id 'Identifier of the message associated with the "I want" control', -COMMENT COLUMN updated_date_time 'Timestamp when the "I want" control record was last updated', -COMMENT COLUMN event_date_time 'Timestamp of the "I want" control event', COMMENT COLUMN peer_id_unique_key 'Unique key associated with the identifier of the peer involved in the I want control', COMMENT COLUMN meta_client_name 'Name of the client that generated the event', COMMENT COLUMN meta_client_id 'Unique Session ID of the client that generated the event. This changes every time the client is restarted.', @@ -383,19 +383,19 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_rpc_meta_control_iwant ON CLUSTER '{cluster}' AS libp2p_rpc_meta_control_iwant_local -ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_control_iwant_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_control_iwant_local, unique_key); CREATE TABLE libp2p_rpc_meta_control_graft_local ON CLUSTER '{cluster}' ( unique_key Int64, + updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), + event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), control_index Int32 CODEC(DoubleDelta, ZSTD(1)), rpc_meta_unique_key Int64, topic_layer LowCardinality(String), topic_fork_digest_value LowCardinality(String), topic_name LowCardinality(String), topic_encoding LowCardinality(String), - updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), - event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), peer_id_unique_key Int64, meta_client_name LowCardinality(String), meta_client_id String CODEC(ZSTD(1)), @@ -413,20 +413,20 @@ CREATE TABLE libp2p_rpc_meta_control_graft_local ON CLUSTER '{cluster}' meta_client_geo_autonomous_system_organization Nullable(String) CODEC(ZSTD(1)), meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) -ORDER BY (event_date_time, control_index); +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +ORDER BY (event_date_time, unique_key, control_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_control_graft_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the "Graft" control messages from the peer.', COMMENT COLUMN unique_key 'Unique identifier for each "Graft" control record', +COMMENT COLUMN updated_date_time 'Timestamp when the "Graft" control record was last updated', +COMMENT COLUMN event_date_time 'Timestamp of the "Graft" control event', COMMENT COLUMN control_index 'Position in the RPC meta control GRAFT array', COMMENT COLUMN rpc_meta_unique_key 'Unique key associated with the "Graft" control metadata', COMMENT COLUMN topic_layer 'Layer of the topic', COMMENT COLUMN topic_fork_digest_value 'Fork digest value of the topic', COMMENT COLUMN topic_name 'Name of the topic', COMMENT COLUMN topic_encoding 'Encoding of the topic', -COMMENT COLUMN updated_date_time 'Timestamp when the "Graft" control record was last updated', -COMMENT COLUMN event_date_time 'Timestamp of the "Graft" control event', COMMENT COLUMN peer_id_unique_key 'Unique key associated with the identifier of the peer involved in the Graft control', COMMENT COLUMN meta_client_name 'Name of the client that generated the event', COMMENT COLUMN meta_client_id 'Unique Session ID of the client that generated the event. This changes every time the client is restarted.', @@ -446,13 +446,15 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_rpc_meta_control_graft ON CLUSTER '{cluster}' AS libp2p_rpc_meta_control_graft_local -ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_control_graft_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_control_graft_local, unique_key); CREATE TABLE libp2p_rpc_meta_control_prune_local ON CLUSTER '{cluster}' ( unique_key Int64, - rpc_meta_unique_key Int64, + updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), + event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), control_index Int32 CODEC(DoubleDelta, ZSTD(1)), + rpc_meta_unique_key Int64, peer_id_index Int32 CODEC(DoubleDelta, ZSTD(1)), peer_id_unique_key Int64, graft_peer_id_unique_key Int64, @@ -460,8 +462,6 @@ CREATE TABLE libp2p_rpc_meta_control_prune_local ON CLUSTER '{cluster}' topic_fork_digest_value LowCardinality(String), topic_name LowCardinality(String), topic_encoding LowCardinality(String), - updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), - event_date_time DateTime64(3) CODEC(DoubleDelta, ZSTD(1)), meta_client_name LowCardinality(String), meta_client_id String CODEC(ZSTD(1)), meta_client_version LowCardinality(String), @@ -478,13 +478,15 @@ CREATE TABLE libp2p_rpc_meta_control_prune_local ON CLUSTER '{cluster}' meta_client_geo_autonomous_system_organization Nullable(String) CODEC(ZSTD(1)), meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) -ORDER BY (event_date_time, control_index); +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +ORDER BY (event_date_time, unique_key, control_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_control_prune_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the "Prune" control messages from the peer.', -COMMENT COLUMN control_index 'Position in the RPC meta control PRUNE array', COMMENT COLUMN unique_key 'Unique identifier for each "Prune" control record', +COMMENT COLUMN updated_date_time 'Timestamp when the "Prune" control record was last updated', +COMMENT COLUMN event_date_time 'Timestamp of the "Prune" control event', +COMMENT COLUMN control_index 'Position in the RPC meta control PRUNE array', COMMENT COLUMN rpc_meta_unique_key 'Unique key associated with the "Prune" control metadata', COMMENT COLUMN peer_id_unique_key 'Unique key associated with the identifier of the peer involved in the Prune control', COMMENT COLUMN graft_peer_id_unique_key 'Unique key associated with the identifier of the graft peer involved in the Prune control', @@ -492,8 +494,6 @@ COMMENT COLUMN topic_layer 'Layer of the topic', COMMENT COLUMN topic_fork_digest_value 'Fork digest value of the topic', COMMENT COLUMN topic_name 'Name of the topic', COMMENT COLUMN topic_encoding 'Encoding of the topic', -COMMENT COLUMN updated_date_time 'Timestamp when the "Prune" control record was last updated', -COMMENT COLUMN event_date_time 'Timestamp of the "Prune" control event', COMMENT COLUMN meta_client_name 'Name of the client that generated the event', COMMENT COLUMN meta_client_id 'Unique Session ID of the client that generated the event. This changes every time the client is restarted.', COMMENT COLUMN meta_client_version 'Version of the client that generated the event', @@ -512,7 +512,7 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_rpc_meta_control_prune ON CLUSTER '{cluster}' AS libp2p_rpc_meta_control_prune_local -ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_control_prune_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_rpc_meta_control_prune_local, unique_key); -- Creating local and distributed tables for libp2p_recv_rpc CREATE TABLE libp2p_recv_rpc_local ON CLUSTER '{cluster}' @@ -539,7 +539,7 @@ CREATE TABLE libp2p_recv_rpc_local ON CLUSTER '{cluster}' meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_recv_rpc_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the RPC messages received by the peer.', @@ -565,7 +565,7 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_recv_rpc ON CLUSTER '{cluster}' AS libp2p_recv_rpc_local -ENGINE = Distributed('{cluster}', default, libp2p_recv_rpc_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_recv_rpc_local, unique_key); -- Creating local and distributed tables for libp2p_send_rpc CREATE TABLE libp2p_send_rpc_local ON CLUSTER '{cluster}' @@ -592,7 +592,7 @@ CREATE TABLE libp2p_send_rpc_local ON CLUSTER '{cluster}' meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_send_rpc_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the RPC messages sent by the peer.', @@ -618,7 +618,7 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_send_rpc ON CLUSTER '{cluster}' AS libp2p_send_rpc_local -ENGINE = Distributed('{cluster}', default, libp2p_send_rpc_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_send_rpc_local, unique_key); -- Creating local and distributed tables for libp2p_join CREATE TABLE libp2p_join_local ON CLUSTER '{cluster}' @@ -649,7 +649,7 @@ CREATE TABLE libp2p_join_local ON CLUSTER '{cluster}' meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_join_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the JOIN events from the libp2p client.', @@ -679,7 +679,7 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_join ON CLUSTER '{cluster}' AS libp2p_join_local -ENGINE = Distributed('{cluster}', default, libp2p_join_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_join_local, unique_key); -- Creating local and distributed tables for libp2p_connected CREATE TABLE libp2p_connected_local ON CLUSTER '{cluster}' @@ -727,7 +727,7 @@ CREATE TABLE libp2p_connected_local ON CLUSTER '{cluster}' meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_connected_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the CONNECTED events from the libp2p client.', @@ -774,7 +774,7 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_connected ON CLUSTER '{cluster}' AS libp2p_connected_local -ENGINE = Distributed('{cluster}', default, libp2p_connected_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_connected_local, unique_key); -- Creating local and distributed tables for libp2p_disconnected CREATE TABLE libp2p_disconnected_local ON CLUSTER '{cluster}' @@ -822,7 +822,7 @@ CREATE TABLE libp2p_disconnected_local ON CLUSTER '{cluster}' meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_disconnected_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the details of the DISCONNECTED events from the libp2p client.', @@ -869,4 +869,4 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_disconnected ON CLUSTER '{cluster}' AS libp2p_disconnected_local -ENGINE = Distributed('{cluster}', default, libp2p_disconnected_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_disconnected_local, unique_key); diff --git a/deploy/migrations/clickhouse/033_libp2p_trace_metadata_status.up.sql b/deploy/migrations/clickhouse/033_libp2p_trace_metadata_status.up.sql index d0832cf8..1ec29cac 100644 --- a/deploy/migrations/clickhouse/033_libp2p_trace_metadata_status.up.sql +++ b/deploy/migrations/clickhouse/033_libp2p_trace_metadata_status.up.sql @@ -34,9 +34,9 @@ CREATE TABLE libp2p_handle_status_local ON CLUSTER '{cluster}' meta_client_geo_autonomous_system_organization Nullable(String) CODEC(ZSTD(1)), meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) -PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +PARTITION BY toStartOfMonth(event_date_time) +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_handle_status_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the status handling events for libp2p peers.', @@ -75,7 +75,7 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_handle_status ON CLUSTER '{cluster}' AS libp2p_handle_status_local -ENGINE = Distributed('{cluster}', default, libp2p_handle_status_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_handle_status_local, unique_key); CREATE TABLE libp2p_handle_metadata_local ON CLUSTER '{cluster}' ( @@ -105,9 +105,9 @@ CREATE TABLE libp2p_handle_metadata_local ON CLUSTER '{cluster}' meta_client_geo_autonomous_system_organization Nullable(String) CODEC(ZSTD(1)), meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toYYYYMM(event_date_time) -ORDER BY (event_date_time, unique_key); +ORDER BY (event_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_handle_metadata_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Contains the metadata handling events for libp2p peers.', @@ -139,4 +139,4 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_handle_metadata ON CLUSTER '{cluster}' AS libp2p_handle_metadata_local -ENGINE = Distributed('{cluster}', default, libp2p_handle_metadata_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_handle_metadata_local, unique_key); diff --git a/deploy/migrations/clickhouse/034_libp2p_gossipsub_beacon_block.up.sql b/deploy/migrations/clickhouse/034_libp2p_gossipsub_beacon_block.up.sql index 9e47c0cc..8293d9d5 100644 --- a/deploy/migrations/clickhouse/034_libp2p_gossipsub_beacon_block.up.sql +++ b/deploy/migrations/clickhouse/034_libp2p_gossipsub_beacon_block.up.sql @@ -1,5 +1,6 @@ CREATE TABLE libp2p_gossipsub_beacon_block_local on cluster '{cluster}' ( unique_key Int64, + updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), event_date_time DateTime64(3) Codec(DoubleDelta, ZSTD(1)), slot UInt32 Codec(DoubleDelta, ZSTD(1)), slot_start_date_time DateTime Codec(DoubleDelta, ZSTD(1)), @@ -35,13 +36,14 @@ CREATE TABLE libp2p_gossipsub_beacon_block_local on cluster '{cluster}' ( meta_client_geo_autonomous_system_organization Nullable(String) Codec(ZSTD(1)), meta_network_id Int32 Codec(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toStartOfMonth(slot_start_date_time) -ORDER BY (slot_start_date_time, meta_network_name, meta_client_name); +ORDER BY (slot_start_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_gossipsub_beacon_block_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Table for libp2p gossipsub beacon block data.', COMMENT COLUMN unique_key 'Unique identifier for each record', +COMMENT COLUMN updated_date_time 'Timestamp when the record was last updated', COMMENT COLUMN event_date_time 'Timestamp of the event with millisecond precision', COMMENT COLUMN slot 'Slot number associated with the event', COMMENT COLUMN slot_start_date_time 'Start date and time of the slot', @@ -79,4 +81,4 @@ COMMENT COLUMN meta_network_id 'Network ID associated with the client', COMMENT COLUMN meta_network_name 'Name of the network associated with the client'; CREATE TABLE libp2p_gossipsub_beacon_block on cluster '{cluster}' AS libp2p_gossipsub_beacon_block_local -ENGINE = Distributed('{cluster}', default, libp2p_gossipsub_beacon_block_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_gossipsub_beacon_block_local, unique_key); diff --git a/deploy/migrations/clickhouse/035_libp2p_gossipsub_attestation.up.sql b/deploy/migrations/clickhouse/035_libp2p_gossipsub_beacon_attestation.up.sql similarity index 96% rename from deploy/migrations/clickhouse/035_libp2p_gossipsub_attestation.up.sql rename to deploy/migrations/clickhouse/035_libp2p_gossipsub_beacon_attestation.up.sql index 3059bdd1..4bb1dd2d 100644 --- a/deploy/migrations/clickhouse/035_libp2p_gossipsub_attestation.up.sql +++ b/deploy/migrations/clickhouse/035_libp2p_gossipsub_beacon_attestation.up.sql @@ -1,5 +1,6 @@ CREATE TABLE libp2p_gossipsub_beacon_attestation_local on cluster '{cluster}' ( unique_key Int64, + updated_date_time DateTime CODEC(DoubleDelta, ZSTD(1)), event_date_time DateTime64(3) Codec(DoubleDelta, ZSTD(1)), slot UInt32 Codec(DoubleDelta, ZSTD(1)), slot_start_date_time DateTime Codec(DoubleDelta, ZSTD(1)), @@ -44,13 +45,14 @@ CREATE TABLE libp2p_gossipsub_beacon_attestation_local on cluster '{cluster}' ( meta_client_geo_autonomous_system_organization Nullable(String) Codec(ZSTD(1)), meta_network_id Int32 Codec(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) -) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', unique_key) +) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) PARTITION BY toStartOfMonth(slot_start_date_time) -ORDER BY (slot_start_date_time, meta_network_name, meta_client_name); +ORDER BY (slot_start_date_time, unique_key, meta_network_name, meta_client_name); ALTER TABLE libp2p_gossipsub_beacon_attestation_local ON CLUSTER '{cluster}' MODIFY COMMENT 'Table for libp2p gossipsub beacon attestation data.', COMMENT COLUMN unique_key 'Unique identifier for each record', +COMMENT COLUMN updated_date_time 'Timestamp when the record was last updated', COMMENT COLUMN event_date_time 'Timestamp of the event with millisecond precision', COMMENT COLUMN slot 'Slot number associated with the event', COMMENT COLUMN slot_start_date_time 'Start date and time of the slot', @@ -97,4 +99,4 @@ COMMENT COLUMN meta_network_id 'Network ID associated with the client', COMMENT COLUMN meta_network_name 'Name of the network associated with the client'; CREATE TABLE libp2p_gossipsub_beacon_attestation on cluster '{cluster}' AS libp2p_gossipsub_beacon_attestation_local -ENGINE = Distributed('{cluster}', default, libp2p_gossipsub_beacon_attestation_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_gossipsub_beacon_attestation_local, unique_key); From eed1d18c71f1132792ff832e14982e0a9a183467 Mon Sep 17 00:00:00 2001 From: Sam Calder-Mason Date: Mon, 29 Apr 2024 17:27:53 +1000 Subject: [PATCH 4/7] feat: Add grafana dashboards --- .../dashboards/xatu/basic_overview.json | 212 +- .../grafana/dashboards/xatu/gossipsub.json | 8198 +++++++++-------- deploy/local/docker-compose/xatu-server.yaml | 4 +- 3 files changed, 4432 insertions(+), 3982 deletions(-) diff --git a/deploy/local/docker-compose/grafana/dashboards/xatu/basic_overview.json b/deploy/local/docker-compose/grafana/dashboards/xatu/basic_overview.json index d67b33d0..b2842d05 100644 --- a/deploy/local/docker-compose/grafana/dashboards/xatu/basic_overview.json +++ b/deploy/local/docker-compose/grafana/dashboards/xatu/basic_overview.json @@ -81,7 +81,7 @@ "overrides": [] }, "gridPos": { - "h": 10, + "h": 8, "w": 9, "x": 0, "y": 0 @@ -180,7 +180,7 @@ "overrides": [] }, "gridPos": { - "h": 10, + "h": 8, "w": 15, "x": 9, "y": 0 @@ -283,10 +283,10 @@ "overrides": [] }, "gridPos": { - "h": 10, + "h": 8, "w": 9, "x": 0, - "y": 10 + "y": 8 }, "id": 2, "options": { @@ -382,10 +382,10 @@ "overrides": [] }, "gridPos": { - "h": 10, + "h": 8, "w": 15, "x": 9, - "y": 10 + "y": 8 }, "id": 3, "options": { @@ -424,6 +424,204 @@ ], "title": "Vector to Clickhouse", "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 9, + "x": 0, + "y": 16 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "xatu_processor_items_queued", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{processor}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Xatu Queue", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 9, + "y": 16 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(xatu_processor_items_failed_total[$__interval])", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{processor}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Xatu Failed export", + "type": "timeseries" } ], "refresh": "", @@ -433,7 +631,7 @@ "list": [] }, "time": { - "from": "now-30m", + "from": "now-3h", "to": "now" }, "timepicker": {}, diff --git a/deploy/local/docker-compose/grafana/dashboards/xatu/gossipsub.json b/deploy/local/docker-compose/grafana/dashboards/xatu/gossipsub.json index c3a73534..5356e75a 100644 --- a/deploy/local/docker-compose/grafana/dashboards/xatu/gossipsub.json +++ b/deploy/local/docker-compose/grafana/dashboards/xatu/gossipsub.json @@ -1,4265 +1,4517 @@ { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "dark-red", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": true, - "tags": [], - "type": "tags" - }, - "type": "dashboard" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "expr": "", - "iconColor": "red", - "name": "Slot annotations", - "target": { - "limit": 2000, - "matchAny": true, - "refId": "Anno", - "tags": [ - "slot", - "xatu" - ], - "type": "tags" - } - } - ] - }, - "description": "", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "id": 4, - "links": [], - "liveNow": false, - "panels": [ + "annotations": { + "list": [ { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" }, - "id": 28, - "panels": [], - "title": "Summary", - "type": "row" + "enable": true, + "hide": true, + "iconColor": "dark-red", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": true, + "tags": [], + "type": "tags" + }, + "type": "dashboard" }, { "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue", - "value": null - } - ] - } - }, - "overrides": [] + "type": "datasource", + "uid": "grafana" }, - "gridPos": { - "h": 8, - "w": 4, - "x": 0, - "y": 1 - }, - "id": 30, - "interval": "$interval", - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "enable": true, + "expr": "", + "iconColor": "red", + "name": "Slot annotations", + "target": { + "limit": 2000, + "matchAny": true, + "refId": "Anno", + "tags": [ + "slot", + "xatu" + ], + "type": "tags" + } + } + ] + }, + "description": "", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 5, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 28, + "panels": [], + "title": "Summary", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.4.2", - "targets": [ - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "editorType": "sql", - "format": 0, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "count", - "alias": "", - "column": "meta_client_name" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "meta_client_name", - "operator": "IN", - "type": "LowCardinality(String)", - "value": [ - "${client_name}" - ] - }, - { - "condition": "AND", - "filterType": "custom", - "key": "meta_network_name", - "operator": "IN", - "type": "LowCardinality(String)", - "value": [ - "${network_name}" - ] - } - ], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_block" + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null } - }, - "pluginVersion": "4.0.6", - "queryType": "timeseries", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n count(DISTINCT(meta_client_name))\nFROM default.libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from:date:seconds})\n AND slot_start_date_time <= (toDateTime(${__to:date:seconds}) - INTERVAL 1 MINUTE)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY time\nORDER BY time\nLIMIT 1000", - "refId": "A" + ] } - ], - "title": "Active sentries", - "type": "stat" + }, + "overrides": [] }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "gridPos": { + "h": 8, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 30, + "interval": "$interval", + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ { - "color": "green", - "value": null + "aggregateType": "count", + "alias": "", + "column": "meta_client_name" } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 4, - "x": 4, - "y": 1 - }, - "id": 34, - "interval": "$interval", - "options": { - "basemap": { - "config": {}, - "name": "Layer 0", - "type": "default" - }, - "controls": { - "mouseWheelZoom": true, - "showAttribution": true, - "showDebug": false, - "showMeasure": false, - "showScale": false, - "showZoom": true - }, - "layers": [ - { - "config": { - "showLegend": false, - "style": { - "color": { - "fixed": "dark-green" - }, - "opacity": 0.4, - "rotation": { - "fixed": 0, - "max": 360, - "min": -360, - "mode": "mod" - }, - "size": { - "field": "count", - "fixed": 5, - "max": 5, - "min": 2 - }, - "symbol": { - "fixed": "img/icons/marker/circle.svg", - "mode": "fixed" - }, - "text": { - "fixed": "", - "mode": "field" - }, - "textConfig": { - "fontSize": 12, - "offsetX": 0, - "offsetY": 0, - "textAlign": "center", - "textBaseline": "middle" - } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" } - }, - "filterData": { - "id": "byRefId", - "options": "A" - }, - "location": { - "geohash": "meta_client_geo_city", - "latitude": "latitude", - "longitude": "longitude", - "mode": "coords" - }, - "name": "Layer 1", - "tooltip": true, - "type": "markers" - } - ], - "tooltip": { - "mode": "details" - }, - "view": { - "allLayers": true, - "id": "coords", - "lat": 5.747627, - "lon": 22, - "zoom": 1 - } - }, - "pluginVersion": "10.4.2", - "targets": [ - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "count", - "column": "meta_client_name" - } - ], - "columns": [ - { - "name": "meta_client_geo_longitude" - }, - { - "name": "meta_client_geo_latitude" - }, - { - "name": "meta_client_geo_city" - }, - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [], - "groupBy": [ - "meta_client_geo_longitude", - "meta_client_geo_latitude", - "meta_client_geo_city" - ], - "mode": "aggregate", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_block" - } - }, - "pluginVersion": "4.0.6", - "queryType": "table", - "rawSql": "SELECT\n meta_client_geo_latitude as latitude,\n meta_client_geo_longitude as longitude,\n meta_client_geo_city as city,\n count(DISTINCT meta_client_name) as `count`\n \nFROM \n libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= now() - toIntervalMinute(2)\n AND slot_start_date_time <= now() - toIntervalMinute(1)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY\n slot_start_date_time,\n meta_client_geo_longitude,\n meta_client_geo_latitude,\n meta_client_geo_city\nORDER BY slot_start_date_time DESC\nLIMIT 1 by latitude, longitude\n", - "refId": "A" - } - ], - "title": "Active Sentries", - "type": "geomap" - }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "P5C0FA5C61C0F8586" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "meta_client_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${client_name}" + ] + }, { - "color": "blue", - "value": null + "condition": "AND", + "filterType": "custom", + "key": "meta_network_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${network_name}" + ] } - ] + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" } }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 4, - "x": 8, - "y": 1 - }, - "id": 193, - "interval": "$interval", - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.4.2", - "targets": [ - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "P5C0FA5C61C0F8586" - }, - "refId": "A" - } - ], - "title": "Peers sending us blocks", - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 54, - "panels": [], - "title": "Summary per client", - "type": "row" + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n count(DISTINCT(meta_client_name))\nFROM default.libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from:date:seconds})\n AND slot_start_date_time <= (toDateTime(${__to:date:seconds}) - INTERVAL 1 MINUTE)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY time\nORDER BY time\nLIMIT 1000", + "refId": "A" + } + ], + "title": "Active sentries", + "type": "stat" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue", - "value": null - } - ] + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false } }, - "overrides": [] + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "gridPos": { - "h": 4, - "w": 12, - "x": 0, - "y": 10 + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 4, + "y": 1 + }, + "id": 34, + "interval": "$interval", + "options": { + "basemap": { + "config": {}, + "name": "Layer 0", + "type": "default" }, - "id": 46, - "interval": "$interval", - "maxPerRow": 12, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "controls": { + "mouseWheelZoom": true, + "showAttribution": true, + "showDebug": false, + "showMeasure": false, + "showScale": false, + "showZoom": true }, - "pluginVersion": "10.4.2", - "repeat": "geo_continent_code", - "repeatDirection": "h", - "targets": [ + "layers": [ { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "editorType": "sql", - "format": 0, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "count", - "alias": "", - "column": "meta_client_name" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "meta_client_name", - "operator": "IN", - "type": "LowCardinality(String)", - "value": [ - "${client_name}" - ] - }, - { - "condition": "AND", - "filterType": "custom", - "key": "meta_network_name", - "operator": "IN", - "type": "LowCardinality(String)", - "value": [ - "${network_name}" - ] - } - ], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_block" + "config": { + "showLegend": false, + "style": { + "color": { + "fixed": "dark-green" + }, + "opacity": 0.4, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "field": "count", + "fixed": 5, + "max": 5, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "text": { + "fixed": "", + "mode": "field" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } } }, - "pluginVersion": "4.0.6", - "queryType": "timeseries", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n count(DISTINCT(meta_client_name))\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from:date:seconds})\n AND slot_start_date_time <= (toDateTime(${__to:date:seconds}) - INTERVAL 1 MINUTE)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code = '${geo_continent_code}'\nGROUP BY time\nORDER BY time\nLIMIT 1000", - "refId": "A" + "filterData": { + "id": "byRefId", + "options": "A" + }, + "location": { + "geohash": "meta_client_geo_city", + "latitude": "latitude", + "longitude": "longitude", + "mode": "coords" + }, + "name": "Layer 1", + "tooltip": true, + "type": "markers" } ], - "title": "Active sentries ${geo_continent_code}", - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 14 + "tooltip": { + "mode": "details" }, - "id": 17, - "panels": [], - "title": "Blocks", - "type": "row" + "view": { + "allLayers": true, + "id": "coords", + "lat": 5.747627, + "lon": 22, + "zoom": 1 + } }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineStyle": { - "dash": [ - 10, - 10 - ], - "fill": "dash" - }, - "lineWidth": 2, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 4, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "dtdurationms" + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "max" - }, - "properties": [ + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ { - "id": "custom.fillBelowTo", - "value": "p95" - }, + "aggregateType": "count", + "column": "meta_client_name" + } + ], + "columns": [ { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } + "name": "meta_client_geo_longitude" }, { - "id": "custom.fillOpacity", - "value": 15 + "name": "meta_client_geo_latitude" }, { - "id": "custom.lineWidth", - "value": 0 + "name": "meta_client_geo_city" }, { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "average" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "fill": "solid" - } - }, + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_geo_longitude", + "meta_client_geo_latitude", + "meta_client_geo_city" + ], + "mode": "aggregate", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n meta_client_geo_latitude as latitude,\n meta_client_geo_longitude as longitude,\n meta_client_geo_city as city,\n count(DISTINCT meta_client_name) as `count`\n \nFROM \n libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= now() - toIntervalMinute(2)\n AND slot_start_date_time <= now() - toIntervalMinute(1)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY\n slot_start_date_time,\n meta_client_geo_longitude,\n meta_client_geo_latitude,\n meta_client_geo_city\nORDER BY slot_start_date_time DESC\nLIMIT 1 by latitude, longitude\n", + "refId": "A" + } + ], + "title": "Active Sentries", + "type": "geomap" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 8, + "y": 1 + }, + "id": 193, + "interval": "$interval", + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } + "aggregateType": "count", + "alias": "", + "column": "meta_client_name" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p95" - }, - "properties": [ + ], + "columns": [ { - "id": "custom.fillBelowTo", - "value": "p05" + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p05" - }, - "properties": [ + ], + "database": "default", + "filters": [ { - "id": "custom.fillBelowTo", - "value": "min" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } + "condition": "AND", + "filterType": "custom", + "key": "meta_client_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${client_name}" + ] }, { - "id": "custom.fillOpacity", - "value": 15 - }, + "condition": "AND", + "filterType": "custom", + "key": "meta_network_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${network_name}" + ] + } + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n count(DISTINCT(peer_id_unique_key))\nFROM default.libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from:date:seconds})\n AND slot_start_date_time <= (toDateTime(${__to:date:seconds}) - INTERVAL 1 MINUTE)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY time\nORDER BY time\nLIMIT 1000", + "refId": "A" + } + ], + "title": "Peers sending us blocks", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 54, + "panels": [], + "title": "Summary per client", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 46, + "interval": "$interval", + "maxPerRow": 12, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "repeat": "geo_continent_code", + "repeatDirection": "h", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ { - "id": "custom.lineWidth", - "value": 0 - }, + "aggregateType": "count", + "alias": "", + "column": "meta_client_name" + } + ], + "columns": [ { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "min" - }, - "properties": [ + ], + "database": "default", + "filters": [ { - "id": "custom.lineWidth", - "value": 0 + "condition": "AND", + "filterType": "custom", + "key": "meta_client_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${client_name}" + ] }, { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } + "condition": "AND", + "filterType": "custom", + "key": "meta_network_name", + "operator": "IN", + "type": "LowCardinality(String)", + "value": [ + "${network_name}" + ] } - ] + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n count(DISTINCT(meta_client_name))\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from:date:seconds})\n AND slot_start_date_time <= (toDateTime(${__to:date:seconds}) - INTERVAL 1 MINUTE)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code = '${geo_continent_code}'\nGROUP BY time\nORDER BY time\nLIMIT 1000", + "refId": "A" + } + ], + "title": "Active sentries ${geo_continent_code}", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 14 + }, + "id": 17, + "panels": [], + "title": "Blocks", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "matcher": { - "id": "byName", - "options": "p95" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 0 - } - ] + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" }, - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 4 - } - ] + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" }, - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "p95", - "average", - "p50", - "p05", - "min" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ] - }, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 15 - }, - "id": 36, - "interval": "$interval_tight", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" }, - "targets": [ + "overrides": [ { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "avg", - "alias": "average", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "max", - "alias": "max", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "min", - "alias": "min", - "column": "propagation_slot_start_diff" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "propagation_slot_start_diff", - "operator": "<", - "type": "UInt32", - "value": 30000 - } - ], - "groupBy": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" - } + "matcher": { + "id": "byName", + "options": "max" }, - "pluginVersion": "4.0.6", - "queryType": "table", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(propagation_slot_start_diff) max,\n quantile(0.95)(propagation_slot_start_diff) p95,\n avg(propagation_slot_start_diff) average,\n quantile(0.50)(propagation_slot_start_diff) p50,\n quantile(0.05)(propagation_slot_start_diff) p05,\n min(propagation_slot_start_diff) min\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", - "refId": "A" - } - ], - "title": "Block arrival time in slot", - "type": "timeseries" - }, - { - "cards": {}, - "color": { - "cardColor": "#b4ff00", - "colorScale": "sqrt", - "colorScheme": "interpolateYlOrRd", - "exponent": 0.5, - "mode": "spectrum" - }, - "dataFormat": "tsbuckets", - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDE22E36FB877C574" - }, - "fieldConfig": { - "defaults": { - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "scaleDistribution": { - "type": "linear" - } - } - }, - "overrides": [] - }, - "gridPos": { - "h": 13, - "w": 24, - "x": 0, - "y": 24 - }, - "heatmap": {}, - "hideZeroBuckets": false, - "highlightCards": true, - "id": 39, - "interval": "$interval_tight", - "legend": { - "show": true - }, - "options": { - "calculate": false, - "calculation": { - "xBuckets": { - "mode": "size" - } - }, - "cellGap": 2, - "cellValues": {}, - "color": { - "exponent": 0.5, - "fill": "#b4ff00", - "mode": "scheme", - "reverse": false, - "scale": "exponential", - "scheme": "Plasma", - "steps": 128 - }, - "exemplars": { - "color": "rgba(255,0,255,0.7)" - }, - "filterValues": { - "le": 1e-9 - }, - "legend": { - "show": true - }, - "rowsFrame": { - "layout": "le" - }, - "showValue": "never", - "tooltip": { - "mode": "single", - "showColorScale": false, - "yHistogram": false - }, - "yAxis": { - "axisPlacement": "left", - "reverse": false, - "unit": "dtdurationms" - } - }, - "pluginVersion": "10.4.2", - "reverseYBuckets": false, - "targets": [ - { - "database": "default", - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDE22E36FB877C574" - }, - "dateTimeColDataType": "slot_start_date_time", - "dateTimeType": "DATETIME", - "editorMode": "builder", - "extrapolate": true, - "format": "time_series", - "formattedQuery": "SELECT\n $timeSeries + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, $heatmap_interval)), $heatmap_interval) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE $timeFilter\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY\n timestamp,\n diff", - "hide": false, - "intervalFactor": 1, - "query": "SELECT\n $timeSeries + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, $heatmap_interval)), $heatmap_interval) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE $timeFilter\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY\n timestamp,\n diff", - "rawQuery": "SELECT\n (intDiv(toUInt32(slot_start_date_time), 60) * 60) * 1000 + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, 250)), 250) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE slot_start_date_time >= toDateTime(1714092003) AND slot_start_date_time <= toDateTime(1714113603)\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN ('xatu-cl-mimicry-sfo3-holesky-002','xatu-cl-mimicry-syd1-holesky-002','xatu-cl-mimicry-sfo3-holesky-001','xatu-cl-mimicry-syd1-holesky-001')\n AND meta_network_name IN ('holesky')\nGROUP BY\n timestamp,\n diff", - "refId": "A", - "round": "0s", - "skip_comments": true, - "table": "libp2p_gossipsub_beacon_block" - } - ], - "title": "Block arrival time in slot", - "tooltip": { - "show": true, - "showHistogram": false - }, - "type": "heatmap", - "xAxis": { - "show": true - }, - "yAxis": { - "format": "s", - "logBase": 1, - "show": true - }, - "yBucketBound": "auto" - }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } }, - "lineWidth": 2, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" + { + "id": "custom.fillOpacity", + "value": 15 }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + { + "id": "custom.lineWidth", + "value": 0 }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 4, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" } - ] - }, - "unit": "dtdurationms" + } + ] }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "std dev population" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] + { + "matcher": { + "id": "byName", + "options": "average" }, - { - "matcher": { - "id": "byName", - "options": "p90 - p10" + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 37 - }, - "id": 59, - "interval": "$interval_tight", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ + } + ] + }, { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "matcher": { + "id": "byName", + "options": "p95" }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "avg", - "alias": "average", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "max", - "alias": "max", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "min", - "alias": "min", - "column": "propagation_slot_start_diff" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "propagation_slot_start_diff", - "operator": "<", - "type": "UInt32", - "value": 30000 - } - ], - "groupBy": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" }, - "pluginVersion": "4.0.6", - "queryType": "table", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n stddevPop(propagation_slot_start_diff) `std dev population`,\n quantile(0.90)(propagation_slot_start_diff) - quantile(0.10)(propagation_slot_start_diff) `p90 - p10`\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND propagation_slot_start_diff < 10000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", - "refId": "A" - } - ], - "title": "Block arrival time spread", - "type": "timeseries" - }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineStyle": { - "dash": [ - 10, - 10 - ], - "fill": "dash" + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } }, - "lineWidth": 2, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" + { + "id": "custom.fillOpacity", + "value": 15 }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + { + "id": "custom.lineWidth", + "value": 0 }, - "thresholdsStyle": { - "mode": "off" + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } } + ] + }, + { + "matcher": { + "id": "byName", + "options": "min" }, - "decimals": 4, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" } - ] + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" }, - "unit": "dtdurationms" + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + } + ] }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "max" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "p95" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 15 - }, - { - "id": "custom.lineWidth", - "value": 0 - }, - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] + { + "matcher": { + "id": "byName", + "options": "p50" }, - { - "matcher": { - "id": "byName", - "options": "average" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "fill": "solid" - } - }, - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] + "properties": [ + { + "id": "custom.lineWidth", + "value": 4 + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "p95", + "average", + "p50", + "p05", + "min" + ], + "prefix": "All except:", + "readOnly": true + } }, - { - "matcher": { - "id": "byName", - "options": "p95" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "p05" + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p05" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "min" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 15 - }, + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 36, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ { - "id": "custom.lineWidth", - "value": 0 + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" }, { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "min" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 0 + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" }, { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p95" - }, - "properties": [ + ], + "columns": [ { - "id": "custom.lineWidth", - "value": 0 + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ + ], + "database": "default", + "filters": [ { - "id": "custom.lineWidth", - "value": 4 + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 } - ] + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(propagation_slot_start_diff) max,\n quantile(0.95)(propagation_slot_start_diff) p95,\n avg(propagation_slot_start_diff) average,\n quantile(0.50)(propagation_slot_start_diff) p50,\n quantile(0.05)(propagation_slot_start_diff) p05,\n min(propagation_slot_start_diff) min\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Block arrival time in slot", + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateYlOrRd", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "P7C0E9263B64B2A80" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "p95", - "average", - "p50", - "p05", - "min" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] + "scaleDistribution": { + "type": "linear" } - ] - }, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 43 - }, - "id": 37, - "interval": "$interval_tight", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" } }, - "targets": [ - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "avg", - "alias": "average", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "max", - "alias": "max", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "min", - "alias": "min", - "column": "propagation_slot_start_diff" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "propagation_slot_start_diff", - "operator": "<", - "type": "UInt32", - "value": 30000 - } - ], - "groupBy": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" - } - }, - "pluginVersion": "4.0.6", - "queryType": "table", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(diff) max,\n quantile(0.95)(diff) p95,\n avg(diff) average,\n quantile(0.50)(diff) p50,\n quantile(0.05)(diff) p05,\n min(diff) min\nFROM (\n SELECT\n slot,\n slot_start_date_time,\n block,\n meta_network_name,\n max(propagation_slot_start_diff) - min(propagation_slot_start_diff) AS diff\n FROM libp2p_gossipsub_beacon_block FINAL\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n GROUP BY slot, slot_start_date_time, block, meta_network_name\n)\nWHERE\n diff > 0\n AND diff < 100000\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", - "refId": "A" - } - ], - "title": "Block arrival time difference between sentries (by consensus client)", - "type": "timeseries" + "overrides": [] }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "gridPos": { + "h": 13, + "w": 24, + "x": 0, + "y": 24 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 39, + "interval": "$interval_tight", + "legend": { + "show": true + }, + "options": { + "calculate": false, + "calculation": { + "xBuckets": { + "mode": "size" + } }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": -1, - "drawStyle": "line", - "fillOpacity": 23, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - } - }, - "overrides": [] + "cellGap": 2, + "cellValues": {}, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Plasma", + "steps": 128 }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 51 + "exemplars": { + "color": "rgba(255,0,255,0.7)" }, - "id": 38, - "interval": "12s", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "filterValues": { + "le": 1e-9 }, - "pluginVersion": "9.2.1", - "targets": [ - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "le" + }, + "showValue": "never", + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "dtdurationms" + } + }, + "pluginVersion": "10.4.2", + "reverseYBuckets": false, + "targets": [ + { + "database": "default", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "P7C0E9263B64B2A80" + }, + "dateTimeColDataType": "slot_start_date_time", + "dateTimeType": "DATETIME", + "editorMode": "builder", + "extrapolate": true, + "format": "time_series", + "formattedQuery": "SELECT\n $timeSeries + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, $heatmap_interval)), $heatmap_interval) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE $timeFilter\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY\n timestamp,\n diff", + "hide": false, + "intervalFactor": 1, + "query": "SELECT\n $timeSeries + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, $heatmap_interval)), $heatmap_interval) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE $timeFilter\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY\n timestamp,\n diff", + "rawQuery": "SELECT\n (intDiv(toUInt32(slot_start_date_time), 60) * 60) * 1000 + 12000 as timestamp,\n multiply(floor(divide(propagation_slot_start_diff, 250)), 250) as diff,\n count() as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE slot_start_date_time >= toDateTime(1714092003) AND slot_start_date_time <= toDateTime(1714113603)\n AND propagation_slot_start_diff < 100000\n AND meta_client_name IN ('xatu-cl-mimicry-sfo3-holesky-002','xatu-cl-mimicry-syd1-holesky-002','xatu-cl-mimicry-sfo3-holesky-001','xatu-cl-mimicry-syd1-holesky-001')\n AND meta_network_name IN ('holesky')\nGROUP BY\n timestamp,\n diff", + "refId": "A", + "round": "0s", + "skip_comments": true, + "table": "libp2p_gossipsub_beacon_block" + } + ], + "title": "Block arrival time in slot", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "count", - "alias": "name", - "column": "meta_client_name" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [], - "groupBy": [ - "meta_client_name" - ], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" - } + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" }, - "pluginVersion": "4.0.6", - "queryType": "table", - "rawSql": "SELECT\n slot_start_date_time,\n count(DISTINCT(block))\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY slot_start_date_time\nORDER BY slot_start_date_time ASC\nLIMIT 10000", - "refId": "A" - } - ], - "title": "Unique Blocks per slot", - "type": "timeseries" - }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" - } - ] + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 51 - }, - "id": 31, - "interval": "$interval", - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] }, - "textMode": "auto" + "unit": "dtdurationms" }, - "pluginVersion": "10.2.0", - "targets": [ + "overrides": [ { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "matcher": { + "id": "byName", + "options": "std dev population" }, - "editorType": "sql", - "format": 0, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "max", - "alias": "", - "column": "epoch" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_block" - } - }, - "pluginVersion": "4.0.6", - "queryType": "timeseries", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(epoch)\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", - "refId": "A" - } - ], - "title": "Latest epoch", - "type": "stat" - }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 51 - }, - "id": 32, - "interval": "$interval", - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + } + ] }, - "textMode": "auto" - }, - "pluginVersion": "10.2.0", - "targets": [ { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "matcher": { + "id": "byName", + "options": "p90 - p10" }, - "editorType": "sql", - "format": 0, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "max", - "alias": "", - "column": "slot" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_block" + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } } - }, - "pluginVersion": "4.0.6", - "queryType": "timeseries", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(slot)\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000\n", - "refId": "A" + ] } - ], - "title": "Latest slot", - "type": "stat" + ] }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 37 + }, + "id": 59, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": -1, - "drawStyle": "line", - "fillOpacity": 23, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ { - "color": "green" + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" }, { - "color": "red", - "value": 80 + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" } - ] + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" } }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 57 - }, - "id": 156, - "interval": "$interval_tight", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.1", - "targets": [ - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n stddevPop(propagation_slot_start_diff) `std dev population`,\n quantile(0.90)(propagation_slot_start_diff) - quantile(0.10)(propagation_slot_start_diff) `p90 - p10`\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND propagation_slot_start_diff < 10000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Block arrival time spread", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "count", - "alias": "name", - "column": "meta_client_name" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [], - "groupBy": [ - "meta_client_name" - ], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" - } + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" }, - "pluginVersion": "4.0.6", - "queryType": "table", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n meta_client_name as name,\n COUNT(block) as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time, meta_client_name\nORDER BY time ASC\nLIMIT 100000", - "refId": "A" - } - ], - "title": "Blocks per instance", - "transformations": [ - { - "id": "partitionByValues", - "options": { - "fields": [ - "name" - ] + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - } - ], - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 66 - }, - "id": 174, - "panels": [], - "title": "Block size", - "type": "row" - }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max" }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineStyle": { - "dash": [ - 10, - 10 - ], - "fill": "dash" + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } }, - "lineWidth": 2, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" + { + "id": "custom.fillOpacity", + "value": 15 }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + { + "id": "custom.lineWidth", + "value": 0 }, - "thresholdsStyle": { - "mode": "off" + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/^(?!bucketed_bytes$).+$/" }, - "properties": [ - { - "id": "unit", - "value": "ms" - }, - { - "id": "max" + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" } - ] + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" }, - { - "matcher": { - "id": "byName", - "options": "max" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "p95" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 15 - }, - { - "id": "custom.lineWidth", - "value": 0 - }, - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" }, - { - "matcher": { - "id": "byName", - "options": "average" + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" }, - "properties": [ - { - "id": "custom.lineStyle" - }, - { - "id": "color", - "value": { - "fixedColor": "light-green", - "mode": "fixed" - } + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p95" }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "p05" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p05" + { + "id": "custom.fillOpacity", + "value": 15 }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "min" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 15 - }, - { - "id": "custom.lineWidth", - "value": 0 - }, - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "min" + { + "id": "custom.lineWidth", + "value": 0 }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 0 - }, - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" } - ] + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "min" }, - { - "matcher": { - "id": "byName", - "options": "p95" + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 0 + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" } - ] + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" }, - { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 4 - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 17, - "x": 0, - "y": 67 - }, - "id": 173, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - }, - "xField": "bucketed_bytes" - }, - "targets": [ + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "matcher": { + "id": "byName", + "options": "p50" }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "avg", - "alias": "average", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "max", - "alias": "max", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "min", - "alias": "min", - "column": "propagation_slot_start_diff" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "propagation_slot_start_diff", - "operator": "<", - "type": "UInt32", - "value": 30000 - } + "properties": [ + { + "id": "custom.lineWidth", + "value": 4 + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "p95", + "average", + "p50", + "p05", + "min" ], - "groupBy": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + "prefix": "All except:", + "readOnly": true } }, - "pluginVersion": "4.0.6", - "queryType": "table", - "rawSql": "WITH \n filtered AS (\n SELECT \n message_size, \n floor(message_size / 25600) * 25600 AS bucketed_bytes,\n propagation_slot_start_diff\n FROM \n default.libp2p_gossipsub_beacon_block FINAL\n WHERE \n slot_start_date_time >= $__fromTime AND \n slot_start_date_time <= $__toTime AND\n propagation_slot_start_diff < 8000 AND\n meta_client_name IN (${client_name}) AND\n meta_network_name IN (${network_name}) AND\n meta_client_geo_continent_code IN (${geo_continent_code})\n )\nSELECT \n bucketed_bytes,\n MAX(propagation_slot_start_diff) AS max,\n quantile(0.95)(propagation_slot_start_diff) AS p95,\n AVG(propagation_slot_start_diff) AS avg,\n quantile(0.50)(propagation_slot_start_diff) AS p50,\n quantile(0.05)(propagation_slot_start_diff) AS p05,\n MIN(propagation_slot_start_diff) AS min\nFROM \n filtered\nGROUP BY \n bucketed_bytes\nORDER BY \n bucketed_bytes ASC;\n", - "refId": "A" + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] } - ], - "title": "Block arrival time for block size (compressed, 25KiB buckets)", - "type": "trend" + ] }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 43 + }, + "id": 37, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/^(?!bucketed_bytes$).+$/" - }, - "properties": [ + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ { - "id": "unit", - "value": "ms" + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" }, { - "id": "max" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "max" - }, - "properties": [ + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "average" - }, - "properties": [ + ], + "columns": [ { - "id": "color", - "value": { - "fixedColor": "light-green", - "mode": "fixed" - } + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p05" - }, - "properties": [ + ], + "database": "default", + "filters": [ { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 } - ] + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" } - ] - }, - "gridPos": { - "h": 9, - "w": 7, - "x": 17, - "y": 67 - }, - "id": 191, - "interval": "$interval_tight", - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false }, - "showHeader": true - }, - "pluginVersion": "10.2.0", - "targets": [ - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(diff) max,\n quantile(0.95)(diff) p95,\n avg(diff) average,\n quantile(0.50)(diff) p50,\n quantile(0.05)(diff) p05,\n min(diff) min\nFROM (\n SELECT\n slot,\n slot_start_date_time,\n block,\n meta_network_name,\n max(propagation_slot_start_diff) - min(propagation_slot_start_diff) AS diff\n FROM libp2p_gossipsub_beacon_block FINAL\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n GROUP BY slot, slot_start_date_time, block, meta_network_name\n)\nWHERE\n diff > 0\n AND diff < 100000\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Block arrival time difference between sentries (by consensus client)", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 23, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "avg", - "alias": "average", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "max", - "alias": "max", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "min", - "alias": "min", - "column": "propagation_slot_start_diff" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "propagation_slot_start_diff", - "operator": "<", - "type": "UInt32", - "value": 30000 - } - ], - "groupBy": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" - } + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" }, - "pluginVersion": "4.0.6", - "queryType": "table", - "rawSql": "WITH \n filtered AS (\n SELECT \n message_size, \n floor(message_size / 102400) * 102400 AS bucketed_bytes,\n propagation_slot_start_diff\n FROM \n default.libp2p_gossipsub_beacon_block FINAL\n WHERE \n slot_start_date_time >= $__fromTime AND \n slot_start_date_time <= $__toTime AND\n propagation_slot_start_diff < 8000 AND\n meta_client_name IN (${client_name}) AND\n meta_network_name IN (${network_name}) AND\n meta_client_geo_continent_code IN (${geo_continent_code})\n )\nSELECT \n bucketed_bytes,\n MAX(propagation_slot_start_diff) AS max,\n quantile(0.95)(propagation_slot_start_diff) AS p95,\n AVG(propagation_slot_start_diff) AS avg,\n quantile(0.50)(propagation_slot_start_diff) AS p50,\n quantile(0.05)(propagation_slot_start_diff) AS p05,\n MIN(propagation_slot_start_diff) AS min\nFROM \n filtered\nGROUP BY \n bucketed_bytes\nORDER BY \n bucketed_bytes ASC;\n", - "refId": "A" + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] } - ], - "title": "Block propagation for block size (100KiB buckets)", - "type": "table" + }, + "overrides": [] }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 76 + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 51 + }, + "id": 38, + "interval": "12s", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false }, - "id": 8, - "panels": [ - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": 300000, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 4, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "dtdurationms" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "max" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "p95" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 15 - }, - { - "id": "custom.lineWidth", - "value": 0 - }, - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "average" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "fill": "solid" - } - }, - { - "id": "color", - "value": { - "fixedColor": "orange", - "mode": "fixed" - } - } - ] - }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ { - "matcher": { - "id": "byName", - "options": "p95" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "p05" - } - ] - }, + "aggregateType": "count", + "alias": "name", + "column": "meta_client_name" + } + ], + "columns": [ { - "matcher": { - "id": "byName", - "options": "p05" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "min" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 34 - }, - { - "id": "custom.lineWidth", - "value": 1 - } - ] - }, + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n slot_start_date_time,\n count(DISTINCT(block))\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY slot_start_date_time\nORDER BY slot_start_date_time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Unique Blocks per slot", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 12, + "y": 51 + }, + "id": 31, + "interval": "$interval", + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ { - "matcher": { - "id": "byName", - "options": "min" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 2 - }, - { - "id": "custom.lineStyle", - "value": { - "fill": "solid" - } - } - ] - }, + "aggregateType": "max", + "alias": "", + "column": "epoch" + } + ], + "columns": [ { - "matcher": { - "id": "byName", - "options": "p95" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 1 - }, - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(epoch)\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Latest epoch", + "type": "stat" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 18, + "y": 51 + }, + "id": 32, + "interval": "$interval", + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.2", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 0, + "meta": { + "builderOptions": { + "aggregates": [ { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 1 - }, - { - "id": "color", - "value": { - "fixedColor": "purple", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - }, + "aggregateType": "max", + "alias": "", + "column": "slot" + } + ], + "columns": [ { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "average", - "p50", - "p05", - "min", - "p95" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" } - ] + ], + "database": "default", + "filters": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_block" + } + }, + "pluginVersion": "4.0.6", + "queryType": "timeseries", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(slot)\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000\n", + "refId": "A" + } + ], + "title": "Latest slot", + "type": "stat" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 23, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 77 + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" }, - "id": 95, - "interval": "$interval_tight", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" }, - "targets": [ + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "avg", - "alias": "average", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "max", - "alias": "max", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "min", - "alias": "min", - "column": "propagation_slot_start_diff" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "propagation_slot_start_diff", - "operator": "<", - "type": "UInt32", - "value": 30000 - } - ], - "groupBy": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" - } - }, - "pluginVersion": "4.0.3", - "queryType": "table", - "rawSql": "\nSELECT\n $__timeInterval(slot_start_date_time) as time,\n max(propagation_slot_start_diff) max,\n quantile(0.95)(propagation_slot_start_diff) p95,\n avg(propagation_slot_start_diff) average,\n quantile(0.50)(propagation_slot_start_diff) p50,\n quantile(0.05)(propagation_slot_start_diff) p05,\n min(propagation_slot_start_diff) min\nFROM default.${attestation_prefix}beacon_api_eth_v1_events_attestation\nWHERE\n $__timeFilter(slot_start_date_time)\n AND propagation_slot_start_diff < 384000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", - "refId": "A" + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 } - ], - "title": "Attestation arrival time in slot", - "type": "timeseries" + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 57 + }, + "id": 156, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" }, - { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "alias": "name", + "column": "meta_client_name" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n meta_client_name as name,\n COUNT(block) as count\nFROM default.libp2p_gossipsub_beacon_block FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY time, meta_client_name\nORDER BY time ASC\nLIMIT 100000", + "refId": "A" + } + ], + "title": "Blocks per instance", + "transformations": [ + { + "id": "partitionByValues", + "options": { + "fields": [ + "name" + ] + } + } + ], + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 66 + }, + "id": 174, + "panels": [], + "title": "Block size", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "description": "Similar to inclusion distance but instead of when it was included in a block, it's instead when a sentry saw a attestation and the \"distance\" between its target and the current slot. \"0\" being the attestation for the current slot, \"1\" being current slot - 1 etc.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "percent" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "transparent" - }, - { - "color": "#EAB839", - "value": 1 - }, - { - "color": "#6ED0E0", - "value": 2 - }, - { - "color": "#EF843C", - "value": 5 - }, - { - "color": "#E24D42", - "value": 10 - }, - { - "color": "#1F78C1", - "value": 20 - }, - { - "color": "#BA43A9", - "value": 30 - }, - { - "color": "#705DA0", - "value": 50 - }, - { - "color": "#508642", - "value": 75 - } - ] - }, - "unit": "percent" - }, - "overrides": [] + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 86 + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" }, - "id": 151, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null }, - "tooltip": { - "mode": "single", - "sort": "none" + { + "color": "red", + "value": 80 } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/^(?!bucketed_bytes$).+$/" }, - "pluginVersion": "9.2.1", - "targets": [ + "properties": [ { - "builderOptions": { - "database": "default", - "fields": [ - "event_date_time" - ], - "filters": [], - "limit": 100, - "metrics": [], - "mode": "trend", - "orderBy": [], - "table": "${table_prefix}beacon_api_eth_v1_events_attestation", - "timeField": "slot_start_date_time", - "timeFieldType": "DateTime" - }, - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "format": 1, - "meta": { - "builderOptions": { - "database": "default", - "fields": [ - "event_date_time" - ], - "filters": [], - "limit": 100, - "metrics": [], - "mode": "trend", - "orderBy": [], - "table": "${table_prefix}beacon_api_eth_v1_events_attestation", - "timeField": "slot_start_date_time", - "timeFieldType": "DateTime" - } - }, - "queryType": "sql", - "rawSql": "SELECT\n toDateTime(slot_start_date_time) as time,\n percent\nFROM \n(\n SELECT\n slot_start_date_time,\n interval,\n round((inclusion_count / interval_total) * 100, 2) AS percent\n FROM\n (\n SELECT\n slot_start_date_time,\n interval,\n inclusion_count,\n sum(inclusion_count) OVER (PARTITION BY slot_start_date_time) AS interval_total\n FROM\n (\n SELECT\n slot_start_date_time,\n floor(divide(propagation_slot_start_diff, 12000)) as interval,\n count(DISTINCT source_root, target_root, aggregation_bits, beacon_block_root, attesting_validator_index, attesting_validator_committee_index) as inclusion_count\n FROM default.${attestation_prefix}beacon_api_eth_v1_events_attestation\n\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\n GROUP BY\n slot_start_date_time,\n interval\n ORDER BY inclusion_count DESC\n )\n )\n)\nORDER BY time ASC, percent DESC", - "refId": "A", - "selectedFormat": 4 + "id": "unit", + "value": "ms" + }, + { + "id": "max" } - ], - "title": "Attestation seen distance", - "transformations": [ - { - "id": "groupBy", - "options": { - "fields": { - "percent": { - "aggregations": [ - "allValues" - ], - "operation": "aggregate" - }, - "time": { - "aggregations": [], - "operation": "groupby" - } - } - } + ] + }, + { + "matcher": { + "id": "byName", + "options": "max" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" }, { - "id": "extractFields", - "options": { - "source": "percent (allValues)" + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" } }, { - "id": "organize", - "options": { - "excludeByName": { - "percent (allValues)": true - }, - "indexByName": {}, - "renameByName": {} + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" } } - ], - "type": "timeseries" + ] }, { - "cards": {}, - "color": { - "cardColor": "#b4ff00", - "colorScale": "sqrt", - "colorScheme": "interpolateYlOrRd", - "exponent": 0.5, - "mode": "spectrum" + "matcher": { + "id": "byName", + "options": "average" }, - "dataFormat": "tsbuckets", - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDE22E36FB877C574" - }, - "fieldConfig": { - "defaults": { - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "scaleDistribution": { - "type": "linear" - } - } - }, - "overrides": [] - }, - "gridPos": { - "h": 19, - "w": 24, - "x": 0, - "y": 93 - }, - "heatmap": {}, - "hideZeroBuckets": false, - "highlightCards": true, - "id": 75, - "interval": "$interval_tight", - "legend": { - "show": true - }, - "options": { - "calculate": false, - "calculation": {}, - "cellGap": 2, - "cellValues": {}, - "color": { - "exponent": 0.5, - "fill": "#b4ff00", - "mode": "scheme", - "reverse": false, - "scale": "exponential", - "scheme": "Plasma", - "steps": 128 - }, - "exemplars": { - "color": "rgba(255,0,255,0.7)" - }, - "filterValues": { - "le": 1e-9 - }, - "legend": { - "show": true - }, - "rowsFrame": { - "layout": "le" - }, - "showValue": "never", - "tooltip": { - "show": true, - "yHistogram": false + "properties": [ + { + "id": "custom.lineStyle" }, - "yAxis": { - "axisPlacement": "left", - "reverse": false, - "unit": "dtdurationms" + { + "id": "color", + "value": { + "fixedColor": "light-green", + "mode": "fixed" + } } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" }, - "pluginVersion": "10.2.0", - "reverseYBuckets": false, - "targets": [ - { - "database": "default", - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDE22E36FB877C574" - }, - "dateColDataType": "", - "dateLoading": false, - "dateTimeColDataType": "slot_start_date_time", - "dateTimeType": "DATETIME", - "datetimeLoading": false, - "extrapolate": true, - "format": "time_series", - "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", - "interval": "", - "intervalFactor": 1, - "query": "SELECT\n $timeSeries + 12000 as timestamp,\n toUInt8(propagation_slot_start_diff / ${heatmap_interval}) * ${heatmap_interval} as diff,\n sum(toUInt16(1)) as count\nFROM ${attestation_prefix}beacon_api_eth_v1_events_attestation\n\nWHERE $timeFilter\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND diff < 30000\n AND isNotNull(attesting_validator_index)\n\nGROUP BY\n timestamp,\n diff\n \nLIMIT 10000000\n", - "rawQuery": "SELECT\n (intDiv(toUInt32(slot_start_date_time), 12) * 12) * 1000 + 12000 as timestamp,\n toUInt8(propagation_slot_start_diff / 1000) * 1000 as diff,\n sum(toUInt16(1)) as count\nFROM beacon_api_eth_v1_events_attestation\n\nWHERE slot_start_date_time >= toDateTime(1705537008) AND slot_start_date_time <= toDateTime(1705540608)\n AND meta_client_name IN ('xatu-sentry-ams3-mainnet-prysm-001','xatu-sentry-sfo3-mainnet-prysm-001','xatu-sentry-syd1-mainnet-nimbus-001','xatu-sentry-syd1-mainnet-lodestar-001','xatu-sentry-sfo3-mainnet-lighthouse-001','xatu-sentry-syd1-mainnet-teku-001','xatu-sentry-ams3-mainnet-lighthouse-001','xatu-sentry-sfo3-mainnet-lodestar-001','xatu-sentry-ams3-mainnet-teku-001','xatu-sentry-syd1-mainnet-lighthouse-001','xatu-sentry-ams3-mainnet-lodestar-001','xatu-sentry-sfo3-mainnet-teku-001','xatu-sentry-sfo3-mainnet-nimbus-001','xatu-sentry-ams3-mainnet-nimbus-001','xatu-sentry-syd1-mainnet-prysm-001')\n AND meta_network_name IN ('mainnet')\n AND meta_client_geo_continent_code IN ('OC','NA','EU')\n AND meta_consensus_implementation IN ('teku','prysm','nimbus','lodestar','lighthouse')\n AND meta_consensus_version IN ('v4.6.0-rc.0-2e8e160+','v24.1.1-8cfce8-stateofus','v1.14.0','Unknown (linux amd64)','vUNKNOWN+g44161eb')\n AND diff < 30000\n AND isNotNull(attesting_validator_index)\n\nGROUP BY\n timestamp,\n diff\n \nLIMIT 10000000", - "refId": "A", - "round": "12s", - "skip_comments": true, - "table": "${table_prefix}beacon_api_eth_v1_events_attestation", - "tableLoading": false + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" } - ], - "title": "Attestation arrival time in slot", - "tooltip": { - "show": true, - "showHistogram": false - }, - "type": "heatmap", - "xAxis": { - "show": true - }, - "yAxis": { - "format": "s", - "logBase": 1, - "show": true - }, - "yBucketBound": "auto" + ] }, { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "description": "For a given slot, what beacon block roots had attestations against them", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "percent" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "transparent" - }, - { - "color": "#EAB839", - "value": 1 - }, - { - "color": "#6ED0E0", - "value": 2 - }, - { - "color": "#EF843C", - "value": 5 - }, - { - "color": "#E24D42", - "value": 10 - }, - { - "color": "#1F78C1", - "value": 20 - }, - { - "color": "#BA43A9", - "value": 30 - }, - { - "color": "#705DA0", - "value": 50 - }, - { - "color": "#508642", - "value": 75 - } - ] - }, - "unit": "percent" - }, - "overrides": [] + "matcher": { + "id": "byName", + "options": "p05" }, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 112 - }, - "id": 117, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.1", - "targets": [ { - "builderOptions": { - "database": "default", - "fields": [ - "event_date_time" - ], - "filters": [], - "limit": 100, - "metrics": [], - "mode": "trend", - "orderBy": [], - "table": "${table_prefix}beacon_api_eth_v1_events_attestation", - "timeField": "slot_start_date_time", - "timeFieldType": "DateTime" - }, - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "format": 1, - "meta": { - "builderOptions": { - "database": "default", - "fields": [ - "event_date_time" - ], - "filters": [], - "limit": 100, - "metrics": [], - "mode": "trend", - "orderBy": [], - "table": "${table_prefix}beacon_api_eth_v1_events_attestation", - "timeField": "slot_start_date_time", - "timeFieldType": "DateTime" - } - }, - "queryType": "sql", - "rawSql": "SELECT\n toDateTime(slot_start_date_time) as time,\n percent\nFROM \n(\n SELECT\n slot_start_date_time,\n beacon_block_root,\n round((attestation_count / beacon_block_root_total) * 100, 2) AS percent\n FROM\n (\n SELECT\n slot_start_date_time,\n beacon_block_root,\n attestation_count,\n sum(attestation_count) OVER (PARTITION BY slot_start_date_time) AS beacon_block_root_total\n FROM\n (\n SELECT\n slot_start_date_time,\n beacon_block_root,\n sum(toUInt32(1)) AS attestation_count\n FROM default.${attestation_prefix}beacon_api_eth_v1_events_attestation\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\n GROUP BY\n slot_start_date_time,\n beacon_block_root\n ORDER BY attestation_count DESC\n )\n )\n)\nORDER BY time ASC, percent DESC", - "refId": "A", - "selectedFormat": 4 - } - ], - "title": "Attestation agreement", - "transformations": [ - { - "id": "groupBy", - "options": { - "fields": { - "percent": { - "aggregations": [ - "allValues" - ], - "operation": "aggregate" - }, - "time": { - "aggregations": [], - "operation": "groupby" - } - } + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" } }, { - "id": "extractFields", - "options": { - "source": "percent (allValues)" - } + "id": "custom.fillOpacity", + "value": 15 }, { - "id": "organize", - "options": { - "excludeByName": { - "percent (allValues)": true - }, - "indexByName": {}, - "renameByName": {} + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" } } - ], - "type": "timeseries" + ] }, { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "matcher": { + "id": "byName", + "options": "min" }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": 300000, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 2, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 4, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "dtdurationms" + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "std dev population" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p90 - p10" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" } - ] - }, - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 119 - }, - "id": 100, - "interval": "$interval_tight", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" }, - "targets": [ + "properties": [ { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "avg", - "alias": "average", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "max", - "alias": "max", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "min", - "alias": "min", - "column": "propagation_slot_start_diff" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "propagation_slot_start_diff", - "operator": "<", - "type": "UInt32", - "value": 30000 - } - ], - "groupBy": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" - } - }, - "pluginVersion": "4.0.3", - "queryType": "table", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n stddevPop(propagation_slot_start_diff) `std dev population`,\n quantile(0.90)(propagation_slot_start_diff) - quantile(0.10)(propagation_slot_start_diff) `p90 - p10`\nFROM default.${attestation_prefix}beacon_api_eth_v1_events_attestation\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\n AND propagation_slot_start_diff < 384000\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", - "refId": "A" + "id": "custom.lineWidth", + "value": 0 } - ], - "title": "Attestation arrival time spread", - "type": "timeseries" + ] }, { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "matcher": { + "id": "byName", + "options": "p50" }, - "description": "The difference between when an attestation is seen by the first and last sentry", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": 3600000, - "lineInterpolation": "smooth", - "lineStyle": { - "dash": [ - 10, - 10 - ], - "fill": "dash" - }, - "lineWidth": 2, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "properties": [ + { + "id": "custom.lineWidth", + "value": 4 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 17, + "x": 0, + "y": 67 + }, + "id": 173, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xField": "bucketed_bytes" + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" }, - "decimals": 4, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" }, - "unit": "dtdurationms" - }, - "overrides": [ { - "matcher": { - "id": "byName", - "options": "max" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "p95" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 15 - }, - { - "id": "custom.lineWidth", - "value": 0 - }, - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "average" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "fill": "solid" - } - }, - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p95" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "p05" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p05" - }, - "properties": [ - { - "id": "custom.fillBelowTo", - "value": "min" - }, - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 15 - }, - { - "id": "custom.lineWidth", - "value": 0 - }, - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "min" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 0 - }, - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "p95" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 0 - } - ] - }, + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ { - "matcher": { - "id": "byName", - "options": "p50" - }, - "properties": [ - { - "id": "custom.lineWidth", - "value": 4 - } - ] - }, + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "p95", - "average", - "p50", - "p05", - "min" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 } - ] - }, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 125 + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "WITH \n filtered AS (\n SELECT \n message_size, \n floor(message_size / 25600) * 25600 AS bucketed_bytes,\n propagation_slot_start_diff\n FROM \n default.libp2p_gossipsub_beacon_block FINAL\n WHERE \n slot_start_date_time >= $__fromTime AND \n slot_start_date_time <= $__toTime AND\n propagation_slot_start_diff < 8000 AND\n meta_client_name IN (${client_name}) AND\n meta_network_name IN (${network_name}) AND\n meta_client_geo_continent_code IN (${geo_continent_code})\n )\nSELECT \n bucketed_bytes,\n MAX(propagation_slot_start_diff) AS max,\n quantile(0.95)(propagation_slot_start_diff) AS p95,\n AVG(propagation_slot_start_diff) AS avg,\n quantile(0.50)(propagation_slot_start_diff) AS p50,\n quantile(0.05)(propagation_slot_start_diff) AS p05,\n MIN(propagation_slot_start_diff) AS min\nFROM \n filtered\nGROUP BY \n bucketed_bytes\nORDER BY \n bucketed_bytes ASC;\n", + "refId": "A" + } + ], + "title": "Block arrival time for block size (compressed, 25KiB buckets)", + "type": "trend" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" }, - "id": 41, - "interval": "$interval_loose", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "inspect": false + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null }, - "tooltip": { - "mode": "multi", - "sort": "none" + { + "color": "red", + "value": 80 } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/^(?!bucketed_bytes$).+$/" }, - "targets": [ + "properties": [ { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "editorType": "sql", - "format": 1, - "meta": { - "builderOptions": { - "aggregates": [ - { - "aggregateType": "avg", - "alias": "average", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "max", - "alias": "max", - "column": "propagation_slot_start_diff" - }, - { - "aggregateType": "min", - "alias": "min", - "column": "propagation_slot_start_diff" - } - ], - "columns": [ - { - "hint": "time", - "name": "slot_start_date_time", - "type": "DateTime" - } - ], - "database": "default", - "filters": [ - { - "condition": "AND", - "filterType": "custom", - "key": "propagation_slot_start_diff", - "operator": "<", - "type": "UInt32", - "value": 30000 - } - ], - "groupBy": [], - "limit": 100, - "mode": "trend", - "orderBy": [], - "queryType": "timeseries", - "table": "${table_prefix}beacon_api_eth_v1_events_attestation" - } - }, - "pluginVersion": "4.0.3", - "queryType": "table", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(diff) max,\n quantile(0.95)(diff) p95,\n avg(diff) average,\n quantile(0.50)(diff) p50,\n quantile(0.05)(diff) p05,\n min(diff) min\nFROM (\n SELECT\n slot,\n slot_start_date_time,\n aggregation_bits,\n committee_index,\n meta_network_name,\n max(propagation_slot_start_diff) - min(propagation_slot_start_diff) AS diff,\n COUNT(*) as count\n FROM ${attestation_prefix}beacon_api_eth_v1_events_attestation\n WHERE\n $__timeFilter(slot_start_date_time)\n AND slot_start_date_time <= toDateTime(${__to:date:seconds})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\n AND isNotNull(attesting_validator_index)\n GROUP BY slot, slot_start_date_time, aggregation_bits, committee_index, meta_network_name\n HAVING diff > 0 AND diff < 30000 AND count > 1\n)\nGROUP BY time\nORDER BY time ASC\nLIMIT 100000\n", - "refId": "A" + "id": "unit", + "value": "ms" + }, + { + "id": "max" } - ], - "title": "Attestation propagation difference between sentries", - "transformations": [], - "type": "timeseries" + ] }, { - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" + "matcher": { + "id": "byName", + "options": "max" }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": -1, - "drawStyle": "line", - "fillOpacity": 23, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": 300000, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" } - }, - "overrides": [] - }, - "gridPos": { - "h": 11, - "w": 24, - "x": 0, - "y": 133 - }, - "id": 3, - "interval": "$interval_tight", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" }, - "pluginVersion": "9.2.1", - "targets": [ - { - "builderOptions": { - "database": "default", - "fields": [], - "filters": [], - "groupBy": [ - "meta_client_name" - ], - "limit": 100, - "metrics": [ - { - "aggregation": "count", - "alias": "name", - "field": "meta_client_name" - } - ], - "mode": "trend", - "orderBy": [], - "table": "${table_prefix}beacon_api_eth_v1_events_attestation", - "timeField": "slot_start_date_time", - "timeFieldType": "DateTime" - }, - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "format": 1, - "meta": { - "builderOptions": { - "database": "default", - "fields": [], - "filters": [], - "groupBy": [ - "meta_client_name" - ], - "limit": 100, - "metrics": [ - { - "aggregation": "count", - "alias": "name", - "field": "meta_client_name" - } - ], - "mode": "trend", - "orderBy": [], - "table": "${table_prefix}beacon_api_eth_v1_events_attestation", - "timeField": "slot_start_date_time", - "timeFieldType": "DateTime" - } - }, - "queryType": "sql", - "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n meta_client_name as name,\n sumMerge(attestations) as count\nFROM default.${table_prefix}beacon_api_slot\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND meta_consensus_implementation IN (${consensus_implementation})\n AND meta_consensus_version IN (${consensus_version})\nGROUP BY time, meta_client_name\nORDER BY time ASC\nLIMIT 10000", - "refId": "A", - "selectedFormat": 4 - } - ], - "title": "Attestations per sentry", - "transformations": [ + "properties": [ { - "id": "partitionByValues", - "options": { - "fields": [ - "name" - ] + "id": "color", + "value": { + "fixedColor": "light-green", + "mode": "fixed" } } - ], - "type": "timeseries" - } - ], - "title": "Attestations", - "type": "row" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": true, - "text": [ - "mainnet" - ], - "value": [ - "mainnet" ] }, - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "definition": "SELECT meta_network_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\nGROUP BY meta_network_name ", - "hide": 0, - "includeAll": true, - "label": "Network", - "multi": true, - "name": "network_name", - "options": [], - "query": "SELECT meta_network_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\nGROUP BY meta_network_name ", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - }, - { - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" + { + "matcher": { + "id": "byName", + "options": "p05" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } ] - }, - "datasource": { - "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "definition": "SELECT meta_client_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_name ", - "hide": 0, - "includeAll": true, - "label": "Sentry", - "multi": true, - "name": "client_name", - "options": [], - "query": "SELECT meta_client_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_name ", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" + } + ] + }, + "gridPos": { + "h": 9, + "w": 7, + "x": 17, + "y": 67 + }, + "id": 191, + "interval": "$interval_tight", + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false }, + "showHeader": true + }, + "pluginVersion": "10.4.2", + "targets": [ { - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, "datasource": { "type": "grafana-clickhouse-datasource", - "uid": "PDF61E9E97939C7ED" - }, - "definition": "SELECT meta_client_geo_continent_code\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_geo_continent_code ", - "hide": 0, - "includeAll": true, - "label": "Continent", - "multi": true, - "name": "geo_continent_code", - "options": [], - "query": "SELECT meta_client_geo_continent_code\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_geo_continent_code ", - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "250", - "value": "250" + "uid": "P5C0FA5C61C0F8586" }, - "hide": 0, - "includeAll": false, - "label": "Heatmap interval (MS)", - "multi": false, - "name": "heatmap_interval", - "options": [ - { - "selected": false, - "text": "100", - "value": "100" - }, - { - "selected": true, - "text": "250", - "value": "250" + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" } - ], - "query": "100,250", - "queryValue": "", - "skipUrlSync": false, - "type": "custom" - }, - { - "auto": true, - "auto_count": 300, - "auto_min": "12s", - "current": { - "selected": false, - "text": "auto", - "value": "$__auto_interval_interval_tight" }, - "hide": 2, - "name": "interval_tight", - "options": [ - { - "selected": true, - "text": "auto", - "value": "$__auto_interval_interval_tight" - }, - { - "selected": false, - "text": "12s", - "value": "12s" + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "WITH \n filtered AS (\n SELECT \n message_size, \n floor(message_size / 102400) * 102400 AS bucketed_bytes,\n propagation_slot_start_diff\n FROM \n default.libp2p_gossipsub_beacon_block FINAL\n WHERE \n slot_start_date_time >= $__fromTime AND \n slot_start_date_time <= $__toTime AND\n propagation_slot_start_diff < 8000 AND\n meta_client_name IN (${client_name}) AND\n meta_network_name IN (${network_name}) AND\n meta_client_geo_continent_code IN (${geo_continent_code})\n )\nSELECT \n bucketed_bytes,\n MAX(propagation_slot_start_diff) AS max,\n quantile(0.95)(propagation_slot_start_diff) AS p95,\n AVG(propagation_slot_start_diff) AS avg,\n quantile(0.50)(propagation_slot_start_diff) AS p50,\n quantile(0.05)(propagation_slot_start_diff) AS p05,\n MIN(propagation_slot_start_diff) AS min\nFROM \n filtered\nGROUP BY \n bucketed_bytes\nORDER BY \n bucketed_bytes ASC;\n", + "refId": "A" + } + ], + "title": "Block propagation for block size (100KiB buckets)", + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 76 + }, + "id": 8, + "panels": [], + "title": "Attestations", + "type": "row" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "selected": false, - "text": "60s", - "value": "60s" + "insertNulls": 300000, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" }, - { - "selected": false, - "text": "384s", - "value": "384s" + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" }, - { - "selected": false, - "text": "3840s", - "value": "3840s" + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - { - "selected": false, - "text": "92160s", - "value": "92160s" + "thresholdsStyle": { + "mode": "off" } - ], - "query": "12s,60s,384s,3840s,92160s", - "refresh": 2, - "skipUrlSync": false, - "type": "interval" - }, - { - "auto": true, - "auto_count": 50, - "auto_min": "12s", - "current": { - "selected": false, - "text": "auto", - "value": "$__auto_interval_interval" }, - "hide": 2, - "name": "interval", - "options": [ - { - "selected": true, - "text": "auto", - "value": "$__auto_interval_interval" - }, - { - "selected": false, - "text": "12s", - "value": "12s" + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max" }, - { - "selected": false, - "text": "60s", - "value": "60s" + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" }, - { - "selected": false, - "text": "384s", - "value": "384s" + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } + }, + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" }, - { - "selected": false, - "text": "3840s", - "value": "3840s" + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" }, - { - "selected": false, - "text": "92160s", - "value": "92160s" - } - ], - "query": "12s,60s,384s,3840s,92160s", - "refresh": 2, - "skipUrlSync": false, - "type": "interval" - }, - { - "auto": true, - "auto_count": 50, - "auto_min": "12s", - "current": { - "selected": false, - "text": "auto", - "value": "$__auto_interval_interval_loose" + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 34 + }, + { + "id": "custom.lineWidth", + "value": 1 + } + ] }, - "hide": 2, - "name": "interval_loose", - "options": [ - { - "selected": true, - "text": "auto", - "value": "$__auto_interval_interval_loose" + { + "matcher": { + "id": "byName", + "options": "min" }, - { - "selected": false, - "text": "384s", - "value": "384s" + "properties": [ + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" }, - { - "selected": false, - "text": "3840s", - "value": "3840s" + "properties": [ + { + "id": "custom.lineWidth", + "value": 1 + }, + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p50" }, - { - "selected": false, - "text": "92160s", - "value": "92160s" - } - ], - "query": "384s,3840s,92160s", - "refresh": 2, - "skipUrlSync": false, - "type": "interval" + "properties": [ + { + "id": "custom.lineWidth", + "value": 1 + }, + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 77 + }, + "id": 95, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ { - "current": { - "selected": true, - "text": "", - "value": "" + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" }, - "description": "Table prefix", - "hide": 0, - "label": "Prefix", - "name": "table_prefix", - "options": [ - { - "selected": true, - "text": "", - "value": "" + "editorType": "sql", + "format": 1, + "hide": false, + "meta": { + "builderOptions": { + "columns": [], + "database": "", + "limit": 1000, + "mode": "list", + "queryType": "table", + "table": "" } - ], - "query": "", - "skipUrlSync": false, - "type": "textbox" - }, - { - "current": { - "selected": true, - "text": "", - "value": "" }, - "description": "Table prefix for attestations", - "hide": 0, - "label": "Attestation Prefix", - "name": "attestation_prefix", - "options": [ - { - "selected": true, - "text": "", - "value": "" - } - ], - "query": "", - "skipUrlSync": false, - "type": "textbox" + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(propagation_slot_start_diff) as max,\n quantile(0.95)(propagation_slot_start_diff) as p95,\n avg(propagation_slot_start_diff) as average,\n quantile(0.50)(propagation_slot_start_diff) as p50,\n quantile(0.05)(propagation_slot_start_diff) as p05,\n min(propagation_slot_start_diff) as min\nFROM default.libp2p_gossipsub_beacon_attestation FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND (wallclock_slot - slot) < 2\n AND isNotNull(attesting_validator_index)\n AND propagation_slot_start_diff < 384000\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" } - ] + ], + "title": "Attestation arrival time in slot", + "type": "timeseries" }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Gossipsub Events", - "uid": "d49d224e-0b6a-4319-b968-63afd535db55", - "version": 1, - "weekStart": "" - } \ No newline at end of file + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "description": "Similar to inclusion distance but instead of when it was included in a block, it's instead when a sentry saw a attestation and the \"distance\" between its target and the current slot. \"0\" being the attestation for the current slot, \"1\" being current slot - 1 etc.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "#EAB839", + "value": 1 + }, + { + "color": "#6ED0E0", + "value": 2 + }, + { + "color": "#EF843C", + "value": 5 + }, + { + "color": "#E24D42", + "value": 10 + }, + { + "color": "#1F78C1", + "value": 20 + }, + { + "color": "#BA43A9", + "value": 30 + }, + { + "color": "#705DA0", + "value": 50 + }, + { + "color": "#508642", + "value": 75 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 86 + }, + "id": 151, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [], + "columns": [ + { + "name": "event_date_time" + }, + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n toDateTime(slot_start_date_time) as time,\n percent\nFROM \n(\n SELECT\n slot_start_date_time,\n interval,\n round((inclusion_count / interval_total) * 100, 2) AS percent\n FROM\n (\n SELECT\n slot_start_date_time,\n interval,\n inclusion_count,\n sum(inclusion_count) OVER (PARTITION BY slot_start_date_time) AS interval_total\n FROM\n (\n SELECT\n slot_start_date_time,\n floor(divide(propagation_slot_start_diff, 12000)) as interval,\n count(DISTINCT source_root, target_root, aggregation_bits, beacon_block_root, attesting_validator_index, attesting_validator_committee_index) as inclusion_count\n FROM default.libp2p_gossipsub_beacon_attestation FINAL\n\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND isNotNull(attesting_validator_index)\n GROUP BY\n slot_start_date_time,\n interval\n ORDER BY inclusion_count DESC\n )\n )\n)\nORDER BY time ASC, percent DESC", + "refId": "A" + } + ], + "title": "Attestation seen distance", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "percent": { + "aggregations": [ + "allValues" + ], + "operation": "aggregate" + }, + "time": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "extractFields", + "options": { + "source": "percent (allValues)" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "percent (allValues)": true + }, + "indexByName": {}, + "renameByName": {} + } + } + ], + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateYlOrRd", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "P7C0E9263B64B2A80" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 19, + "w": 24, + "x": 0, + "y": 93 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 75, + "interval": "$interval_tight", + "legend": { + "show": true + }, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": {}, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Plasma", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "le" + }, + "showValue": "never", + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "dtdurationms" + } + }, + "pluginVersion": "10.4.2", + "reverseYBuckets": false, + "targets": [ + { + "database": "default", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "P7C0E9263B64B2A80" + }, + "dateColDataType": "", + "dateLoading": false, + "dateTimeColDataType": "slot_start_date_time", + "dateTimeType": "DATETIME", + "datetimeLoading": false, + "editorMode": "builder", + "extrapolate": true, + "format": "time_series", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "interval": "", + "intervalFactor": 1, + "query": "SELECT\n $timeSeries + 12000 as timestamp,\n toUInt8(propagation_slot_start_diff / ${heatmap_interval}) * ${heatmap_interval} as diff,\n sum(toUInt16(1)) as count\nFROM default.libp2p_gossipsub_beacon_attestation FINAL\n\nWHERE $timeFilter\n AND (wallclock_slot - slot) < 2\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND diff < 30000\n AND isNotNull(attesting_validator_index)\n\nGROUP BY\n timestamp,\n diff\n \nLIMIT 10000000\n", + "rawQuery": "SELECT\n (intDiv(toUInt32(slot_start_date_time), 12) * 12) * 1000 + 12000 as timestamp,\n toUInt8(propagation_slot_start_diff / 250) * 250 as diff,\n sum(toUInt16(1)) as count\nFROM default.libp2p_gossipsub_beacon_attestation FINAL\n\nWHERE slot_start_date_time >= toDateTime(1714369860) AND slot_start_date_time <= toDateTime(1714373460)\n AND (wallclock_slot - slot) < 2\n AND meta_client_name IN ('example-instance')\n AND meta_network_name IN ('mainnet')\n AND meta_client_geo_continent_code IN ('')\n AND diff < 30000\n AND isNotNull(attesting_validator_index)\n\nGROUP BY\n timestamp,\n diff\n \nLIMIT 10000000", + "refId": "A", + "round": "12s", + "skip_comments": true, + "table": "libp2p_gossipsub_beacon_attestation", + "tableLoading": false + } + ], + "title": "Attestation arrival time in slot", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "description": "For a given slot, what beacon block roots had attestations against them", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "#EAB839", + "value": 1 + }, + { + "color": "#6ED0E0", + "value": 2 + }, + { + "color": "#EF843C", + "value": 5 + }, + { + "color": "#E24D42", + "value": 10 + }, + { + "color": "#1F78C1", + "value": 20 + }, + { + "color": "#BA43A9", + "value": 30 + }, + { + "color": "#705DA0", + "value": 50 + }, + { + "color": "#508642", + "value": 75 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 112 + }, + "id": 117, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [], + "columns": [ + { + "name": "event_date_time" + }, + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n toDateTime(slot_start_date_time) as time,\n percent\nFROM \n(\n SELECT\n slot_start_date_time,\n beacon_block_root,\n round((attestation_count / beacon_block_root_total) * 100, 2) AS percent\n FROM\n (\n SELECT\n slot_start_date_time,\n beacon_block_root,\n attestation_count,\n sum(attestation_count) OVER (PARTITION BY slot_start_date_time) AS beacon_block_root_total\n FROM\n (\n SELECT\n slot_start_date_time,\n beacon_block_root,\n sum(toUInt32(1)) AS attestation_count\n FROM default.libp2p_gossipsub_beacon_attestation FINAL\n WHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND isNotNull(attesting_validator_index)\n GROUP BY\n slot_start_date_time,\n beacon_block_root\n ORDER BY attestation_count DESC\n )\n )\n)\nORDER BY time ASC, percent DESC", + "refId": "A" + } + ], + "title": "Attestation agreement", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "percent": { + "aggregations": [ + "allValues" + ], + "operation": "aggregate" + }, + "time": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "extractFields", + "options": { + "source": "percent (allValues)" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "percent (allValues)": true + }, + "indexByName": {}, + "renameByName": {} + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 300000, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "std dev population" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p90 - p10" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 119 + }, + "id": 100, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n stddevPop(propagation_slot_start_diff) `std dev population`,\n quantile(0.90)(propagation_slot_start_diff) - quantile(0.10)(propagation_slot_start_diff) `p90 - p10`\nFROM default.libp2p_gossipsub_beacon_attestation FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND (wallclock_slot - slot) < 2\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND isNotNull(attesting_validator_index)\n AND propagation_slot_start_diff < 384000\nGROUP BY time\nORDER BY time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Attestation arrival time spread", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "description": "The difference between when an attestation is seen by the first and last instance", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 3600000, + "lineInterpolation": "smooth", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p95" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "average" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "fill": "solid" + } + }, + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "p05" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p05" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "min" + }, + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 15 + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "min" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p95" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "p50" + }, + "properties": [ + { + "id": "custom.lineWidth", + "value": 4 + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "p95", + "average", + "p50", + "p05", + "min" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 125 + }, + "id": 41, + "interval": "$interval_loose", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "avg", + "alias": "average", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "max", + "alias": "max", + "column": "propagation_slot_start_diff" + }, + { + "aggregateType": "min", + "alias": "min", + "column": "propagation_slot_start_diff" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [ + { + "condition": "AND", + "filterType": "custom", + "key": "propagation_slot_start_diff", + "operator": "<", + "type": "UInt32", + "value": 30000 + } + ], + "groupBy": [], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n max(diff) max,\n quantile(0.95)(diff) p95,\n avg(diff) average,\n quantile(0.50)(diff) p50,\n quantile(0.05)(diff) p05,\n min(diff) min\nFROM (\n SELECT\n slot,\n slot_start_date_time,\n aggregation_bits,\n committee_index,\n meta_network_name,\n max(propagation_slot_start_diff) - min(propagation_slot_start_diff) AS diff,\n COUNT(*) as count\n FROM default.libp2p_gossipsub_beacon_attestation FINAL\n WHERE\n $__timeFilter(slot_start_date_time)\n AND slot_start_date_time <= toDateTime(${__to:date:seconds})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\n AND isNotNull(attesting_validator_index)\n GROUP BY slot, slot_start_date_time, aggregation_bits, committee_index, meta_network_name\n HAVING diff > 0 AND diff < 30000 AND count > 1\n)\nGROUP BY time\nORDER BY time ASC\nLIMIT 100000\n", + "refId": "A" + } + ], + "title": "Attestation propagation difference between instances", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 23, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 300000, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 133 + }, + "id": 3, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "alias": "name", + "column": "meta_client_name" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n meta_client_name as name,\n COUNT(*) as count\nFROM\n default.libp2p_gossipsub_beacon_attestation FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY\n meta_client_name, time\nORDER BY\n meta_client_name, time\n", + "refId": "A" + } + ], + "title": "Attestations per instance", + "transformations": [ + { + "id": "partitionByValues", + "options": { + "fields": [ + "name" + ] + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 23, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 300000, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 13, + "x": 0, + "y": 144 + }, + "id": 194, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "alias": "name", + "column": "meta_client_name" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n $__timeInterval(slot_start_date_time) as time,\n topic_name,\n COUNT(*) as count\nFROM\n default.libp2p_gossipsub_beacon_attestation FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY\n topic_name, time\nORDER BY\n topic_name, time\n", + "refId": "A" + } + ], + "title": "Attestations per subnet", + "transformations": [ + { + "id": "partitionByValues", + "options": { + "fields": [ + "topic_name" + ], + "keepFields": false, + "naming": { + "asLabels": false + } + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "line", + "fillOpacity": 23, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 300000, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 1, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 11, + "x": 13, + "y": 144 + }, + "id": 195, + "interval": "$interval_tight", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.2.1", + "targets": [ + { + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "editorType": "sql", + "format": 1, + "meta": { + "builderOptions": { + "aggregates": [ + { + "aggregateType": "count", + "alias": "name", + "column": "meta_client_name" + } + ], + "columns": [ + { + "hint": "time", + "name": "slot_start_date_time", + "type": "DateTime" + } + ], + "database": "default", + "filters": [], + "groupBy": [ + "meta_client_name" + ], + "limit": 100, + "mode": "trend", + "orderBy": [], + "queryType": "timeseries", + "table": "${table_prefix}beacon_api_eth_v1_events_attestation" + } + }, + "pluginVersion": "4.0.6", + "queryType": "table", + "rawSql": "SELECT\n slot_start_date_time,\n count(DISTINCT(beacon_block_root))\nFROM default.libp2p_gossipsub_beacon_attestation FINAL\nWHERE\n $__timeFilter(slot_start_date_time)\n AND meta_client_name IN (${client_name})\n AND meta_network_name IN (${network_name})\n AND meta_client_geo_continent_code IN (${geo_continent_code})\nGROUP BY slot_start_date_time\nORDER BY slot_start_date_time ASC\nLIMIT 10000", + "refId": "A" + } + ], + "title": "Unique block roots per slot", + "transformations": [ + { + "id": "partitionByValues", + "options": { + "fields": [ + "name" + ] + } + } + ], + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "mainnet" + ], + "value": [ + "mainnet" + ] + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "definition": "SELECT meta_network_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\nGROUP BY meta_network_name ", + "hide": 0, + "includeAll": true, + "label": "Network", + "multi": true, + "name": "network_name", + "options": [], + "query": "SELECT meta_network_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\nGROUP BY meta_network_name ", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "definition": "SELECT meta_client_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_name ", + "hide": 0, + "includeAll": true, + "label": "Sentry", + "multi": true, + "name": "client_name", + "options": [], + "query": "SELECT meta_client_name\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_name ", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": { + "type": "grafana-clickhouse-datasource", + "uid": "P5C0FA5C61C0F8586" + }, + "definition": "SELECT meta_client_geo_continent_code\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_geo_continent_code ", + "hide": 0, + "includeAll": true, + "label": "Continent", + "multi": true, + "name": "geo_continent_code", + "options": [], + "query": "SELECT meta_client_geo_continent_code\nFROM libp2p_gossipsub_beacon_block\nWHERE\n slot_start_date_time >= toDateTime(${__from} / 1000)\n AND slot_start_date_time <= toDateTime(${__to} / 1000)\n AND meta_network_name IN (${network_name})\nGROUP BY meta_client_geo_continent_code ", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "250", + "value": "250" + }, + "hide": 0, + "includeAll": false, + "label": "Heatmap interval (MS)", + "multi": false, + "name": "heatmap_interval", + "options": [ + { + "selected": false, + "text": "100", + "value": "100" + }, + { + "selected": true, + "text": "250", + "value": "250" + } + ], + "query": "100,250", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "auto": true, + "auto_count": 300, + "auto_min": "12s", + "current": { + "selected": false, + "text": "auto", + "value": "$__auto_interval_interval_tight" + }, + "hide": 2, + "name": "interval_tight", + "options": [ + { + "selected": true, + "text": "auto", + "value": "$__auto_interval_interval_tight" + }, + { + "selected": false, + "text": "12s", + "value": "12s" + }, + { + "selected": false, + "text": "60s", + "value": "60s" + }, + { + "selected": false, + "text": "384s", + "value": "384s" + }, + { + "selected": false, + "text": "3840s", + "value": "3840s" + }, + { + "selected": false, + "text": "92160s", + "value": "92160s" + } + ], + "query": "12s,60s,384s,3840s,92160s", + "refresh": 2, + "skipUrlSync": false, + "type": "interval" + }, + { + "auto": true, + "auto_count": 50, + "auto_min": "12s", + "current": { + "selected": false, + "text": "auto", + "value": "$__auto_interval_interval" + }, + "hide": 2, + "name": "interval", + "options": [ + { + "selected": true, + "text": "auto", + "value": "$__auto_interval_interval" + }, + { + "selected": false, + "text": "12s", + "value": "12s" + }, + { + "selected": false, + "text": "60s", + "value": "60s" + }, + { + "selected": false, + "text": "384s", + "value": "384s" + }, + { + "selected": false, + "text": "3840s", + "value": "3840s" + }, + { + "selected": false, + "text": "92160s", + "value": "92160s" + } + ], + "query": "12s,60s,384s,3840s,92160s", + "refresh": 2, + "skipUrlSync": false, + "type": "interval" + }, + { + "auto": true, + "auto_count": 50, + "auto_min": "12s", + "current": { + "selected": false, + "text": "auto", + "value": "$__auto_interval_interval_loose" + }, + "hide": 2, + "name": "interval_loose", + "options": [ + { + "selected": true, + "text": "auto", + "value": "$__auto_interval_interval_loose" + }, + { + "selected": false, + "text": "384s", + "value": "384s" + }, + { + "selected": false, + "text": "3840s", + "value": "3840s" + }, + { + "selected": false, + "text": "92160s", + "value": "92160s" + } + ], + "query": "384s,3840s,92160s", + "refresh": 2, + "skipUrlSync": false, + "type": "interval" + }, + { + "current": { + "selected": true, + "text": "", + "value": "" + }, + "description": "Table prefix", + "hide": 0, + "label": "Prefix", + "name": "table_prefix", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": "", + "value": "" + }, + "description": "Table prefix for attestations", + "hide": 0, + "label": "Attestation Prefix", + "name": "attestation_prefix", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "textbox" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Gossipsub Events", + "uid": "d49d224e-0b6a-4319-b968-63afd535db56", + "version": 11, + "weekStart": "" +} \ No newline at end of file diff --git a/deploy/local/docker-compose/xatu-server.yaml b/deploy/local/docker-compose/xatu-server.yaml index c596993b..f7badc89 100644 --- a/deploy/local/docker-compose/xatu-server.yaml +++ b/deploy/local/docker-compose/xatu-server.yaml @@ -42,8 +42,8 @@ services: config: address: http://vector-http-kafka:9005 maxQueueSize: 102400 - batchTimeout: 1s + batchTimeout: 3s exportTimeout: 30s - maxExportBatchSize: 64 + maxExportBatchSize: 5000 compression: none keepAlive: true From fdfd5f3097e2a5f2c2e3a6b25cde4862e7c268d1 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 1 May 2024 11:48:01 +1000 Subject: [PATCH 5/7] tweak libp2p_peer_local key --- deploy/migrations/clickhouse/032_libp2p_trace.up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/migrations/clickhouse/032_libp2p_trace.up.sql b/deploy/migrations/clickhouse/032_libp2p_trace.up.sql index ad2f6eee..cb471448 100644 --- a/deploy/migrations/clickhouse/032_libp2p_trace.up.sql +++ b/deploy/migrations/clickhouse/032_libp2p_trace.up.sql @@ -18,7 +18,7 @@ COMMENT COLUMN meta_network_id 'Ethereum network ID', COMMENT COLUMN meta_network_name 'Ethereum network name'; CREATE TABLE libp2p_peer ON CLUSTER '{cluster}' AS libp2p_peer_local -ENGINE = Distributed('{cluster}', default, libp2p_peer_local, rand()); +ENGINE = Distributed('{cluster}', default, libp2p_peer_local, unique_key); -- Creating local and distributed tables for libp2p_add_peer CREATE TABLE libp2p_add_peer_local ON CLUSTER '{cluster}' From c2148f4e3a849d31aab8cfd821e2825d0b02e4ea Mon Sep 17 00:00:00 2001 From: Sam Calder-Mason Date: Wed, 1 May 2024 11:48:03 +1000 Subject: [PATCH 6/7] bump hermes --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index db358a84..8e719e3b 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/ethpandaops/xatu go 1.22.0 -replace github.com/probe-lab/hermes => github.com/ethpandaops/hermes v0.0.0-20240429023931-ef619176b78b +replace github.com/probe-lab/hermes => github.com/ethpandaops/hermes v0.0.0-20240501013510-f8170ec5da4d require ( github.com/IBM/sarama v1.43.0 diff --git a/go.sum b/go.sum index 72170a6f..010468fe 100644 --- a/go.sum +++ b/go.sum @@ -266,8 +266,8 @@ github.com/ethpandaops/ethcore v0.0.0-20240422023000-2a5727b18756 h1:8JWjrRfP14m github.com/ethpandaops/ethcore v0.0.0-20240422023000-2a5727b18756/go.mod h1:ZvKqL6CKxiraefdXPHeJurV2pDD/f2HF2uklDVdrry8= github.com/ethpandaops/ethwallclock v0.3.0 h1:xF5fwtBf+bHFHZKBnwiPFEuelW3sMM7SD3ZNFq1lJY4= github.com/ethpandaops/ethwallclock v0.3.0/go.mod h1:y0Cu+mhGLlem19vnAV2x0hpFS5KZ7oOi2SWYayv9l24= -github.com/ethpandaops/hermes v0.0.0-20240429023931-ef619176b78b h1:0fr/NoefWDlw0nwKIttVJnF9E8JZ98MyBu1N2hZvpik= -github.com/ethpandaops/hermes v0.0.0-20240429023931-ef619176b78b/go.mod h1:WOtvdP1zl53vuoOX6PRZ9oAbbJUiDso50efmAjoUZzI= +github.com/ethpandaops/hermes v0.0.0-20240501013510-f8170ec5da4d h1:mWBuU7mhpN11c2bbcImFyLSl+TJ208N4aGhMhadflIw= +github.com/ethpandaops/hermes v0.0.0-20240501013510-f8170ec5da4d/go.mod h1:WOtvdP1zl53vuoOX6PRZ9oAbbJUiDso50efmAjoUZzI= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= From 7acb6e850f619b36f15ec02e349a411ae9044679 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 1 May 2024 12:19:48 +1000 Subject: [PATCH 7/7] add partitions --- deploy/migrations/clickhouse/032_libp2p_trace.up.sql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deploy/migrations/clickhouse/032_libp2p_trace.up.sql b/deploy/migrations/clickhouse/032_libp2p_trace.up.sql index cb471448..101359c5 100644 --- a/deploy/migrations/clickhouse/032_libp2p_trace.up.sql +++ b/deploy/migrations/clickhouse/032_libp2p_trace.up.sql @@ -159,6 +159,7 @@ CREATE TABLE libp2p_rpc_meta_message_local ON CLUSTER '{cluster}' meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +PARTITION BY toYYYYMM(event_date_time) ORDER BY (event_date_time, unique_key, control_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_message_local ON CLUSTER '{cluster}' @@ -224,6 +225,7 @@ CREATE TABLE libp2p_rpc_meta_subscription_local ON CLUSTER '{cluster}' meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +PARTITION BY toYYYYMM(event_date_time) ORDER BY (event_date_time, unique_key, control_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_subscription_local ON CLUSTER '{cluster}' @@ -290,6 +292,7 @@ CREATE TABLE libp2p_rpc_meta_control_ihave_local ON CLUSTER '{cluster}' meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +PARTITION BY toYYYYMM(event_date_time) ORDER BY (event_date_time, unique_key, control_index, message_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_control_ihave_local ON CLUSTER '{cluster}' @@ -353,6 +356,7 @@ CREATE TABLE libp2p_rpc_meta_control_iwant_local ON CLUSTER '{cluster}' meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +PARTITION BY toYYYYMM(event_date_time) ORDER BY (event_date_time, unique_key, control_index, message_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_control_iwant_local ON CLUSTER '{cluster}' @@ -414,6 +418,7 @@ CREATE TABLE libp2p_rpc_meta_control_graft_local ON CLUSTER '{cluster}' meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +PARTITION BY toYYYYMM(event_date_time) ORDER BY (event_date_time, unique_key, control_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_control_graft_local ON CLUSTER '{cluster}' @@ -479,6 +484,7 @@ CREATE TABLE libp2p_rpc_meta_control_prune_local ON CLUSTER '{cluster}' meta_network_id Int32 CODEC(DoubleDelta, ZSTD(1)), meta_network_name LowCardinality(String) ) Engine = ReplicatedReplacingMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', '{replica}', updated_date_time) +PARTITION BY toYYYYMM(event_date_time) ORDER BY (event_date_time, unique_key, control_index, meta_network_name, meta_client_name); ALTER TABLE libp2p_rpc_meta_control_prune_local ON CLUSTER '{cluster}'